aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x.gitignore5
-rw-r--r--.travis.yml162
-rw-r--r--CHANGELOG90
-rw-r--r--Zotlabs/Daemon/Cron.php3
-rw-r--r--Zotlabs/Daemon/Cron_daily.php7
-rw-r--r--Zotlabs/Lib/Apps.php20
-rw-r--r--Zotlabs/Lib/DB_Upgrade.php119
-rw-r--r--Zotlabs/Lib/Enotify.php4
-rw-r--r--Zotlabs/Lib/MarkdownSoap.php96
-rw-r--r--Zotlabs/Lib/NativeWiki.php2
-rw-r--r--Zotlabs/Lib/NativeWikiPage.php84
-rw-r--r--Zotlabs/Lib/ThreadItem.php23
-rw-r--r--Zotlabs/Module/Acl.php30
-rw-r--r--Zotlabs/Module/Admin/Plugins.php82
-rw-r--r--Zotlabs/Module/Admin/Site.php25
-rw-r--r--Zotlabs/Module/Admin/Themes.php89
-rw-r--r--Zotlabs/Module/Appman.php5
-rw-r--r--Zotlabs/Module/Apps.php5
-rw-r--r--Zotlabs/Module/Bookmarks.php3
-rw-r--r--Zotlabs/Module/Cal.php3
-rw-r--r--Zotlabs/Module/Channel.php21
-rw-r--r--Zotlabs/Module/Chat.php7
-rw-r--r--Zotlabs/Module/Cloud.php6
-rw-r--r--Zotlabs/Module/Connections.php6
-rw-r--r--Zotlabs/Module/Connedit.php79
-rw-r--r--Zotlabs/Module/Cover_photo.php64
-rw-r--r--Zotlabs/Module/Directory.php1
-rw-r--r--Zotlabs/Module/Display.php46
-rw-r--r--Zotlabs/Module/Editblock.php7
-rw-r--r--Zotlabs/Module/Editlayout.php1
-rw-r--r--Zotlabs/Module/Editwebpage.php8
-rw-r--r--Zotlabs/Module/Filer.php4
-rw-r--r--Zotlabs/Module/Filestorage.php2
-rw-r--r--Zotlabs/Module/Hcard.php25
-rw-r--r--Zotlabs/Module/Impel.php14
-rw-r--r--Zotlabs/Module/Import.php240
-rw-r--r--Zotlabs/Module/Import_items.php94
-rw-r--r--Zotlabs/Module/Item.php40
-rw-r--r--Zotlabs/Module/Layouts.php1
-rw-r--r--Zotlabs/Module/Lockview.php22
-rw-r--r--Zotlabs/Module/Mail.php16
-rw-r--r--Zotlabs/Module/Network.php25
-rw-r--r--Zotlabs/Module/Photos.php241
-rw-r--r--Zotlabs/Module/Profile.php19
-rw-r--r--Zotlabs/Module/Profile_photo.php21
-rw-r--r--Zotlabs/Module/Profiles.php41
-rw-r--r--Zotlabs/Module/Pubstream.php1
-rw-r--r--Zotlabs/Module/Search.php1
-rw-r--r--Zotlabs/Module/Settings/Channel.php6
-rw-r--r--Zotlabs/Module/Settings/Display.php15
-rw-r--r--Zotlabs/Module/Settings/Permcats.php6
-rw-r--r--Zotlabs/Module/Setup.php2
-rw-r--r--Zotlabs/Module/Sharedwithme.php3
-rw-r--r--Zotlabs/Module/Suggest.php4
-rw-r--r--Zotlabs/Module/Update_display.php18
-rw-r--r--Zotlabs/Module/Viewconnections.php2
-rw-r--r--Zotlabs/Module/Viewsrc.php4
-rw-r--r--Zotlabs/Module/Webpages.php3
-rw-r--r--Zotlabs/Module/Wiki.php52
-rw-r--r--Zotlabs/Render/Comanche.php17
-rw-r--r--Zotlabs/Render/Theme.php12
-rw-r--r--Zotlabs/Storage/Browser.php22
-rw-r--r--Zotlabs/Storage/Directory.php64
-rw-r--r--Zotlabs/Storage/File.php12
-rw-r--r--Zotlabs/Web/HTTPHeaders.php46
-rw-r--r--Zotlabs/Web/Router.php8
-rw-r--r--Zotlabs/Web/WebServer.php19
-rw-r--r--Zotlabs/Widget/Activity.php61
-rw-r--r--Zotlabs/Widget/Admin.php68
-rw-r--r--Zotlabs/Widget/Affinity.php60
-rw-r--r--Zotlabs/Widget/Album.php106
-rw-r--r--Zotlabs/Widget/Appcategories.php49
-rw-r--r--Zotlabs/Widget/Appcloud.php13
-rw-r--r--Zotlabs/Widget/Archive.php55
-rw-r--r--Zotlabs/Widget/Bookmarkedchats.php28
-rw-r--r--Zotlabs/Widget/Catcloud_wall.php19
-rw-r--r--Zotlabs/Widget/Categories.php23
-rw-r--r--Zotlabs/Widget/Chatroom_list.php24
-rw-r--r--Zotlabs/Widget/Chatroom_members.php15
-rw-r--r--Zotlabs/Widget/Clock.php63
-rw-r--r--Zotlabs/Widget/Collections.php51
-rw-r--r--Zotlabs/Widget/Conversations.php74
-rw-r--r--Zotlabs/Widget/Cover_photo.php59
-rw-r--r--Zotlabs/Widget/Design_tools.php21
-rw-r--r--Zotlabs/Widget/Dirsort.php11
-rw-r--r--Zotlabs/Widget/Dirtags.php13
-rw-r--r--Zotlabs/Widget/Eventstools.php19
-rw-r--r--Zotlabs/Widget/Filer.php36
-rw-r--r--Zotlabs/Widget/Findpeople.php12
-rw-r--r--Zotlabs/Widget/Follow.php37
-rw-r--r--Zotlabs/Widget/Forums.php97
-rw-r--r--Zotlabs/Widget/Fullprofile.php16
-rw-r--r--Zotlabs/Widget/Helpindex.php45
-rw-r--r--Zotlabs/Widget/Item.php54
-rw-r--r--Zotlabs/Widget/Mailmenu.php36
-rw-r--r--Zotlabs/Widget/Menu_preview.php16
-rw-r--r--Zotlabs/Widget/Notes.php23
-rw-r--r--Zotlabs/Widget/Photo.php55
-rw-r--r--Zotlabs/Widget/Photo_albums.php25
-rw-r--r--Zotlabs/Widget/Photo_rand.php66
-rw-r--r--Zotlabs/Widget/Profile.php13
-rw-r--r--Zotlabs/Widget/Pubsites.php16
-rw-r--r--Zotlabs/Widget/Random_block.php46
-rw-r--r--Zotlabs/Widget/Rating.php67
-rw-r--r--Zotlabs/Widget/Savedsearch.php91
-rw-r--r--Zotlabs/Widget/Settings_menu.php137
-rw-r--r--Zotlabs/Widget/Shortprofile.php18
-rw-r--r--Zotlabs/Widget/Sitesearch.php38
-rw-r--r--Zotlabs/Widget/Suggestedchats.php37
-rw-r--r--Zotlabs/Widget/Suggestions.php58
-rw-r--r--Zotlabs/Widget/Tagcloud.php33
-rw-r--r--Zotlabs/Widget/Tagcloud_wall.php20
-rw-r--r--Zotlabs/Widget/Tasklist.php30
-rw-r--r--Zotlabs/Widget/Vcard.php12
-rw-r--r--Zotlabs/Widget/Website_portation_tools.php22
-rw-r--r--Zotlabs/Widget/Wiki_list.php23
-rw-r--r--Zotlabs/Widget/Wiki_page_history.php27
-rw-r--r--Zotlabs/Widget/Wiki_pages.php66
-rw-r--r--Zotlabs/Widget/Zcard.php11
-rw-r--r--Zotlabs/Zot/Finger.php4
-rw-r--r--app/admin.pngbin2852 -> 0 bytes
-rw-r--r--app/features.apd6
-rw-r--r--app/features.pngbin8542 -> 0 bytes
-rw-r--r--app/login.apd5
-rw-r--r--app/manage.apd6
-rw-r--r--app/manage.pngbin7355 -> 0 bytes
-rw-r--r--app/profile.apd6
-rw-r--r--app/profile.pngbin3550 -> 0 bytes
-rw-r--r--app/settings.apd6
-rw-r--r--app/settings.pngbin7958 -> 0 bytes
-rwxr-xr-xboot.php285
-rw-r--r--composer.json15
-rw-r--r--composer.lock3632
-rw-r--r--doc/Privacy.md77
-rw-r--r--doc/Widgets.md1
-rw-r--r--doc/about.bb24
-rw-r--r--doc/account_basics.bb38
-rw-r--r--doc/accounts.bb4
-rw-r--r--doc/admin/administrator_guide.md64
-rw-r--r--doc/contributor/covenant.html106
-rw-r--r--doc/database.bb4
-rw-r--r--doc/database/db_account.bb1
-rw-r--r--doc/dev-function-overview.md4
-rw-r--r--doc/developer/api_zot.bb8
-rw-r--r--doc/developer/covenant.bb47
-rw-r--r--doc/developer/developer_guide.bb178
-rw-r--r--doc/developer/developer_guide.md422
-rw-r--r--doc/developer/unorganized.md73
-rw-r--r--doc/feature/saved_search.bb19
-rw-r--r--doc/feature/techlevels.bb15
-rw-r--r--doc/hook/author_is_pmable.bb14
-rw-r--r--doc/hook/probe_well_known.bb3
-rw-r--r--doc/hooklist.bb8
-rw-r--r--doc/main.bb13
-rw-r--r--doc/member/member_guide.bb28
-rw-r--r--doc/members.bb25
-rw-r--r--doc/profiles.bb37
-rw-r--r--doc/project/governance.bb29
-rw-r--r--doc/project/toc.html5
-rw-r--r--doc/project/versions.bb30
-rw-r--r--doc/server_roles.bb27
-rw-r--r--doc/service_classes.bb38
-rw-r--r--doc/theme_management.bb10
-rw-r--r--doc/to_do_code.bb42
-rw-r--r--doc/to_do_doco.md31
-rw-r--r--doc/toc.html67
-rw-r--r--images/emoji/0023-20e3.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/0023.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/002a-20e3.pngbin627 -> 0 bytes
-rw-r--r--images/emoji/002a.pngbin645 -> 0 bytes
-rw-r--r--images/emoji/0030-20e3.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/0030.pngbin573 -> 0 bytes
-rw-r--r--images/emoji/0031-20e3.pngbin442 -> 0 bytes
-rw-r--r--images/emoji/0031.pngbin505 -> 0 bytes
-rw-r--r--images/emoji/0032-20e3.pngbin567 -> 0 bytes
-rw-r--r--images/emoji/0032.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/0033-20e3.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/0033.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/0034-20e3.pngbin497 -> 0 bytes
-rw-r--r--images/emoji/0034.pngbin542 -> 0 bytes
-rw-r--r--images/emoji/0035-20e3.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/0035.pngbin615 -> 0 bytes
-rw-r--r--images/emoji/0036-20e3.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/0036.pngbin649 -> 0 bytes
-rw-r--r--images/emoji/0037-20e3.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/0037.pngbin559 -> 0 bytes
-rw-r--r--images/emoji/0038-20e3.pngbin608 -> 0 bytes
-rw-r--r--images/emoji/0038.pngbin646 -> 0 bytes
-rw-r--r--images/emoji/0039-20e3.pngbin607 -> 0 bytes
-rw-r--r--images/emoji/0039.pngbin654 -> 0 bytes
-rw-r--r--images/emoji/00a9.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/00ae.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/1f004.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f0cf.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f170.pngbin469 -> 0 bytes
-rw-r--r--images/emoji/1f171.pngbin391 -> 0 bytes
-rw-r--r--images/emoji/1f17e.pngbin425 -> 0 bytes
-rw-r--r--images/emoji/1f17f.pngbin385 -> 0 bytes
-rw-r--r--images/emoji/1f18e.pngbin505 -> 0 bytes
-rw-r--r--images/emoji/1f191.pngbin393 -> 0 bytes
-rw-r--r--images/emoji/1f192.pngbin396 -> 0 bytes
-rw-r--r--images/emoji/1f193.pngbin370 -> 0 bytes
-rw-r--r--images/emoji/1f194.pngbin348 -> 0 bytes
-rw-r--r--images/emoji/1f195.pngbin486 -> 0 bytes
-rw-r--r--images/emoji/1f196.pngbin445 -> 0 bytes
-rw-r--r--images/emoji/1f197.pngbin511 -> 0 bytes
-rw-r--r--images/emoji/1f198.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f199.pngbin405 -> 0 bytes
-rw-r--r--images/emoji/1f19a.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1e8.pngbin1935 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1e9.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ea.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1eb.pngbin942 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ec.pngbin913 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ee.pngbin1056 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f1.pngbin905 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f2.pngbin514 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f4.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f6.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f7.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f8.pngbin1489 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1f9.pngbin430 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fa.pngbin962 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fc.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1fd.pngbin496 -> 0 bytes
-rw-r--r--images/emoji/1f1e6-1f1ff.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e6.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e7.pngbin789 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1e9.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ea.pngbin444 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1eb.pngbin717 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ec.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ed.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ee.pngbin795 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ef.pngbin554 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f1.pngbin1692 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f2.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f3.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f4.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f6.pngbin1144 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f7.pngbin819 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f8.pngbin448 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1f9.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fb.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fc.pngbin391 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1fe.pngbin1120 -> 0 bytes
-rw-r--r--images/emoji/1f1e7-1f1ff.pngbin1597 -> 0 bytes
-rw-r--r--images/emoji/1f1e7.pngbin572 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e6.pngbin755 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e8.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1e9.pngbin707 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1eb.pngbin673 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ec.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ed.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ee.pngbin440 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f0.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f1.pngbin748 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f2.pngbin627 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f3.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f4.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f5.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1f7.pngbin419 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fa.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fb.pngbin642 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fc.pngbin665 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fd.pngbin1142 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1fe.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f1e8-1f1ff.pngbin600 -> 0 bytes
-rw-r--r--images/emoji/1f1e8.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ea.pngbin502 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ec.pngbin1918 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ef.pngbin753 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f0.pngbin450 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f2.pngbin1077 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1f4.pngbin1135 -> 0 bytes
-rw-r--r--images/emoji/1f1e9-1f1ff.pngbin734 -> 0 bytes
-rw-r--r--images/emoji/1f1e9.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1e6.pngbin1338 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1e8.pngbin1431 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ea.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ec.pngbin818 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1ed.pngbin742 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f7.pngbin1218 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f8.pngbin1338 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1f9.pngbin947 -> 0 bytes
-rw-r--r--images/emoji/1f1ea-1f1fa.pngbin760 -> 0 bytes
-rw-r--r--images/emoji/1f1ea.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1ee.pngbin487 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1ef.pngbin1381 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f0.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f2.pngbin554 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f4.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1eb-1f1f7.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1eb.pngbin462 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e6.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e7.pngbin919 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1e9.pngbin1017 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ea.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1eb.pngbin865 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ec.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ed.pngbin723 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1ee.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f1.pngbin700 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f2.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f3.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f5.pngbin1587 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f6.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f7.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f8.pngbin2115 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1f9.pngbin1087 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fa.pngbin1045 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fc.pngbin705 -> 0 bytes
-rw-r--r--images/emoji/1f1ec-1f1fe.pngbin690 -> 0 bytes
-rw-r--r--images/emoji/1f1ec.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f0.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f2.pngbin1036 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f3.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f7.pngbin1411 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1f9.pngbin1205 -> 0 bytes
-rw-r--r--images/emoji/1f1ed-1f1fa.pngbin513 -> 0 bytes
-rw-r--r--images/emoji/1f1ed.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1e8.pngbin1330 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1e9.pngbin498 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1ea.pngbin478 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f1.pngbin658 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f2.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f3.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f4.pngbin1918 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f6.pngbin811 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f7.pngbin1036 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f8.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/1f1ee-1f1f9.pngbin472 -> 0 bytes
-rw-r--r--images/emoji/1f1ee.pngbin395 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1ea.pngbin956 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f2.pngbin837 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f4.pngbin740 -> 0 bytes
-rw-r--r--images/emoji/1f1ef-1f1f5.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f1ef.pngbin527 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ea.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ec.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ed.pngbin872 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ee.pngbin1375 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f2.pngbin783 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f3.pngbin1316 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f5.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1f7.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1fc.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1fe.pngbin1671 -> 0 bytes
-rw-r--r--images/emoji/1f1f0-1f1ff.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f1f0.pngbin582 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e6.pngbin479 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e7.pngbin740 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1e8.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1ee.pngbin946 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f0.pngbin974 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f7.pngbin772 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f8.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1f9.pngbin510 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fa.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fb.pngbin388 -> 0 bytes
-rw-r--r--images/emoji/1f1f1-1f1fe.pngbin685 -> 0 bytes
-rw-r--r--images/emoji/1f1f1.pngbin436 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e6.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e8.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1e9.pngbin1170 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ea.pngbin1074 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1eb.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ec.pngbin556 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ed.pngbin1138 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f0.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f1.pngbin440 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f2.pngbin937 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f3.pngbin698 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f4.pngbin792 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f5.pngbin1797 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f6.pngbin780 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f7.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f8.pngbin1477 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1f9.pngbin799 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fa.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fb.pngbin598 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fc.pngbin825 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fd.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1fe.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f1f2-1f1ff.pngbin1159 -> 0 bytes
-rw-r--r--images/emoji/1f1f2.pngbin666 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1e6.pngbin1249 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1e8.pngbin1151 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ea.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1eb.pngbin877 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ec.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ee.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f1.pngbin499 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f4.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f5.pngbin802 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1f7.pngbin529 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1fa.pngbin1128 -> 0 bytes
-rw-r--r--images/emoji/1f1f3-1f1ff.pngbin1099 -> 0 bytes
-rw-r--r--images/emoji/1f1f3.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/1f1f4-1f1f2.pngbin754 -> 0 bytes
-rw-r--r--images/emoji/1f1f4.pngbin607 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1e6.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ea.pngbin439 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1eb.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ec.pngbin1076 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1ed.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f0.pngbin753 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f1.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f2.pngbin2314 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f3.pngbin1896 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f7.pngbin605 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f8.pngbin574 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1f9.pngbin1055 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1fc.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/1f1f5-1f1fe.pngbin1085 -> 0 bytes
-rw-r--r--images/emoji/1f1f5.pngbin541 -> 0 bytes
-rw-r--r--images/emoji/1f1f6-1f1e6.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/1f1f6.pngbin659 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1ea.pngbin837 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1f4.pngbin441 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1f8.pngbin1237 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1fa.pngbin496 -> 0 bytes
-rw-r--r--images/emoji/1f1f7-1f1fc.pngbin940 -> 0 bytes
-rw-r--r--images/emoji/1f1f7.pngbin580 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e6.pngbin781 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e7.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e8.pngbin1073 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1e9.pngbin578 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ea.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ec.pngbin730 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ed.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ee.pngbin1030 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ef.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f0.pngbin780 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f1.pngbin510 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f2.pngbin2001 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f3.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f4.pngbin609 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f7.pngbin650 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f8.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1f9.pngbin562 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fb.pngbin1125 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fd.pngbin1195 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1fe.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f1f8-1f1ff.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f1f8.pngbin653 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e6.pngbin1907 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e8.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1e9.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1eb.pngbin857 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ec.pngbin790 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ed.pngbin421 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ef.pngbin906 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f0.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f1.pngbin849 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f2.pngbin1178 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f3.pngbin625 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f4.pngbin553 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f7.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1f9.pngbin604 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1fb.pngbin1120 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1fc.pngbin761 -> 0 bytes
-rw-r--r--images/emoji/1f1f9-1f1ff.pngbin1061 -> 0 bytes
-rw-r--r--images/emoji/1f1f9.pngbin453 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1e6.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1ec.pngbin887 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1f2.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1f8.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1fe.pngbin966 -> 0 bytes
-rw-r--r--images/emoji/1f1fa-1f1ff.pngbin750 -> 0 bytes
-rw-r--r--images/emoji/1f1fa.pngbin544 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1e6.pngbin1335 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1e8.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ea.pngbin748 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ec.pngbin1789 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1ee.pngbin1380 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1f3.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f1fb-1f1fa.pngbin844 -> 0 bytes
-rw-r--r--images/emoji/1f1fb.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f1fc-1f1eb.pngbin443 -> 0 bytes
-rw-r--r--images/emoji/1f1fc-1f1f8.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/1f1fc.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f1fd-1f1f0.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f1fd.pngbin635 -> 0 bytes
-rw-r--r--images/emoji/1f1fe-1f1ea.pngbin507 -> 0 bytes
-rw-r--r--images/emoji/1f1fe-1f1f9.pngbin1627 -> 0 bytes
-rw-r--r--images/emoji/1f1fe.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1e6.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1f2.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f1ff-1f1fc.pngbin993 -> 0 bytes
-rw-r--r--images/emoji/1f1ff.pngbin571 -> 0 bytes
-rw-r--r--images/emoji/1f201.pngbin266 -> 0 bytes
-rw-r--r--images/emoji/1f202.pngbin420 -> 0 bytes
-rw-r--r--images/emoji/1f21a.pngbin534 -> 0 bytes
-rw-r--r--images/emoji/1f22f.pngbin504 -> 0 bytes
-rw-r--r--images/emoji/1f232.pngbin584 -> 0 bytes
-rw-r--r--images/emoji/1f233.pngbin456 -> 0 bytes
-rw-r--r--images/emoji/1f234.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f235.pngbin564 -> 0 bytes
-rw-r--r--images/emoji/1f236.pngbin434 -> 0 bytes
-rw-r--r--images/emoji/1f237.pngbin409 -> 0 bytes
-rw-r--r--images/emoji/1f238.pngbin306 -> 0 bytes
-rw-r--r--images/emoji/1f239.pngbin411 -> 0 bytes
-rw-r--r--images/emoji/1f23a.pngbin460 -> 0 bytes
-rw-r--r--images/emoji/1f250.pngbin716 -> 0 bytes
-rw-r--r--images/emoji/1f251.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/1f300.pngbin797 -> 0 bytes
-rw-r--r--images/emoji/1f301.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f302.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f303.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f304.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f305.pngbin812 -> 0 bytes
-rw-r--r--images/emoji/1f306.pngbin431 -> 0 bytes
-rw-r--r--images/emoji/1f307.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f308.pngbin1299 -> 0 bytes
-rw-r--r--images/emoji/1f309.pngbin637 -> 0 bytes
-rw-r--r--images/emoji/1f30a.pngbin1018 -> 0 bytes
-rw-r--r--images/emoji/1f30b.pngbin1259 -> 0 bytes
-rw-r--r--images/emoji/1f30c.pngbin622 -> 0 bytes
-rw-r--r--images/emoji/1f30d.pngbin978 -> 0 bytes
-rw-r--r--images/emoji/1f30e.pngbin1031 -> 0 bytes
-rw-r--r--images/emoji/1f30f.pngbin966 -> 0 bytes
-rw-r--r--images/emoji/1f310.pngbin796 -> 0 bytes
-rw-r--r--images/emoji/1f311.pngbin829 -> 0 bytes
-rw-r--r--images/emoji/1f312.pngbin1200 -> 0 bytes
-rw-r--r--images/emoji/1f313.pngbin1152 -> 0 bytes
-rw-r--r--images/emoji/1f314.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f315.pngbin841 -> 0 bytes
-rw-r--r--images/emoji/1f316.pngbin1211 -> 0 bytes
-rw-r--r--images/emoji/1f317.pngbin1180 -> 0 bytes
-rw-r--r--images/emoji/1f318.pngbin1213 -> 0 bytes
-rw-r--r--images/emoji/1f319.pngbin446 -> 0 bytes
-rw-r--r--images/emoji/1f31a.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f31b.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f31c.pngbin1030 -> 0 bytes
-rw-r--r--images/emoji/1f31d.pngbin1186 -> 0 bytes
-rw-r--r--images/emoji/1f31e.pngbin741 -> 0 bytes
-rw-r--r--images/emoji/1f31f.pngbin732 -> 0 bytes
-rw-r--r--images/emoji/1f320.pngbin1048 -> 0 bytes
-rw-r--r--images/emoji/1f321.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f324.pngbin989 -> 0 bytes
-rw-r--r--images/emoji/1f325.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f326.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f327.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f328.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f329.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f32a.pngbin1519 -> 0 bytes
-rw-r--r--images/emoji/1f32b.pngbin713 -> 0 bytes
-rw-r--r--images/emoji/1f32c.pngbin1827 -> 0 bytes
-rw-r--r--images/emoji/1f32d.pngbin1770 -> 0 bytes
-rw-r--r--images/emoji/1f32e.pngbin3045 -> 0 bytes
-rw-r--r--images/emoji/1f32f.pngbin2938 -> 0 bytes
-rw-r--r--images/emoji/1f330.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f331.pngbin749 -> 0 bytes
-rw-r--r--images/emoji/1f332.pngbin719 -> 0 bytes
-rw-r--r--images/emoji/1f333.pngbin1270 -> 0 bytes
-rw-r--r--images/emoji/1f334.pngbin1452 -> 0 bytes
-rw-r--r--images/emoji/1f335.pngbin628 -> 0 bytes
-rw-r--r--images/emoji/1f336.pngbin677 -> 0 bytes
-rw-r--r--images/emoji/1f337.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f338.pngbin1129 -> 0 bytes
-rw-r--r--images/emoji/1f339.pngbin1182 -> 0 bytes
-rw-r--r--images/emoji/1f33a.pngbin1815 -> 0 bytes
-rw-r--r--images/emoji/1f33b.pngbin1915 -> 0 bytes
-rw-r--r--images/emoji/1f33c.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f33d.pngbin1547 -> 0 bytes
-rw-r--r--images/emoji/1f33e.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f33f.pngbin886 -> 0 bytes
-rw-r--r--images/emoji/1f340.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f341.pngbin1117 -> 0 bytes
-rw-r--r--images/emoji/1f342.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f343.pngbin993 -> 0 bytes
-rw-r--r--images/emoji/1f344.pngbin1024 -> 0 bytes
-rw-r--r--images/emoji/1f345.pngbin1055 -> 0 bytes
-rw-r--r--images/emoji/1f346.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f347.pngbin1552 -> 0 bytes
-rw-r--r--images/emoji/1f348.pngbin2005 -> 0 bytes
-rw-r--r--images/emoji/1f349.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f34a.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f34b.pngbin1033 -> 0 bytes
-rw-r--r--images/emoji/1f34c.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f34d.pngbin1643 -> 0 bytes
-rw-r--r--images/emoji/1f34e.pngbin655 -> 0 bytes
-rw-r--r--images/emoji/1f34f.pngbin656 -> 0 bytes
-rw-r--r--images/emoji/1f350.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/1f351.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f352.pngbin1211 -> 0 bytes
-rw-r--r--images/emoji/1f353.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f354.pngbin1974 -> 0 bytes
-rw-r--r--images/emoji/1f355.pngbin2009 -> 0 bytes
-rw-r--r--images/emoji/1f356.pngbin1465 -> 0 bytes
-rw-r--r--images/emoji/1f357.pngbin925 -> 0 bytes
-rw-r--r--images/emoji/1f358.pngbin1443 -> 0 bytes
-rw-r--r--images/emoji/1f359.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f35a.pngbin1195 -> 0 bytes
-rw-r--r--images/emoji/1f35b.pngbin1754 -> 0 bytes
-rw-r--r--images/emoji/1f35c.pngbin1992 -> 0 bytes
-rw-r--r--images/emoji/1f35d.pngbin1797 -> 0 bytes
-rw-r--r--images/emoji/1f35e.pngbin1419 -> 0 bytes
-rw-r--r--images/emoji/1f35f.pngbin1874 -> 0 bytes
-rw-r--r--images/emoji/1f360.pngbin951 -> 0 bytes
-rw-r--r--images/emoji/1f361.pngbin802 -> 0 bytes
-rw-r--r--images/emoji/1f362.pngbin794 -> 0 bytes
-rw-r--r--images/emoji/1f363.pngbin2101 -> 0 bytes
-rw-r--r--images/emoji/1f364.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f365.pngbin1245 -> 0 bytes
-rw-r--r--images/emoji/1f366.pngbin1502 -> 0 bytes
-rw-r--r--images/emoji/1f367.pngbin997 -> 0 bytes
-rw-r--r--images/emoji/1f368.pngbin1780 -> 0 bytes
-rw-r--r--images/emoji/1f369.pngbin1322 -> 0 bytes
-rw-r--r--images/emoji/1f36a.pngbin1351 -> 0 bytes
-rw-r--r--images/emoji/1f36b.pngbin771 -> 0 bytes
-rw-r--r--images/emoji/1f36c.pngbin1054 -> 0 bytes
-rw-r--r--images/emoji/1f36d.pngbin2164 -> 0 bytes
-rw-r--r--images/emoji/1f36e.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f36f.pngbin1217 -> 0 bytes
-rw-r--r--images/emoji/1f370.pngbin2266 -> 0 bytes
-rw-r--r--images/emoji/1f371.pngbin1128 -> 0 bytes
-rw-r--r--images/emoji/1f372.pngbin1960 -> 0 bytes
-rw-r--r--images/emoji/1f373.pngbin764 -> 0 bytes
-rw-r--r--images/emoji/1f374.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f375.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f376.pngbin826 -> 0 bytes
-rw-r--r--images/emoji/1f377.pngbin655 -> 0 bytes
-rw-r--r--images/emoji/1f378.pngbin1027 -> 0 bytes
-rw-r--r--images/emoji/1f379.pngbin1428 -> 0 bytes
-rw-r--r--images/emoji/1f37a.pngbin1340 -> 0 bytes
-rw-r--r--images/emoji/1f37b.pngbin2100 -> 0 bytes
-rw-r--r--images/emoji/1f37c.pngbin818 -> 0 bytes
-rw-r--r--images/emoji/1f37d.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f37f.pngbin1844 -> 0 bytes
-rw-r--r--images/emoji/1f380.pngbin968 -> 0 bytes
-rw-r--r--images/emoji/1f381.pngbin1966 -> 0 bytes
-rw-r--r--images/emoji/1f382.pngbin2219 -> 0 bytes
-rw-r--r--images/emoji/1f383.pngbin2289 -> 0 bytes
-rw-r--r--images/emoji/1f384.pngbin1542 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fb.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fc.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fd.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3fe.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385-1f3ff.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f385.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f386.pngbin1365 -> 0 bytes
-rw-r--r--images/emoji/1f387.pngbin910 -> 0 bytes
-rw-r--r--images/emoji/1f388.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f389.pngbin1778 -> 0 bytes
-rw-r--r--images/emoji/1f38a.pngbin1703 -> 0 bytes
-rw-r--r--images/emoji/1f38b.pngbin1479 -> 0 bytes
-rw-r--r--images/emoji/1f38c.pngbin1239 -> 0 bytes
-rw-r--r--images/emoji/1f38d.pngbin1947 -> 0 bytes
-rw-r--r--images/emoji/1f38e.pngbin2249 -> 0 bytes
-rw-r--r--images/emoji/1f38f.pngbin1725 -> 0 bytes
-rw-r--r--images/emoji/1f390.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f391.pngbin1350 -> 0 bytes
-rw-r--r--images/emoji/1f392.pngbin1490 -> 0 bytes
-rw-r--r--images/emoji/1f393.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f396.pngbin949 -> 0 bytes
-rw-r--r--images/emoji/1f397.pngbin921 -> 0 bytes
-rw-r--r--images/emoji/1f399.pngbin839 -> 0 bytes
-rw-r--r--images/emoji/1f39a.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/1f39b.pngbin1104 -> 0 bytes
-rw-r--r--images/emoji/1f39e.pngbin560 -> 0 bytes
-rw-r--r--images/emoji/1f39f.pngbin1750 -> 0 bytes
-rw-r--r--images/emoji/1f3a0.pngbin1739 -> 0 bytes
-rw-r--r--images/emoji/1f3a1.pngbin2185 -> 0 bytes
-rw-r--r--images/emoji/1f3a2.pngbin1724 -> 0 bytes
-rw-r--r--images/emoji/1f3a3.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f3a4.pngbin1165 -> 0 bytes
-rw-r--r--images/emoji/1f3a5.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f3a6.pngbin585 -> 0 bytes
-rw-r--r--images/emoji/1f3a7.pngbin1202 -> 0 bytes
-rw-r--r--images/emoji/1f3a8.pngbin1455 -> 0 bytes
-rw-r--r--images/emoji/1f3a9.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f3aa.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f3ab.pngbin763 -> 0 bytes
-rw-r--r--images/emoji/1f3ac.pngbin1535 -> 0 bytes
-rw-r--r--images/emoji/1f3ad.pngbin1971 -> 0 bytes
-rw-r--r--images/emoji/1f3ae.pngbin765 -> 0 bytes
-rw-r--r--images/emoji/1f3af.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f3b0.pngbin1648 -> 0 bytes
-rw-r--r--images/emoji/1f3b1.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f3b2.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f3b3.pngbin1426 -> 0 bytes
-rw-r--r--images/emoji/1f3b4.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/1f3b5.pngbin419 -> 0 bytes
-rw-r--r--images/emoji/1f3b6.pngbin501 -> 0 bytes
-rw-r--r--images/emoji/1f3b7.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f3b8.pngbin1056 -> 0 bytes
-rw-r--r--images/emoji/1f3b9.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f3ba.pngbin1286 -> 0 bytes
-rw-r--r--images/emoji/1f3bb.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f3bc.pngbin1289 -> 0 bytes
-rw-r--r--images/emoji/1f3bd.pngbin784 -> 0 bytes
-rw-r--r--images/emoji/1f3be.pngbin1561 -> 0 bytes
-rw-r--r--images/emoji/1f3bf.pngbin1762 -> 0 bytes
-rw-r--r--images/emoji/1f3c0.pngbin1546 -> 0 bytes
-rw-r--r--images/emoji/1f3c1.pngbin787 -> 0 bytes
-rw-r--r--images/emoji/1f3c2.pngbin2020 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fb.pngbin1163 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fc.pngbin1162 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fd.pngbin1151 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3fe.pngbin1156 -> 0 bytes
-rw-r--r--images/emoji/1f3c3-1f3ff.pngbin1145 -> 0 bytes
-rw-r--r--images/emoji/1f3c3.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fb.pngbin1781 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fc.pngbin1769 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fd.pngbin1777 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3fe.pngbin1784 -> 0 bytes
-rw-r--r--images/emoji/1f3c4-1f3ff.pngbin1782 -> 0 bytes
-rw-r--r--images/emoji/1f3c4.pngbin1777 -> 0 bytes
-rw-r--r--images/emoji/1f3c5.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f3c6.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fb.pngbin2099 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fc.pngbin2103 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fd.pngbin2090 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3fe.pngbin2090 -> 0 bytes
-rw-r--r--images/emoji/1f3c7-1f3ff.pngbin2085 -> 0 bytes
-rw-r--r--images/emoji/1f3c7.pngbin2096 -> 0 bytes
-rw-r--r--images/emoji/1f3c8.pngbin958 -> 0 bytes
-rw-r--r--images/emoji/1f3c9.pngbin1620 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fb.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fc.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fd.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3fe.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca-1f3ff.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3ca.pngbin1184 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fb.pngbin1346 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fc.pngbin1347 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fd.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3fe.pngbin1343 -> 0 bytes
-rw-r--r--images/emoji/1f3cb-1f3ff.pngbin1337 -> 0 bytes
-rw-r--r--images/emoji/1f3cb.pngbin1356 -> 0 bytes
-rw-r--r--images/emoji/1f3cc.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f3cd.pngbin2081 -> 0 bytes
-rw-r--r--images/emoji/1f3ce.pngbin2140 -> 0 bytes
-rw-r--r--images/emoji/1f3cf.pngbin1060 -> 0 bytes
-rw-r--r--images/emoji/1f3d0.pngbin1204 -> 0 bytes
-rw-r--r--images/emoji/1f3d1.pngbin947 -> 0 bytes
-rw-r--r--images/emoji/1f3d2.pngbin1010 -> 0 bytes
-rw-r--r--images/emoji/1f3d3.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f3d4.pngbin1194 -> 0 bytes
-rw-r--r--images/emoji/1f3d5.pngbin1515 -> 0 bytes
-rw-r--r--images/emoji/1f3d6.pngbin942 -> 0 bytes
-rw-r--r--images/emoji/1f3d7.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f3d8.pngbin981 -> 0 bytes
-rw-r--r--images/emoji/1f3d9.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f3da.pngbin1606 -> 0 bytes
-rw-r--r--images/emoji/1f3db.pngbin1006 -> 0 bytes
-rw-r--r--images/emoji/1f3dc.pngbin1443 -> 0 bytes
-rw-r--r--images/emoji/1f3dd.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f3de.pngbin929 -> 0 bytes
-rw-r--r--images/emoji/1f3df.pngbin1516 -> 0 bytes
-rw-r--r--images/emoji/1f3e0.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f3e1.pngbin1614 -> 0 bytes
-rw-r--r--images/emoji/1f3e2.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/1f3e3.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f3e4.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/1f3e5.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/1f3e6.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f3e7.pngbin1397 -> 0 bytes
-rw-r--r--images/emoji/1f3e8.pngbin1322 -> 0 bytes
-rw-r--r--images/emoji/1f3e9.pngbin372 -> 0 bytes
-rw-r--r--images/emoji/1f3ea.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/1f3eb.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f3ec.pngbin673 -> 0 bytes
-rw-r--r--images/emoji/1f3ed.pngbin936 -> 0 bytes
-rw-r--r--images/emoji/1f3ee.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f3ef.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f3f0.pngbin965 -> 0 bytes
-rw-r--r--images/emoji/1f3f3.pngbin699 -> 0 bytes
-rw-r--r--images/emoji/1f3f4.pngbin702 -> 0 bytes
-rw-r--r--images/emoji/1f3f5.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f3f7.pngbin669 -> 0 bytes
-rw-r--r--images/emoji/1f3f8.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f3f9.pngbin1402 -> 0 bytes
-rw-r--r--images/emoji/1f3fa.pngbin1044 -> 0 bytes
-rw-r--r--images/emoji/1f400.pngbin1193 -> 0 bytes
-rw-r--r--images/emoji/1f401.pngbin1324 -> 0 bytes
-rw-r--r--images/emoji/1f402.pngbin1436 -> 0 bytes
-rw-r--r--images/emoji/1f403.pngbin1536 -> 0 bytes
-rw-r--r--images/emoji/1f404.pngbin1810 -> 0 bytes
-rw-r--r--images/emoji/1f405.pngbin2623 -> 0 bytes
-rw-r--r--images/emoji/1f406.pngbin2222 -> 0 bytes
-rw-r--r--images/emoji/1f407.pngbin1805 -> 0 bytes
-rw-r--r--images/emoji/1f408.pngbin1781 -> 0 bytes
-rw-r--r--images/emoji/1f409.pngbin1575 -> 0 bytes
-rw-r--r--images/emoji/1f40a.pngbin2408 -> 0 bytes
-rw-r--r--images/emoji/1f40b.pngbin1196 -> 0 bytes
-rw-r--r--images/emoji/1f40c.pngbin1731 -> 0 bytes
-rw-r--r--images/emoji/1f40d.pngbin1579 -> 0 bytes
-rw-r--r--images/emoji/1f40e.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f40f.pngbin1951 -> 0 bytes
-rw-r--r--images/emoji/1f410.pngbin981 -> 0 bytes
-rw-r--r--images/emoji/1f411.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f412.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f413.pngbin1333 -> 0 bytes
-rw-r--r--images/emoji/1f414.pngbin1267 -> 0 bytes
-rw-r--r--images/emoji/1f415.pngbin2085 -> 0 bytes
-rw-r--r--images/emoji/1f416.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f417.pngbin1368 -> 0 bytes
-rw-r--r--images/emoji/1f418.pngbin1293 -> 0 bytes
-rw-r--r--images/emoji/1f419.pngbin1188 -> 0 bytes
-rw-r--r--images/emoji/1f41a.pngbin1497 -> 0 bytes
-rw-r--r--images/emoji/1f41b.pngbin1604 -> 0 bytes
-rw-r--r--images/emoji/1f41c.pngbin1412 -> 0 bytes
-rw-r--r--images/emoji/1f41d.pngbin1383 -> 0 bytes
-rw-r--r--images/emoji/1f41e.pngbin1288 -> 0 bytes
-rw-r--r--images/emoji/1f41f.pngbin1080 -> 0 bytes
-rw-r--r--images/emoji/1f420.pngbin1676 -> 0 bytes
-rw-r--r--images/emoji/1f421.pngbin1621 -> 0 bytes
-rw-r--r--images/emoji/1f422.pngbin1516 -> 0 bytes
-rw-r--r--images/emoji/1f423.pngbin1599 -> 0 bytes
-rw-r--r--images/emoji/1f424.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f425.pngbin1174 -> 0 bytes
-rw-r--r--images/emoji/1f426.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f427.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/1f428.pngbin1430 -> 0 bytes
-rw-r--r--images/emoji/1f429.pngbin1531 -> 0 bytes
-rw-r--r--images/emoji/1f42a.pngbin1515 -> 0 bytes
-rw-r--r--images/emoji/1f42b.pngbin1190 -> 0 bytes
-rw-r--r--images/emoji/1f42c.pngbin1700 -> 0 bytes
-rw-r--r--images/emoji/1f42d.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f42e.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f42f.pngbin2104 -> 0 bytes
-rw-r--r--images/emoji/1f430.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f431.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f432.pngbin1769 -> 0 bytes
-rw-r--r--images/emoji/1f433.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f434.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f435.pngbin1027 -> 0 bytes
-rw-r--r--images/emoji/1f436.pngbin1680 -> 0 bytes
-rw-r--r--images/emoji/1f437.pngbin1138 -> 0 bytes
-rw-r--r--images/emoji/1f438.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/1f439.pngbin1280 -> 0 bytes
-rw-r--r--images/emoji/1f43a.pngbin1528 -> 0 bytes
-rw-r--r--images/emoji/1f43b.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/1f43c.pngbin1478 -> 0 bytes
-rw-r--r--images/emoji/1f43d.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/1f43e.pngbin603 -> 0 bytes
-rw-r--r--images/emoji/1f43f.pngbin1459 -> 0 bytes
-rw-r--r--images/emoji/1f440.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/1f441-1f5e8.pngbin698 -> 0 bytes
-rw-r--r--images/emoji/1f441.pngbin664 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fb.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fc.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fd.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3fe.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442-1f3ff.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f442.pngbin860 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fb.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fc.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fd.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3fe.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443-1f3ff.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f443.pngbin703 -> 0 bytes
-rw-r--r--images/emoji/1f444.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f445.pngbin599 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fb.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fc.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fd.pngbin871 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3fe.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446-1f3ff.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f446.pngbin822 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fb.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fc.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fd.pngbin858 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3fe.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447-1f3ff.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f447.pngbin853 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fb.pngbin832 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fc.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fd.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3fe.pngbin830 -> 0 bytes
-rw-r--r--images/emoji/1f448-1f3ff.pngbin832 -> 0 bytes
-rw-r--r--images/emoji/1f448.pngbin825 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fb.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fc.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fd.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3fe.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449-1f3ff.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f449.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fb.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fc.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fd.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3fe.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a-1f3ff.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44a.pngbin838 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fb.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fc.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fd.pngbin1295 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3fe.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b-1f3ff.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44b.pngbin1311 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fb.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fc.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fd.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3fe.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c-1f3ff.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44c.pngbin979 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fb.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fc.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fd.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3fe.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d-1f3ff.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44d.pngbin814 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fb.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fc.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fd.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3fe.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e-1f3ff.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44e.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fb.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fc.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fd.pngbin1460 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3fe.pngbin1459 -> 0 bytes
-rw-r--r--images/emoji/1f44f-1f3ff.pngbin1445 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fb.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fc.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fd.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3fe.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450-1f3ff.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f450.pngbin1053 -> 0 bytes
-rw-r--r--images/emoji/1f451.pngbin1534 -> 0 bytes
-rw-r--r--images/emoji/1f452.pngbin1553 -> 0 bytes
-rw-r--r--images/emoji/1f453.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/1f454.pngbin995 -> 0 bytes
-rw-r--r--images/emoji/1f455.pngbin670 -> 0 bytes
-rw-r--r--images/emoji/1f456.pngbin1158 -> 0 bytes
-rw-r--r--images/emoji/1f457.pngbin1001 -> 0 bytes
-rw-r--r--images/emoji/1f458.pngbin1539 -> 0 bytes
-rw-r--r--images/emoji/1f459.pngbin613 -> 0 bytes
-rw-r--r--images/emoji/1f45a.pngbin1042 -> 0 bytes
-rw-r--r--images/emoji/1f45b.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f45c.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f45d.pngbin1259 -> 0 bytes
-rw-r--r--images/emoji/1f45e.pngbin1652 -> 0 bytes
-rw-r--r--images/emoji/1f45f.pngbin1595 -> 0 bytes
-rw-r--r--images/emoji/1f460.pngbin1008 -> 0 bytes
-rw-r--r--images/emoji/1f461.pngbin1180 -> 0 bytes
-rw-r--r--images/emoji/1f462.pngbin662 -> 0 bytes
-rw-r--r--images/emoji/1f463.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f464.pngbin426 -> 0 bytes
-rw-r--r--images/emoji/1f465.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fb.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fc.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fd.pngbin876 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3fe.pngbin870 -> 0 bytes
-rw-r--r--images/emoji/1f466-1f3ff.pngbin873 -> 0 bytes
-rw-r--r--images/emoji/1f466.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fb.pngbin1260 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fc.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fd.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3fe.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f467-1f3ff.pngbin1245 -> 0 bytes
-rw-r--r--images/emoji/1f467.pngbin1262 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fb.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fc.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fd.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3fe.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f3ff.pngbin1087 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f466-1f466.pngbin1354 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f466.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467-1f466.pngbin1626 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467-1f467.pngbin1448 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f468-1f467.pngbin1362 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f466-1f466.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467-1f466.pngbin1838 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467-1f467.pngbin1739 -> 0 bytes
-rw-r--r--images/emoji/1f468-1f469-1f467.pngbin1555 -> 0 bytes
-rw-r--r--images/emoji/1f468-2764-1f468.pngbin1091 -> 0 bytes
-rw-r--r--images/emoji/1f468-2764-1f48b-1f468.pngbin1269 -> 0 bytes
-rw-r--r--images/emoji/1f468.pngbin1092 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fb.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fc.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fd.pngbin1206 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3fe.pngbin1197 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f3ff.pngbin1203 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f466-1f466.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f466.pngbin1155 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467-1f466.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467-1f467.pngbin1374 -> 0 bytes
-rw-r--r--images/emoji/1f469-1f469-1f467.pngbin1290 -> 0 bytes
-rw-r--r--images/emoji/1f469-2764-1f469.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/1f469-2764-1f48b-1f469.pngbin1150 -> 0 bytes
-rw-r--r--images/emoji/1f469.pngbin1212 -> 0 bytes
-rw-r--r--images/emoji/1f46a.pngbin1437 -> 0 bytes
-rw-r--r--images/emoji/1f46b.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f46c.pngbin1347 -> 0 bytes
-rw-r--r--images/emoji/1f46d.pngbin1547 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fb.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fc.pngbin1424 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fd.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3fe.pngbin1422 -> 0 bytes
-rw-r--r--images/emoji/1f46e-1f3ff.pngbin1434 -> 0 bytes
-rw-r--r--images/emoji/1f46e.pngbin1442 -> 0 bytes
-rw-r--r--images/emoji/1f46f.pngbin1876 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fb.pngbin2464 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fc.pngbin2457 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fd.pngbin2463 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3fe.pngbin2463 -> 0 bytes
-rw-r--r--images/emoji/1f470-1f3ff.pngbin2462 -> 0 bytes
-rw-r--r--images/emoji/1f470.pngbin2452 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fb.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fc.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fd.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3fe.pngbin1189 -> 0 bytes
-rw-r--r--images/emoji/1f471-1f3ff.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f471.pngbin1205 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fb.pngbin1328 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fc.pngbin1332 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fd.pngbin1329 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3fe.pngbin1325 -> 0 bytes
-rw-r--r--images/emoji/1f472-1f3ff.pngbin1337 -> 0 bytes
-rw-r--r--images/emoji/1f472.pngbin1339 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fb.pngbin1584 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fc.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fd.pngbin1584 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3fe.pngbin1583 -> 0 bytes
-rw-r--r--images/emoji/1f473-1f3ff.pngbin1607 -> 0 bytes
-rw-r--r--images/emoji/1f473.pngbin1619 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fb.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fc.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fd.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3fe.pngbin1254 -> 0 bytes
-rw-r--r--images/emoji/1f474-1f3ff.pngbin1254 -> 0 bytes
-rw-r--r--images/emoji/1f474.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fb.pngbin1562 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fc.pngbin1564 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fd.pngbin1555 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3fe.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f475-1f3ff.pngbin1544 -> 0 bytes
-rw-r--r--images/emoji/1f475.pngbin1472 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fb.pngbin1394 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fc.pngbin1394 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fd.pngbin1405 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3fe.pngbin1414 -> 0 bytes
-rw-r--r--images/emoji/1f476-1f3ff.pngbin1408 -> 0 bytes
-rw-r--r--images/emoji/1f476.pngbin1383 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fb.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fc.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fd.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3fe.pngbin1095 -> 0 bytes
-rw-r--r--images/emoji/1f477-1f3ff.pngbin1119 -> 0 bytes
-rw-r--r--images/emoji/1f477.pngbin1126 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fb.pngbin1814 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fc.pngbin1808 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fd.pngbin1808 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3fe.pngbin1813 -> 0 bytes
-rw-r--r--images/emoji/1f478-1f3ff.pngbin1812 -> 0 bytes
-rw-r--r--images/emoji/1f478.pngbin1816 -> 0 bytes
-rw-r--r--images/emoji/1f479.pngbin1864 -> 0 bytes
-rw-r--r--images/emoji/1f47a.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f47b.pngbin1468 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fb.pngbin2088 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fc.pngbin2075 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fd.pngbin2078 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3fe.pngbin2076 -> 0 bytes
-rw-r--r--images/emoji/1f47c-1f3ff.pngbin2078 -> 0 bytes
-rw-r--r--images/emoji/1f47c.pngbin2077 -> 0 bytes
-rw-r--r--images/emoji/1f47d.pngbin839 -> 0 bytes
-rw-r--r--images/emoji/1f47e.pngbin1325 -> 0 bytes
-rw-r--r--images/emoji/1f47f.pngbin1990 -> 0 bytes
-rw-r--r--images/emoji/1f480.pngbin628 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fb.pngbin1597 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fc.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fd.pngbin1580 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3fe.pngbin1578 -> 0 bytes
-rw-r--r--images/emoji/1f481-1f3ff.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f481.pngbin1585 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fb.pngbin1122 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fc.pngbin1164 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fd.pngbin1164 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3fe.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f482-1f3ff.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f482.pngbin1140 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fb.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fc.pngbin1423 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fd.pngbin1429 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3fe.pngbin1428 -> 0 bytes
-rw-r--r--images/emoji/1f483-1f3ff.pngbin1418 -> 0 bytes
-rw-r--r--images/emoji/1f483.pngbin1406 -> 0 bytes
-rw-r--r--images/emoji/1f484.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fb.pngbin1717 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fc.pngbin1716 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fd.pngbin1733 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3fe.pngbin1730 -> 0 bytes
-rw-r--r--images/emoji/1f485-1f3ff.pngbin1719 -> 0 bytes
-rw-r--r--images/emoji/1f485.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fb.pngbin1585 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fc.pngbin1565 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fd.pngbin1554 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3fe.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f486-1f3ff.pngbin1557 -> 0 bytes
-rw-r--r--images/emoji/1f486.pngbin1572 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fb.pngbin1945 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fc.pngbin1936 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fd.pngbin1923 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3fe.pngbin1904 -> 0 bytes
-rw-r--r--images/emoji/1f487-1f3ff.pngbin1920 -> 0 bytes
-rw-r--r--images/emoji/1f487.pngbin1935 -> 0 bytes
-rw-r--r--images/emoji/1f488.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/1f489.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f48a.pngbin442 -> 0 bytes
-rw-r--r--images/emoji/1f48c.pngbin923 -> 0 bytes
-rw-r--r--images/emoji/1f48d.pngbin1113 -> 0 bytes
-rw-r--r--images/emoji/1f48e.pngbin715 -> 0 bytes
-rw-r--r--images/emoji/1f48f.pngbin1380 -> 0 bytes
-rw-r--r--images/emoji/1f490.pngbin1662 -> 0 bytes
-rw-r--r--images/emoji/1f491.pngbin1285 -> 0 bytes
-rw-r--r--images/emoji/1f492.pngbin1260 -> 0 bytes
-rw-r--r--images/emoji/1f493.pngbin699 -> 0 bytes
-rw-r--r--images/emoji/1f494.pngbin556 -> 0 bytes
-rw-r--r--images/emoji/1f495.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/1f496.pngbin821 -> 0 bytes
-rw-r--r--images/emoji/1f497.pngbin675 -> 0 bytes
-rw-r--r--images/emoji/1f498.pngbin846 -> 0 bytes
-rw-r--r--images/emoji/1f499.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49a.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49b.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49c.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f49d.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f49e.pngbin920 -> 0 bytes
-rw-r--r--images/emoji/1f49f.pngbin557 -> 0 bytes
-rw-r--r--images/emoji/1f4a0.pngbin693 -> 0 bytes
-rw-r--r--images/emoji/1f4a1.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f4a2.pngbin594 -> 0 bytes
-rw-r--r--images/emoji/1f4a3.pngbin702 -> 0 bytes
-rw-r--r--images/emoji/1f4a4.pngbin540 -> 0 bytes
-rw-r--r--images/emoji/1f4a5.pngbin1110 -> 0 bytes
-rw-r--r--images/emoji/1f4a6.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/1f4a7.pngbin411 -> 0 bytes
-rw-r--r--images/emoji/1f4a8.pngbin840 -> 0 bytes
-rw-r--r--images/emoji/1f4a9.pngbin1273 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fb.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fc.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fd.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3fe.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa-1f3ff.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4aa.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4ab.pngbin795 -> 0 bytes
-rw-r--r--images/emoji/1f4ac.pngbin384 -> 0 bytes
-rw-r--r--images/emoji/1f4ad.pngbin489 -> 0 bytes
-rw-r--r--images/emoji/1f4ae.pngbin941 -> 0 bytes
-rw-r--r--images/emoji/1f4af.pngbin793 -> 0 bytes
-rw-r--r--images/emoji/1f4b0.pngbin2310 -> 0 bytes
-rw-r--r--images/emoji/1f4b1.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f4b2.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/1f4b3.pngbin1012 -> 0 bytes
-rw-r--r--images/emoji/1f4b4.pngbin421 -> 0 bytes
-rw-r--r--images/emoji/1f4b5.pngbin405 -> 0 bytes
-rw-r--r--images/emoji/1f4b6.pngbin460 -> 0 bytes
-rw-r--r--images/emoji/1f4b7.pngbin452 -> 0 bytes
-rw-r--r--images/emoji/1f4b8.pngbin2327 -> 0 bytes
-rw-r--r--images/emoji/1f4b9.pngbin724 -> 0 bytes
-rw-r--r--images/emoji/1f4ba.pngbin884 -> 0 bytes
-rw-r--r--images/emoji/1f4bb.pngbin369 -> 0 bytes
-rw-r--r--images/emoji/1f4bc.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f4bd.pngbin522 -> 0 bytes
-rw-r--r--images/emoji/1f4be.pngbin258 -> 0 bytes
-rw-r--r--images/emoji/1f4bf.pngbin908 -> 0 bytes
-rw-r--r--images/emoji/1f4c0.pngbin933 -> 0 bytes
-rw-r--r--images/emoji/1f4c1.pngbin1445 -> 0 bytes
-rw-r--r--images/emoji/1f4c2.pngbin755 -> 0 bytes
-rw-r--r--images/emoji/1f4c3.pngbin1157 -> 0 bytes
-rw-r--r--images/emoji/1f4c4.pngbin1110 -> 0 bytes
-rw-r--r--images/emoji/1f4c5.pngbin788 -> 0 bytes
-rw-r--r--images/emoji/1f4c6.pngbin2077 -> 0 bytes
-rw-r--r--images/emoji/1f4c7.pngbin1929 -> 0 bytes
-rw-r--r--images/emoji/1f4c8.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/1f4c9.pngbin709 -> 0 bytes
-rw-r--r--images/emoji/1f4ca.pngbin408 -> 0 bytes
-rw-r--r--images/emoji/1f4cb.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f4cc.pngbin640 -> 0 bytes
-rw-r--r--images/emoji/1f4cd.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f4ce.pngbin439 -> 0 bytes
-rw-r--r--images/emoji/1f4cf.pngbin1406 -> 0 bytes
-rw-r--r--images/emoji/1f4d0.pngbin369 -> 0 bytes
-rw-r--r--images/emoji/1f4d1.pngbin1398 -> 0 bytes
-rw-r--r--images/emoji/1f4d2.pngbin1530 -> 0 bytes
-rw-r--r--images/emoji/1f4d3.pngbin1215 -> 0 bytes
-rw-r--r--images/emoji/1f4d4.pngbin1782 -> 0 bytes
-rw-r--r--images/emoji/1f4d5.pngbin1359 -> 0 bytes
-rw-r--r--images/emoji/1f4d6.pngbin1716 -> 0 bytes
-rw-r--r--images/emoji/1f4d7.pngbin1366 -> 0 bytes
-rw-r--r--images/emoji/1f4d8.pngbin1348 -> 0 bytes
-rw-r--r--images/emoji/1f4d9.pngbin1329 -> 0 bytes
-rw-r--r--images/emoji/1f4da.pngbin2474 -> 0 bytes
-rw-r--r--images/emoji/1f4db.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f4dc.pngbin989 -> 0 bytes
-rw-r--r--images/emoji/1f4dd.pngbin1625 -> 0 bytes
-rw-r--r--images/emoji/1f4de.pngbin941 -> 0 bytes
-rw-r--r--images/emoji/1f4df.pngbin553 -> 0 bytes
-rw-r--r--images/emoji/1f4e0.pngbin1188 -> 0 bytes
-rw-r--r--images/emoji/1f4e1.pngbin1173 -> 0 bytes
-rw-r--r--images/emoji/1f4e2.pngbin1316 -> 0 bytes
-rw-r--r--images/emoji/1f4e3.pngbin1751 -> 0 bytes
-rw-r--r--images/emoji/1f4e4.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f4e5.pngbin1029 -> 0 bytes
-rw-r--r--images/emoji/1f4e6.pngbin950 -> 0 bytes
-rw-r--r--images/emoji/1f4e7.pngbin1196 -> 0 bytes
-rw-r--r--images/emoji/1f4e8.pngbin1129 -> 0 bytes
-rw-r--r--images/emoji/1f4e9.pngbin1062 -> 0 bytes
-rw-r--r--images/emoji/1f4ea.pngbin1192 -> 0 bytes
-rw-r--r--images/emoji/1f4eb.pngbin1166 -> 0 bytes
-rw-r--r--images/emoji/1f4ec.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f4ed.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f4ee.pngbin1077 -> 0 bytes
-rw-r--r--images/emoji/1f4ef.pngbin809 -> 0 bytes
-rw-r--r--images/emoji/1f4f0.pngbin1178 -> 0 bytes
-rw-r--r--images/emoji/1f4f1.pngbin695 -> 0 bytes
-rw-r--r--images/emoji/1f4f2.pngbin815 -> 0 bytes
-rw-r--r--images/emoji/1f4f3.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/1f4f4.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f4f5.pngbin790 -> 0 bytes
-rw-r--r--images/emoji/1f4f6.pngbin445 -> 0 bytes
-rw-r--r--images/emoji/1f4f7.pngbin1783 -> 0 bytes
-rw-r--r--images/emoji/1f4f8.pngbin2097 -> 0 bytes
-rw-r--r--images/emoji/1f4f9.pngbin1613 -> 0 bytes
-rw-r--r--images/emoji/1f4fa.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/1f4fb.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f4fc.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f4fd.pngbin943 -> 0 bytes
-rw-r--r--images/emoji/1f4ff.pngbin1059 -> 0 bytes
-rw-r--r--images/emoji/1f500.pngbin574 -> 0 bytes
-rw-r--r--images/emoji/1f501.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/1f502.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/1f503.pngbin519 -> 0 bytes
-rw-r--r--images/emoji/1f504.pngbin693 -> 0 bytes
-rw-r--r--images/emoji/1f505.pngbin431 -> 0 bytes
-rw-r--r--images/emoji/1f506.pngbin474 -> 0 bytes
-rw-r--r--images/emoji/1f507.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f508.pngbin575 -> 0 bytes
-rw-r--r--images/emoji/1f509.pngbin690 -> 0 bytes
-rw-r--r--images/emoji/1f50a.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/1f50b.pngbin228 -> 0 bytes
-rw-r--r--images/emoji/1f50c.pngbin548 -> 0 bytes
-rw-r--r--images/emoji/1f50d.pngbin1240 -> 0 bytes
-rw-r--r--images/emoji/1f50e.pngbin1251 -> 0 bytes
-rw-r--r--images/emoji/1f50f.pngbin1123 -> 0 bytes
-rw-r--r--images/emoji/1f510.pngbin1250 -> 0 bytes
-rw-r--r--images/emoji/1f511.pngbin770 -> 0 bytes
-rw-r--r--images/emoji/1f512.pngbin986 -> 0 bytes
-rw-r--r--images/emoji/1f513.pngbin856 -> 0 bytes
-rw-r--r--images/emoji/1f514.pngbin1497 -> 0 bytes
-rw-r--r--images/emoji/1f515.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/1f516.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/1f517.pngbin477 -> 0 bytes
-rw-r--r--images/emoji/1f518.pngbin674 -> 0 bytes
-rw-r--r--images/emoji/1f519.pngbin562 -> 0 bytes
-rw-r--r--images/emoji/1f51a.pngbin393 -> 0 bytes
-rw-r--r--images/emoji/1f51b.pngbin459 -> 0 bytes
-rw-r--r--images/emoji/1f51c.pngbin483 -> 0 bytes
-rw-r--r--images/emoji/1f51d.pngbin389 -> 0 bytes
-rw-r--r--images/emoji/1f51e.pngbin863 -> 0 bytes
-rw-r--r--images/emoji/1f51f.pngbin621 -> 0 bytes
-rw-r--r--images/emoji/1f520.pngbin805 -> 0 bytes
-rw-r--r--images/emoji/1f521.pngbin670 -> 0 bytes
-rw-r--r--images/emoji/1f522.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f523.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/1f524.pngbin646 -> 0 bytes
-rw-r--r--images/emoji/1f525.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/1f526.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f527.pngbin418 -> 0 bytes
-rw-r--r--images/emoji/1f528.pngbin834 -> 0 bytes
-rw-r--r--images/emoji/1f529.pngbin899 -> 0 bytes
-rw-r--r--images/emoji/1f52a.pngbin616 -> 0 bytes
-rw-r--r--images/emoji/1f52b.pngbin1859 -> 0 bytes
-rw-r--r--images/emoji/1f52c.pngbin1113 -> 0 bytes
-rw-r--r--images/emoji/1f52d.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f52e.pngbin1914 -> 0 bytes
-rw-r--r--images/emoji/1f52f.pngbin540 -> 0 bytes
-rw-r--r--images/emoji/1f530.pngbin545 -> 0 bytes
-rw-r--r--images/emoji/1f531.pngbin668 -> 0 bytes
-rw-r--r--images/emoji/1f532.pngbin122 -> 0 bytes
-rw-r--r--images/emoji/1f533.pngbin122 -> 0 bytes
-rw-r--r--images/emoji/1f534.pngbin374 -> 0 bytes
-rw-r--r--images/emoji/1f535.pngbin371 -> 0 bytes
-rw-r--r--images/emoji/1f536.pngbin248 -> 0 bytes
-rw-r--r--images/emoji/1f537.pngbin245 -> 0 bytes
-rw-r--r--images/emoji/1f538.pngbin194 -> 0 bytes
-rw-r--r--images/emoji/1f539.pngbin191 -> 0 bytes
-rw-r--r--images/emoji/1f53a.pngbin273 -> 0 bytes
-rw-r--r--images/emoji/1f53b.pngbin291 -> 0 bytes
-rw-r--r--images/emoji/1f53c.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/1f53d.pngbin455 -> 0 bytes
-rw-r--r--images/emoji/1f549.pngbin773 -> 0 bytes
-rw-r--r--images/emoji/1f54a.pngbin967 -> 0 bytes
-rw-r--r--images/emoji/1f54b.pngbin1251 -> 0 bytes
-rw-r--r--images/emoji/1f54c.pngbin984 -> 0 bytes
-rw-r--r--images/emoji/1f54d.pngbin1309 -> 0 bytes
-rw-r--r--images/emoji/1f54e.pngbin1279 -> 0 bytes
-rw-r--r--images/emoji/1f550.pngbin586 -> 0 bytes
-rw-r--r--images/emoji/1f551.pngbin591 -> 0 bytes
-rw-r--r--images/emoji/1f552.pngbin482 -> 0 bytes
-rw-r--r--images/emoji/1f553.pngbin592 -> 0 bytes
-rw-r--r--images/emoji/1f554.pngbin585 -> 0 bytes
-rw-r--r--images/emoji/1f555.pngbin466 -> 0 bytes
-rw-r--r--images/emoji/1f556.pngbin581 -> 0 bytes
-rw-r--r--images/emoji/1f557.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f558.pngbin484 -> 0 bytes
-rw-r--r--images/emoji/1f559.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f55a.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f55b.pngbin480 -> 0 bytes
-rw-r--r--images/emoji/1f55c.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/1f55d.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f55e.pngbin568 -> 0 bytes
-rw-r--r--images/emoji/1f55f.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f560.pngbin552 -> 0 bytes
-rw-r--r--images/emoji/1f561.pngbin536 -> 0 bytes
-rw-r--r--images/emoji/1f562.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f563.pngbin570 -> 0 bytes
-rw-r--r--images/emoji/1f564.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f565.pngbin530 -> 0 bytes
-rw-r--r--images/emoji/1f566.pngbin583 -> 0 bytes
-rw-r--r--images/emoji/1f567.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/1f56f.pngbin1250 -> 0 bytes
-rw-r--r--images/emoji/1f570.pngbin592 -> 0 bytes
-rw-r--r--images/emoji/1f573.pngbin1390 -> 0 bytes
-rw-r--r--images/emoji/1f574.pngbin914 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fb.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fc.pngbin1636 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fd.pngbin1647 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3fe.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575-1f3ff.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f575.pngbin1650 -> 0 bytes
-rw-r--r--images/emoji/1f576.pngbin829 -> 0 bytes
-rw-r--r--images/emoji/1f577.pngbin1724 -> 0 bytes
-rw-r--r--images/emoji/1f578.pngbin929 -> 0 bytes
-rw-r--r--images/emoji/1f579.pngbin1039 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fb.pngbin1404 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fc.pngbin1402 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fd.pngbin1409 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3fe.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f57a-1f3ff.pngbin1418 -> 0 bytes
-rw-r--r--images/emoji/1f57a.pngbin1400 -> 0 bytes
-rw-r--r--images/emoji/1f587.pngbin642 -> 0 bytes
-rw-r--r--images/emoji/1f58a.pngbin696 -> 0 bytes
-rw-r--r--images/emoji/1f58b.pngbin623 -> 0 bytes
-rw-r--r--images/emoji/1f58c.pngbin950 -> 0 bytes
-rw-r--r--images/emoji/1f58d.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fb.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fc.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fd.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3fe.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590-1f3ff.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f590.pngbin1081 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fb.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fc.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fd.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3fe.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595-1f3ff.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f595.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fb.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fc.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fd.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3fe.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596-1f3ff.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f596.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f5a4.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/1f5a5.pngbin311 -> 0 bytes
-rw-r--r--images/emoji/1f5a8.pngbin926 -> 0 bytes
-rw-r--r--images/emoji/1f5b1.pngbin934 -> 0 bytes
-rw-r--r--images/emoji/1f5b2.pngbin892 -> 0 bytes
-rw-r--r--images/emoji/1f5bc.pngbin514 -> 0 bytes
-rw-r--r--images/emoji/1f5c2.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f5c3.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f5c4.pngbin1420 -> 0 bytes
-rw-r--r--images/emoji/1f5d1.pngbin2414 -> 0 bytes
-rw-r--r--images/emoji/1f5d2.pngbin1377 -> 0 bytes
-rw-r--r--images/emoji/1f5d3.pngbin1491 -> 0 bytes
-rw-r--r--images/emoji/1f5dc.pngbin1614 -> 0 bytes
-rw-r--r--images/emoji/1f5dd.pngbin593 -> 0 bytes
-rw-r--r--images/emoji/1f5de.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f5e1.pngbin916 -> 0 bytes
-rw-r--r--images/emoji/1f5e3.pngbin531 -> 0 bytes
-rw-r--r--images/emoji/1f5e8.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/1f5ef.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/1f5f3.pngbin1355 -> 0 bytes
-rw-r--r--images/emoji/1f5fa.pngbin2352 -> 0 bytes
-rw-r--r--images/emoji/1f5fb.pngbin881 -> 0 bytes
-rw-r--r--images/emoji/1f5fc.pngbin765 -> 0 bytes
-rw-r--r--images/emoji/1f5fd.pngbin1145 -> 0 bytes
-rw-r--r--images/emoji/1f5fe.pngbin539 -> 0 bytes
-rw-r--r--images/emoji/1f5ff.pngbin1593 -> 0 bytes
-rw-r--r--images/emoji/1f600.pngbin810 -> 0 bytes
-rw-r--r--images/emoji/1f601.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f602.pngbin1136 -> 0 bytes
-rw-r--r--images/emoji/1f603.pngbin686 -> 0 bytes
-rw-r--r--images/emoji/1f604.pngbin737 -> 0 bytes
-rw-r--r--images/emoji/1f605.pngbin851 -> 0 bytes
-rw-r--r--images/emoji/1f609.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/1f60b.pngbin896 -> 0 bytes
-rw-r--r--images/emoji/1f60c.pngbin785 -> 0 bytes
-rw-r--r--images/emoji/1f60d.pngbin1069 -> 0 bytes
-rw-r--r--images/emoji/1f60e.pngbin824 -> 0 bytes
-rw-r--r--images/emoji/1f60f.pngbin775 -> 0 bytes
-rw-r--r--images/emoji/1f610.pngbin517 -> 0 bytes
-rw-r--r--images/emoji/1f611.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/1f612.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/1f613.pngbin861 -> 0 bytes
-rw-r--r--images/emoji/1f614.pngbin718 -> 0 bytes
-rw-r--r--images/emoji/1f615.pngbin647 -> 0 bytes
-rw-r--r--images/emoji/1f616.pngbin844 -> 0 bytes
-rw-r--r--images/emoji/1f617.pngbin738 -> 0 bytes
-rw-r--r--images/emoji/1f618.pngbin843 -> 0 bytes
-rw-r--r--images/emoji/1f619.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/1f61a.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f61b.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f61d.pngbin867 -> 0 bytes
-rw-r--r--images/emoji/1f61f.pngbin715 -> 0 bytes
-rw-r--r--images/emoji/1f620.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f621.pngbin845 -> 0 bytes
-rw-r--r--images/emoji/1f622.pngbin1123 -> 0 bytes
-rw-r--r--images/emoji/1f623.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f624.pngbin1532 -> 0 bytes
-rw-r--r--images/emoji/1f625.pngbin835 -> 0 bytes
-rw-r--r--images/emoji/1f626.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f627.pngbin821 -> 0 bytes
-rw-r--r--images/emoji/1f628.pngbin1002 -> 0 bytes
-rw-r--r--images/emoji/1f629.pngbin871 -> 0 bytes
-rw-r--r--images/emoji/1f62a.pngbin1185 -> 0 bytes
-rw-r--r--images/emoji/1f62b.pngbin1132 -> 0 bytes
-rw-r--r--images/emoji/1f62c.pngbin694 -> 0 bytes
-rw-r--r--images/emoji/1f62d.pngbin1241 -> 0 bytes
-rw-r--r--images/emoji/1f62f.pngbin634 -> 0 bytes
-rw-r--r--images/emoji/1f630.pngbin971 -> 0 bytes
-rw-r--r--images/emoji/1f631.pngbin1588 -> 0 bytes
-rw-r--r--images/emoji/1f632.pngbin862 -> 0 bytes
-rw-r--r--images/emoji/1f633.pngbin1127 -> 0 bytes
-rw-r--r--images/emoji/1f635.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f636.pngbin465 -> 0 bytes
-rw-r--r--images/emoji/1f637.pngbin1323 -> 0 bytes
-rw-r--r--images/emoji/1f638.pngbin1407 -> 0 bytes
-rw-r--r--images/emoji/1f639.pngbin1633 -> 0 bytes
-rw-r--r--images/emoji/1f63a.pngbin1677 -> 0 bytes
-rw-r--r--images/emoji/1f63b.pngbin1513 -> 0 bytes
-rw-r--r--images/emoji/1f63c.pngbin1665 -> 0 bytes
-rw-r--r--images/emoji/1f63d.pngbin1469 -> 0 bytes
-rw-r--r--images/emoji/1f63e.pngbin1675 -> 0 bytes
-rw-r--r--images/emoji/1f63f.pngbin1876 -> 0 bytes
-rw-r--r--images/emoji/1f640.pngbin2120 -> 0 bytes
-rw-r--r--images/emoji/1f641.pngbin580 -> 0 bytes
-rw-r--r--images/emoji/1f642.pngbin600 -> 0 bytes
-rw-r--r--images/emoji/1f643.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/1f644.pngbin743 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fb.pngbin1768 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fc.pngbin1756 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fd.pngbin1766 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3fe.pngbin1786 -> 0 bytes
-rw-r--r--images/emoji/1f645-1f3ff.pngbin1786 -> 0 bytes
-rw-r--r--images/emoji/1f645.pngbin1751 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fb.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fc.pngbin1695 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fd.pngbin1699 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3fe.pngbin1692 -> 0 bytes
-rw-r--r--images/emoji/1f646-1f3ff.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f646.pngbin1702 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fb.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fc.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fd.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3fe.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647-1f3ff.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f647.pngbin1396 -> 0 bytes
-rw-r--r--images/emoji/1f648.pngbin1227 -> 0 bytes
-rw-r--r--images/emoji/1f649.pngbin1210 -> 0 bytes
-rw-r--r--images/emoji/1f64a.pngbin1503 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fb.pngbin1678 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fc.pngbin1665 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fd.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3fe.pngbin1658 -> 0 bytes
-rw-r--r--images/emoji/1f64b-1f3ff.pngbin1661 -> 0 bytes
-rw-r--r--images/emoji/1f64b.pngbin1669 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fb.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fc.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fd.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3fe.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c-1f3ff.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64c.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fb.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fc.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fd.pngbin1141 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3fe.pngbin1109 -> 0 bytes
-rw-r--r--images/emoji/1f64d-1f3ff.pngbin1114 -> 0 bytes
-rw-r--r--images/emoji/1f64d.pngbin1148 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fb.pngbin1309 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fc.pngbin1292 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fd.pngbin1305 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3fe.pngbin1296 -> 0 bytes
-rw-r--r--images/emoji/1f64e-1f3ff.pngbin1303 -> 0 bytes
-rw-r--r--images/emoji/1f64e.pngbin1297 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fb.pngbin1131 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fc.pngbin1134 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fd.pngbin1137 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3fe.pngbin1126 -> 0 bytes
-rw-r--r--images/emoji/1f64f-1f3ff.pngbin1117 -> 0 bytes
-rw-r--r--images/emoji/1f64f.pngbin1122 -> 0 bytes
-rw-r--r--images/emoji/1f680.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f681.pngbin1098 -> 0 bytes
-rw-r--r--images/emoji/1f682.pngbin1736 -> 0 bytes
-rw-r--r--images/emoji/1f683.pngbin847 -> 0 bytes
-rw-r--r--images/emoji/1f684.pngbin1538 -> 0 bytes
-rw-r--r--images/emoji/1f685.pngbin1450 -> 0 bytes
-rw-r--r--images/emoji/1f686.pngbin1501 -> 0 bytes
-rw-r--r--images/emoji/1f687.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/1f688.pngbin902 -> 0 bytes
-rw-r--r--images/emoji/1f689.pngbin1336 -> 0 bytes
-rw-r--r--images/emoji/1f68a.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f68b.pngbin1031 -> 0 bytes
-rw-r--r--images/emoji/1f68c.pngbin1086 -> 0 bytes
-rw-r--r--images/emoji/1f68d.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f68e.pngbin1168 -> 0 bytes
-rw-r--r--images/emoji/1f68f.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/1f690.pngbin1256 -> 0 bytes
-rw-r--r--images/emoji/1f691.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f692.pngbin1658 -> 0 bytes
-rw-r--r--images/emoji/1f693.pngbin1431 -> 0 bytes
-rw-r--r--images/emoji/1f694.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f695.pngbin1230 -> 0 bytes
-rw-r--r--images/emoji/1f696.pngbin1410 -> 0 bytes
-rw-r--r--images/emoji/1f697.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f698.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f699.pngbin1275 -> 0 bytes
-rw-r--r--images/emoji/1f69a.pngbin1367 -> 0 bytes
-rw-r--r--images/emoji/1f69b.pngbin1711 -> 0 bytes
-rw-r--r--images/emoji/1f69c.pngbin1192 -> 0 bytes
-rw-r--r--images/emoji/1f69d.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/1f69e.pngbin1320 -> 0 bytes
-rw-r--r--images/emoji/1f69f.pngbin927 -> 0 bytes
-rw-r--r--images/emoji/1f6a0.pngbin811 -> 0 bytes
-rw-r--r--images/emoji/1f6a1.pngbin759 -> 0 bytes
-rw-r--r--images/emoji/1f6a2.pngbin1405 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fb.pngbin1972 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fc.pngbin1972 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fd.pngbin1967 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3fe.pngbin1974 -> 0 bytes
-rw-r--r--images/emoji/1f6a3-1f3ff.pngbin1971 -> 0 bytes
-rw-r--r--images/emoji/1f6a3.pngbin1963 -> 0 bytes
-rw-r--r--images/emoji/1f6a4.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f6a5.pngbin590 -> 0 bytes
-rw-r--r--images/emoji/1f6a6.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f6a7.pngbin1083 -> 0 bytes
-rw-r--r--images/emoji/1f6a8.pngbin1969 -> 0 bytes
-rw-r--r--images/emoji/1f6a9.pngbin415 -> 0 bytes
-rw-r--r--images/emoji/1f6aa.pngbin1105 -> 0 bytes
-rw-r--r--images/emoji/1f6ab.pngbin555 -> 0 bytes
-rw-r--r--images/emoji/1f6ac.pngbin417 -> 0 bytes
-rw-r--r--images/emoji/1f6ad.pngbin1140 -> 0 bytes
-rw-r--r--images/emoji/1f6ae.pngbin650 -> 0 bytes
-rw-r--r--images/emoji/1f6af.pngbin1010 -> 0 bytes
-rw-r--r--images/emoji/1f6b0.pngbin633 -> 0 bytes
-rw-r--r--images/emoji/1f6b1.pngbin827 -> 0 bytes
-rw-r--r--images/emoji/1f6b2.pngbin1506 -> 0 bytes
-rw-r--r--images/emoji/1f6b3.pngbin998 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fb.pngbin1860 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fc.pngbin1866 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fd.pngbin1851 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3fe.pngbin1852 -> 0 bytes
-rw-r--r--images/emoji/1f6b4-1f3ff.pngbin1840 -> 0 bytes
-rw-r--r--images/emoji/1f6b4.pngbin1911 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fb.pngbin2294 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fc.pngbin2298 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fd.pngbin2284 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3fe.pngbin2288 -> 0 bytes
-rw-r--r--images/emoji/1f6b5-1f3ff.pngbin2281 -> 0 bytes
-rw-r--r--images/emoji/1f6b5.pngbin2288 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fb.pngbin1084 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fc.pngbin1084 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fd.pngbin1066 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3fe.pngbin1075 -> 0 bytes
-rw-r--r--images/emoji/1f6b6-1f3ff.pngbin1065 -> 0 bytes
-rw-r--r--images/emoji/1f6b6.pngbin1082 -> 0 bytes
-rw-r--r--images/emoji/1f6b7.pngbin875 -> 0 bytes
-rw-r--r--images/emoji/1f6b8.pngbin778 -> 0 bytes
-rw-r--r--images/emoji/1f6b9.pngbin561 -> 0 bytes
-rw-r--r--images/emoji/1f6ba.pngbin577 -> 0 bytes
-rw-r--r--images/emoji/1f6bb.pngbin676 -> 0 bytes
-rw-r--r--images/emoji/1f6bc.pngbin665 -> 0 bytes
-rw-r--r--images/emoji/1f6bd.pngbin726 -> 0 bytes
-rw-r--r--images/emoji/1f6be.pngbin752 -> 0 bytes
-rw-r--r--images/emoji/1f6bf.pngbin2537 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fb.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fc.pngbin1231 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fd.pngbin1236 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3fe.pngbin1252 -> 0 bytes
-rw-r--r--images/emoji/1f6c0-1f3ff.pngbin1239 -> 0 bytes
-rw-r--r--images/emoji/1f6c0.pngbin1238 -> 0 bytes
-rw-r--r--images/emoji/1f6c1.pngbin767 -> 0 bytes
-rw-r--r--images/emoji/1f6c2.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/1f6c3.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/1f6c4.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/1f6c5.pngbin576 -> 0 bytes
-rw-r--r--images/emoji/1f6cb.pngbin1362 -> 0 bytes
-rw-r--r--images/emoji/1f6cc.pngbin926 -> 0 bytes
-rw-r--r--images/emoji/1f6cd.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f6ce.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f6cf.pngbin1573 -> 0 bytes
-rw-r--r--images/emoji/1f6d0.pngbin487 -> 0 bytes
-rw-r--r--images/emoji/1f6d1.pngbin260 -> 0 bytes
-rw-r--r--images/emoji/1f6d2.pngbin1072 -> 0 bytes
-rw-r--r--images/emoji/1f6e0.pngbin1225 -> 0 bytes
-rw-r--r--images/emoji/1f6e1.pngbin1602 -> 0 bytes
-rw-r--r--images/emoji/1f6e2.pngbin674 -> 0 bytes
-rw-r--r--images/emoji/1f6e3.pngbin1102 -> 0 bytes
-rw-r--r--images/emoji/1f6e4.pngbin1552 -> 0 bytes
-rw-r--r--images/emoji/1f6e5.pngbin990 -> 0 bytes
-rw-r--r--images/emoji/1f6e9.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f6eb.pngbin1111 -> 0 bytes
-rw-r--r--images/emoji/1f6ec.pngbin1101 -> 0 bytes
-rw-r--r--images/emoji/1f6f0.pngbin762 -> 0 bytes
-rw-r--r--images/emoji/1f6f3.pngbin2272 -> 0 bytes
-rw-r--r--images/emoji/1f6f4.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f6f5.pngbin1207 -> 0 bytes
-rw-r--r--images/emoji/1f6f6.pngbin1244 -> 0 bytes
-rw-r--r--images/emoji/1f910.pngbin722 -> 0 bytes
-rw-r--r--images/emoji/1f911.pngbin967 -> 0 bytes
-rw-r--r--images/emoji/1f912.pngbin1507 -> 0 bytes
-rw-r--r--images/emoji/1f913.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f914.pngbin1345 -> 0 bytes
-rw-r--r--images/emoji/1f915.pngbin1201 -> 0 bytes
-rw-r--r--images/emoji/1f916.pngbin1228 -> 0 bytes
-rw-r--r--images/emoji/1f917.pngbin1427 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fb.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fc.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fd.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3fe.pngbin888 -> 0 bytes
-rw-r--r--images/emoji/1f918-1f3ff.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f918.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fb.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fc.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fd.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3fe.pngbin891 -> 0 bytes
-rw-r--r--images/emoji/1f919-1f3ff.pngbin893 -> 0 bytes
-rw-r--r--images/emoji/1f919.pngbin894 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fb.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fc.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fd.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3fe.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a-1f3ff.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91a.pngbin848 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fb.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fc.pngbin972 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fd.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3fe.pngbin960 -> 0 bytes
-rw-r--r--images/emoji/1f91b-1f3ff.pngbin976 -> 0 bytes
-rw-r--r--images/emoji/1f91b.pngbin972 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fb.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fc.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fd.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3fe.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c-1f3ff.pngbin964 -> 0 bytes
-rw-r--r--images/emoji/1f91c.pngbin975 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fb.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fc.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fd.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3fe.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d-1f3ff.pngbin1384 -> 0 bytes
-rw-r--r--images/emoji/1f91d.pngbin1369 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fb.pngbin1047 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fc.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fd.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3fe.pngbin1046 -> 0 bytes
-rw-r--r--images/emoji/1f91e-1f3ff.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f91e.pngbin1050 -> 0 bytes
-rw-r--r--images/emoji/1f920.pngbin1361 -> 0 bytes
-rw-r--r--images/emoji/1f921.pngbin1820 -> 0 bytes
-rw-r--r--images/emoji/1f922.pngbin965 -> 0 bytes
-rw-r--r--images/emoji/1f923.pngbin1760 -> 0 bytes
-rw-r--r--images/emoji/1f924.pngbin1049 -> 0 bytes
-rw-r--r--images/emoji/1f925.pngbin1103 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fb.pngbin1563 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fc.pngbin1548 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fd.pngbin1550 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3fe.pngbin1553 -> 0 bytes
-rw-r--r--images/emoji/1f926-1f3ff.pngbin1532 -> 0 bytes
-rw-r--r--images/emoji/1f926.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f927.pngbin1292 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fb.pngbin1255 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fc.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fd.pngbin1237 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3fe.pngbin1246 -> 0 bytes
-rw-r--r--images/emoji/1f930-1f3ff.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f930.pngbin1252 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fb.pngbin1166 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fc.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fd.pngbin1154 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3fe.pngbin1153 -> 0 bytes
-rw-r--r--images/emoji/1f933-1f3ff.pngbin1148 -> 0 bytes
-rw-r--r--images/emoji/1f933.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fb.pngbin1622 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fc.pngbin1621 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fd.pngbin1623 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3fe.pngbin1619 -> 0 bytes
-rw-r--r--images/emoji/1f934-1f3ff.pngbin1616 -> 0 bytes
-rw-r--r--images/emoji/1f934.pngbin1616 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fb.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fc.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fd.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3fe.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f935-1f3ff.pngbin1302 -> 0 bytes
-rw-r--r--images/emoji/1f935.pngbin1307 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fb.pngbin1999 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fc.pngbin2006 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fd.pngbin2018 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3fe.pngbin2016 -> 0 bytes
-rw-r--r--images/emoji/1f936-1f3ff.pngbin2016 -> 0 bytes
-rw-r--r--images/emoji/1f936.pngbin2206 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fb.pngbin1676 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fc.pngbin1675 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fd.pngbin1679 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3fe.pngbin1641 -> 0 bytes
-rw-r--r--images/emoji/1f937-1f3ff.pngbin1635 -> 0 bytes
-rw-r--r--images/emoji/1f937.pngbin1671 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fb.pngbin1234 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fc.pngbin1235 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fd.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3fe.pngbin1227 -> 0 bytes
-rw-r--r--images/emoji/1f938-1f3ff.pngbin1214 -> 0 bytes
-rw-r--r--images/emoji/1f938.pngbin1233 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fb.pngbin1171 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fc.pngbin1160 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fd.pngbin1170 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3fe.pngbin1167 -> 0 bytes
-rw-r--r--images/emoji/1f939-1f3ff.pngbin1161 -> 0 bytes
-rw-r--r--images/emoji/1f939.pngbin1165 -> 0 bytes
-rw-r--r--images/emoji/1f93a.pngbin1871 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fb.pngbin2045 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fc.pngbin2049 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fd.pngbin2039 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3fe.pngbin2042 -> 0 bytes
-rw-r--r--images/emoji/1f93b-1f3ff.pngbin2035 -> 0 bytes
-rw-r--r--images/emoji/1f93b.pngbin2556 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fb.pngbin2563 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fc.pngbin2553 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fd.pngbin2541 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3fe.pngbin2553 -> 0 bytes
-rw-r--r--images/emoji/1f93c-1f3ff.pngbin2542 -> 0 bytes
-rw-r--r--images/emoji/1f93c.pngbin1575 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fb.pngbin1758 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fc.pngbin1757 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fd.pngbin1760 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3fe.pngbin1749 -> 0 bytes
-rw-r--r--images/emoji/1f93d-1f3ff.pngbin1749 -> 0 bytes
-rw-r--r--images/emoji/1f93d.pngbin1412 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fb.pngbin1646 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fc.pngbin1629 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fd.pngbin1639 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3fe.pngbin1634 -> 0 bytes
-rw-r--r--images/emoji/1f93e-1f3ff.pngbin1606 -> 0 bytes
-rw-r--r--images/emoji/1f93e.pngbin1755 -> 0 bytes
-rw-r--r--images/emoji/1f93f.pngbin1636 -> 0 bytes
-rw-r--r--images/emoji/1f940.pngbin1349 -> 0 bytes
-rw-r--r--images/emoji/1f942.pngbin1986 -> 0 bytes
-rw-r--r--images/emoji/1f943.pngbin2312 -> 0 bytes
-rw-r--r--images/emoji/1f944.pngbin700 -> 0 bytes
-rw-r--r--images/emoji/1f945.pngbin1244 -> 0 bytes
-rw-r--r--images/emoji/1f946.pngbin828 -> 0 bytes
-rw-r--r--images/emoji/1f947.pngbin1421 -> 0 bytes
-rw-r--r--images/emoji/1f948.pngbin1514 -> 0 bytes
-rw-r--r--images/emoji/1f949.pngbin1531 -> 0 bytes
-rw-r--r--images/emoji/1f950.pngbin1315 -> 0 bytes
-rw-r--r--images/emoji/1f951.pngbin1523 -> 0 bytes
-rw-r--r--images/emoji/1f952.pngbin1358 -> 0 bytes
-rw-r--r--images/emoji/1f953.pngbin2148 -> 0 bytes
-rw-r--r--images/emoji/1f954.pngbin1247 -> 0 bytes
-rw-r--r--images/emoji/1f955.pngbin1236 -> 0 bytes
-rw-r--r--images/emoji/1f956.pngbin1556 -> 0 bytes
-rw-r--r--images/emoji/1f957.pngbin2398 -> 0 bytes
-rw-r--r--images/emoji/1f958.pngbin1738 -> 0 bytes
-rw-r--r--images/emoji/1f959.pngbin2160 -> 0 bytes
-rw-r--r--images/emoji/1f95a.pngbin710 -> 0 bytes
-rw-r--r--images/emoji/1f95b.pngbin1224 -> 0 bytes
-rw-r--r--images/emoji/1f95c.pngbin3266 -> 0 bytes
-rw-r--r--images/emoji/1f95d.pngbin1896 -> 0 bytes
-rw-r--r--images/emoji/1f95e.pngbin3661 -> 0 bytes
-rw-r--r--images/emoji/1f960.pngbin2051 -> 0 bytes
-rw-r--r--images/emoji/1f961.pngbin1344 -> 0 bytes
-rw-r--r--images/emoji/1f980.pngbin1488 -> 0 bytes
-rw-r--r--images/emoji/1f981.pngbin1728 -> 0 bytes
-rw-r--r--images/emoji/1f982.pngbin1503 -> 0 bytes
-rw-r--r--images/emoji/1f983.pngbin1240 -> 0 bytes
-rw-r--r--images/emoji/1f984.pngbin2107 -> 0 bytes
-rw-r--r--images/emoji/1f985.pngbin2222 -> 0 bytes
-rw-r--r--images/emoji/1f986.pngbin1729 -> 0 bytes
-rw-r--r--images/emoji/1f987.pngbin1194 -> 0 bytes
-rw-r--r--images/emoji/1f988.pngbin1811 -> 0 bytes
-rw-r--r--images/emoji/1f989.pngbin2046 -> 0 bytes
-rw-r--r--images/emoji/1f98a.pngbin1557 -> 0 bytes
-rw-r--r--images/emoji/1f98b.pngbin1981 -> 0 bytes
-rw-r--r--images/emoji/1f98c.pngbin1608 -> 0 bytes
-rw-r--r--images/emoji/1f98d.pngbin1096 -> 0 bytes
-rw-r--r--images/emoji/1f98e.pngbin1709 -> 0 bytes
-rw-r--r--images/emoji/1f98f.pngbin1558 -> 0 bytes
-rw-r--r--images/emoji/1f990.pngbin1376 -> 0 bytes
-rw-r--r--images/emoji/1f991.pngbin1395 -> 0 bytes
-rw-r--r--images/emoji/1f9c0.pngbin1697 -> 0 bytes
-rw-r--r--images/emoji/203c.pngbin390 -> 0 bytes
-rw-r--r--images/emoji/2049.pngbin601 -> 0 bytes
-rw-r--r--images/emoji/2122.pngbin300 -> 0 bytes
-rw-r--r--images/emoji/2139.pngbin506 -> 0 bytes
-rw-r--r--images/emoji/2194.pngbin495 -> 0 bytes
-rw-r--r--images/emoji/2195.pngbin474 -> 0 bytes
-rw-r--r--images/emoji/2196.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/2197.pngbin524 -> 0 bytes
-rw-r--r--images/emoji/2198.pngbin526 -> 0 bytes
-rw-r--r--images/emoji/2199.pngbin520 -> 0 bytes
-rw-r--r--images/emoji/21a9.pngbin643 -> 0 bytes
-rw-r--r--images/emoji/21aa.pngbin644 -> 0 bytes
-rw-r--r--images/emoji/231a.pngbin785 -> 0 bytes
-rw-r--r--images/emoji/231b.pngbin800 -> 0 bytes
-rw-r--r--images/emoji/2328.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/23cf.pngbin548 -> 0 bytes
-rw-r--r--images/emoji/23e9.pngbin523 -> 0 bytes
-rw-r--r--images/emoji/23ea.pngbin523 -> 0 bytes
-rw-r--r--images/emoji/23eb.pngbin535 -> 0 bytes
-rw-r--r--images/emoji/23ec.pngbin543 -> 0 bytes
-rw-r--r--images/emoji/23ed.pngbin551 -> 0 bytes
-rw-r--r--images/emoji/23ee.pngbin549 -> 0 bytes
-rw-r--r--images/emoji/23ef.pngbin509 -> 0 bytes
-rw-r--r--images/emoji/23f0.pngbin1044 -> 0 bytes
-rw-r--r--images/emoji/23f1.pngbin1330 -> 0 bytes
-rw-r--r--images/emoji/23f2.pngbin1897 -> 0 bytes
-rw-r--r--images/emoji/23f3.pngbin847 -> 0 bytes
-rw-r--r--images/emoji/23f8.pngbin395 -> 0 bytes
-rw-r--r--images/emoji/23f9.pngbin385 -> 0 bytes
-rw-r--r--images/emoji/23fa.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/24c2.pngbin500 -> 0 bytes
-rw-r--r--images/emoji/25aa.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25ab.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25b6.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/25c0.pngbin429 -> 0 bytes
-rw-r--r--images/emoji/25fb.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25fc.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/25fd.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/25fe.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2600.pngbin746 -> 0 bytes
-rw-r--r--images/emoji/2601.pngbin626 -> 0 bytes
-rw-r--r--images/emoji/2602.pngbin897 -> 0 bytes
-rw-r--r--images/emoji/2603.pngbin2176 -> 0 bytes
-rw-r--r--images/emoji/2604.pngbin1821 -> 0 bytes
-rw-r--r--images/emoji/260e.pngbin1761 -> 0 bytes
-rw-r--r--images/emoji/2611.pngbin639 -> 0 bytes
-rw-r--r--images/emoji/2614.pngbin1229 -> 0 bytes
-rw-r--r--images/emoji/2615.pngbin1679 -> 0 bytes
-rw-r--r--images/emoji/2618.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fb.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fc.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fd.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3fe.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d-1f3ff.pngbin820 -> 0 bytes
-rw-r--r--images/emoji/261d.pngbin819 -> 0 bytes
-rw-r--r--images/emoji/2620.pngbin726 -> 0 bytes
-rw-r--r--images/emoji/2622.pngbin858 -> 0 bytes
-rw-r--r--images/emoji/2623.pngbin794 -> 0 bytes
-rw-r--r--images/emoji/2626.pngbin239 -> 0 bytes
-rw-r--r--images/emoji/262a.pngbin490 -> 0 bytes
-rw-r--r--images/emoji/262e.pngbin933 -> 0 bytes
-rw-r--r--images/emoji/262f.pngbin776 -> 0 bytes
-rw-r--r--images/emoji/2638.pngbin666 -> 0 bytes
-rw-r--r--images/emoji/2639.pngbin589 -> 0 bytes
-rw-r--r--images/emoji/263a.pngbin636 -> 0 bytes
-rw-r--r--images/emoji/2648.pngbin711 -> 0 bytes
-rw-r--r--images/emoji/2649.pngbin701 -> 0 bytes
-rw-r--r--images/emoji/264a.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/264b.pngbin729 -> 0 bytes
-rw-r--r--images/emoji/264c.pngbin745 -> 0 bytes
-rw-r--r--images/emoji/264d.pngbin618 -> 0 bytes
-rw-r--r--images/emoji/264e.pngbin657 -> 0 bytes
-rw-r--r--images/emoji/264f.pngbin612 -> 0 bytes
-rw-r--r--images/emoji/2650.pngbin602 -> 0 bytes
-rw-r--r--images/emoji/2651.pngbin688 -> 0 bytes
-rw-r--r--images/emoji/2652.pngbin648 -> 0 bytes
-rw-r--r--images/emoji/2653.pngbin678 -> 0 bytes
-rw-r--r--images/emoji/2660.pngbin454 -> 0 bytes
-rw-r--r--images/emoji/2663.pngbin458 -> 0 bytes
-rw-r--r--images/emoji/2666.pngbin247 -> 0 bytes
-rw-r--r--images/emoji/2668.pngbin733 -> 0 bytes
-rw-r--r--images/emoji/267b.pngbin914 -> 0 bytes
-rw-r--r--images/emoji/267f.pngbin683 -> 0 bytes
-rw-r--r--images/emoji/2692.pngbin1068 -> 0 bytes
-rw-r--r--images/emoji/2693.pngbin779 -> 0 bytes
-rw-r--r--images/emoji/2694.pngbin1591 -> 0 bytes
-rw-r--r--images/emoji/2696.pngbin1181 -> 0 bytes
-rw-r--r--images/emoji/2697.pngbin953 -> 0 bytes
-rw-r--r--images/emoji/2699.pngbin747 -> 0 bytes
-rw-r--r--images/emoji/269b.pngbin912 -> 0 bytes
-rw-r--r--images/emoji/269c.pngbin632 -> 0 bytes
-rw-r--r--images/emoji/26a0.pngbin565 -> 0 bytes
-rw-r--r--images/emoji/26a1.pngbin413 -> 0 bytes
-rw-r--r--images/emoji/26aa.pngbin351 -> 0 bytes
-rw-r--r--images/emoji/26ab.pngbin374 -> 0 bytes
-rw-r--r--images/emoji/26b0.pngbin2195 -> 0 bytes
-rw-r--r--images/emoji/26b1.pngbin742 -> 0 bytes
-rw-r--r--images/emoji/26bd.pngbin1034 -> 0 bytes
-rw-r--r--images/emoji/26be.pngbin1185 -> 0 bytes
-rw-r--r--images/emoji/26c4.pngbin1481 -> 0 bytes
-rw-r--r--images/emoji/26c5.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/26c8.pngbin1020 -> 0 bytes
-rw-r--r--images/emoji/26ce.pngbin723 -> 0 bytes
-rw-r--r--images/emoji/26cf.pngbin1023 -> 0 bytes
-rw-r--r--images/emoji/26d1.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/26d3.pngbin708 -> 0 bytes
-rw-r--r--images/emoji/26d4.pngbin377 -> 0 bytes
-rw-r--r--images/emoji/26e9.pngbin579 -> 0 bytes
-rw-r--r--images/emoji/26ea.pngbin1302 -> 0 bytes
-rw-r--r--images/emoji/26f0.pngbin1409 -> 0 bytes
-rw-r--r--images/emoji/26f1.pngbin1488 -> 0 bytes
-rw-r--r--images/emoji/26f2.pngbin1768 -> 0 bytes
-rw-r--r--images/emoji/26f3.pngbin823 -> 0 bytes
-rw-r--r--images/emoji/26f4.pngbin528 -> 0 bytes
-rw-r--r--images/emoji/26f5.pngbin1274 -> 0 bytes
-rw-r--r--images/emoji/26f7.pngbin1539 -> 0 bytes
-rw-r--r--images/emoji/26f8.pngbin1576 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fb.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fc.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fd.pngbin1492 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3fe.pngbin1494 -> 0 bytes
-rw-r--r--images/emoji/26f9-1f3ff.pngbin1479 -> 0 bytes
-rw-r--r--images/emoji/26f9.pngbin1493 -> 0 bytes
-rw-r--r--images/emoji/26fa.pngbin1684 -> 0 bytes
-rw-r--r--images/emoji/26fd.pngbin864 -> 0 bytes
-rw-r--r--images/emoji/2702.pngbin937 -> 0 bytes
-rw-r--r--images/emoji/2705.pngbin547 -> 0 bytes
-rw-r--r--images/emoji/2708.pngbin1152 -> 0 bytes
-rw-r--r--images/emoji/2709.pngbin916 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fb.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fc.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fd.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3fe.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a-1f3ff.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270a.pngbin1014 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fb.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fc.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fd.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3fe.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b-1f3ff.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270b.pngbin791 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fb.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fc.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fd.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3fe.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c-1f3ff.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270c.pngbin1009 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fb.pngbin988 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fc.pngbin987 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fd.pngbin977 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3fe.pngbin973 -> 0 bytes
-rw-r--r--images/emoji/270d-1f3ff.pngbin970 -> 0 bytes
-rw-r--r--images/emoji/270d.pngbin1001 -> 0 bytes
-rw-r--r--images/emoji/270f.pngbin654 -> 0 bytes
-rw-r--r--images/emoji/2712.pngbin620 -> 0 bytes
-rw-r--r--images/emoji/2714.pngbin438 -> 0 bytes
-rw-r--r--images/emoji/2716.pngbin298 -> 0 bytes
-rw-r--r--images/emoji/271d.pngbin408 -> 0 bytes
-rw-r--r--images/emoji/2721.pngbin491 -> 0 bytes
-rw-r--r--images/emoji/2728.pngbin651 -> 0 bytes
-rw-r--r--images/emoji/2733.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/2734.pngbin493 -> 0 bytes
-rw-r--r--images/emoji/2744.pngbin691 -> 0 bytes
-rw-r--r--images/emoji/2747.pngbin663 -> 0 bytes
-rw-r--r--images/emoji/274c.pngbin298 -> 0 bytes
-rw-r--r--images/emoji/274e.pngbin370 -> 0 bytes
-rw-r--r--images/emoji/2753.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/2754.pngbin449 -> 0 bytes
-rw-r--r--images/emoji/2755.pngbin354 -> 0 bytes
-rw-r--r--images/emoji/2757.pngbin354 -> 0 bytes
-rw-r--r--images/emoji/2763.pngbin471 -> 0 bytes
-rw-r--r--images/emoji/2764.pngbin435 -> 0 bytes
-rw-r--r--images/emoji/2795.pngbin115 -> 0 bytes
-rw-r--r--images/emoji/2796.pngbin108 -> 0 bytes
-rw-r--r--images/emoji/2797.pngbin204 -> 0 bytes
-rw-r--r--images/emoji/27a1.pngbin468 -> 0 bytes
-rw-r--r--images/emoji/27b0.pngbin545 -> 0 bytes
-rw-r--r--images/emoji/27bf.pngbin550 -> 0 bytes
-rw-r--r--images/emoji/2934.pngbin559 -> 0 bytes
-rw-r--r--images/emoji/2935.pngbin563 -> 0 bytes
-rw-r--r--images/emoji/2b05.pngbin471 -> 0 bytes
-rw-r--r--images/emoji/2b06.pngbin507 -> 0 bytes
-rw-r--r--images/emoji/2b07.pngbin512 -> 0 bytes
-rw-r--r--images/emoji/2b1b.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2b1c.pngbin110 -> 0 bytes
-rw-r--r--images/emoji/2b50.pngbin456 -> 0 bytes
-rw-r--r--images/emoji/2b55.pngbin475 -> 0 bytes
-rw-r--r--images/emoji/3030.pngbin359 -> 0 bytes
-rw-r--r--images/emoji/303d.pngbin521 -> 0 bytes
-rw-r--r--images/emoji/3297.pngbin729 -> 0 bytes
-rw-r--r--images/emoji/3299.pngbin857 -> 0 bytes
-rw-r--r--images/emoji/README2
-rw-r--r--include/attach.php167
-rw-r--r--include/channel.php310
-rw-r--r--include/connections.php244
-rw-r--r--include/conversation.php202
-rw-r--r--include/crypto.php44
-rwxr-xr-xinclude/dba/dba_driver.php8
-rw-r--r--include/dir_fns.php31
-rw-r--r--include/environment.php2
-rw-r--r--include/event.php151
-rw-r--r--include/feedutils.php8
-rw-r--r--include/help.php16
-rw-r--r--include/hubloc.php129
-rw-r--r--include/import.php628
-rwxr-xr-xinclude/items.php193
-rw-r--r--include/markdown.php51
-rw-r--r--include/message.php2
-rw-r--r--include/nav.php75
-rw-r--r--include/network.php31
-rw-r--r--include/permissions.php7
-rw-r--r--include/photo/photo_driver.php89
-rw-r--r--include/photos.php80
-rwxr-xr-xinclude/plugin.php36
-rw-r--r--include/probe.php99
-rw-r--r--include/queue_fn.php12
-rw-r--r--include/text.php136
-rw-r--r--include/widgets.php1735
-rw-r--r--include/zot.php95
-rw-r--r--install/update.php3
-rw-r--r--library/HTMLPurifier.composer.php4
-rw-r--r--library/HTMLPurifier.includes.php229
-rw-r--r--library/HTMLPurifier.php292
-rw-r--r--library/HTMLPurifier.safe-includes.php223
-rw-r--r--library/HTMLPurifier/Arborize.php71
-rw-r--r--library/HTMLPurifier/AttrCollections.php143
-rw-r--r--library/HTMLPurifier/AttrDef.php138
-rw-r--r--library/HTMLPurifier/AttrDef/CSS.php106
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/Color.php105
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/Multiple.php71
-rw-r--r--library/HTMLPurifier/AttrDef/CSS/URI.php74
-rw-r--r--library/HTMLPurifier/AttrDef/HTML/Bool.php51
-rw-r--r--library/HTMLPurifier/AttrDef/HTML/ID.php105
-rw-r--r--library/HTMLPurifier/AttrDef/URI/Host.php128
-rw-r--r--library/HTMLPurifier/AttrTransform/ImgRequired.php48
-rw-r--r--library/HTMLPurifier/CSSDefinition.php474
-rw-r--r--library/HTMLPurifier/ChildDef/List.php86
-rw-r--r--library/HTMLPurifier/ChildDef/Table.php224
-rw-r--r--library/HTMLPurifier/Config.php911
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema.serbin15000 -> 0 bytes
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt11
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt9
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt17
-rw-r--r--library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt10
-rw-r--r--library/HTMLPurifier/DefinitionCache.php129
-rw-r--r--library/HTMLPurifier/DefinitionCache/Serializer.php285
-rw-r--r--library/HTMLPurifier/Encoder.php611
-rw-r--r--library/HTMLPurifier/EntityParser.php153
-rw-r--r--library/HTMLPurifier/Filter/ExtractStyleBlocks.php338
-rw-r--r--library/HTMLPurifier/Filter/YouTube.php65
-rw-r--r--library/HTMLPurifier/HTMLModuleManager.php459
-rw-r--r--library/HTMLPurifier/Injector/Linkify.php59
-rw-r--r--library/HTMLPurifier/Injector/RemoveEmpty.php101
-rw-r--r--library/HTMLPurifier/Injector/SafeObject.php121
-rw-r--r--library/HTMLPurifier/Lexer.php357
-rw-r--r--library/HTMLPurifier/Lexer/DOMLex.php280
-rw-r--r--library/HTMLPurifier/Lexer/DirectLex.php539
-rw-r--r--library/HTMLPurifier/Lexer/PH5P.php4788
-rw-r--r--library/HTMLPurifier/Printer/ConfigForm.php447
-rw-r--r--library/HTMLPurifier/Strategy/MakeWellFormed.php600
-rw-r--r--library/HTMLPurifier/Token.php100
-rw-r--r--library/HTMLPurifier/URI.php314
-rw-r--r--library/HTMLPurifier/URIScheme/data.php127
-rw-r--r--library/bootstrap/css/bootstrap-grid.css2321
-rw-r--r--library/bootstrap/css/bootstrap-grid.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css1
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css334
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css1
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-theme.css587
-rw-r--r--library/bootstrap/css/bootstrap-theme.css.map1
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css6
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css.map1
-rw-r--r--library/bootstrap/css/bootstrap.css12492
-rw-r--r--library/bootstrap/css/bootstrap.css.map2
-rw-r--r--library/bootstrap/css/bootstrap.min.css8
-rw-r--r--library/bootstrap/css/bootstrap.min.css.map2
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.eotbin20127 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.svg288
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.ttfbin45404 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woffbin23424 -> 0 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woff2bin18028 -> 0 bytes
-rw-r--r--library/bootstrap/js/bootstrap.js4753
-rw-r--r--library/bootstrap/js/bootstrap.min.js10
-rw-r--r--library/emoji.json1
-rw-r--r--library/fullcalendar/CHANGELOG.txt21
-rw-r--r--library/fullcalendar/fullcalendar.css6
-rw-r--r--library/fullcalendar/fullcalendar.js1109
-rw-r--r--library/fullcalendar/fullcalendar.min.css6
-rw-r--r--library/fullcalendar/fullcalendar.min.js16
-rw-r--r--library/fullcalendar/fullcalendar.print.css6
-rw-r--r--library/fullcalendar/fullcalendar.print.min.css6
-rw-r--r--library/fullcalendar/gcal.js6
-rw-r--r--library/fullcalendar/gcal.min.js6
-rw-r--r--library/fullcalendar/locale-all.js8
-rw-r--r--library/htmlpurifier-4.6.0-lite/INSTALL374
-rw-r--r--library/htmlpurifier-4.6.0-lite/NEWS1078
-rw-r--r--library/jquery-textcomplete/LICENSE21
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.js157
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.min.js4
-rw-r--r--library/jquery-textcomplete/jquery.textcomplete.min.map1
-rw-r--r--library/markdown.php2932
-rw-r--r--library/markdownify/TODO29
-rw-r--r--library/markdownify/example.php51
-rw-r--r--library/markdownify/markdownify.php1197
-rwxr-xr-xlibrary/markdownify/markdownify_cli.php33
-rw-r--r--library/markdownify/markdownify_extra.php489
-rw-r--r--library/markdownify/parsehtml/parsehtml.php618
-rw-r--r--library/simplepie/demo/cli_test.php23
-rw-r--r--library/simplepie/demo/for_the_demo/alternate_favicon.pngbin28621 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/background_blockquote.pngbin27353 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/background_menuitem.gifbin533 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/background_menuitem_off.gifbin533 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/background_menuitem_shadow.gifbin250 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/alternate.pngbin28621 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/blinklist.pngbin4377 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/blogmarks.pngbin3823 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/delicious.pngbin3739 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/digg.pngbin4004 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/magnolia.pngbin4574 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/myweb2.pngbin4010 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/newsvine.pngbin3804 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/reddit.pngbin4239 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/segnalo.pngbin4116 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/simpy.pngbin4256 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/spurl.pngbin3970 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/technorati.pngbin4087 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/favicons/wists.pngbin3974 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/feed.pngbin715 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/logo_simplepie_demo.pngbin3047 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/lucida-grande-bold.swfbin21159 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/mediaplayer.swfbin32008 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/mediaplayer_readme.htm5
-rw-r--r--library/simplepie/demo/for_the_demo/mini_podcast.pngbin1202 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/place_audio.pngbin851 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/place_video.pngbin36713 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/sIFR-print.css35
-rw-r--r--library/simplepie/demo/for_the_demo/sIFR-screen.css39
-rw-r--r--library/simplepie/demo/for_the_demo/sifr-config.js40
-rw-r--r--library/simplepie/demo/for_the_demo/sifr.js19
-rw-r--r--library/simplepie/demo/for_the_demo/simplepie.css397
-rw-r--r--library/simplepie/demo/for_the_demo/sleight.js31
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/place_audio_fireworksfile.pngbin39177 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/place_video_fireworksfile.pngbin115826 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/sIFR-r245/SifrStyleSheet.as71
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/sIFR-r245/_README_.txt12
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/sIFR-r245/options.as12
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sIFR.as359
-rw-r--r--library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sifr.flabin47104 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/top_gradient.gifbin1378 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/verdana.swfbin28575 -> 0 bytes
-rw-r--r--library/simplepie/demo/for_the_demo/yanone-kaffeesatz-bold.swfbin76780 -> 0 bytes
-rw-r--r--library/simplepie/demo/handler_image.php6
-rw-r--r--library/simplepie/demo/index.php295
-rw-r--r--library/simplepie/demo/minimalistic.php137
-rw-r--r--library/simplepie/demo/multifeeds.php108
-rw-r--r--library/simplepie/demo/test.php62
l---------tests/phpunit-mariadb.xml1
-rw-r--r--tests/phpunit-mysql.xml37
-rw-r--r--tests/phpunit-pgsql.xml34
-rwxr-xr-xtests/travis/gen_apidocs.sh69
-rwxr-xr-xtests/travis/prepare.sh35
-rwxr-xr-xtests/travis/prepare_mysql.sh39
-rwxr-xr-xtests/travis/prepare_pgsql.sh37
-rw-r--r--tests/unit/Lib/PermissionDescriptionTest.php129
-rw-r--r--tests/unit/TextTest.php33
-rw-r--r--tests/unit/includes/TextTest.php84
-rw-r--r--tests/unit/template_test.php6
-rw-r--r--util/Doxyfile9
-rw-r--r--util/db_update.php3
-rwxr-xr-xutil/fresh2
-rw-r--r--util/hmessages.po13355
-rwxr-xr-xutil/pconfig6
-rw-r--r--util/typo.php25
-rw-r--r--vendor/autoload.php2
-rw-r--r--vendor/bshaffer/oauth2-server-php/CHANGELOG.md182
-rw-r--r--vendor/bshaffer/oauth2-server-php/LICENSE21
-rw-r--r--vendor/bshaffer/oauth2-server-php/README.md8
-rw-r--r--vendor/bshaffer/oauth2-server-php/composer.json34
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php48
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php15
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php123
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php393
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php43
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php111
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php26
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php295
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php32
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php11
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php47
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php173
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php100
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php67
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php20
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php226
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php111
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php83
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php106
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php10
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php58
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php23
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php33
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php60
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php27
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php24
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php9
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php124
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php29
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php27
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php9
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php37
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php38
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php213
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php369
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php24
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php194
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php34
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php100
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php30
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php124
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php8
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php103
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php879
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php64
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php86
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php480
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php49
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php66
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php331
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php540
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php88
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php14
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php74
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php381
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php392
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php380
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php553
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php321
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php82
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php46
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php52
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php130
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php22
-rw-r--r--vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php21
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php16
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php492
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php176
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php289
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php223
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php159
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php143
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php360
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php204
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php172
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php182
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php44
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php57
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php182
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php184
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php91
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php95
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php98
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php17
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php107
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php160
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php42
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php684
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php102
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php106
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php28
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php110
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php25
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php39
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php29
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php41
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php53
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php40
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php58
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/bootstrap.php12
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/cleanup.php15
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa15
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub16
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/config/storage.json188
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php61
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php36
-rwxr-xr-xvendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php967
-rw-r--r--vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php32
-rw-r--r--vendor/composer/ClassLoader.php46
-rw-r--r--vendor/composer/LICENSE2
-rw-r--r--vendor/composer/autoload_classmap.php319
-rw-r--r--vendor/composer/autoload_files.php1
-rw-r--r--vendor/composer/autoload_namespaces.php3
-rw-r--r--vendor/composer/autoload_psr4.php2
-rw-r--r--vendor/composer/autoload_real.php2
-rw-r--r--vendor/composer/autoload_static.php363
-rw-r--r--vendor/composer/installed.json232
-rw-r--r--vendor/ezyang/htmlpurifier/CREDITS (renamed from library/htmlpurifier-4.6.0-lite/CREDITS)0
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL373
-rw-r--r--vendor/ezyang/htmlpurifier/INSTALL.fr.utf860
-rw-r--r--vendor/ezyang/htmlpurifier/LICENSE (renamed from library/htmlpurifier-4.6.0-lite/LICENSE)0
-rw-r--r--vendor/ezyang/htmlpurifier/NEWS1168
-rw-r--r--vendor/ezyang/htmlpurifier/README.md29
-rw-r--r--vendor/ezyang/htmlpurifier/TODO150
-rw-r--r--vendor/ezyang/htmlpurifier/VERSION1
-rw-r--r--vendor/ezyang/htmlpurifier/WHATSNEW12
-rw-r--r--vendor/ezyang/htmlpurifier/WYSIWYG20
-rw-r--r--vendor/ezyang/htmlpurifier/composer.json25
-rw-r--r--vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php91
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools.php164
-rw-r--r--vendor/ezyang/htmlpurifier/extras/FSTools/File.php141
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php11
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php26
-rw-r--r--vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php31
-rw-r--r--vendor/ezyang/htmlpurifier/extras/README32
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php (renamed from library/HTMLPurifier.auto.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php (renamed from library/HTMLPurifier.autoload.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php4
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php (renamed from library/HTMLPurifier.func.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php234
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php (renamed from library/HTMLPurifier.kses.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php (renamed from library/HTMLPurifier.path.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.php292
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php228
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php148
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php144
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php136
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php (renamed from library/HTMLPurifier/AttrDef/CSS/AlphaValue.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php (renamed from library/HTMLPurifier/AttrDef/CSS/Background.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php (renamed from library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php (renamed from library/HTMLPurifier/AttrDef/CSS/Border.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php161
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php (renamed from library/HTMLPurifier/AttrDef/CSS/Composite.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php (renamed from library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php (renamed from library/HTMLPurifier/AttrDef/CSS/Filter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php (renamed from library/HTMLPurifier/AttrDef/CSS/Font.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php (renamed from library/HTMLPurifier/AttrDef/CSS/FontFamily.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php (renamed from library/HTMLPurifier/AttrDef/CSS/Ident.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php (renamed from library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php (renamed from library/HTMLPurifier/AttrDef/CSS/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php (renamed from library/HTMLPurifier/AttrDef/CSS/ListStyle.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php71
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php (renamed from library/HTMLPurifier/AttrDef/CSS/Number.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php (renamed from library/HTMLPurifier/AttrDef/CSS/Percentage.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php (renamed from library/HTMLPurifier/AttrDef/CSS/TextDecoration.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php77
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php (renamed from library/HTMLPurifier/AttrDef/Clone.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php (renamed from library/HTMLPurifier/AttrDef/Enum.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php48
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php (renamed from library/HTMLPurifier/AttrDef/HTML/Class.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php (renamed from library/HTMLPurifier/AttrDef/HTML/Color.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php (renamed from library/HTMLPurifier/AttrDef/HTML/FrameTarget.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php113
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php (renamed from library/HTMLPurifier/AttrDef/HTML/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php (renamed from library/HTMLPurifier/AttrDef/HTML/LinkTypes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php (renamed from library/HTMLPurifier/AttrDef/HTML/MultiLength.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php (renamed from library/HTMLPurifier/AttrDef/HTML/Nmtokens.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php (renamed from library/HTMLPurifier/AttrDef/HTML/Pixels.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php (renamed from library/HTMLPurifier/AttrDef/Integer.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php (renamed from library/HTMLPurifier/AttrDef/Lang.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php (renamed from library/HTMLPurifier/AttrDef/Switch.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php (renamed from library/HTMLPurifier/AttrDef/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php (renamed from library/HTMLPurifier/AttrDef/URI.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php (renamed from library/HTMLPurifier/AttrDef/URI/Email.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php (renamed from library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php138
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php (renamed from library/HTMLPurifier/AttrDef/URI/IPv4.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php (renamed from library/HTMLPurifier/AttrDef/URI/IPv6.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php (renamed from library/HTMLPurifier/AttrTransform.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php (renamed from library/HTMLPurifier/AttrTransform/Background.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php (renamed from library/HTMLPurifier/AttrTransform/BdoDir.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php (renamed from library/HTMLPurifier/AttrTransform/BgColor.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php (renamed from library/HTMLPurifier/AttrTransform/BoolToCSS.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php (renamed from library/HTMLPurifier/AttrTransform/Border.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php (renamed from library/HTMLPurifier/AttrTransform/EnumToCSS.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php47
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php (renamed from library/HTMLPurifier/AttrTransform/ImgSpace.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php (renamed from library/HTMLPurifier/AttrTransform/Input.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php (renamed from library/HTMLPurifier/AttrTransform/Lang.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php (renamed from library/HTMLPurifier/AttrTransform/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php (renamed from library/HTMLPurifier/AttrTransform/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php (renamed from library/HTMLPurifier/AttrTransform/NameSync.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php (renamed from library/HTMLPurifier/AttrTransform/Nofollow.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php (renamed from library/HTMLPurifier/AttrTransform/SafeEmbed.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php (renamed from library/HTMLPurifier/AttrTransform/SafeObject.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php (renamed from library/HTMLPurifier/AttrTransform/SafeParam.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php (renamed from library/HTMLPurifier/AttrTransform/ScriptRequired.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php (renamed from library/HTMLPurifier/AttrTransform/TargetBlank.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php37
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php37
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php (renamed from library/HTMLPurifier/AttrTransform/Textarea.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php (renamed from library/HTMLPurifier/AttrTypes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php (renamed from library/HTMLPurifier/AttrValidator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php (renamed from library/HTMLPurifier/Bootstrap.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php491
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php (renamed from library/HTMLPurifier/ChildDef.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php (renamed from library/HTMLPurifier/ChildDef/Chameleon.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php (renamed from library/HTMLPurifier/ChildDef/Custom.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php (renamed from library/HTMLPurifier/ChildDef/Empty.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php92
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php (renamed from library/HTMLPurifier/ChildDef/Optional.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php (renamed from library/HTMLPurifier/ChildDef/Required.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php (renamed from library/HTMLPurifier/ChildDef/StrictBlockquote.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php224
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php920
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php (renamed from library/HTMLPurifier/ConfigSchema.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php (renamed from library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php (renamed from library/HTMLPurifier/ConfigSchema/Builder/Xml.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php (renamed from library/HTMLPurifier/ConfigSchema/Exception.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange/Directive.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php (renamed from library/HTMLPurifier/ConfigSchema/Interchange/Id.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php (renamed from library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php (renamed from library/HTMLPurifier/ConfigSchema/Validator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php (renamed from library/HTMLPurifier/ConfigSchema/ValidatorAtom.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.serbin0 -> 15923 bytes
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt11
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt16
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt36
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt10
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt9
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt15
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt (renamed from library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini (renamed from library/HTMLPurifier/ConfigSchema/schema/info.ini)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php (renamed from library/HTMLPurifier/ContentSets.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php (renamed from library/HTMLPurifier/Context.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php (renamed from library/HTMLPurifier/Definition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php129
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Memory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in (renamed from library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php (renamed from library/HTMLPurifier/DefinitionCache/Null.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php306
-rwxr-xr-x[-rw-r--r--]vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README (renamed from library/HTMLPurifier/DefinitionCache/Serializer/README)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php (renamed from library/HTMLPurifier/DefinitionCacheFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php (renamed from library/HTMLPurifier/Doctype.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php (renamed from library/HTMLPurifier/DoctypeRegistry.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php (renamed from library/HTMLPurifier/ElementDef.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php617
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php (renamed from library/HTMLPurifier/EntityLookup.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser (renamed from library/HTMLPurifier/EntityLookup/entities.ser)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php285
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php (renamed from library/HTMLPurifier/ErrorCollector.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php (renamed from library/HTMLPurifier/ErrorStruct.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php (renamed from library/HTMLPurifier/Exception.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php (renamed from library/HTMLPurifier/Filter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php341
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php65
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php (renamed from library/HTMLPurifier/Generator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php (renamed from library/HTMLPurifier/HTMLDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php (renamed from library/HTMLPurifier/HTMLModule.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php (renamed from library/HTMLPurifier/HTMLModule/Bdo.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/CommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php (renamed from library/HTMLPurifier/HTMLModule/Edit.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php (renamed from library/HTMLPurifier/HTMLModule/Forms.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php (renamed from library/HTMLPurifier/HTMLModule/Hypertext.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php (renamed from library/HTMLPurifier/HTMLModule/Iframe.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php (renamed from library/HTMLPurifier/HTMLModule/Image.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php (renamed from library/HTMLPurifier/HTMLModule/Legacy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php (renamed from library/HTMLPurifier/HTMLModule/List.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php (renamed from library/HTMLPurifier/HTMLModule/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php (renamed from library/HTMLPurifier/HTMLModule/Nofollow.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php (renamed from library/HTMLPurifier/HTMLModule/Object.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php (renamed from library/HTMLPurifier/HTMLModule/Presentation.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php (renamed from library/HTMLPurifier/HTMLModule/Proprietary.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php (renamed from library/HTMLPurifier/HTMLModule/Ruby.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php (renamed from library/HTMLPurifier/HTMLModule/SafeEmbed.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php (renamed from library/HTMLPurifier/HTMLModule/SafeObject.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php (renamed from library/HTMLPurifier/HTMLModule/SafeScripting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php (renamed from library/HTMLPurifier/HTMLModule/Scripting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php (renamed from library/HTMLPurifier/HTMLModule/StyleAttribute.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php (renamed from library/HTMLPurifier/HTMLModule/Tables.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php (renamed from library/HTMLPurifier/HTMLModule/Target.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php (renamed from library/HTMLPurifier/HTMLModule/TargetBlank.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php21
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php (renamed from library/HTMLPurifier/HTMLModule/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php (renamed from library/HTMLPurifier/HTMLModule/Tidy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Name.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Strict.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/Transitional.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/XHTML.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php (renamed from library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php (renamed from library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php467
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php (renamed from library/HTMLPurifier/IDAccumulator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php (renamed from library/HTMLPurifier/Injector.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php (renamed from library/HTMLPurifier/Injector/AutoParagraph.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php (renamed from library/HTMLPurifier/Injector/DisplayLinkURI.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php64
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php (renamed from library/HTMLPurifier/Injector/PurifierLinkify.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php112
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php (renamed from library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php124
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php (renamed from library/HTMLPurifier/Language.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php (renamed from library/HTMLPurifier/Language/classes/en-x-test.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php (renamed from library/HTMLPurifier/Language/messages/en-x-test.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php (renamed from library/HTMLPurifier/Language/messages/en-x-testmini.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php (renamed from library/HTMLPurifier/Language/messages/en.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php (renamed from library/HTMLPurifier/LanguageFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php (renamed from library/HTMLPurifier/Length.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php382
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php291
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php539
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php4788
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php (renamed from library/HTMLPurifier/Node.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php (renamed from library/HTMLPurifier/Node/Comment.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php (renamed from library/HTMLPurifier/Node/Element.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php (renamed from library/HTMLPurifier/Node/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php (renamed from library/HTMLPurifier/PercentEncoder.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php (renamed from library/HTMLPurifier/Printer.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php (renamed from library/HTMLPurifier/Printer/CSSDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css (renamed from library/HTMLPurifier/Printer/ConfigForm.css)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js (renamed from library/HTMLPurifier/Printer/ConfigForm.js)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php451
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php (renamed from library/HTMLPurifier/Printer/HTMLDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php (renamed from library/HTMLPurifier/PropertyList.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php (renamed from library/HTMLPurifier/PropertyListIterator.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php (renamed from library/HTMLPurifier/Queue.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php (renamed from library/HTMLPurifier/Strategy.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php (renamed from library/HTMLPurifier/Strategy/Composite.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php (renamed from library/HTMLPurifier/Strategy/Core.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php (renamed from library/HTMLPurifier/Strategy/FixNesting.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php659
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php (renamed from library/HTMLPurifier/Strategy/RemoveForeignElements.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php (renamed from library/HTMLPurifier/Strategy/ValidateAttributes.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php (renamed from library/HTMLPurifier/StringHash.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php (renamed from library/HTMLPurifier/StringHashParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php (renamed from library/HTMLPurifier/TagTransform.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php (renamed from library/HTMLPurifier/TagTransform/Font.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php (renamed from library/HTMLPurifier/TagTransform/Simple.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php100
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php (renamed from library/HTMLPurifier/Token/Comment.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php (renamed from library/HTMLPurifier/Token/Empty.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php (renamed from library/HTMLPurifier/Token/End.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php (renamed from library/HTMLPurifier/Token/Start.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php (renamed from library/HTMLPurifier/Token/Tag.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php (renamed from library/HTMLPurifier/Token/Text.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php (renamed from library/HTMLPurifier/TokenFactory.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php316
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php (renamed from library/HTMLPurifier/URIDefinition.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php (renamed from library/HTMLPurifier/URIFilter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php (renamed from library/HTMLPurifier/URIFilter/DisableExternal.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php (renamed from library/HTMLPurifier/URIFilter/DisableExternalResources.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php (renamed from library/HTMLPurifier/URIFilter/DisableResources.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php (renamed from library/HTMLPurifier/URIFilter/HostBlacklist.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php (renamed from library/HTMLPurifier/URIFilter/MakeAbsolute.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php (renamed from library/HTMLPurifier/URIFilter/Munge.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php (renamed from library/HTMLPurifier/URIFilter/SafeIframe.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php (renamed from library/HTMLPurifier/URIParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php (renamed from library/HTMLPurifier/URIScheme.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php136
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php (renamed from library/HTMLPurifier/URIScheme/file.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php (renamed from library/HTMLPurifier/URIScheme/ftp.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php (renamed from library/HTMLPurifier/URIScheme/http.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php (renamed from library/HTMLPurifier/URIScheme/https.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php (renamed from library/HTMLPurifier/URIScheme/mailto.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php (renamed from library/HTMLPurifier/URIScheme/news.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php (renamed from library/HTMLPurifier/URIScheme/nntp.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php46
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php (renamed from library/HTMLPurifier/URISchemeRegistry.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php (renamed from library/HTMLPurifier/UnitConverter.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php (renamed from library/HTMLPurifier/VarParser.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php (renamed from library/HTMLPurifier/VarParser/Flexible.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php (renamed from library/HTMLPurifier/VarParser/Native.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php (renamed from library/HTMLPurifier/VarParserException.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php (renamed from library/HTMLPurifier/Zipper.php)0
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/.htaccess1
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/PH5P.patch102
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/PH5P.php3889
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/add-vimline.php130
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/common.php25
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/config-scanner.php155
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php42
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/flush.php30
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php75
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-includes.php192
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php22
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php45
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/generate-standalone.php159
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/merge-library.php11
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php71
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php32
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php32
-rwxr-xr-xvendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh5
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php37
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/rename-config.php84
-rw-r--r--vendor/ezyang/htmlpurifier/maintenance/update-config.php34
-rw-r--r--vendor/ezyang/htmlpurifier/package.php61
-rw-r--r--vendor/ezyang/htmlpurifier/phpdoc.ini102
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/modx.txt112
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore2
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/Changelog27
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL84
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/README45
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php57
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php316
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/info.txt18
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php30
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php31
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings.php64
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php95
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php22
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php79
-rw-r--r--vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php29
-rw-r--r--vendor/ezyang/htmlpurifier/release1-update.php110
-rw-r--r--vendor/ezyang/htmlpurifier/release2-tag.php22
-rw-r--r--vendor/ezyang/htmlpurifier/test-settings.sample.php74
-rw-r--r--vendor/ezyang/htmlpurifier/test-settings.travis.php72
-rw-r--r--vendor/michelf/php-markdown/License.md36
-rw-r--r--vendor/michelf/php-markdown/Michelf/Markdown.inc.php10
-rw-r--r--vendor/michelf/php-markdown/Michelf/Markdown.php1896
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php11
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownExtra.php1785
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php9
-rw-r--r--vendor/michelf/php-markdown/Michelf/MarkdownInterface.php38
-rw-r--r--vendor/michelf/php-markdown/Readme.md384
-rw-r--r--vendor/michelf/php-markdown/Readme.php31
-rw-r--r--vendor/michelf/php-markdown/composer.json31
-rw-r--r--vendor/pixel418/markdownify/CHANGELOG.md76
-rw-r--r--vendor/pixel418/markdownify/LICENSE (renamed from library/markdownify/LICENSE_LGPL.txt)0
-rw-r--r--vendor/pixel418/markdownify/README.md63
-rw-r--r--vendor/pixel418/markdownify/composer.json38
-rw-r--r--vendor/pixel418/markdownify/src/Converter.php1400
-rw-r--r--vendor/pixel418/markdownify/src/ConverterExtra.php573
-rw-r--r--vendor/pixel418/markdownify/src/Parser.php564
-rw-r--r--view/css/bootstrap-red.css83
-rw-r--r--view/css/conversation.css130
-rw-r--r--view/css/default.css4
-rw-r--r--view/css/mod_apps.css5
-rw-r--r--view/css/mod_chat.css4
-rw-r--r--view/css/mod_events.css5
-rw-r--r--view/css/mod_help.css8
-rw-r--r--view/css/mod_mail.css31
-rw-r--r--view/css/mod_webpages.css16
-rw-r--r--view/css/mod_wiki.css1
-rw-r--r--view/css/widgets.css63
-rw-r--r--view/de/hmessages.po10161
-rw-r--r--view/de/hstrings.php2396
-rw-r--r--view/fr/hmessages.po17098
-rw-r--r--view/fr/hstrings.php4120
-rw-r--r--view/js/acl.js20
-rw-r--r--view/js/autocomplete.js18
-rw-r--r--view/js/main.js8
-rw-r--r--view/js/mod_cloud.js2
-rw-r--r--view/js/mod_connedit.js2
-rw-r--r--view/js/mod_display.js7
-rw-r--r--view/js/mod_network.js1
-rw-r--r--view/js/mod_profiles.js4
-rw-r--r--view/js/mod_settings.js13
-rw-r--r--view/nl/hmessages.po11635
-rw-r--r--view/nl/hstrings.php2534
-rw-r--r--view/pdl/mod_apps.pdl1
-rw-r--r--view/php/default.php4
-rw-r--r--view/php/full.php2
-rw-r--r--view/php/theme_init.php58
-rw-r--r--view/theme/redbasic/css/narrow_navbar.css66
-rw-r--r--view/theme/redbasic/css/style.css900
-rw-r--r--view/theme/redbasic/js/redbasic.js41
-rw-r--r--view/theme/redbasic/php/config.php39
-rw-r--r--view/theme/redbasic/php/style.php111
-rw-r--r--view/theme/redbasic/php/theme.php4
-rw-r--r--view/theme/redbasic/php/theme_init.php26
-rw-r--r--view/theme/redbasic/schema/bluegrid.css26
-rw-r--r--view/theme/redbasic/schema/dark.css1
-rw-r--r--view/theme/redbasic/schema/simple_black_on_white.css2
-rw-r--r--view/theme/redbasic/schema/simple_green_on_black.css1
-rw-r--r--view/theme/redbasic/schema/simple_white_on_black.css1
-rw-r--r--view/theme/redbasic/tpl/theme_settings.tpl17
-rwxr-xr-xview/tpl/abook_edit.tpl61
-rwxr-xr-xview/tpl/acl_selector.tpl34
-rwxr-xr-xview/tpl/admin_accounts.tpl6
-rwxr-xr-xview/tpl/admin_aside.tpl18
-rwxr-xr-xview/tpl/admin_channels.tpl2
-rwxr-xr-xview/tpl/admin_plugins.tpl6
-rw-r--r--view/tpl/admin_profiles.tpl4
-rw-r--r--view/tpl/admin_queue.tpl2
-rwxr-xr-xview/tpl/admin_site.tpl8
-rw-r--r--view/tpl/app.tpl12
-rw-r--r--view/tpl/app_create.tpl4
-rw-r--r--view/tpl/app_select.tpl10
-rw-r--r--view/tpl/attach_edit.tpl8
-rw-r--r--view/tpl/blocklist.tpl10
-rwxr-xr-xview/tpl/build_query.tpl2
-rwxr-xr-xview/tpl/categories_widget.tpl6
-rwxr-xr-xview/tpl/channel_import.tpl5
-rwxr-xr-xview/tpl/channels.tpl2
-rw-r--r--view/tpl/chat.tpl66
-rw-r--r--view/tpl/chatroom_new.tpl2
-rw-r--r--view/tpl/chatroomlist.tpl6
-rw-r--r--view/tpl/chatrooms.tpl6
-rw-r--r--view/tpl/cloud_actionspanel.tpl6
-rw-r--r--view/tpl/cloud_directory.tpl12
-rw-r--r--view/tpl/cloud_header.tpl6
-rwxr-xr-xview/tpl/comment_item.tpl35
-rwxr-xr-xview/tpl/common_tabs.tpl17
-rwxr-xr-xview/tpl/connection_template.tpl10
-rwxr-xr-xview/tpl/connections.tpl24
-rwxr-xr-xview/tpl/conv_item.tpl165
-rwxr-xr-xview/tpl/conv_list.tpl256
-rwxr-xr-xview/tpl/cover_photo_widget.tpl30
-rw-r--r--view/tpl/design_tools.tpl14
-rwxr-xr-xview/tpl/directory_header.tpl18
-rwxr-xr-xview/tpl/direntry.tpl10
-rw-r--r--view/tpl/dreport.tpl2
-rwxr-xr-xview/tpl/edpost_head.tpl2
-rwxr-xr-xview/tpl/event.tpl6
-rwxr-xr-xview/tpl/event_cal.tpl2
-rwxr-xr-xview/tpl/event_form.tpl60
-rwxr-xr-xview/tpl/event_head.tpl1
-rwxr-xr-xview/tpl/events-js.tpl24
-rwxr-xr-xview/tpl/events_cal-js.tpl10
-rwxr-xr-xview/tpl/events_tools_side.tpl22
-rwxr-xr-xview/tpl/field_checkbox.tpl7
-rwxr-xr-xview/tpl/field_combobox.tpl33
-rwxr-xr-xview/tpl/field_input.tpl9
-rwxr-xr-xview/tpl/field_intcheckbox.tpl9
-rwxr-xr-xview/tpl/field_password.tpl8
-rwxr-xr-xview/tpl/field_select.tpl8
-rwxr-xr-xview/tpl/field_textarea.tpl8
-rwxr-xr-xview/tpl/field_yesno.tpl4
-rwxr-xr-xview/tpl/fileas_widget.tpl6
-rwxr-xr-xview/tpl/filer_dialog.tpl23
-rwxr-xr-xview/tpl/follow.tpl11
-rwxr-xr-xview/tpl/generic_links_widget.tpl4
-rw-r--r--view/tpl/generic_modal.tpl4
-rwxr-xr-xview/tpl/group_drop.tpl2
-rwxr-xr-xview/tpl/group_side.tpl14
-rw-r--r--view/tpl/hdr.tpl8
-rw-r--r--view/tpl/help.tpl4
-rw-r--r--view/tpl/item_attach.tpl2
-rw-r--r--view/tpl/item_categories.tpl6
-rw-r--r--view/tpl/item_filer.tpl6
-rwxr-xr-xview/tpl/item_import.tpl4
-rwxr-xr-xview/tpl/jot-header.tpl40
-rwxr-xr-xview/tpl/jot.tpl115
-rw-r--r--view/tpl/layoutlist.tpl12
-rwxr-xr-xview/tpl/like_noshare.tpl4
-rw-r--r--view/tpl/locmanage.tpl6
-rwxr-xr-xview/tpl/mail_conv.tpl57
-rwxr-xr-xview/tpl/mail_display.tpl6
-rwxr-xr-xview/tpl/mail_head.tpl2
-rwxr-xr-xview/tpl/mail_list.tpl4
-rw-r--r--view/tpl/menuedit.tpl2
-rw-r--r--view/tpl/menulist.tpl10
-rwxr-xr-xview/tpl/message_side.tpl10
-rw-r--r--view/tpl/mitemedit.tpl2
-rw-r--r--view/tpl/mitemlist.tpl2
-rwxr-xr-xview/tpl/myapps.tpl12
-rwxr-xr-xview/tpl/nav.tpl414
-rw-r--r--view/tpl/nav_login.tpl2
-rw-r--r--view/tpl/nwiki_page_history.tpl10
-rwxr-xr-xview/tpl/peoplefind.tpl20
-rwxr-xr-xview/tpl/photo_album.tpl6
-rwxr-xr-xview/tpl/photo_albums.tpl8
-rwxr-xr-xview/tpl/photo_drop.tpl2
-rwxr-xr-xview/tpl/photo_view.tpl40
-rwxr-xr-xview/tpl/photos_recent.tpl2
-rwxr-xr-xview/tpl/photos_upload.tpl4
-rwxr-xr-xview/tpl/posted_date_widget.tpl20
-rwxr-xr-xview/tpl/profile_advanced.tpl52
-rwxr-xr-xview/tpl/profile_edit.tpl181
-rwxr-xr-xview/tpl/profile_listing_header.tpl2
-rw-r--r--view/tpl/profile_tabs.tpl5
-rwxr-xr-xview/tpl/prv_message.tpl54
-rw-r--r--view/tpl/saved_searches.tpl12
-rwxr-xr-xview/tpl/search_item.tpl64
-rw-r--r--view/tpl/searchbox.tpl6
-rwxr-xr-xview/tpl/settings.tpl22
-rwxr-xr-xview/tpl/settings_account.tpl2
-rwxr-xr-xview/tpl/settings_display.tpl8
-rwxr-xr-xview/tpl/settings_features.tpl2
-rwxr-xr-xview/tpl/settings_oauth.tpl4
-rw-r--r--view/tpl/sharedwithme.tpl10
-rw-r--r--view/tpl/show_thing.tpl4
-rwxr-xr-xview/tpl/suggest_friends.tpl4
-rw-r--r--view/tpl/thing_edit.tpl2
-rw-r--r--view/tpl/thing_input.tpl2
-rw-r--r--view/tpl/usermenu.tpl6
-rwxr-xr-xview/tpl/viewcontact_template.tpl22
-rw-r--r--view/tpl/webpage_export_list.tpl2
-rw-r--r--view/tpl/webpage_import.tpl2
-rw-r--r--view/tpl/webpagelist.tpl10
-rw-r--r--view/tpl/website_portation_tools.tpl128
-rw-r--r--view/tpl/wiki.tpl66
-rw-r--r--view/tpl/wiki_page_history.tpl4
-rw-r--r--view/tpl/wiki_page_list.tpl10
-rw-r--r--view/tpl/wikilist.tpl4
-rw-r--r--view/tpl/wikilist_widget.tpl4
2916 files changed, 105151 insertions, 66148 deletions
diff --git a/.gitignore b/.gitignore
index 75be5b0c2..050902f17 100755
--- a/.gitignore
+++ b/.gitignore
@@ -44,7 +44,8 @@ doc/html/
.zotshrc
# external repositories for themes/addons
extend/
-
+# files generated by phpunit
+tests/results/
## exclude IDE files
# config files and folders from Eclipse
@@ -63,6 +64,8 @@ nbproject/
## composer
# locally installed composer binary
composer.phar
+# allow composer.lock, as it is required to have a common state
+!composer.lock
# vendor/ is managed by composer, no need to include in our repository
# requires new deployment and needs discussion first
#vendor/
diff --git a/.travis.yml b/.travis.yml
index 2830d1b9f..e1aec9145 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,44 +1,156 @@
+#
+# Travis-CI configuration file for Hubzilla
+#
+## configure things
+#
+
# see http://about.travis-ci.org/docs/user/languages/php/ for more hints
language: php
-# list any PHP version you want to test against
-php:
- # using major version aliases
+# use newer 'trusty' based distro, old one is 'precise'
+dist: trusty
+# use docker based containers
+sudo: false
+
+# Git branches whitelist to build on Travis CI
+branches:
+ only:
+ - master
+ - dev
+ # whitelist our tags for release deployments e.g. 2.2
+ - /^\d+\.\d+(\.\d+)?(-\S*)?$/
- # aliased to a recent 5.6.x version
- - 5.6
- # aliased to a recent 7.x version
- - 7.0
- # aliased to a recent hhvm version
- - hhvm
+# Install additional software
+addons:
+ # Install dependencies for generating API documentation with doxygen
+ apt:
+ packages:
+ - doxygen
+ - doxygen-latex
+ - graphviz
+ - ttf-liberation
-# optionally specify a list of environments, for example to test different RDBMS
-#env:
-# - DB=mysql
-# - DB=pgsql
+# enable and start databases on a per job basis
+#services:
+# - mariadb
+# - postgresql
+
+# any PHP version we want to test against, current stable phpunit requires PHP >= 7.0
+php:
+ - '7.0'
+ - '7.1'
+ # HHVM does not fulfil PHPUnit platform requirements as being compatible with PHP7 yet
+ #- 'hhvm'
-# optionally set up exclutions and allowed failures in the matrix
+# list of environments to test
+env:
+ global:
+ # used for doxygen deployment script
+ - DOXYFILE: $TRAVIS_BUILD_DIR/util/Doxyfile
+ # Uncomment if a newer/specific version of Doxygen should be used
+ #- DOXY_VER: 1.8.12
+ # Code Coverage is slow, no need to have it in every build
+ - PHPUCOV: "--no-coverage"
+ # use matrix only for PHP and MySQL, all other combinations added through includes
+ matrix:
+ # trusty default MySQL 5.6
+ - DB=mysql MYSQL_VERSION=5.6
+
+# Matrix configuration details
matrix:
+ fast_finish: true
+ # Additional check combinations
+ include:
+ # PHP7.1, mariadb 10.1
+ - php: '7.1'
+ env: DB=mariadb MARIADB_VERSION=10.1 CODECOV=1
+ # use mariadb instead of MySQL
+ addons:
+ mariadb: '10.1'
+ # PHP7.1, PostgreSQL 9.6
+ - php: '7.1'
+ env: DB=pgsql POSTGRESQL_VERSION=9.6
+ # Use newer postgres than 9.2 default
+ addons:
+ postgresql: '9.6'
+ services:
+ - postgresql
+ # PHP7.1, old precise distribution with MySQL 5.5
+ - php: '7.1'
+ env: DB=mysql MYSQL_VERSION=5.5
+ dist: precise
+ services:
+ - mysql
+ # Excludes from default matrix combinations
# exclude:
# - php: hhvm
# env: DB=pgsql # PDO driver for pgsql is unsupported by HHVM (3rd party install for support)
- allow_failures:
- - php: hhvm
-# execute any number of scripts before the test run, custom env's are available as variables
-#before_script:
-# - if [[ "$DB" == "pgsql" ]]; then psql -c "DROP DATABASE IF EXISTS hello_world_test;" -U postgres; fi
-# - if [[ "$DB" == "pgsql" ]]; then psql -c "create database hello_world_test;" -U postgres; fi
-# - if [[ "$DB" == "mysql" ]]; then mysql -e "create database IF NOT EXISTS hello_world_test;" -uroot; fi
+# cache composer downloads between runs
+cache:
+ directories:
+ - $HOME/.composer/cache
+ #- $HOME/doxygen/doxygen-$DOXY_VER/bin
+
+
+#
+## execute things
+#
+
+before_install:
+ - travis_retry composer self-update
+
+# Install composer dev libs
install:
- - composer require phpunit/phpunit
+ - travis_retry composer install --optimize-autoloader
+
+# execute any number of scripts before the test run, custom env's are available as variables
+before_script:
+ # Use code coverage config for phpunit
+ - if [[ ! -z $CODECOV ]]; then export PHPUCOV=""; fi
+ # Some preparation tasks of environment
+ - ./tests/travis/prepare.sh
+ # DB specific prepare scripts
+ - if [[ "$DB" == "mysql" ]]; then ./tests/travis/prepare_mysql.sh; fi
+ - if [[ "$DB" == "mariadb" ]]; then ./tests/travis/prepare_mysql.sh; fi
+ - if [[ "$DB" == "pgsql" ]]; then ./tests/travis/prepare_pgsql.sh; fi
# omitting "script:" will default to phpunit
-# use the $DB env variable to determine the phpunit.xml to use
-script: vendor/bin/phpunit tests/unit/
+script: ./vendor/bin/phpunit $PHPUCOV -c tests/phpunit-$DB.xml
+
+after_success:
+ # Generate API documentation and deploy it to gh-pages
+ - ./tests/travis/gen_apidocs.sh
+#after_failure:
+
+# Deploying release and API documentation to GitHub
+#before_deploy:
+deploy:
+ - provider: pages
+ skip_cleanup: true
+ local_dir: $TRAVIS_BUILD_DIR/doc/html
+ github_token: $GH_TOKEN
+ on:
+ repo: redmatrix/hubzilla
+ branch: master
+ condition: '(-n "$GH_TOKEN") && ("$TRAVIS_JOB_NUMBER" == "${TRAVIS_BUILD_NUMBER}.1")'
+ # add API documentation to release, could also be used to provide full packages if we want to drop vendor from our repo
+ - provider: releases
+ skip_cleanup: true
+ api_key: $GH_TOKEN
+ file: 'doc/hubzilla-api-documentation.zip'
+ on:
+ repo: redmatrix/hubzilla
+ tags: true
+ condition: '(-n "$GH_TOKEN") && ("$TRAVIS_JOB_NUMBER" == "${TRAVIS_BUILD_NUMBER}.1")'
+#after_deploy:
+
+#after_script:
+
+
# configure notifications (email, IRC, campfire etc)
-notifications:
+#notifications:
# irc: "irc.freenode.org#yourfavouriteroomfortravis"
# a plugin/script to post to a hubzilla channel would be neat here
diff --git a/CHANGELOG b/CHANGELOG
index 642506016..15ef95730 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,93 @@
+Hubzilla 2.2 (2017-??-??)
+ - Provide version compatibility check for themes (minversion, maxversion)
+ - Use chanlink_hash() instead of chanlink_url() where appropriate
+ - Use head_add_link() for feed discovery
+ - Provide HTTP header parser which honours continuation lines
+ - Numerous doco improvements
+ - Implement virtual privacy groups from restricted profile access list
+ - Implement permission roles
+ - Implement app-tray
+ - Default to manual conversation updates
+ - Implement channel move for all server roles
+ - Implement nav login modal
+ - Rename bb2diaspora.php to markdown.php
+ - Remove obsolete module 'match'
+ - Move firefox social api configuration to plugin
+ - Move rsd service to twitter_api plugin
+ - Add build_pagehead hook
+ - Move opensearch to plugins
+ - Move dreamhost hack to plugin
+ - Add wiki permissions
+ - Introduce hubloc_store_lowlevel() and xchan_store_lowlevel()
+ - Move diaspora account import to the diaspora plugin
+ - Allow export of single data sets instead of always exporting everything we know about in channel export
+ - Queue optimisations for sites that have lingered in the queue for more than a couple of days
+ - Add affinity slider tool settings for min and max defaults in settings/featured
+ - Provide lowlevel xchan storage function to ensure that all non-null rows are initialised
+ - Implement native wiki
+ - Block well-known from oembed
+ - Implement observer.language bbcode and observer.language comanche conditional
+ - Implement daemon_addon hook to let plugins create custom background processes
+ - Implement profile vcards
+ - Implement connection vcards
+ - Implement 'click to call' in address book
+ - Default cover photo
+ - Remove fullscreen functionality in photo album view
+ - Update fontawesome lib to version 4.7.0
+ - Implement a menu to select a section to be open by default in connedit
+ - Improve comanche conditionals
+ - Add enclosures and categories to atom feed parsing
+ - Allow the atom_entry hook to change the results
+ - Set 'adjust for viewer timezone' as the default for new events
+ - Allow event creation in other timezones than your own
+ - Update fullcalendar lib to version 3.1
+ - Move api version call back to core
+ - Create first webpage as 'home' if none exist
+ - Show webpages link to visitors if a 'home' page exists
+
+ Bugfixes
+ - Fix schema not saved if session theme != selected theme and schema select display issue
+ - Fix no acl not detected in post_activity_item()
+ - Fix find_folder_hash_by_path() was not safe against multiple attach structures with the same filename but in different directories
+ - Fix don't search on empty filename - we shouldn't find it. The reason why this change is being made is because we actually did find it due to a development glitch
+ - Fix several places where head_add_(css|js) functions have been used incorrectly.
+ - Fix webpage import tool
+ - Fix numerous bugs with the addon repo management GUI
+ - Fix attach_delete() to remove photo resources even if the attach table row wasn't found
+ - Fix choking if photo_factory() returns null
+ - Fix embedimage if an albumname contains quotes
+ - Fix chat member list when one or more members are connected via access tokens
+ - Fix issue #636 - some localised (e.g. Italian) strings have single quotes which throw JS errors when used in single quoted template constructs
+ - Fix issues #629 and #635 - edited post arriving from downstream source was not being rejected
+ - Fix peoplefind widget not honouring directory option settings
+ - Fix issue with HTML in code blocks in markdown in wiki
+ - Fix issue with post signatures if posted from api and logged in locally with a different identity
+
+ Plugins/Addon
+ - Add experimental webmention plugin
+ - NSFW: Use button instead of text link
+ - Diaspora: gracefully handle multiple photos per post
+ - Diaspora: change profile photo permission call
+ - Logrotate: don't throw an error if another server process renamed the logfile before we got to it
+ - Chess: the channel owner must be one of the players, so only require selecting one connection for an opponent
+ - Move firefox social api configuration to plugin from core
+ - Move rsd service to twitter_api plugin from core
+ - Move opensearch to plugins from core
+ - Move dreamhost hack to plugin from
+ - Move diaspora account import to addon from core
+ - Reflect hubloc store changes in plugins
+ - Reflect xchan store changes in plugins
+ - Rendezvous: Fixed marker creation bug
+ - Rendezvous: Center on marker if specified in URL, and update browser address bar with shareable link when selecting markers on the map
+ - Rendezvous: Set default value of 0 for priximity alert when making new markers
+ - Move gitwiki to plugins from core which has been replaced by native wiki
+ - Openclipatar: reflect changes to files and photos which were unified in core some time ago
+ - Reintroduce gnusocial plugin after security/functionality review
+ - Twitter_api: hubzilla core issue 638 - unsupported message-id field not available in all twitter api functions
+ - Superblock: update to reflect core changes
+ - Rendezvous: implement static marker proximity alert
+ - Phpmailer: security update
+
Hubzilla 2.0 (2016-12-23)
- Deprecate bb_iframe
- Note widget: resize the textarea to reveal full content
diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php
index 350dda7a0..c84708ba4 100644
--- a/Zotlabs/Daemon/Cron.php
+++ b/Zotlabs/Daemon/Cron.php
@@ -121,6 +121,9 @@ class Cron {
}
}
+ require_once('include/attach.php');
+ attach_upgrade();
+
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php
index 0f0001890..038790572 100644
--- a/Zotlabs/Daemon/Cron_daily.php
+++ b/Zotlabs/Daemon/Cron_daily.php
@@ -38,6 +38,13 @@ class Cron_daily {
db_utcnow(), db_quoteinterval('30 DAY')
);
+ // expire any unread notifications over a year old
+
+ q("delete from notify where seen = 0 and created < %s - INTERVAL %s",
+ db_utcnow(), db_quoteinterval('1 YEAR')
+ );
+
+
//update statistics in config
require_once('include/statistics_fns.php');
update_channels_total_stat();
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index 1432cbdcf..edf050b95 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -219,7 +219,7 @@ class Apps {
'Suggest Channels' => t('Suggest Channels'),
'Login' => t('Login'),
'Channel Manager' => t('Channel Manager'),
- 'Grid' => t('Grid'),
+ 'Grid' => t('Activity'),
'Settings' => t('Settings'),
'Files' => t('Files'),
'Webpages' => t('Webpages'),
@@ -245,9 +245,19 @@ class Apps {
'Profile Photo' => t('Profile Photo')
);
- if(array_key_exists($arr['name'],$apps)) {
- $arr['name'] = $apps[$arr['name']];
+ if(array_key_exists('name',$arr)) {
+ if(array_key_exists($arr['name'],$apps)) {
+ $arr['name'] = $apps[$arr['name']];
+ }
+ }
+ else {
+ for($x = 0; $x < count($arr); $x++) {
+ if(array_key_exists($arr[$x]['name'],$apps)) {
+ $arr[$x]['name'] = $apps[$arr[$x]['name']];
+ }
+ }
}
+
}
@@ -360,7 +370,9 @@ class Apps {
'$deleted' => $papp['deleted'],
'$feature' => (($papp['embed']) ? false : true),
'$featured' => ((strpos($papp['categories'], 'nav_featured_app') === false) ? false : true),
- '$navapps' => (($mode == 'nav') ? true : false)
+ '$navapps' => (($mode == 'nav') ? true : false),
+ '$add' => t('Add to app-tray'),
+ '$remove' => t('Remove from app-tray')
));
}
diff --git a/Zotlabs/Lib/DB_Upgrade.php b/Zotlabs/Lib/DB_Upgrade.php
new file mode 100644
index 000000000..55c69bcca
--- /dev/null
+++ b/Zotlabs/Lib/DB_Upgrade.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+
+class DB_Upgrade {
+
+ public $config_name = '';
+ public $func_prefix = '';
+
+ function __construct($db_revision) {
+
+ $update_file = 'install/' . PLATFORM_NAME . '/update.php';
+ if(! file_exists($update_file)) {
+ $update_file = 'install/update.php';
+ $this->config_name = 'db_version';
+ $this->func_prefix = 'update_r';
+ }
+ else {
+ $this->config_name = PLATFORM_NAME . '_db_version';
+ $this->func_prefix = PLATFORM_NAME . '_update_';
+ }
+
+ $build = get_config('system', $this->config_name, 0);
+ if(! intval($build))
+ $build = set_config('system', $this->config_name, $db_revision);
+
+ if($build == $db_revision) {
+ // Nothing to be done.
+ return;
+ }
+ else {
+ $stored = intval($build);
+ if(! $stored) {
+ logger('Critical: check_config unable to determine database schema version');
+ return;
+ }
+
+ $current = intval($db_revision);
+
+ if(($stored < $current) && file_exists($update_file)) {
+
+ Config::Load('database');
+
+ // We're reporting a different version than what is currently installed.
+ // Run any existing update scripts to bring the database up to current.
+
+ require_once($update_file);
+
+ // make sure that boot.php and update.php are the same release, we might be
+ // updating from git right this very second and the correct version of the update.php
+ // file may not be here yet. This can happen on a very busy site.
+
+ if($db_revision == UPDATE_VERSION) {
+ for($x = $stored; $x < $current; $x ++) {
+ $func = $this->func_prefix . $x;
+ if(function_exists($func)) {
+ // There could be a lot of processes running or about to run.
+ // We want exactly one process to run the update command.
+ // So store the fact that we're taking responsibility
+ // after first checking to see if somebody else already has.
+
+ // If the update fails or times-out completely you may need to
+ // delete the config entry to try again.
+
+ if(get_config('database', $func))
+ break;
+ set_config('database',$func, '1');
+ // call the specific update
+
+ $retval = $func();
+ if($retval) {
+
+ // Prevent sending hundreds of thousands of emails by creating
+ // a lockfile.
+
+ $lockfile = 'store/[data]/mailsent';
+
+ if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
+ return;
+ @unlink($lockfile);
+ //send the administrator an e-mail
+ file_put_contents($lockfile, $x);
+
+ $r = q("select account_language from account where account_email = '%s' limit 1",
+ dbesc(App::$config['system']['admin_email'])
+ );
+ push_lang(($r) ? $r[0]['account_language'] : 'en');
+
+ z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf( t('Update Error at %s'), z_root()),
+ 'textVersion' => replace_macros(get_intltext_template('update_fail_eml.tpl'),
+ [
+ '$sitename' => \App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$update' => $x,
+ '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
+ ]
+ )
+ ]
+ );
+
+ //try the logger
+ logger('CRITICAL: Update Failed: ' . $x);
+ pop_lang();
+ }
+ else {
+ set_config('database',$func, 'success');
+ }
+ }
+ }
+ set_config('system', $this->config_name, $db_revision);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php
index 257687567..5db5fb42d 100644
--- a/Zotlabs/Lib/Enotify.php
+++ b/Zotlabs/Lib/Enotify.php
@@ -67,7 +67,7 @@ class Enotify {
$sender_name = $product;
$hostname = \App::get_hostname();
if(strpos($hostname,':'))
- $hostname = substr($hostname,0,strpos($hostname,':'));
+ $hostname = substr($hostname,0,strpos($hostname,':'));
// Do not translate 'noreply' as it must be a legal 7-bit email address
@@ -77,7 +77,7 @@ class Enotify {
$sender_email = get_config('system','from_email');
if(! $sender_email)
- $sender_email = 'Administrator' . '@' . \App::get_hostname();
+ $sender_email = 'Administrator' . '@' . $hostname;
$sender_name = get_config('system','from_email_name');
if(! $sender_name)
diff --git a/Zotlabs/Lib/MarkdownSoap.php b/Zotlabs/Lib/MarkdownSoap.php
new file mode 100644
index 000000000..a0214bbe4
--- /dev/null
+++ b/Zotlabs/Lib/MarkdownSoap.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+/**
+ * MarkdownSoap
+ * Purify Markdown for storage
+ * $x = new MarkdownSoap($string_to_be_cleansed);
+ * $text = $x->clean();
+ *
+ * What this does:
+ * 1. extracts code blocks and privately escapes them from processing
+ * 2. Run html purifier on the content
+ * 3. put back the code blocks
+ * 4. run htmlspecialchars on the entire content for safe storage
+ *
+ * At render time:
+ * $markdown = \Zotlabs\Lib\MarkdownSoap::unescape($text);
+ * $html = \Michelf\MarkdownExtra::DefaultTransform($markdown);
+ */
+
+
+
+class MarkdownSoap {
+
+ private $token;
+
+ private $str;
+
+ function __construct($s) {
+ $this->str = $s;
+ $this->token = random_string(20);
+ }
+
+
+ function clean() {
+
+ $x = $this->extract_code($this->str);
+
+ $x = $this->purify($x);
+
+ $x = $this->putback_code($x);
+
+ $x = $this->escape($x);
+
+ return $x;
+ }
+
+ function extract_code($s) {
+
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.'4'.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.'4'.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ [ $this , 'encode_code' ], $s);
+
+ return $text;
+ }
+
+ function encode_code($matches) {
+ return $this->token . ';' . base64_encode($matches[0]) . ';' ;
+ }
+
+ function decode_code($matches) {
+ return base64_decode($matches[1]);
+ }
+
+ function putback_code($s) {
+ $text = preg_replace_callback('{' . $this->token . '\;(.*?)\;}xm',[ $this, 'decode_code' ], $s);
+ return $text;
+ }
+
+ function purify($s) {
+// $s = str_replace("\n",'<br>',$s);
+// $s = str_replace("\t",'&nbsp;&nbsp;&nbsp;&nbsp;',$s);
+// $s = str_replace(' ','&nbsp;',$s);
+ $s = purify_html($s);
+// $s = str_replace(['&nbsp;', mb_convert_encoding('&#x00a0;','UTF-8','HTML-ENTITIES')], [ ' ', ' ' ],$s);
+// $s = str_replace(['<br>','<br />', '&lt;', '&gt;' ],["\n","\n", '<', '>'],$s);
+ return $s;
+ }
+
+ function escape($s) {
+ return htmlspecialchars($s,ENT_QUOTES);
+ }
+
+ static public function unescape($s) {
+ return htmlspecialchars_decode($s,ENT_QUOTES);
+ }
+}
diff --git a/Zotlabs/Lib/NativeWiki.php b/Zotlabs/Lib/NativeWiki.php
index 519102d24..7786ec25a 100644
--- a/Zotlabs/Lib/NativeWiki.php
+++ b/Zotlabs/Lib/NativeWiki.php
@@ -75,6 +75,8 @@ class NativeWiki {
$arr['obj_type'] = ACTIVITY_OBJ_WIKI;
$arr['body'] = '[table][tr][td][h1]New Wiki[/h1][/td][/tr][tr][td][zrl=' . $wiki_url . ']' . $wiki['htmlName'] . '[/zrl][/td][/tr][/table]';
+ $arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_wiki'),true);
+
// Save the wiki name information using iconfig. This is shareable.
if(! set_iconfig($arr, 'wiki', 'rawName', $wiki['rawName'], true)) {
return array('item' => null, 'success' => false);
diff --git a/Zotlabs/Lib/NativeWikiPage.php b/Zotlabs/Lib/NativeWikiPage.php
index 1467a1cfb..960fe014e 100644
--- a/Zotlabs/Lib/NativeWikiPage.php
+++ b/Zotlabs/Lib/NativeWikiPage.php
@@ -48,13 +48,23 @@ class NativeWikiPage {
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
+ if (! $w['wiki']) {
+ return array('content' => null, 'message' => 'Error reading wiki', 'success' => false);
+ }
+
// create an empty activity
$arr = [];
- $arr['uid'] = $channel_id;
- $arr['author_xchan'] = $observer_hash;
+ $arr['uid'] = $channel_id;
+ $arr['author_xchan'] = $observer_hash;
$arr['resource_type'] = 'nwikipage';
- $arr['resource_id'] = $resource_id;
+ $arr['resource_id'] = $resource_id;
+ $arr['allow_cid'] = $w['wiki']['allow_cid'];
+ $arr['allow_gid'] = $w['wiki']['allow_gid'];
+ $arr['deny_cid'] = $w['wiki']['deny_cid'];
+ $arr['deny_gid'] = $w['wiki']['deny_gid'];
+
+ $arr['public_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel_id,'view_wiki'),true);
// We may wish to change this some day.
$arr['item_unpublished'] = 1;
@@ -146,7 +156,7 @@ class NativeWikiPage {
$content = $item['body'];
return [
- 'content' => json_encode($content),
+ 'content' => $content,
'mimeType' => $w['mimeType'],
'message' => '',
'success' => true
@@ -180,7 +190,7 @@ class NativeWikiPage {
$processed ++;
$history[] = [
'revision' => $item['revision'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$item['created']),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$item['edited']),
'name' => $item['author']['xchan_name'],
'title' => get_iconfig($item,'nwikipage','commit_msg')
];
@@ -225,6 +235,7 @@ class NativeWikiPage {
}
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
+
if($revision == (-1))
$sql_extra .= " order by revision desc ";
elseif($revision)
@@ -277,6 +288,7 @@ class NativeWikiPage {
}
$sql_extra = item_permissions_sql($channel_id,$observer_hash);
+
$sql_extra .= " order by revision desc ";
$r = null;
@@ -295,48 +307,22 @@ class NativeWikiPage {
return null;
}
-
-
- static public function prepare_content($s) {
-
- $text = preg_replace_callback('{
- (?:\n\n|\A\n?)
- ( # $1 = the code block -- one or more lines, starting with a space/tab
- (?>
- [ ]{'.'4'.'} # Lines must start with a tab or a tab-width of spaces
- .*\n+
- )+
- )
- ((?=^[ ]{0,'.'4'.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
- }xm',
- 'self::nwiki_prepare_content_callback', $s);
-
- return $text;
- }
-
- static public function nwiki_prepare_content_callback($matches) {
- $codeblock = $matches[1];
-
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES, UTF8, false);
- return "\n\n" . $codeblock ;
- }
-
-
-
static public function save_page($arr) {
- $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
- $content = ((array_key_exists('content',$arr)) ? purify_html(Zlib\NativeWikiPage::prepare_content($arr['content'])) : '');
- $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
+ $pageUrlName = ((array_key_exists('pageUrlName',$arr)) ? $arr['pageUrlName'] : '');
+ $content = ((array_key_exists('content',$arr)) ? $arr['content'] : '');
+ $resource_id = ((array_key_exists('resource_id',$arr)) ? $arr['resource_id'] : '');
$observer_hash = ((array_key_exists('observer_hash',$arr)) ? $arr['observer_hash'] : '');
$channel_id = ((array_key_exists('channel_id',$arr)) ? $arr['channel_id'] : 0);
- $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
+ $revision = ((array_key_exists('revision',$arr)) ? $arr['revision'] : 0);
$w = Zlib\NativeWiki::get_wiki($channel_id, $observer_hash, $resource_id);
if (!$w['wiki']) {
return array('message' => t('Error reading wiki'), 'success' => false);
}
+
+ $mimetype = $w['mimeType'];
// fetch the most recently saved revision.
@@ -355,6 +341,7 @@ class NativeWikiPage {
$item['author_xchan'] = $observer_hash;
$item['revision'] = (($arr['revision']) ? intval($arr['revision']) + 1 : intval($item['revision']) + 1);
$item['edited'] = datetime_convert();
+ $item['mimetype'] = $mimetype;
if($item['iconfig'] && is_array($item['iconfig']) && count($item['iconfig'])) {
for($x = 0; $x < count($item['iconfig']); $x ++) {
@@ -522,6 +509,29 @@ class NativeWikiPage {
}
return $s;
}
+
+ static public function render_page_history($arr) {
+
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+
+ $pageHistory = self::page_history([
+ 'channel_id' => \App::$profile_uid,
+ 'observer_hash' => get_observer_hash(),
+ 'resource_id' => $resource_id,
+ 'pageUrlName' => $pageUrlName
+ ]);
+
+ return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
+ '$pageHistory' => $pageHistory['history'],
+ '$permsWrite' => $arr['permsWrite'],
+ '$name_lbl' => t('Name'),
+ '$msg_label' => t('Message','wiki_history')
+ ));
+
+ }
+
+
/**
* Replace the instances of the string [toc] with a list element that will be populated by
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 0ee8e6680..5910ea672 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -82,7 +82,8 @@ class ThreadItem {
$dropping = false;
$star = false;
$isstarred = "unstarred fa-star-o";
- $indent = '';
+ $is_comment = false;
+ $is_item = false;
$osparkle = '';
$total_children = $this->count_descendants();
$unseen_comments = (($item['real_uid']) ? 0 : $this->count_unseen_descendants());
@@ -136,7 +137,7 @@ class ThreadItem {
$filer = ((($conv->get_profile_owner() == local_channel()) && (! array_key_exists('real_uid',$item))) ? t("Save to Folder") : false);
$profile_avatar = $item['author']['xchan_photo_m'];
- $profile_link = chanlink_url($item['author']['xchan_url']);
+ $profile_link = chanlink_hash($item['author_xchan']);
$profile_name = $item['author']['xchan_name'];
$location = format_location($item);
@@ -183,7 +184,7 @@ class ThreadItem {
$like_list = ((x($conv_responses['like'],$item['mid'])) ? $conv_responses['like'][$item['mid'] . '-l'] : '');
if (count($like_list) > MAX_LIKERS) {
$like_list_part = array_slice($like_list, 0, MAX_LIKERS);
- array_push($like_list_part, '<a href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ array_push($like_list_part, '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#likeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
} else {
$like_list_part = '';
}
@@ -195,7 +196,7 @@ class ThreadItem {
$dislike_button_label = tt('Dislike','Dislikes',$dislike_count,'noun');
if (count($dislike_list) > MAX_LIKERS) {
$dislike_list_part = array_slice($dislike_list, 0, MAX_LIKERS);
- array_push($dislike_list_part, '<a href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
+ array_push($dislike_list_part, '<a class="dropdown-item" href="#" data-toggle="modal" data-target="#dislikeModal-' . $this->get_id() . '"><b>' . t('View all') . '</b></a>');
} else {
$dislike_list_part = '';
}
@@ -232,7 +233,7 @@ class ThreadItem {
}
}
else {
- $indent = 'comment';
+ $is_comment = true;
}
@@ -276,13 +277,13 @@ class ThreadItem {
$keep_reports = intval(get_config('system','expire_delivery_reports'));
if($keep_reports === 0)
- $keep_reports = 30;
+ $keep_reports = 10;
if((! get_config('system','disable_dreport')) && strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC',"now - $keep_reports days")) > 0)
$dreport = t('Delivery Report');
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
- $indent .= ' shiny';
+ $is_new = true;
localize_item($item);
@@ -337,7 +338,6 @@ class ThreadItem {
'profile_url' => $profile_link,
'thread_action_menu' => thread_action_menu($item,$conv->get_mode()),
'thread_author_menu' => thread_author_menu($item,$conv->get_mode()),
- 'item_photo_menu' => item_photo_menu($item),
'dreport' => $dreport,
'name' => $profile_name,
'thumb' => $profile_avatar,
@@ -361,7 +361,8 @@ class ThreadItem {
'attend_title' => t('Attendance Options'),
'vote_label' => t('Vote'),
'vote_title' => t('Voting Options'),
- 'indent' => $indent,
+ 'is_comment' => $is_comment,
+ 'is_new' => $is_new,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
'owner_name' => $this->get_owner_name(),
@@ -407,7 +408,7 @@ class ThreadItem {
'showlike' => $showlike,
'showdislike' => $showdislike,
'comment' => $this->get_comment_box($indent),
- 'previewing' => ($conv->is_preview() ? ' preview ' : ''),
+ 'previewing' => ($conv->is_preview() ? true : false ),
'wait' => t('Please wait'),
'submid' => str_replace(['+','='], ['',''], base64_encode(substr($item['mid'],0,32))),
'thread_level' => $thread_level
@@ -767,7 +768,7 @@ class ThreadItem {
return;
if($this->is_toplevel() && ($this->get_data_value('author_xchan') != $this->get_data_value('owner_xchan'))) {
- $this->owner_url = chanlink_url($this->data['owner']['xchan_url']);
+ $this->owner_url = chanlink_hash($this->data['owner']['xchan_hash']);
$this->owner_photo = $this->data['owner']['xchan_photo_m'];
$this->owner_name = $this->data['owner']['xchan_name'];
$this->wall_to_wall = true;
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index 6f5b0ddf9..c3c50cac2 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -19,7 +19,7 @@ require_once("include/group.php");
class Acl extends \Zotlabs\Web\Controller {
- function init(){
+ function init() {
// logger('mod_acl: ' . print_r($_REQUEST,true));
@@ -49,7 +49,7 @@ class Acl extends \Zotlabs\Web\Controller {
$extra_channels = (x($_REQUEST,'extra_channels') ? $_REQUEST['extra_channels'] : array());
// The different autocomplete libraries use different names for the search text
- // parameter. Internaly we'll use $search to represent the search text no matter
+ // parameter. Internally we'll use $search to represent the search text no matter
// what request variable it was attached to.
if(array_key_exists('query',$_REQUEST)) {
@@ -104,6 +104,8 @@ class Acl extends \Zotlabs\Web\Controller {
if($type == '' || $type == 'g') {
+ // virtual groups based on private profile viewing ability
+
$r = q("select id, profile_guid, profile_name from profile where is_default = 0 and uid = %d",
intval(local_channel())
);
@@ -121,6 +123,8 @@ class Acl extends \Zotlabs\Web\Controller {
}
}
+ // Normal privacy groups
+
$r = q("SELECT groups.id, groups.hash, groups.gname
FROM groups, group_member
WHERE groups.deleted = 0 AND groups.uid = %d
@@ -151,25 +155,34 @@ class Acl extends \Zotlabs\Web\Controller {
}
if($type == '' || $type == 'c') {
+
$extra_channels_sql = '';
- // Only include channels who allow the observer to view their permissions
- foreach($extra_channels as $channel) {
- if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts'))
- $extra_channels_sql .= "," . intval($channel);
+
+ // Only include channels who allow the observer to view their connections
+ if($extra_channels) {
+ foreach($extra_channels as $channel) {
+ if(perm_is_allowed(intval($channel), get_observer_hash(),'view_contacts')) {
+ if($extra_channel_sql)
+ $extra_channels_sql .= ',';
+ $extra_channels_sql .= intval($channel);
+ }
+ }
}
- $extra_channels_sql = substr($extra_channels_sql,1); // Remove initial comma
-
// Getting info from the abook is better for local users because it contains info about permissions
if(local_channel()) {
if($extra_channels_sql != '')
$extra_channels_sql = " OR (abook_channel IN ($extra_channels_sql)) and abook_hidden = 0 ";
+
+ // Add atokens belonging to the local channel @TODO restrict by search
+
$r2 = null;
$r1 = q("select * from atoken where atoken_uid = %d",
intval(local_channel())
);
+
if($r1) {
require_once('include/security.php');
$r2 = array();
@@ -189,6 +202,7 @@ class Acl extends \Zotlabs\Web\Controller {
}
}
+ // add connections
$r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, xchan_pubforum, abook_flags, abook_self
FROM abook left join xchan on abook_xchan = xchan_hash
diff --git a/Zotlabs/Module/Admin/Plugins.php b/Zotlabs/Module/Admin/Plugins.php
index 527e96496..feb29e9d6 100644
--- a/Zotlabs/Module/Admin/Plugins.php
+++ b/Zotlabs/Module/Admin/Plugins.php
@@ -3,10 +3,14 @@
namespace Zotlabs\Module\Admin;
use \Zotlabs\Storage\GitRepo as GitRepo;
+use \Michelf\MarkdownExtra;
class Plugins {
-
+ /**
+ * @brief
+ *
+ */
function post() {
if(argc() > 2 && is_file("addon/" . argv(2) . "/" . argv(2) . ".php")) {
@@ -15,16 +19,15 @@ class Plugins {
$func = argv(2) . '_plugin_admin_post';
$func($a);
}
-
- goaway(z_root() . '/admin/plugins/' . argv(2) );
+ goaway(z_root() . '/admin/plugins/' . argv(2) );
}
elseif(argc() > 2) {
switch(argv(2)) {
case 'updaterepo':
if (array_key_exists('repoName', $_REQUEST)) {
$repoName = $_REQUEST['repoName'];
- }
+ }
else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
@@ -101,16 +104,15 @@ class Plugins {
logger('Repo directory not writable to web server: ' . $repoDir);
json_return_and_die(array('message' => 'Repo directory not writable to web server.', 'success' => false));
}
- // TODO: remove directory and unlink /addon/files
+ /// @TODO remove directory and unlink /addon/files
if (rrmdir($repoDir)) {
json_return_and_die(array('message' => 'Repo deleted.', 'success' => true));
} else {
json_return_and_die(array('message' => 'Error deleting addon repo.', 'success' => false));
}
case 'installrepo':
- require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
- require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
@@ -170,9 +172,8 @@ class Plugins {
json_return_and_die(array('repo' => $repo, 'message' => '', 'success' => true));
}
case 'addrepo':
- require_once('library/markdown.php');
if (array_key_exists('repoURL', $_REQUEST)) {
- require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
+ require_once('library/PHPGit.autoload.php'); // Load PHPGit dependencies
$repoURL = $_REQUEST['repoURL'];
$extendDir = 'store/[data]/git/sys/extend';
$addonDir = $extendDir . '/addon';
@@ -225,7 +226,7 @@ class Plugins {
$repo['readme'] = $repo['manifest'] = null;
foreach ($git->git->tree('master') as $object) {
if ($object['type'] == 'blob' && (strtolower($object['file']) === 'readme.md' || strtolower($object['file']) === 'readme')) {
- $repo['readme'] = Markdown($git->git->cat->blob($object['hash']));
+ $repo['readme'] = MarkdownExtra::defaultTransform($git->git->cat->blob($object['hash']));
} else if ($object['type'] == 'blob' && strtolower($object['file']) === 'manifest.json') {
$repo['manifest'] = $git->git->cat->blob($object['hash']);
}
@@ -241,7 +242,11 @@ class Plugins {
}
}
-
+ /**
+ * @brief Plugins admin page.
+ *
+ * @return string with parsed HTML
+ */
function get() {
/*
@@ -254,13 +259,13 @@ class Plugins {
notice( t("Item not found.") );
return '';
}
-
+
$enabled = in_array($plugin,\App::$plugins);
$info = get_plugin_info($plugin);
$x = check_plugin_versions($info);
-
+
// disable plugins which are installed but incompatible versions
-
+
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($plugin, \App::$plugins);
@@ -271,7 +276,7 @@ class Plugins {
}
}
$info['disabled'] = 1-intval($x);
-
+
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/plugins', 'admin_plugins', 't');
$pinstalled = false;
@@ -297,9 +302,9 @@ class Plugins {
}
goaway(z_root() . '/admin/plugins' );
}
+
// display plugin details
- require_once('library/markdown.php');
-
+
if (in_array($plugin, \App::$plugins)){
$status = 'on';
$action = t('Disable');
@@ -307,21 +312,21 @@ class Plugins {
$status = 'off';
$action = t('Enable');
}
-
+
$readme = null;
if (is_file("addon/$plugin/README.md")){
$readme = file_get_contents("addon/$plugin/README.md");
- $readme = Markdown($readme);
+ $readme = MarkdownExtra::defaultTransform($readme);
} else if (is_file("addon/$plugin/README")){
$readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
}
-
+
$admin_form = '';
-
+
$r = q("select * from addon where plugin_admin = 1 and aname = '%s' limit 1",
dbesc($plugin)
);
-
+
if($r) {
@require_once("addon/$plugin/$plugin.php");
if(function_exists($plugin.'_plugin_admin')) {
@@ -329,8 +334,8 @@ class Plugins {
$func($a, $admin_form);
}
}
-
-
+
+
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -338,7 +343,7 @@ class Plugins {
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
-
+
'$plugin' => $plugin,
'$status' => $status,
'$action' => $action,
@@ -351,17 +356,17 @@ class Plugins {
'$str_serverroles' => t('Compatible Server Roles: '),
'$str_requires' => t('Requires: '),
'$disabled' => t('Disabled - version incompatibility'),
-
+
'$admin_form' => $admin_form,
'$function' => 'plugins',
'$screenshot' => '',
'$readme' => $readme,
-
+
'$form_security_token' => get_form_security_token('admin_plugins'),
));
}
-
-
+
+
/*
* List plugins
*/
@@ -374,9 +379,9 @@ class Plugins {
$info = get_plugin_info($id);
$enabled = in_array($id,\App::$plugins);
$x = check_plugin_versions($info);
-
+
// disable plugins which are installed but incompatible versions
-
+
if($enabled && ! $x) {
$enabled = false;
$idz = array_search($id, \App::$plugins);
@@ -387,19 +392,19 @@ class Plugins {
}
}
$info['disabled'] = 1-intval($x);
-
+
$plugins[] = array( $id, (($enabled)?"on":"off") , $info);
}
}
}
-
+
usort($plugins,'self::plugin_sort');
$allowManageRepos = false;
if(is_writable('extend/addon') && is_writable('store/[data]')) {
$allowManageRepos = true;
- }
-
+ }
+
$admin_plugins_add_repo_form= replace_macros(
get_markup_template('admin_plugins_addrepo.tpl'), array(
'$post' => 'admin/plugins/addrepo',
@@ -418,14 +423,14 @@ class Plugins {
'$cancel' => t('Cancel')
)
);
-
+
$reponames = $this->listAddonRepos();
$addonrepos = [];
foreach($reponames as $repo) {
$addonrepos[] = array('name' => $repo, 'description' => '');
- // TODO: Parse repo info to provide more information about repos
+ /// @TODO Parse repo info to provide more information about repos
}
-
+
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -471,5 +476,4 @@ class Plugins {
return(strcmp(strtolower($a[2]['name']),strtolower($b[2]['name'])));
}
-
} \ No newline at end of file
diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php
index 829ca71e4..d05e70aa9 100644
--- a/Zotlabs/Module/Admin/Site.php
+++ b/Zotlabs/Module/Admin/Site.php
@@ -48,6 +48,10 @@ class Site {
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$default_expire_days = ((array_key_exists('default_expire_days',$_POST)) ? intval($_POST['default_expire_days']) : 0);
+ $reply_address = ((array_key_exists('reply_address',$_POST) && trim($_POST['reply_address'])) ? trim($_POST['reply_address']) : 'noreply@' . \App::get_hostname());
+ $from_email = ((array_key_exists('from_email',$_POST) && trim($_POST['from_email'])) ? trim($_POST['from_email']) : 'Administrator@' . \App::get_hostname());
+ $from_email_name = ((array_key_exists('from_email_name',$_POST) && trim($_POST['from_email_name'])) ? trim($_POST['from_email_name']) : \Zotlabs\Lib\System::get_site_name());
+
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
@@ -77,8 +81,15 @@ class Site {
set_config('system', 'enable_context_help', $enable_context_help);
set_config('system', 'verify_email', $verify_email);
set_config('system', 'default_expire_days', $default_expire_days);
+ set_config('system', 'reply_address', $reply_address);
+ set_config('system', 'from_email', $from_email);
+ set_config('system', 'from_email_name' , $from_email_name);
+
+
set_config('system', 'techlevel_lock', $techlevel_lock);
+
+
if(! is_null($techlevel))
set_config('system', 'techlevel', $techlevel);
@@ -163,6 +174,14 @@ class Site {
foreach($files as $file) {
$vars = '';
$f = basename($file);
+
+ $info = get_theme_info($f);
+ $compatible = check_plugin_versions($info);
+ if(!$compatible) {
+ $theme_choices[$f] = $theme_choices_mobile[$f] = sprintf(t('%s - (Incompatible)'), $f);
+ continue;
+ }
+
if (file_exists($file . '/library'))
continue;
if (file_exists($file . '/mobile'))
@@ -296,6 +315,10 @@ class Site {
'$login_on_homepage' => array('login_on_homepage', t("Login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
'$enable_context_help' => array('enable_context_help', t("Enable context help"),((intval($enable_context_help) === 1 || $enable_context_help === false) ? 1 : 0) , t("Display contextual help for the current page when the help button is pressed.")),
+ '$reply_address' => [ 'reply_address', t('Reply-to email address for system generated email.'), get_config('system','reply_address','noreply@' . \App::get_hostname()),'' ],
+ '$from_email' => [ 'from_email', t('Sender (From) email address for system generated email.'), get_config('system','from_email','Administrator@' . \App::get_hostname()),'' ],
+ '$from_email_name' => [ 'from_email_name', t('Name of email sender for system generated email.'), get_config('system','from_email_name',\Zotlabs\Lib\System::get_site_name()),'' ],
+
'$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
@@ -310,4 +333,4 @@ class Site {
));
}
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Module/Admin/Themes.php b/Zotlabs/Module/Admin/Themes.php
index 63a9a1670..8e72a1318 100644
--- a/Zotlabs/Module/Admin/Themes.php
+++ b/Zotlabs/Module/Admin/Themes.php
@@ -2,38 +2,41 @@
namespace Zotlabs\Module\Admin;
+use \Michelf\MarkdownExtra;
+/**
+ * @brief Admin area theme settings.
+ */
class Themes {
+ /**
+ * @brief
+ *
+ */
function post() {
$theme = argv(2);
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
- // fixme add parent theme if derived
- if (function_exists("theme_admin_post")){
+ /// @FIXME add parent theme if derived
+ if (function_exists('theme_admin_post')){
theme_admin_post($a);
}
}
info(t('Theme settings updated.'));
- if(is_ajax())
+ if(is_ajax())
return;
-
+
goaway(z_root() . '/admin/themes/' . $theme );
}
-
-
-
/**
* @brief Themes admin page.
*
- * @return string
+ * @return string with parsed HTML
*/
-
function get(){
-
$allowed_themes_str = get_config('system', 'allowed_themes');
$allowed_themes_raw = explode(',', $allowed_themes_str);
$allowed_themes = array();
@@ -41,7 +44,7 @@ class Themes {
foreach($allowed_themes_raw as $x)
if(strlen(trim($x)))
$allowed_themes[] = trim($x);
-
+
$themes = array();
$files = glob('view/theme/*');
if($files) {
@@ -53,56 +56,55 @@ class Themes {
$themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
}
}
-
+
if(! count($themes)) {
notice( t('No themes found.'));
return '';
}
-
+
/*
* Single theme
*/
-
+
if (\App::$argc == 3){
$theme = \App::$argv[2];
if(! is_dir("view/theme/$theme")){
notice( t("Item not found.") );
return '';
}
-
+
if (x($_GET,"a") && $_GET['a']=="t"){
check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
-
+
// Toggle theme status
-
+
$this->toggle_theme($themes, $theme, $result);
$s = $this->rebuild_theme_table($themes);
if($result)
info( sprintf('Theme %s enabled.', $theme));
else
info( sprintf('Theme %s disabled.', $theme));
-
+
set_config('system', 'allowed_themes', $s);
goaway(z_root() . '/admin/themes' );
}
-
+
// display theme details
- require_once('library/markdown.php');
-
+
if ($this->theme_status($themes,$theme)) {
$status="on"; $action= t("Disable");
} else {
$status="off"; $action= t("Enable");
}
-
+
$readme=Null;
if (is_file("view/theme/$theme/README.md")){
$readme = file_get_contents("view/theme/$theme/README.md");
- $readme = Markdown($readme);
+ $readme = MarkdownExtra::defaultTransform($readme);
} else if (is_file("view/theme/$theme/README")){
- $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
+ $readme = '<pre>'. file_get_contents("view/theme/$theme/README") .'</pre>';
}
-
+
$admin_form = '';
if (is_file("view/theme/$theme/php/config.php")){
require_once("view/theme/$theme/php/config.php");
@@ -110,11 +112,11 @@ class Themes {
$admin_form = theme_admin($a);
}
}
-
+
$screenshot = array( get_theme_screenshot($theme), t('Screenshot'));
if(! stristr($screenshot[0],$theme))
$screenshot = null;
-
+
$t = get_markup_template('admin_plugins_details.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -122,7 +124,7 @@ class Themes {
'$toggle' => t('Toggle'),
'$settings' => t('Settings'),
'$baseurl' => z_root(),
-
+
'$plugin' => $theme,
'$status' => $status,
'$action' => $action,
@@ -133,22 +135,22 @@ class Themes {
'$str_maintainer' => t('Maintainer: '),
'$screenshot' => $screenshot,
'$readme' => $readme,
-
+
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
-
+
/*
* List themes
*/
-
+
$xthemes = array();
if($themes) {
foreach($themes as $th) {
$xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
}
}
-
+
$t = get_markup_template('admin_plugins.tpl');
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -162,13 +164,14 @@ class Themes {
'$form_security_token' => get_form_security_token('admin_themes'),
));
}
-
/**
- * @param array $themes
- * @param string $th
- * @param int $result
+ * @brief Toggle a theme.
+ *
+ * @param array &$themes
+ * @param[in] string $th
+ * @param[out] int &$result
*/
function toggle_theme(&$themes, $th, &$result) {
for($x = 0; $x < count($themes); $x ++) {
@@ -184,7 +187,7 @@ class Themes {
}
}
}
-
+
/**
* @param array $themes
* @param string $th
@@ -203,8 +206,7 @@ class Themes {
}
return 0;
}
-
-
+
/**
* @param array $themes
* @return string
@@ -222,12 +224,5 @@ class Themes {
}
return $o;
}
-
-
-
-
-
-
-
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Module/Appman.php b/Zotlabs/Module/Appman.php
index 270301d34..70cc7e44b 100644
--- a/Zotlabs/Module/Appman.php
+++ b/Zotlabs/Module/Appman.php
@@ -36,8 +36,9 @@ class Appman extends \Zotlabs\Web\Controller {
if(Zlib\Apps::app_installed(local_channel(),$arr))
info( t('App installed.') . EOL);
-
- return;
+
+ goaway(z_root() . '/apps');
+ return; //not reached
}
diff --git a/Zotlabs/Module/Apps.php b/Zotlabs/Module/Apps.php
index 2df6d675f..261615997 100644
--- a/Zotlabs/Module/Apps.php
+++ b/Zotlabs/Module/Apps.php
@@ -41,9 +41,12 @@ class Apps extends \Zotlabs\Web\Controller {
return replace_macros(get_markup_template('myapps.tpl'), array(
'$sitename' => get_config('system','sitename'),
- '$cat' => ((array_key_exists('cat',$_GET) && $_GET['cat']) ? ' - ' . escape_tags($_GET['cat']) : ''),
+ '$cat' => ((array_key_exists('cat',$_GET) && $_GET['cat']) ? escape_tags($_GET['cat']) : ''),
'$title' => t('Apps'),
'$apps' => $apps,
+ '$authed' => ((local_channel()) ? true : false),
+ '$manage' => t('Manage apps'),
+ '$create' => (($mode == 'edit') ? t('Create new app') : '')
));
}
diff --git a/Zotlabs/Module/Bookmarks.php b/Zotlabs/Module/Bookmarks.php
index 733bfd4e3..682f8e76c 100644
--- a/Zotlabs/Module/Bookmarks.php
+++ b/Zotlabs/Module/Bookmarks.php
@@ -68,7 +68,8 @@ class Bookmarks extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
- $o = profile_tabs($a,true,$channel['channel_address']);
+ //$o = profile_tabs($a,true,$channel['channel_address']);
+ $o = '';
$o .= '<div class="generic-content-wrapper-styled">';
diff --git a/Zotlabs/Module/Cal.php b/Zotlabs/Module/Cal.php
index b982d19a8..41676ce02 100644
--- a/Zotlabs/Module/Cal.php
+++ b/Zotlabs/Module/Cal.php
@@ -86,7 +86,8 @@ class Cal extends \Zotlabs\Web\Controller {
$o = '';
- $tabs = profile_tabs($a, True, $channel['channel_address']);
+ //$tabs = profile_tabs($a, True, $channel['channel_address']);
+ $tabs = '';
$mode = 'view';
$y = 0;
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 45da92184..61df35a60 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -41,12 +41,20 @@ class Channel extends \Zotlabs\Web\Controller {
$profile = argv(1);
}
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Posts and comments') . '" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n" ;
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" title="' . t('Only posts') . '" href="' . z_root() . '/feed/' . $which . '?top=1" />' . "\r\n" ;
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Posts and comments'),
+ 'href' => z_root() . '/feed/' . $which
+ ]);
+
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Only posts'),
+ 'href' => z_root() . '/feed/' . $which . '?f=&top=1'
+ ]);
- // Not yet ready for prime time
- // \App::$page['htmlhead'] .= '<link rel="openid.server" href="' . z_root() . '/id/' . $which .'?f=" />' . "\r\n" ;
- // \App::$page['htmlhead'] .= '<link rel="openid.delegate" href="' . z_root() . '/channel/' . $which .'" />' . "\r\n" ;
// Run profile_load() here to make sure the theme is set before
// we start loading content
@@ -113,7 +121,7 @@ class Channel extends \Zotlabs\Web\Controller {
$static = channel_manual_conv_update(\App::$profile['profile_uid']);
- $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o .= common_friends_visitor_widget(\App::$profile['profile_uid']);
@@ -313,6 +321,7 @@ class Channel extends \Zotlabs\Web\Controller {
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
+ '$xchan' => '',
'$order' => '',
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$file' => '',
diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php
index 2c0e7a155..23a3e65da 100644
--- a/Zotlabs/Module/Chat.php
+++ b/Zotlabs/Module/Chat.php
@@ -33,9 +33,7 @@ class Chat extends \Zotlabs\Web\Controller {
$which = $channel['channel_address'];
$profile = argv(1);
}
-
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
-
+
// Run profile_load() here to make sure the theme is set before
// we start loading content
@@ -212,7 +210,8 @@ class Chat extends \Zotlabs\Web\Controller {
require_once('include/conversation.php');
- $o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
+ //$o = profile_tabs($a,((local_channel() && local_channel() == \App::$profile['profile_uid']) ? true : false),\App::$profile['channel_address']);
+ $o = '';
if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat')) {
notice( t('Feature disabled.') . EOL);
diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php
index 1fda8e32b..7370eeda3 100644
--- a/Zotlabs/Module/Cloud.php
+++ b/Zotlabs/Module/Cloud.php
@@ -37,8 +37,6 @@ class Cloud extends \Zotlabs\Web\Controller {
$profile = 0;
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which . '" />' . "\r\n";
-
if ($which)
profile_load( $which, $profile);
@@ -59,16 +57,12 @@ class Cloud extends \Zotlabs\Web\Controller {
$auth->observer = $ob_hash;
}
- if ($_GET['davguest'])
- $_SESSION['davguest'] = true;
$_SERVER['QUERY_STRING'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['QUERY_STRING']);
$_SERVER['QUERY_STRING'] = strip_zids($_SERVER['QUERY_STRING']);
- $_SERVER['QUERY_STRING'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['QUERY_STRING']);
$_SERVER['REQUEST_URI'] = str_replace(array('?f=', '&f='), array('', ''), $_SERVER['REQUEST_URI']);
$_SERVER['REQUEST_URI'] = strip_zids($_SERVER['REQUEST_URI']);
- $_SERVER['REQUEST_URI'] = preg_replace('/[\?&]davguest=(.*?)([\?&]|$)/ism', '', $_SERVER['REQUEST_URI']);
$rootDirectory = new \Zotlabs\Storage\Directory('/', $auth);
diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php
index 950be660d..b079ae860 100644
--- a/Zotlabs/Module/Connections.php
+++ b/Zotlabs/Module/Connections.php
@@ -5,10 +5,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
-
class Connections extends \Zotlabs\Web\Controller {
@@ -269,7 +265,7 @@ class Connections extends \Zotlabs\Web\Controller {
'link' => z_root() . '/connedit/' . $rr['abook_id'],
'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
'delete' => t('Delete'),
- 'url' => chanlink_url($rr['xchan_url']),
+ 'url' => chanlink_hash($rr['xchan_hash']),
'webbie_label' => t('Channel address'),
'webbie' => $rr['xchan_addr'],
'network_label' => t('Network'),
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 7a753c286..484e69b52 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -11,9 +11,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/selectors.php');
require_once('include/group.php');
-require_once('include/contact_widgets.php');
-require_once('include/zot.php');
-require_once('include/widgets.php');
require_once('include/photos.php');
@@ -391,30 +388,22 @@ class Connedit extends \Zotlabs\Web\Controller {
$section = ((array_key_exists('section',$_REQUEST)) ? $_REQUEST['section'] : '');
$channel = \App::get_channel();
- $my_perms = get_channel_default_perms(local_channel());
- $role = get_pconfig(local_channel(),'system','permissions_role');
- if($role) {
- $x = \Zotlabs\Access\PermissionRoles::role_perms($role);
- if($x['perms_connect'])
- $my_perms = $x['perms_connect'];
- }
$yes_no = array(t('No'),t('Yes'));
- if($my_perms) {
- $o .= "<script>function connectDefaultShare() {
- \$('.abook-edit-me').each(function() {
- if(! $(this).is(':disabled'))
- $(this).prop('checked', false);
- });\n\n";
- $perms = get_perms();
- foreach($perms as $p => $v) {
- if($my_perms & $v[1]) {
- $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
- }
+ $connect_perms = \Zotlabs\Access\Permissions::connect_perms(local_channel());
+
+ $o .= "<script>function connectDefaultShare() {
+ \$('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).prop('checked', false);
+ });\n\n";
+ foreach($connect_perms['perms'] as $p => $v) {
+ if($v) {
+ $o .= "\$('#me_id_perms_" . $p . "').prop('checked', true); \n";
}
- $o .= " }\n</script>\n";
}
+ $o .= " }\n</script>\n";
if(argc() == 3) {
@@ -441,6 +430,34 @@ class Connedit extends \Zotlabs\Web\Controller {
goaway(z_root() . '/connedit/' . $contact_id);
}
+
+ if($cmd === 'fetchvc') {
+ $url = str_replace('/channel/','/profile/',$orig_record[0]['xchan_url']) . '/vcard';
+ $recurse = 0;
+ $x = z_fetch_url(zid($url),false,$recurse,['session' => true]);
+ if($x['success']) {
+ $h = new \Zotlabs\Web\HTTPHeaders($x['header']);
+ $fields = $h->fetch();
+ if($fields) {
+ foreach($fields as $y) {
+ if(array_key_exists('content-type',$y)) {
+ $type = explode(';',trim($y['content-type']));
+ if($type && $type[0] === 'text/vcard' && $x['body']) {
+ $vc = \Sabre\VObject\Reader::read($x['body']);
+ $vcard = $vc->serialize();
+ if($vcard) {
+ set_abconfig(local_channel(),$orig_record[0]['abook_xchan'],'system','vcard',$vcard);
+ $this->connedit_clone($a);
+ }
+ }
+ }
+ }
+ }
+ }
+ goaway(z_root() . '/connedit/' . $contact_id);
+ }
+
+
if($cmd === 'resetphoto') {
q("update xchan set xchan_photo_date = '2001-01-01 00:00:00' where xchan_hash = '%s'",
dbesc($orig_record[0]['xchan_hash'])
@@ -582,6 +599,13 @@ class Connedit extends \Zotlabs\Web\Controller {
'sel' => '',
'title' => t('Fetch updated permissions'),
),
+
+ 'rephoto' => array(
+ 'label' => t('Refresh Photo'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/resetphoto',
+ 'sel' => '',
+ 'title' => t('Fetch updated photo'),
+ ),
'recent' => array(
'label' => t('Recent Activity'),
@@ -631,6 +655,17 @@ class Connedit extends \Zotlabs\Web\Controller {
);
+
+ if($contact['xchan_network'] === 'zot') {
+ $tools['fetchvc'] = [
+ 'label' => t('Fetch Vcard'),
+ 'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/fetchvc',
+ 'sel' => '',
+ 'title' => t('Fetch electronic calling card for this connection')
+ ];
+ }
+
+
$sections = [];
$sections['perms'] = [
diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php
index 72ec1020d..47bce6c2b 100644
--- a/Zotlabs/Module/Cover_photo.php
+++ b/Zotlabs/Module/Cover_photo.php
@@ -23,19 +23,17 @@ require_once('include/channel.php');
class Cover_photo extends \Zotlabs\Web\Controller {
function init() {
-
if(! local_channel()) {
return;
}
$channel = \App::get_channel();
- profile_load($channel['channel_address']);
-
+ profile_load($channel['channel_address']);
}
- /* @brief Evaluate posted values
+ /**
+ * @brief Evaluate posted values
*
- * @param $a Current application
* @return void
*
*/
@@ -130,8 +128,15 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$aid = get_account_id();
- $p = array('aid' => $aid, 'uid' => local_channel(), 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'], 'album' => t('Cover Photos'));
+ $p = [
+ 'aid' => $aid,
+ 'uid' => local_channel(),
+ 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'],
+ 'album' => t('Cover Photos'),
+ 'os_path' => $base_image['os_path'],
+ 'display_path' => $base_image['display_path']
+ ];
$p['imgscale'] = 7;
$p['photo_usage'] = PHOTO_COVER;
@@ -195,11 +200,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$os_storage = false;
foreach($i as $ii) {
- $smallest = intval($ii['imgscale']);
+ $smallest = intval($ii['imgscale']);
$os_storage = intval($ii['os_storage']);
- $imagedata = $ii['content'];
- $filetype = $ii['mimetype'];
-
+ $imagedata = $ii['content'];
+ $filetype = $ii['mimetype'];
}
}
@@ -263,10 +267,10 @@ class Cover_photo extends \Zotlabs\Web\Controller {
}
- /* @brief Generate content of profile-photo view
+ /**
+ * @brief Generate content of profile-photo view
*
- * @param $a Current application
- * @return void
+ * @return string
*
*/
@@ -350,15 +354,15 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$tpl = get_markup_template('cover_photo.tpl');
$o .= replace_macros($tpl,array(
- '$user' => \App::$channel['channel_address'],
- '$lbl_upfile' => t('Upload File:'),
- '$lbl_profiles' => t('Select a profile:'),
- '$title' => t('Upload Cover Photo'),
- '$submit' => t('Upload'),
- '$profiles' => $profiles,
+ '$user' => \App::$channel['channel_address'],
+ '$lbl_upfile' => t('Upload File:'),
+ '$lbl_profiles' => t('Select a profile:'),
+ '$title' => t('Upload Cover Photo'),
+ '$submit' => t('Upload'),
+ '$profiles' => $profiles,
'$form_security_token' => get_form_security_token("cover_photo"),
- // FIXME - yuk
- '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
+ /// @FIXME - yuk
+ '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . z_root() . '">' . t('skip this step') . '</a>' : '<a href="'. z_root() . '/photos/' . \App::$channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
));
call_hooks('cover_photo_content_end', $o);
@@ -370,14 +374,14 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$resolution = 3;
$tpl = get_markup_template("cropcover.tpl");
$o .= replace_macros($tpl,array(
- '$filename' => $filename,
- '$profile' => intval($_REQUEST['profile']),
- '$resource' => \App::$data['imagecrop'] . '-3',
- '$image_url' => z_root() . '/photo/' . $filename,
- '$title' => t('Crop Image'),
- '$desc' => t('Please adjust the image cropping for optimum viewing.'),
+ '$filename' => $filename,
+ '$profile' => intval($_REQUEST['profile']),
+ '$resource' => \App::$data['imagecrop'] . '-3',
+ '$image_url' => z_root() . '/photo/' . $filename,
+ '$title' => t('Crop Image'),
+ '$desc' => t('Please adjust the image cropping for optimum viewing.'),
'$form_security_token' => get_form_security_token("cover_photo"),
- '$done' => t('Done Editing')
+ '$done' => t('Done Editing')
));
return $o;
}
@@ -393,8 +397,6 @@ class Cover_photo extends \Zotlabs\Web\Controller {
*
*/
-
-
function cover_photo_crop_ui_head(&$a, $ph, $hash, $smallest){
$max_length = get_config('system','max_image_length');
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
index 59ae88857..edcf43cd6 100644
--- a/Zotlabs/Module/Directory.php
+++ b/Zotlabs/Module/Directory.php
@@ -4,7 +4,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/dir_fns.php');
-require_once('include/widgets.php');
require_once('include/bbcode.php');
diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php
index 638aa881a..815672091 100644
--- a/Zotlabs/Module/Display.php
+++ b/Zotlabs/Module/Display.php
@@ -1,12 +1,17 @@
<?php
namespace Zotlabs\Module;
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+require_once('include/items.php');
class Display extends \Zotlabs\Web\Controller {
function get($update = 0, $load = false) {
-
+
$checkjs = new \Zotlabs\Web\CheckJS(1);
if($load)
@@ -18,15 +23,7 @@ class Display extends \Zotlabs\Web\Controller {
return;
}
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
-
-
- \App::$page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
-
+
if(argc() > 1 && argv(1) !== 'load')
$item_hash = argv(1);
@@ -40,6 +37,7 @@ class Display extends \Zotlabs\Web\Controller {
}
$observer_is_owner = false;
+ $updateable = false;
if(local_channel() && (! $update)) {
@@ -167,6 +165,7 @@ class Display extends \Zotlabs\Web\Controller {
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$search' => '',
+ '$xchan' => '',
'$order' => '',
'$file' => '',
'$cats' => '',
@@ -184,10 +183,9 @@ class Display extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$sql_extra = public_permissions_sql($observer_hash);
-
+
if(($update && $load) || ($checkjs->disabled())) {
- $updateable = false;
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']),intval(\App::$pager['start']));
@@ -197,9 +195,9 @@ class Display extends \Zotlabs\Web\Controller {
require_once('include/channel.php');
$sys = get_sys_channel();
$sysid = $sys['channel_id'];
-
+
if(local_channel()) {
- $r = q("SELECT * from item
+ $r = q("SELECT item.id as item_id from item
WHERE uid = %d
and mid = '%s'
$item_normal
@@ -213,6 +211,7 @@ class Display extends \Zotlabs\Web\Controller {
}
}
+
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
@@ -222,7 +221,7 @@ class Display extends \Zotlabs\Web\Controller {
$sysid = 0;
- $r = q("SELECT * from item
+ $r = q("SELECT item.id as item_id from item
WHERE mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
@@ -245,11 +244,11 @@ class Display extends \Zotlabs\Web\Controller {
require_once('include/channel.php');
$sys = get_sys_channel();
$sysid = $sys['channel_id'];
-
+
if(local_channel()) {
- $r = q("SELECT * from item
+ $r = q("SELECT item.parent AS item_id from item
WHERE uid = %d
- and mid = '%s'
+ and parent_mid = '%s'
$item_normal
$simple_update
limit 1",
@@ -260,14 +259,15 @@ class Display extends \Zotlabs\Web\Controller {
$updateable = true;
}
}
+
if($r === null) {
// in case somebody turned off public access to sys channel content using permissions
// make that content unsearchable by ensuring the owner_xchan can't match
if(! perm_is_allowed($sysid,$observer_hash,'view_stream'))
$sysid = 0;
- $r = q("SELECT * from item
- WHERE mid = '%s'
+ $r = q("SELECT item.parent AS item_id from item
+ WHERE parent_mid = '%s'
AND (((( item.allow_cid = '' AND item.allow_gid = '' AND item.deny_cid = ''
AND item.deny_gid = '' AND item_private = 0 )
and owner_xchan in ( " . stream_perms_xchans(($observer_hash) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
@@ -289,7 +289,7 @@ class Display extends \Zotlabs\Web\Controller {
if($r) {
- $parents_str = ids_to_querystr($r,'id');
+ $parents_str = ids_to_querystr($r,'item_id');
if($parents_str) {
$items = q("SELECT item.*, item.id AS item_id
@@ -319,10 +319,10 @@ class Display extends \Zotlabs\Web\Controller {
if($updateable) {
$x = q("UPDATE item SET item_unseen = 0 where item_unseen = 1 AND uid = %d and parent = %d ",
intval(local_channel()),
- intval($r[0]['parent'])
+ intval($r[0]['item_id'])
);
}
-
+
$o .= '<div id="content-complete"></div>';
return $o;
diff --git a/Zotlabs/Module/Editblock.php b/Zotlabs/Module/Editblock.php
index 654e2251d..8a7e87a09 100644
--- a/Zotlabs/Module/Editblock.php
+++ b/Zotlabs/Module/Editblock.php
@@ -98,6 +98,11 @@ class Editblock extends \Zotlabs\Web\Controller {
$mimetype = $itm[0]['mimetype'];
+ $content = $itm[0]['body'];
+ if($itm[0]['mimetype'] === 'text/markdown')
+ $content = \Zotlabs\Lib\MarkdownSoap::unescape($itm[0]['body']);
+
+
$rp = 'blocks/' . $channel['channel_address'];
$x = array(
@@ -117,7 +122,7 @@ class Editblock extends \Zotlabs\Web\Controller {
'ptyp' => $itm[0]['type'],
'mimeselect' => true,
'mimetype' => $itm[0]['mimetype'],
- 'body' => undo_post_tagging($itm[0]['body']),
+ 'body' => undo_post_tagging($content),
'post_id' => $post_id,
'visitor' => true,
'title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
diff --git a/Zotlabs/Module/Editlayout.php b/Zotlabs/Module/Editlayout.php
index ea637fcba..3d6a79507 100644
--- a/Zotlabs/Module/Editlayout.php
+++ b/Zotlabs/Module/Editlayout.php
@@ -119,6 +119,7 @@ class Editlayout extends \Zotlabs\Web\Controller {
'hide_weblink' => true,
'hide_attach' => true,
'hide_preview' => true,
+ 'disable_comments' => true,
'ptyp' => $itm[0]['obj_type'],
'body' => undo_post_tagging($itm[0]['body']),
'post_id' => $post_id,
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
index 3d4af107d..03b2aeab9 100644
--- a/Zotlabs/Module/Editwebpage.php
+++ b/Zotlabs/Module/Editwebpage.php
@@ -129,9 +129,11 @@ class Editwebpage extends \Zotlabs\Web\Controller {
}
$layout = $itm[0]['layout_mid'];
-
- $tpl = get_markup_template("jot.tpl");
+ $content = $itm[0]['body'];
+ if($itm[0]['mimetype'] === 'text/markdown')
+ $content = \Zotlabs\Lib\MarkdownSoap::unescape($itm[0]['body']);
+
$rp = 'webpages/' . $which;
$x = array(
@@ -147,7 +149,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
'hide_location' => true,
'hide_voting' => true,
'ptyp' => $itm[0]['type'],
- 'body' => undo_post_tagging($itm[0]['body']),
+ 'body' => undo_post_tagging($content),
'post_id' => $post_id,
'visitor' => ($is_owner) ? true : false,
'acl' => populate_acl($itm[0],false,\Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_pages')),
diff --git a/Zotlabs/Module/Filer.php b/Zotlabs/Module/Filer.php
index 6a57cdb2a..af59f28fb 100644
--- a/Zotlabs/Module/Filer.php
+++ b/Zotlabs/Module/Filer.php
@@ -49,8 +49,10 @@ class Filer extends \Zotlabs\Web\Controller {
}
$tpl = get_markup_template("filer_dialog.tpl");
$o = replace_macros($tpl, array(
- '$field' => array('term', t("Save to Folder:"), '', '', $filetags, t('- select -')),
+ '$field' => array('term', t('Enter a folder name'), '', '', $filetags, 'placeholder="' . t('or select an existing folder (doubleclick)') . '"'),
'$submit' => t('Save'),
+ '$title' => t('Save to Folder'),
+ '$cancel' => t('Cancel')
));
echo $o;
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
index 874445145..785dff394 100644
--- a/Zotlabs/Module/Filestorage.php
+++ b/Zotlabs/Module/Filestorage.php
@@ -130,7 +130,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
$f = $r[0];
$channel = \App::get_channel();
- $cloudpath = get_cloudpath($f) . (intval($f['is_dir']) ? '?f=&davguest=1' : '');
+ $cloudpath = get_cloudpath($f);
$parentpath = get_parent_cloudpath($channel['channel_id'], $channel['channel_address'], $f['hash']);
$aclselect_e = populate_acl($f, false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage'));
diff --git a/Zotlabs/Module/Hcard.php b/Zotlabs/Module/Hcard.php
index 93c8d3ece..13097939e 100644
--- a/Zotlabs/Module/Hcard.php
+++ b/Zotlabs/Module/Hcard.php
@@ -29,7 +29,20 @@ class Hcard extends \Zotlabs\Web\Controller {
$profile = $r[0]['profile_guid'];
}
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Posts and comments'),
+ 'href' => z_root() . '/feed/' . $which
+ ]);
+
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Only posts'),
+ 'href' => z_root() . '/feed/' . $which . '?f=&top=1'
+ ]);
+
if(! $profile) {
$x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
@@ -46,12 +59,10 @@ class Hcard extends \Zotlabs\Web\Controller {
}
- function get() {
-
- require_once('include/widgets.php');
- return widget_profile(array());
-
-
+ function get() {
+
+ $x = new \Zotlabs\Widget\Profile();
+ return $x->widget(array());
}
diff --git a/Zotlabs/Module/Impel.php b/Zotlabs/Module/Impel.php
index 197d9f859..77f488d26 100644
--- a/Zotlabs/Module/Impel.php
+++ b/Zotlabs/Module/Impel.php
@@ -144,18 +144,8 @@ class Impel extends \Zotlabs\Web\Controller {
// Verify ability to use html or php!!!
- $execflag = false;
-
- if($arr['mimetype'] === 'application/x-php') {
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval(local_channel())
- );
-
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- $execflag = true;
- }
- }
-
+ $execflag = ((intval($channel['channel_id']) == intval(local_channel()) && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
+
$i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
dbesc($arr['mid']),
intval(local_channel())
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index 3969f25e0..54bc7de81 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -2,26 +2,32 @@
namespace Zotlabs\Module;
-// Import a channel, either by direct file upload or via
-// connection to original server.
-
-
require_once('include/zot.php');
require_once('include/channel.php');
require_once('include/import.php');
require_once('include/perm_upgrade.php');
-
+/**
+ * @brief Module for channel import.
+ *
+ * Import a channel, either by direct file upload or via
+ * connection to another server.
+ */
class Import extends \Zotlabs\Web\Controller {
+ /**
+ * @brief Import channel into account.
+ *
+ * @param int $account_id
+ */
function import_account($account_id) {
-
+
if(! $account_id){
- logger("import_account: No account ID supplied");
+ logger('No account ID supplied');
return;
}
-
+
$max_friends = account_service_class_fetch($account_id,'total_channels');
$max_feeds = account_service_class_fetch($account_id,'total_feeds');
$data = null;
@@ -32,35 +38,39 @@ class Import extends \Zotlabs\Web\Controller {
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
-
+ // import channel from file
if($src) {
-
- // This is OS specific and could also fail if your tmpdir isn't very large
- // mostly used for Diaspora which exports gzipped files.
-
+
+ // This is OS specific and could also fail if your tmpdir isn't very
+ // large mostly used for Diaspora which exports gzipped files.
+
if(strpos($filename,'.gz')){
@rename($src,$src . '.gz');
@system('gunzip ' . escapeshellarg($src . '.gz'));
}
-
+
if($filesize) {
$data = @file_get_contents($src);
}
unlink($src);
}
-
+
+ // import channel from another server
if(! $src) {
$old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
if(! $old_address) {
- logger('mod_import: nothing to import.');
+ logger('Nothing to import.');
notice( t('Nothing to import.') . EOL);
return;
+ } else if(strpos($old_address, 'ï¼ ')) {
+ // if you copy the identity address from your profile page, make it work for convenience
+ $old_address = str_replace('ï¼ ', '@', $old_address);
}
-
+
$email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
$password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
+
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
@@ -73,6 +83,7 @@ class Import extends \Zotlabs\Web\Controller {
$api_path .= 'channel/export/basic?f=&channel=' . $channelname;
if($import_posts)
$api_path .= '&posts=1';
+
$binary = false;
$redirects = 0;
$opts = array('http_auth' => $email . ':' . $password);
@@ -85,19 +96,18 @@ class Import extends \Zotlabs\Web\Controller {
return;
}
}
-
+
if(! $data) {
- logger('mod_import: empty file.');
+ logger('Empty import file.');
notice( t('Imported file is empty.') . EOL);
return;
}
-
+
$data = json_decode($data,true);
-
- // logger('import: data: ' . print_r($data,true));
- // print_r($data);
-
-
+
+ //logger('import: data: ' . print_r($data,true));
+ //print_r($data);
+
if(! array_key_exists('compatibility',$data)) {
call_hooks('import_foreign_channel_data',$data);
if($data['handled'])
@@ -108,24 +118,24 @@ class Import extends \Zotlabs\Web\Controller {
$v1 = substr($data['compatibility']['database'],-4);
$v2 = substr(DB_UPDATE_VERSION,-4);
if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
notice($t);
}
if(array_key_exists('server_role',$data['compatibility']) && $data['compatibility']['server_role'] == 'basic')
$moving = true;
}
-
+
if($moving)
$seize = 1;
-
+
// import channel
-
+
$relocate = ((array_key_exists('relocate',$data)) ? $data['relocate'] : null);
if(array_key_exists('channel',$data)) {
-
+
$max_identities = account_service_class_fetch($account_id,'total_identities');
-
+
if($max_identities !== false) {
$r = q("select channel_id from channel where channel_account_id = %d",
intval($account_id)
@@ -137,46 +147,40 @@ class Import extends \Zotlabs\Web\Controller {
}
$channel = import_channel($data['channel'], $account_id, $seize);
-
}
else {
$moving = false;
$channel = \App::get_channel();
}
-
+
if(! $channel) {
- logger('mod_import: channel not found. ', print_r($channel,true));
+ logger('Channel not found. ', print_r($channel,true));
notice( t('No channel. Import failed.') . EOL);
return;
}
-
-
if(is_array($data['config'])) {
import_config($channel,$data['config']);
}
-
+
logger('import step 2');
-
-
-
if(array_key_exists('channel',$data)) {
if($data['photo']) {
require_once('include/photo/photo_driver.php');
import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],$account_id,$channel['channel_id']);
}
-
+
if(is_array($data['profile']))
import_profiles($channel,$data['profile']);
}
-
+
logger('import step 3');
-
+
if(is_array($data['hubloc'])) {
import_hublocs($channel,$data['hubloc'],$seize,$moving);
}
-
+
logger('import step 4');
// create new hubloc for the new channel at this site
@@ -200,7 +204,7 @@ class Import extends \Zotlabs\Web\Controller {
);
// reset the original primary hubloc if it is being seized
-
+
if($seize) {
$r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
dbesc($channel['channel_hash']),
@@ -210,20 +214,18 @@ class Import extends \Zotlabs\Web\Controller {
}
logger('import step 5');
-
-
-
+
+
// import xchans and contact photos
-
+
if(array_key_exists('channel',$data) && $seize) {
-
+
// replace any existing xchan we may have on this site if we're seizing control
-
+
$r = q("delete from xchan where xchan_hash = '%s'",
dbesc($channel['channel_hash'])
);
-
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_hash'],
@@ -242,23 +244,22 @@ class Import extends \Zotlabs\Web\Controller {
'xchan_photo_date' => datetime_convert(),
'xchan_name_date' => datetime_convert()
]
- );
+ );
}
-
+
logger('import step 6');
-
-
+ // import xchans
$xchans = $data['xchan'];
if($xchans) {
foreach($xchans as $xchan) {
-
+
$hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
if($xchan['xchan_network'] === 'zot' && $hash !== $xchan['xchan_hash']) {
logger('forged xchan: ' . print_r($xchan,true));
continue;
}
-
+
if(! array_key_exists('xchan_hidden',$xchan)) {
$xchan['xchan_hidden'] = (($xchan['xchan_flags'] & 0x0001) ? 1 : 0);
$xchan['xchan_orphan'] = (($xchan['xchan_flags'] & 0x0002) ? 1 : 0);
@@ -268,22 +269,22 @@ class Import extends \Zotlabs\Web\Controller {
$xchan['xchan_pubforum'] = (($xchan['xchan_flags'] & 0x0020) ? 1 : 0);
$xchan['xchan_deleted'] = (($xchan['xchan_flags'] & 0x1000) ? 1 : 0);
}
-
+
$r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan['xchan_hash'])
);
if($r)
continue;
- create_table_from_array('xchan',$xchan);
-
+ create_table_from_array('xchan',$xchan);
+
require_once('include/photo/photo_driver.php');
$photos = import_xchan_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
if($photos[4])
$photodate = NULL_DATE;
else
$photodate = $xchan['xchan_photo_date'];
-
+
$r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s', xchan_photo_date = '%s' where xchan_hash = '%s'",
dbesc($photos[0]),
dbesc($photos[1]),
@@ -292,27 +293,25 @@ class Import extends \Zotlabs\Web\Controller {
dbesc($photodate),
dbesc($xchan['xchan_hash'])
);
-
}
- logger('import step 7');
+ logger('import step 7');
}
-
$friends = 0;
$feeds = 0;
-
+
// import contacts
$abooks = $data['abook'];
if($abooks) {
foreach($abooks as $abook) {
$abook_copy = $abook;
-
+
$abconfig = null;
if(array_key_exists('abconfig',$abook) && is_array($abook['abconfig']) && count($abook['abconfig']))
$abconfig = $abook['abconfig'];
-
+
unset($abook['abook_id']);
unset($abook['abook_rating']);
unset($abook['abook_rating_text']);
@@ -332,7 +331,7 @@ class Import extends \Zotlabs\Web\Controller {
$abook['abook_self'] = (($abook['abook_flags'] & 0x0080 ) ? 1 : 0);
$abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
}
-
+
if($abook['abook_self']) {
$role = get_pconfig($channel['channel_id'],'system','permissions_role');
if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
@@ -340,14 +339,14 @@ class Import extends \Zotlabs\Web\Controller {
dbesc($abook['abook_xchan'])
);
}
- }
+ }
else {
if($max_friends !== false && $friends > $max_friends)
continue;
if($max_feeds !== false && intval($abook['abook_feed']) && ($feeds > $max_feeds))
continue;
}
-
+
create_table_from_array('abook',$abook);
$friends ++;
@@ -355,9 +354,9 @@ class Import extends \Zotlabs\Web\Controller {
$feeds ++;
translate_abook_perms_inbound($channel,$abook_copy);
-
+
if($abconfig) {
- // @fixme does not handle sync of del_abconfig
+ /// @FIXME does not handle sync of del_abconfig
foreach($abconfig as $abc) {
set_abconfig($channel['channel_id'],$abc['xchan'],$abc['cat'],$abc['k'],$abc['v']);
}
@@ -366,20 +365,21 @@ class Import extends \Zotlabs\Web\Controller {
logger('import step 8');
}
-
+
+ // import groups
$groups = $data['group'];
if($groups) {
$saved = array();
foreach($groups as $group) {
$saved[$group['hash']] = array('old' => $group['id']);
- if(array_key_exists('name',$group)) {
+ if(array_key_exists('name', $group)) {
$group['gname'] = $group['name'];
unset($group['name']);
}
unset($group['id']);
$group['uid'] = $channel['channel_id'];
- create_table_from_array('groups',$group);
+ create_table_from_array('groups', $group);
}
$r = q("select * from groups where uid = %d",
intval($channel['channel_id'])
@@ -388,10 +388,10 @@ class Import extends \Zotlabs\Web\Controller {
foreach($r as $rr) {
$saved[$rr['hash']]['new'] = $rr['id'];
}
- }
+ }
}
-
-
+
+ // import group members
$group_members = $data['group_member'];
if($group_members) {
foreach($group_members as $group_member) {
@@ -401,36 +401,36 @@ class Import extends \Zotlabs\Web\Controller {
if($x['old'] == $group_member['gid'])
$group_member['gid'] = $x['new'];
}
- create_table_from_array('group_member',$group_member);
+ create_table_from_array('group_member', $group_member);
}
}
logger('import step 9');
-
+
if(is_array($data['obj']))
import_objs($channel,$data['obj']);
-
+
if(is_array($data['likes']))
import_likes($channel,$data['likes']);
-
+
if(is_array($data['app']))
import_apps($channel,$data['app']);
-
+
if(is_array($data['chatroom']))
import_chatrooms($channel,$data['chatroom']);
-
+
if(is_array($data['conv']))
import_conv($channel,$data['conv']);
-
+
if(is_array($data['mail']))
import_mail($channel,$data['mail']);
-
+
if(is_array($data['event']))
import_events($channel,$data['event']);
-
+
if(is_array($data['event_item']))
import_items($channel,$data['event_item'],false,$relocate);
-
+
if(is_array($data['menu']))
import_menus($channel,$data['menu']);
@@ -439,56 +439,62 @@ class Import extends \Zotlabs\Web\Controller {
if(is_array($data['webpages']))
import_items($channel,$data['webpages'],false,$relocate);
-
+
$addon = array('channel' => $channel,'data' => $data);
call_hooks('import_channel',$addon);
-
+
$saved_notification_flags = notifications_off($channel['channel_id']);
-
+
if($import_posts && array_key_exists('item',$data) && $data['item'])
import_items($channel,$data['item'],false,$relocate);
-
+
notifications_on($channel['channel_id'],$saved_notification_flags);
-
-
+
if(array_key_exists('item_id',$data) && $data['item_id'])
import_item_ids($channel,$data['item_id']);
-
+
// send out refresh requests
// notify old server that it may no longer be primary.
-
+
\Zotlabs\Daemon\Master::Summon(array('Notifier','location',$channel['channel_id']));
-
+
// This will indirectly perform a refresh_all *and* update the directory
-
+
\Zotlabs\Daemon\Master::Summon(array('Directory', $channel['channel_id']));
-
-
+
+
notice( t('Import completed.') . EOL);
-
+
change_channel($channel['channel_id']);
-
+
goaway(z_root() . '/network' );
-
}
-
-
+
+ /**
+ * @brief Handle POST action on channel import page.
+ */
function post() {
-
$account_id = get_account_id();
if(! $account_id)
return;
-
+
+ check_form_security_token_redirectOnErr('/import', 'channel_import');
+
$this->import_account($account_id);
}
-
+
+ /**
+ * @brief Generate channel import page.
+ *
+ * @return string with parsed HTML.
+ */
function get() {
-
+
if(! get_account_id()) {
- notice( t('You must be logged in to use this feature.'));
+ notice( t('You must be logged in to use this feature.') . EOL);
return '';
}
-
+
$o = replace_macros(get_markup_template('channel_import.tpl'),array(
'$title' => t('Import Channel'),
'$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
@@ -501,14 +507,14 @@ class Import extends \Zotlabs\Web\Controller {
'$label_import_primary' => t('Make this hub my primary location'),
'$label_import_moving' => t('Move this channel (disable all previous locations)'),
'$label_import_posts' => t('Import a few months of posts if possible (limited by available memory'),
- '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
+ '$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
'$email' => '',
'$pass' => '',
+ '$form_security_token' => get_form_security_token('channel_import'),
'$submit' => t('Submit')
));
-
+
return $o;
-
}
-
+
}
diff --git a/Zotlabs/Module/Import_items.php b/Zotlabs/Module/Import_items.php
index f20cbfe7e..c2b2506fe 100644
--- a/Zotlabs/Module/Import_items.php
+++ b/Zotlabs/Module/Import_items.php
@@ -3,54 +3,60 @@ namespace Zotlabs\Module;
require_once('include/import.php');
-
+/**
+ * @brief Module for importing items.
+ *
+ * Import existing posts and content from an export file.
+ */
class Import_items extends \Zotlabs\Web\Controller {
function post() {
-
+
if(! local_channel())
return;
-
+
+ check_form_security_token_redirectOnErr('/import_items', 'import_items');
+
$data = null;
-
+
$src = $_FILES['filename']['tmp_name'];
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
-
+
if($src) {
// This is OS specific and could also fail if your tmpdir isn't very large
// mostly used for Diaspora which exports gzipped files.
-
+
if(strpos($filename,'.gz')){
@rename($src,$src . '.gz');
@system('gunzip ' . escapeshellarg($src . '.gz'));
}
-
+
if($filesize) {
$data = @file_get_contents($src);
}
unlink($src);
}
-
+
if(! $src) {
-
+
$old_address = ((x($_REQUEST,'old_address')) ? $_REQUEST['old_address'] : '');
-
+
if(! $old_address) {
- logger('mod_import: nothing to import.');
+ logger('Nothing to import.');
notice( t('Nothing to import.') . EOL);
return;
}
-
+
$email = ((x($_REQUEST,'email')) ? $_REQUEST['email'] : '');
$password = ((x($_REQUEST,'password')) ? $_REQUEST['password'] : '');
-
+
$year = ((x($_REQUEST,'year')) ? $_REQUEST['year'] : '');
-
+
$channelname = substr($old_address,0,strpos($old_address,'@'));
$servername = substr($old_address,strpos($old_address,'@')+1);
-
+
$scheme = 'https://';
$api_path = '/api/red/channel/export/items?f=&channel=' . $channelname . '&year=' . intval($year);
$binary = false;
@@ -64,68 +70,66 @@ class Import_items extends \Zotlabs\Web\Controller {
$data = $ret['body'];
else
notice( t('Unable to download data from old server') . EOL);
-
}
-
+
if(! $data) {
- logger('mod_import: empty file.');
+ logger('Empty file.');
notice( t('Imported file is empty.') . EOL);
return;
}
-
- $data = json_decode($data,true);
-
- // logger('import: data: ' . print_r($data,true));
- // print_r($data);
-
+
+ $data = json_decode($data, true);
+
+ //logger('import: data: ' . print_r($data,true));
+ //print_r($data);
+
if(! is_array($data))
return;
-
+
if(array_key_exists('compatibility',$data) && array_key_exists('database',$data['compatibility'])) {
$v1 = substr($data['compatibility']['database'],-4);
$v2 = substr(DB_UPDATE_VERSION,-4);
if($v2 > $v1) {
- $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
- notice($t);
+ $t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
+ notice($t . EOL);
}
}
-
+
$channel = \App::get_channel();
-
-
+
if(array_key_exists('item',$data) && $data['item']) {
import_items($channel,$data['item'],false,((array_key_exists('relocate',$data)) ? $data['relocate'] : null));
}
-
+
if(array_key_exists('item_id',$data) && $data['item_id']) {
import_item_ids($channel,$data['item_id']);
}
-
+
info( t('Import completed') . EOL);
- return;
}
-
-
-
-
+
+
+ /**
+ * @brief Generate item import page.
+ *
+ * @return string with parsed HTML.
+ */
function get() {
-
+
if(! local_channel()) {
notice( t('Permission denied') . EOL);
return login();
}
-
- $o = replace_macros(get_markup_template('item_import.tpl'),array(
+
+ $o = replace_macros(get_markup_template('item_import.tpl'), array(
'$title' => t('Import Items'),
'$desc' => t('Use this form to import existing posts and content from an export file.'),
'$label_filename' => t('File to Upload'),
+ '$form_security_token' => get_form_security_token('import_items'),
'$submit' => t('Submit')
));
-
+
return $o;
-
}
-
-
-
+
}
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 4725ecb38..71f410b2a 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -471,34 +471,16 @@ class Item extends \Zotlabs\Web\Controller {
if(! $mimetype)
$mimetype = 'text/bbcode';
+
+ $execflag = ((intval($uid) == intval($profile_uid)
+ && ($channel['channel_pageflags'] & PAGE_ALLOWCODE)) ? true : false);
+
if($preview) {
- $body = z_input_filter($profile_uid,$body,$mimetype);
+ $body = z_input_filter($body,$mimetype,$execflag);
}
-
// Verify ability to use html or php!!!
- $execflag = false;
-
- if($mimetype !== 'text/bbcode') {
- $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval($profile_uid)
- );
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- if($uid && (get_account_id() == $z[0]['account_id'])) {
- $execflag = true;
- }
- else {
- notice( t('Executable content type not permitted to this channel.') . EOL);
- if($api_source)
- return ( [ 'success' => false, 'message' => 'forbidden content type' ] );
- if(x($_REQUEST,'return'))
- goaway(z_root() . "/" . $return_path );
- killme();
- }
- }
- }
-
$gacl = $acl->get();
$str_contact_allow = $gacl['allow_cid'];
$str_group_allow = $gacl['allow_gid'];
@@ -862,18 +844,6 @@ class Item extends \Zotlabs\Web\Controller {
if(mb_strlen($datarray['title']) > 255)
$datarray['title'] = mb_substr($datarray['title'],0,255);
- if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
-
- $datarray['body'] = trim(z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']));
-
- if($uid) {
- if($channel['channel_hash'] === $datarray['author_xchan']) {
- $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
- $datarray['item_verified'] = 1;
- }
- }
- }
-
if($webpage) {
Zlib\IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
(($pagetitle) ? $pagetitle : substr($datarray['mid'],0,16)),true);
diff --git a/Zotlabs/Module/Layouts.php b/Zotlabs/Module/Layouts.php
index c07f65ce1..34d754029 100644
--- a/Zotlabs/Module/Layouts.php
+++ b/Zotlabs/Module/Layouts.php
@@ -125,6 +125,7 @@ class Layouts extends \Zotlabs\Web\Controller {
'hide_weblink' => true,
'hide_attach' => true,
'hide_preview' => true,
+ 'disable_comments' => true,
'ptlabel' => t('Layout Name'),
'profile_uid' => intval($owner),
'expanded' => true,
diff --git a/Zotlabs/Module/Lockview.php b/Zotlabs/Module/Lockview.php
index fc7d5c7c8..466d16997 100644
--- a/Zotlabs/Module/Lockview.php
+++ b/Zotlabs/Module/Lockview.php
@@ -72,7 +72,7 @@ class Lockview extends \Zotlabs\Web\Controller {
}
if($uid != local_channel()) {
- echo '<li>' . t('Remote privacy information not available.') . '</li>';
+ echo '<div class="dropdown-item">' . t('Remote privacy information not available.') . '</div>';
killme();
}
@@ -84,7 +84,7 @@ class Lockview extends \Zotlabs\Web\Controller {
// as unknown specific recipients. The sender will have the visibility list and will fall through to the
// next section.
- echo '<li>' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</li>';
+ echo '<div class="dropdown-item">' . translate_scope((! $item['public_policy']) ? 'specific' : $item['public_policy']) . '</div>';
killme();
}
@@ -93,7 +93,7 @@ class Lockview extends \Zotlabs\Web\Controller {
$deny_users = expand_acl($item['deny_cid']);
$deny_groups = expand_acl($item['deny_gid']);
- $o = '<li>' . t('Visible to:') . '</li>';
+ $o = '<div class="dropdown-item">' . t('Visible to:') . '</div>';
$l = array();
stringify_array_elms($allowed_groups,true);
@@ -114,24 +114,24 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></li>';
+ $l[] = '<div class="dropdown-item"><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></div>';
}
if(count($allowed_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b>' . $rr['gname'] . '</b></li>';
+ $l[] = '<div class="dropdown-item"><b>' . $rr['gname'] . '</b></div>';
}
if(count($allowed_users)) {
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li>' . $rr['xchan_name'] . '</li>';
+ $l[] = '<div class="dropdown-item">' . $rr['xchan_name'] . '</div>';
if($atokens) {
foreach($atokens as $at) {
if(in_array("'" . $at['xchan_hash'] . "'",$allowed_users)) {
- $l[] = '<li>' . $at['xchan_name'] . '</li>';
+ $l[] = '<div class="dropdown-item">' . $at['xchan_name'] . '</div>';
}
}
}
@@ -150,7 +150,7 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></li>';
+ $l[] = '<div class="dropdown-item"><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></div>';
}
@@ -159,18 +159,18 @@ class Lockview extends \Zotlabs\Web\Controller {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><b><strike>' . $rr['gname'] . '</strike></b></li>';
+ $l[] = '<div class="dropdown-item"><b><strike>' . $rr['gname'] . '</strike></b></div>';
}
if(count($deny_users)) {
$r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
if($r)
foreach($r as $rr)
- $l[] = '<li><strike>' . $rr['xchan_name'] . '</strike></li>';
+ $l[] = '<div class="dropdown-item"><strike>' . $rr['xchan_name'] . '</strike></div>';
if($atokens) {
foreach($atokens as $at) {
if(in_array("'" . $at['xchan_hash'] . "'",$deny_users)) {
- $l[] = '<li><strike>' . $at['xchan_name'] . '</strike></li>';
+ $l[] = '<div class="dropdown-item"><strike>' . $at['xchan_name'] . '</strike></div>';
}
}
}
diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php
index 459ce5acf..2fb89fed5 100644
--- a/Zotlabs/Module/Mail.php
+++ b/Zotlabs/Module/Mail.php
@@ -296,7 +296,9 @@ class Mail extends \Zotlabs\Web\Controller {
return $o;
}
-
+
+ $direct_mid = 0;
+
switch(argv(1)) {
case 'combined':
$mailbox = 'combined';
@@ -309,12 +311,22 @@ class Mail extends \Zotlabs\Web\Controller {
break;
default:
$mailbox = 'combined';
+
+ // notifications direct to mail/nn
+
+ if(intval(argv(1)))
+ $direct_mid = intval(argv(1));
break;
}
+
$last_message = private_messages_list(local_channel(), $mailbox, 0, 1);
-
+
$mid = ((argc() > 2) && (intval(argv(2)))) ? argv(2) : $last_message[0]['id'];
+
+ if($direct_mid)
+ $mid = $direct_mid;
+
$plaintext = true;
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 8263420b6..1c7c70019 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -118,8 +118,8 @@ class Network extends \Zotlabs\Web\Controller {
$cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
$firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0);
$file = ((x($_GET,'file')) ? $_GET['file'] : '');
-
-
+ $xchan = ((x($_GET,'xchan')) ? $_GET['xchan'] : '');
+
$deftag = '';
if(x($_GET,'search') || x($_GET,'file'))
@@ -257,6 +257,26 @@ class Network extends \Zotlabs\Web\Controller {
goaway(z_root() . '/network');
}
}
+ elseif($xchan) {
+ $r = q("select * from xchan where xchan_hash = '%s'",
+ dbesc($xchan)
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_channel()) . " AND ( author_xchan = '" . dbesc($xchan) . "' or owner_xchan = '" . dbesc($xchan) . "' ) $item_normal ) ";
+ $title = replace_macros(get_markup_template("section_title.tpl"),array(
+ '$title' => '<a href="' . zid($r[0]['xchan_url']) . '" ><img src="' . zid($r[0]['xchan_photo_s']) . '" alt="' . urlencode($r[0]['xchan_name']) . '" /></a> <a href="' . zid($r[0]['xchan_url']) . '" >' . $r[0]['xchan_name'] . '</a>'
+ ));
+ $o = $tabs;
+ $o .= $title;
+ $o .= $status_editor;
+
+ }
+ else {
+ notice( t('Invalid channel.') . EOL);
+ goaway(z_root() . '/network');
+ }
+
+ }
if(x($category)) {
$sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
@@ -302,6 +322,7 @@ class Network extends \Zotlabs\Web\Controller {
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($search) ? $search : ''),
+ '$xchan' => $xchan,
'$order' => $order,
'$file' => $file,
'$cats' => $category,
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 582174d0e..d993c481e 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -15,13 +15,10 @@ class Photos extends \Zotlabs\Web\Controller {
function init() {
-
if(observer_prohibited()) {
return;
}
- $o = '';
-
if(argc() > 1) {
$nick = argv(1);
@@ -54,7 +51,6 @@ class Photos extends \Zotlabs\Web\Controller {
logger('mod-photos: photos_post: begin' , LOGGER_DEBUG);
-
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
@@ -92,14 +88,9 @@ class Photos extends \Zotlabs\Web\Controller {
if((argc() > 3) && (argv(2) === 'album')) {
- $album = hex2bin(argv(3));
-
- if($album === t('Profile Photos')) {
- // not allowed
- goaway(z_root() . '/' . $_SESSION['photo_return']);
- }
-
- if(! photos_album_exists($page_owner_uid,$album)) {
+ $album = argv(3);
+
+ if(! photos_album_exists($page_owner_uid, get_observer_hash(), $album)) {
notice( t('Album not found.') . EOL);
goaway(z_root() . '/' . $_SESSION['photo_return']);
}
@@ -121,7 +112,7 @@ class Photos extends \Zotlabs\Web\Controller {
$folder_hash = '';
- $r = q("select * from attach where is_dir = 1 and uid = %d and filename = '%s'",
+ $r = q("select * from attach where is_dir = 1 and uid = %d and hash = '%s'",
intval($page_owner_uid),
dbesc($album)
);
@@ -129,14 +120,7 @@ class Photos extends \Zotlabs\Web\Controller {
notice( t('Album not found.') . EOL);
return;
}
- if(count($r) > 1) {
- notice( t('Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager') . EOL);
- return;
- }
- else {
- $folder_hash = $r[0]['hash'];
- }
-
+ $folder_hash = $r[0]['hash'];
$res = array();
@@ -468,7 +452,7 @@ class Photos extends \Zotlabs\Web\Controller {
* default post action - upload a photo
*/
- $channel = \App::$data['channel'];
+ $channel = \App::$data['channel'];
$observer = \App::$data['observer'];
$_REQUEST['source'] = 'photos';
@@ -485,12 +469,10 @@ class Photos extends \Zotlabs\Web\Controller {
if(! $r['success']) {
notice($r['message'] . EOL);
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
}
-
- if($_REQUEST['newalbum'])
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($_REQUEST['newalbum']));
- else
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex(datetime_convert('UTC',date_default_timezone_get(),'now', 'Y')));
+
+ goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $r['data']['folder']);
}
@@ -569,7 +551,9 @@ class Photos extends \Zotlabs\Web\Controller {
return;
}
- $sql_extra = permissions_sql($owner_uid);
+ $sql_item = item_permissions_sql($owner_uid,get_observer_hash());
+ $sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo');
+ $sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach');
$o = "";
@@ -579,7 +563,7 @@ class Photos extends \Zotlabs\Web\Controller {
// tabs
$_is_owner = (local_channel() && (local_channel() == $owner_uid));
- $o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
+ //$o .= profile_tabs($a,$_is_owner, \App::$data['channel']['channel_address']);
/**
* Display upload form
@@ -628,8 +612,14 @@ class Photos extends \Zotlabs\Web\Controller {
if(! $aclselect) {
$aclselect = '<input id="group_allow" type="hidden" name="allow_gid[]" value="" /><input id="contact_allow" type="hidden" name="allow_cid[]" value="" /><input id="group_deny" type="hidden" name="deny_gid[]" value="" /><input id="contact_deny" type="hidden" name="deny_cid[]" value="" />';
}
-
- $selname = (($datum) ? hex2bin($datum) : '');
+
+ $selname = '';
+
+ if($datum) {
+ $h = attach_by_hash_nodata($datum,get_observer_hash());
+ $selname = $h['data']['display_path'];
+ }
+
$albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
@@ -680,29 +670,13 @@ class Photos extends \Zotlabs\Web\Controller {
if($datatype === 'album') {
- if(strlen($datum)) {
- if((strlen($datum) & 1) || (! ctype_xdigit($datum))) {
- notice( t('Album name could not be decoded') . EOL);
- logger('mod_photos: illegal album encoding: ' . $datum);
- $datum = '';
- goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
- }
- }
-
- $album = (($datum) ? hex2bin($datum) : '');
-
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- //check if the album exists and if we have perms
- $r = q("SELECT album FROM photo WHERE uid = %d AND album = '%s' and is_nsfw = %d $sql_extra LIMIT 1",
- intval($owner_uid),
- dbesc($album),
- intval($unsafe)
- );
-
- if($r) {
+ if($x = photos_album_exists($owner_uid, get_observer_hash(), $datum)) {
\App::set_pager_itemspage(60);
- } else {
+ $album = $x['display_path'];
+ }
+ else {
goaway(z_root() . '/photos/' . \App::$data['channel']['channel_address']);
}
@@ -712,26 +686,26 @@ class Photos extends \Zotlabs\Web\Controller {
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
+ (SELECT resource_id, max(imgscale) imgscale FROM photo left join attach on folder = '%s' and photo.resource_id = attach.hash WHERE attach.uid = %d AND imgscale <= 4 AND photo_usage IN ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
ORDER BY created $order LIMIT %d OFFSET %d",
+ dbesc($datum),
intval($owner_uid),
- dbesc($album),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE),
intval($unsafe),
intval(\App::$pager['itemspage']),
intval(\App::$pager['start'])
);
-
- //edit album name
+
+ // edit album name
$album_edit = null;
- if(($album !== t('Profile Photos')) && ($album !== 'Profile Photos') && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
- if($can_post) {
- $album_e = $album;
- $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
+
+ if($can_post) {
+ $album_e = $album;
+ $albums = ((array_key_exists('albums', \App::$data)) ? \App::$data['albums'] : photos_albums_list(\App::$data['channel'],\App::$data['observer']));
- // @fixme - syncronise actions with DAV
+ // @fixme - syncronise actions with DAV
// $edit_tpl = get_markup_template('album_edit.tpl');
// $album_edit = replace_macros($edit_tpl,array(
@@ -745,13 +719,12 @@ class Photos extends \Zotlabs\Web\Controller {
// '$dropsubmit' => t('Delete Album')
// ));
- }
}
if($_GET['order'] === 'posted')
- $order = array(t('Show Newest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album));
+ $order = array(t('Show Newest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $datum);
else
- $order = array(t('Show Oldest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($album) . '?f=&order=posted');
+ $order = array(t('Show Oldest First'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $datum . '?f=&order=posted');
$photos = array();
if(count($r)) {
@@ -805,10 +778,10 @@ class Photos extends \Zotlabs\Web\Controller {
$o .= replace_macros($tpl, array(
'$photos' => $photos,
'$album' => $album,
- '$album_id' => bin2hex($album),
+ '$album_id' => $datum,
'$album_edit' => array(t('Edit Album'), $album_edit),
'$can_post' => $can_post,
- '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/upload/' . bin2hex($album)),
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/upload/' . $datum),
'$order' => $order,
'$upload_form' => $upload_form,
'$usage' => $usage_message
@@ -822,8 +795,6 @@ class Photos extends \Zotlabs\Web\Controller {
killme();
}
- // $o .= paginate($a);
-
return $o;
}
@@ -836,6 +807,11 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
+ $x = q("select folder from attach where hash = '%s' and uid = %d $sql_attach limit 1",
+ dbesc($datum),
+ intval($owner_uid)
+ );
+
// fetch image, item containing image, then comments
$ph = q("SELECT id,aid,uid,xchan,resource_id,created,edited,title,description,album,filename,mimetype,height,width,filesize,imgscale,photo_usage,is_nsfw,allow_cid,allow_gid,deny_cid,deny_gid FROM photo WHERE uid = %d AND resource_id = '%s'
@@ -844,7 +820,7 @@ class Photos extends \Zotlabs\Web\Controller {
dbesc($datum)
);
- if(! $ph) {
+ if(! ($ph && $x)) {
/* Check again - this time without specifying permissions */
@@ -869,16 +845,16 @@ class Photos extends \Zotlabs\Web\Controller {
else
$order = 'DESC';
-
- $prvnxt = q("SELECT resource_id FROM photo WHERE album = '%s' AND uid = %d AND imgscale = 0
- $sql_extra ORDER BY created $order ",
- dbesc($ph[0]['album']),
+
+ $prvnxt = q("SELECT hash FROM attach WHERE folder = '%s' AND uid = %d AND is_photo = 1
+ $sql_attach ORDER BY created $order ",
+ dbesc($x[0]['folder']),
intval($owner_uid)
);
-
+
if(count($prvnxt)) {
for($z = 0; $z < count($prvnxt); $z++) {
- if($prvnxt[$z]['resource_id'] == $ph[0]['resource_id']) {
+ if($prvnxt[$z]['hash'] == $ph[0]['resource_id']) {
$prv = $z - 1;
$nxt = $z + 1;
if($prv < 0)
@@ -889,8 +865,8 @@ class Photos extends \Zotlabs\Web\Controller {
}
}
- $prevlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- $nextlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $prevlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['hash'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $nextlink = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['hash'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
}
@@ -907,7 +883,7 @@ class Photos extends \Zotlabs\Web\Controller {
}
}
- $album_link = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($ph[0]['album']);
+ $album_link = z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . $x[0]['folder'];
$tools = Null;
$lock = Null;
@@ -947,7 +923,7 @@ class Photos extends \Zotlabs\Web\Controller {
// Do we have an item for this photo?
$linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
- $sql_extra LIMIT 1",
+ $sql_item LIMIT 1",
dbesc($datum)
);
@@ -962,7 +938,7 @@ class Photos extends \Zotlabs\Web\Controller {
$item_normal = item_normal();
$r = q("select * from item where parent_mid = '%s'
- $item_normal and uid = %d $sql_extra ",
+ $item_normal and uid = %d $sql_item ",
dbesc($link_item['mid']),
intval($link_item['uid'])
@@ -1008,13 +984,6 @@ class Photos extends \Zotlabs\Web\Controller {
$edit = null;
if($can_post) {
- $m = q("select folder from attach where hash = '%s' and uid = %d limit 1",
- dbesc($ph[0]['resource_id']),
- intval($ph[0]['uid'])
- );
- if($m)
- $album_hash = $m[0]['folder'];
-
$album_e = $ph[0]['album'];
$caption_e = $ph[0]['description'];
$aclselect_e = (($_is_owner) ? populate_acl($ph[0], true, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_storage')) : '');
@@ -1024,35 +993,35 @@ class Photos extends \Zotlabs\Web\Controller {
$folder_list = attach_folder_select_list($ph[0]['uid']);
- $edit = array(
+ $edit = [
'edit' => t('Edit photo'),
'id' => $link_item['id'],
- 'rotatecw' => t('Rotate CW (right)'),
- 'rotateccw' => t('Rotate CCW (left)'),
- 'albums' => $albums['albums'],
- 'album' => $album_e,
- 'album_select' => [ 'move_to_album', t('Move photo to album'), $album_hash, '', $folder_list ],
- 'newalbum_label' => t('Enter a new album name'),
+ 'rotatecw' => t('Rotate CW (right)'),
+ 'rotateccw' => t('Rotate CCW (left)'),
+ 'albums' => $albums['albums'],
+ 'album' => $album_e,
+ 'album_select' => [ 'move_to_album', t('Move photo to album'), $x[0]['folder'], '', $folder_list ],
+ 'newalbum_label' => t('Enter a new album name'),
'newalbum_placeholder' => t('or select an existing one (doubleclick)'),
- 'nickname' => \App::$data['channel']['channel_address'],
- 'resource_id' => $ph[0]['resource_id'],
- 'capt_label' => t('Caption'),
- 'caption' => $caption_e,
- 'tag_label' => t('Add a Tag'),
- 'permissions' => t('Permissions'),
- 'aclselect' => $aclselect_e,
- 'allow_cid' => acl2json($ph[0]['allow_cid']),
- 'allow_gid' => acl2json($ph[0]['allow_gid']),
- 'deny_cid' => acl2json($ph[0]['deny_cid']),
- 'deny_gid' => acl2json($ph[0]['deny_gid']),
- 'lockstate' => $lockstate[0],
- 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
- 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
- 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
- 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
- 'submit' => t('Submit'),
- 'delete' => t('Delete Photo')
- );
+ 'nickname' => \App::$data['channel']['channel_address'],
+ 'resource_id' => $ph[0]['resource_id'],
+ 'capt_label' => t('Caption'),
+ 'caption' => $caption_e,
+ 'tag_label' => t('Add a Tag'),
+ 'permissions' => t('Permissions'),
+ 'aclselect' => $aclselect_e,
+ 'allow_cid' => acl2json($ph[0]['allow_cid']),
+ 'allow_gid' => acl2json($ph[0]['allow_gid']),
+ 'deny_cid' => acl2json($ph[0]['deny_cid']),
+ 'deny_gid' => acl2json($ph[0]['deny_gid']),
+ 'lockstate' => $lockstate[0],
+ 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com'),
+ 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
+ 'adult_enabled' => feature_enabled($owner_uid,'adult_photo_flagging'),
+ 'adult' => array('adult',t('Flag as adult in album view'), intval($ph[0]['is_nsfw']),''),
+ 'submit' => t('Submit'),
+ 'delete' => t('Delete Photo')
+ ];
}
if(count($linked_items)) {
@@ -1066,13 +1035,13 @@ class Photos extends \Zotlabs\Web\Controller {
$likebuttons = '';
if($can_post || $can_comment) {
- $likebuttons = array(
- 'id' => $link_item['id'],
+ $likebuttons = [
+ 'id' => $link_item['id'],
'likethis' => t("I like this \x28toggle\x29"),
- 'nolike' => t("I don't like this \x28toggle\x29"),
- 'share' => t('Share'),
- 'wait' => t('Please wait')
- );
+ 'nolike' => t("I don't like this \x28toggle\x29"),
+ 'share' => t('Share'),
+ 'wait' => t('Please wait')
+ ];
}
$comments = '';
@@ -1277,25 +1246,13 @@ class Photos extends \Zotlabs\Web\Controller {
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$cmd) . '" title="oembed" />' . "\r\n";
- /*
- $r = q("SELECT resource_id, max(imgscale) AS imgscale FROM photo WHERE uid = %d
- and photo_usage in ( %d, %d ) and is_nsfw = %d $sql_extra GROUP BY resource_id",
- intval(\App::$data['channel']['channel_id']),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- intval($unsafe)
- );
- if($r) {
- \App::set_pager_total(count($r));
- \App::set_pager_itemspage(60);
- }
- */
\App::set_pager_itemspage(60);
- $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.album, p.imgscale, p.created FROM photo p
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.album, p.imgscale, p.created, p.display_path
+ FROM photo p
INNER JOIN ( SELECT resource_id, max(imgscale) imgscale FROM photo
- WHERE uid = %d AND photo_usage IN ( %d, %d )
+ WHERE photo.uid = %d AND photo_usage IN ( %d, %d )
AND is_nsfw = %d $sql_extra group by resource_id ) ph
ON (p.resource_id = ph.resource_id and p.imgscale = ph.imgscale)
ORDER by p.created DESC LIMIT %d OFFSET %d",
@@ -1313,21 +1270,19 @@ class Photos extends \Zotlabs\Web\Controller {
if($r) {
$twist = 'rotright';
foreach($r as $rr) {
+
+ if(! attach_can_view_folder(\App::$data['channel']['channel_id'],get_observer_hash(),$rr['resource_id']))
+ continue;
+
if($twist == 'rotright')
$twist = 'rotleft';
else
$twist = 'rotright';
$ext = $phototypes[$rr['mimetype']];
- if(\App::get_template_engine() === 'internal') {
- $alt_e = template_escape($rr['filename']);
- $name_e = template_escape($rr['album']);
- }
- else {
- $alt_e = $rr['filename'];
- $name_e = $rr['album'];
- }
-
+ $alt_e = $rr['filename'];
+ $name_e = dirname($rr['display_path']);
+
$photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
@@ -1336,9 +1291,7 @@ class Photos extends \Zotlabs\Web\Controller {
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['imgscale']) == 6) ? 4 : $rr['imgscale']) . '.' . $ext,
'alt' => $alt_e,
'album' => array(
- 'link' => z_root() . '/photos/' . \App::$data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
'name' => $name_e,
- 'alt' => t('View Album'),
),
);
diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php
index 0bc23952b..ab349b05d 100644
--- a/Zotlabs/Module/Profile.php
+++ b/Zotlabs/Module/Profile.php
@@ -37,8 +37,21 @@ class Profile extends \Zotlabs\Web\Controller {
$profile = $r[0]['profile_guid'];
}
- \App::$page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . z_root() . '/feed/' . $which .'" />' . "\r\n" ;
-
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Posts and comments'),
+ 'href' => z_root() . '/feed/' . $which
+ ]);
+
+ head_add_link( [
+ 'rel' => 'alternate',
+ 'type' => 'application/atom+xml',
+ 'title' => t('Only posts'),
+ 'href' => z_root() . '/feed/' . $which . '?f=&top=1'
+ ]);
+
+
if(! $profile) {
$x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
dbesc(argv(1))
@@ -88,7 +101,7 @@ class Profile extends \Zotlabs\Web\Controller {
return;
}
- $o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o .= profile_tabs($a, $is_owner, \App::$profile['channel_address']);
\App::$page['htmlhead'] .= "\r\n" . '<link rel="alternate" type="application/json+oembed" href="' . z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string) . '" title="oembed" />' . "\r\n";
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index 29a239f4d..e8f0e5186 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -108,11 +108,13 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$aid = get_account_id();
$p = [
- 'aid' => $aid,
- 'uid' => local_channel(),
- 'resource_id' => $base_image['resource_id'],
- 'filename' => $base_image['filename'],
- 'album' => t('Profile Photos')
+ 'aid' => $aid,
+ 'uid' => local_channel(),
+ 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'],
+ 'album' => t('Profile Photos'),
+ 'os_path' => $base_image['os_path'],
+ 'display_path' => $base_image['display_path']
];
$p['imgscale'] = PHOTO_RES_PROFILE_300;
@@ -183,6 +185,10 @@ class Profile_photo extends \Zotlabs\Web\Controller {
photo_profile_setperms(local_channel(),$base_image['resource_id'],$_REQUEST['profile']);
+ $sync = attach_export_data($channel,$base_image['resource_id']);
+ if($sync)
+ build_sync_packet($channel['channel_id'],array('file' => array($sync)));
+
// Similarly, tell the nav bar to bypass the cache and update the avater image.
$_SESSION['reload_avatar'] = true;
@@ -341,6 +347,11 @@ class Profile_photo extends \Zotlabs\Web\Controller {
photo_profile_setperms(local_channel(),$resource_id,$_REQUEST['profile']);
+ $sync = attach_export_data($channel,$resource_id);
+ if($sync)
+ build_sync_packet($channel['channel_id'],array('file' => array($sync)));
+
+
\Zotlabs\Daemon\Master::Summon(array('Directory',local_channel()));
goaway(z_root() . '/profiles');
}
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index 32e888f14..f6e8b11ed 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -317,8 +317,10 @@ class Profiles extends \Zotlabs\Web\Controller {
$hide_friends = ((intval($_POST['hide_friends'])) ? 1: 0);
+// start fresh and create a new vcard. TODO: preserve the original guid or whatever else needs saving
+// $orig_vcard = (($orig[0]['profile_vcard']) ? \Sabre\VObject\Reader::read($orig[0]['profile_vcard']) : null);
- $orig_vcard = (($orig[0]['profile_vcard']) ? \Sabre\VObject\Reader::read($orig[0]['profile_vcard']) : null);
+ $orig_vcard = null;
$channel = \App::get_channel();
@@ -330,13 +332,7 @@ class Profiles extends \Zotlabs\Web\Controller {
'photo' => $channel['xchan_photo_l'],
'adr' => [],
'adr_type' => [ $default_vcard_cat ],
- 'tel' => [],
- 'tel_type' => [ $default_vcard_cat ],
- 'email' => [],
- 'email_type' => [ $default_vcard_cat ],
- 'impp' => [],
- 'impp_type' => [ $default_vcard_cat ],
- 'url' => [],
+ 'url' => [ $homepage ],
'url_type' => [ $default_vcard_cat ]
];
@@ -350,9 +346,12 @@ class Profiles extends \Zotlabs\Web\Controller {
6 => $country_name
];
-
$profile_vcard = update_vcard($defcard,$orig_vcard);
+ $orig_vcard = \Sabre\VObject\Reader::read($profile_vcard);
+
+ $profile_vcard = update_vcard($_REQUEST,$orig_vcard);
+
require_once('include/text.php');
linkify_tags($a, $likes, local_channel());
@@ -700,6 +699,10 @@ class Profiles extends \Zotlabs\Web\Controller {
}
//logger('extra_fields: ' . print_r($extra_fields,true));
+
+ $vc = $r[0]['profile_vcard'];
+ $vctmp = (($vc) ? \Sabre\VObject\Reader::read($vc) : null);
+ $vcard = (($vctmp) ? get_vcard_array($vctmp,$r[0]['id']) : [] );
$f = get_config('system','birthday_input_format');
if(! $f)
@@ -717,6 +720,7 @@ class Profiles extends \Zotlabs\Web\Controller {
. get_form_security_token("profile_drop"),
'$fields' => $fields,
+ '$vcard' => $vcard,
'$guid' => $r[0]['profile_guid'],
'$banner' => t('Edit Profile Details'),
'$submit' => t('Submit'),
@@ -776,11 +780,28 @@ class Profiles extends \Zotlabs\Web\Controller {
'$film' => array('film', t('Film/Dance/Culture/Entertainment'), $r[0]['film']),
'$interest' => array('interest', t('Hobbies/Interests'), $r[0]['interest']),
'$romance' => array('romance',t('Love/Romance'), $r[0]['romance']),
- '$work' => array('work', t('Work/Employment'), $r[0]['employment']),
+ '$employ' => array('work', t('Work/Employment'), $r[0]['employment']),
'$education' => array('education', t('School/Education'), $r[0]['education']),
'$contact' => array('contact', t('Contact information and social networks'), $r[0]['contact']),
'$channels' => array('channels', t('My other channels'), $r[0]['channels']),
'$extra_fields' => $extra_fields,
+ '$comms' => t('Communications'),
+ '$tel_label' => t('Phone'),
+ '$email_label' => t('Email'),
+ '$impp_label' => t('Instant messenger'),
+ '$url_label' => t('Website'),
+ '$adr_label' => t('Address'),
+ '$note_label' => t('Note'),
+ '$mobile' => t('Mobile'),
+ '$home' => t('Home'),
+ '$work' => t('Work'),
+ '$other' => t('Other'),
+ '$add_card' => t('Add Contact'),
+ '$add_field' => t('Add Field'),
+ '$create' => t('Create'),
+ '$update' => t('Update'),
+ '$delete' => t('Delete'),
+ '$cancel' => t('Cancel'),
));
$arr = array('profile' => $r[0], 'entry' => $o);
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
index 6c4d479d4..46210abb1 100644
--- a/Zotlabs/Module/Pubstream.php
+++ b/Zotlabs/Module/Pubstream.php
@@ -57,6 +57,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
'$static' => $static,
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => '',
+ '$xchan' => '',
'$order' => 'comment',
'$file' => '',
'$cats' => '',
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
index 89eaa4ffa..aacdc88e7 100644
--- a/Zotlabs/Module/Search.php
+++ b/Zotlabs/Module/Search.php
@@ -130,6 +130,7 @@ class Search extends \Zotlabs\Web\Controller {
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => ((\App::$pager['page'] != 1) ? \App::$pager['page'] : 1),
'$search' => (($tag) ? urlencode('#') : '') . $search,
+ '$xchan' => '',
'$order' => '',
'$file' => '',
'$cats' => '',
diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php
index 5b9cfdaca..56a7d0d8e 100644
--- a/Zotlabs/Module/Settings/Channel.php
+++ b/Zotlabs/Module/Settings/Channel.php
@@ -277,8 +277,8 @@ class Channel {
if($email_changed && \App::$config['system']['register_policy'] == REGISTER_VERIFY) {
// FIXME - set to un-verified, blocked and redirect to logout
- // Why? Are we verifying people or email addresses?
-
+ // Q: Why? Are we verifying people or email addresses?
+ // A: the policy is to verify email addresses
}
goaway(z_root() . '/settings' );
@@ -575,7 +575,7 @@ class Channel {
'$removeme' => t('Remove Channel'),
'$removechannel' => t('Remove this channel.'),
'$firefoxshare' => t('Firefox Share $Projectname provider'),
- '$cal_first_day' => array('first_day', t('Start calendar week on monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
+ '$cal_first_day' => array('first_day', t('Start calendar week on Monday'), ((get_pconfig(local_channel(),'system','cal_first_day')) ? 1 : ''), '', $yes_no),
));
call_hooks('settings_form',$o);
diff --git a/Zotlabs/Module/Settings/Display.php b/Zotlabs/Module/Settings/Display.php
index 67cecf1f5..eae44e82c 100644
--- a/Zotlabs/Module/Settings/Display.php
+++ b/Zotlabs/Module/Settings/Display.php
@@ -65,7 +65,7 @@ class Display {
set_pconfig(local_channel(),'system','manual_conversation_update', $manual_update);
$newschema = '';
- if($theme == $existing_theme){
+ if($theme){
// call theme_post only if theme has not been changed
if( ($themeconfigfile = $this->get_theme_config_file($theme)) != null){
require_once($themeconfigfile);
@@ -130,12 +130,20 @@ class Display {
if($allowed_themes) {
foreach($allowed_themes as $th) {
$f = $th;
+
+ $info = get_theme_info($th);
+ $compatible = check_plugin_versions($info);
+ if(!$compatible) {
+ $mobile_themes[$f] = $themes[$f] = sprintf(t('%s - (Incompatible)'), $f);
+ continue;
+ }
+
$is_experimental = file_exists('view/theme/' . $th . '/experimental');
$unsupported = file_exists('view/theme/' . $th . '/unsupported');
$is_mobile = file_exists('view/theme/' . $th . '/mobile');
$is_library = file_exists('view/theme/'. $th . '/library');
- $mobile_themes["---"] = t("No special theme for mobile devices");
-
+ $mobile_themes['---'] = t("No special theme for mobile devices");
+
if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
$theme_name = (($is_experimental) ? sprintf(t('%s - (Experimental)'), $f) : $f);
if (! $is_library) {
@@ -147,7 +155,6 @@ class Display {
}
}
}
-
}
}
diff --git a/Zotlabs/Module/Settings/Permcats.php b/Zotlabs/Module/Settings/Permcats.php
index 35d533196..336f69653 100644
--- a/Zotlabs/Module/Settings/Permcats.php
+++ b/Zotlabs/Module/Settings/Permcats.php
@@ -42,8 +42,6 @@ class Permcats {
function get() {
-logger('cmd: ' . \App::$cmd);
-
if(! local_channel())
return;
@@ -85,7 +83,7 @@ logger('cmd: ' . \App::$cmd);
if($existing[$k])
$thisperm = "1";
- $perms[] = array('perms_' . $k, $v, ((array_key_exists($k,$their_perms)) ? intval($their_perms[$k]) : ''),$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
+ $perms[] = array('perms_' . $k, $v, '',$thisperm, 1, (($checkinherited & PERMS_SPECIFIC) ? '' : '1'), '', $checkinherited);
}
@@ -114,4 +112,4 @@ logger('cmd: ' . \App::$cmd);
return $o;
}
-} \ No newline at end of file
+}
diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
index 9c688af01..593ba643f 100644
--- a/Zotlabs/Module/Setup.php
+++ b/Zotlabs/Module/Setup.php
@@ -624,7 +624,6 @@ class Setup extends \Zotlabs\Web\Controller {
* @param[out] array &$checks
*/
function check_htaccess(&$checks) {
- $a = get_app();
$status = true;
$help = '';
$ssl_error = false;
@@ -718,7 +717,6 @@ class Setup extends \Zotlabs\Web\Controller {
* @return string with parsed HTML
*/
function what_next() {
- $a = get_app();
// install the standard theme
set_config('system', 'allowed_themes', 'redbasic');
diff --git a/Zotlabs/Module/Sharedwithme.php b/Zotlabs/Module/Sharedwithme.php
index 25bc7dba3..5d6d0f7da 100644
--- a/Zotlabs/Module/Sharedwithme.php
+++ b/Zotlabs/Module/Sharedwithme.php
@@ -92,7 +92,8 @@ class Sharedwithme extends \Zotlabs\Web\Controller {
}
- $o = profile_tabs($a, $is_owner, $channel['channel_address']);
+ //$o = profile_tabs($a, $is_owner, $channel['channel_address']);
+ $o = '';
$o .= replace_macros(get_markup_template('sharedwithme.tpl'), array(
'$header' => t('Files: shared with me'),
diff --git a/Zotlabs/Module/Suggest.php b/Zotlabs/Module/Suggest.php
index 367308d90..2a69145ed 100644
--- a/Zotlabs/Module/Suggest.php
+++ b/Zotlabs/Module/Suggest.php
@@ -3,8 +3,6 @@ namespace Zotlabs\Module;
require_once('include/socgraph.php');
require_once('include/contact_widgets.php');
-require_once('include/widgets.php');
-
class Suggest extends \Zotlabs\Web\Controller {
@@ -23,7 +21,7 @@ class Suggest extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
$o = '';
if(! local_channel()) {
diff --git a/Zotlabs/Module/Update_display.php b/Zotlabs/Module/Update_display.php
index 13b04204d..b2c6a56f5 100644
--- a/Zotlabs/Module/Update_display.php
+++ b/Zotlabs/Module/Update_display.php
@@ -21,26 +21,10 @@ class Update_display extends \Zotlabs\Web\Controller {
$mod = new Display();
$text = $mod->get($profile_uid, $load);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
- // $text = preg_replace($pattern, $replace, $text);
- /*
- if(! $load) {
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
- }
- */
echo str_replace("\t",' ',$text);
echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
echo "</body></html>\r\n";
- // logger('update_display: ' . $text);
+
killme();
}
diff --git a/Zotlabs/Module/Viewconnections.php b/Zotlabs/Module/Viewconnections.php
index 4364d482a..1f9c03751 100644
--- a/Zotlabs/Module/Viewconnections.php
+++ b/Zotlabs/Module/Viewconnections.php
@@ -70,7 +70,7 @@ class Viewconnections extends \Zotlabs\Web\Controller {
foreach($r as $rr) {
- $url = chanlink_url($rr['xchan_url']);
+ $url = chanlink_hash($rr['xchan_hash']);
if($url) {
$contacts[] = array(
'id' => $rr['abook_id'],
diff --git a/Zotlabs/Module/Viewsrc.php b/Zotlabs/Module/Viewsrc.php
index fa755a3ec..cb305efc6 100644
--- a/Zotlabs/Module/Viewsrc.php
+++ b/Zotlabs/Module/Viewsrc.php
@@ -36,7 +36,9 @@ class Viewsrc extends \Zotlabs\Web\Controller {
if($r) {
if(intval($r[0]['item_obscured']))
$r[0]['body'] = crypto_unencapsulate(json_decode($r[0]['body'],true),get_config('system','prvkey'));
- $o = (($json) ? json_encode($r[0]['body']) : str_replace("\n",'<br />',$r[0]['body']));
+
+ $content = escape_tags($r[0]['body']);
+ $o = (($json) ? json_encode($content) : str_replace("\n",'<br />',$content));
}
}
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
index 46b94f091..effe92614 100644
--- a/Zotlabs/Module/Webpages.php
+++ b/Zotlabs/Module/Webpages.php
@@ -142,7 +142,8 @@ class Webpages extends \Zotlabs\Web\Controller {
$is_owner = ($uid && $uid == $owner);
- $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ $o = '';
$x = array(
'webpage' => ITEM_TYPE_WEBPAGE,
diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php
index d42c26681..a1e377e68 100644
--- a/Zotlabs/Module/Wiki.php
+++ b/Zotlabs/Module/Wiki.php
@@ -3,6 +3,7 @@
namespace Zotlabs\Module;
use \Zotlabs\Lib as Zlib;
+use \Michelf\MarkdownExtra;
require_once('include/acl_selectors.php');
require_once('include/conversation.php');
@@ -106,7 +107,8 @@ class Wiki extends \Zotlabs\Web\Controller {
}
$is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
- $o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ //$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
+ $o = '';
// Download a wiki
/*
@@ -234,18 +236,17 @@ class Wiki extends \Zotlabs\Web\Controller {
$mimeType = $p['mimeType'];
- $rawContent = (($p['mimeType'] == 'text/bbcode')
- ? htmlspecialchars_decode(json_decode($p['content']),ENT_COMPAT)
- : htmlspecialchars_decode($p['content'],ENT_COMPAT)
- );
- $content = ($p['content'] !== '' ? $rawContent : '"# New page\n"');
+ $sampleContent = (($mimeType == 'text/bbcode') ? '[h3]' . t('New page') . '[/h3]' : '### ' . t('New page'));
+
+ $content = (($p['content'] == '') ? $sampleContent : $p['content']);
+
// Render the Markdown-formatted page content in HTML
if($mimeType == 'text/bbcode') {
$renderedContent = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))), argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
}
else {
- require_once('library/markdown.php');
- $html = Zlib\NativeWikiPage::generate_toc(zidify_text(purify_html(Markdown(Zlib\NativeWikiPage::bbcode(json_decode($content))))));
+ $content = Zlib\MarkdownSoap::unescape($content);
+ $html = Zlib\NativeWikiPage::generate_toc(zidify_text(MarkdownExtra::defaultTransform(Zlib\NativeWikiPage::bbcode($content))));
$renderedContent = Zlib\NativeWikiPage::convert_links($html, argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
}
$showPageControls = $wiki_editor;
@@ -254,6 +255,7 @@ class Wiki extends \Zotlabs\Web\Controller {
goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
}
+
$wikiModalID = random_string(3);
$wikiModal = replace_macros(get_markup_template('generic_modal.tpl'), array(
@@ -296,7 +298,7 @@ class Wiki extends \Zotlabs\Web\Controller {
));
if($p['mimeType'] != 'text/bbcode')
- head_add_js('library/ace/ace.js'); // Ace Code Editor
+ head_add_js('/library/ace/ace.js'); // Ace Code Editor
return $o;
}
@@ -314,11 +316,6 @@ class Wiki extends \Zotlabs\Web\Controller {
return;
}
- if(! perm_is_allowed(\App::$profile_uid,get_observer_hash(),'write_wiki')) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
// /wiki/channel/preview
// Render mardown-formatted text in HTML for preview
if((argc() > 2) && (argv(2) === 'preview')) {
@@ -334,9 +331,12 @@ class Wiki extends \Zotlabs\Web\Controller {
$html = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))),$wikiURL);
}
else {
- require_once('library/markdown.php');
- $content = Zlib\NativeWikiPage::bbcode($content);
- $html = Zlib\NativeWikiPage::generate_toc(zidify_text(purify_html(Markdown($content))));
+ $bb = Zlib\NativeWikiPage::bbcode($content);
+ $x = new ZLib\MarkdownSoap($bb);
+ $md = $x->clean();
+ $md = ZLib\MarkdownSoap::unescape($md);
+ $html = MarkdownExtra::defaultTransform($md);
+ $html = Zlib\NativeWikiPage::generate_toc(zidify_text($html));
$html = Zlib\NativeWikiPage::convert_links($html,$wikiURL);
}
json_return_and_die(array('html' => $html, 'success' => true));
@@ -363,6 +363,14 @@ class Wiki extends \Zotlabs\Web\Controller {
if($wiki['urlName'] === '') {
notice( t('Error creating wiki. Invalid name.') . EOL);
goaway('/wiki');
+ return; //not reached
+ }
+
+ $exists = Zlib\NativeWiki::exists_by_name($owner['channel_id'], $wiki['urlName']);
+ if($exists['id']) {
+ notice( t('A wiki with this name already exists.') . EOL);
+ goaway('/wiki');
+ return; //not reached
}
// Get ACL for permissions
@@ -461,7 +469,11 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('pages' => null, 'message' => 'Permission denied.', 'success' => false));
}
- $page_list_html = widget_wiki_pages(array(
+ // @FIXME - we shouldn't invoke this if it isn't in the PDL or has been over-ridden
+
+ $x = new \Zotlabs\Widget\Wiki_pages();
+
+ $page_list_html = $x->widget(array(
'resource_id' => $resource_id,
'refresh' => true,
'channel' => argv(1)));
@@ -519,7 +531,6 @@ class Wiki extends \Zotlabs\Web\Controller {
$resource_id = $_POST['resource_id'];
$pageUrlName = $_POST['name'];
-
// Determine if observer has permission to read content
$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
@@ -528,11 +539,12 @@ class Wiki extends \Zotlabs\Web\Controller {
json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false));
}
- $historyHTML = widget_wiki_page_history(array(
+ $historyHTML = \Zotlabs\Lib\NativeWikiPage::render_page_history(array(
'resource_id' => $resource_id,
'pageUrlName' => $pageUrlName,
'permsWrite' => $perms['write']
));
+
json_return_and_die(array('historyHTML' => $historyHTML, 'message' => '', 'success' => true));
}
diff --git a/Zotlabs/Render/Comanche.php b/Zotlabs/Render/Comanche.php
index 5826063fd..5c1ca7d10 100644
--- a/Zotlabs/Render/Comanche.php
+++ b/Zotlabs/Render/Comanche.php
@@ -4,8 +4,6 @@ namespace Zotlabs\Render;
require_once('include/security.php');
require_once('include/menu.php');
-require_once('include/widgets.php');
-
class Comanche {
@@ -410,6 +408,21 @@ class Comanche {
}
}
+ $clsname = ucfirst($name);
+ $nsname = "\\Zotlabs\\Widget\\" . $clsname;
+
+ if(file_exists('Zotlabs/SiteWidget/' . $clsname . '.php'))
+ require_once('Zotlabs/SiteWidget/' . $clsname . '.php');
+ elseif(file_exists('Zotlabs/Widget/' . $clsname . '.php'))
+ require_once('Zotlabs/Widget/' . $clsname . '.php');
+ if(class_exists($nsname)) {
+ $x = new $nsname;
+ $f = 'widget';
+ if(method_exists($x,$f)) {
+ return $x->$f($vars);
+ }
+ }
+
$func = 'widget_' . trim($name);
if(! function_exists($func)) {
diff --git a/Zotlabs/Render/Theme.php b/Zotlabs/Render/Theme.php
index 9f9009d72..3a0116abe 100644
--- a/Zotlabs/Render/Theme.php
+++ b/Zotlabs/Render/Theme.php
@@ -70,9 +70,15 @@ class Theme {
$chosen_theme = $_GET['theme_preview'];
// Allow theme selection of the form 'theme_name:schema_name'
-
$themepair = explode(':', $chosen_theme);
+ // Check if $chosen_theme is compatible with core. If not fall back to default
+ $info = get_theme_info($themepair[0]);
+ $compatible = check_plugin_versions($info);
+ if(!$compatible) {
+ $chosen_theme = '';
+ }
+
if($chosen_theme && (file_exists('view/theme/' . $themepair[0] . '/css/style.css') || file_exists('view/theme/' . $themepair[0] . '/php/style.php'))) {
return($themepair);
}
@@ -125,9 +131,9 @@ class Theme {
$opts .= $schema_str;
if(file_exists('view/theme/' . $t . '/php/style.php'))
- return('view/theme/' . $t . '/php/style.pcss' . $opts);
+ return('/view/theme/' . $t . '/php/style.pcss' . $opts);
- return('view/theme/' . $t . '/css/style.css');
+ return('/view/theme/' . $t . '/css/style.css');
}
function debug() {
diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php
index a30eedba5..7162161ef 100644
--- a/Zotlabs/Storage/Browser.php
+++ b/Zotlabs/Storage/Browser.php
@@ -84,7 +84,7 @@ class Browser extends DAV\Browser\Plugin {
require_once('include/conversation.php');
require_once('include/text.php');
if ($this->auth->owner_nick) {
- $html = profile_tabs(get_app(), (($is_owner) ? true : false), $this->auth->owner_nick);
+ $html = '';
}
$files = $this->server->getPropertiesForPath($path, array(
@@ -240,9 +240,11 @@ class Browser extends DAV\Browser\Plugin {
'$nick' => $this->auth->getCurrentUser()
));
- $a = get_app();
+
+ $a = false;
+
\App::$page['content'] = $html;
- load_pdl($a);
+ load_pdl();
$current_theme = \Zotlabs\Render\Theme::current();
@@ -255,7 +257,7 @@ class Browser extends DAV\Browser\Plugin {
}
}
$this->server->httpResponse->setHeader('Content-Security-Policy', "script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'");
- construct_page($a);
+ construct_page();
}
/**
@@ -314,7 +316,16 @@ class Browser extends DAV\Browser\Plugin {
$quota['desc'] = $quotaDesc;
$quota['warning'] = ((($limit) && ((round($used / $limit, 1) * 100) >= 90)) ? t('WARNING:') : ''); // 10485760 bytes = 100MB
- $path = trim(str_replace('cloud/' . $this->auth->owner_nick, '', $path), '/');
+ // strip 'cloud/nickname', but only at the beginning of the path
+
+ $special = 'cloud/' . $this->auth->owner_nick;
+ $count = strlen($special);
+
+ if(strpos($path,$special) === 0)
+ $path = trim(substr($path,$count),'/');
+
+ $info = t('Please use DAV to upload large (video, audio) files.<br>See <a class="zrl" href="help/member/member_guide#Cloud_Desktop_Clients">Cloud Desktop Clients</a>');
+
$output .= replace_macros(get_markup_template('cloud_actionspanel.tpl'), array(
'$folder_header' => t('Create new folder'),
@@ -322,6 +333,7 @@ class Browser extends DAV\Browser\Plugin {
'$upload_header' => t('Upload file'),
'$upload_submit' => t('Upload'),
'$quota' => $quota,
+ '$info' => $info,
'$channick' => $this->auth->owner_nick,
'$aclselect' => $aclselect,
'$allow_cid' => acl2json($channel_acl['allow_cid']),
diff --git a/Zotlabs/Storage/Directory.php b/Zotlabs/Storage/Directory.php
index 5d078b04e..0ed7a3c68 100644
--- a/Zotlabs/Storage/Directory.php
+++ b/Zotlabs/Storage/Directory.php
@@ -49,7 +49,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
* @param BasicAuth &$auth_plugin
*/
public function __construct($ext_path, &$auth_plugin) {
-// $ext_path = urldecode($ext_path);
+ // $ext_path = urldecode($ext_path);
logger('directory ' . $ext_path, LOGGER_DATA);
$this->ext_path = $ext_path;
// remove "/cloud" from the beginning of the path
@@ -167,6 +167,14 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
intval($this->auth->owner_id)
);
+ $x = attach_syspaths($this->auth->owner_id,$this->folder_hash);
+
+ $y = q("update attach set display_path = '%s where hash = '%s' and uid = %d",
+ dbesc($x['path']),
+ dbesc($this->folder_hash),
+ intval($this->auth->owner_id)
+ );
+
$ch = channelx_by_n($this->auth->owner_id);
if ($ch) {
$sync = attach_export_data($ch, $this->folder_hash);
@@ -260,14 +268,18 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
dbesc($f),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- '', //TODO: use os_path
- '', //TODO: use display_path
+ '',
+ '',
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
dbesc($deny_gid)
);
+ // fetch the actual storage paths
+
+ $xpath = attach_syspaths($this->auth->owner_id, $hash);
+
// returns the number of bytes that were written to the file, or FALSE on failure
$size = file_put_contents($f, $data);
// delete attach entry if file_put_contents() failed
@@ -281,15 +293,17 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$edited = datetime_convert();
$is_photo = 0;
- $x = @getimagesize($f);
- logger('getimagesize: ' . print_r($x,true), LOGGER_DATA);
- if (($x) && ($x[2] === IMAGETYPE_GIF || $x[2] === IMAGETYPE_JPEG || $x[2] === IMAGETYPE_PNG)) {
+ $gis = @getimagesize($f);
+ logger('getimagesize: ' . print_r($gis,true), LOGGER_DATA);
+ if (($gis) && ($gis[2] === IMAGETYPE_GIF || $gis[2] === IMAGETYPE_JPEG || $gis[2] === IMAGETYPE_PNG)) {
$is_photo = 1;
}
// updates entry with filesize and timestamp
- $d = q("UPDATE attach SET filesize = '%s', is_photo = %d, edited = '%s' WHERE hash = '%s' AND uid = %d",
+ $d = q("UPDATE attach SET filesize = '%s', os_path = '%s', display_path = '%s', is_photo = %d, edited = '%s' WHERE hash = '%s' AND uid = %d",
dbesc($size),
+ dbesc($xpath['os_path']),
+ dbesc($xpath['display_path']),
intval($is_photo),
dbesc($edited),
dbesc($hash),
@@ -312,29 +326,29 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
// check against service class quota
$limit = engr_units_to_bytes(service_class_fetch($c[0]['channel_id'], 'attach_upload_limit'));
if ($limit !== false) {
- $x = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d ",
+ $z = q("SELECT SUM(filesize) AS total FROM attach WHERE aid = %d ",
intval($c[0]['channel_account_id'])
);
- if (($x) && ($x[0]['total'] + $size > $limit)) {
- logger('service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . userReadableSize($limit));
+ if (($z) && ($z[0]['total'] + $size > $limit)) {
+ logger('service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $z[0]['total'] . ' limit is ' . userReadableSize($limit));
attach_delete($c[0]['channel_id'], $hash);
return;
}
}
- if ($is_photo) {
+ if($is_photo) {
$album = '';
if ($this->folder_hash) {
- $f1 = q("select filename from attach WHERE hash = '%s' AND uid = %d",
+ $f1 = q("select filename, display_path from attach WHERE hash = '%s' AND uid = %d",
dbesc($this->folder_hash),
intval($c[0]['channel_id'])
);
if ($f1)
- $album = $f1[0]['filename'];
+ $album = (($f1[0]['display_path']) ? $f1[0]['display_path'] : $f1[0]['filename']);
}
require_once('include/photos.php');
- $args = array( 'resource_id' => $hash, 'album' => $album, 'os_path' => $f, 'filename' => $name, 'getimagesize' => $x, 'directory' => $direct);
+ $args = array( 'resource_id' => $hash, 'album' => $album, 'os_syspath' => $f, 'os_path' => $xpath['os_path'], 'display_path' => $xpath['path'], 'filename' => $name, 'getimagesize' => $gis, 'directory' => $direct);
$p = photo_upload($c[0], \App::get_observer(), $args);
}
@@ -646,20 +660,24 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
logger("Path mismatch: $path !== /$file");
return NULL;
}
- if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
- $prefix = 'DISTINCT ON (filename)';
- $suffix = 'ORDER BY filename';
- }
- else {
- $prefix = '';
- $suffix = 'GROUP BY filename';
- }
+
+ $prefix = '';
+ $suffix = '';
+
$r = q("select $prefix id, uid, hash, filename, filetype, filesize, revision, folder, flags, is_dir, created, edited from attach where folder = '%s' and uid = %d $perms $suffix",
dbesc($folder),
intval($channel_id)
);
foreach ($r as $rr) {
+
+ // @FIXME I don't think we use revisions currently in attach structures.
+ // In case we see any in the wild provide a unique filename. This
+ // name may or may not be accessible
+
+ if($rr['revision'])
+ $rr['filename'] .= '-' . $rr['revision'];
+
//logger('filename: ' . $rr['filename'], LOGGER_DEBUG);
if (intval($rr['is_dir'])) {
$ret[] = new Directory($path . '/' . $rr['filename'], $auth);
@@ -687,7 +705,7 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$ret = array();
$r = q("SELECT channel_id, channel_address FROM channel WHERE channel_removed = 0
- AND channel_system = 0 AND NOT (channel_pageflags & %d)>0",
+ AND channel_system = 0 AND (channel_pageflags & %d) = 0",
intval(PAGE_HIDDEN)
);
diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php
index d2bca3964..1475241ab 100644
--- a/Zotlabs/Storage/File.php
+++ b/Zotlabs/Storage/File.php
@@ -85,13 +85,23 @@ class File extends DAV\Node implements DAV\IFile {
intval($this->data['id'])
);
+ $x = attach_syspaths($this->auth->owner_id,$this->data['hash']);
+
+ $y = q("update attach set display_path = '%s where hash = '%s' and uid = %d",
+ dbesc($x['path']),
+ dbesc($this->data['hash']),
+ intval($this->auth->owner_id)
+ );
+
if($this->data->is_photo) {
- $r = q("update photo set filename = '%s' where resource_id = '%s' and uid = %d",
+ $r = q("update photo set filename = '%s', display_path = '%s' where resource_id = '%s' and uid = %d",
dbesc($newName),
+ dbesc($x['path']),
dbesc($this->data['hash']),
intval($this->auth->owner_id)
);
}
+
$ch = channelx_by_n($this->auth->owner_id);
if($ch) {
$sync = attach_export_data($ch,$this->data['hash']);
diff --git a/Zotlabs/Web/HTTPHeaders.php b/Zotlabs/Web/HTTPHeaders.php
new file mode 100644
index 000000000..1e4c1bf84
--- /dev/null
+++ b/Zotlabs/Web/HTTPHeaders.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Zotlabs\Web;
+
+class HTTPHeaders {
+
+ private $in_progress = [];
+ private $parsed = [];
+
+
+ function __construct($headers) {
+
+ $lines = explode("\n",str_replace("\r",'',$headers));
+ if($lines) {
+ foreach($lines as $line) {
+ if(preg_match('/^\s+/',$line,$matches) && trim($line)) {
+ if($this->in_progress['k']) {
+ $this->in_progress['v'] .= ' ' . ltrim($line);
+ continue;
+ }
+ }
+ else {
+ if($this->in_progress['k']) {
+ $this->parsed[] = [ $this->in_progress['k'] => $this->in_progress['v'] ];
+ $this->in_progress = [];
+ }
+
+ $this->in_progress['k'] = strtolower(substr($line,0,strpos($line,':')));
+ $this->in_progress['v'] = ltrim(substr($line,strpos($line,':') + 1));
+ }
+
+ }
+ if($this->in_progress['k']) {
+ $this->parsed[] = [ $this->in_progress['k'] => $this->in_progress['v'] ];
+ $this->in_progress = [];
+ }
+ }
+ }
+
+ function fetch() {
+ return $this->parsed;
+ }
+}
+
+
+
diff --git a/Zotlabs/Web/Router.php b/Zotlabs/Web/Router.php
index ba2e78b25..3190369c8 100644
--- a/Zotlabs/Web/Router.php
+++ b/Zotlabs/Web/Router.php
@@ -62,12 +62,6 @@ class Router {
}
}
- if((strpos($module,'admin') === 0) && (! is_site_admin())) {
- \App::$module_loaded = false;
- notice( t('Permission denied.') . EOL);
- goaway(z_root());
- }
-
/*
* If the site has a custom module to over-ride the standard module, use it.
* Otherwise, look for the standard program module
@@ -208,7 +202,7 @@ class Router {
* The member may have also created a customised PDL that's stored in the config
*/
- load_pdl($a);
+ load_pdl();
/*
* load current theme info
diff --git a/Zotlabs/Web/WebServer.php b/Zotlabs/Web/WebServer.php
index 5bb0e08e8..4e8dc6786 100644
--- a/Zotlabs/Web/WebServer.php
+++ b/Zotlabs/Web/WebServer.php
@@ -79,11 +79,6 @@ class WebServer {
if(! x($_SESSION, 'sysmsg_info'))
$_SESSION['sysmsg_info'] = array();
- /*
- * check_config() is responsible for running update scripts. These automatically
- * update the DB schema whenever we push a new one out. It also checks to see if
- * any plugins have been added or removed and reacts accordingly.
- */
if(\App::$install) {
@@ -91,8 +86,16 @@ class WebServer {
if(\App::$module != 'view')
\App::$module = 'setup';
}
- else
- check_config($a);
+ else {
+
+ /*
+ * check_config() is responsible for running update scripts. These automatically
+ * update the DB schema whenever we push a new one out. It also checks to see if
+ * any plugins have been added or removed and reacts accordingly.
+ */
+
+ check_config();
+ }
nav_set_selected('nothing');
@@ -130,7 +133,7 @@ class WebServer {
call_hooks('page_end', \App::$page['content']);
- construct_page($a);
+ construct_page();
killme();
}
diff --git a/Zotlabs/Widget/Activity.php b/Zotlabs/Widget/Activity.php
new file mode 100644
index 000000000..7264a3360
--- /dev/null
+++ b/Zotlabs/Widget/Activity.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Activity {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $o = '';
+
+ if(is_array($arr) && array_key_exists('limit',$arr))
+ $limit = " limit " . intval($limit) . " ";
+ else
+ $limit = '';
+
+ $perms_sql = item_permissions_sql(local_channel()) . item_normal();
+
+ $r = q("select author_xchan from item where item_unseen = 1 and uid = %d $perms_sql",
+ intval(local_channel())
+ );
+
+ $contributors = [];
+ $arr = [];
+
+ if($r) {
+ foreach($r as $rv) {
+ if(array_key_exists($rv['author_xchan'],$contributors)) {
+ $contributors[$rv['author_xchan']] ++;
+ }
+ else {
+ $contributors[$rv['author_xchan']] = 1;
+ }
+ }
+ foreach($contributors as $k => $v) {
+ $arr[] = [ 'author_xchan' => $k, 'total' => $v ];
+ }
+ usort($arr,'total_sort');
+ xchan_query($arr);
+ }
+
+ $x = [ 'entries' => $arr ];
+ call_hooks('activity_widget',$x);
+ $arr = $x['entries'];
+
+ if($arr) {
+ $o .= '<div class="widget">';
+ $o .= '<h3>' . t('Activity','widget') . '</h3><ul class="nav nav-pills flex-column">';
+
+ foreach($arr as $rv) {
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&xchan=' . urlencode($rv['author_xchan']) . '" ><span class="badge badge-default float-right">' . ((intval($rv['total'])) ? intval($rv['total']) : '') . '</span><img src="' . $rv['author']['xchan_photo_s'] . '" class="menu-img-1" /> ' . $rv['author']['xchan_name'] . '</a></li>';
+ }
+ $o .= '</ul></div>';
+ }
+ return $o;
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Admin.php b/Zotlabs/Widget/Admin.php
new file mode 100644
index 000000000..a761eebe3
--- /dev/null
+++ b/Zotlabs/Widget/Admin.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Admin {
+
+ function widget($arr) {
+
+ /*
+ * Side bar links
+ */
+
+ if(! is_site_admin()) {
+ return '';
+ }
+
+ $o = '';
+
+ // array( url, name, extra css classes )
+
+ $aside = [
+ 'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
+ 'accounts' => array(z_root() . '/admin/accounts/', t('Accounts'), 'accounts', 'pending-update', t('Member registrations waiting for confirmation')),
+ 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
+ 'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
+ 'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
+ 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'),
+ 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'),
+ 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'),
+ 'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'),
+ 'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync')
+ ];
+
+ /* get plugins admin page */
+
+ $r = q("SELECT * FROM addon WHERE plugin_admin = 1");
+
+ $plugins = array();
+ if($r) {
+ foreach ($r as $h){
+ $plugin = $h['aname'];
+ $plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin');
+ // temp plugins with admin
+ \App::$plugins_admin[] = $plugin;
+ }
+ }
+
+ $logs = array(z_root() . '/admin/logs/', t('Logs'), 'logs');
+
+ $arr = array('links' => $aside,'plugins' => $plugins,'logs' => $logs);
+ call_hooks('admin_aside',$arr);
+
+ $o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
+ '$admin' => $aside,
+ '$admtxt' => t('Admin'),
+ '$plugadmtxt' => t('Plugin Features'),
+ '$plugins' => $plugins,
+ '$logtxt' => t('Logs'),
+ '$logs' => $logs,
+ '$h_pending' => t('Member registrations waiting for confirmation'),
+ '$admurl'=> z_root() . '/admin/'
+ ));
+
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Affinity.php b/Zotlabs/Widget/Affinity.php
new file mode 100644
index 000000000..439ba1f33
--- /dev/null
+++ b/Zotlabs/Widget/Affinity.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Affinity {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ // Get default cmin value from pconfig, but allow GET parameter to override
+ $cmin = intval(get_pconfig(local_channel(),'affinity','cmin'));
+ $cmin = (($cmin) ? $cmin : 0);
+ $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : $cmin);
+
+ // Get default cmax value from pconfig, but allow GET parameter to override
+ $cmax = intval(get_pconfig(local_channel(),'affinity','cmax'));
+ $cmax = (($cmax) ? $cmax : 99);
+ $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : $cmax);
+
+
+ if(feature_enabled(local_channel(),'affinity')) {
+
+ $labels = array(
+ t('Me'),
+ t('Family'),
+ t('Friends'),
+ t('Acquaintances'),
+ t('All')
+ );
+ call_hooks('affinity_labels',$labels);
+ $label_str = '';
+
+ if($labels) {
+ foreach($labels as $l) {
+ if($label_str) {
+ $label_str .= ", '|'";
+ $label_str .= ", '" . $l . "'";
+ }
+ else
+ $label_str .= "'" . $l . "'";
+ }
+ }
+
+ $tpl = get_markup_template('main_slider.tpl');
+ $x = replace_macros($tpl,array(
+ '$val' => $cmin . ',' . $cmax,
+ '$refresh' => t('Refresh'),
+ '$labels' => $label_str,
+ ));
+
+ $arr = array('html' => $x);
+ call_hooks('main_slider',$arr);
+ return $arr['html'];
+ }
+ return '';
+ }
+}
+ \ No newline at end of file
diff --git a/Zotlabs/Widget/Album.php b/Zotlabs/Widget/Album.php
new file mode 100644
index 000000000..f359e6d0f
--- /dev/null
+++ b/Zotlabs/Widget/Album.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/attach.php');
+
+class Album {
+
+ function widget($args) {
+
+
+ $owner_uid = \App::$profile_uid;
+ $sql_extra = permissions_sql($owner_uid);
+
+
+ if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
+ return '';
+
+ if($args['album'])
+ $album = $args['album'];
+ if($args['title'])
+ $title = $args['title'];
+
+ /**
+ * This may return incorrect permissions if you have multiple directories of the same name.
+ * It is a limitation of the photo table using a name for a photo album instead of a folder hash
+ */
+
+ if($album) {
+ $x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
+ dbesc($album),
+ intval($owner_uid)
+ );
+ if($x) {
+ $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
+ if(! $y)
+ return '';
+ }
+ }
+
+ $order = 'DESC';
+
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
+ (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
+ ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
+ ORDER BY created $order ",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+ );
+
+ //edit album name
+ $album_edit = null;
+
+ $photos = array();
+ if($r) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+
+ $ext = $phototypes[$rr['mimetype']];
+
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+ $imagelink = (z_root() . '/photos/' . \App::$profile['channel_address'] . '/image/' . $rr['resource_id']);
+
+
+ $photos[] = array(
+ 'id' => $rr['id'],
+ 'twist' => ' ' . $twist . rand(2,4),
+ 'link' => $imagelink,
+ 'title' => t('View Photo'),
+ 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
+ 'alt' => $imgalt_e,
+ 'desc'=> $desc_e,
+ 'ext' => $ext,
+ 'hash'=> $rr['resource_id'],
+ 'unknown' => t('Unknown')
+ );
+ }
+ }
+
+
+ $tpl = get_markup_template('photo_album.tpl');
+ $o .= replace_macros($tpl, array(
+ '$photos' => $photos,
+ '$album' => (($title) ? $title : $album),
+ '$album_id' => rand(),
+ '$album_edit' => array(t('Edit Album'), $album_edit),
+ '$can_post' => false,
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$profile['channel_address'] . '/upload/' . bin2hex($album)),
+ '$order' => false,
+ '$upload_form' => $upload_form,
+ '$usage' => $usage_message
+ ));
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Appcategories.php b/Zotlabs/Widget/Appcategories.php
new file mode 100644
index 000000000..490ec1abc
--- /dev/null
+++ b/Zotlabs/Widget/Appcategories.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Appcategories {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $selected = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+
+ // @FIXME ??? $srchurl undefined here - commented out until is reviewed
+ //$srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ //$srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+ // Leaving this line which negates the effect of the two invalid lines prior
+ $srchurl = z_root() . '/apps';
+
+ $terms = array();
+
+ $r = q("select distinct(term.term)
+ from term join app on term.oid = app.id
+ where app_channel = %d
+ and term.uid = app_channel
+ and term.otype = %d
+ and term.term != 'nav_featured_app'
+ order by term.term asc",
+ intval(local_channel()),
+ intval(TERM_OBJ_APP)
+ );
+
+ if($r) {
+ foreach($r as $rr)
+ $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
+
+ return replace_macros(get_markup_template('categories_widget.tpl'),array(
+ '$title' => t('Categories'),
+ '$desc' => '',
+ '$sel_all' => (($selected == '') ? 'selected' : ''),
+ '$all' => t('Everything'),
+ '$terms' => $terms,
+ '$base' => $srchurl,
+
+ ));
+ }
+ }
+}
diff --git a/Zotlabs/Widget/Appcloud.php b/Zotlabs/Widget/Appcloud.php
new file mode 100644
index 000000000..2a4671eee
--- /dev/null
+++ b/Zotlabs/Widget/Appcloud.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Appcloud {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+ return app_tagblock(z_root() . '/apps');
+ }
+}
+
diff --git a/Zotlabs/Widget/Archive.php b/Zotlabs/Widget/Archive.php
new file mode 100644
index 000000000..c151ca563
--- /dev/null
+++ b/Zotlabs/Widget/Archive.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Archive {
+
+ function widget($arr) {
+
+ $o = '';
+
+ if(! \App::$profile_uid) {
+ return '';
+ }
+
+ $uid = \App::$profile_uid;
+
+ if(! feature_enabled($uid,'archives'))
+ return '';
+
+ if(! perm_is_allowed($uid,get_observer_hash(),'view_stream'))
+ return '';
+
+ $wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
+ $style = ((array_key_exists('style', $arr)) ? $arr['style'] : 'select');
+ $showend = ((get_pconfig($uid,'system','archive_show_end_date')) ? true : false);
+ $mindate = get_pconfig($uid,'system','archive_mindate');
+ $visible_years = get_pconfig($uid,'system','archive_visible_years');
+ if(! $visible_years)
+ $visible_years = 5;
+
+ $url = z_root() . '/' . \App::$cmd;
+
+ $ret = list_post_dates($uid,$wall,$mindate);
+
+ if(! count($ret))
+ return '';
+
+ $cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
+ $cutoff = ((array_key_exists($cutoff_year,$ret))? true : false);
+
+ $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
+ '$title' => t('Archives'),
+ '$size' => $visible_years,
+ '$cutoff_year' => $cutoff_year,
+ '$cutoff' => $cutoff,
+ '$url' => $url,
+ '$style' => $style,
+ '$showend' => $showend,
+ '$dates' => $ret
+ ));
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Bookmarkedchats.php b/Zotlabs/Widget/Bookmarkedchats.php
new file mode 100644
index 000000000..d64bbdb4b
--- /dev/null
+++ b/Zotlabs/Widget/Bookmarkedchats.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Bookmarkedchats {
+
+ function widget($arr) {
+
+ if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat'))
+ return '';
+
+ $h = get_observer_hash();
+ if(! $h)
+ return;
+ $r = q("select xchat_url, xchat_desc from xchat where xchat_xchan = '%s' order by xchat_desc",
+ dbesc($h)
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
+ }
+ }
+ return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
+ '$header' => t('Bookmarked Chatrooms'),
+ '$rooms' => $r
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Catcloud_wall.php b/Zotlabs/Widget/Catcloud_wall.php
new file mode 100644
index 000000000..3795987cc
--- /dev/null
+++ b/Zotlabs/Widget/Catcloud_wall.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Catcloud_wall {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
+ return '';
+ if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
+ return '';
+
+ $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
+
+ return catblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
+ }
+
+}
diff --git a/Zotlabs/Widget/Categories.php b/Zotlabs/Widget/Categories.php
new file mode 100644
index 000000000..d1dcfda93
--- /dev/null
+++ b/Zotlabs/Widget/Categories.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Categories {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid'])
+ || (! perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'view_stream'))) {
+ return '';
+ }
+
+ $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+ $srchurl = \App::$query_string;
+ $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+ return categories_widget($srchurl, $cat);
+ }
+}
diff --git a/Zotlabs/Widget/Chatroom_list.php b/Zotlabs/Widget/Chatroom_list.php
new file mode 100644
index 000000000..e2aad0e05
--- /dev/null
+++ b/Zotlabs/Widget/Chatroom_list.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Chatroom_list {
+
+ function widget($arr) {
+
+ if(! \App::$profile)
+ return '';
+
+ $r = \Zotlabs\Lib\Chatroom::roomlist(\App::$profile['profile_uid']);
+
+ if($r) {
+ return replace_macros(get_markup_template('chatroomlist.tpl'), array(
+ '$header' => t('Chatrooms'),
+ '$baseurl' => z_root(),
+ '$nickname' => \App::$profile['channel_address'],
+ '$items' => $r,
+ '$overview' => t('Overview')
+ ));
+ }
+ }
+}
diff --git a/Zotlabs/Widget/Chatroom_members.php b/Zotlabs/Widget/Chatroom_members.php
new file mode 100644
index 000000000..8ed77fb3c
--- /dev/null
+++ b/Zotlabs/Widget/Chatroom_members.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Chatroom_members {
+
+ // The actual contents are filled in via AJAX
+
+ function widget() {
+ return replace_macros(get_markup_template('chatroom_members.tpl'), array(
+ '$header' => t('Chat Members')
+ ));
+ }
+
+}
diff --git a/Zotlabs/Widget/Clock.php b/Zotlabs/Widget/Clock.php
new file mode 100644
index 000000000..b63b5f748
--- /dev/null
+++ b/Zotlabs/Widget/Clock.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Clock {
+
+ function widget($arr) {
+
+ $miltime = 0;
+ if(isset($arr['military']) && $arr['military'])
+ $miltime = 1;
+
+ $o = <<< EOT
+<div class="widget">
+<h3 class="clockface"></h3>
+<script>
+
+var timerID = null
+var timerRunning = false
+
+function stopclock(){
+ if(timerRunning)
+ clearTimeout(timerID)
+ timerRunning = false
+}
+
+function startclock(){
+ stopclock()
+ showtime()
+}
+
+function showtime(){
+ var now = new Date()
+ var hours = now.getHours()
+ var minutes = now.getMinutes()
+ var seconds = now.getSeconds()
+ var military = $miltime
+ var timeValue = ""
+ if(military)
+ timeValue = hours
+ else
+ timeValue = ((hours > 12) ? hours - 12 : hours)
+ timeValue += ((minutes < 10) ? ":0" : ":") + minutes
+// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
+ if(! military)
+ timeValue += (hours >= 12) ? " P.M." : " A.M."
+ $('.clockface').html(timeValue)
+ timerID = setTimeout("showtime()",1000)
+ timerRunning = true
+}
+
+$(document).ready(function() {
+ startclock();
+});
+
+</script>
+</div>
+EOT;
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Collections.php b/Zotlabs/Widget/Collections.php
new file mode 100644
index 000000000..d2b29679a
--- /dev/null
+++ b/Zotlabs/Widget/Collections.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/group.php');
+
+class Collections {
+
+ function widget($args) {
+
+ $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
+ switch($mode) {
+ case 'conversation':
+ $every = argv(0);
+ $each = argv(0);
+ $edit = true;
+ $current = $_REQUEST['gid'];
+ $abook_id = 0;
+ $wmode = 0;
+ break;
+ case 'connections':
+ $every = 'connections';
+ $each = 'group';
+ $edit = true;
+ $current = $_REQUEST['gid'];
+ $abook_id = 0;
+ $wmode = 0;
+ case 'groups':
+ $every = 'connections';
+ $each = argv(0);
+ $edit = false;
+ $current = intval(argv(1));
+ $abook_id = 0;
+ $wmode = 1;
+ break;
+ case 'abook':
+ $every = 'connections';
+ $each = 'group';
+ $edit = false;
+ $current = 0;
+ $abook_id = \App::$poi['abook_xchan'];
+ $wmode = 1;
+ break;
+ default:
+ return '';
+ break;
+ }
+
+ return group_side($every, $each, $edit, $current, $abook_id, $wmode);
+ }
+}
diff --git a/Zotlabs/Widget/Conversations.php b/Zotlabs/Widget/Conversations.php
new file mode 100644
index 000000000..27e517c02
--- /dev/null
+++ b/Zotlabs/Widget/Conversations.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Conversations {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ if(argc() > 1) {
+
+ switch(argv(1)) {
+ case 'combined':
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ case 'inbox':
+ $mailbox = 'inbox';
+ $header = t('Received Messages');
+ break;
+ case 'outbox':
+ $mailbox = 'outbox';
+ $header = t('Sent Messages');
+ break;
+ default:
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ }
+
+ require_once('include/message.php');
+
+ // private_messages_list() can do other more complicated stuff, for now keep it simple
+ $r = private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
+
+ if(! $r) {
+ info( t('No messages.') . EOL);
+ return $o;
+ }
+
+ $messages = array();
+
+ foreach($r as $rr) {
+
+ $messages[] = array(
+ 'mailbox' => $mailbox,
+ 'id' => $rr['id'],
+ 'from_name' => $rr['from']['xchan_name'],
+ 'from_url' => chanlink_hash($rr['from_xchan']),
+ 'from_photo' => $rr['from']['xchan_photo_s'],
+ 'to_name' => $rr['to']['xchan_name'],
+ 'to_url' => chanlink_hash($rr['to_xchan']),
+ 'to_photo' => $rr['to']['xchan_photo_s'],
+ 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ 'delete' => t('Delete conversation'),
+ 'body' => $rr['body'],
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
+ 'seen' => $rr['seen'],
+ 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
+ );
+ }
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $o .= replace_macros($tpl, array(
+ '$header' => $header,
+ '$messages' => $messages
+ ));
+
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Cover_photo.php b/Zotlabs/Widget/Cover_photo.php
new file mode 100644
index 000000000..d2eb1be92
--- /dev/null
+++ b/Zotlabs/Widget/Cover_photo.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Cover_photo {
+
+ function widget($arr) {
+
+ require_once('include/channel.php');
+ $o = '';
+
+ if(\App::$module == 'channel' && $_REQUEST['mid'])
+ return '';
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ $channel = channelx_by_n($channel_id);
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+ else
+ $style = 'width:100%; height: auto;';
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpbrk($style,'(\'"<>') !== false)
+ $style = '';
+
+ if(array_key_exists('title', $arr) && isset($arr['title']))
+ $title = $arr['title'];
+ else
+ $title = $channel['channel_name'];
+
+ if(array_key_exists('subtitle', $arr) && isset($arr['subtitle']))
+ $subtitle = $arr['subtitle'];
+ else
+ $subtitle = str_replace('@','&#x40;',$channel['xchan_addr']);
+
+ $c = get_cover_photo($channel_id,'html');
+
+ if($c) {
+ $photo_html = (($style) ? str_replace('alt=',' style="' . $style . '" alt=',$c) : $c);
+
+ $o = replace_macros(get_markup_template('cover_photo_widget.tpl'),array(
+ '$photo_html' => $photo_html,
+ '$title' => $title,
+ '$subtitle' => $subtitle,
+ '$hovertitle' => t('Click to show more'),
+ ));
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Design_tools.php b/Zotlabs/Widget/Design_tools.php
new file mode 100644
index 000000000..8ab6a235d
--- /dev/null
+++ b/Zotlabs/Widget/Design_tools.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Design_tools {
+
+ function widget($arr) {
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_channel() is sufficient for permissions.
+
+ if(\App::$profile['profile_uid'])
+ if((\App::$profile['profile_uid'] != local_channel()) && (! \App::$is_sys))
+ return '';
+
+ if(! local_channel())
+ return '';
+
+ return design_tools();
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Dirsort.php b/Zotlabs/Widget/Dirsort.php
new file mode 100644
index 000000000..e75a00e50
--- /dev/null
+++ b/Zotlabs/Widget/Dirsort.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/dir_fns.php');
+
+class Dirsort {
+ function widget($arr) {
+ return dir_sort_links();
+ }
+}
diff --git a/Zotlabs/Widget/Dirtags.php b/Zotlabs/Widget/Dirtags.php
new file mode 100644
index 000000000..f211d5942
--- /dev/null
+++ b/Zotlabs/Widget/Dirtags.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/dir_fns.php');
+
+class Dirtags {
+
+ function widget($arr) {
+ return dir_tagblock(z_root() . '/directory', null);
+ }
+
+}
diff --git a/Zotlabs/Widget/Eventstools.php b/Zotlabs/Widget/Eventstools.php
new file mode 100644
index 000000000..7efd3f72e
--- /dev/null
+++ b/Zotlabs/Widget/Eventstools.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Eventstools {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return;
+
+ return replace_macros(get_markup_template('events_tools_side.tpl'), array(
+ '$title' => t('Events Tools'),
+ '$export' => t('Export Calendar'),
+ '$import' => t('Import Calendar'),
+ '$submit' => t('Submit')
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Filer.php b/Zotlabs/Widget/Filer.php
new file mode 100644
index 000000000..5d6f96a87
--- /dev/null
+++ b/Zotlabs/Widget/Filer.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Filer {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+
+
+ $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
+
+ $terms = array();
+ $r = q("select distinct term from term where uid = %d and ttype = %d order by term asc",
+ intval(local_channel()),
+ intval(TERM_FILE)
+ );
+ if(! $r)
+ return;
+
+ foreach($r as $rr)
+ $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
+
+ return replace_macros(get_markup_template('fileas_widget.tpl'),array(
+ '$title' => t('Saved Folders'),
+ '$desc' => '',
+ '$sel_all' => (($selected == '') ? 'selected' : ''),
+ '$all' => t('Everything'),
+ '$terms' => $terms,
+ '$base' => z_root() . '/' . \App::$cmd
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Findpeople.php b/Zotlabs/Widget/Findpeople.php
new file mode 100644
index 000000000..f450b96ae
--- /dev/null
+++ b/Zotlabs/Widget/Findpeople.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/contact_widgets.php');
+
+class Findpeople {
+ function widget($arr) {
+ return findpeople_widget();
+ }
+}
+
diff --git a/Zotlabs/Widget/Follow.php b/Zotlabs/Widget/Follow.php
new file mode 100644
index 000000000..c4aecc8e1
--- /dev/null
+++ b/Zotlabs/Widget/Follow.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Follow {
+
+ function widget($args) {
+ if(! local_channel())
+ return '';
+
+ $uid = \App::$channel['channel_id'];
+ $r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
+ intval($uid)
+ );
+
+ if($r)
+ $total_channels = $r[0]['total'];
+
+ $limit = service_class_fetch($uid,'total_channels');
+ if($limit !== false) {
+ $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
+ }
+ else {
+ $abook_usage_message = '';
+ }
+
+ return replace_macros(get_markup_template('follow.tpl'),array(
+ '$connect' => t('Add New Connection'),
+ '$desc' => t('Enter channel address'),
+ '$hint' => t('Examples: bob@example.com, https://example.com/barbara'),
+ '$follow' => t('Connect'),
+ '$abook_usage_message' => $abook_usage_message
+ ));
+ }
+}
+
diff --git a/Zotlabs/Widget/Forums.php b/Zotlabs/Widget/Forums.php
new file mode 100644
index 000000000..67e498b24
--- /dev/null
+++ b/Zotlabs/Widget/Forums.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Forums {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return '';
+
+ $o = '';
+
+ if(is_array($arr) && array_key_exists('limit',$arr))
+ $limit = " limit " . intval($limit) . " ";
+ else
+ $limit = '';
+
+ $unseen = 0;
+ if(is_array($arr) && array_key_exists('unseen',$arr) && intval($arr['unseen']))
+ $unseen = 1;
+
+ $perms_sql = item_permissions_sql(local_channel()) . item_normal();
+
+ $xf = false;
+
+ $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'",
+ intval(local_channel())
+ );
+ if($x1) {
+ $xc = ids_to_querystr($x1,'xchan',true);
+ $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = '1' and xchan in (" . $xc . ") ",
+ intval(local_channel())
+ );
+ if($x2)
+ $xf = ids_to_querystr($x2,'xchan',true);
+ }
+
+ $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 ");
+
+ $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ",
+ intval(local_channel())
+ );
+ if(! $r1)
+ return $o;
+
+ $str = '';
+
+ // Trying to cram all this into a single query with joins and the proper group by's is tough.
+ // There also should be a way to update this via ajax.
+
+ for($x = 0; $x < count($r1); $x ++) {
+ $r = q("select sum(item_unseen) as unseen from item where owner_xchan = '%s' and uid = %d and item_unseen = 1 $perms_sql ",
+ dbesc($r1[$x]['xchan_hash']),
+ intval(local_channel())
+ );
+ if($r)
+ $r1[$x]['unseen'] = $r[0]['unseen'];
+
+ /**
+ * @FIXME
+ * This SQL makes the counts correct when you get forum posts arriving from different routes/sources
+ * (like personal channels). However the network query for these posts doesn't yet include this
+ * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
+ * It may make more sense in that query to look for the mention in the body rather than another join,
+ * but that makes it very inefficient.
+ *
+ $r = q("select sum(item_unseen) as unseen from item left join term on oid = id where otype = %d and owner_xchan != '%s' and item.uid = %d and url = '%s' and ttype = %d $perms_sql ",
+ intval(TERM_OBJ_POST),
+ dbesc($r1[$x]['xchan_hash']),
+ intval(local_channel()),
+ dbesc($r1[$x]['xchan_url']),
+ intval(TERM_MENTION)
+ );
+ if($r)
+ $r1[$x]['unseen'] = ((array_key_exists('unseen',$r1[$x])) ? $r1[$x]['unseen'] + $r[0]['unseen'] : $r[0]['unseen']);
+ *
+ * end @FIXME
+ */
+
+ }
+
+ if($r1) {
+ $o .= '<div class="widget">';
+ $o .= '<h3>' . t('Forums') . '</h3><ul class="nav nav-pills flex-column">';
+
+ foreach($r1 as $rr) {
+ if($unseen && (! intval($rr['unseen'])))
+ continue;
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge badge-default float-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img class ="menu-img-1" src="' . $rr['xchan_photo_s'] . '" /> ' . $rr['xchan_name'] . '</a></li>';
+ }
+ $o .= '</ul></div>';
+ }
+ return $o;
+
+ }
+}
diff --git a/Zotlabs/Widget/Fullprofile.php b/Zotlabs/Widget/Fullprofile.php
new file mode 100644
index 000000000..d7340ef40
--- /dev/null
+++ b/Zotlabs/Widget/Fullprofile.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Fullprofile {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return;
+
+ $block = observer_prohibited();
+
+ return profile_sidebar(\App::$profile, $block);
+ }
+}
diff --git a/Zotlabs/Widget/Helpindex.php b/Zotlabs/Widget/Helpindex.php
new file mode 100644
index 000000000..f23e73e75
--- /dev/null
+++ b/Zotlabs/Widget/Helpindex.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Helpindex {
+
+ function widget($arr) {
+
+ $o .= '<div class="widget">';
+
+ $level_0 = get_help_content('sitetoc');
+ if(! $level_0)
+ $level_0 = get_help_content('toc');
+
+ $level_0 = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$level_0);
+
+ $levels = array();
+
+
+ if(argc() > 2) {
+ $path = '';
+ for($x = 1; $x < argc(); $x ++) {
+ $path .= argv($x) . '/';
+ $y = get_help_content($path . 'sitetoc');
+ if(! $y)
+ $y = get_help_content($path . 'toc');
+ if($y)
+ $levels[] = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills flex-column">',$y);
+ }
+ }
+
+ if($level_0)
+ $o .= $level_0;
+ if($levels) {
+ foreach($levels as $l) {
+ $o .= '<br /><br />';
+ $o .= $l;
+ }
+ }
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Item.php b/Zotlabs/Widget/Item.php
new file mode 100644
index 000000000..273d5649c
--- /dev/null
+++ b/Zotlabs/Widget/Item.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/security.php');
+
+class Item {
+
+ function widget($arr) {
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+
+ if((! $arr['mid']) && (! $arr['title']))
+ return '';
+
+ if(! perm_is_allowed($channel_id, get_observer_hash(), 'view_pages'))
+ return '';
+
+ $sql_extra = item_permissions_sql($channel_id);
+
+ if($arr['title']) {
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
+ and iconfig.k = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
+ intval($channel_id),
+ dbesc($arr['title']),
+ intval(ITEM_TYPE_WEBPAGE)
+ );
+ }
+ else {
+ $r = q("select * from item where mid = '%s' and uid = %d and item_type = "
+ . intval(ITEM_TYPE_WEBPAGE) . " $sql_extra limit 1",
+ dbesc($arr['mid']),
+ intval($channel_id)
+ );
+ }
+
+ if(! $r)
+ return '';
+
+ xchan_query($r);
+ $r = fetch_post_tags($r, true);
+
+ $o = prepare_page($r[0]);
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Mailmenu.php b/Zotlabs/Widget/Mailmenu.php
new file mode 100644
index 000000000..512f7d9c0
--- /dev/null
+++ b/Zotlabs/Widget/Mailmenu.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Mailmenu {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ return replace_macros(get_markup_template('message_side.tpl'), array(
+ '$title' => t('Private Mail Menu'),
+ '$combined' => array(
+ 'label' => t('Combined View'),
+ 'url' => z_root() . '/mail/combined',
+ 'sel' => (argv(1) == 'combined'),
+ ),
+ '$inbox' => array(
+ 'label' => t('Inbox'),
+ 'url' => z_root() . '/mail/inbox',
+ 'sel' => (argv(1) == 'inbox'),
+ ),
+ '$outbox' => array(
+ 'label' => t('Outbox'),
+ 'url' => z_root() . '/mail/outbox',
+ 'sel' => (argv(1) == 'outbox'),
+ ),
+ '$new' => array(
+ 'label' => t('New Message'),
+ 'url' => z_root() . '/mail/new',
+ 'sel'=> (argv(1) == 'new'),
+ )
+ ));
+ }
+}
diff --git a/Zotlabs/Widget/Menu_preview.php b/Zotlabs/Widget/Menu_preview.php
new file mode 100644
index 000000000..51218f6cf
--- /dev/null
+++ b/Zotlabs/Widget/Menu_preview.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/menu.php');
+
+class Menu_preview {
+
+ function widget($arr) {
+ if(! \App::$data['menu_item'])
+ return;
+
+ return menu_render(\App::$data['menu_item']);
+ }
+
+}
diff --git a/Zotlabs/Widget/Notes.php b/Zotlabs/Widget/Notes.php
new file mode 100644
index 000000000..5c83a550f
--- /dev/null
+++ b/Zotlabs/Widget/Notes.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Notes {
+
+ function widget($arr) {
+ if(! local_channel())
+ return '';
+ if(! feature_enabled(local_channel(),'private_notes'))
+ return '';
+
+ $text = get_pconfig(local_channel(),'notes','text');
+
+ $o = replace_macros(get_markup_template('notes.tpl'), array(
+ '$banner' => t('Notes'),
+ '$text' => $text,
+ '$save' => t('Save'),
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Photo.php b/Zotlabs/Widget/Photo.php
new file mode 100644
index 000000000..10031f028
--- /dev/null
+++ b/Zotlabs/Widget/Photo.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Photo {
+
+
+ /**
+ * @brief Widget to display a single photo.
+ *
+ * @param array $arr associative array with
+ * * \e string \b src URL of photo; URL must be an http or https URL
+ * * \e boolean \b zrl use zid in URL
+ * * \e string \b style CSS string
+ *
+ * @return string with parsed HTML
+ */
+
+ function widget($arr) {
+
+ $style = $zrl = false;
+
+ if(array_key_exists('src', $arr) && isset($arr['src']))
+ $url = $arr['src'];
+
+ if(strpos($url, 'http') !== 0)
+ return '';
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpbrk($style, '(\'"<>' ) !== false)
+ $style = '';
+
+ if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
+ $zrl = (($arr['zrl']) ? true : false);
+
+ if($zrl)
+ $url = zid($url);
+
+ $o = '<div class="widget">';
+
+ $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
+ . (($style) ? ' style="' . $style . '"' : '')
+ . ' src="' . $url . '" alt="' . t('photo/image') . '">';
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Photo_albums.php b/Zotlabs/Widget/Photo_albums.php
new file mode 100644
index 000000000..6df8ddf3c
--- /dev/null
+++ b/Zotlabs/Widget/Photo_albums.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/photos.php');
+
+class Photo_albums {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return '';
+
+ $channelx = channelx_by_n(\App::$profile['profile_uid']);
+
+ if((! $channelx) || (! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_storage')))
+ return '';
+
+ $sortkey = ((array_key_exists('sortkey',$arr)) ? $arr['sortkey'] : 'display_path');
+ $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
+
+ return photos_album_widget($channelx, \App::get_observer(),$sortkey,$direction);
+ }
+}
+
diff --git a/Zotlabs/Widget/Photo_rand.php b/Zotlabs/Widget/Photo_rand.php
new file mode 100644
index 000000000..af80a3b9f
--- /dev/null
+++ b/Zotlabs/Widget/Photo_rand.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/photos.php');
+
+class Photo_rand {
+
+ function widget($arr) {
+
+ $style = false;
+
+ if(array_key_exists('album', $arr) && isset($arr['album']))
+ $album = $arr['album'];
+ else
+ $album = '';
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ $scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
+
+ $ret = photos_list_photos(array('channel_id' => $channel_id),\App::get_observer(),$album);
+
+ $filtered = array();
+ if($ret['success'] && $ret['photos'])
+ foreach($ret['photos'] as $p)
+ if($p['imgscale'] == $scale)
+ $filtered[] = $p['src'];
+
+ if($filtered) {
+ $e = mt_rand(0, count($filtered) - 1);
+ $url = $filtered[$e];
+ }
+
+ if(strpos($url, 'http') !== 0)
+ return '';
+
+ if(array_key_exists('style', $arr) && isset($arr['style']))
+ $style = $arr['style'];
+
+ // ensure they can't sneak in an eval(js) function
+
+ if(strpos($style,'(') !== false)
+ return '';
+
+ $url = zid($url);
+
+ $o = '<div class="widget">';
+
+ $o .= '<img class="zrl" '
+ . (($style) ? ' style="' . $style . '"' : '')
+ . ' src="' . $url . '" alt="' . t('photo/image') . '">';
+
+ $o .= '</div>';
+
+ return $o;
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Profile.php b/Zotlabs/Widget/Profile.php
new file mode 100644
index 000000000..bffd910b6
--- /dev/null
+++ b/Zotlabs/Widget/Profile.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Profile {
+
+ function widget($args) {
+ $block = observer_prohibited();
+ return profile_sidebar(\App::$profile, $block, true);
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Pubsites.php b/Zotlabs/Widget/Pubsites.php
new file mode 100644
index 000000000..958ba68c2
--- /dev/null
+++ b/Zotlabs/Widget/Pubsites.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Pubsites {
+
+ // used by site ratings pages to provide a return link
+
+ function widget($arr) {
+ if(\App::$poi)
+ return;
+ return '<div class="widget"><ul class="nav nav-pills"><li><a href="pubsites">' . t('Public Hubs') . '</a></li></ul></div>';
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Random_block.php b/Zotlabs/Widget/Random_block.php
new file mode 100644
index 000000000..465a51f97
--- /dev/null
+++ b/Zotlabs/Widget/Random_block.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Random_block {
+
+ function widget($arr) {
+
+ $channel_id = 0;
+ if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
+ $channel_id = intval($arr['channel_id']);
+ if(! $channel_id)
+ $channel_id = \App::$profile_uid;
+ if(! $channel_id)
+ return '';
+
+ if(array_key_exists('contains',$arr))
+ $contains = $arr['contains'];
+
+ $o = '';
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($channel_id);
+
+ $randfunc = db_getfunc('RAND');
+
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
+ item_type = %d $sql_options order by $randfunc limit 1",
+ intval($channel_id),
+ dbesc('%' . $contains . '%'),
+ intval(ITEM_TYPE_BLOCK)
+ );
+
+ if($r) {
+ $o = '<div class="widget bblock">';
+ if($r[0]['title'])
+ $o .= '<h3>' . $r[0]['title'] . '</h3>';
+
+ $o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
+ $o .= '</div>';
+ }
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Rating.php b/Zotlabs/Widget/Rating.php
new file mode 100644
index 000000000..5e09f457b
--- /dev/null
+++ b/Zotlabs/Widget/Rating.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Rating {
+
+ function widget($arr) {
+
+
+ $rating_enabled = get_config('system','rating_enabled');
+ if(! $rating_enabled) {
+ return;
+ }
+
+ if($arr['target'])
+ $hash = $arr['target'];
+ else
+ $hash = \App::$poi['xchan_hash'];
+
+ if(! $hash)
+ return;
+
+ $url = '';
+ $remote = false;
+
+ if(remote_channel() && ! local_channel()) {
+ $ob = \App::get_observer();
+ if($ob && $ob['xchan_url']) {
+ $p = parse_url($ob['xchan_url']);
+ if($p) {
+ $url = $p['scheme'] . '://' . $p['host'] . (($p['port']) ? ':' . $p['port'] : '');
+ $url .= '/rate?f=&target=' . urlencode($hash);
+ }
+ $remote = true;
+ }
+ }
+
+ $self = false;
+
+ if(local_channel()) {
+ $channel = \App::get_channel();
+
+ if($hash == $channel['channel_hash'])
+ $self = true;
+
+ head_add_js('ratings.js');
+ }
+
+
+ $o = '<div class="widget">';
+ $o .= '<h3>' . t('Rating Tools') . '</h3>';
+
+ if((($remote) || (local_channel())) && (! $self)) {
+ if($remote)
+ $o .= '<a class="btn btn-block btn-primary btn-sm" href="' . $url . '"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</a>';
+ else
+ $o .= '<div class="btn btn-block btn-primary btn-sm" onclick="doRatings(\'' . $hash . '\'); return false;"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</div>';
+ }
+
+ $o .= '<a class="btn btn-block btn-default btn-sm" href="ratings/' . $hash . '"><i class="fa fa-eye"></i> ' . t('View Ratings') . '</a>';
+ $o .= '</div>';
+
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Savedsearch.php b/Zotlabs/Widget/Savedsearch.php
new file mode 100644
index 000000000..378c27139
--- /dev/null
+++ b/Zotlabs/Widget/Savedsearch.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Savedsearch {
+
+ function widget($arr) {
+
+ if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
+ return '';
+
+ $search = ((x($_GET,'netsearch')) ? $_GET['netsearch'] : '');
+ if(! $search)
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ if(x($_GET,'searchsave') && $search) {
+ $r = q("select * from term where uid = %d and ttype = %d and term = '%s' limit 1",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ if(! $r) {
+ q("insert into term ( uid,ttype,term ) values ( %d, %d, '%s') ",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ }
+ }
+
+ if(x($_GET,'searchremove') && $search) {
+ q("delete from term where uid = %d and ttype = %d and term = '%s'",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ $search = '';
+ }
+
+ $srchurl = \App::$query_string;
+
+ $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
+
+ if(($hasamp) && (! $hasq))
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+
+ $o = '';
+
+ $r = q("select tid,term from term WHERE uid = %d and ttype = %d ",
+ intval(local_channel()),
+ intval(TERM_SAVEDSEARCH)
+ );
+
+ $saved = array();
+
+ if(count($r)) {
+ foreach($r as $rr) {
+ $saved[] = array(
+ 'id' => $rr['tid'],
+ 'term' => $rr['term'],
+ 'dellink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
+ 'srchlink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
+ 'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
+ 'encodedterm' => urlencode($rr['term']),
+ 'delete' => t('Remove term'),
+ 'selected' => ($search==$rr['term']),
+ );
+ }
+ }
+
+ $tpl = get_markup_template("saved_searches.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Saved Searches'),
+ '$add' => t('add'),
+ '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), true),
+ '$saved' => $saved,
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Settings_menu.php b/Zotlabs/Widget/Settings_menu.php
new file mode 100644
index 000000000..753390c23
--- /dev/null
+++ b/Zotlabs/Widget/Settings_menu.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Settings_menu {
+
+ function widget($arr) {
+
+ if(! local_channel())
+ return;
+
+
+ $channel = \App::get_channel();
+
+ $abook_self_id = 0;
+
+ // Retrieve the 'self' address book entry for use in the auto-permissions link
+
+ $role = get_pconfig(local_channel(),'system','permissions_role');
+
+ $abk = q("select abook_id from abook where abook_channel = %d and abook_self = 1 limit 1",
+ intval(local_channel())
+ );
+ if($abk)
+ $abook_self_id = $abk[0]['abook_id'];
+
+ $x = q("select count(*) as total from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 ",
+ dbesc($channel['channel_hash'])
+ );
+
+ $hublocs = (($x && $x[0]['total'] > 1) ? true : false);
+
+ $tabs = array(
+ array(
+ 'label' => t('Account settings'),
+ 'url' => z_root().'/settings/account',
+ 'selected' => ((argv(1) === 'account') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Channel settings'),
+ 'url' => z_root().'/settings/channel',
+ 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
+ ),
+
+ );
+
+ if(get_account_techlevel() > 0 && get_features()) {
+ $tabs[] = array(
+ 'label' => t('Additional features'),
+ 'url' => z_root().'/settings/features',
+ 'selected' => ((argv(1) === 'features') ? 'active' : ''),
+ );
+ }
+
+ $tabs[] = array(
+ 'label' => t('Feature/Addon settings'),
+ 'url' => z_root().'/settings/featured',
+ 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
+ );
+
+ $tabs[] = array(
+ 'label' => t('Display settings'),
+ 'url' => z_root().'/settings/display',
+ 'selected' => ((argv(1) === 'display') ? 'active' : ''),
+ );
+
+ if($hublocs) {
+ $tabs[] = array(
+ 'label' => t('Manage locations'),
+ 'url' => z_root() . '/locs',
+ 'selected' => ((argv(1) === 'locs') ? 'active' : ''),
+ );
+ }
+
+ $tabs[] = array(
+ 'label' => t('Export channel'),
+ 'url' => z_root() . '/uexport',
+ 'selected' => ''
+ );
+
+ $tabs[] = array(
+ 'label' => t('Connected apps'),
+ 'url' => z_root() . '/settings/oauth',
+ 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
+ );
+
+ if(get_account_techlevel() > 2) {
+ $tabs[] = array(
+ 'label' => t('Guest Access Tokens'),
+ 'url' => z_root() . '/settings/tokens',
+ 'selected' => ((argv(1) === 'tokens') ? 'active' : ''),
+ );
+ }
+
+ if(feature_enabled(local_channel(),'permcats')) {
+ $tabs[] = array(
+ 'label' => t('Permission Groups'),
+ 'url' => z_root() . '/settings/permcats',
+ 'selected' => ((argv(1) === 'permcats') ? 'active' : ''),
+ );
+ }
+
+
+ if($role === false || $role === 'custom') {
+ $tabs[] = array(
+ 'label' => t('Connection Default Permissions'),
+ 'url' => z_root() . '/connedit/' . $abook_self_id,
+ 'selected' => ''
+ );
+ }
+
+ if(feature_enabled(local_channel(),'premium_channel')) {
+ $tabs[] = array(
+ 'label' => t('Premium Channel Settings'),
+ 'url' => z_root() . '/connect/' . $channel['channel_address'],
+ 'selected' => ''
+ );
+ }
+
+ if(feature_enabled(local_channel(),'channel_sources')) {
+ $tabs[] = array(
+ 'label' => t('Channel Sources'),
+ 'url' => z_root() . '/sources',
+ 'selected' => ''
+ );
+ }
+
+ $tabtpl = get_markup_template("generic_links_widget.tpl");
+ return replace_macros($tabtpl, array(
+ '$title' => t('Settings'),
+ '$class' => 'settings-widget',
+ '$items' => $tabs,
+ ));
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Shortprofile.php b/Zotlabs/Widget/Shortprofile.php
new file mode 100644
index 000000000..9c2a46e75
--- /dev/null
+++ b/Zotlabs/Widget/Shortprofile.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Shortprofile {
+
+ function widget($arr) {
+
+ if(! \App::$profile['profile_uid'])
+ return;
+
+ $block = observer_prohibited();
+
+ return profile_sidebar(\App::$profile, $block, true, true);
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Sitesearch.php b/Zotlabs/Widget/Sitesearch.php
new file mode 100644
index 000000000..b3a25d76a
--- /dev/null
+++ b/Zotlabs/Widget/Sitesearch.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Sitesearch {
+
+ function widget($arr) {
+
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ $srchurl = \App::$query_string;
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+
+
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
+
+ if(($hasamp) && (! $hasq))
+ $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
+
+ $o = '';
+
+ $saved = array();
+
+ $tpl = get_markup_template("sitesearch.tpl");
+ $o = replace_macros($tpl, array(
+ '$title' => t('Search'),
+ '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), false),
+ '$saved' => $saved,
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Suggestedchats.php b/Zotlabs/Widget/Suggestedchats.php
new file mode 100644
index 000000000..7df42944d
--- /dev/null
+++ b/Zotlabs/Widget/Suggestedchats.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Suggestedchats {
+
+ function widget($arr) {
+
+ if(! feature_enabled(\App::$profile['profile_uid'],'ajaxchat'))
+ return '';
+
+ // There are reports that this tool does not ever remove chatrooms on dead sites,
+ // and also will happily link to private chats which you cannot enter.
+ // For those reasons, it will be disabled until somebody decides it's worth
+ // fixing and comes up with a plan for doing so.
+
+ return '';
+
+ // probably should restrict this to your friends, but then the widget will only work
+ // if you are logged in locally.
+
+ $h = get_observer_hash();
+ if(! $h)
+ return;
+ $r = q("select xchat_url, xchat_desc, count(xchat_xchan) as total from xchat group by xchat_url, xchat_desc order by total desc, xchat_desc limit 24");
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
+ }
+ }
+ return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
+ '$header' => t('Suggested Chatrooms'),
+ '$rooms' => $r
+ ));
+ }
+}
+
diff --git a/Zotlabs/Widget/Suggestions.php b/Zotlabs/Widget/Suggestions.php
new file mode 100644
index 000000000..5fb3d3e8b
--- /dev/null
+++ b/Zotlabs/Widget/Suggestions.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/socgraph.php');
+
+
+class Suggestions {
+
+ function widget($arr) {
+
+ if((! local_channel()) || (! feature_enabled(local_channel(),'suggest')))
+ return '';
+
+
+ $r = suggestion_query(local_channel(),get_observer_hash(),0,20);
+
+ if(! $r) {
+ return;
+ }
+
+ $arr = array();
+
+ // Get two random entries from the top 20 returned.
+ // We'll grab the first one and the one immediately following.
+ // This will throw some entropy intot he situation so you won't
+ // be looking at the same two mug shots every time the widget runs
+
+ $index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
+
+ for($x = $index; $x <= ($index+1); $x ++) {
+ $rr = $r[$x];
+ if(! $rr['xchan_url'])
+ break;
+
+ $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
+
+ $arr[] = array(
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'profile' => $rr['xchan_url'],
+ 'name' => $rr['xchan_name'],
+ 'photo' => $rr['xchan_photo_m'],
+ 'ignlnk' => z_root() . '/directory?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
+ }
+
+ $o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
+ '$title' => t('Suggestions'),
+ '$more' => t('See more...'),
+ '$entries' => $arr
+ ));
+
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Tagcloud.php b/Zotlabs/Widget/Tagcloud.php
new file mode 100644
index 000000000..cf7a4932e
--- /dev/null
+++ b/Zotlabs/Widget/Tagcloud.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+// @FIXME The problem with this widget is that we don't have a search function for webpages
+// that we can send the links to. Then we should also provide an option to search webpages
+// and conversations.
+
+class Tagcloud {
+
+ function widget($args) {
+
+ $o = '';
+ $uid = \App::$profile_uid;
+ $count = ((x($args,'count')) ? intval($args['count']) : 24);
+ $flags = 0;
+ $type = TERM_CATEGORY;
+
+ // @FIXME there exists no $authors variable
+ $r = tagadelic($uid, $count, $authors, $owner, $flags, ITEM_TYPE_WEBPAGE, $type);
+
+ // @FIXME this should use a template
+
+ if($r) {
+ $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
+ foreach($r as $rv) {
+ $o .= '<span class="tag' . $rv[2] . '">' . $rv[0] .' </span> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+ }
+}
diff --git a/Zotlabs/Widget/Tagcloud_wall.php b/Zotlabs/Widget/Tagcloud_wall.php
new file mode 100644
index 000000000..7cff6ce09
--- /dev/null
+++ b/Zotlabs/Widget/Tagcloud_wall.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Tagcloud_wall {
+
+ function widget($arr) {
+
+ if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
+ return '';
+ if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
+ return '';
+
+ $limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
+ if(feature_enabled(\App::$profile['profile_uid'], 'tagadelic'))
+ return wtagblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
+
+ return '';
+ }
+}
diff --git a/Zotlabs/Widget/Tasklist.php b/Zotlabs/Widget/Tasklist.php
new file mode 100644
index 000000000..6f7a8aaed
--- /dev/null
+++ b/Zotlabs/Widget/Tasklist.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/event.php');
+
+class Tasklist {
+
+ function widget($arr) {
+
+ if (! local_channel())
+ return;
+
+ $o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
+ $o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
+ function tasksFetch() {
+ $.get("tasks/fetch" + ((tasksShowAll) ? "/all" : ""), function(data) {
+ $(".tasklist-tasks").html(data.html);
+ });
+ }
+ </script>';
+
+ $o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
+ $o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
+ $o .= '</div>';
+ return $o;
+
+ }
+}
+
diff --git a/Zotlabs/Widget/Vcard.php b/Zotlabs/Widget/Vcard.php
new file mode 100644
index 000000000..cab05dfdd
--- /dev/null
+++ b/Zotlabs/Widget/Vcard.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Vcard {
+
+ function widget($arr) {
+ return vcard_from_xchan('', \App::get_observer());
+ }
+
+}
+
diff --git a/Zotlabs/Widget/Website_portation_tools.php b/Zotlabs/Widget/Website_portation_tools.php
new file mode 100644
index 000000000..1cf3bb78a
--- /dev/null
+++ b/Zotlabs/Widget/Website_portation_tools.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Website_portation_tools {
+
+ function widget($arr) {
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_channel() is sufficient for permissions.
+
+ if(\App::$profile['profile_uid'])
+ if((\App::$profile['profile_uid'] != local_channel()) && (! \App::$is_sys))
+ return '';
+
+ if(! local_channel())
+ return '';
+
+ return website_portation_tools();
+ }
+}
diff --git a/Zotlabs/Widget/Wiki_list.php b/Zotlabs/Widget/Wiki_list.php
new file mode 100644
index 000000000..62f32dbf0
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_list.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Wiki_list {
+
+ function widget($arr) {
+
+ $channel = channelx_by_n(\App::$profile_uid);
+
+ $wikis = \Zotlabs\Lib\NativeWiki::listwikis($channel,get_observer_hash());
+
+ if($wikis) {
+ return replace_macros(get_markup_template('wikilist_widget.tpl'), array(
+ '$header' => t('Wiki List'),
+ '$channel' => $channel['channel_address'],
+ '$wikis' => $wikis['wikis']
+ ));
+ }
+ return '';
+ }
+
+}
diff --git a/Zotlabs/Widget/Wiki_page_history.php b/Zotlabs/Widget/Wiki_page_history.php
new file mode 100644
index 000000000..dcec9a037
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_page_history.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Wiki_page_history {
+
+ function widget($arr) {
+
+ $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
+ $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
+
+ $pageHistory = \Zotlabs\Lib\NativeWikiPage::page_history([
+ 'channel_id' => \App::$profile_uid,
+ 'observer_hash' => get_observer_hash(),
+ 'resource_id' => $resource_id,
+ 'pageUrlName' => $pageUrlName
+ ]);
+
+ return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
+ '$pageHistory' => $pageHistory['history'],
+ '$permsWrite' => $arr['permsWrite'],
+ '$name_lbl' => t('Name'),
+ '$msg_label' => t('Message','wiki_history')
+ ));
+
+ }
+}
diff --git a/Zotlabs/Widget/Wiki_pages.php b/Zotlabs/Widget/Wiki_pages.php
new file mode 100644
index 000000000..f992b3f93
--- /dev/null
+++ b/Zotlabs/Widget/Wiki_pages.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+class Wiki_pages {
+
+ function widget($arr) {
+
+ $channelname = ((array_key_exists('channel',$arr)) ? $arr['channel'] : '');
+ $c = channelx_by_nick($channelname);
+
+ if(! $c)
+ $c = \App::get_channel();
+
+ if(! $c)
+ return '';
+
+ $wikiname = '';
+ if(array_key_exists('refresh', $arr)) {
+ $not_refresh = (($arr['refresh']=== true) ? false : true);
+ }
+ else {
+ $not_refresh = true;
+ }
+
+ $pages = array();
+ if(! array_key_exists('resource_id', $arr)) {
+ $hide = true;
+ }
+ else {
+ $p = \Zotlabs\Lib\NativeWikiPage::page_list($c['channel_id'],get_observer_hash(),$arr['resource_id']);
+
+ if($p['pages']) {
+ $pages = $p['pages'];
+ $w = $p['wiki'];
+ // Wiki item record is $w['wiki']
+ $wikiname = $w['urlName'];
+ if (!$wikiname) {
+ $wikiname = '';
+ }
+ }
+ }
+
+
+ $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_wiki');
+
+ $can_delete = ((local_channel() && (local_channel() == \App::$profile['uid'])) ? true : false);
+
+ return replace_macros(get_markup_template('wiki_page_list.tpl'), array(
+ '$hide' => $hide,
+ '$resource_id' => $arr['resource_id'],
+ '$not_refresh' => $not_refresh,
+ '$header' => t('Wiki Pages'),
+ '$channel' => $channelname,
+ '$wikiname' => $wikiname,
+ '$pages' => $pages,
+ '$canadd' => $can_create,
+ '$candel' => $can_delete,
+ '$addnew' => t('Add new page'),
+ '$pageName' => array('pageName', t('Page name')),
+ ));
+ }
+}
+
+
diff --git a/Zotlabs/Widget/Zcard.php b/Zotlabs/Widget/Zcard.php
new file mode 100644
index 000000000..12e53eaab
--- /dev/null
+++ b/Zotlabs/Widget/Zcard.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+class Zcard {
+
+ function widget($args) {
+ $channel = channelx_by_n(\App::$profile_uid);
+ return get_zcard($channel,get_observer_hash(),array('width' => 875));
+ }
+}
diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php
index 7e0f5fb7c..9871b5bbd 100644
--- a/Zotlabs/Zot/Finger.php
+++ b/Zotlabs/Zot/Finger.php
@@ -123,9 +123,7 @@ class Finger {
}
else {
logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- // after 2017-01-01 this will be a hard error unless you over-ride it.
- if((time() > 1483228800) && (! get_config('system', 'allow_unsigned_zotfinger')))
- return $ret;
+ return $ret;
}
}
diff --git a/app/admin.png b/app/admin.png
deleted file mode 100644
index cde922e8e..000000000
--- a/app/admin.png
+++ /dev/null
Binary files differ
diff --git a/app/features.apd b/app/features.apd
deleted file mode 100644
index bffbdffec..000000000
--- a/app/features.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/settings/features
-requires: local_channel
-name: Features
-photo: icon:cogs
-categories: System
diff --git a/app/features.png b/app/features.png
deleted file mode 100644
index 5faf14bc3..000000000
--- a/app/features.png
+++ /dev/null
Binary files differ
diff --git a/app/login.apd b/app/login.apd
deleted file mode 100644
index 1cbb44f1b..000000000
--- a/app/login.apd
+++ /dev/null
@@ -1,5 +0,0 @@
-version: 1
-url: $baseurl/login
-requires: nologin
-name: Login
-photo: icon:sign-in
diff --git a/app/manage.apd b/app/manage.apd
deleted file mode 100644
index b525efa6c..000000000
--- a/app/manage.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/manage
-requires: local_channel
-name: Channel Manager
-photo: icon:id-card-o
-categories: Personal
diff --git a/app/manage.png b/app/manage.png
deleted file mode 100644
index 38a4dcbae..000000000
--- a/app/manage.png
+++ /dev/null
Binary files differ
diff --git a/app/profile.apd b/app/profile.apd
deleted file mode 100644
index c8205df63..000000000
--- a/app/profile.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/profile/$nick
-requires: local_channel
-name: View Profile
-photo: icon:user
-categories: Personal
diff --git a/app/profile.png b/app/profile.png
deleted file mode 100644
index e6e137c82..000000000
--- a/app/profile.png
+++ /dev/null
Binary files differ
diff --git a/app/settings.apd b/app/settings.apd
deleted file mode 100644
index b244f6774..000000000
--- a/app/settings.apd
+++ /dev/null
@@ -1,6 +0,0 @@
-version: 1
-url: $baseurl/settings
-requires: local_channel
-name: Settings
-photo: icon:cog
-categories: System
diff --git a/app/settings.png b/app/settings.png
deleted file mode 100644
index 2ba11a79a..000000000
--- a/app/settings.png
+++ /dev/null
Binary files differ
diff --git a/boot.php b/boot.php
index 127a45065..52b1113c1 100755
--- a/boot.php
+++ b/boot.php
@@ -5,14 +5,13 @@
*/
/**
- * Hubzilla.
*
- * Hubzilla is an open source decentralised communications
+ * This is an open source decentralised communications
* platform combined with a decentralised identity/authentication framework
* wrapped in an extensible content management system, providing website designers
* the ability to embed fully decentralised communications and social tools
* into many traditional website designs (blogs, forums, small business
- * websites, charitable organisations, etc.). Hubzilla also provides DNS mobility
+ * websites, charitable organisations, etc.). Also provided is DNS mobility
* and internet scale privacy/access control.
*
* This allows any individual website to participate in a matrix of linked
@@ -50,7 +49,7 @@ require_once('include/hubloc.php');
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '2.1' );
+define ( 'STD_VERSION', '2.3.3' );
define ( 'ZOT_REVISION', '1.2' );
define ( 'DB_UPDATE_VERSION', 1188 );
@@ -79,12 +78,11 @@ define ( 'DIRECTORY_MODE_STANDALONE', 0x0100); // A detached (off the grid) hub
// point to go out and find the rest of the world.
define ( 'DIRECTORY_REALM', 'RED_GLOBAL');
-define ( 'DIRECTORY_FALLBACK_MASTER', 'https://hub.pixelbits.de');
+define ( 'DIRECTORY_FALLBACK_MASTER', 'https://gravizot.de');
$DIRECTORY_FALLBACK_SERVERS = array(
- 'https://hubzilla.site',
+ //'https://hubzilla.site',
'https://hubzilla.zottel.net',
- 'https://hub.pixelbits.de',
'https://my.federated.social',
'https://hubzilla.nl',
'https://gravizot.de'
@@ -127,7 +125,9 @@ define ( 'LANGUAGE_DETECT_MIN_CONFIDENCE', 0.01 );
* either more or less restrictive.
*/
-define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+if(! defined('STORAGE_DEFAULT_PERMISSIONS')) {
+ define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+}
/**
@@ -150,12 +150,6 @@ define ( 'MAX_IMAGE_LENGTH', -1 );
/**
- * Not yet used
- */
-
-define ( 'DEFAULT_DB_ENGINE', 'MyISAM' );
-
-/**
* log levels
*/
@@ -193,15 +187,6 @@ define ( 'ACCESS_FREE', 2 );
define ( 'ACCESS_TIERED', 3 );
/**
- * relationship types
- */
-
-define ( 'CONTACT_IS_FOLLOWER', 1);
-define ( 'CONTACT_IS_SHARING', 2);
-define ( 'CONTACT_IS_FRIEND', 3);
-
-
-/**
* DB update return values
*/
@@ -528,14 +513,6 @@ define ( 'ACTIVITY_OBJ_LOCATION',NAMESPACE_ZOT . '/activity/location' );
define ( 'ACTIVITY_OBJ_FILE', NAMESPACE_ZOT . '/activity/file' );
/**
- * item weight for query ordering
- */
-
-define ( 'GRAVITY_PARENT', 0);
-define ( 'GRAVITY_LIKE', 3);
-define ( 'GRAVITY_COMMENT', 6);
-
-/**
* Account Flags
*/
@@ -550,7 +527,6 @@ define ( 'ACCOUNT_PENDING', 0x0010 );
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 );
define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 );
define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
@@ -560,16 +536,16 @@ define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
*/
define ( 'ITEM_VISIBLE', 0x0000);
-//define ( 'ITEM_HIDDEN', 0x0001);
+define ( 'ITEM_HIDDEN', 0x0001);
define ( 'ITEM_BLOCKED', 0x0002);
define ( 'ITEM_MODERATED', 0x0004);
define ( 'ITEM_SPAM', 0x0008);
-//define ( 'ITEM_DELETED', 0x0010);
+define ( 'ITEM_DELETED', 0x0010);
define ( 'ITEM_UNPUBLISHED', 0x0020);
-//define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
+define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
define ( 'ITEM_DELAYED_PUBLISH', 0x0080);
define ( 'ITEM_BUILDBLOCK', 0x0100); // Named thusly to make sure nobody confuses this with ITEM_BLOCKED
-//define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
+define ( 'ITEM_PDL', 0x0200); // Page Description Language - e.g. Comanche
define ( 'ITEM_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker
define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed
define ( 'ITEM_DOC', 0x1000); // hubzilla only, define here so that item import does the right thing
@@ -643,9 +619,6 @@ function sys_boot() {
define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-32.png' );
}
- if(! defined('CRYPTO_ALGORITHM')) {
- define( 'CRYPTO_ALGORITHM', 'aes256cbc' );
- }
/*
* Try to open the database;
@@ -728,6 +701,7 @@ function startup() {
* which is now static (although currently constructed at startup). We are only converting
* 'system' config settings.
*/
+
class miniApp {
public $config = array('system' => array());
@@ -1283,18 +1257,6 @@ class App {
/**
- * @brief Retrieve the App structure.
- *
- * Useful in functions which require it but don't get it passed to them
- *
- * @return App
- */
-function get_app() {
- return $a;
-}
-
-
-/**
* @brief Multi-purpose function to check variable state.
*
* Usage: x($var) or $x($array, 'key')
@@ -1385,6 +1347,24 @@ function os_mkdir($path, $mode = 0777, $recursive = false) {
return $result;
}
+
+// recursively delete a directory
+function rrmdir($path) {
+ if(is_dir($path) === true) {
+ $files = array_diff(scandir($path), array('.', '..'));
+ foreach($files as $file) {
+ rrmdir(realpath($path) . '/' . $file);
+ }
+ return rmdir($path);
+ }
+ elseif(is_file($path) === true) {
+ return unlink($path);
+ }
+
+ return false;
+}
+
+
/**
* @brief Function to check if request was an AJAX (xmlhttprequest) request.
*
@@ -1399,11 +1379,7 @@ function is_ajax() {
// base url for use in cmdline programs which don't have
// $_SERVER variables, and synchronising the state of installed plugins.
-function check_config(&$a) {
-
- $build = get_config('system','db_version');
- if(! intval($build))
- $build = set_config('system','db_version',DB_UPDATE_VERSION);
+function check_config() {
$saved = get_config('system','urlverify');
if(! $saved)
@@ -1441,88 +1417,8 @@ function check_config(&$a) {
if (! $syschan_exists)
create_sys_channel();
- if($build != DB_UPDATE_VERSION) {
- $stored = intval($build);
- if(! $stored) {
- logger('Critical: check_config unable to determine database schema version');
- return;
- }
- $current = intval(DB_UPDATE_VERSION);
- if(($stored < $current) && file_exists('install/update.php')) {
-
- load_config('database');
-
- // We're reporting a different version than what is currently installed.
- // Run any existing update scripts to bring the database up to current.
- require_once('install/update.php');
-
- // make sure that boot.php and update.php are the same release, we might be
- // updating right this very second and the correct version of the update.php
- // file may not be here yet. This can happen on a very busy site.
-
- if(DB_UPDATE_VERSION == UPDATE_VERSION) {
- for($x = $stored; $x < $current; $x ++) {
- if(function_exists('update_r' . $x)) {
- // There could be a lot of processes running or about to run.
- // We want exactly one process to run the update command.
- // So store the fact that we're taking responsibility
- // after first checking to see if somebody else already has.
-
- // If the update fails or times-out completely you may need to
- // delete the config entry to try again.
-
- if(get_config('database','update_r' . $x))
- break;
- set_config('database','update_r' . $x, '1');
- // call the specific update
-
- $func = 'update_r' . $x;
- $retval = $func();
- if($retval) {
-
- // Prevent sending hundreds of thousands of emails by creating
- // a lockfile.
-
- $lockfile = 'store/[data]/mailsent';
-
- if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
- return;
- @unlink($lockfile);
- //send the administrator an e-mail
- file_put_contents($lockfile, $x);
-
- $r = q("select account_language from account where account_email = '%s' limit 1",
- dbesc(App::$config['system']['admin_email'])
- );
- push_lang(($r) ? $r[0]['account_language'] : 'en');
-
-
- $email_tpl = get_intltext_template("update_fail_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$update' => $x,
- '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
- ));
-
- $subject = email_header_encode(sprintf(t('Update Error at %s'), z_root()));
-
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- //try the logger
- logger('CRITICAL: Update Failed: ' . $x);
- pop_lang();
- }
- else
- set_config('database','update_r' . $x, 'success');
- }
- }
- set_config('system','db_version', DB_UPDATE_VERSION);
- }
- }
- }
+ $x = new \Zotlabs\Lib\DB_Upgrade(DB_UPDATE_VERSION);
+
/**
*
@@ -1807,18 +1703,6 @@ function local_channel() {
}
/**
- * local_user() got deprecated and replaced by local_channel().
- *
- * @deprecated since v2.1, use local_channel()
- * @see local_channel()
- */
-function local_user() {
- logger('local_user() is DEPRECATED, use local_channel()');
- return local_channel();
-}
-
-
-/**
* @brief Returns a xchan_hash (visitor_id) of remote authenticated visitor
* or false.
*
@@ -1840,18 +1724,6 @@ function remote_channel() {
}
/**
- * remote_user() got deprecated and replaced by remote_channel().
- *
- * @deprecated since v2.1, use remote_channel()
- * @see remote_channel()
- */
-function remote_user() {
- logger('remote_user() is DEPRECATED, use remote_channel()');
- return remote_channel();
-}
-
-
-/**
* Contents of $s are displayed prominently on the page the next time
* a page is loaded. Usually used for errors or alerts.
*
@@ -2143,7 +2015,7 @@ function curPageURL() {
*
* @return mixed
*/
-function get_custom_nav(&$a, $navname) {
+function get_custom_nav($navname) {
if (! $navname)
return App::$page['nav'];
// load custom nav menu by name here
@@ -2155,9 +2027,8 @@ function get_custom_nav(&$a, $navname) {
* If there is no parsed Comanche template already load a module's pdl file
* and parse it with Comanche.
*
- * @param App &$a global application object
*/
-function load_pdl(&$a) {
+function load_pdl() {
App::$comanche = new Zotlabs\Render\Comanche();
@@ -2184,7 +2055,7 @@ function load_pdl(&$a) {
}
-function exec_pdl(&$a) {
+function exec_pdl() {
if(App::$pdl) {
App::$comanche->parse(App::$pdl,1);
}
@@ -2196,11 +2067,10 @@ function exec_pdl(&$a) {
*
* Build the page - now that we have all the components
*
- * @param App &$a global application object
*/
-function construct_page(&$a) {
+function construct_page() {
- exec_pdl($a);
+ exec_pdl();
$comanche = ((count(App::$layout)) ? true : false);
@@ -2216,7 +2086,7 @@ function construct_page(&$a) {
if ($comanche) {
if (App::$layout['nav']) {
- App::$page['nav'] = get_custom_nav($a, App::$layout['nav']);
+ App::$page['nav'] = get_custom_nav(App::$layout['nav']);
}
}
@@ -2226,7 +2096,7 @@ function construct_page(&$a) {
// Zotlabs\Render\Theme::debug();
if (($p = theme_include($current_theme[0] . '.js')) != '')
- head_add_js($p);
+ head_add_js('/' . $p);
if (($p = theme_include('mod_' . App::$module . '.php')) != '')
require_once($p);
@@ -2238,10 +2108,13 @@ function construct_page(&$a) {
else
head_add_css(((x(App::$page, 'template')) ? App::$page['template'] : 'default' ) . '.css');
- head_add_css('mod_' . App::$module . '.css');
+ if (($p = theme_include('mod_' . App::$module . '.css')) != '')
+ head_add_css('mod_' . App::$module . '.css');
+
head_add_css(Zotlabs\Render\Theme::url($installing));
- head_add_js('mod_' . App::$module . '.js');
+ if (($p = theme_include('mod_' . App::$module . '.js')) != '')
+ head_add_js('mod_' . App::$module . '.js');
App::build_pagehead();
@@ -2337,7 +2210,7 @@ function construct_page(&$a) {
}
/**
- * @brief Returns Hubzilla's root directory.
+ * @brief Returns appplication root directory.
*
* @return string
*/
@@ -2353,7 +2226,7 @@ function appdirpath() {
function head_set_icon($icon) {
App::$data['pageicon'] = $icon;
-// logger('head_set_icon: ' . $icon);
+
}
/**
@@ -2429,10 +2302,10 @@ function z_get_temp_dir() {
function z_check_cert() {
if(strpos(z_root(),'https://') !== false) {
- $x = z_fetch_url(z_root() . '/siteinfo/json');
+ $x = z_fetch_url(z_root() . '/siteinfo.json');
if(! $x['success']) {
$recurse = 0;
- $y = z_fetch_url(z_root() . '/siteinfo/json',false,$recurse,array('novalidate' => true));
+ $y = z_fetch_url(z_root() . '/siteinfo.json',false,$recurse,array('novalidate' => true));
if($y['success'])
cert_bad_email();
}
@@ -2443,23 +2316,23 @@ function z_check_cert() {
/**
* @brief Send email to admin if server has an invalid certificate.
*
- * If a Hubzilla hub is available over https it must have a publicly valid
- * certificate.
+ * If a hub is available over https it must have a publicly valid certificate.
*/
-function cert_bad_email() {
-
- $email_tpl = get_intltext_template("cert_bad_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$error' => t('Website SSL certificate is not valid. Please correct.')
- ));
- $subject = email_header_encode(sprintf(t('[hubzilla] Website SSL error for %s'), App::get_hostname()));
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . App::get_hostname() . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
+function cert_bad_email() {
+ return z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf(t('[$Projectname] Website SSL error for %s'), App::get_hostname()),
+ 'textVersion' => replace_macros(get_intltext_template('cert_bad_eml.tpl'),
+ [
+ '$sitename' => App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$error' => t('Website SSL certificate is not valid. Please correct.')
+ ]
+ )
+ ]
+ );
}
@@ -2570,20 +2443,20 @@ function check_cron_broken() {
return;
}
- $email_tpl = get_intltext_template("cron_bad_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => App::$config['system']['sitename'],
- '$siteurl' => z_root(),
- '$error' => t('Cron/Scheduled tasks not running.'),
- '$lastdate' => (($d)? $d : t('never'))
- ));
-
- $subject = email_header_encode(sprintf(t('[hubzilla] Cron tasks not running on %s'), App::get_hostname()));
- mail(App::$config['system']['admin_email'], $subject, $email_msg,
- 'From: Administrator' . '@' . App::get_hostname() . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- return;
+ return z_mail(
+ [
+ 'toEmail' => \App::$config['system']['admin_email'],
+ 'messageSubject' => sprintf(t('[$Projectname] Cron tasks not running on %s'), App::get_hostname()),
+ 'textVersion' => replace_macros(get_intltext_template('cron_bad_eml.tpl'),
+ [
+ '$sitename' => App::$config['system']['sitename'],
+ '$siteurl' => z_root(),
+ '$error' => t('Cron/Scheduled tasks not running.'),
+ '$lastdate' => (($d)? $d : t('never'))
+ ]
+ )
+ ]
+ );
}
diff --git a/composer.json b/composer.json
index abf583875..09e6d783e 100644
--- a/composer.json
+++ b/composer.json
@@ -28,14 +28,19 @@
"ext-mbstring" : "*",
"ext-xml" : "*",
"ext-openssl" : "*",
- "sabre/dav" : "~3.2"
+ "sabre/dav" : "~3.2",
+ "michelf/php-markdown" : "^1.7",
+ "pixel418/markdownify": "^2.2",
+ "bshaffer/oauth2-server-php": "^1.9",
+ "ezyang/htmlpurifier": "^4.9"
},
"require-dev" : {
- "php" : ">=5.6",
- "phpunit/phpunit" : "^5.6",
+ "php" : ">=7.0",
+ "phpunit/phpunit" : "^6.0",
"behat/behat" : "@stable",
"behat/mink-extension": "@stable",
- "behat/mink-goutte-driver": "@stable"
+ "behat/mink-goutte-driver": "@stable",
+ "php-mock/php-mock-phpunit": "^2.0"
},
"autoload" : {
"psr-4" : {
@@ -52,4 +57,4 @@
"config" : {
"notify-on-install" : false
}
-} \ No newline at end of file
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 000000000..62fd0cb8a
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,3632 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "f1d40dcfbbb2f5364ad55235efaeb5ab",
+ "packages": [
+ {
+ "name": "bshaffer/oauth2-server-php",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bshaffer/oauth2-server-php.git",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "mongodb/mongodb": "^1.1",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "OAuth2": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage": "http://brentertainment.com"
+ }
+ ],
+ "description": "OAuth2 Server for PHP",
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "keywords": [
+ "auth",
+ "oauth",
+ "oauth2"
+ ],
+ "time": "2017-01-06T23:20:00+00:00"
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ],
+ "time": "2017-03-13T06:30:53+00:00"
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Michelf": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": [
+ "markdown"
+ ],
+ "time": "2016-10-29T18:58:20+00:00"
+ },
+ {
+ "name": "pixel418/markdownify",
+ "version": "v2.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Elephant418/Markdownify.git",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "type": "lib",
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "description": "The HTML to Markdown converter for PHP ",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "keywords": [
+ "markdown",
+ "markdownify"
+ ],
+ "time": "2016-09-21T13:01:43+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2016-10-10T12:19:37+00:00"
+ },
+ {
+ "name": "sabre/dav",
+ "version": "3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-dav.git",
+ "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-iconv": "*",
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "lib-libxml": ">=2.7.0",
+ "php": ">=5.5.0",
+ "psr/log": "^1.0",
+ "sabre/event": ">=2.0.0, <4.0.0",
+ "sabre/http": "^4.2.1",
+ "sabre/uri": "^1.0.1",
+ "sabre/vobject": "^4.1.0",
+ "sabre/xml": "^1.4.0"
+ },
+ "require-dev": {
+ "evert/phpdoc-md": "~0.1.0",
+ "monolog/monolog": "^1.18",
+ "phpunit/phpunit": "> 4.8, <=6.0.0",
+ "sabre/cs": "~0.0.5"
+ },
+ "suggest": {
+ "ext-curl": "*",
+ "ext-pdo": "*"
+ },
+ "bin": [
+ "bin/sabredav",
+ "bin/naturalselection"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\DAV\\": "lib/DAV/",
+ "Sabre\\DAVACL\\": "lib/DAVACL/",
+ "Sabre\\CalDAV\\": "lib/CalDAV/",
+ "Sabre\\CardDAV\\": "lib/CardDAV/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "WebDAV Framework for PHP",
+ "homepage": "http://sabre.io/",
+ "keywords": [
+ "CalDAV",
+ "CardDAV",
+ "WebDAV",
+ "framework",
+ "iCalendar"
+ ],
+ "time": "2016-06-28T02:44:05+00:00"
+ },
+ {
+ "name": "sabre/event",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-event.git",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Event\\": "lib/"
+ },
+ "files": [
+ "lib/coroutine.php",
+ "lib/Loop/functions.php",
+ "lib/Promise/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/event is a library for lightweight event-based programming",
+ "homepage": "http://sabre.io/event/",
+ "keywords": [
+ "EventEmitter",
+ "async",
+ "events",
+ "hooks",
+ "plugin",
+ "promise",
+ "signal"
+ ],
+ "time": "2015-11-05T20:14:39+00:00"
+ },
+ {
+ "name": "sabre/http",
+ "version": "4.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-http.git",
+ "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.4",
+ "sabre/event": ">=1.0.0,<4.0.0",
+ "sabre/uri": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.3",
+ "sabre/cs": "~0.0.1"
+ },
+ "suggest": {
+ "ext-curl": " to make http requests with the Client class"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\HTTP\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "homepage": "https://github.com/fruux/sabre-http",
+ "keywords": [
+ "http"
+ ],
+ "time": "2016-01-06T23:00:08+00:00"
+ },
+ {
+ "name": "sabre/uri",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-uri.git",
+ "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\Uri\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Functions for making sense out of URIs.",
+ "homepage": "http://sabre.io/uri/",
+ "keywords": [
+ "rfc3986",
+ "uri",
+ "url"
+ ],
+ "time": "2016-03-08T02:29:27+00:00"
+ },
+ {
+ "name": "sabre/vobject",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.5",
+ "sabre/xml": "~1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~0.0.3"
+ },
+ "suggest": {
+ "hoa/bench": "If you would like to run the benchmark scripts"
+ },
+ "bin": [
+ "bin/vobject",
+ "bin/generate_vcards"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Sabre\\VObject\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Dominik Tobschall",
+ "email": "dominik@fruux.com",
+ "homepage": "http://tobschall.de/",
+ "role": "Developer"
+ },
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net",
+ "homepage": "http://mnt.io/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "http://sabre.io/vobject/",
+ "keywords": [
+ "availability",
+ "freebusy",
+ "iCalendar",
+ "ical",
+ "ics",
+ "jCal",
+ "jCard",
+ "recurrence",
+ "rfc2425",
+ "rfc2426",
+ "rfc2739",
+ "rfc4770",
+ "rfc5545",
+ "rfc5546",
+ "rfc6321",
+ "rfc6350",
+ "rfc6351",
+ "rfc6474",
+ "rfc6638",
+ "rfc6715",
+ "rfc6868",
+ "vCalendar",
+ "vCard",
+ "vcf",
+ "xCal",
+ "xCard"
+ ],
+ "time": "2016-07-15T19:52:17+00:00"
+ },
+ {
+ "name": "sabre/xml",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-xml.git",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "lib-libxml": ">=2.6.20",
+ "php": ">=5.5.5",
+ "sabre/uri": ">=1.0,<3.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*",
+ "sabre/cs": "~1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Sabre\\Xml\\": "lib/"
+ },
+ "files": [
+ "lib/Deserializer/functions.php",
+ "lib/Serializer/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Markus Staab",
+ "email": "markus.staab@redaxo.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "sabre/xml is an XML library that you may not hate.",
+ "homepage": "https://sabre.io/xml/",
+ "keywords": [
+ "XMLReader",
+ "XMLWriter",
+ "dom",
+ "xml"
+ ],
+ "time": "2016-10-09T22:57:52+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "behat/behat",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Behat.git",
+ "reference": "15a3a1857457eaa29cdf41564a5e421effb09526"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Behat/zipball/15a3a1857457eaa29cdf41564a5e421effb09526",
+ "reference": "15a3a1857457eaa29cdf41564a5e421effb09526",
+ "shasum": ""
+ },
+ "require": {
+ "behat/gherkin": "^4.4.4",
+ "behat/transliterator": "~1.0",
+ "container-interop/container-interop": "^1.1",
+ "ext-mbstring": "*",
+ "php": ">=5.3.3",
+ "symfony/class-loader": "~2.1||~3.0",
+ "symfony/config": "~2.3||~3.0",
+ "symfony/console": "~2.5||~3.0",
+ "symfony/dependency-injection": "~2.1||~3.0",
+ "symfony/event-dispatcher": "~2.1||~3.0",
+ "symfony/translation": "~2.3||~3.0",
+ "symfony/yaml": "~2.1||~3.0"
+ },
+ "require-dev": {
+ "herrera-io/box": "~1.6.1",
+ "phpunit/phpunit": "~4.5",
+ "symfony/process": "~2.5|~3.0"
+ },
+ "suggest": {
+ "behat/mink-extension": "for integration with Mink testing framework",
+ "behat/symfony2-extension": "for integration with Symfony2 web framework",
+ "behat/yii-extension": "for integration with Yii web framework"
+ },
+ "bin": [
+ "bin/behat"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Behat": "src/",
+ "Behat\\Testwork": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Scenario-oriented BDD framework for PHP 5.3",
+ "homepage": "http://behat.org/",
+ "keywords": [
+ "Agile",
+ "BDD",
+ "ScenarioBDD",
+ "Scrum",
+ "StoryBDD",
+ "User story",
+ "business",
+ "development",
+ "documentation",
+ "examples",
+ "symfony",
+ "testing"
+ ],
+ "time": "2016-12-25T13:43:52+00:00"
+ },
+ {
+ "name": "behat/gherkin",
+ "version": "v4.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Gherkin.git",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5|~5",
+ "symfony/phpunit-bridge": "~2.7|~3",
+ "symfony/yaml": "~2.3|~3"
+ },
+ "suggest": {
+ "symfony/yaml": "If you want to parse features, represented in YAML files"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Gherkin": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Gherkin DSL parser for PHP 5.3",
+ "homepage": "http://behat.org/",
+ "keywords": [
+ "BDD",
+ "Behat",
+ "Cucumber",
+ "DSL",
+ "gherkin",
+ "parser"
+ ],
+ "time": "2016-10-30T11:50:56+00:00"
+ },
+ {
+ "name": "behat/mink",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/Mink.git",
+ "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9",
+ "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/css-selector": "~2.1|~3.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "suggest": {
+ "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+ "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+ "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Browser controller/emulator abstraction for PHP",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "testing",
+ "web"
+ ],
+ "time": "2016-03-05T08:26:18+00:00"
+ },
+ {
+ "name": "behat/mink-browserkit-driver",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
+ "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/10e67fb4a295efcd62ea0bf16025a85ea19534fb",
+ "reference": "10e67fb4a295efcd62ea0bf16025a85ea19534fb",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "^1.7.1@dev",
+ "php": ">=5.3.6",
+ "symfony/browser-kit": "~2.3|~3.0",
+ "symfony/dom-crawler": "~2.3|~3.0"
+ },
+ "require-dev": {
+ "silex/silex": "~1.2",
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Symfony2 BrowserKit driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "Mink",
+ "Symfony2",
+ "browser",
+ "testing"
+ ],
+ "time": "2016-03-05T08:59:47+00:00"
+ },
+ {
+ "name": "behat/mink-extension",
+ "version": "v2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/MinkExtension.git",
+ "reference": "5b4bda64ff456104564317e212c823e45cad9d59"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/MinkExtension/zipball/5b4bda64ff456104564317e212c823e45cad9d59",
+ "reference": "5b4bda64ff456104564317e212c823e45cad9d59",
+ "shasum": ""
+ },
+ "require": {
+ "behat/behat": "~3.0,>=3.0.5",
+ "behat/mink": "~1.5",
+ "php": ">=5.3.2",
+ "symfony/config": "~2.2|~3.0"
+ },
+ "require-dev": {
+ "behat/mink-goutte-driver": "~1.1",
+ "phpspec/phpspec": "~2.0"
+ },
+ "type": "behat-extension",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\MinkExtension": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christophe Coevoet",
+ "email": "stof@notk.org"
+ },
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com"
+ }
+ ],
+ "description": "Mink extension for Behat",
+ "homepage": "http://extensions.behat.org/mink",
+ "keywords": [
+ "browser",
+ "gui",
+ "test",
+ "web"
+ ],
+ "time": "2016-02-15T07:55:18+00:00"
+ },
+ {
+ "name": "behat/mink-goutte-driver",
+ "version": "v1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkGoutteDriver.git",
+ "reference": "8b9ad6d2d95bc70b840d15323365f52fcdaea6ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkGoutteDriver/zipball/8b9ad6d2d95bc70b840d15323365f52fcdaea6ca",
+ "reference": "8b9ad6d2d95bc70b840d15323365f52fcdaea6ca",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.6@dev",
+ "behat/mink-browserkit-driver": "~1.2@dev",
+ "fabpot/goutte": "~1.0.4|~2.0|~3.1",
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Goutte driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "goutte",
+ "headless",
+ "testing"
+ ],
+ "time": "2016-03-05T09:04:22+00:00"
+ },
+ {
+ "name": "behat/transliterator",
+ "version": "v1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Behat/Transliterator.git",
+ "reference": "868e05be3a9f25ba6424c2dd4849567f50715003"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Behat/Transliterator/zipball/868e05be3a9f25ba6424c2dd4849567f50715003",
+ "reference": "868e05be3a9f25ba6424c2dd4849567f50715003",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Behat\\Transliterator": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Artistic-1.0"
+ ],
+ "description": "String transliterator",
+ "keywords": [
+ "i18n",
+ "slug",
+ "transliterator"
+ ],
+ "time": "2015-09-28T16:26:35+00:00"
+ },
+ {
+ "name": "container-interop/container-interop",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "shasum": ""
+ },
+ "require": {
+ "psr/container": "^1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop",
+ "time": "2017-02-14T19:40:03+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "fabpot/goutte",
+ "version": "v3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfPHP/Goutte.git",
+ "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/db5c28f4a010b4161d507d5304e28a7ebf211638",
+ "reference": "db5c28f4a010b4161d507d5304e28a7ebf211638",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "php": ">=5.5.0",
+ "symfony/browser-kit": "~2.1|~3.0",
+ "symfony/css-selector": "~2.1|~3.0",
+ "symfony/dom-crawler": "~2.1|~3.0"
+ },
+ "type": "application",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Goutte\\": "Goutte"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "A simple PHP Web Scraper",
+ "homepage": "https://github.com/FriendsOfPHP/Goutte",
+ "keywords": [
+ "scraper"
+ ],
+ "time": "2017-01-03T13:21:43+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.0",
+ "psr/log": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2017-02-28T22:50:30+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2016-12-20T10:07:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/0d6c7ca039329247e4f0f8f8f6506810e8248855",
+ "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2017-02-27T10:51:17+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2017-01-26T22:05:40+00:00"
+ },
+ {
+ "name": "php-mock/php-mock",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock.git",
+ "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock/zipball/22d297231118e6fd5b9db087fbe1ef866c2b95d2",
+ "reference": "22d297231118e6fd5b9db087fbe1ef866c2b95d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "phpunit/php-text-template": "^1"
+ },
+ "replace": {
+ "malkusch/php-mock": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7"
+ },
+ "suggest": {
+ "php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\": [
+ "classes/",
+ "tests/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.",
+ "homepage": "https://github.com/php-mock/php-mock",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T20:52:52+00:00"
+ },
+ {
+ "name": "php-mock/php-mock-integration",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock-integration.git",
+ "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/5a0d7d7755f823bc2a230cfa45058b40f9013bc4",
+ "reference": "5a0d7d7755f823bc2a230cfa45058b40f9013bc4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6",
+ "php-mock/php-mock": "^2",
+ "phpunit/php-text-template": "^1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4|^5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\integration\\": "classes/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Integration package for PHP-Mock",
+ "homepage": "https://github.com/php-mock/php-mock-integration",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T21:31:34+00:00"
+ },
+ {
+ "name": "php-mock/php-mock-phpunit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-mock/php-mock-phpunit.git",
+ "reference": "173781abdc632c59200253e12e2b991ae6a4574f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/173781abdc632c59200253e12e2b991ae6a4574f",
+ "reference": "173781abdc632c59200253e12e2b991ae6a4574f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7",
+ "php-mock/php-mock-integration": "^2",
+ "phpunit/phpunit": "^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpmock\\phpunit\\": "classes/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "WTFPL"
+ ],
+ "authors": [
+ {
+ "name": "Markus Malkusch",
+ "email": "markus@malkusch.de",
+ "homepage": "http://markus.malkusch.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.",
+ "homepage": "https://github.com/php-mock/php-mock-phpunit",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "function",
+ "mock",
+ "phpunit",
+ "stub",
+ "test",
+ "test double"
+ ],
+ "time": "2017-02-17T22:44:38+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27T11:43:31+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-09-30T07:12:33+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-11-25T06:54:22+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1|^2.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2017-03-02T20:05:34+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/531553c4795a1df54114342d68ca337d5d81c8a0",
+ "reference": "531553c4795a1df54114342d68ca337d5d81c8a0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.3",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-token-stream": "^1.4.11 || ^2.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0",
+ "sebastian/environment": "^2.0",
+ "sebastian/version": "^2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": "^2.5",
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-01T09:14:18+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2016-10-03T07:40:28+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2017-02-26T11:10:40+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2017-02-27T10:12:30+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "6.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.3",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.6.2",
+ "phpunit/php-code-coverage": "^5.0",
+ "phpunit/php-file-iterator": "^1.4",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^4.0",
+ "sebastian/comparator": "^1.2.4 || ^2.0",
+ "sebastian/diff": "^1.2",
+ "sebastian/environment": "^2.0",
+ "sebastian/exporter": "^2.0 || ^3.0",
+ "sebastian/global-state": "^1.1 || ^2.0",
+ "sebastian/object-enumerator": "^2.0 || ^3.0",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-03-02T15:24:03+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "eabce450df194817a7d7e27e19013569a903a2bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/eabce450df194817a7d7e27e19013569a903a2bf",
+ "reference": "eabce450df194817a7d7e27e19013569a903a2bf",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^3.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2017-03-03T06:30:20+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "20f84f468cb67efee293246e6a09619b891f55f0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/20f84f468cb67efee293246e6a09619b891f55f0",
+ "reference": "20f84f468cb67efee293246e6a09619b891f55f0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/diff": "^1.2",
+ "sebastian/exporter": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-03-03T06:26:08+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08T07:14:41+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-11-26T07:53:53+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/b82d077cb3459e393abcf4867ae8f7230dcb51f6",
+ "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2017-03-03T06:25:06+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12T03:26:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/de6e32f7192dfea2e4bedc892434f4830b5c5794",
+ "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-03-03T06:21:01+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2017-03-03T06:23:57+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "symfony/browser-kit",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/browser-kit.git",
+ "reference": "394a2475a3a89089353fde5714a7f402fbb83880"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/394a2475a3a89089353fde5714a7f402fbb83880",
+ "reference": "394a2475a3a89089353fde5714a7f402fbb83880",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/dom-crawler": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\BrowserKit\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony BrowserKit Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-31T21:49:23+00:00"
+ },
+ {
+ "name": "symfony/class-loader",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/class-loader.git",
+ "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/class-loader/zipball/2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
+ "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "symfony/finder": "~2.8|~3.0",
+ "symfony/polyfill-apcu": "~1.1"
+ },
+ "suggest": {
+ "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ClassLoader\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony ClassLoader Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-21T17:06:35+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
+ "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/filesystem": "~2.8|~3.0"
+ },
+ "require-dev": {
+ "symfony/yaml": "~3.0"
+ },
+ "suggest": {
+ "symfony/yaml": "To use the yaml reference dumper"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Config Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-14T16:27:43+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/debug": "~2.8|~3.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.8|~3.0",
+ "symfony/filesystem": "~2.8|~3.0",
+ "symfony/process": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/filesystem": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T14:07:22+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-02T20:32:22+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T16:34:18+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
+ "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "symfony/yaml": "<3.2"
+ },
+ "require-dev": {
+ "symfony/config": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/yaml": "~3.2"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/expression-language": "For using expressions in service container configuration",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "b814b41373fc4e535aff8c765abe39545216f391"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b814b41373fc4e535aff8c765abe39545216f391",
+ "reference": "b814b41373fc4e535aff8c765abe39545216f391",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-21T17:14:11+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6",
+ "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/expression-language": "~2.8|~3.0",
+ "symfony/stopwatch": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-02T20:32:22+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
+ "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Filesystem Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-01-08T20:47:33+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2016-11-14T01:06:16+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<2.8"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/intl": "~2.8|~3.0",
+ "symfony/yaml": "~2.8|~3.0"
+ },
+ "suggest": {
+ "psr/log": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "symfony/console": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-02-16T22:46:52+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-11-23T20:04:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "behat/behat": 0,
+ "behat/mink-extension": 0,
+ "behat/mink-goutte-driver": 0
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.5",
+ "ext-curl": "*",
+ "ext-gd": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-openssl": "*"
+ },
+ "platform-dev": {
+ "php": ">=7.0"
+ }
+}
diff --git a/doc/Privacy.md b/doc/Privacy.md
deleted file mode 100644
index 1ac019f5a..000000000
--- a/doc/Privacy.md
+++ /dev/null
@@ -1,77 +0,0 @@
-Privacy Policy
-==============
-
-
-##Summary##
-
-
-Q: Who can see my content?
-
-A: By default ANYBODY on the internet, UNLESS you restrict it. $Projectname allows you to choose the privacy level you desire. Restricted content will NOT be visible to "spy networks" and advertisers. It will be protected against eavesdropping by outsiders - to the best of our ability. Hub administrators with sufficient skills and patience MAY be able to eavesdrop on some private communications but they must expend effort to do so. Privacy modes exist within $Projectname which are even resistant to eavesdropping by skilled and determined hub administrators.
-
-Q: Can my content be censored?
-
-A: $Projectname (the network) CANNOT censor your content. Server and hub administrators are subject to local laws and MAY remove objectionable content from their site/hub. Anybody MAY become a hub administrator, including you; and therefore publish content which might otherwise be censored. You still MAY be subject to local laws.
-
-
-##Definitions
-
-**$Projectname**
-
-Otherwise referred to as "the network", $Projectname is a collection of individual computers/servers (aka **hubs**) which connect together to form a larger cooperative network.
-
-**hub**
-
-An individual computer or server connected to $Projectname. These are provided by a **hub administrator** and may be public or private, paid or free.
-
-**hub administrator**
-
-The system operator of an individual hub.
-
-##Policies
-
-**Public Information**
-
-Any information or anything posted by you within $Projectname MAY be public or visible to anybody on the internet. To the extent possible, $Projectname allows you to protect content and restrict who can view it.
-
-Your profile photo, your channel name, and the location (URL or network address) of your channel are visible to anybody on the internet and privacy controls will not affect the display of these items.
-
-You MAY additionally provide other profile information. Any information which you provide in your "default" or **public profile** MAY be transmitted to other hubs in $Projectname and additionally MAY be displayed in the channel directory. You can restrict the viewing of this profile information. It may be restricted only to members of your hub, or only connections (friends), or other limited sets of viewers as you desire. If you wish for your profile to be restricted, you must set the appropriate privacy setting, or simply DO NOT provide additional information.
-
-**Content**
-
-Content you provide (status posts, photos, files, etc.) belongs to you. $Projectname default is to publish content openly and visible to anybody on the internet (PUBLIC). You MAY control this in your channel settings and restrict the default permissions or you MAY restrict the visibility of any single published item separately (PRIVATE). $Projectname developers will ensure that restricted content is ONLY visible to those in the restriction list - to the best of their ability.
-
-Content (especially status posts) that you share with other networks or that you have made visible to anybody on the internet (PUBLIC) cannot easily be taken back once it has been published. It MAY be shared with other networks and made available through RSS/Atom feeds. It may also be syndicated on other $Projectname sites. It MAY appear on other networks and websites and be visible in internet searches. If you do not wish this default behaviour please adjust your channel settings and restrict who can see your content.
-
-**Comments and Forum posts**
-
-Comments to posts that were created by others and posts which are designated as forum posts belong to you as the creator/author, but the distribution of these posts is not under your direct control, and you relinquish SOME rights to these items. These posts/comments MAY be re-distributed to others, and MAY be visible to anybody on the internet. In the case of comments, the creator of the "first message" in the thread (conversation) to which you are replying controls the distribution of all comments and replies to that message. They "own" and therefore have certain rights with regard to the entire conversation (including all comments contained within it). You can still edit or delete the comment, but the conversation owner also has rights to edit, delete, re-distribute, and backup/restore any or all the content from the conversation.
-
-**Private Information**
-
-$Projectname developers will ensure that any content you provide which is designated as PRIVATE will be protected against eavesdropping - to the best of their ability. Private channel content CAN be seen in the database of every involved hub administrator, but private messages are obscured in the database. The latter means that it is very difficult, but NOT impossible for this content to be seen by a hub administrator. Private channel content and private messages are also stripped from email notifications. End to end encryption is provided as an optional feature and this CANNOT be seen, even by a determined administrator.
-
-##Identity Privacy
-
-Privacy for your identity is another aspect. Because you have a decentralized identity in $Projectname, your privacy extends beyond your home hub. If you want to have complete control of your privacy and security you should run your own hub on a dedicated server. For many people, this is complicated and may stretch their technical abilities. So let's list a few precautions you can make to assure your privacy as much as possible.
-
-A decentralized identity has a lot of advantages and gives you al lot of interesting features, but you should be aware of the fact that your identity is known by other hubs in $Projectname network. One of those advantages is that other channels can serve you customized content and allow you to see private things (such as private photos which others wish to share with you). Because of this those channels need to know who you are. But we understand that sometimes those other channels know more from you than you might desire. For instance the plug-in Visage that can tell a channel owner the last time you visit their profile. You can easily OPT-OUT of this low level and we think, harmless tracking.
-
-* You can enable [Do Not Track (DNT)](http://donottrack.us/) in your web browser. We respect this new privacy policy proposal. All modern browsers support DNT. You will find it in the privacy settings of your browsers or else you can consult the web browser's manual. This will not affect the functionality of $Projectname. This setting is probably enough for most people.
-
-*You can [disable publication](settings) of your channel in our channel directory. If you want people to find your channel, you should give your channel address directly to them. We think this is a good indication that you prefer extra privacy and automatically enable "Do Not Track" if this is the case.
-
-* You can have a blocked hub. That means that all channels and content on that hub is not public, and not visible to the outside world. This is something only your hub administrator can do. We also respect this and automatically enable "Do Not Track" if it is set.
-
-###Censorship
-
-$Projectname is a global network which is inclusive of all religions and cultures. This does not imply that every member of the network feels the same way you do on contentious issues, and some people may be STRONGLY opposed to the content you post. In general, if you wish to post something that you know may nor be universally acceptable, the best approach is to restrict the audience using privacy controls to a small circle of friends.
-
-$Projectname as a network provider is unable to censor content. However, hub administrators MAY censor any content which appears on their hub to comply with local laws or even personal judgement. Their decision is final. If you have issues with any hub administrator, you may move your account and postings to another site which is more in line with your expectations. Please check (periodically) the [Terms of Service](help/TermsOfService) of your hub to learn about any rules or guidelines. If your content consists of material which is illegal or may cause issues, you are STRONGLY encouraged to host your own (become a hub administrator). You may still find that your content is blocked on some hubs, but $Projectname as a network cannot block it from being posted.
-
-$Projectname RECOMMENDS that hub administrators provide a grace period of 1-2 days between warning an account holder of content that needs to be removed and physically removing or disabling the account. This will give the content owner an opportunity to export their channel meta-data and import it to another site. In rare cases the content may be of such a nature to justify the immediate termination of the account. This is a hub decision, not a $Projectname decision.
-
-If you typically and regularly post content of an adult or offensive nature, you are STRONGLY encouraged to mark your account "NSFW" (Not Safe For Work). This will prevent the display of your profile photo in the directory except to viewers that have chosen to disable "safe mode". If your profile photo is found by directory administrators to be adult or offensive, the directory administrator MAY flag your profile photo as NSFW. There is currently no official mechanism to contest or reverse this decision, which is why you SHOULD mark your own account NSFW if it is likely to be inappropriate for general audiences.
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/Widgets.md b/doc/Widgets.md
index 8442bf687..4ad899a0f 100644
--- a/doc/Widgets.md
+++ b/doc/Widgets.md
@@ -117,6 +117,7 @@ Some/many of these widgets have restrictions which may restrict the type of page
* forums - provide a list of connected public forums with unseen counts for the current logged-in channel.
<br />&nbsp;<br />
+* activity - provide a list of authors of unread network content for the current logged-in channel.
* album - provides a widget containing a complete photo album from albums belonging to the page owner; this may be too large to present in a sidebar region as is best implemented as a content region widget.
* args:
diff --git a/doc/about.bb b/doc/about.bb
deleted file mode 100644
index 1ec1cf28e..000000000
--- a/doc/about.bb
+++ /dev/null
@@ -1,24 +0,0 @@
-[b]About[/b]
-
-$Projectname is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web.
-
-$Projectname is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.
-
-$Projectname aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers.
-
-How you use it depends on how you want to use it.
-
-It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as [url=http://mediatemple.com/]Media Temple[/url] and [url=http://www.dreamhost.com/]Dreamhost[/url], or on virtual and dedicated servers, offered by the likes of [url=https://www.linode.com]Linode[/url], [url=http://greenqloud.com]GreenQloud[/url] or [url=https://aws.amazon.com]Amazon AWS[/url].
-
-In other words, $Projectname can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language.
-
-Along the way, $Projectname offers a number of unique goodies:
-
-[b]Single-click user identification:[/b] meaning you can access sites on $Projectname simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
-
-[b]Cloning:[/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in $Projectname). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i]
-
-[b]Privacy:[/b] $Projectname identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss.
-
-#include doc/macros/main_footer.bb;
-
diff --git a/doc/account_basics.bb b/doc/account_basics.bb
deleted file mode 100644
index 664949d6e..000000000
--- a/doc/account_basics.bb
+++ /dev/null
@@ -1,38 +0,0 @@
-[b]Account Basics[/b]
-
-[b]Registration[/b]
-
-Not all $Projectname sites allow open registration. If registration is allowed, you will see a &quot;Register&quot; link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all $Projectname sites are linked, it does not matter where your account resides.
-
-[b]Your Email Address[/b]
-
-Please provide a valid email address. Your email address is never published. This address will be used to (optionally) send email notifications for incoming messages or items, and used to recover lost passwords.
-
-[b]Password[/b]
-
-Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As $Projectname offers a decentralised identity, your account can log you in to many other websites.
-
-[b]Terms Of Service[/b]
-
-Click the link to read the site's terms of service. Once you've read them, tick the box in the register form to confirm.
-
-[b]Register[/b]
-
-Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
-
-[b]Create a Channel[/b]
-
-Next, you will be presented with the &quot;Add a channel&quot; screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The &quot;choose a short nickname&quot; box is similar to a &quot;username&quot; field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz*
-
-When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles.
-
-*Note: It is not possible to change this address after creating the channel.
-
-See Also
-
-[zrl=[baseurl]/help/permissions]Permissions[/zrl]
-[zrl=[baseurl]/help/privacy]Privacy[/zrl]
-[zrl=[baseurl]/help/profiles]Profiles[/zrl]
-[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/accounts.bb b/doc/accounts.bb
deleted file mode 100644
index 7c0378504..000000000
--- a/doc/accounts.bb
+++ /dev/null
@@ -1,4 +0,0 @@
-This one still needs to be written.
-
-#include doc/macros/main_footer.bb;
-
diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md
index f21c55327..c233d8564 100644
--- a/doc/admin/administrator_guide.md
+++ b/doc/admin/administrator_guide.md
@@ -196,6 +196,70 @@ The installation script was originally designed for a small hardware server behi
1. `service apache2 reload`
1. Open your domain with a browser and step throught the initial configuration of $Projectname.
+### Server Roles
+
+$Projectname can be configured in many different ways. One of the configurations available at installation is to select a 'server role'. There are currently three server roles. We highly recommend that you use 'standard' unless you have special needs.
+
+
+#### Basic
+
+The 'basic' server role is designed to be relatively simple, and it doesn't present options
+or complicated features. The hub admin may configure additional features at a site level.
+This role is designed for simple social networking and social network federation. Many features
+which do not federate easily have been removed, including (and this is somewhat important)
+"nomadic identity". You may move a channel to or from a basic server, but you may not clone
+it. Once moved, it becomes read-only on the origination site. No updates of any kind will be
+provided. It is recommended that after the move, the original channel be deleted - as it is
+no longer useable. The data remains only in case there are issues making a copy of the data.
+
+This role is supported by the hubzilla community.
+
+#### Standard
+
+
+The 'standard' server role is recommended for most sites. All features of the software are
+available to everybody unless locked by the hub administrator. Some features will not federate
+easily with other networks, so there is often an increased support burden explaining why
+sharing events with Diaspora (for instance) presents a different experience on that network.
+Additionally any member can enable "advanced" or "expert" features, and these may be beyond
+their technical skill level. This may also result in an increased support burden.
+
+This role is supported by the hubzilla community.
+
+#### Pro
+
+The 'pro' server role is primarily designed for communities which want to present a uniform
+experience and be relieved of many federation support issues. In this role there is
+**no federation with other networks**. Additional features **may** be provided, such
+as channel ratings, premium channels, and e-commerce.
+
+By default a channel may set a "techlevel" appropriate to their technical skill. Higher
+levels provide more features. Everybody starts with techlevel 0 (similar to the 'basic'
+role) where all complicated features are hidden from view. Increasing the techlevel provides
+more advanced or complex features.
+
+The hub admin may also lock individual channels or their entire site at a defined techlevel
+which provides an installation with a selection of advanced features consistent with the
+perceived technical skills of the members. For instance, a community for horse racing might
+have a different techlevel than a community for Linux kernel developers.
+
+This role is not supported by the hubzilla community.
+
+### Techlevels
+
+Techlevels is a unique feature of Hubzilla 'pro'. It is not available in other server_roles, although it expands on the concepts introduced in $Projectname 'basic'.
+
+We've implemented several different mechanisms in order to reduce the apparent complexity and learning curve presented to new members. At the same time, we do not wish to limit any functionality for people who are able to grasp some slightly advanced technical technical features. The first mechanism was to move several features to an optional 'Features' page where they could be enabled at will; with the default interface kept somewhat lean.
+
+The problem we had now is that the number of features began to grow dramatically, and the Feature page is daunting in possibilities. There are also features present which probably should not be available to all members, but may be extremely useful to those with technical backgrounds.
+
+The techlevels seeeks to remedy this by grouping features within different levels of technical ability; starting at 0 (uncomfortable with technology), and up to 5 (Unix wizard or equivalent).
+
+When a new member registers, their account is provided a techlevel setting of 0. On the account settings page they may change this to any available level. A higher level opens more advanced features and possible interactions.
+
+The account administrator may also lock a particular level, lock a maximum level, or change/re-arrange the features available to any level. Those with the minimum level are typically not very exploratory and are unlikely to discover the advanced modes. This is by design. Those that look around and desire more interactions will find them. In the absence of administrator defaults they may choose any level. As they look at the features available to the level in question, it is generally expected that they will discover some features are beyond their comprehension and it is hoped they will back off to a level where the interface and features are comfortable to their skill level. This is somewhat experimental at present and for that reason is not part of the 'standard' server role. The standard server role is preset to level '5', and the basic server role is preset to level '0', with no possibility of change. Members in these roles may find themselves overwhelmed or underwhelmed by the feature set and complexity.
+
+
### Service Classes
Service classes allow you to set limits on system resources by limiting what individual
diff --git a/doc/contributor/covenant.html b/doc/contributor/covenant.html
deleted file mode 100644
index 4facac24e..000000000
--- a/doc/contributor/covenant.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<!DOCTYPE html>
-
-<html lang="en">
-<head>
- <meta charset="utf-8"/>
- <title>Contributor Covenant 1.4.0</title>
- <style>
- body {
- font-family: monospace;
- padding: 4em;
- }
- a {
- color: #990000;
- }
- </style>
- <link rel="alternate" hreflang="de" href="version/1/3/0/de/" />
- <link rel="alternate" hreflang="es" href="version/1/4/es/" />
- <link rel="alternate" hreflang="fr" href="version/1/3/0/fr/" />
- <link rel="alternate" hreflang="hu" href="version/1/3/0/hu/" />
- <link rel="alternate" hreflang="it" href="version/1/3/0/it/" />
- <link rel="alternate" hreflang="ja" href="version/1/3/0/ja/" />
- <link rel="alternate" hreflang="pl" href="version/1/4/pl/" />
- <link rel="alternate" hreflang="pt" href="version/1/3/0/pt/" />
- <link rel="alternate" hreflang="pt" href="version/1/3/0/pt_br/" />
- <link rel="alternate" hreflang="ru" href="version/1/3/0/ru/" />
- <link rel="alternate" hreflang="sl" href="version/1/4/sl/" />
- <link rel="alternate" hreflang="uk" href="version/1/4/uk/" />
-</head>
-
-<body>
-
-<h1>Contributor Covenant Code of Conduct</h1>
-
-<h2>Our Pledge</h2>
-
-<p>In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.</p>
-
-<h2>Our Standards</h2>
-
-<p>Examples of behavior that contributes to creating a positive environment
-include:</p>
-
-<ul>
- <li>Using welcoming and inclusive language</li>
- <li>Being respectful of differing viewpoints and experiences</li>
- <li>Gracefully accepting constructive criticism</li>
- <li>Focusing on what is best for the community</li>
- <li>Showing empathy towards other community members</li>
-</ul>
-
-<p>Examples of unacceptable behavior by participants include:</p>
-
-<ul>
- <li>The use of sexualized language or imagery and unwelcome sexual attention or advances</li>
- <li>Trolling, insulting/derogatory comments, and personal or political attacks</li>
- <li>Public or private harassment</li>
- <li>Publishing others' private information, such as a physical or electronic address, without explicit permission</li>
- <li>Other conduct which could reasonably be considered inappropriate in a professional setting</li>
-</ul>
-
-<h2>Our Responsibilities</h2>
-
-<p>Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.</p>
-
-<p>Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.</p>
-
-<h2>Scope</h2>
-
-<p>This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.</p>
-
-<h2>Enforcement</h2>
-
-<p>Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at project&#x40;hubzilla.org. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.</p>
-
-<p>Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.</p>
-
-<h2>Attribution</h2>
-
-<p>This Code of Conduct is adapted from the <a href="http://contributor-covenant.org">Contributor Covenant</a>, version 1.4,
-available at <a href="http://contributor-covenant.org/version/1/4/">http://contributor-covenant.org/version/1/4</a>.</p>
-
-</body>
-</html>
diff --git a/doc/database.bb b/doc/database.bb
index 02a70e2c7..160ec505e 100644
--- a/doc/database.bb
+++ b/doc/database.bb
@@ -1,6 +1,4 @@
-[h2]Database Tables[/h2]
-[table]
-[tr][th]Table[/th][th]Description[/th][/tr]
+[h2]Database Tables[/h2][table border=1][tr][th]Table[/th][th]Description[/th][/tr]
[tr][td][zrl=[baseurl]/help/database/db_abconfig]abconfig[/zrl][/td][td]arbitrary storage for connections of local channels[/td][/tr]
[tr][td][zrl=[baseurl]/help/database/db_abook]abook[/zrl][/td][td]connections of local channels[/td][/tr]
[tr][td][zrl=[baseurl]/help/database/db_account]account[/zrl][/td][td]service provider account[/td][/tr]
diff --git a/doc/database/db_account.bb b/doc/database/db_account.bb
index 354f2d3a8..35d7a9eb3 100644
--- a/doc/database/db_account.bb
+++ b/doc/database/db_account.bb
@@ -58,7 +58,6 @@ define ( 'ACCOUNT_PENDING', 0x0010 );
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 ); // 1 - this account can create content with PHP/Javascript
define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 ); // 2 - this is the special system account
define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 ); // 4096 - this account is an administrator
diff --git a/doc/dev-function-overview.md b/doc/dev-function-overview.md
index fa8a98ff3..cd2526ead 100644
--- a/doc/dev-function-overview.md
+++ b/doc/dev-function-overview.md
@@ -15,10 +15,6 @@ Returns authenticated numeric channel_id if authenticated and connected to a cha
Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
-* get_app()
-
-Returns the global app structure ($a). No longer used as App is a static class
-
* App::get_observer()
returns an xchan structure representing the current viewer if authenticated (locally or remotely).
diff --git a/doc/developer/api_zot.bb b/doc/developer/api_zot.bb
index f33faed17..1314f90b5 100644
--- a/doc/developer/api_zot.bb
+++ b/doc/developer/api_zot.bb
@@ -286,7 +286,7 @@ list photo metadata
[h3]group[/h3]
-`GET /api/z/1.0/group`
+[code]GET /api/z/1.0/group[/code]
Description: list privacy groups
@@ -326,7 +326,7 @@ To use with API group_members, provide either 'group_id' from the id element ret
[h3]group_members[/h3]
-`GET /api/z/1.0/group_members`
+[code]GET /api/z/1.0/group_members[/code]
Required:
@@ -462,7 +462,7 @@ group_member+abook+xchan (DB join) for each member of the privacy group
An xchan is a global location independent channel and is the primary record for a network
identity. It may refer to channels on other websites, networks, or services.
-`GET /api/z/1.0/xchan`
+[code]GET /api/z/1.0/xchan[/code]
Required: one of [ address, hash, guid ] as GET parameters
@@ -506,7 +506,7 @@ Returns:
Create or update an item (post, activity, webpage, etc.)
-Usage: `POST /api/z/1.0/item/update`
+Usage: [code]POST /api/z/1.0/item/update[/code]
Description: item/update posts an item (typically a conversation item or post, but can be any item) using form input.
diff --git a/doc/developer/covenant.bb b/doc/developer/covenant.bb
new file mode 100644
index 000000000..431cc74e9
--- /dev/null
+++ b/doc/developer/covenant.bb
@@ -0,0 +1,47 @@
+[size=large]Contributor Covenant Code of Conduct[/size]
+
+[h3]Our Pledge[/h3]
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+[h3]Our Standards[/h3]
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+[list]
+ [*]Using welcoming and inclusive language
+ [*]Being respectful of differing viewpoints and experiences
+ [*]Gracefully accepting constructive criticism
+ [*]Focusing on what is best for the community
+ [*]Showing empathy towards other community members
+[/list]
+
+Examples of unacceptable behavior by participants include:
+
+[list]
+ [*]The use of sexualized language or imagery and unwelcome sexual attention or advances
+ [*]Trolling, insulting/derogatory comments, and personal or political attacks
+ [*]Public or private harassment
+ [*]Publishing others' private information, such as a physical or electronic address, without explicit permission
+ [*]Other conduct which could reasonably be considered inappropriate in a professional setting
+[/list]
+
+[h3]Our Responsibilities[/h3]
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+[h3]Scope[/h3]
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+[h3]Enforcement[/h3]
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at project&#x40;hubzilla.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+[h3]Attribution[/h3]
+
+This Code of Conduct is adapted from the [url=http://contributor-covenant.org]Contributor Covenant[/url], version 1.4, available at [url=http://contributor-covenant.org/version/1/4/]http://contributor-covenant.org/version/1/4[/url].
+
diff --git a/doc/developer/developer_guide.bb b/doc/developer/developer_guide.bb
new file mode 100644
index 000000000..f8ba0c1d8
--- /dev/null
+++ b/doc/developer/developer_guide.bb
@@ -0,0 +1,178 @@
+[h3]Who is a $Projectname developer? Should I read this?[/h3]
+
+Anyone who contributes to making $Projectname better is a developer. There are many different and important ways you can contribute to this amazing technology, [i]even if you do not know how to write code[/i]. The software itself is only a part of the $Projectname project. You can contribute by
+[list]
+[*] translating text to your language so that people around the world have the opportunity to use $Projectname
+[*] promoting $Projectname and spreading awareness of the platform through blog posts, articles, and word-of-mouth
+[*] creating artwork and graphics for project assets such as icons and marketing material
+[*] supporting project infrastructure like the project website and demo servers
+[/list]
+[i]Software[/i] developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The $Projectname code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. All developers are expected to abide by our [zrl=[baseurl]/help/developer/covenant]code of conduct[/zrl]. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+This document will help you get started learning and contributing to $Projectname.
+
+[h3]Versions and Releases[/h3]
+
+$Projectname currently uses a standard version numbering sequence of $x.$y(.$z), for instance '1.12' or '1.12.1'. The first digit is the major version number. Major versions are released "roughly" once per year; often in December.
+
+The second digit is the minor release number. If this number is odd, it is a development version. If the number is even, it is a released version. Minor versions are released (moved from dev to master) typically once per month when development is 'stable', but this is likely to increase. Going forward minor releases will be made somewhere between one and three months; corresponding to a stable code point and when there is general community consensus that the current code base is stable enough to consider a release.
+
+The final digit is an interface or patch designator.
+
+The release process involves changing the version number (by definition the minor version number will be odd, and the minor number will be incremented). Once a year for a major release the major version will be incremented, and the minor number reset to 0.
+
+The release candidate is moved to a new branch; and testing will commence/continue for a period of 1-2 weeks afterward or until any significant issues have been resolved. This branch is usually labelled with RC (release candidate); for instance 1.8RC represents the pending release of version 1.8. At this time, the minor version number on the dev branch is incremented to the next odd number. (For instance 1.9). New development can then take place in the dev branch.
+
+Bug fixes should always be applied to 'dev' and from there merged forward (typically with git cherry-pick) to the RC branch and if necessary applied to the master or official release branch.
+
+At the time a release candidate is produced, the language strings file is frozen until a release is made. Translation work may continue, but all translations should be submitted to 'dev' and merged forward to RC.
+
+Once RC testing is completed, RC is merged to 'master' and the RC version designator removed; resulting in one final checkin to change the version number. The CHANGELOG file should also be updated at or just prior to this time. If there are merge conflicts during this final merge, the merge will be abandoned; and 'git merge -s ours' applied. This results in a replacement of master with the contents of the RC branch. Conflicts often arise with string updates which were made to master after the last release and cannot easily be resolved without hand editing. Since this is a release of tested code, hand editing is discouraged, and the replacement merge strategy should be used instead. It is assumed that RC now contains the most recent well-tested code.
+
+Once the release is live and merged to master, the RC branch may be removed.
+
+Fixes may be made to master after release. Where possible these should be made to dev and 'git cherry-pick' used to merge forward; which preserves the commit info and prevents merge conflicts in the next cycle. Only rarely does a patch only apply to the master branch. If necessary this can be made. If the change is severe, the interface version number should be incremented. This is at the discretion of the community. In any event, a 'git pull' of the master branch should always result in the latest release with any post-release patches applied.
+
+The interface number (the $z in $x.$y.$z) should be incremented in dev whenever a change is made which changes the interfaces or API in incompatible ways so that any external packages (especially addons and API clients) relying on a the current behaviour can discover and change their own interfaces accordingly at the point that it changed.
+
+[h3]Git repository branches[/h3]
+
+There are two official branches of the $Projectname git repo.
+[list]
+[*] The stable version is maintained on the [b]master[/b] branch. The latest commit in this branch is considered to be suitable for production hubs.
+[*] Experimental development occurs on the [b]dev[/b] branch, which is merged into [b]master[/b] when it is deemed tested and stable enough.
+[/list]
+
+[h3]Developer tools and workflows[/h3]
+
+[h4]Hub Snapshots[/h4]
+
+The [url=[baseurl]/help/admin/hub_snapshots]hub snapshots[/url] page provides instructions and scripts for taking complete snapshots of a hub to support switching between consistent and completely known states. This is useful to prevent situations where the content or database schema might be incompatible with the code.
+
+[h3]Translations[/h3]
+
+Our translations are managed through Transifex. If you wish to help out translating $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/Friendica/red-matrix/]Transifex[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[h4]Translation Process[/h4]
+
+The strings used in the UI of $Projectname is translated at [url=https://www.transifex.com/Friendica/red-matrix/]Transifex[/url] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating $Projectname to a
+currently not supported language, please register an account at transifex.com
+and contact the Redmatrix translation team there.
+
+Translating $Projectname is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the[/td][/tr]
+[tr]ranslations regularly and import them into the source tree at github so that
+others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption[/td][/tr]
+[tr]hat the most prominent strings for the UI will be translated first by a[/td][/tr]
+[tr]ranslation team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source[/td][/tr]
+[tr]ree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+$Projectname ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "hmessages.po" file from[/td][/tr]
+[tr]ransifex which needs to be translated into the PHP file $Projectname uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your $Projectname installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/hmessages.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ $Projectname installation
+
+2. Execute the po2php script, which will place the translation
+ in the hstrings.php file that is used by $Projectname.
+
+ $> php util/po2php.php view/de/hmessages.po
+
+ The output of the script will be placed at view/de/hstrings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your $Projectname page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/hstrings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the $Projectname repository at github and
+ issue a pull request for that commit.
+
+[h4]Utilities[/h4]
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the $Projectname source tree. If you only want to[/td][/tr]
+[tr]ranslate $Projectname into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of $Projectname
+works.
+
+For further information see the utils/README file.
+
+[h4]Known Problems[/h4]
+
+* $Projectname uses the language setting of the visitors browser to determain the
+ language for the UI. Most of the time this works, but there are some known
+ quirks.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+[h3]Licensing[/h3]
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+[h3]Coding Style[/h3]
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+[list]
+[*]All comments should be in English.
+[*]We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+[*]Indentation is accomplished primarily with tabs using a tab-width of 4.
+[*]String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+[*]Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+[*]Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+[*]Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+[*]Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home".
+[/list]
+
+[h3]File system layout[/h3]
+[table border=0]
+[th]Directory[/th][th]Description[/th][/tr]
+[tr][td]addon[/td][td]optional addons/plugins[/td][/tr]
+[tr][td]boot.php[/td][td]Every process uses this to bootstrap the application structure[/td][/tr]
+[tr][td]doc[/td][td]Help Files[/td][/tr]
+[tr][td]images[/td][td]core required images[/td][/tr]
+[tr][td]include[/td][td]The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing[/td][/tr]
+[tr][td]index.php[/td][td]The front-end controller for web access[/td][/tr]
+[tr][td]install[/td][td]Installation and upgrade files and DB schema[/td][/tr]
+[tr][td]library[/td][td]Third party modules (must be license compatible)[/td][/tr]
+[tr][td]mod[/td][td]Controller modules based on URL pathname (e.g. [url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)[/td][/tr]
+[tr][td]mod/site/[/td][td]site-specific mod overrides, excluded from git[/td][/tr]
+[tr][td]util[/td][td]translation tools, main English string database and other miscellaneous utilities[/td][/tr]
+[tr][td]version.inc[/td][td]contains current version (auto-updated via cron for the master repository and distributed via git)[/td][/tr]
+[tr][td]view[/td][td]theming and language files[/td][/tr]
+[tr][td]view/(css,js,img,php,tpl)[/td][td]default theme files[/td][/tr]
+[tr][td]view/(en,it,es ...)[/td][td]language strings and resources[/td][/tr]
+[tr][td]view/theme/[/td][td]individual named themes containing (css,js,img,php,tpl) over-rides[/td][/tr]
+[/table]
+
+[b][url=[baseurl]/help/developer/unorganized]More information needing re-organization and updating...[/url][/b]
diff --git a/doc/developer/developer_guide.md b/doc/developer/developer_guide.md
deleted file mode 100644
index fa50de8a1..000000000
--- a/doc/developer/developer_guide.md
+++ /dev/null
@@ -1,422 +0,0 @@
-### Who is a Hubzilla developer? Should I read this?
-
-Anyone who contributes to making Hubzilla better is a developer. There are many different and important ways you can contribute to this amazing technology, _even if you do not know how to write code_. The software itself is only a part of the Hubzilla project. You can contribute by
-
-* translating text to your language so that people around the world have the opportunity to use Hubzilla
-* promoting Hubzilla and spreading awareness of the platform through blog posts, articles, and word-of-mouth
-* creating artwork and graphics for project assets such as icons and marketing material
-* supporting project infrastructure like the project website and demo servers
-
-_Software_ developers are of course welcomed; there are so many great ideas to implement and not enough people to make them all a reality! The Hubzilla code base is an advanced and mature system, but the platform is still very flexible and responsive to new ideas.
-
-This document will help you get started learning and contributing to Hubzilla.
-
-### Versioning system
-
-The versioning system is similar to the popular semantic versioning but less stringent. Given x.y.z, x changes yearly. y changes for "stable" monthly builds, and z increments when there are interface changes. We maintain our date and build numbers for medium grain version control (commits within a certain date range) and of course git revs for fine grained control.
-
-### Git repository branches
-
-There are two official branches of the Hubzilla git repo.
-
-* The stable version is maintained on the **master** branch. The latest commit in this branch is considered to be suitable for production hubs.
-* Experimental development occurs on the **dev** branch, which is merged into **master** when it is deemed tested and stable enough.
-
-### Developer tools and workflows
-
-#### Hub Snapshots
-
-The [hub snapshots](/help/admin/hub_snapshots) page provides instructions and scripts for taking complete
-snapshots of a hub to support switching between consistent and completely known
-states. This is useful to prevent situations where the content or database schema
-might be incompatible with the code.
-
-### Translations
-
-Our translations are managed through Transifex. If you wish to help out translating Hubzilla to another language, sign up on transifex.com, visit [https://www.transifex.com/projects/p/red-matrix/](https://www.transifex.com/projects/p/red-matrix/) and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
-
-#### Translation Process
-
-The strings used in the UI of Hubzilla is translated at [Transifex][1] and then
-included in the git repository at github. If you want to help with translation
-for any language, be it correcting terms or translating Hubzilla to a
-currently not supported language, please register an account at transifex.com
-and contact the Redmatrix translation team there.
-
-Translating Hubzilla is simple. Just use the online tool at transifex. If you
-don't want to deal with git & co. that is fine, we check the status of the
-translations regularly and import them into the source tree at github so that
-others can use them.
-
-We do not include every translation from transifex in the source tree to avoid
-a scattered and disturbed overall experience. As an uneducated guess we have a
-lower limit of 50% translated strings before we include the language. This
-limit is judging only by the amount of translated strings under the assumption
-that the most prominent strings for the UI will be translated first by a
-translation team. If you feel your translation useable before this limit,
-please contact us and we will probably include your teams work in the source
-tree.
-
-If you want to get your work into the source tree yourself, feel free to do so
-and contact us with and question that arises. The process is simple and
-Hubzilla ships with all the tools necessary.
-
-The location of the translated files in the source tree is
- /view/LNG-CODE/
-where LNG-CODE is the language code used, e.g. de for German or fr for French.
-For the email templates (the *.tpl files) just place them into the directory
-and you are done. The translated strings come as a "hmessages.po" file from
-transifex which needs to be translated into the PHP file Hubzilla uses. To do
-so, place the file in the directory mentioned above and use the "po2php"
-utility from the util directory of your Hubzilla installation.
-
-Assuming you want to convert the German localization which is placed in
-view/de/hmessages.po you would do the following.
-
-1. Navigate at the command prompt to the base directory of your
- Hubzilla installation
-
-2. Execute the po2php script, which will place the translation
- in the hstrings.php file that is used by Hubzilla.
-
- $> php util/po2php.php view/de/hmessages.po
-
- The output of the script will be placed at view/de/hstrings.php where
- froemdoca os expecting it, so you can test your translation mmediately.
-
-3. Visit your Hubzilla page to check if it still works in the language you
- just translated. If not try to find the error, most likely PHP will give
- you a hint in the log/warnings.about the error.
-
- For debugging you can also try to "run" the file with PHP. This should
- not give any output if the file is ok but might give a hint for
- searching the bug in the file.
-
- $> php view/de/hstrings.php
-
-4. commit the two files with a meaningful commit message to your git
- repository, push it to your fork of the Hubzilla repository at github and
- issue a pull request for that commit.
-
-#### Utilities
-
-Additional to the po2php script there are some more utilities for translation
-in the "util" directory of the Hubzilla source tree. If you only want to
-translate Hubzilla into another language you wont need any of these tools most
-likely but it gives you an idea how the translation process of Hubzilla
-works.
-
-For further information see the utils/README file.
-
-#### Known Problems
-
-* Hubzilla uses the language setting of the visitors browser to determain the
- language for the UI. Most of the time this works, but there are some known
- quirks.
-* the early translations are based on the friendica translations, if you
- some rough translations please let us know or fix them at Transifex.
-
-### To-be-organized information
-
-**Here is how you can join us.**
-
-First, get yourself a working git package on the system where you will be
-doing development.
-
-Create your own github account.
-
-You may fork/clone the Red repository from [https://github.com/redmatrix/hubzilla.git](https://github.com/redmatrix/hubzilla.git).
-
-Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
-to create and use your own tracking fork on github
-
-Then go to your github page and create a "Pull request" when you are ready
-to notify us to merge your work.
-
-
-**Important**
-
-Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
-
-Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
-
-
-**Licensing**
-
-All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
-
-**Coding Style**
-
-In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
-
-* All comments should be in English.
-
-* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
-
-* Indentation is accomplished primarily with tabs using a tab-width of 4.
-
-* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
-
-* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
-
-* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
-
-* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
-
-
-**File system layout:**
-
-[addon] optional addons/plugins
-
-[boot.php] Every process uses this to bootstrap the application structure
-
-[doc] Help Files
-
-[images] core required images
-
-[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing
-
-[index.php] The front-end controller for web access
-
-[install] Installation and upgrade files and DB schema
-
-[library] Third party modules (must be license compatible)
-
-[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)
-
-[mod/site/] site-specific mod overrides, excluded from git
-
-[util] translation tools, main English string database and other miscellaneous utilities
-
-[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
-
-[view] theming and language files
-
-[view/(css,js,img,php,tpl)] default theme files
-
-[view/(en,it,es ...)] language strings and resources
-
-[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
-
-**The Database:**
-
-
-| Table | Description |
-|-------------------------|--------------------------------------------------------|
-| abconfig | contact table, replaces Friendica 'contact' |
-| abook | |
-| account | service provider account |
-| addon | |
-| addressbookchanges | |
-| addressbooks | |
-| app | |
-| atoken | |
-| attach | |
-| auth_codes | |
-| cache | |
-| cal | |
-| calendarchanges | |
-| calendarinstances | |
-| calendarobjects | |
-| calendars | |
-| calendarsubscriptions | |
-| cards | |
-| channel | |
-| chat | |
-| chatpresence | |
-| chatroom | |
-| clients | |
-| config | |
-| conv | |
-| dreport | |
-| event | |
-| group_member | |
-| groupmembers | |
-| groups | |
-| hook | |
-| hubloc | |
-| iconfig | |
-| issue | |
-| item | |
-| item_id | |
-| likes | |
-| locks | |
-| mail | |
-| menu | |
-| menu_item | |
-| notify | |
-| obj | |
-| outq | |
-| pconfig | personal (per channel) configuration storage |
-| photo | |
-| poll | |
-| poll_elm | |
-| principals | |
-| profdef | |
-| profext | |
-| profile | |
-| profile_check | |
-| propertystorage | |
-| register | |
-| schedulingobjects | |
-| session | |
-| shares | |
-| sign | |
-| site | |
-| source | |
-| sys_perms | |
-| term | |
-| tokens | |
-| updates | |
-| users | |
-| verify | |
-| vote | |
-| xchan | |
-| xchat | |
-| xconfig | |
-| xign | |
-| xlink | |
-| xperm | |
-| xprof | |
-| xtag | |
-
-
- * abook - contact table, replaces Friendica 'contact'
- * account - service provider account
- * addon - registered plugins
- * app - peronal app data
- * attach - file attachments
- * auth_codes - OAuth usage
- * cache - OEmbed cache
- * channel - replaces Friendica 'user'
- * chat - chat room content
- * chatpresence - channel presence information for chat
- * chatroom - data for the actual chat room
- * clients - OAuth usage
- * config - main configuration storage
- * conv - Diaspora private messages
- * event - Events
- * fcontact - friend suggestion stuff
- * ffinder - friend suggestion stuff
- * fserver - obsolete
- * fsuggest - friend suggestion stuff
- * groups - privacy groups
- * group_member - privacy groups
- * hook - plugin hook registry
- * hubloc - Red location storage, ties a location to an xchan
- * item - posts
- * item_id - other identifiers on other services for posts
- * likes - likes of 'things'
- * mail - private messages
- * menu - channel menu data
- * menu_item - items uses by channel menus
- * notify - notifications
- * notify-threads - need to factor this out and use item thread info on notifications
- * obj - object data for things (x has y)
- * outq - output queue
- * pconfig - personal (per channel) configuration storage
- * photo - photo storage
- * poll - data for polls
- * poll_elm - data for poll elements
- * profdef - custom profile field definitions
- * profext - custom profile field data
- * profile - channel profiles
- * profile_check - DFRN remote auth use, may be obsolete
- * register - registrations requiring admin approval
- * session - web session storage
- * shares - shared item information
- * sign - Diaspora signatures. To be phased out.
- * site - site table to find directory peers
- * source - channel sources data
- * spam - unfinished
- * sys_perms - extensible permissions for the sys channel
- * term - item taxonomy (categories, tags, etc.) table
- * tokens - OAuth usage
- * updates - directory sync updates
- * verify - general purpose verification structure
- * vote - vote data for polls
- * xchan - replaces 'gcontact', list of known channels in the universe
- * xchat - bookmarked chat rooms
- * xconfig - as pconfig but for channels with no local account
- * xlink - "friends of friends" linkages derived from poco
- * xprof - if this hub is a directory server, contains basic public profile info of everybody in the network
- * xtag - if this hub is a directory server, contains tags or interests of everybody in the network
-
-
-**How to theme Hubzilla**
-
-This is a short documentation on what I found while trying to modify Hubzilla's appearance.
-
-First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
-
-Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
-
-At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').
-
-Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
-
-
-We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
-
-**Here is how you can join us.**
-
-First, get yourself a working git package on the system where you will be
-doing development.
-
-Create your own github account.
-
-You may fork/clone the Red repository from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url]
-
-Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
-to create and use your own tracking fork on github
-
-Then go to your github page and create a "Pull request" when you are ready
-to notify us to merge your work.
-
-**Translations**
-
-Our translations are managed through Transifex. If you wish to help out translating the $Projectname to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/red-matrix/]https://www.transifex.com/projects/p/red-matrix/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
-
-
-**Important**
-
-Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
-
-Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
-
-Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]
-
-**Licensing**
-
-All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
-
-**Concensus Building**
-
-Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
-
-We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
-
-There are places where opposition cannot be resolved. In these cases, please consider making your feature **optional** or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
-
-If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
-
-
-**Coding Style**
-
-In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
-
-* All comments should be in English.
-
-* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
-
-* Indentation is accomplished primarily with tabs using a tab-width of 4.
-
-* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
-
-* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
-
-* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
-
-* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
-
-* Some functions take arguments in argc/argv style like main() in C or function args in bash or Perl. Urls are broken up within a module. e.g, given "http://example.com/module/arg1/arg2", then $this->argc will be 3 (integer) and $this->argv will contain: [0] => 'module', [1] => 'arg1', [2] => 'arg2'. There will always be one argument. If provided a naked domain URL, $this->argv[0] is set to "home". \ No newline at end of file
diff --git a/doc/developer/unorganized.md b/doc/developer/unorganized.md
new file mode 100644
index 000000000..74d914aaf
--- /dev/null
+++ b/doc/developer/unorganized.md
@@ -0,0 +1,73 @@
+### To-be-organized information
+
+**Here is how you can join us.**
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the Red repository from [https://github.com/redmatrix/hubzilla.git](https://github.com/redmatrix/hubzilla.git).
+
+Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
+to create and use your own tracking fork on github
+
+Then go to your github page and create a "Pull request" when you are ready
+to notify us to merge your work.
+
+
+**Important**
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+**How to theme Hubzilla**
+
+This is a short documentation on what I found while trying to modify Hubzilla's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
+
+Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to /js or /css, and then "register" them in _init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+**Here is how you can join us.**
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the Red repository from [url=https://github.com/redmatrix/hubzilla.git]https://github.com/redmatrix/hubzilla.git[/url]
+
+Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
+to create and use your own tracking fork on github
+
+Then go to your github page and create a "Pull request" when you are ready
+to notify us to merge your work.
+
+
+**Important**
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]
+
+**Concensus Building**
+
+Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
+
+We encourage consensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
+
+There are places where opposition cannot be resolved. In these cases, please consider making your feature **optional** or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
+
+If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
+
diff --git a/doc/feature/saved_search.bb b/doc/feature/saved_search.bb
deleted file mode 100644
index 1e75f5a85..000000000
--- a/doc/feature/saved_search.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-[h2]Saved Searches[/h2]
-
-In order to quickly find information, the 'saved search' widget may be used. This widget may be presented as a sidebar tool on your network page and possibly from your channel page. It is differentiated from the 'navigation bar' search tool in that it does not search the entire site, but only the subset of information available to your channel.
-
-Additionally the search terms you provide may activate a one-tme search or be saved in a list for re-use. Saving the search item also invokes the search in addition to adding it to the saved list (which is displayed below the search text entry box). Any item in the list may be discarded if it is no longer needed.
-
-The saved search widget will provide autocompletion of channels (the results are prefixed with '@'), and hashtags (prefixed with '#'). You do not need to enter these tags; although entering the desired tag will reduce the autocomplete results to only hold the relevant information. The behaviour maps as follows:
-
-[ul]
-
-[li]@name - search your network stream for posts or comments written by 'name'. This will also change the post editor permissions to include only 'name'; as if this was a privacy group.[/li]
-
-[li]#hashtag - search you network stream for posts containing #hashtag.[/li]
-
-[li]text - search your network stream for posts containing 'text'.[/li]
-
-
-[/li]
-
diff --git a/doc/feature/techlevels.bb b/doc/feature/techlevels.bb
deleted file mode 100644
index 9b07f086f..000000000
--- a/doc/feature/techlevels.bb
+++ /dev/null
@@ -1,15 +0,0 @@
-[h2]Techlevels[/h2]
-
-Techlevels is a unique feature of Hubzilla 'pro'. It is not available in other server_roles, although it expands on the concepts introduced in Hubzilla 'basic'.
-
-[h3]Background[/h3]
-
-We've implemented several different mechanisms in order to reduce the apparent complexity and learning curve presented to new members. At the same time, we do not wish to limit any functionality for people who are able to grasp some slightly advanced technical technical features. The first mechanism was to move several features to an optional 'Features' page where they could be enabled at will; with the default interface kept somewhat lean.
-
-The problem we had now is that the number of features began to grow dramatically, and the Feature page is daunting in possibilities. There are also features present which probably should not be available to all members, but may be extremely useful to those with technical backgrounds.
-
-The techlevels seeeks to remedy this by grouping features within different levels of technical ability; starting at 0 (uncomfortable with technology), and up to 5 (Unix wizard or equivalent).
-
-When a new member registers, their account is provided a techlevel setting of 0. On the account settings page they may change this to any available level. A higher level opens more advanced features and possible interactions.
-
-The account administrator may also lock a particular level, lock a maximum level, or change/re-arrange the features available to any level. Those with the minimum level are typically not very exploratory and are unlikely to discover the advanced modes. This is by design. Those that look around and desire more interactions will find them. In the absence of administrator defaults they may choose any level. As they look at the features available to the level in question, it is generally expected that they will discover some features are beyond their comprehension and it is hoped they will back off to a level where the interface and features are comfortable to their skill level. This is somewhat experimental at present and for that reason is not part of the 'standard' server role. The standard server role is preset to level '5', and the basic server role is preset to level '0', with no possibility of change. Members in these roles may find themselves overwhelmed or underwhelmed by the feature set and complexity.
diff --git a/doc/hook/author_is_pmable.bb b/doc/hook/author_is_pmable.bb
new file mode 100644
index 000000000..708350673
--- /dev/null
+++ b/doc/hook/author_is_pmable.bb
@@ -0,0 +1,14 @@
+[h2]author_is_pmable[/h2]
+
+Called from thread action menu before returning a 'send mail' link for the post author. Not all authors will be able to receive private mail, for instance those on other networks with incompatible mail systems.
+
+By default author_is_pmable() returns true for 'zot' xchans, and false for all others.
+
+The plugin is passed an array
+
+ [ 'xchan' => $author_xchan, 'result' => 'unset' ]
+
+A plugin which sets the 'result' to something besides 'unset' will over-ride the default behaviour. A value of true will enable the 'send mail' link and the private mail recipient will be set to the author's xchan_hash. A value of false will disable the 'send mail' link.
+
+
+
diff --git a/doc/hook/probe_well_known.bb b/doc/hook/probe_well_known.bb
deleted file mode 100644
index 62898c536..000000000
--- a/doc/hook/probe_well_known.bb
+++ /dev/null
@@ -1,3 +0,0 @@
-[h2]probe_well_known[/h2]
-
-This hook is under construction and not currently used - see include/probe.php \ No newline at end of file
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index fcd0e2aff..6933edad2 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -28,7 +28,7 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/account_settings]account_settings[/zrl]
Called when generating the account settings form
-[zrl=[baseurl]/help/hook/settings_account]account_settings_post[/zrl]
+[zrl=[baseurl]/help/hook/account_settings_post]account_settings_post[/zrl]
Called when posting from the account settings form
[zrl=[baseurl]/help/hook/activity_received]activity_received[/zrl]
@@ -64,6 +64,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/authenticate]authenticate[/zrl]
Can provide alternate authentication mechanisms
+[zrl=[baseurl]/help/hook/author_is_pmable]author_is_pmable[/zrl]
+ Called from the thread action menu to determine if we can send private mail to the post author
+
[zrl=[baseurl]/help/hook/bb2diaspora]bb2diaspora[/zrl]
called when converting bbcode to markdown
@@ -491,9 +494,6 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/prepare_body_init]prepare_body_init[/zrl]
Called before generating the HTML for a displayed conversation item
-[zrl=[baseurl]/help/hook/probe_well_known]probe_well_known[/zrl]
- under construction
-
[zrl=[baseurl]/help/hook/proc_run]proc_run[/zrl]
Called when invoking PHP sub processes
diff --git a/doc/main.bb b/doc/main.bb
deleted file mode 100644
index 8ba5d481b..000000000
--- a/doc/main.bb
+++ /dev/null
@@ -1,13 +0,0 @@
-
-[zrl=[baseurl]/help/about][b]What is $Projectname?[/b][/zrl]
-$Projectname is a decentralized communication and publishing platform that enables you to keep in control of your communication needs by automatic encryption and finely grained access control. It's you, and only you who decides who is allowed to see your stuff.
-
-[zrl=[baseurl]/help/features][b]$Projectname Features[/b][/zrl]
-
-$Projectname is already running as a global distributed network and proves its versatility and scalability from standalone to huge sites on a daily basis.
-Think of standalone family communication platforms, distributed online communities, support forums, blogs and homepages. Or professional content providers with commercial premium channels and targeted content acces. Whatever you want, $Projectname is there to cater to your creativity.
-
-[zrl=[baseurl]/help/what_is_zot][b]Got Zot? Well, you should.[/b][/zrl]
-Zot is the great new communicaton protocol invented especially for $Projectname. As a member you are no longer bound to a single site or hub thanks to "Nomadic Identities". Migrate easily to another server and keep your contacts intact, or clone it and run the same channel on several servers. Just in case one of them might shut down, you don't lose out. Plus once you are inside $Projectname there is no need for you to authenticate twice, even when accessing another $Projectname site. Zot is what sets $Projectname apart.
-
-
diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb
index 6d95b230c..50f0b581b 100644
--- a/doc/member/member_guide.bb
+++ b/doc/member/member_guide.bb
@@ -294,8 +294,11 @@ To create and manage guest tokens, open the [zrl=[baseurl]/settings/tokens/]Gues
Additional permissions may be granted to the guest token by expanding the [b]Individual Permissions[/b] options and selecting privacy settings such as [b]Can view my channel stream and posts[/b] or [b]Can chat with me[/b].
+[url=[baseurl]/help/feature/access_tokens]More details can be found here...[/url]
+
[img][baseurl]/doc/member/assets/zat_dialog.png[/img]
+
[h3]Markup Languages[/h3]
$Projectname supports several markup languages for advanced formatting of content. The default markup language is a [url=[baseurl]/help/member/bbcode]custom variant of BBcode[/url], tailored for use in $Projectname. [url=[baseurl]/help/member/bbcode]BBcode[/url] is supported for posts, wiki pages, and web page elements. Wiki pages and webpage elements may also be written using standard Markdown.
[table border=0]
@@ -813,23 +816,27 @@ To delete attachments or change the permissions on the stored files, visit [obse
[h4]Web Access[/h4]
-Your files are visible on the web at the location [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories.
+Your files are visible on the web at the location [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories. This should only be used for smaller files and photos (up to a few megabytes) as it uses internal memory. For larger files (videos, music, etc.), please upload using WebDAV. These files may still be retrieved via web access.
[h4]WebDAV access[/h4]
-See: [zrl=[baseurl]/help/member/member_guide#Cloud_Desktop_Clients]Cloud Desktop Clients[/zrl]
+WebDAV provides a way to copy files directly to or from your computer's operating system, where your cloud files appear as a virtual disk drive. This should be used to upload large files such as video and audio; as it is not limited to available memory. See [zrl=help/member/member_guide#Cloud_Desktop_Clients]Cloud Desktop Clients[/zrl] below.
+
[h4]Permissions[/h4]
When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit [observer=1][baseurl]/cloud/[observer.webname][/observer][observer=0][baseurl]/cloud/username[/observer] select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a &quot;personal&quot; or &quot;private&quot; folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for &quot;family&quot; and &quot;friends&quot; with permission granted to appropriate privacy groups.
+[h3]Cloud Desktop Clients[/h3]
+
+
[h4]Cloud Desktop Clients - Windows[/h4]
WebDAV using Windows 7 graphical user interface wizard:
1. Left-click the Start-button to open the start menu.
2. Right-click the My computer icon to access its menu.
3. Left-click Map network drive... to open the connection dialog wizard.
-4. Type #^[url=https://example.net/dav/your_channel_name]https://example.net/dav/your_channel_name[/url] in the textbox and click the Complete button where &quot;example.net&quot; is the URL of your hub.
+4. Type '[baseurl]/dav/nickname' in the textbox (replace nickname with your channel nickname) and click the Complete button.
5. Type your $Projectname channel nickname. IMPORTANT - NO at-sign or domain name.
6. Type your $Projectname password
@@ -969,6 +976,21 @@ Once open you can set a bookmark.
Note: There have been reported issues with clients that use "chunked transfer encoding", which includes Apple iOS services, and also the "AnyClient" and "CyberDuck" tools. These work fine for downloads, but uploads often end up with files of zero size. This is caused by an incorrect implemention of chunked encoding in some current FCGI (fast-cgi) implementations. Apache running with PHP as a module does not have these issues, but when running under FCGI you may need to use alternative clients or use the web uploader. At the time of this writing the issue has been open and no updates provided for at least a year. If you encounter zero size files with other clients, please check the client notes; as there are occasional configuration issues which can also produce these symptoms.
+[h3]Saved Searches[/h3]
+
+In order to quickly find information, the 'saved search' widget may be used. This widget may be presented as a sidebar tool on your network page and possibly from your channel page. It is differentiated from the 'navigation bar' search tool in that it does not search the entire site, but only the subset of information available to your channel.
+
+Additionally the search terms you provide may activate a one-time search or be saved in a list for re-use. Saving the search item also invokes the search in addition to adding it to the saved list (which is displayed below the search text entry box). Any item in the list may be discarded if it is no longer needed.
+
+The saved search widget will provide autocompletion of channels (the results are prefixed with '@'), and hashtags (prefixed with '#'). You do not need to enter these tags; although entering the desired tag will reduce the autocomplete results to only hold the relevant information. The behaviour maps as follows:
+
+[list]
+[*]@name - search your network stream for posts or comments written by 'name'. This will also change the post editor permissions to include only 'name'; as if this was a privacy group.
+[*]#hashtag - search you network stream for posts containing #hashtag.
+[*]text - search your network stream for posts containing 'text'.
+[/list]
+
+
[h3]Remove Channel or Account[/h3]
[h4]Remove Channel[/h4]
diff --git a/doc/members.bb b/doc/members.bb
deleted file mode 100644
index bf5b09898..000000000
--- a/doc/members.bb
+++ /dev/null
@@ -1,25 +0,0 @@
-[h2]Documentation for hub members[/h2]
-[h3]Getting started[/h3]
-[zrl=[baseurl]/help/registration]Account Registration[/zrl]
-[zrl=[baseurl]/help/accounts_profiles_channels_basics]You at $Projectname: accounts, profiles and channels in short[/zrl]
-[zrl=[baseurl]/help/profiles]Profiles[/zrl]
-[zrl=[baseurl]/help/channels]Channels[/zrl]
-[zrl=[baseurl]/help/roles]Permission roles and Channel types[/zrl]
-[zrl=[baseurl]/help/first-post]Your first posting[/zrl]
-[zrl=[baseurl]/help/connecting_to_channels]Connecting To Other Channels[/zrl]
-[zrl=[baseurl]/help/permissions]Permissions And Encryption: You Are In Control[/zrl]
-[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
-[zrl=[baseurl]/help/remove_account]Remove Channel or Account[/zrl]
-[h3]Members help[/h3]
-[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
-[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
-[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
-[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
-[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
-[zrl=[baseurl]/help/addons]Help With Addons[/zrl]
-[zrl=[baseurl]/help/diaspora_compat]Diaspora Communications Compatibility (Diaspora and Friendica)[/zrl]
-[zrl=[baseurl]/help/faq_members]FAQ For Members[/zrl]
-[zrl=[baseurl]/help/bugs]Bugs, Issues, and things that go bump in the night...[/zrl]
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/profiles.bb b/doc/profiles.bb
deleted file mode 100644
index 513bf5fed..000000000
--- a/doc/profiles.bb
+++ /dev/null
@@ -1,37 +0,0 @@
-[b]Profiles[/b]
-
-$Projectname has unlimited profiles. You may use different profiles to show different &quot;sides of yourself&quot; to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded &quot;sides&quot; of each channel. For example, your default public profile might say &quot;Hello, I'm Fred, and I like laughing&quot;. You may show your close friends a profile that adds &quot;and I also enjoy dwarf tossing&quot;.
-
-You always have a profile known as your &quot;default&quot; or &quot;public&quot; profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
-
-That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
-
-[ul][*]Your real name or at least a nickname everybody knows
-[*]A photo of you
-[*]Your location on the planet, at least to a country level.[/ul]
-
-In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some &quot;Keywords&quot; to your profile. Such as &quot;music, linux, photography&quot; or whatever. You can add as many keywords as you like.
-
-To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings &gt; Additional Features[/zrl] and enable &quot;Multiple Profiles&quot; there, otherwise you won't have the ability to use more than just your default profile.
-
-Then select &quot;Edit Profiles&quot; from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a &quot;clone&quot; of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose &quot;Clone this profile&quot; there.
-
-In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on &quot;Edit visibility&quot; next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile.
-
-Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
-
-There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the &quot;Settings&quot; page.
-
-If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
-
-[b]Keywords and Directory Search[/b]
-
-On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
-
-On your Connnections page and in the directory there is a link to &quot;Suggestions&quot; or &quot;Channel Suggestions&quot;, respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance.
-
-See Also
-
-[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl]
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/project/governance.bb b/doc/project/governance.bb
deleted file mode 100644
index 4c1538b4b..000000000
--- a/doc/project/governance.bb
+++ /dev/null
@@ -1,29 +0,0 @@
-[h2]$Projectname Governance[/h2]
-
-Governance relates to the management of a project and particularly how this relates to conflict resolution.
-
-[h3]Community Governance[/h3]
-
-The project is maintained and decisions made by the 'community'. The governance structure is still evolving. Until the structure is finalised, decisions are made in the following order:
-
-[ol]
-[*] Lazy Consensus
-
-If a project proposal is made to one of the community governance forums and there are no serious objections in a "reasonable" amount of time from date of proposal (we usually provide 2-3 days for all interested parties to weigh in), no vote needs to be taken and the proposal will be considered approved. Some concerns may be raised at this time, but if these are addressed during discussion and work-arounds provided, it will still be considered approved.
-
-[*] Veto
-
-Senior developers with a significant history of project commits may veto any decision. The decision may not proceed until the veto is removed or an alternative proposal is presented.
-
-[*] Community Vote
-
-A decision which does not have a clear mandate or clear consensus, but is not vetoed, can be taken to a community vote. At present this is a simple popular vote in one of the applicable community forums. At this time, popular vote decides the outcome. This may change in the future if the community adopts a 'council' governance model. This document will be updated at that time with the updated governance rules.
-[/ol]
-
-Community Voting does not always provide a pleasant outcome and can generate polarised factions in the community (hence the reason why other models are under consideration). If the proposal is 'down voted' there are still several things which can be done and the proposal re-submitted with slightly different parameters (convert to an addon, convert to an optional feature which is disabled by default, etc.). If interest in the feature is high and the vote is "close", it can generate lots of bad feelings amongst the losing voters. On such close votes, it is [b]strongly recommended[/b] that the proposer take steps to address any concerns that were raised and re-submit.
-
-
-
-
-
-
diff --git a/doc/project/toc.html b/doc/project/toc.html
deleted file mode 100644
index e264e014d..000000000
--- a/doc/project/toc.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<h3>Project Information</h3>
-<ul>
-<li><a href="help/project/governance">Project Governance</a></li>
-<li><a href="help/project/versions">Versions and Versioning</a></li>
-</ul>
diff --git a/doc/project/versions.bb b/doc/project/versions.bb
deleted file mode 100644
index 451cd0448..000000000
--- a/doc/project/versions.bb
+++ /dev/null
@@ -1,30 +0,0 @@
-[h2]Versions and Releases[/h2]
-
-$Projectname currently uses a standard version numbering sequence of $x.$y(.$z), for instance '1.12' or '1.12.1'. The first digit is the major version number. Major versions are released "roughly" once per year; often in December.
-
-The second digit is the minor release number. If this number is odd, it is a development version. If the number is even, it is a released version. Minor versions are released (moved from dev to master) typically once per month when development is 'stable', but this is likely to increase. Going forward minor releases will be made somewhere between one and three months; corresponding to a stable code point and when there is general community consensus that the current code base is stable enough to consider a release.
-
-The final digit is an interface or patch designator.
-
-The release process involves changing the version number (by definition the minor version number will be odd, and the minor number will be incremented). Once a year for a major release the major version will be incremented, and the minor number reset to 0.
-
-The release candidate is moved to a new branch; and testing will commence/continue for a period of 1-2 weeks afterward or until any significant issues have been resolved. This branch is usually labelled with RC (release candidate); for instance 1.8RC represents the pending release of version 1.8. At this time, the minor version number on the dev branch is incremented to the next odd number. (For instance 1.9). New development can then take place in the dev branch.
-
-Bug fixes should always be applied to 'dev' and from there merged forward (typically with git cherry-pick) to the RC branch and if necessary applied to the master or official release branch.
-
-At the time a release candidate is produced, the language strings file is frozen until a release is made. Translation work may continue, but all translations should be submitted to 'dev' and merged forward to RC.
-
-
-Once RC testing is completed, RC is merged to 'master' and the RC version designator removed; resulting in one final checkin to change the version number. The CHANGELOG file should also be updated at or just prior to this time. If there are merge conflicts during this final merge, the merge will be abandoned; and 'git merge -s ours' applied. This results in a replacement of master with the contents of the RC branch. Conflicts often arise with string updates which were made to master after the last release and cannot easily be resolved without hand editing. Since this is a release of tested code, hand editing is discouraged, and the replacement merge strategy should be used instead. It is assumed that RC now contains the most recent well-tested code.
-
-Once the release is live and merged to master, the RC branch may be removed.
-
-Fixes may be made to master after release. Where possible these should be made to dev and 'git cherry-pick' used to merge forward; which preserves the commit info and prevents merge conflicts in the next cycle. Only rarely does a patch only apply to the master branch. If necessary this can be made. If the change is severe, the interface version number should be incremented. This is at the discretion of the community. In any event, a 'git pull' of the master branch should always result in the latest release with any post-release patches applied.
-
-The interface number (the $z in $x.$y.$z) should be incremented in dev whenever a change is made which changes the interfaces or API in incompatible ways so that any external packages (especially addons and API clients) relying on a the current behaviour can discover and change their own interfaces accordingly at the point that it changed.
-
-
-
-
-
- \ No newline at end of file
diff --git a/doc/server_roles.bb b/doc/server_roles.bb
deleted file mode 100644
index ef6ec28ae..000000000
--- a/doc/server_roles.bb
+++ /dev/null
@@ -1,27 +0,0 @@
-[h2]Server Roles[/h2]
-
-$Projectname can be configured in many different ways. One of the configurations available at installation is to select a 'server role'. There are currently three server roles. We highly recommend that you use 'standard' unless you have special needs.
-
-
-[h3]Basic[/h3]
-
-The 'basic' server role is designed to be relatively simple, and it doesn't present options or complicated features. The hub admin may configure additional features at a site level. This role is designed for simple social networking and social network federation. Many features which do not federate easily have been removed, including (and this is somewhat important) "nomadic identity". You may move a channel to or from a basic server, but you may not clone it. Once moved, it becomes read-only on the origination site. No updates of any kind will be provided. It is recommended that after the move, the original channel be deleted - as it is no longer useable. The data remains only in case there are issues making a copy of the data.
-
-This role is supported by the hubzilla community.
-
-[h3]Standard[/h3]
-
-
-The 'standard' server role is recommended for most sites. All features of the software are available to everybody unless locked by the hub administrator. Some features will not federate easily with other networks, so there is often an increased support burden explaining why sharing events with Diaspora (for instance) presents a different experience on that network. Additionally any member can enable "advanced" or "expert" features, and these may be beyond their technical skill level. This may also result in an increased support burden.
-
-This role is supported by the hubzilla community.
-
-[h3]Pro[/h3]
-
-The 'pro' server role is primarily designed for communities which want to present a uniform experience and be relieved of many federation support issues. In this role there is [b]no federation with other networks[/b]. Additional features [b]may[/b] be provided, such as channel ratings, premium channels, and e-commerce.
-
-By default a channel may set a "techlevel" appropriate to their technical skill. Higher levels provide more features. Everybody starts with techlevel 0 (similar to the 'basic' role) where all complicated features are hidden from view. Increasing the techlevel provides more advanced or complex features.
-
-The hub admin may also lock individual channels or their entire site at a defined techlevel which provides an installation with a selection of advanced features consistent with the perceived technical skills of the members. For instance, a community for horse racing might have a different techlevel than a community for Linux kernel developers.
-
-This role is not supported by the hubzilla community. \ No newline at end of file
diff --git a/doc/service_classes.bb b/doc/service_classes.bb
deleted file mode 100644
index 4dead5d29..000000000
--- a/doc/service_classes.bb
+++ /dev/null
@@ -1,38 +0,0 @@
-[b]Service Classes[/b]
-
-Service classes allow you to set limits on system resources. A GUI to configure this is currently under development.
-
-As a temporary measure, the following commandline utilities can be used:
-
-Usage:
-
-[code]util/service_class[/code]
-list service classes
-
-[code]util/config system default_service_class firstclass[/code]
-set the default service class to 'firstclass'
-
-[code]util/service_class firstclass[/code]
-list the services that are part of 'firstclass' service class
-
-[code]util/service_class firstclass photo_upload_limit 10000000[/code]
-set firstclass total photo disk usage to 10 million bytes
-
-[code]util/service_class --account=5 firstclass[/code]
-set account id 5 to service class 'firstclass' (with confirmation)
-
-[code]util/service_class --channel=blogchan firstclass[/code]
-set the account that owns channel 'blogchan' to service class 'firstclass' (with confirmation)
-
-[b]current limits[/b]
-photo_upload_limit - maximum total bytes for photos
-total_items - maximum total toplevel posts
-total_pages - maximum comanche pages
-total_identities - maximum number of channels owned by account
-total_channels - maximum number of connections
-total_feeds - maximum number of rss feed connections
-attach_upload_limit - maximum file upload storage (bytes)
-minimum_feedcheck_minutes - lowest setting allowed for polling rss feeds
-chatrooms - maximum chatrooms
-chatters_inroom - maximum chatters per room
-access_tokens - maximum number of Guest Access Tokens per channel \ No newline at end of file
diff --git a/doc/theme_management.bb b/doc/theme_management.bb
deleted file mode 100644
index 5691f7c48..000000000
--- a/doc/theme_management.bb
+++ /dev/null
@@ -1,10 +0,0 @@
-[h1]Theme Management[/h1]
-$Projectname allows hub admins to easily add and update themes hosted in common git repositories.
-[h2]Add new theme repo to your hub[/h2]
-1. Navigate to your hub web root
-[code]root@hub:~# cd /var/www[/code]
-2. Add the theme repo and give it a name
-[code][nobb]root@hub:/var/www# util/add_theme_repo https://github.com/username/theme-repo.git UniqueThemeRepoName[/nobb][/code]
-[h2]Update existing theme repo[/h2]
-Update the repo by using
-[code]root@hub:/var/www# util/update_theme_repo UniqueThemeRepoName[/code]
diff --git a/doc/to_do_code.bb b/doc/to_do_code.bb
deleted file mode 100644
index b1c4923b1..000000000
--- a/doc/to_do_code.bb
+++ /dev/null
@@ -1,42 +0,0 @@
-[b]Project Code To-Do List[/b]
-
-We need much more than this, but here are areas where developers can help. Please edit this page when items are finished. Another place for developers to start is with the issues list.
-
-[li]Documentation - see Red Documentation Project To-Do List[/li]
-[li]Include TOS link in registration/verification email[/li]
-[li]Auto preview posts/comments (configurable timer kicks in the preview if not 0)[/li]
-[li]SAML 2.0 and OpenID Connect provider functionality[/li]
-[li]relmeauth (aka indieauth) support[/li]
-[li]Create bug tracker module[/li]
-[li]Filing posts - provide a dropdown menu integrated with the 'post actions menu'[/li]
-[li]translation plugins - moses or apertium[/li]
-[li]plugins - provide 'disable' which is softer than 'uninstall' for those plugins which create additional DB tables[/li]
-[li]Infinite scroll improvements (i.e. embedded page links) see http://scrollsample.appspot.com/items [/li]
-[li]Finish the anti-spam bayesian engine[/li]
-[li]implement an email permission denied bounce message from the sys channel[/li]
-[li]provide a way for xchans with a certain network type to upgrade (unknown to rss, rss to statusnet, friendica-over-diaspora to friendica, for instance) based on new knowledge and/or redmatrix ability[/li]
-[li]Integrate the &quot;open site&quot; list with the register page[/li]
-[li]Support comments and member notes on documentation pages (to achieve an effect similar to php.net)[/li]
-[li]Support comments on webpages[/li]
-[li]Write more webpage layouts[/li]
-[li]Write more webpage widgets[/li]
-[li]restricted access OAuth clients[/li]
-[li](Advanced) create a UI for building Comanche pages[/li]
-[li](less advanced) create a way to preview Comanche results on a preview page while editing on another page[/li]
-[li]External post connectors - create standard interface[/li]
-[li]External post connectors, add popular services[/li]
-[li]service classes - provide a pluggable subscription payment gateway for premium accounts[/li]
-[li]service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels.[/li]
-[li]Uploads - integrate #^[url=https://github.com/blueimp/jQuery-File-Upload]https://github.com/blueimp/jQuery-File-Upload[/url][/li]
-[li]API extensions, for Twitter API - search, friending, threading. For Red API, lots of stuff[/li]
-[li]Import channel from Diaspora/Friendica (Diaspora partially done)[/li]
-[li]MediaGoblin photo "crosspost" connector[/li]
-[li]provide a visual editor[/li]
-[li]Create mobile clients for the top platforms - which involves extending the API so that we can do stuff far beyond the current crop of Twitter/Statusnet clients. Ditto for mobile themes. We can probably use something like the Friendica Android app as a base to start from.[/li]
-[li]Implement owned and exchangeable &quot;things&quot;.[/li]
-[li]Family Account creation - using service classes (an account holder can create a certain number of sub-accounts which are all tied to their subscription - if the subscription lapses they all go away).[/li]
-
-
-In many cases some of the work has already been started and code exists so that you needn't start from scratch. Please contact one of the developer channels like Channel One (one@zothub.com) before embarking and we can tell you what we already have and provide some insights on how we envision these features fitting together.
-
-Return to the [url=[baseurl]/help/main]Main documentation page[/url]
diff --git a/doc/to_do_doco.md b/doc/to_do_doco.md
deleted file mode 100644
index 018b9efa2..000000000
--- a/doc/to_do_doco.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Documentation To-Do List #
-
-## How to contribute documentation ##
-
-Documentation files are in */doc*.
-
-When help is first accessed, the file loaded is *main.bb*. That file contains case sensitive links without an extension. The extensions is added automatically if the file is found, first *.md* then *.bb*.
-
-For translating documentation, create a directory in */doc* named by the language code, copy the files and translate the content.
-
-## Documentation we need to write ##
-
-* Database schema detailed descriptions
-
-* Complete plugin hook documentation
-
-* API documentation
-
-* Function and code documentation (doxygen)
-
-* New Member guide
-
-* &quot;Extra Feature&quot; reference, description of each
-
-* Detailed Personal Settings Documentation
-
-* Administration Guide (post-install)
-
-* Administration Guide (pre-install)
-
-#include doc/macros/main_footer.bb;
diff --git a/doc/toc.html b/doc/toc.html
index 851f356e6..11635930e 100644
--- a/doc/toc.html
+++ b/doc/toc.html
@@ -1,30 +1,30 @@
<div class="" id="accordion">
- <div class="panel">
+ <div class="">
<div class="">
<h3 class="panel-title">
About
</h3>
</div>
- <div id="about" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/about/about_hubzilla">About Hubzilla</a></li>
- <li class="doco-list-group-item"><a href="/help/about/hubzilla_project">Hubzilla project</a></li>
- <li class="doco-list-group-item"><a href="/help/about/about_hub">About this hub</a></li>
- </ul>
+ <div id="about" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/about/about_hubzilla">About Hubzilla</a>
+ <a class="nav-link" href="/help/about/hubzilla_project">Hubzilla project</a>
+ <a class="nav-link" href="/help/about/about_hub">About this hub</a>
+ </div>
</div>
</div>
- <div class="panel">
+ <div class="">
<div class="">
<h3 class="panel-title">
Members
</h3>
</div>
- <div id="members" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/member/member_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/member/bbcode">BBcode Reference</a></li>
- <li class="doco-list-group-item"><a href="/help/member/member_faq">FAQ</a></li>
- </ul>
+ <div id="members" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/member/member_guide">Guide</a>
+ <a class="nav-link" href="/help/member/bbcode">BBcode Reference</a>
+ <a class="nav-link" href="/help/member/member_faq">FAQ</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -33,11 +33,12 @@
Administrators
</h3>
</div>
- <div id="administrators" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/admin/administrator_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/admin/hub_snapshots">Hub Snapshots</a></li>
- </ul>
+ <div id="administrators" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/admin/administrator_guide">Guide</a>
+ <a class="nav-link" href="/help/admin/hub_snapshots">Hub Snapshots</a>
+ <a class="nav-link" href="/help/database">Database Tables</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -46,12 +47,14 @@
Developers
</h3>
</div>
- <div id="developers" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/developer/developer_guide">Guide</a></li>
- <li class="doco-list-group-item"><a href="/help/developer/zot_protocol">Zot Protocol</a></li>
- <li class="doco-list-group-item"><a href="/help/developer/api_zot">Zot API</a></li>
- </ul>
+ <div id="developers" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/developer/developer_guide">Guide</a>
+ <a class="nav-link" href="/help/developer/covenant">Code of Conduct</a>
+ <a class="nav-link" href="/help/developer/zot_protocol">Zot Protocol</a>
+ <a class="nav-link" href="/help/developer/api_zot">Zot API</a>
+ <a class="nav-link" href="/help/hooklist">Hooks</a>
+ </div>
</div>
</div>
<div class="panel">
@@ -60,10 +63,10 @@
Tutorials
</h3>
</div>
- <div id="tutorials" class="panel-collapse collapse in">
- <ul class="list-group">
- <li class="doco-list-group-item"><a href="/help/tutorials/personal_channel">Personal Channel</a></li>
- </ul>
+ <div id="tutorials" class="doco-section">
+ <div class="flex-column">
+ <a class="nav-link" href="/help/tutorials/personal_channel">Personal Channel</a>
+ </div>
</div>
</div>
</div>
@@ -71,16 +74,16 @@
toc = {};
// Generate the table of contents in the side nav menu (see view/tpl/help.tpl)
$(document).ready(function () {
- $(".panel-collapse.in").find('a').each(function(){
+ $(".doco-section").find('a').each(function(){
var url = document.createElement('a');
url.href = window.location;
var pageName = url.href.split('/').pop().split('#').shift().split('?').shift();
var linkName = $(this).attr('href').split('/').pop();
if(pageName === linkName) {
- var tocUl = $(this).closest('li').append('<ul>').find('ul');
+ var tocUl = $(this).closest('a').append('<ul>').find('ul');
tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else
tocUl.toc({content: "#doco-content", headings: "h3"});
- tocUl.addClass('toc-content sub-menu');
+ tocUl.addClass('toc-content');
tocUl.attr('id', 'doco-side-toc');
}
diff --git a/images/emoji/0023-20e3.png b/images/emoji/0023-20e3.png
deleted file mode 100644
index 6e26f0070..000000000
--- a/images/emoji/0023-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0023.png b/images/emoji/0023.png
deleted file mode 100644
index 811f22af8..000000000
--- a/images/emoji/0023.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/002a-20e3.png b/images/emoji/002a-20e3.png
deleted file mode 100644
index 2f8e51138..000000000
--- a/images/emoji/002a-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/002a.png b/images/emoji/002a.png
deleted file mode 100644
index c39443e24..000000000
--- a/images/emoji/002a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0030-20e3.png b/images/emoji/0030-20e3.png
deleted file mode 100644
index 13aca83e0..000000000
--- a/images/emoji/0030-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0030.png b/images/emoji/0030.png
deleted file mode 100644
index e730b28df..000000000
--- a/images/emoji/0030.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0031-20e3.png b/images/emoji/0031-20e3.png
deleted file mode 100644
index e6d84b801..000000000
--- a/images/emoji/0031-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0031.png b/images/emoji/0031.png
deleted file mode 100644
index 9c4cbd6f7..000000000
--- a/images/emoji/0031.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0032-20e3.png b/images/emoji/0032-20e3.png
deleted file mode 100644
index 927339c9b..000000000
--- a/images/emoji/0032-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0032.png b/images/emoji/0032.png
deleted file mode 100644
index 9a0b49a0e..000000000
--- a/images/emoji/0032.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0033-20e3.png b/images/emoji/0033-20e3.png
deleted file mode 100644
index dbaa6183e..000000000
--- a/images/emoji/0033-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0033.png b/images/emoji/0033.png
deleted file mode 100644
index bc898b986..000000000
--- a/images/emoji/0033.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0034-20e3.png b/images/emoji/0034-20e3.png
deleted file mode 100644
index b0e914aac..000000000
--- a/images/emoji/0034-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0034.png b/images/emoji/0034.png
deleted file mode 100644
index 7216ee32b..000000000
--- a/images/emoji/0034.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0035-20e3.png b/images/emoji/0035-20e3.png
deleted file mode 100644
index d14371f3f..000000000
--- a/images/emoji/0035-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0035.png b/images/emoji/0035.png
deleted file mode 100644
index c64709a7e..000000000
--- a/images/emoji/0035.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0036-20e3.png b/images/emoji/0036-20e3.png
deleted file mode 100644
index 371b3acef..000000000
--- a/images/emoji/0036-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0036.png b/images/emoji/0036.png
deleted file mode 100644
index 68e1e71e4..000000000
--- a/images/emoji/0036.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0037-20e3.png b/images/emoji/0037-20e3.png
deleted file mode 100644
index 9b3476ae7..000000000
--- a/images/emoji/0037-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0037.png b/images/emoji/0037.png
deleted file mode 100644
index e4aa065c6..000000000
--- a/images/emoji/0037.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0038-20e3.png b/images/emoji/0038-20e3.png
deleted file mode 100644
index 8c95874d4..000000000
--- a/images/emoji/0038-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0038.png b/images/emoji/0038.png
deleted file mode 100644
index 27eae28e6..000000000
--- a/images/emoji/0038.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0039-20e3.png b/images/emoji/0039-20e3.png
deleted file mode 100644
index 9fce3d1ec..000000000
--- a/images/emoji/0039-20e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/0039.png b/images/emoji/0039.png
deleted file mode 100644
index fd9e98055..000000000
--- a/images/emoji/0039.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/00a9.png b/images/emoji/00a9.png
deleted file mode 100644
index 6b9a6adbf..000000000
--- a/images/emoji/00a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/00ae.png b/images/emoji/00ae.png
deleted file mode 100644
index 53ef9f2d4..000000000
--- a/images/emoji/00ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f004.png b/images/emoji/1f004.png
deleted file mode 100644
index 66fd32025..000000000
--- a/images/emoji/1f004.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f0cf.png b/images/emoji/1f0cf.png
deleted file mode 100644
index 3d0924b68..000000000
--- a/images/emoji/1f0cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f170.png b/images/emoji/1f170.png
deleted file mode 100644
index 8603ff05a..000000000
--- a/images/emoji/1f170.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f171.png b/images/emoji/1f171.png
deleted file mode 100644
index 25875bc6a..000000000
--- a/images/emoji/1f171.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f17e.png b/images/emoji/1f17e.png
deleted file mode 100644
index 73278ba19..000000000
--- a/images/emoji/1f17e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f17f.png b/images/emoji/1f17f.png
deleted file mode 100644
index 7be7dac27..000000000
--- a/images/emoji/1f17f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f18e.png b/images/emoji/1f18e.png
deleted file mode 100644
index d9f2d17de..000000000
--- a/images/emoji/1f18e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f191.png b/images/emoji/1f191.png
deleted file mode 100644
index 8b01b4343..000000000
--- a/images/emoji/1f191.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f192.png b/images/emoji/1f192.png
deleted file mode 100644
index 74674978d..000000000
--- a/images/emoji/1f192.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f193.png b/images/emoji/1f193.png
deleted file mode 100644
index b71956eb4..000000000
--- a/images/emoji/1f193.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f194.png b/images/emoji/1f194.png
deleted file mode 100644
index 5bf69bf7b..000000000
--- a/images/emoji/1f194.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f195.png b/images/emoji/1f195.png
deleted file mode 100644
index b4f85488d..000000000
--- a/images/emoji/1f195.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f196.png b/images/emoji/1f196.png
deleted file mode 100644
index ee8d20f5e..000000000
--- a/images/emoji/1f196.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f197.png b/images/emoji/1f197.png
deleted file mode 100644
index d0d775532..000000000
--- a/images/emoji/1f197.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f198.png b/images/emoji/1f198.png
deleted file mode 100644
index d7d8c9953..000000000
--- a/images/emoji/1f198.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f199.png b/images/emoji/1f199.png
deleted file mode 100644
index 0d42142ba..000000000
--- a/images/emoji/1f199.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f19a.png b/images/emoji/1f19a.png
deleted file mode 100644
index e1180f4a4..000000000
--- a/images/emoji/1f19a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1e8.png b/images/emoji/1f1e6-1f1e8.png
deleted file mode 100644
index b939efeab..000000000
--- a/images/emoji/1f1e6-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1e9.png b/images/emoji/1f1e6-1f1e9.png
deleted file mode 100644
index 20f4b14e8..000000000
--- a/images/emoji/1f1e6-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ea.png b/images/emoji/1f1e6-1f1ea.png
deleted file mode 100644
index d16ffe4b8..000000000
--- a/images/emoji/1f1e6-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1eb.png b/images/emoji/1f1e6-1f1eb.png
deleted file mode 100644
index a51533b55..000000000
--- a/images/emoji/1f1e6-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ec.png b/images/emoji/1f1e6-1f1ec.png
deleted file mode 100644
index 07f2ce397..000000000
--- a/images/emoji/1f1e6-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ee.png b/images/emoji/1f1e6-1f1ee.png
deleted file mode 100644
index 500b5ab09..000000000
--- a/images/emoji/1f1e6-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f1.png b/images/emoji/1f1e6-1f1f1.png
deleted file mode 100644
index 03a20132c..000000000
--- a/images/emoji/1f1e6-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f2.png b/images/emoji/1f1e6-1f1f2.png
deleted file mode 100644
index 2ad60a273..000000000
--- a/images/emoji/1f1e6-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f4.png b/images/emoji/1f1e6-1f1f4.png
deleted file mode 100644
index cb46c31f8..000000000
--- a/images/emoji/1f1e6-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f6.png b/images/emoji/1f1e6-1f1f6.png
deleted file mode 100644
index b272021d3..000000000
--- a/images/emoji/1f1e6-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f7.png b/images/emoji/1f1e6-1f1f7.png
deleted file mode 100644
index 73136caf3..000000000
--- a/images/emoji/1f1e6-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f8.png b/images/emoji/1f1e6-1f1f8.png
deleted file mode 100644
index 3db45a0d9..000000000
--- a/images/emoji/1f1e6-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1f9.png b/images/emoji/1f1e6-1f1f9.png
deleted file mode 100644
index c43769dcb..000000000
--- a/images/emoji/1f1e6-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fa.png b/images/emoji/1f1e6-1f1fa.png
deleted file mode 100644
index 7794309c7..000000000
--- a/images/emoji/1f1e6-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fc.png b/images/emoji/1f1e6-1f1fc.png
deleted file mode 100644
index 02c840d12..000000000
--- a/images/emoji/1f1e6-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1fd.png b/images/emoji/1f1e6-1f1fd.png
deleted file mode 100644
index fc5466174..000000000
--- a/images/emoji/1f1e6-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e6-1f1ff.png b/images/emoji/1f1e6-1f1ff.png
deleted file mode 100644
index 89d3d15fd..000000000
--- a/images/emoji/1f1e6-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e6.png b/images/emoji/1f1e7-1f1e6.png
deleted file mode 100644
index 25fe407e1..000000000
--- a/images/emoji/1f1e7-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e7.png b/images/emoji/1f1e7-1f1e7.png
deleted file mode 100644
index bccd8c5c9..000000000
--- a/images/emoji/1f1e7-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1e9.png b/images/emoji/1f1e7-1f1e9.png
deleted file mode 100644
index b0597a314..000000000
--- a/images/emoji/1f1e7-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ea.png b/images/emoji/1f1e7-1f1ea.png
deleted file mode 100644
index 551f086e3..000000000
--- a/images/emoji/1f1e7-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1eb.png b/images/emoji/1f1e7-1f1eb.png
deleted file mode 100644
index 444d4829f..000000000
--- a/images/emoji/1f1e7-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ec.png b/images/emoji/1f1e7-1f1ec.png
deleted file mode 100644
index 821eee5e1..000000000
--- a/images/emoji/1f1e7-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ed.png b/images/emoji/1f1e7-1f1ed.png
deleted file mode 100644
index f33724249..000000000
--- a/images/emoji/1f1e7-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ee.png b/images/emoji/1f1e7-1f1ee.png
deleted file mode 100644
index ea20ac932..000000000
--- a/images/emoji/1f1e7-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ef.png b/images/emoji/1f1e7-1f1ef.png
deleted file mode 100644
index 7cca4f804..000000000
--- a/images/emoji/1f1e7-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f1.png b/images/emoji/1f1e7-1f1f1.png
deleted file mode 100644
index 0316ac99d..000000000
--- a/images/emoji/1f1e7-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f2.png b/images/emoji/1f1e7-1f1f2.png
deleted file mode 100644
index ab8cafdac..000000000
--- a/images/emoji/1f1e7-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f3.png b/images/emoji/1f1e7-1f1f3.png
deleted file mode 100644
index 16a58f8f6..000000000
--- a/images/emoji/1f1e7-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f4.png b/images/emoji/1f1e7-1f1f4.png
deleted file mode 100644
index 98af62b3d..000000000
--- a/images/emoji/1f1e7-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f6.png b/images/emoji/1f1e7-1f1f6.png
deleted file mode 100644
index cb978ef9d..000000000
--- a/images/emoji/1f1e7-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f7.png b/images/emoji/1f1e7-1f1f7.png
deleted file mode 100644
index b139366a4..000000000
--- a/images/emoji/1f1e7-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f8.png b/images/emoji/1f1e7-1f1f8.png
deleted file mode 100644
index d36bcd2fb..000000000
--- a/images/emoji/1f1e7-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1f9.png b/images/emoji/1f1e7-1f1f9.png
deleted file mode 100644
index b571dce1a..000000000
--- a/images/emoji/1f1e7-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fb.png b/images/emoji/1f1e7-1f1fb.png
deleted file mode 100644
index 5884e6482..000000000
--- a/images/emoji/1f1e7-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fc.png b/images/emoji/1f1e7-1f1fc.png
deleted file mode 100644
index cb12f3473..000000000
--- a/images/emoji/1f1e7-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1fe.png b/images/emoji/1f1e7-1f1fe.png
deleted file mode 100644
index 859c05beb..000000000
--- a/images/emoji/1f1e7-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7-1f1ff.png b/images/emoji/1f1e7-1f1ff.png
deleted file mode 100644
index db2c28bd7..000000000
--- a/images/emoji/1f1e7-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e7.png b/images/emoji/1f1e7.png
deleted file mode 100644
index 8f69fa973..000000000
--- a/images/emoji/1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e6.png b/images/emoji/1f1e8-1f1e6.png
deleted file mode 100644
index 7c5b390e8..000000000
--- a/images/emoji/1f1e8-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e8.png b/images/emoji/1f1e8-1f1e8.png
deleted file mode 100644
index b6555a23d..000000000
--- a/images/emoji/1f1e8-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1e9.png b/images/emoji/1f1e8-1f1e9.png
deleted file mode 100644
index fa9200977..000000000
--- a/images/emoji/1f1e8-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1eb.png b/images/emoji/1f1e8-1f1eb.png
deleted file mode 100644
index b969ae29e..000000000
--- a/images/emoji/1f1e8-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ec.png b/images/emoji/1f1e8-1f1ec.png
deleted file mode 100644
index 3a38a40a9..000000000
--- a/images/emoji/1f1e8-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ed.png b/images/emoji/1f1e8-1f1ed.png
deleted file mode 100644
index 5ff86b8a3..000000000
--- a/images/emoji/1f1e8-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ee.png b/images/emoji/1f1e8-1f1ee.png
deleted file mode 100644
index e3b4d15c7..000000000
--- a/images/emoji/1f1e8-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f0.png b/images/emoji/1f1e8-1f1f0.png
deleted file mode 100644
index b6b53dbc1..000000000
--- a/images/emoji/1f1e8-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f1.png b/images/emoji/1f1e8-1f1f1.png
deleted file mode 100644
index c9390da54..000000000
--- a/images/emoji/1f1e8-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f2.png b/images/emoji/1f1e8-1f1f2.png
deleted file mode 100644
index 2d3f6ec45..000000000
--- a/images/emoji/1f1e8-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f3.png b/images/emoji/1f1e8-1f1f3.png
deleted file mode 100644
index 0a7f350a6..000000000
--- a/images/emoji/1f1e8-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f4.png b/images/emoji/1f1e8-1f1f4.png
deleted file mode 100644
index 7e0f5e0dc..000000000
--- a/images/emoji/1f1e8-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f5.png b/images/emoji/1f1e8-1f1f5.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1e8-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1f7.png b/images/emoji/1f1e8-1f1f7.png
deleted file mode 100644
index a5fce1265..000000000
--- a/images/emoji/1f1e8-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fa.png b/images/emoji/1f1e8-1f1fa.png
deleted file mode 100644
index 447328f7d..000000000
--- a/images/emoji/1f1e8-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fb.png b/images/emoji/1f1e8-1f1fb.png
deleted file mode 100644
index 43faf4d64..000000000
--- a/images/emoji/1f1e8-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fc.png b/images/emoji/1f1e8-1f1fc.png
deleted file mode 100644
index eb39e8d00..000000000
--- a/images/emoji/1f1e8-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fd.png b/images/emoji/1f1e8-1f1fd.png
deleted file mode 100644
index 09d21359f..000000000
--- a/images/emoji/1f1e8-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1fe.png b/images/emoji/1f1e8-1f1fe.png
deleted file mode 100644
index 154a7aa31..000000000
--- a/images/emoji/1f1e8-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8-1f1ff.png b/images/emoji/1f1e8-1f1ff.png
deleted file mode 100644
index 9737ca223..000000000
--- a/images/emoji/1f1e8-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e8.png b/images/emoji/1f1e8.png
deleted file mode 100644
index f94e668a2..000000000
--- a/images/emoji/1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ea.png b/images/emoji/1f1e9-1f1ea.png
deleted file mode 100644
index 98ed76b3b..000000000
--- a/images/emoji/1f1e9-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ec.png b/images/emoji/1f1e9-1f1ec.png
deleted file mode 100644
index fb6cc3cd4..000000000
--- a/images/emoji/1f1e9-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ef.png b/images/emoji/1f1e9-1f1ef.png
deleted file mode 100644
index 73c2a2acb..000000000
--- a/images/emoji/1f1e9-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f0.png b/images/emoji/1f1e9-1f1f0.png
deleted file mode 100644
index e5a60b062..000000000
--- a/images/emoji/1f1e9-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f2.png b/images/emoji/1f1e9-1f1f2.png
deleted file mode 100644
index 4d4cf6444..000000000
--- a/images/emoji/1f1e9-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1f4.png b/images/emoji/1f1e9-1f1f4.png
deleted file mode 100644
index 037a45d7c..000000000
--- a/images/emoji/1f1e9-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9-1f1ff.png b/images/emoji/1f1e9-1f1ff.png
deleted file mode 100644
index 24945b10f..000000000
--- a/images/emoji/1f1e9-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1e9.png b/images/emoji/1f1e9.png
deleted file mode 100644
index 4a36666e5..000000000
--- a/images/emoji/1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1e6.png b/images/emoji/1f1ea-1f1e6.png
deleted file mode 100644
index 9d05e1b0d..000000000
--- a/images/emoji/1f1ea-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1e8.png b/images/emoji/1f1ea-1f1e8.png
deleted file mode 100644
index 138145946..000000000
--- a/images/emoji/1f1ea-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ea.png b/images/emoji/1f1ea-1f1ea.png
deleted file mode 100644
index 84f317e77..000000000
--- a/images/emoji/1f1ea-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ec.png b/images/emoji/1f1ea-1f1ec.png
deleted file mode 100644
index 57786064a..000000000
--- a/images/emoji/1f1ea-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1ed.png b/images/emoji/1f1ea-1f1ed.png
deleted file mode 100644
index 4d7a76687..000000000
--- a/images/emoji/1f1ea-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f7.png b/images/emoji/1f1ea-1f1f7.png
deleted file mode 100644
index 0c3c724c1..000000000
--- a/images/emoji/1f1ea-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f8.png b/images/emoji/1f1ea-1f1f8.png
deleted file mode 100644
index c37fdfe5c..000000000
--- a/images/emoji/1f1ea-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1f9.png b/images/emoji/1f1ea-1f1f9.png
deleted file mode 100644
index 9560a134c..000000000
--- a/images/emoji/1f1ea-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea-1f1fa.png b/images/emoji/1f1ea-1f1fa.png
deleted file mode 100644
index 0b456cf33..000000000
--- a/images/emoji/1f1ea-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ea.png b/images/emoji/1f1ea.png
deleted file mode 100644
index 66f7e8d8c..000000000
--- a/images/emoji/1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1ee.png b/images/emoji/1f1eb-1f1ee.png
deleted file mode 100644
index ebcf58abf..000000000
--- a/images/emoji/1f1eb-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1ef.png b/images/emoji/1f1eb-1f1ef.png
deleted file mode 100644
index 9cc8c37fe..000000000
--- a/images/emoji/1f1eb-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f0.png b/images/emoji/1f1eb-1f1f0.png
deleted file mode 100644
index 61372fd25..000000000
--- a/images/emoji/1f1eb-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f2.png b/images/emoji/1f1eb-1f1f2.png
deleted file mode 100644
index 0889825c8..000000000
--- a/images/emoji/1f1eb-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f4.png b/images/emoji/1f1eb-1f1f4.png
deleted file mode 100644
index 9a4431b08..000000000
--- a/images/emoji/1f1eb-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb-1f1f7.png b/images/emoji/1f1eb-1f1f7.png
deleted file mode 100644
index 62ca19c3f..000000000
--- a/images/emoji/1f1eb-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1eb.png b/images/emoji/1f1eb.png
deleted file mode 100644
index 913b230fd..000000000
--- a/images/emoji/1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e6.png b/images/emoji/1f1ec-1f1e6.png
deleted file mode 100644
index 2e68e527a..000000000
--- a/images/emoji/1f1ec-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e7.png b/images/emoji/1f1ec-1f1e7.png
deleted file mode 100644
index 3ed10f623..000000000
--- a/images/emoji/1f1ec-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1e9.png b/images/emoji/1f1ec-1f1e9.png
deleted file mode 100644
index 527aad338..000000000
--- a/images/emoji/1f1ec-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ea.png b/images/emoji/1f1ec-1f1ea.png
deleted file mode 100644
index a75d14248..000000000
--- a/images/emoji/1f1ec-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1eb.png b/images/emoji/1f1ec-1f1eb.png
deleted file mode 100644
index 0cf96f327..000000000
--- a/images/emoji/1f1ec-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ec.png b/images/emoji/1f1ec-1f1ec.png
deleted file mode 100644
index 970002c7f..000000000
--- a/images/emoji/1f1ec-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ed.png b/images/emoji/1f1ec-1f1ed.png
deleted file mode 100644
index f31b5eb7b..000000000
--- a/images/emoji/1f1ec-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1ee.png b/images/emoji/1f1ec-1f1ee.png
deleted file mode 100644
index e554a2a1d..000000000
--- a/images/emoji/1f1ec-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f1.png b/images/emoji/1f1ec-1f1f1.png
deleted file mode 100644
index 2e795dd4e..000000000
--- a/images/emoji/1f1ec-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f2.png b/images/emoji/1f1ec-1f1f2.png
deleted file mode 100644
index bb69c0975..000000000
--- a/images/emoji/1f1ec-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f3.png b/images/emoji/1f1ec-1f1f3.png
deleted file mode 100644
index 1981f61db..000000000
--- a/images/emoji/1f1ec-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f5.png b/images/emoji/1f1ec-1f1f5.png
deleted file mode 100644
index 10e42e672..000000000
--- a/images/emoji/1f1ec-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f6.png b/images/emoji/1f1ec-1f1f6.png
deleted file mode 100644
index 11475e61e..000000000
--- a/images/emoji/1f1ec-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f7.png b/images/emoji/1f1ec-1f1f7.png
deleted file mode 100644
index 0f6bb1b6b..000000000
--- a/images/emoji/1f1ec-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f8.png b/images/emoji/1f1ec-1f1f8.png
deleted file mode 100644
index 6fc927804..000000000
--- a/images/emoji/1f1ec-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1f9.png b/images/emoji/1f1ec-1f1f9.png
deleted file mode 100644
index 7213d4139..000000000
--- a/images/emoji/1f1ec-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fa.png b/images/emoji/1f1ec-1f1fa.png
deleted file mode 100644
index 4027549ca..000000000
--- a/images/emoji/1f1ec-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fc.png b/images/emoji/1f1ec-1f1fc.png
deleted file mode 100644
index 6357f6225..000000000
--- a/images/emoji/1f1ec-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec-1f1fe.png b/images/emoji/1f1ec-1f1fe.png
deleted file mode 100644
index 746e2fb7e..000000000
--- a/images/emoji/1f1ec-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ec.png b/images/emoji/1f1ec.png
deleted file mode 100644
index 271163075..000000000
--- a/images/emoji/1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f0.png b/images/emoji/1f1ed-1f1f0.png
deleted file mode 100644
index cf0c7151b..000000000
--- a/images/emoji/1f1ed-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f2.png b/images/emoji/1f1ed-1f1f2.png
deleted file mode 100644
index b613509e4..000000000
--- a/images/emoji/1f1ed-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f3.png b/images/emoji/1f1ed-1f1f3.png
deleted file mode 100644
index 402cdcefd..000000000
--- a/images/emoji/1f1ed-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f7.png b/images/emoji/1f1ed-1f1f7.png
deleted file mode 100644
index 46f4f06b4..000000000
--- a/images/emoji/1f1ed-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1f9.png b/images/emoji/1f1ed-1f1f9.png
deleted file mode 100644
index d8d0c8884..000000000
--- a/images/emoji/1f1ed-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed-1f1fa.png b/images/emoji/1f1ed-1f1fa.png
deleted file mode 100644
index a898de636..000000000
--- a/images/emoji/1f1ed-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ed.png b/images/emoji/1f1ed.png
deleted file mode 100644
index ca88e46bf..000000000
--- a/images/emoji/1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1e8.png b/images/emoji/1f1ee-1f1e8.png
deleted file mode 100644
index 69fd990aa..000000000
--- a/images/emoji/1f1ee-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1e9.png b/images/emoji/1f1ee-1f1e9.png
deleted file mode 100644
index 85b4c063a..000000000
--- a/images/emoji/1f1ee-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1ea.png b/images/emoji/1f1ee-1f1ea.png
deleted file mode 100644
index a28295838..000000000
--- a/images/emoji/1f1ee-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f1.png b/images/emoji/1f1ee-1f1f1.png
deleted file mode 100644
index 85c410d45..000000000
--- a/images/emoji/1f1ee-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f2.png b/images/emoji/1f1ee-1f1f2.png
deleted file mode 100644
index 60a2458e3..000000000
--- a/images/emoji/1f1ee-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f3.png b/images/emoji/1f1ee-1f1f3.png
deleted file mode 100644
index feccc8952..000000000
--- a/images/emoji/1f1ee-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f4.png b/images/emoji/1f1ee-1f1f4.png
deleted file mode 100644
index fb6cc3cd4..000000000
--- a/images/emoji/1f1ee-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f6.png b/images/emoji/1f1ee-1f1f6.png
deleted file mode 100644
index 41fd1db6f..000000000
--- a/images/emoji/1f1ee-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f7.png b/images/emoji/1f1ee-1f1f7.png
deleted file mode 100644
index ff7aaf62b..000000000
--- a/images/emoji/1f1ee-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f8.png b/images/emoji/1f1ee-1f1f8.png
deleted file mode 100644
index ad8d4131d..000000000
--- a/images/emoji/1f1ee-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee-1f1f9.png b/images/emoji/1f1ee-1f1f9.png
deleted file mode 100644
index f21563ec5..000000000
--- a/images/emoji/1f1ee-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ee.png b/images/emoji/1f1ee.png
deleted file mode 100644
index 48dc16788..000000000
--- a/images/emoji/1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1ea.png b/images/emoji/1f1ef-1f1ea.png
deleted file mode 100644
index 198a918f6..000000000
--- a/images/emoji/1f1ef-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f2.png b/images/emoji/1f1ef-1f1f2.png
deleted file mode 100644
index f84e4f9e8..000000000
--- a/images/emoji/1f1ef-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f4.png b/images/emoji/1f1ef-1f1f4.png
deleted file mode 100644
index 20bfa147e..000000000
--- a/images/emoji/1f1ef-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef-1f1f5.png b/images/emoji/1f1ef-1f1f5.png
deleted file mode 100644
index 8d8838e47..000000000
--- a/images/emoji/1f1ef-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ef.png b/images/emoji/1f1ef.png
deleted file mode 100644
index 16599daa7..000000000
--- a/images/emoji/1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ea.png b/images/emoji/1f1f0-1f1ea.png
deleted file mode 100644
index 9e417ab30..000000000
--- a/images/emoji/1f1f0-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ec.png b/images/emoji/1f1f0-1f1ec.png
deleted file mode 100644
index b3eaf7e57..000000000
--- a/images/emoji/1f1f0-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ed.png b/images/emoji/1f1f0-1f1ed.png
deleted file mode 100644
index 9a2877dd6..000000000
--- a/images/emoji/1f1f0-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ee.png b/images/emoji/1f1f0-1f1ee.png
deleted file mode 100644
index 9a5abed3f..000000000
--- a/images/emoji/1f1f0-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f2.png b/images/emoji/1f1f0-1f1f2.png
deleted file mode 100644
index bd5a0588e..000000000
--- a/images/emoji/1f1f0-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f3.png b/images/emoji/1f1f0-1f1f3.png
deleted file mode 100644
index 776207c96..000000000
--- a/images/emoji/1f1f0-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f5.png b/images/emoji/1f1f0-1f1f5.png
deleted file mode 100644
index 6b3fd89ea..000000000
--- a/images/emoji/1f1f0-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1f7.png b/images/emoji/1f1f0-1f1f7.png
deleted file mode 100644
index faa466f2d..000000000
--- a/images/emoji/1f1f0-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1fc.png b/images/emoji/1f1f0-1f1fc.png
deleted file mode 100644
index 4d19bfa6c..000000000
--- a/images/emoji/1f1f0-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1fe.png b/images/emoji/1f1f0-1f1fe.png
deleted file mode 100644
index 40daa4da5..000000000
--- a/images/emoji/1f1f0-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0-1f1ff.png b/images/emoji/1f1f0-1f1ff.png
deleted file mode 100644
index 2f97a8fd3..000000000
--- a/images/emoji/1f1f0-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f0.png b/images/emoji/1f1f0.png
deleted file mode 100644
index 204b95d1b..000000000
--- a/images/emoji/1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e6.png b/images/emoji/1f1f1-1f1e6.png
deleted file mode 100644
index 4d4179f34..000000000
--- a/images/emoji/1f1f1-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e7.png b/images/emoji/1f1f1-1f1e7.png
deleted file mode 100644
index 3d5944670..000000000
--- a/images/emoji/1f1f1-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1e8.png b/images/emoji/1f1f1-1f1e8.png
deleted file mode 100644
index 45547b1e4..000000000
--- a/images/emoji/1f1f1-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1ee.png b/images/emoji/1f1f1-1f1ee.png
deleted file mode 100644
index 0eafa6a22..000000000
--- a/images/emoji/1f1f1-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f0.png b/images/emoji/1f1f1-1f1f0.png
deleted file mode 100644
index ab4fe10c4..000000000
--- a/images/emoji/1f1f1-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f7.png b/images/emoji/1f1f1-1f1f7.png
deleted file mode 100644
index f66f267fe..000000000
--- a/images/emoji/1f1f1-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f8.png b/images/emoji/1f1f1-1f1f8.png
deleted file mode 100644
index 24745631e..000000000
--- a/images/emoji/1f1f1-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1f9.png b/images/emoji/1f1f1-1f1f9.png
deleted file mode 100644
index d644b56d6..000000000
--- a/images/emoji/1f1f1-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fa.png b/images/emoji/1f1f1-1f1fa.png
deleted file mode 100644
index a2df9c929..000000000
--- a/images/emoji/1f1f1-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fb.png b/images/emoji/1f1f1-1f1fb.png
deleted file mode 100644
index ae680d5f0..000000000
--- a/images/emoji/1f1f1-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1-1f1fe.png b/images/emoji/1f1f1-1f1fe.png
deleted file mode 100644
index f6e77b0f3..000000000
--- a/images/emoji/1f1f1-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f1.png b/images/emoji/1f1f1.png
deleted file mode 100644
index 7992b4f68..000000000
--- a/images/emoji/1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e6.png b/images/emoji/1f1f2-1f1e6.png
deleted file mode 100644
index c4a056722..000000000
--- a/images/emoji/1f1f2-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e8.png b/images/emoji/1f1f2-1f1e8.png
deleted file mode 100644
index d479eab98..000000000
--- a/images/emoji/1f1f2-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1e9.png b/images/emoji/1f1f2-1f1e9.png
deleted file mode 100644
index a7a725398..000000000
--- a/images/emoji/1f1f2-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ea.png b/images/emoji/1f1f2-1f1ea.png
deleted file mode 100644
index 7c771e7e1..000000000
--- a/images/emoji/1f1f2-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1eb.png b/images/emoji/1f1f2-1f1eb.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1f2-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ec.png b/images/emoji/1f1f2-1f1ec.png
deleted file mode 100644
index 2f3ccdda7..000000000
--- a/images/emoji/1f1f2-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ed.png b/images/emoji/1f1f2-1f1ed.png
deleted file mode 100644
index 598016481..000000000
--- a/images/emoji/1f1f2-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f0.png b/images/emoji/1f1f2-1f1f0.png
deleted file mode 100644
index 7ba775ee7..000000000
--- a/images/emoji/1f1f2-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f1.png b/images/emoji/1f1f2-1f1f1.png
deleted file mode 100644
index 683437854..000000000
--- a/images/emoji/1f1f2-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f2.png b/images/emoji/1f1f2-1f1f2.png
deleted file mode 100644
index 37dc7d715..000000000
--- a/images/emoji/1f1f2-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f3.png b/images/emoji/1f1f2-1f1f3.png
deleted file mode 100644
index 1f146bbcd..000000000
--- a/images/emoji/1f1f2-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f4.png b/images/emoji/1f1f2-1f1f4.png
deleted file mode 100644
index 7edde31f6..000000000
--- a/images/emoji/1f1f2-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f5.png b/images/emoji/1f1f2-1f1f5.png
deleted file mode 100644
index 17ec1c441..000000000
--- a/images/emoji/1f1f2-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f6.png b/images/emoji/1f1f2-1f1f6.png
deleted file mode 100644
index 1e672dc90..000000000
--- a/images/emoji/1f1f2-1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f7.png b/images/emoji/1f1f2-1f1f7.png
deleted file mode 100644
index f87de46ef..000000000
--- a/images/emoji/1f1f2-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f8.png b/images/emoji/1f1f2-1f1f8.png
deleted file mode 100644
index 480b0d4eb..000000000
--- a/images/emoji/1f1f2-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1f9.png b/images/emoji/1f1f2-1f1f9.png
deleted file mode 100644
index c9e1dbdce..000000000
--- a/images/emoji/1f1f2-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fa.png b/images/emoji/1f1f2-1f1fa.png
deleted file mode 100644
index 55b33cb7c..000000000
--- a/images/emoji/1f1f2-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fb.png b/images/emoji/1f1f2-1f1fb.png
deleted file mode 100644
index ce5867126..000000000
--- a/images/emoji/1f1f2-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fc.png b/images/emoji/1f1f2-1f1fc.png
deleted file mode 100644
index 003d85484..000000000
--- a/images/emoji/1f1f2-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fd.png b/images/emoji/1f1f2-1f1fd.png
deleted file mode 100644
index 42572bcd0..000000000
--- a/images/emoji/1f1f2-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1fe.png b/images/emoji/1f1f2-1f1fe.png
deleted file mode 100644
index 17526c267..000000000
--- a/images/emoji/1f1f2-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2-1f1ff.png b/images/emoji/1f1f2-1f1ff.png
deleted file mode 100644
index 2352a78e7..000000000
--- a/images/emoji/1f1f2-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f2.png b/images/emoji/1f1f2.png
deleted file mode 100644
index 7b848b2ce..000000000
--- a/images/emoji/1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1e6.png b/images/emoji/1f1f3-1f1e6.png
deleted file mode 100644
index ed31c3df0..000000000
--- a/images/emoji/1f1f3-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1e8.png b/images/emoji/1f1f3-1f1e8.png
deleted file mode 100644
index 3c57ee942..000000000
--- a/images/emoji/1f1f3-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ea.png b/images/emoji/1f1f3-1f1ea.png
deleted file mode 100644
index f98a1173c..000000000
--- a/images/emoji/1f1f3-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1eb.png b/images/emoji/1f1f3-1f1eb.png
deleted file mode 100644
index 9099e7674..000000000
--- a/images/emoji/1f1f3-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ec.png b/images/emoji/1f1f3-1f1ec.png
deleted file mode 100644
index ea0abeff1..000000000
--- a/images/emoji/1f1f3-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ee.png b/images/emoji/1f1f3-1f1ee.png
deleted file mode 100644
index 772920dfa..000000000
--- a/images/emoji/1f1f3-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f1.png b/images/emoji/1f1f3-1f1f1.png
deleted file mode 100644
index 83a0e817e..000000000
--- a/images/emoji/1f1f3-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f4.png b/images/emoji/1f1f3-1f1f4.png
deleted file mode 100644
index 99d3142eb..000000000
--- a/images/emoji/1f1f3-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f5.png b/images/emoji/1f1f3-1f1f5.png
deleted file mode 100644
index 87425a8df..000000000
--- a/images/emoji/1f1f3-1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1f7.png b/images/emoji/1f1f3-1f1f7.png
deleted file mode 100644
index b3e3a5d56..000000000
--- a/images/emoji/1f1f3-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1fa.png b/images/emoji/1f1f3-1f1fa.png
deleted file mode 100644
index f03614443..000000000
--- a/images/emoji/1f1f3-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3-1f1ff.png b/images/emoji/1f1f3-1f1ff.png
deleted file mode 100644
index a4eeeab9c..000000000
--- a/images/emoji/1f1f3-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f3.png b/images/emoji/1f1f3.png
deleted file mode 100644
index 4a11e5043..000000000
--- a/images/emoji/1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f4-1f1f2.png b/images/emoji/1f1f4-1f1f2.png
deleted file mode 100644
index ea824ba31..000000000
--- a/images/emoji/1f1f4-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f4.png b/images/emoji/1f1f4.png
deleted file mode 100644
index 2a0760b31..000000000
--- a/images/emoji/1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1e6.png b/images/emoji/1f1f5-1f1e6.png
deleted file mode 100644
index c3091d898..000000000
--- a/images/emoji/1f1f5-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ea.png b/images/emoji/1f1f5-1f1ea.png
deleted file mode 100644
index 39223aa9d..000000000
--- a/images/emoji/1f1f5-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1eb.png b/images/emoji/1f1f5-1f1eb.png
deleted file mode 100644
index 113445f8f..000000000
--- a/images/emoji/1f1f5-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ec.png b/images/emoji/1f1f5-1f1ec.png
deleted file mode 100644
index 825e9dcb7..000000000
--- a/images/emoji/1f1f5-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1ed.png b/images/emoji/1f1f5-1f1ed.png
deleted file mode 100644
index 8260e15bd..000000000
--- a/images/emoji/1f1f5-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f0.png b/images/emoji/1f1f5-1f1f0.png
deleted file mode 100644
index a7b6a1c50..000000000
--- a/images/emoji/1f1f5-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f1.png b/images/emoji/1f1f5-1f1f1.png
deleted file mode 100644
index 19de2edec..000000000
--- a/images/emoji/1f1f5-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f2.png b/images/emoji/1f1f5-1f1f2.png
deleted file mode 100644
index 2ca605541..000000000
--- a/images/emoji/1f1f5-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f3.png b/images/emoji/1f1f5-1f1f3.png
deleted file mode 100644
index 9a6327847..000000000
--- a/images/emoji/1f1f5-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f7.png b/images/emoji/1f1f5-1f1f7.png
deleted file mode 100644
index d0209cddb..000000000
--- a/images/emoji/1f1f5-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f8.png b/images/emoji/1f1f5-1f1f8.png
deleted file mode 100644
index 7ccab0977..000000000
--- a/images/emoji/1f1f5-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1f9.png b/images/emoji/1f1f5-1f1f9.png
deleted file mode 100644
index cc93f27c6..000000000
--- a/images/emoji/1f1f5-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1fc.png b/images/emoji/1f1f5-1f1fc.png
deleted file mode 100644
index 154b2f12d..000000000
--- a/images/emoji/1f1f5-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5-1f1fe.png b/images/emoji/1f1f5-1f1fe.png
deleted file mode 100644
index 662ad2f6f..000000000
--- a/images/emoji/1f1f5-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f5.png b/images/emoji/1f1f5.png
deleted file mode 100644
index bcb3298f9..000000000
--- a/images/emoji/1f1f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f6-1f1e6.png b/images/emoji/1f1f6-1f1e6.png
deleted file mode 100644
index a01d8b05c..000000000
--- a/images/emoji/1f1f6-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f6.png b/images/emoji/1f1f6.png
deleted file mode 100644
index 6c92a9dfb..000000000
--- a/images/emoji/1f1f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1ea.png b/images/emoji/1f1f7-1f1ea.png
deleted file mode 100644
index 57f2bbe9d..000000000
--- a/images/emoji/1f1f7-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1f4.png b/images/emoji/1f1f7-1f1f4.png
deleted file mode 100644
index 3e48c4477..000000000
--- a/images/emoji/1f1f7-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1f8.png b/images/emoji/1f1f7-1f1f8.png
deleted file mode 100644
index 9df6c9a52..000000000
--- a/images/emoji/1f1f7-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1fa.png b/images/emoji/1f1f7-1f1fa.png
deleted file mode 100644
index e50c9db90..000000000
--- a/images/emoji/1f1f7-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7-1f1fc.png b/images/emoji/1f1f7-1f1fc.png
deleted file mode 100644
index c238c874e..000000000
--- a/images/emoji/1f1f7-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f7.png b/images/emoji/1f1f7.png
deleted file mode 100644
index 627892c91..000000000
--- a/images/emoji/1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e6.png b/images/emoji/1f1f8-1f1e6.png
deleted file mode 100644
index 4941be7d1..000000000
--- a/images/emoji/1f1f8-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e7.png b/images/emoji/1f1f8-1f1e7.png
deleted file mode 100644
index 7d8f1ac61..000000000
--- a/images/emoji/1f1f8-1f1e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e8.png b/images/emoji/1f1f8-1f1e8.png
deleted file mode 100644
index 6ae4d9076..000000000
--- a/images/emoji/1f1f8-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1e9.png b/images/emoji/1f1f8-1f1e9.png
deleted file mode 100644
index 963be1b36..000000000
--- a/images/emoji/1f1f8-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ea.png b/images/emoji/1f1f8-1f1ea.png
deleted file mode 100644
index fc0d0e0ce..000000000
--- a/images/emoji/1f1f8-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ec.png b/images/emoji/1f1f8-1f1ec.png
deleted file mode 100644
index de3c7737c..000000000
--- a/images/emoji/1f1f8-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ed.png b/images/emoji/1f1f8-1f1ed.png
deleted file mode 100644
index 40cd9e44e..000000000
--- a/images/emoji/1f1f8-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ee.png b/images/emoji/1f1f8-1f1ee.png
deleted file mode 100644
index e308999db..000000000
--- a/images/emoji/1f1f8-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ef.png b/images/emoji/1f1f8-1f1ef.png
deleted file mode 100644
index 5884e6482..000000000
--- a/images/emoji/1f1f8-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f0.png b/images/emoji/1f1f8-1f1f0.png
deleted file mode 100644
index 4259d0e14..000000000
--- a/images/emoji/1f1f8-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f1.png b/images/emoji/1f1f8-1f1f1.png
deleted file mode 100644
index d2cc68830..000000000
--- a/images/emoji/1f1f8-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f2.png b/images/emoji/1f1f8-1f1f2.png
deleted file mode 100644
index b96ba87d0..000000000
--- a/images/emoji/1f1f8-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f3.png b/images/emoji/1f1f8-1f1f3.png
deleted file mode 100644
index 5368bbe93..000000000
--- a/images/emoji/1f1f8-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f4.png b/images/emoji/1f1f8-1f1f4.png
deleted file mode 100644
index 68a059736..000000000
--- a/images/emoji/1f1f8-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f7.png b/images/emoji/1f1f8-1f1f7.png
deleted file mode 100644
index d32513270..000000000
--- a/images/emoji/1f1f8-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f8.png b/images/emoji/1f1f8-1f1f8.png
deleted file mode 100644
index 122977e79..000000000
--- a/images/emoji/1f1f8-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1f9.png b/images/emoji/1f1f8-1f1f9.png
deleted file mode 100644
index f83a863d6..000000000
--- a/images/emoji/1f1f8-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fb.png b/images/emoji/1f1f8-1f1fb.png
deleted file mode 100644
index efb83e2f2..000000000
--- a/images/emoji/1f1f8-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fd.png b/images/emoji/1f1f8-1f1fd.png
deleted file mode 100644
index 94b760fbe..000000000
--- a/images/emoji/1f1f8-1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1fe.png b/images/emoji/1f1f8-1f1fe.png
deleted file mode 100644
index 09a8ee8f7..000000000
--- a/images/emoji/1f1f8-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8-1f1ff.png b/images/emoji/1f1f8-1f1ff.png
deleted file mode 100644
index f74e82ea1..000000000
--- a/images/emoji/1f1f8-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f8.png b/images/emoji/1f1f8.png
deleted file mode 100644
index 9d0dbf93a..000000000
--- a/images/emoji/1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e6.png b/images/emoji/1f1f9-1f1e6.png
deleted file mode 100644
index b44283e90..000000000
--- a/images/emoji/1f1f9-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e8.png b/images/emoji/1f1f9-1f1e8.png
deleted file mode 100644
index 156b33d1b..000000000
--- a/images/emoji/1f1f9-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1e9.png b/images/emoji/1f1f9-1f1e9.png
deleted file mode 100644
index ebe7f5928..000000000
--- a/images/emoji/1f1f9-1f1e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1eb.png b/images/emoji/1f1f9-1f1eb.png
deleted file mode 100644
index a1a3ad68e..000000000
--- a/images/emoji/1f1f9-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ec.png b/images/emoji/1f1f9-1f1ec.png
deleted file mode 100644
index 826b73c9a..000000000
--- a/images/emoji/1f1f9-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ed.png b/images/emoji/1f1f9-1f1ed.png
deleted file mode 100644
index 93ff542c5..000000000
--- a/images/emoji/1f1f9-1f1ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ef.png b/images/emoji/1f1f9-1f1ef.png
deleted file mode 100644
index 7a8a0b619..000000000
--- a/images/emoji/1f1f9-1f1ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f0.png b/images/emoji/1f1f9-1f1f0.png
deleted file mode 100644
index 2fa5a21b1..000000000
--- a/images/emoji/1f1f9-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f1.png b/images/emoji/1f1f9-1f1f1.png
deleted file mode 100644
index 5b120eccc..000000000
--- a/images/emoji/1f1f9-1f1f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f2.png b/images/emoji/1f1f9-1f1f2.png
deleted file mode 100644
index c3c4f5323..000000000
--- a/images/emoji/1f1f9-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f3.png b/images/emoji/1f1f9-1f1f3.png
deleted file mode 100644
index 58ef16122..000000000
--- a/images/emoji/1f1f9-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f4.png b/images/emoji/1f1f9-1f1f4.png
deleted file mode 100644
index 1ffa7bb9d..000000000
--- a/images/emoji/1f1f9-1f1f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f7.png b/images/emoji/1f1f9-1f1f7.png
deleted file mode 100644
index 325251fae..000000000
--- a/images/emoji/1f1f9-1f1f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1f9.png b/images/emoji/1f1f9-1f1f9.png
deleted file mode 100644
index ed3bb39a3..000000000
--- a/images/emoji/1f1f9-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1fb.png b/images/emoji/1f1f9-1f1fb.png
deleted file mode 100644
index e82c65c7b..000000000
--- a/images/emoji/1f1f9-1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1fc.png b/images/emoji/1f1f9-1f1fc.png
deleted file mode 100644
index 3a8f00b59..000000000
--- a/images/emoji/1f1f9-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9-1f1ff.png b/images/emoji/1f1f9-1f1ff.png
deleted file mode 100644
index 2a020853d..000000000
--- a/images/emoji/1f1f9-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1f9.png b/images/emoji/1f1f9.png
deleted file mode 100644
index 2d882f66b..000000000
--- a/images/emoji/1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1e6.png b/images/emoji/1f1fa-1f1e6.png
deleted file mode 100644
index cd84d1bbd..000000000
--- a/images/emoji/1f1fa-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1ec.png b/images/emoji/1f1fa-1f1ec.png
deleted file mode 100644
index dc97690eb..000000000
--- a/images/emoji/1f1fa-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1f2.png b/images/emoji/1f1fa-1f1f2.png
deleted file mode 100644
index 4a7ee3cdf..000000000
--- a/images/emoji/1f1fa-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1f8.png b/images/emoji/1f1fa-1f1f8.png
deleted file mode 100644
index 9f7303058..000000000
--- a/images/emoji/1f1fa-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1fe.png b/images/emoji/1f1fa-1f1fe.png
deleted file mode 100644
index b8002a697..000000000
--- a/images/emoji/1f1fa-1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa-1f1ff.png b/images/emoji/1f1fa-1f1ff.png
deleted file mode 100644
index d56ca9bc4..000000000
--- a/images/emoji/1f1fa-1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fa.png b/images/emoji/1f1fa.png
deleted file mode 100644
index ae0cabeb1..000000000
--- a/images/emoji/1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1e6.png b/images/emoji/1f1fb-1f1e6.png
deleted file mode 100644
index 7f0676fc8..000000000
--- a/images/emoji/1f1fb-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1e8.png b/images/emoji/1f1fb-1f1e8.png
deleted file mode 100644
index 43703c62a..000000000
--- a/images/emoji/1f1fb-1f1e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ea.png b/images/emoji/1f1fb-1f1ea.png
deleted file mode 100644
index 1b6279682..000000000
--- a/images/emoji/1f1fb-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ec.png b/images/emoji/1f1fb-1f1ec.png
deleted file mode 100644
index 536f780f1..000000000
--- a/images/emoji/1f1fb-1f1ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1ee.png b/images/emoji/1f1fb-1f1ee.png
deleted file mode 100644
index 1b4219cb9..000000000
--- a/images/emoji/1f1fb-1f1ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1f3.png b/images/emoji/1f1fb-1f1f3.png
deleted file mode 100644
index 427036046..000000000
--- a/images/emoji/1f1fb-1f1f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb-1f1fa.png b/images/emoji/1f1fb-1f1fa.png
deleted file mode 100644
index 706eba440..000000000
--- a/images/emoji/1f1fb-1f1fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fb.png b/images/emoji/1f1fb.png
deleted file mode 100644
index e01e179b4..000000000
--- a/images/emoji/1f1fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc-1f1eb.png b/images/emoji/1f1fc-1f1eb.png
deleted file mode 100644
index 70c761036..000000000
--- a/images/emoji/1f1fc-1f1eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc-1f1f8.png b/images/emoji/1f1fc-1f1f8.png
deleted file mode 100644
index a1ea07031..000000000
--- a/images/emoji/1f1fc-1f1f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fc.png b/images/emoji/1f1fc.png
deleted file mode 100644
index e8f614ac8..000000000
--- a/images/emoji/1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fd-1f1f0.png b/images/emoji/1f1fd-1f1f0.png
deleted file mode 100644
index e587a4466..000000000
--- a/images/emoji/1f1fd-1f1f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fd.png b/images/emoji/1f1fd.png
deleted file mode 100644
index e3bedba0b..000000000
--- a/images/emoji/1f1fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe-1f1ea.png b/images/emoji/1f1fe-1f1ea.png
deleted file mode 100644
index eadfebd5f..000000000
--- a/images/emoji/1f1fe-1f1ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe-1f1f9.png b/images/emoji/1f1fe-1f1f9.png
deleted file mode 100644
index e55fd8d85..000000000
--- a/images/emoji/1f1fe-1f1f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1fe.png b/images/emoji/1f1fe.png
deleted file mode 100644
index 9bfa7f2db..000000000
--- a/images/emoji/1f1fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1e6.png b/images/emoji/1f1ff-1f1e6.png
deleted file mode 100644
index f397ef507..000000000
--- a/images/emoji/1f1ff-1f1e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1f2.png b/images/emoji/1f1ff-1f1f2.png
deleted file mode 100644
index 2494a31f6..000000000
--- a/images/emoji/1f1ff-1f1f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff-1f1fc.png b/images/emoji/1f1ff-1f1fc.png
deleted file mode 100644
index e09b9652b..000000000
--- a/images/emoji/1f1ff-1f1fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f1ff.png b/images/emoji/1f1ff.png
deleted file mode 100644
index 5bf03f100..000000000
--- a/images/emoji/1f1ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f201.png b/images/emoji/1f201.png
deleted file mode 100644
index 6450eb44d..000000000
--- a/images/emoji/1f201.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f202.png b/images/emoji/1f202.png
deleted file mode 100644
index 900f96332..000000000
--- a/images/emoji/1f202.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f21a.png b/images/emoji/1f21a.png
deleted file mode 100644
index d3a19b420..000000000
--- a/images/emoji/1f21a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f22f.png b/images/emoji/1f22f.png
deleted file mode 100644
index 078e23e4f..000000000
--- a/images/emoji/1f22f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f232.png b/images/emoji/1f232.png
deleted file mode 100644
index 4c704e034..000000000
--- a/images/emoji/1f232.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f233.png b/images/emoji/1f233.png
deleted file mode 100644
index 47966c1ea..000000000
--- a/images/emoji/1f233.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f234.png b/images/emoji/1f234.png
deleted file mode 100644
index 8375ad9d9..000000000
--- a/images/emoji/1f234.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f235.png b/images/emoji/1f235.png
deleted file mode 100644
index f9dea8b88..000000000
--- a/images/emoji/1f235.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f236.png b/images/emoji/1f236.png
deleted file mode 100644
index a4510de41..000000000
--- a/images/emoji/1f236.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f237.png b/images/emoji/1f237.png
deleted file mode 100644
index c41bd36a2..000000000
--- a/images/emoji/1f237.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f238.png b/images/emoji/1f238.png
deleted file mode 100644
index 6b7af0ee2..000000000
--- a/images/emoji/1f238.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f239.png b/images/emoji/1f239.png
deleted file mode 100644
index c4f837fe6..000000000
--- a/images/emoji/1f239.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f23a.png b/images/emoji/1f23a.png
deleted file mode 100644
index d21cb30ea..000000000
--- a/images/emoji/1f23a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f250.png b/images/emoji/1f250.png
deleted file mode 100644
index 0c0d589ca..000000000
--- a/images/emoji/1f250.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f251.png b/images/emoji/1f251.png
deleted file mode 100644
index 8afd7ce99..000000000
--- a/images/emoji/1f251.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f300.png b/images/emoji/1f300.png
deleted file mode 100644
index ff00b1afe..000000000
--- a/images/emoji/1f300.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f301.png b/images/emoji/1f301.png
deleted file mode 100644
index 57702d8d3..000000000
--- a/images/emoji/1f301.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f302.png b/images/emoji/1f302.png
deleted file mode 100644
index ecefba9e4..000000000
--- a/images/emoji/1f302.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f303.png b/images/emoji/1f303.png
deleted file mode 100644
index ca2018f45..000000000
--- a/images/emoji/1f303.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f304.png b/images/emoji/1f304.png
deleted file mode 100644
index 39c57c86a..000000000
--- a/images/emoji/1f304.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f305.png b/images/emoji/1f305.png
deleted file mode 100644
index 4ad36003c..000000000
--- a/images/emoji/1f305.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f306.png b/images/emoji/1f306.png
deleted file mode 100644
index 80cdff7cf..000000000
--- a/images/emoji/1f306.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f307.png b/images/emoji/1f307.png
deleted file mode 100644
index 7cded0ba5..000000000
--- a/images/emoji/1f307.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f308.png b/images/emoji/1f308.png
deleted file mode 100644
index 154735d71..000000000
--- a/images/emoji/1f308.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f309.png b/images/emoji/1f309.png
deleted file mode 100644
index 1d444e0be..000000000
--- a/images/emoji/1f309.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30a.png b/images/emoji/1f30a.png
deleted file mode 100644
index 45ff1e877..000000000
--- a/images/emoji/1f30a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30b.png b/images/emoji/1f30b.png
deleted file mode 100644
index adb522980..000000000
--- a/images/emoji/1f30b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30c.png b/images/emoji/1f30c.png
deleted file mode 100644
index b2b8ac59c..000000000
--- a/images/emoji/1f30c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30d.png b/images/emoji/1f30d.png
deleted file mode 100644
index 66c3348c2..000000000
--- a/images/emoji/1f30d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30e.png b/images/emoji/1f30e.png
deleted file mode 100644
index 538c3cddd..000000000
--- a/images/emoji/1f30e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f30f.png b/images/emoji/1f30f.png
deleted file mode 100644
index d8df97fec..000000000
--- a/images/emoji/1f30f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f310.png b/images/emoji/1f310.png
deleted file mode 100644
index 82450c1a4..000000000
--- a/images/emoji/1f310.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f311.png b/images/emoji/1f311.png
deleted file mode 100644
index ecff72caa..000000000
--- a/images/emoji/1f311.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f312.png b/images/emoji/1f312.png
deleted file mode 100644
index 921224a34..000000000
--- a/images/emoji/1f312.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f313.png b/images/emoji/1f313.png
deleted file mode 100644
index 5dccaf72a..000000000
--- a/images/emoji/1f313.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f314.png b/images/emoji/1f314.png
deleted file mode 100644
index 3a8081563..000000000
--- a/images/emoji/1f314.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f315.png b/images/emoji/1f315.png
deleted file mode 100644
index c9a2d6aa7..000000000
--- a/images/emoji/1f315.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f316.png b/images/emoji/1f316.png
deleted file mode 100644
index 741bd5931..000000000
--- a/images/emoji/1f316.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f317.png b/images/emoji/1f317.png
deleted file mode 100644
index 0842a0dd4..000000000
--- a/images/emoji/1f317.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f318.png b/images/emoji/1f318.png
deleted file mode 100644
index cf68706b8..000000000
--- a/images/emoji/1f318.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f319.png b/images/emoji/1f319.png
deleted file mode 100644
index 765420ece..000000000
--- a/images/emoji/1f319.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31a.png b/images/emoji/1f31a.png
deleted file mode 100644
index 150dd1240..000000000
--- a/images/emoji/1f31a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31b.png b/images/emoji/1f31b.png
deleted file mode 100644
index cd8a3d7ac..000000000
--- a/images/emoji/1f31b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31c.png b/images/emoji/1f31c.png
deleted file mode 100644
index 94099343c..000000000
--- a/images/emoji/1f31c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31d.png b/images/emoji/1f31d.png
deleted file mode 100644
index a5c25bbaf..000000000
--- a/images/emoji/1f31d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31e.png b/images/emoji/1f31e.png
deleted file mode 100644
index 14a4ea971..000000000
--- a/images/emoji/1f31e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f31f.png b/images/emoji/1f31f.png
deleted file mode 100644
index 2f5cba592..000000000
--- a/images/emoji/1f31f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f320.png b/images/emoji/1f320.png
deleted file mode 100644
index aa45384d1..000000000
--- a/images/emoji/1f320.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f321.png b/images/emoji/1f321.png
deleted file mode 100644
index b11473924..000000000
--- a/images/emoji/1f321.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f324.png b/images/emoji/1f324.png
deleted file mode 100644
index cead0bfa5..000000000
--- a/images/emoji/1f324.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f325.png b/images/emoji/1f325.png
deleted file mode 100644
index 0a4cc1002..000000000
--- a/images/emoji/1f325.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f326.png b/images/emoji/1f326.png
deleted file mode 100644
index 491f9ca48..000000000
--- a/images/emoji/1f326.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f327.png b/images/emoji/1f327.png
deleted file mode 100644
index 385685e05..000000000
--- a/images/emoji/1f327.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f328.png b/images/emoji/1f328.png
deleted file mode 100644
index 9720384eb..000000000
--- a/images/emoji/1f328.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f329.png b/images/emoji/1f329.png
deleted file mode 100644
index 0831e88aa..000000000
--- a/images/emoji/1f329.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32a.png b/images/emoji/1f32a.png
deleted file mode 100644
index 4821c89da..000000000
--- a/images/emoji/1f32a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32b.png b/images/emoji/1f32b.png
deleted file mode 100644
index 4e73c2de2..000000000
--- a/images/emoji/1f32b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32c.png b/images/emoji/1f32c.png
deleted file mode 100644
index df81b652e..000000000
--- a/images/emoji/1f32c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32d.png b/images/emoji/1f32d.png
deleted file mode 100644
index 3c3354d94..000000000
--- a/images/emoji/1f32d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32e.png b/images/emoji/1f32e.png
deleted file mode 100644
index 10e847a46..000000000
--- a/images/emoji/1f32e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f32f.png b/images/emoji/1f32f.png
deleted file mode 100644
index 02bd5601d..000000000
--- a/images/emoji/1f32f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f330.png b/images/emoji/1f330.png
deleted file mode 100644
index f8a01e281..000000000
--- a/images/emoji/1f330.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f331.png b/images/emoji/1f331.png
deleted file mode 100644
index ae0948bcf..000000000
--- a/images/emoji/1f331.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f332.png b/images/emoji/1f332.png
deleted file mode 100644
index f679d8dd7..000000000
--- a/images/emoji/1f332.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f333.png b/images/emoji/1f333.png
deleted file mode 100644
index 7cd2bc708..000000000
--- a/images/emoji/1f333.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f334.png b/images/emoji/1f334.png
deleted file mode 100644
index aaaa6aec3..000000000
--- a/images/emoji/1f334.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f335.png b/images/emoji/1f335.png
deleted file mode 100644
index 9b48ccf3d..000000000
--- a/images/emoji/1f335.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f336.png b/images/emoji/1f336.png
deleted file mode 100644
index 266675bd5..000000000
--- a/images/emoji/1f336.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f337.png b/images/emoji/1f337.png
deleted file mode 100644
index f799d75c1..000000000
--- a/images/emoji/1f337.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f338.png b/images/emoji/1f338.png
deleted file mode 100644
index 282f3e7bc..000000000
--- a/images/emoji/1f338.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f339.png b/images/emoji/1f339.png
deleted file mode 100644
index 52c286d31..000000000
--- a/images/emoji/1f339.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33a.png b/images/emoji/1f33a.png
deleted file mode 100644
index 39dd35242..000000000
--- a/images/emoji/1f33a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33b.png b/images/emoji/1f33b.png
deleted file mode 100644
index 08cc07761..000000000
--- a/images/emoji/1f33b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33c.png b/images/emoji/1f33c.png
deleted file mode 100644
index 4083026c1..000000000
--- a/images/emoji/1f33c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33d.png b/images/emoji/1f33d.png
deleted file mode 100644
index 36e201279..000000000
--- a/images/emoji/1f33d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33e.png b/images/emoji/1f33e.png
deleted file mode 100644
index 3564d9d64..000000000
--- a/images/emoji/1f33e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f33f.png b/images/emoji/1f33f.png
deleted file mode 100644
index d984d1562..000000000
--- a/images/emoji/1f33f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f340.png b/images/emoji/1f340.png
deleted file mode 100644
index fdedfcc2b..000000000
--- a/images/emoji/1f340.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f341.png b/images/emoji/1f341.png
deleted file mode 100644
index c49acea67..000000000
--- a/images/emoji/1f341.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f342.png b/images/emoji/1f342.png
deleted file mode 100644
index 0d60e7bdf..000000000
--- a/images/emoji/1f342.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f343.png b/images/emoji/1f343.png
deleted file mode 100644
index 1e43e1af8..000000000
--- a/images/emoji/1f343.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f344.png b/images/emoji/1f344.png
deleted file mode 100644
index dd85742ba..000000000
--- a/images/emoji/1f344.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f345.png b/images/emoji/1f345.png
deleted file mode 100644
index 497da8f6b..000000000
--- a/images/emoji/1f345.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f346.png b/images/emoji/1f346.png
deleted file mode 100644
index fafd7c1a1..000000000
--- a/images/emoji/1f346.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f347.png b/images/emoji/1f347.png
deleted file mode 100644
index 30d222188..000000000
--- a/images/emoji/1f347.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f348.png b/images/emoji/1f348.png
deleted file mode 100644
index c01232d41..000000000
--- a/images/emoji/1f348.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f349.png b/images/emoji/1f349.png
deleted file mode 100644
index 0761488b4..000000000
--- a/images/emoji/1f349.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34a.png b/images/emoji/1f34a.png
deleted file mode 100644
index ab14e5378..000000000
--- a/images/emoji/1f34a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34b.png b/images/emoji/1f34b.png
deleted file mode 100644
index 9a7d95ca2..000000000
--- a/images/emoji/1f34b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34c.png b/images/emoji/1f34c.png
deleted file mode 100644
index f49872795..000000000
--- a/images/emoji/1f34c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34d.png b/images/emoji/1f34d.png
deleted file mode 100644
index d30d73307..000000000
--- a/images/emoji/1f34d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34e.png b/images/emoji/1f34e.png
deleted file mode 100644
index da650c60f..000000000
--- a/images/emoji/1f34e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f34f.png b/images/emoji/1f34f.png
deleted file mode 100644
index 5fd51bd39..000000000
--- a/images/emoji/1f34f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f350.png b/images/emoji/1f350.png
deleted file mode 100644
index 3869f718b..000000000
--- a/images/emoji/1f350.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f351.png b/images/emoji/1f351.png
deleted file mode 100644
index 9ab57cbb7..000000000
--- a/images/emoji/1f351.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f352.png b/images/emoji/1f352.png
deleted file mode 100644
index 9b10cbaac..000000000
--- a/images/emoji/1f352.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f353.png b/images/emoji/1f353.png
deleted file mode 100644
index 7bb86f0b2..000000000
--- a/images/emoji/1f353.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f354.png b/images/emoji/1f354.png
deleted file mode 100644
index 4b13f3b8d..000000000
--- a/images/emoji/1f354.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f355.png b/images/emoji/1f355.png
deleted file mode 100644
index 240d5c469..000000000
--- a/images/emoji/1f355.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f356.png b/images/emoji/1f356.png
deleted file mode 100644
index b20a59d16..000000000
--- a/images/emoji/1f356.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f357.png b/images/emoji/1f357.png
deleted file mode 100644
index eea4a53a2..000000000
--- a/images/emoji/1f357.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f358.png b/images/emoji/1f358.png
deleted file mode 100644
index 7fbd08e4f..000000000
--- a/images/emoji/1f358.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f359.png b/images/emoji/1f359.png
deleted file mode 100644
index d3d8ee25c..000000000
--- a/images/emoji/1f359.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35a.png b/images/emoji/1f35a.png
deleted file mode 100644
index 6e3ac7956..000000000
--- a/images/emoji/1f35a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35b.png b/images/emoji/1f35b.png
deleted file mode 100644
index 69657ca81..000000000
--- a/images/emoji/1f35b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35c.png b/images/emoji/1f35c.png
deleted file mode 100644
index c1cb7cd73..000000000
--- a/images/emoji/1f35c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35d.png b/images/emoji/1f35d.png
deleted file mode 100644
index 4f0b7ed07..000000000
--- a/images/emoji/1f35d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35e.png b/images/emoji/1f35e.png
deleted file mode 100644
index 6676510aa..000000000
--- a/images/emoji/1f35e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f35f.png b/images/emoji/1f35f.png
deleted file mode 100644
index 3a0899d5a..000000000
--- a/images/emoji/1f35f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f360.png b/images/emoji/1f360.png
deleted file mode 100644
index 92a425f2e..000000000
--- a/images/emoji/1f360.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f361.png b/images/emoji/1f361.png
deleted file mode 100644
index f73f37b01..000000000
--- a/images/emoji/1f361.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f362.png b/images/emoji/1f362.png
deleted file mode 100644
index d38a849fe..000000000
--- a/images/emoji/1f362.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f363.png b/images/emoji/1f363.png
deleted file mode 100644
index f171fd2f7..000000000
--- a/images/emoji/1f363.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f364.png b/images/emoji/1f364.png
deleted file mode 100644
index 752ba7f13..000000000
--- a/images/emoji/1f364.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f365.png b/images/emoji/1f365.png
deleted file mode 100644
index 157bded65..000000000
--- a/images/emoji/1f365.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f366.png b/images/emoji/1f366.png
deleted file mode 100644
index f1f21a3b8..000000000
--- a/images/emoji/1f366.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f367.png b/images/emoji/1f367.png
deleted file mode 100644
index 36dfb53ca..000000000
--- a/images/emoji/1f367.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f368.png b/images/emoji/1f368.png
deleted file mode 100644
index 720ae7428..000000000
--- a/images/emoji/1f368.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f369.png b/images/emoji/1f369.png
deleted file mode 100644
index 0ca4cd0bd..000000000
--- a/images/emoji/1f369.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36a.png b/images/emoji/1f36a.png
deleted file mode 100644
index 1b6bcb155..000000000
--- a/images/emoji/1f36a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36b.png b/images/emoji/1f36b.png
deleted file mode 100644
index 318bbd40e..000000000
--- a/images/emoji/1f36b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36c.png b/images/emoji/1f36c.png
deleted file mode 100644
index 8c67ace3a..000000000
--- a/images/emoji/1f36c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36d.png b/images/emoji/1f36d.png
deleted file mode 100644
index ad76d7bf9..000000000
--- a/images/emoji/1f36d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36e.png b/images/emoji/1f36e.png
deleted file mode 100644
index fa3df67b8..000000000
--- a/images/emoji/1f36e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f36f.png b/images/emoji/1f36f.png
deleted file mode 100644
index 9d8f59295..000000000
--- a/images/emoji/1f36f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f370.png b/images/emoji/1f370.png
deleted file mode 100644
index 4368177be..000000000
--- a/images/emoji/1f370.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f371.png b/images/emoji/1f371.png
deleted file mode 100644
index 92cd17233..000000000
--- a/images/emoji/1f371.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f372.png b/images/emoji/1f372.png
deleted file mode 100644
index 6b3f010c1..000000000
--- a/images/emoji/1f372.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f373.png b/images/emoji/1f373.png
deleted file mode 100644
index 918c98057..000000000
--- a/images/emoji/1f373.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f374.png b/images/emoji/1f374.png
deleted file mode 100644
index 09f1feaea..000000000
--- a/images/emoji/1f374.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f375.png b/images/emoji/1f375.png
deleted file mode 100644
index b53b98f0c..000000000
--- a/images/emoji/1f375.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f376.png b/images/emoji/1f376.png
deleted file mode 100644
index 2933f5672..000000000
--- a/images/emoji/1f376.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f377.png b/images/emoji/1f377.png
deleted file mode 100644
index 3cc986891..000000000
--- a/images/emoji/1f377.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f378.png b/images/emoji/1f378.png
deleted file mode 100644
index 2e50c57e9..000000000
--- a/images/emoji/1f378.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f379.png b/images/emoji/1f379.png
deleted file mode 100644
index cd714f81b..000000000
--- a/images/emoji/1f379.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37a.png b/images/emoji/1f37a.png
deleted file mode 100644
index 894da40a7..000000000
--- a/images/emoji/1f37a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37b.png b/images/emoji/1f37b.png
deleted file mode 100644
index b55deb66b..000000000
--- a/images/emoji/1f37b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37c.png b/images/emoji/1f37c.png
deleted file mode 100644
index 2bd105241..000000000
--- a/images/emoji/1f37c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37d.png b/images/emoji/1f37d.png
deleted file mode 100644
index 7411755f7..000000000
--- a/images/emoji/1f37d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f37f.png b/images/emoji/1f37f.png
deleted file mode 100644
index 573ab05af..000000000
--- a/images/emoji/1f37f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f380.png b/images/emoji/1f380.png
deleted file mode 100644
index 0f253c3d8..000000000
--- a/images/emoji/1f380.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f381.png b/images/emoji/1f381.png
deleted file mode 100644
index 844e21645..000000000
--- a/images/emoji/1f381.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f382.png b/images/emoji/1f382.png
deleted file mode 100644
index 317e9a419..000000000
--- a/images/emoji/1f382.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f383.png b/images/emoji/1f383.png
deleted file mode 100644
index 44c3fc0ae..000000000
--- a/images/emoji/1f383.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f384.png b/images/emoji/1f384.png
deleted file mode 100644
index 4197d37a5..000000000
--- a/images/emoji/1f384.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fb.png b/images/emoji/1f385-1f3fb.png
deleted file mode 100644
index 2052920ab..000000000
--- a/images/emoji/1f385-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fc.png b/images/emoji/1f385-1f3fc.png
deleted file mode 100644
index ec9375e14..000000000
--- a/images/emoji/1f385-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fd.png b/images/emoji/1f385-1f3fd.png
deleted file mode 100644
index d1d16bceb..000000000
--- a/images/emoji/1f385-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3fe.png b/images/emoji/1f385-1f3fe.png
deleted file mode 100644
index 1088f1c07..000000000
--- a/images/emoji/1f385-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385-1f3ff.png b/images/emoji/1f385-1f3ff.png
deleted file mode 100644
index c92daf749..000000000
--- a/images/emoji/1f385-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f385.png b/images/emoji/1f385.png
deleted file mode 100644
index 8bf8757a3..000000000
--- a/images/emoji/1f385.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f386.png b/images/emoji/1f386.png
deleted file mode 100644
index e0a6c6a7c..000000000
--- a/images/emoji/1f386.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f387.png b/images/emoji/1f387.png
deleted file mode 100644
index 30339cd6e..000000000
--- a/images/emoji/1f387.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f388.png b/images/emoji/1f388.png
deleted file mode 100644
index 07916fe6d..000000000
--- a/images/emoji/1f388.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f389.png b/images/emoji/1f389.png
deleted file mode 100644
index 0244d60f2..000000000
--- a/images/emoji/1f389.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38a.png b/images/emoji/1f38a.png
deleted file mode 100644
index ba4fd9b12..000000000
--- a/images/emoji/1f38a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38b.png b/images/emoji/1f38b.png
deleted file mode 100644
index 46fcb3a1a..000000000
--- a/images/emoji/1f38b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38c.png b/images/emoji/1f38c.png
deleted file mode 100644
index 273bd0f0f..000000000
--- a/images/emoji/1f38c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38d.png b/images/emoji/1f38d.png
deleted file mode 100644
index 769f5ffae..000000000
--- a/images/emoji/1f38d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38e.png b/images/emoji/1f38e.png
deleted file mode 100644
index 109556151..000000000
--- a/images/emoji/1f38e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f38f.png b/images/emoji/1f38f.png
deleted file mode 100644
index 5443bab90..000000000
--- a/images/emoji/1f38f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f390.png b/images/emoji/1f390.png
deleted file mode 100644
index 3c9ef3a95..000000000
--- a/images/emoji/1f390.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f391.png b/images/emoji/1f391.png
deleted file mode 100644
index 9bdc9d8d7..000000000
--- a/images/emoji/1f391.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f392.png b/images/emoji/1f392.png
deleted file mode 100644
index 9997c86e7..000000000
--- a/images/emoji/1f392.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f393.png b/images/emoji/1f393.png
deleted file mode 100644
index 8b17ddd9d..000000000
--- a/images/emoji/1f393.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f396.png b/images/emoji/1f396.png
deleted file mode 100644
index ecd3fb035..000000000
--- a/images/emoji/1f396.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f397.png b/images/emoji/1f397.png
deleted file mode 100644
index 3988bbd09..000000000
--- a/images/emoji/1f397.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f399.png b/images/emoji/1f399.png
deleted file mode 100644
index cd9167654..000000000
--- a/images/emoji/1f399.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39a.png b/images/emoji/1f39a.png
deleted file mode 100644
index 720a3b341..000000000
--- a/images/emoji/1f39a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39b.png b/images/emoji/1f39b.png
deleted file mode 100644
index 6635ac93b..000000000
--- a/images/emoji/1f39b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39e.png b/images/emoji/1f39e.png
deleted file mode 100644
index 30143aedb..000000000
--- a/images/emoji/1f39e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f39f.png b/images/emoji/1f39f.png
deleted file mode 100644
index e510f4a7a..000000000
--- a/images/emoji/1f39f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a0.png b/images/emoji/1f3a0.png
deleted file mode 100644
index a17074edf..000000000
--- a/images/emoji/1f3a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a1.png b/images/emoji/1f3a1.png
deleted file mode 100644
index 55c8ff047..000000000
--- a/images/emoji/1f3a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a2.png b/images/emoji/1f3a2.png
deleted file mode 100644
index 7d187be0c..000000000
--- a/images/emoji/1f3a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a3.png b/images/emoji/1f3a3.png
deleted file mode 100644
index dfcdf07eb..000000000
--- a/images/emoji/1f3a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a4.png b/images/emoji/1f3a4.png
deleted file mode 100644
index d4e6b0def..000000000
--- a/images/emoji/1f3a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a5.png b/images/emoji/1f3a5.png
deleted file mode 100644
index 4e73b1301..000000000
--- a/images/emoji/1f3a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a6.png b/images/emoji/1f3a6.png
deleted file mode 100644
index 65f27b386..000000000
--- a/images/emoji/1f3a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a7.png b/images/emoji/1f3a7.png
deleted file mode 100644
index e9fd34041..000000000
--- a/images/emoji/1f3a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a8.png b/images/emoji/1f3a8.png
deleted file mode 100644
index bd6afe9ff..000000000
--- a/images/emoji/1f3a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3a9.png b/images/emoji/1f3a9.png
deleted file mode 100644
index 131b657b1..000000000
--- a/images/emoji/1f3a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3aa.png b/images/emoji/1f3aa.png
deleted file mode 100644
index b0379775b..000000000
--- a/images/emoji/1f3aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ab.png b/images/emoji/1f3ab.png
deleted file mode 100644
index 605936bb6..000000000
--- a/images/emoji/1f3ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ac.png b/images/emoji/1f3ac.png
deleted file mode 100644
index 813908831..000000000
--- a/images/emoji/1f3ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ad.png b/images/emoji/1f3ad.png
deleted file mode 100644
index 685441fda..000000000
--- a/images/emoji/1f3ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ae.png b/images/emoji/1f3ae.png
deleted file mode 100644
index 316a9106a..000000000
--- a/images/emoji/1f3ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3af.png b/images/emoji/1f3af.png
deleted file mode 100644
index f6704aeb8..000000000
--- a/images/emoji/1f3af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b0.png b/images/emoji/1f3b0.png
deleted file mode 100644
index ee71b6c26..000000000
--- a/images/emoji/1f3b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b1.png b/images/emoji/1f3b1.png
deleted file mode 100644
index 38ca662ed..000000000
--- a/images/emoji/1f3b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b2.png b/images/emoji/1f3b2.png
deleted file mode 100644
index ad3626fe5..000000000
--- a/images/emoji/1f3b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b3.png b/images/emoji/1f3b3.png
deleted file mode 100644
index 63add89e5..000000000
--- a/images/emoji/1f3b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b4.png b/images/emoji/1f3b4.png
deleted file mode 100644
index 6766b044d..000000000
--- a/images/emoji/1f3b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b5.png b/images/emoji/1f3b5.png
deleted file mode 100644
index 06691ef61..000000000
--- a/images/emoji/1f3b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b6.png b/images/emoji/1f3b6.png
deleted file mode 100644
index 57d499aa1..000000000
--- a/images/emoji/1f3b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b7.png b/images/emoji/1f3b7.png
deleted file mode 100644
index a392faec2..000000000
--- a/images/emoji/1f3b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b8.png b/images/emoji/1f3b8.png
deleted file mode 100644
index 43d752f1e..000000000
--- a/images/emoji/1f3b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3b9.png b/images/emoji/1f3b9.png
deleted file mode 100644
index 442b74568..000000000
--- a/images/emoji/1f3b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ba.png b/images/emoji/1f3ba.png
deleted file mode 100644
index 87674cf78..000000000
--- a/images/emoji/1f3ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bb.png b/images/emoji/1f3bb.png
deleted file mode 100644
index e1e76cce2..000000000
--- a/images/emoji/1f3bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bc.png b/images/emoji/1f3bc.png
deleted file mode 100644
index 47dc05a8e..000000000
--- a/images/emoji/1f3bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bd.png b/images/emoji/1f3bd.png
deleted file mode 100644
index 6d83c06b8..000000000
--- a/images/emoji/1f3bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3be.png b/images/emoji/1f3be.png
deleted file mode 100644
index 7e68ba8f3..000000000
--- a/images/emoji/1f3be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3bf.png b/images/emoji/1f3bf.png
deleted file mode 100644
index 4a2d2c123..000000000
--- a/images/emoji/1f3bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c0.png b/images/emoji/1f3c0.png
deleted file mode 100644
index 64c76b79c..000000000
--- a/images/emoji/1f3c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c1.png b/images/emoji/1f3c1.png
deleted file mode 100644
index 5a71eecb8..000000000
--- a/images/emoji/1f3c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c2.png b/images/emoji/1f3c2.png
deleted file mode 100644
index 6361c0f2c..000000000
--- a/images/emoji/1f3c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fb.png b/images/emoji/1f3c3-1f3fb.png
deleted file mode 100644
index 9355239a5..000000000
--- a/images/emoji/1f3c3-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fc.png b/images/emoji/1f3c3-1f3fc.png
deleted file mode 100644
index 6112fd5c3..000000000
--- a/images/emoji/1f3c3-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fd.png b/images/emoji/1f3c3-1f3fd.png
deleted file mode 100644
index 625ec708f..000000000
--- a/images/emoji/1f3c3-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3fe.png b/images/emoji/1f3c3-1f3fe.png
deleted file mode 100644
index 242f1b563..000000000
--- a/images/emoji/1f3c3-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3-1f3ff.png b/images/emoji/1f3c3-1f3ff.png
deleted file mode 100644
index 2976c6f01..000000000
--- a/images/emoji/1f3c3-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c3.png b/images/emoji/1f3c3.png
deleted file mode 100644
index e91491597..000000000
--- a/images/emoji/1f3c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fb.png b/images/emoji/1f3c4-1f3fb.png
deleted file mode 100644
index b5faaa524..000000000
--- a/images/emoji/1f3c4-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fc.png b/images/emoji/1f3c4-1f3fc.png
deleted file mode 100644
index 6d92e412f..000000000
--- a/images/emoji/1f3c4-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fd.png b/images/emoji/1f3c4-1f3fd.png
deleted file mode 100644
index f05ef5949..000000000
--- a/images/emoji/1f3c4-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3fe.png b/images/emoji/1f3c4-1f3fe.png
deleted file mode 100644
index 35e143d19..000000000
--- a/images/emoji/1f3c4-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4-1f3ff.png b/images/emoji/1f3c4-1f3ff.png
deleted file mode 100644
index 38917658e..000000000
--- a/images/emoji/1f3c4-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c4.png b/images/emoji/1f3c4.png
deleted file mode 100644
index 3ab017adf..000000000
--- a/images/emoji/1f3c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c5.png b/images/emoji/1f3c5.png
deleted file mode 100644
index 09718d001..000000000
--- a/images/emoji/1f3c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c6.png b/images/emoji/1f3c6.png
deleted file mode 100644
index ac2895c18..000000000
--- a/images/emoji/1f3c6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fb.png b/images/emoji/1f3c7-1f3fb.png
deleted file mode 100644
index e9bf4092e..000000000
--- a/images/emoji/1f3c7-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fc.png b/images/emoji/1f3c7-1f3fc.png
deleted file mode 100644
index 031bbc3d8..000000000
--- a/images/emoji/1f3c7-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fd.png b/images/emoji/1f3c7-1f3fd.png
deleted file mode 100644
index b40ef891f..000000000
--- a/images/emoji/1f3c7-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3fe.png b/images/emoji/1f3c7-1f3fe.png
deleted file mode 100644
index e286cb850..000000000
--- a/images/emoji/1f3c7-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7-1f3ff.png b/images/emoji/1f3c7-1f3ff.png
deleted file mode 100644
index 453c51c60..000000000
--- a/images/emoji/1f3c7-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c7.png b/images/emoji/1f3c7.png
deleted file mode 100644
index addf9edac..000000000
--- a/images/emoji/1f3c7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c8.png b/images/emoji/1f3c8.png
deleted file mode 100644
index 909ddf95d..000000000
--- a/images/emoji/1f3c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3c9.png b/images/emoji/1f3c9.png
deleted file mode 100644
index 659e134f7..000000000
--- a/images/emoji/1f3c9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fb.png b/images/emoji/1f3ca-1f3fb.png
deleted file mode 100644
index 38441c9ca..000000000
--- a/images/emoji/1f3ca-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fc.png b/images/emoji/1f3ca-1f3fc.png
deleted file mode 100644
index b0d431124..000000000
--- a/images/emoji/1f3ca-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fd.png b/images/emoji/1f3ca-1f3fd.png
deleted file mode 100644
index 211e77e2a..000000000
--- a/images/emoji/1f3ca-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3fe.png b/images/emoji/1f3ca-1f3fe.png
deleted file mode 100644
index f34c34db9..000000000
--- a/images/emoji/1f3ca-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca-1f3ff.png b/images/emoji/1f3ca-1f3ff.png
deleted file mode 100644
index 3e9231ff8..000000000
--- a/images/emoji/1f3ca-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ca.png b/images/emoji/1f3ca.png
deleted file mode 100644
index 55b4d72f9..000000000
--- a/images/emoji/1f3ca.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fb.png b/images/emoji/1f3cb-1f3fb.png
deleted file mode 100644
index febaad123..000000000
--- a/images/emoji/1f3cb-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fc.png b/images/emoji/1f3cb-1f3fc.png
deleted file mode 100644
index 27ae794a1..000000000
--- a/images/emoji/1f3cb-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fd.png b/images/emoji/1f3cb-1f3fd.png
deleted file mode 100644
index 45c4c22c7..000000000
--- a/images/emoji/1f3cb-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3fe.png b/images/emoji/1f3cb-1f3fe.png
deleted file mode 100644
index 67dd21d24..000000000
--- a/images/emoji/1f3cb-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb-1f3ff.png b/images/emoji/1f3cb-1f3ff.png
deleted file mode 100644
index fa0152038..000000000
--- a/images/emoji/1f3cb-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cb.png b/images/emoji/1f3cb.png
deleted file mode 100644
index afdeaa476..000000000
--- a/images/emoji/1f3cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cc.png b/images/emoji/1f3cc.png
deleted file mode 100644
index 39c552de8..000000000
--- a/images/emoji/1f3cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cd.png b/images/emoji/1f3cd.png
deleted file mode 100644
index 3d1d567e8..000000000
--- a/images/emoji/1f3cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ce.png b/images/emoji/1f3ce.png
deleted file mode 100644
index fe3f045f4..000000000
--- a/images/emoji/1f3ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3cf.png b/images/emoji/1f3cf.png
deleted file mode 100644
index d602294a2..000000000
--- a/images/emoji/1f3cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d0.png b/images/emoji/1f3d0.png
deleted file mode 100644
index ce89e6d74..000000000
--- a/images/emoji/1f3d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d1.png b/images/emoji/1f3d1.png
deleted file mode 100644
index 839637716..000000000
--- a/images/emoji/1f3d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d2.png b/images/emoji/1f3d2.png
deleted file mode 100644
index be94e9cbf..000000000
--- a/images/emoji/1f3d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d3.png b/images/emoji/1f3d3.png
deleted file mode 100644
index ff3c51727..000000000
--- a/images/emoji/1f3d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d4.png b/images/emoji/1f3d4.png
deleted file mode 100644
index f63a205dc..000000000
--- a/images/emoji/1f3d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d5.png b/images/emoji/1f3d5.png
deleted file mode 100644
index 7da5a756e..000000000
--- a/images/emoji/1f3d5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d6.png b/images/emoji/1f3d6.png
deleted file mode 100644
index 69108c8ea..000000000
--- a/images/emoji/1f3d6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d7.png b/images/emoji/1f3d7.png
deleted file mode 100644
index 8206a20f6..000000000
--- a/images/emoji/1f3d7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d8.png b/images/emoji/1f3d8.png
deleted file mode 100644
index 6ab4a2a26..000000000
--- a/images/emoji/1f3d8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3d9.png b/images/emoji/1f3d9.png
deleted file mode 100644
index d7b9844a0..000000000
--- a/images/emoji/1f3d9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3da.png b/images/emoji/1f3da.png
deleted file mode 100644
index c55e81de9..000000000
--- a/images/emoji/1f3da.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3db.png b/images/emoji/1f3db.png
deleted file mode 100644
index de7b559da..000000000
--- a/images/emoji/1f3db.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3dc.png b/images/emoji/1f3dc.png
deleted file mode 100644
index e9966ff8c..000000000
--- a/images/emoji/1f3dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3dd.png b/images/emoji/1f3dd.png
deleted file mode 100644
index 7fd834389..000000000
--- a/images/emoji/1f3dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3de.png b/images/emoji/1f3de.png
deleted file mode 100644
index 63ec70163..000000000
--- a/images/emoji/1f3de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3df.png b/images/emoji/1f3df.png
deleted file mode 100644
index 1fee9a34b..000000000
--- a/images/emoji/1f3df.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e0.png b/images/emoji/1f3e0.png
deleted file mode 100644
index 01c98a0ba..000000000
--- a/images/emoji/1f3e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e1.png b/images/emoji/1f3e1.png
deleted file mode 100644
index 1a276d153..000000000
--- a/images/emoji/1f3e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e2.png b/images/emoji/1f3e2.png
deleted file mode 100644
index 7eee927d1..000000000
--- a/images/emoji/1f3e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e3.png b/images/emoji/1f3e3.png
deleted file mode 100644
index a23848f9a..000000000
--- a/images/emoji/1f3e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e4.png b/images/emoji/1f3e4.png
deleted file mode 100644
index 3745aff8d..000000000
--- a/images/emoji/1f3e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e5.png b/images/emoji/1f3e5.png
deleted file mode 100644
index 1cbce4ae7..000000000
--- a/images/emoji/1f3e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e6.png b/images/emoji/1f3e6.png
deleted file mode 100644
index dffdcef36..000000000
--- a/images/emoji/1f3e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e7.png b/images/emoji/1f3e7.png
deleted file mode 100644
index 4d935307b..000000000
--- a/images/emoji/1f3e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e8.png b/images/emoji/1f3e8.png
deleted file mode 100644
index ea8f4c497..000000000
--- a/images/emoji/1f3e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3e9.png b/images/emoji/1f3e9.png
deleted file mode 100644
index 5e136be6f..000000000
--- a/images/emoji/1f3e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ea.png b/images/emoji/1f3ea.png
deleted file mode 100644
index 26b53b566..000000000
--- a/images/emoji/1f3ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3eb.png b/images/emoji/1f3eb.png
deleted file mode 100644
index 269759534..000000000
--- a/images/emoji/1f3eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ec.png b/images/emoji/1f3ec.png
deleted file mode 100644
index 58867c7a6..000000000
--- a/images/emoji/1f3ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ed.png b/images/emoji/1f3ed.png
deleted file mode 100644
index e1d2ddf4a..000000000
--- a/images/emoji/1f3ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ee.png b/images/emoji/1f3ee.png
deleted file mode 100644
index 97cf5dbe1..000000000
--- a/images/emoji/1f3ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3ef.png b/images/emoji/1f3ef.png
deleted file mode 100644
index 64b4e33a1..000000000
--- a/images/emoji/1f3ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f0.png b/images/emoji/1f3f0.png
deleted file mode 100644
index 888d11332..000000000
--- a/images/emoji/1f3f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f3.png b/images/emoji/1f3f3.png
deleted file mode 100644
index 86d6e96d5..000000000
--- a/images/emoji/1f3f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f4.png b/images/emoji/1f3f4.png
deleted file mode 100644
index 0e28d05d5..000000000
--- a/images/emoji/1f3f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f5.png b/images/emoji/1f3f5.png
deleted file mode 100644
index 8030e494b..000000000
--- a/images/emoji/1f3f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f7.png b/images/emoji/1f3f7.png
deleted file mode 100644
index d41c9b4f1..000000000
--- a/images/emoji/1f3f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f8.png b/images/emoji/1f3f8.png
deleted file mode 100644
index e0af4d99b..000000000
--- a/images/emoji/1f3f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3f9.png b/images/emoji/1f3f9.png
deleted file mode 100644
index 6a538bf47..000000000
--- a/images/emoji/1f3f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f3fa.png b/images/emoji/1f3fa.png
deleted file mode 100644
index 96de50560..000000000
--- a/images/emoji/1f3fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f400.png b/images/emoji/1f400.png
deleted file mode 100644
index 86219144f..000000000
--- a/images/emoji/1f400.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f401.png b/images/emoji/1f401.png
deleted file mode 100644
index 20fb041f0..000000000
--- a/images/emoji/1f401.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f402.png b/images/emoji/1f402.png
deleted file mode 100644
index badf5708f..000000000
--- a/images/emoji/1f402.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f403.png b/images/emoji/1f403.png
deleted file mode 100644
index 80446615c..000000000
--- a/images/emoji/1f403.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f404.png b/images/emoji/1f404.png
deleted file mode 100644
index 4d0ca534f..000000000
--- a/images/emoji/1f404.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f405.png b/images/emoji/1f405.png
deleted file mode 100644
index 871a8b74d..000000000
--- a/images/emoji/1f405.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f406.png b/images/emoji/1f406.png
deleted file mode 100644
index 8aac3d494..000000000
--- a/images/emoji/1f406.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f407.png b/images/emoji/1f407.png
deleted file mode 100644
index 2c8a29c64..000000000
--- a/images/emoji/1f407.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f408.png b/images/emoji/1f408.png
deleted file mode 100644
index 46abe8cbc..000000000
--- a/images/emoji/1f408.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f409.png b/images/emoji/1f409.png
deleted file mode 100644
index e298d2f6c..000000000
--- a/images/emoji/1f409.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40a.png b/images/emoji/1f40a.png
deleted file mode 100644
index 3005c46f1..000000000
--- a/images/emoji/1f40a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40b.png b/images/emoji/1f40b.png
deleted file mode 100644
index 0df9d3c73..000000000
--- a/images/emoji/1f40b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40c.png b/images/emoji/1f40c.png
deleted file mode 100644
index f4ea071e2..000000000
--- a/images/emoji/1f40c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40d.png b/images/emoji/1f40d.png
deleted file mode 100644
index f041d3b2e..000000000
--- a/images/emoji/1f40d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40e.png b/images/emoji/1f40e.png
deleted file mode 100644
index 0b4d8903c..000000000
--- a/images/emoji/1f40e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f40f.png b/images/emoji/1f40f.png
deleted file mode 100644
index 52a44464c..000000000
--- a/images/emoji/1f40f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f410.png b/images/emoji/1f410.png
deleted file mode 100644
index f9d9e38a1..000000000
--- a/images/emoji/1f410.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f411.png b/images/emoji/1f411.png
deleted file mode 100644
index eea1f2f8d..000000000
--- a/images/emoji/1f411.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f412.png b/images/emoji/1f412.png
deleted file mode 100644
index 65042c09f..000000000
--- a/images/emoji/1f412.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f413.png b/images/emoji/1f413.png
deleted file mode 100644
index bbf2bbff9..000000000
--- a/images/emoji/1f413.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f414.png b/images/emoji/1f414.png
deleted file mode 100644
index 9a6992e55..000000000
--- a/images/emoji/1f414.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f415.png b/images/emoji/1f415.png
deleted file mode 100644
index 976143dbd..000000000
--- a/images/emoji/1f415.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f416.png b/images/emoji/1f416.png
deleted file mode 100644
index 5f31c1a2d..000000000
--- a/images/emoji/1f416.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f417.png b/images/emoji/1f417.png
deleted file mode 100644
index 3073bf026..000000000
--- a/images/emoji/1f417.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f418.png b/images/emoji/1f418.png
deleted file mode 100644
index b8a6d1405..000000000
--- a/images/emoji/1f418.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f419.png b/images/emoji/1f419.png
deleted file mode 100644
index 72c84074a..000000000
--- a/images/emoji/1f419.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41a.png b/images/emoji/1f41a.png
deleted file mode 100644
index 55721629f..000000000
--- a/images/emoji/1f41a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41b.png b/images/emoji/1f41b.png
deleted file mode 100644
index c9a00cf3e..000000000
--- a/images/emoji/1f41b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41c.png b/images/emoji/1f41c.png
deleted file mode 100644
index 994127ed6..000000000
--- a/images/emoji/1f41c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41d.png b/images/emoji/1f41d.png
deleted file mode 100644
index 6bf6f67e1..000000000
--- a/images/emoji/1f41d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41e.png b/images/emoji/1f41e.png
deleted file mode 100644
index 3d93174d7..000000000
--- a/images/emoji/1f41e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f41f.png b/images/emoji/1f41f.png
deleted file mode 100644
index c2d2faaac..000000000
--- a/images/emoji/1f41f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f420.png b/images/emoji/1f420.png
deleted file mode 100644
index 252105235..000000000
--- a/images/emoji/1f420.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f421.png b/images/emoji/1f421.png
deleted file mode 100644
index 2939344a5..000000000
--- a/images/emoji/1f421.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f422.png b/images/emoji/1f422.png
deleted file mode 100644
index 46f59337b..000000000
--- a/images/emoji/1f422.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f423.png b/images/emoji/1f423.png
deleted file mode 100644
index 56515ad34..000000000
--- a/images/emoji/1f423.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f424.png b/images/emoji/1f424.png
deleted file mode 100644
index dccd96576..000000000
--- a/images/emoji/1f424.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f425.png b/images/emoji/1f425.png
deleted file mode 100644
index 31dfb511e..000000000
--- a/images/emoji/1f425.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f426.png b/images/emoji/1f426.png
deleted file mode 100644
index e201c22be..000000000
--- a/images/emoji/1f426.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f427.png b/images/emoji/1f427.png
deleted file mode 100644
index c0064fb97..000000000
--- a/images/emoji/1f427.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f428.png b/images/emoji/1f428.png
deleted file mode 100644
index c846cd223..000000000
--- a/images/emoji/1f428.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f429.png b/images/emoji/1f429.png
deleted file mode 100644
index 8ec39e396..000000000
--- a/images/emoji/1f429.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42a.png b/images/emoji/1f42a.png
deleted file mode 100644
index 5271637c7..000000000
--- a/images/emoji/1f42a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42b.png b/images/emoji/1f42b.png
deleted file mode 100644
index b421d07a8..000000000
--- a/images/emoji/1f42b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42c.png b/images/emoji/1f42c.png
deleted file mode 100644
index c2a914f59..000000000
--- a/images/emoji/1f42c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42d.png b/images/emoji/1f42d.png
deleted file mode 100644
index a52c8414f..000000000
--- a/images/emoji/1f42d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42e.png b/images/emoji/1f42e.png
deleted file mode 100644
index 602495bd9..000000000
--- a/images/emoji/1f42e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f42f.png b/images/emoji/1f42f.png
deleted file mode 100644
index a4d3ef086..000000000
--- a/images/emoji/1f42f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f430.png b/images/emoji/1f430.png
deleted file mode 100644
index 20c67d11b..000000000
--- a/images/emoji/1f430.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f431.png b/images/emoji/1f431.png
deleted file mode 100644
index 10e20b530..000000000
--- a/images/emoji/1f431.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f432.png b/images/emoji/1f432.png
deleted file mode 100644
index 3c2720446..000000000
--- a/images/emoji/1f432.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f433.png b/images/emoji/1f433.png
deleted file mode 100644
index c2f52b443..000000000
--- a/images/emoji/1f433.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f434.png b/images/emoji/1f434.png
deleted file mode 100644
index f4f45047c..000000000
--- a/images/emoji/1f434.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f435.png b/images/emoji/1f435.png
deleted file mode 100644
index fe49a5467..000000000
--- a/images/emoji/1f435.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f436.png b/images/emoji/1f436.png
deleted file mode 100644
index 4a5b7b859..000000000
--- a/images/emoji/1f436.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f437.png b/images/emoji/1f437.png
deleted file mode 100644
index afe05ca16..000000000
--- a/images/emoji/1f437.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f438.png b/images/emoji/1f438.png
deleted file mode 100644
index 8825d1ad5..000000000
--- a/images/emoji/1f438.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f439.png b/images/emoji/1f439.png
deleted file mode 100644
index 376c36b0a..000000000
--- a/images/emoji/1f439.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43a.png b/images/emoji/1f43a.png
deleted file mode 100644
index ba7220f2d..000000000
--- a/images/emoji/1f43a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43b.png b/images/emoji/1f43b.png
deleted file mode 100644
index 272d56bbb..000000000
--- a/images/emoji/1f43b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43c.png b/images/emoji/1f43c.png
deleted file mode 100644
index 978382775..000000000
--- a/images/emoji/1f43c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43d.png b/images/emoji/1f43d.png
deleted file mode 100644
index 3610ae4a9..000000000
--- a/images/emoji/1f43d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43e.png b/images/emoji/1f43e.png
deleted file mode 100644
index 5fe568cee..000000000
--- a/images/emoji/1f43e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f43f.png b/images/emoji/1f43f.png
deleted file mode 100644
index a9ab60f51..000000000
--- a/images/emoji/1f43f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f440.png b/images/emoji/1f440.png
deleted file mode 100644
index 2102ada7e..000000000
--- a/images/emoji/1f440.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f441-1f5e8.png b/images/emoji/1f441-1f5e8.png
deleted file mode 100644
index 21bd22bbc..000000000
--- a/images/emoji/1f441-1f5e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f441.png b/images/emoji/1f441.png
deleted file mode 100644
index 9d989cdd3..000000000
--- a/images/emoji/1f441.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fb.png b/images/emoji/1f442-1f3fb.png
deleted file mode 100644
index d09e1e419..000000000
--- a/images/emoji/1f442-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fc.png b/images/emoji/1f442-1f3fc.png
deleted file mode 100644
index 300d60a99..000000000
--- a/images/emoji/1f442-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fd.png b/images/emoji/1f442-1f3fd.png
deleted file mode 100644
index 2a56eebe4..000000000
--- a/images/emoji/1f442-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3fe.png b/images/emoji/1f442-1f3fe.png
deleted file mode 100644
index bd270f776..000000000
--- a/images/emoji/1f442-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442-1f3ff.png b/images/emoji/1f442-1f3ff.png
deleted file mode 100644
index b96bb441d..000000000
--- a/images/emoji/1f442-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f442.png b/images/emoji/1f442.png
deleted file mode 100644
index f84f9ff15..000000000
--- a/images/emoji/1f442.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fb.png b/images/emoji/1f443-1f3fb.png
deleted file mode 100644
index 8008d1750..000000000
--- a/images/emoji/1f443-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fc.png b/images/emoji/1f443-1f3fc.png
deleted file mode 100644
index ac17f26e8..000000000
--- a/images/emoji/1f443-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fd.png b/images/emoji/1f443-1f3fd.png
deleted file mode 100644
index d8b6cbe0f..000000000
--- a/images/emoji/1f443-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3fe.png b/images/emoji/1f443-1f3fe.png
deleted file mode 100644
index 004b2631e..000000000
--- a/images/emoji/1f443-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443-1f3ff.png b/images/emoji/1f443-1f3ff.png
deleted file mode 100644
index 7b33821f6..000000000
--- a/images/emoji/1f443-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f443.png b/images/emoji/1f443.png
deleted file mode 100644
index 2f04ac5f9..000000000
--- a/images/emoji/1f443.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f444.png b/images/emoji/1f444.png
deleted file mode 100644
index 35f3cc200..000000000
--- a/images/emoji/1f444.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f445.png b/images/emoji/1f445.png
deleted file mode 100644
index 70ce9c122..000000000
--- a/images/emoji/1f445.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fb.png b/images/emoji/1f446-1f3fb.png
deleted file mode 100644
index a12a7e784..000000000
--- a/images/emoji/1f446-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fc.png b/images/emoji/1f446-1f3fc.png
deleted file mode 100644
index cdff40cea..000000000
--- a/images/emoji/1f446-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fd.png b/images/emoji/1f446-1f3fd.png
deleted file mode 100644
index a07ce9e5a..000000000
--- a/images/emoji/1f446-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3fe.png b/images/emoji/1f446-1f3fe.png
deleted file mode 100644
index 4f86c88ba..000000000
--- a/images/emoji/1f446-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446-1f3ff.png b/images/emoji/1f446-1f3ff.png
deleted file mode 100644
index ed1b26c35..000000000
--- a/images/emoji/1f446-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f446.png b/images/emoji/1f446.png
deleted file mode 100644
index bc496dfea..000000000
--- a/images/emoji/1f446.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fb.png b/images/emoji/1f447-1f3fb.png
deleted file mode 100644
index 140f157d8..000000000
--- a/images/emoji/1f447-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fc.png b/images/emoji/1f447-1f3fc.png
deleted file mode 100644
index d518544f7..000000000
--- a/images/emoji/1f447-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fd.png b/images/emoji/1f447-1f3fd.png
deleted file mode 100644
index 018b688b8..000000000
--- a/images/emoji/1f447-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3fe.png b/images/emoji/1f447-1f3fe.png
deleted file mode 100644
index 98845bf6f..000000000
--- a/images/emoji/1f447-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447-1f3ff.png b/images/emoji/1f447-1f3ff.png
deleted file mode 100644
index 9a9b039a9..000000000
--- a/images/emoji/1f447-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f447.png b/images/emoji/1f447.png
deleted file mode 100644
index 00d3d13ab..000000000
--- a/images/emoji/1f447.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fb.png b/images/emoji/1f448-1f3fb.png
deleted file mode 100644
index 88e2c3060..000000000
--- a/images/emoji/1f448-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fc.png b/images/emoji/1f448-1f3fc.png
deleted file mode 100644
index d3c89d87c..000000000
--- a/images/emoji/1f448-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fd.png b/images/emoji/1f448-1f3fd.png
deleted file mode 100644
index b23b91673..000000000
--- a/images/emoji/1f448-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3fe.png b/images/emoji/1f448-1f3fe.png
deleted file mode 100644
index 3093f325c..000000000
--- a/images/emoji/1f448-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448-1f3ff.png b/images/emoji/1f448-1f3ff.png
deleted file mode 100644
index 2b4cbfa12..000000000
--- a/images/emoji/1f448-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f448.png b/images/emoji/1f448.png
deleted file mode 100644
index 599fa2e3c..000000000
--- a/images/emoji/1f448.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fb.png b/images/emoji/1f449-1f3fb.png
deleted file mode 100644
index 4a28c6bbc..000000000
--- a/images/emoji/1f449-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fc.png b/images/emoji/1f449-1f3fc.png
deleted file mode 100644
index 7cb132317..000000000
--- a/images/emoji/1f449-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fd.png b/images/emoji/1f449-1f3fd.png
deleted file mode 100644
index 5514807d7..000000000
--- a/images/emoji/1f449-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3fe.png b/images/emoji/1f449-1f3fe.png
deleted file mode 100644
index b8541d644..000000000
--- a/images/emoji/1f449-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449-1f3ff.png b/images/emoji/1f449-1f3ff.png
deleted file mode 100644
index 1b7aab07b..000000000
--- a/images/emoji/1f449-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f449.png b/images/emoji/1f449.png
deleted file mode 100644
index 93a3cd34a..000000000
--- a/images/emoji/1f449.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fb.png b/images/emoji/1f44a-1f3fb.png
deleted file mode 100644
index 93c7d17fb..000000000
--- a/images/emoji/1f44a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fc.png b/images/emoji/1f44a-1f3fc.png
deleted file mode 100644
index c0a1af6e1..000000000
--- a/images/emoji/1f44a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fd.png b/images/emoji/1f44a-1f3fd.png
deleted file mode 100644
index 1458b0212..000000000
--- a/images/emoji/1f44a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3fe.png b/images/emoji/1f44a-1f3fe.png
deleted file mode 100644
index c1466bfcd..000000000
--- a/images/emoji/1f44a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a-1f3ff.png b/images/emoji/1f44a-1f3ff.png
deleted file mode 100644
index 00b4ddb89..000000000
--- a/images/emoji/1f44a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44a.png b/images/emoji/1f44a.png
deleted file mode 100644
index b14ca5f52..000000000
--- a/images/emoji/1f44a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fb.png b/images/emoji/1f44b-1f3fb.png
deleted file mode 100644
index beea09dda..000000000
--- a/images/emoji/1f44b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fc.png b/images/emoji/1f44b-1f3fc.png
deleted file mode 100644
index a7679d5fe..000000000
--- a/images/emoji/1f44b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fd.png b/images/emoji/1f44b-1f3fd.png
deleted file mode 100644
index 6283b670f..000000000
--- a/images/emoji/1f44b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3fe.png b/images/emoji/1f44b-1f3fe.png
deleted file mode 100644
index b771b52c3..000000000
--- a/images/emoji/1f44b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b-1f3ff.png b/images/emoji/1f44b-1f3ff.png
deleted file mode 100644
index 6bbedc9b5..000000000
--- a/images/emoji/1f44b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44b.png b/images/emoji/1f44b.png
deleted file mode 100644
index 02ae68b85..000000000
--- a/images/emoji/1f44b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fb.png b/images/emoji/1f44c-1f3fb.png
deleted file mode 100644
index cecf7b2ab..000000000
--- a/images/emoji/1f44c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fc.png b/images/emoji/1f44c-1f3fc.png
deleted file mode 100644
index c19239bcd..000000000
--- a/images/emoji/1f44c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fd.png b/images/emoji/1f44c-1f3fd.png
deleted file mode 100644
index 94b65b03e..000000000
--- a/images/emoji/1f44c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3fe.png b/images/emoji/1f44c-1f3fe.png
deleted file mode 100644
index 03d26f08e..000000000
--- a/images/emoji/1f44c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c-1f3ff.png b/images/emoji/1f44c-1f3ff.png
deleted file mode 100644
index d4b240863..000000000
--- a/images/emoji/1f44c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44c.png b/images/emoji/1f44c.png
deleted file mode 100644
index 028d69b0d..000000000
--- a/images/emoji/1f44c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fb.png b/images/emoji/1f44d-1f3fb.png
deleted file mode 100644
index 39684cd5c..000000000
--- a/images/emoji/1f44d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fc.png b/images/emoji/1f44d-1f3fc.png
deleted file mode 100644
index a9b597235..000000000
--- a/images/emoji/1f44d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fd.png b/images/emoji/1f44d-1f3fd.png
deleted file mode 100644
index c5e291670..000000000
--- a/images/emoji/1f44d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3fe.png b/images/emoji/1f44d-1f3fe.png
deleted file mode 100644
index 5bf4857a8..000000000
--- a/images/emoji/1f44d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d-1f3ff.png b/images/emoji/1f44d-1f3ff.png
deleted file mode 100644
index d829f787c..000000000
--- a/images/emoji/1f44d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44d.png b/images/emoji/1f44d.png
deleted file mode 100644
index f9e6f13a3..000000000
--- a/images/emoji/1f44d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fb.png b/images/emoji/1f44e-1f3fb.png
deleted file mode 100644
index a1631af8e..000000000
--- a/images/emoji/1f44e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fc.png b/images/emoji/1f44e-1f3fc.png
deleted file mode 100644
index 85fff82d5..000000000
--- a/images/emoji/1f44e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fd.png b/images/emoji/1f44e-1f3fd.png
deleted file mode 100644
index eeba3be80..000000000
--- a/images/emoji/1f44e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3fe.png b/images/emoji/1f44e-1f3fe.png
deleted file mode 100644
index 1addafdae..000000000
--- a/images/emoji/1f44e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e-1f3ff.png b/images/emoji/1f44e-1f3ff.png
deleted file mode 100644
index 37ec07b57..000000000
--- a/images/emoji/1f44e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44e.png b/images/emoji/1f44e.png
deleted file mode 100644
index b63da2f20..000000000
--- a/images/emoji/1f44e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fb.png b/images/emoji/1f44f-1f3fb.png
deleted file mode 100644
index 770aa9ca0..000000000
--- a/images/emoji/1f44f-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fc.png b/images/emoji/1f44f-1f3fc.png
deleted file mode 100644
index 37c6b559a..000000000
--- a/images/emoji/1f44f-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fd.png b/images/emoji/1f44f-1f3fd.png
deleted file mode 100644
index e95bf2fc7..000000000
--- a/images/emoji/1f44f-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3fe.png b/images/emoji/1f44f-1f3fe.png
deleted file mode 100644
index b6e9a9160..000000000
--- a/images/emoji/1f44f-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f44f-1f3ff.png b/images/emoji/1f44f-1f3ff.png
deleted file mode 100644
index 59cccdb73..000000000
--- a/images/emoji/1f44f-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fb.png b/images/emoji/1f450-1f3fb.png
deleted file mode 100644
index 352d2614f..000000000
--- a/images/emoji/1f450-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fc.png b/images/emoji/1f450-1f3fc.png
deleted file mode 100644
index 70824a50c..000000000
--- a/images/emoji/1f450-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fd.png b/images/emoji/1f450-1f3fd.png
deleted file mode 100644
index d7d136bd3..000000000
--- a/images/emoji/1f450-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3fe.png b/images/emoji/1f450-1f3fe.png
deleted file mode 100644
index df4eaa711..000000000
--- a/images/emoji/1f450-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450-1f3ff.png b/images/emoji/1f450-1f3ff.png
deleted file mode 100644
index 7dc04eaeb..000000000
--- a/images/emoji/1f450-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f450.png b/images/emoji/1f450.png
deleted file mode 100644
index 1cf75c910..000000000
--- a/images/emoji/1f450.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f451.png b/images/emoji/1f451.png
deleted file mode 100644
index 93b82d92f..000000000
--- a/images/emoji/1f451.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f452.png b/images/emoji/1f452.png
deleted file mode 100644
index b837b6a2e..000000000
--- a/images/emoji/1f452.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f453.png b/images/emoji/1f453.png
deleted file mode 100644
index 865d8274a..000000000
--- a/images/emoji/1f453.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f454.png b/images/emoji/1f454.png
deleted file mode 100644
index 1804e7f3f..000000000
--- a/images/emoji/1f454.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f455.png b/images/emoji/1f455.png
deleted file mode 100644
index af08dec8b..000000000
--- a/images/emoji/1f455.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f456.png b/images/emoji/1f456.png
deleted file mode 100644
index 2a6869d67..000000000
--- a/images/emoji/1f456.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f457.png b/images/emoji/1f457.png
deleted file mode 100644
index a697ca5c5..000000000
--- a/images/emoji/1f457.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f458.png b/images/emoji/1f458.png
deleted file mode 100644
index 297a42c7e..000000000
--- a/images/emoji/1f458.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f459.png b/images/emoji/1f459.png
deleted file mode 100644
index 77a8a0aae..000000000
--- a/images/emoji/1f459.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45a.png b/images/emoji/1f45a.png
deleted file mode 100644
index 01410dc81..000000000
--- a/images/emoji/1f45a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45b.png b/images/emoji/1f45b.png
deleted file mode 100644
index 981346193..000000000
--- a/images/emoji/1f45b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45c.png b/images/emoji/1f45c.png
deleted file mode 100644
index cbf75c5d2..000000000
--- a/images/emoji/1f45c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45d.png b/images/emoji/1f45d.png
deleted file mode 100644
index 8795c6c66..000000000
--- a/images/emoji/1f45d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45e.png b/images/emoji/1f45e.png
deleted file mode 100644
index 16ccafb93..000000000
--- a/images/emoji/1f45e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f45f.png b/images/emoji/1f45f.png
deleted file mode 100644
index 423fa07dd..000000000
--- a/images/emoji/1f45f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f460.png b/images/emoji/1f460.png
deleted file mode 100644
index b331cbccc..000000000
--- a/images/emoji/1f460.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f461.png b/images/emoji/1f461.png
deleted file mode 100644
index 9d9f5122b..000000000
--- a/images/emoji/1f461.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f462.png b/images/emoji/1f462.png
deleted file mode 100644
index 11f1065ed..000000000
--- a/images/emoji/1f462.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f463.png b/images/emoji/1f463.png
deleted file mode 100644
index b2673c5a1..000000000
--- a/images/emoji/1f463.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f464.png b/images/emoji/1f464.png
deleted file mode 100644
index 123b2cbe1..000000000
--- a/images/emoji/1f464.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f465.png b/images/emoji/1f465.png
deleted file mode 100644
index d7656860a..000000000
--- a/images/emoji/1f465.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fb.png b/images/emoji/1f466-1f3fb.png
deleted file mode 100644
index 2fc436ea5..000000000
--- a/images/emoji/1f466-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fc.png b/images/emoji/1f466-1f3fc.png
deleted file mode 100644
index 09a5f18d3..000000000
--- a/images/emoji/1f466-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fd.png b/images/emoji/1f466-1f3fd.png
deleted file mode 100644
index 3cfe675dd..000000000
--- a/images/emoji/1f466-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3fe.png b/images/emoji/1f466-1f3fe.png
deleted file mode 100644
index 780be0ace..000000000
--- a/images/emoji/1f466-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466-1f3ff.png b/images/emoji/1f466-1f3ff.png
deleted file mode 100644
index f32fe22e3..000000000
--- a/images/emoji/1f466-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f466.png b/images/emoji/1f466.png
deleted file mode 100644
index 8ecfb0a4e..000000000
--- a/images/emoji/1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fb.png b/images/emoji/1f467-1f3fb.png
deleted file mode 100644
index 2be1f0bee..000000000
--- a/images/emoji/1f467-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fc.png b/images/emoji/1f467-1f3fc.png
deleted file mode 100644
index a59ed4a3f..000000000
--- a/images/emoji/1f467-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fd.png b/images/emoji/1f467-1f3fd.png
deleted file mode 100644
index 517e7f2a7..000000000
--- a/images/emoji/1f467-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3fe.png b/images/emoji/1f467-1f3fe.png
deleted file mode 100644
index 542d96c84..000000000
--- a/images/emoji/1f467-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467-1f3ff.png b/images/emoji/1f467-1f3ff.png
deleted file mode 100644
index 66b7c28c2..000000000
--- a/images/emoji/1f467-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f467.png b/images/emoji/1f467.png
deleted file mode 100644
index 649eea6a5..000000000
--- a/images/emoji/1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fb.png b/images/emoji/1f468-1f3fb.png
deleted file mode 100644
index bb86e963a..000000000
--- a/images/emoji/1f468-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fc.png b/images/emoji/1f468-1f3fc.png
deleted file mode 100644
index fdeeaff46..000000000
--- a/images/emoji/1f468-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fd.png b/images/emoji/1f468-1f3fd.png
deleted file mode 100644
index 7ae0b5df9..000000000
--- a/images/emoji/1f468-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3fe.png b/images/emoji/1f468-1f3fe.png
deleted file mode 100644
index db14cde99..000000000
--- a/images/emoji/1f468-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f3ff.png b/images/emoji/1f468-1f3ff.png
deleted file mode 100644
index 7c67a7052..000000000
--- a/images/emoji/1f468-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f466-1f466.png b/images/emoji/1f468-1f468-1f466-1f466.png
deleted file mode 100644
index 0944001a3..000000000
--- a/images/emoji/1f468-1f468-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f466.png b/images/emoji/1f468-1f468-1f466.png
deleted file mode 100644
index 7a2e4e2c4..000000000
--- a/images/emoji/1f468-1f468-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467-1f466.png b/images/emoji/1f468-1f468-1f467-1f466.png
deleted file mode 100644
index 41e351666..000000000
--- a/images/emoji/1f468-1f468-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467-1f467.png b/images/emoji/1f468-1f468-1f467-1f467.png
deleted file mode 100644
index 8e8ccfe6c..000000000
--- a/images/emoji/1f468-1f468-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f468-1f467.png b/images/emoji/1f468-1f468-1f467.png
deleted file mode 100644
index 9bca550d0..000000000
--- a/images/emoji/1f468-1f468-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f466-1f466.png b/images/emoji/1f468-1f469-1f466-1f466.png
deleted file mode 100644
index 579eb59f8..000000000
--- a/images/emoji/1f468-1f469-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467-1f466.png b/images/emoji/1f468-1f469-1f467-1f466.png
deleted file mode 100644
index c5c7b0942..000000000
--- a/images/emoji/1f468-1f469-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467-1f467.png b/images/emoji/1f468-1f469-1f467-1f467.png
deleted file mode 100644
index b47f3b1c7..000000000
--- a/images/emoji/1f468-1f469-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-1f469-1f467.png b/images/emoji/1f468-1f469-1f467.png
deleted file mode 100644
index ffa6f4293..000000000
--- a/images/emoji/1f468-1f469-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-2764-1f468.png b/images/emoji/1f468-2764-1f468.png
deleted file mode 100644
index 8759fa5db..000000000
--- a/images/emoji/1f468-2764-1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468-2764-1f48b-1f468.png b/images/emoji/1f468-2764-1f48b-1f468.png
deleted file mode 100644
index a9a0edae1..000000000
--- a/images/emoji/1f468-2764-1f48b-1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f468.png b/images/emoji/1f468.png
deleted file mode 100644
index 857a02e51..000000000
--- a/images/emoji/1f468.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fb.png b/images/emoji/1f469-1f3fb.png
deleted file mode 100644
index ff089b888..000000000
--- a/images/emoji/1f469-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fc.png b/images/emoji/1f469-1f3fc.png
deleted file mode 100644
index 0719c3780..000000000
--- a/images/emoji/1f469-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fd.png b/images/emoji/1f469-1f3fd.png
deleted file mode 100644
index b4d7f21f4..000000000
--- a/images/emoji/1f469-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3fe.png b/images/emoji/1f469-1f3fe.png
deleted file mode 100644
index 6f21d631f..000000000
--- a/images/emoji/1f469-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f3ff.png b/images/emoji/1f469-1f3ff.png
deleted file mode 100644
index cd47bfdd6..000000000
--- a/images/emoji/1f469-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f466-1f466.png b/images/emoji/1f469-1f469-1f466-1f466.png
deleted file mode 100644
index e3fc2686e..000000000
--- a/images/emoji/1f469-1f469-1f466-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f466.png b/images/emoji/1f469-1f469-1f466.png
deleted file mode 100644
index 836feae7c..000000000
--- a/images/emoji/1f469-1f469-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467-1f466.png b/images/emoji/1f469-1f469-1f467-1f466.png
deleted file mode 100644
index 284d29ab5..000000000
--- a/images/emoji/1f469-1f469-1f467-1f466.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467-1f467.png b/images/emoji/1f469-1f469-1f467-1f467.png
deleted file mode 100644
index d8d3f49b8..000000000
--- a/images/emoji/1f469-1f469-1f467-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-1f469-1f467.png b/images/emoji/1f469-1f469-1f467.png
deleted file mode 100644
index d8619fa1f..000000000
--- a/images/emoji/1f469-1f469-1f467.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-2764-1f469.png b/images/emoji/1f469-2764-1f469.png
deleted file mode 100644
index 08fdabcdc..000000000
--- a/images/emoji/1f469-2764-1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469-2764-1f48b-1f469.png b/images/emoji/1f469-2764-1f48b-1f469.png
deleted file mode 100644
index 4905a5b3e..000000000
--- a/images/emoji/1f469-2764-1f48b-1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f469.png b/images/emoji/1f469.png
deleted file mode 100644
index ece440e7a..000000000
--- a/images/emoji/1f469.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46a.png b/images/emoji/1f46a.png
deleted file mode 100644
index 0350719a2..000000000
--- a/images/emoji/1f46a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46b.png b/images/emoji/1f46b.png
deleted file mode 100644
index 73f22f0ad..000000000
--- a/images/emoji/1f46b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46c.png b/images/emoji/1f46c.png
deleted file mode 100644
index a511fda82..000000000
--- a/images/emoji/1f46c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46d.png b/images/emoji/1f46d.png
deleted file mode 100644
index 8623da423..000000000
--- a/images/emoji/1f46d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fb.png b/images/emoji/1f46e-1f3fb.png
deleted file mode 100644
index 6ccba3879..000000000
--- a/images/emoji/1f46e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fc.png b/images/emoji/1f46e-1f3fc.png
deleted file mode 100644
index 7814ea9f5..000000000
--- a/images/emoji/1f46e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fd.png b/images/emoji/1f46e-1f3fd.png
deleted file mode 100644
index c29f0709b..000000000
--- a/images/emoji/1f46e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3fe.png b/images/emoji/1f46e-1f3fe.png
deleted file mode 100644
index 8a009e55e..000000000
--- a/images/emoji/1f46e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e-1f3ff.png b/images/emoji/1f46e-1f3ff.png
deleted file mode 100644
index 5bdc53c99..000000000
--- a/images/emoji/1f46e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46e.png b/images/emoji/1f46e.png
deleted file mode 100644
index bd37a787e..000000000
--- a/images/emoji/1f46e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f46f.png b/images/emoji/1f46f.png
deleted file mode 100644
index 7a33d199b..000000000
--- a/images/emoji/1f46f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fb.png b/images/emoji/1f470-1f3fb.png
deleted file mode 100644
index c4fb141ae..000000000
--- a/images/emoji/1f470-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fc.png b/images/emoji/1f470-1f3fc.png
deleted file mode 100644
index c248769fc..000000000
--- a/images/emoji/1f470-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fd.png b/images/emoji/1f470-1f3fd.png
deleted file mode 100644
index 962c0a6ee..000000000
--- a/images/emoji/1f470-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3fe.png b/images/emoji/1f470-1f3fe.png
deleted file mode 100644
index 740ca208c..000000000
--- a/images/emoji/1f470-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470-1f3ff.png b/images/emoji/1f470-1f3ff.png
deleted file mode 100644
index 5cc559858..000000000
--- a/images/emoji/1f470-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f470.png b/images/emoji/1f470.png
deleted file mode 100644
index eaf4bd978..000000000
--- a/images/emoji/1f470.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fb.png b/images/emoji/1f471-1f3fb.png
deleted file mode 100644
index 7d18ef244..000000000
--- a/images/emoji/1f471-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fc.png b/images/emoji/1f471-1f3fc.png
deleted file mode 100644
index dae130731..000000000
--- a/images/emoji/1f471-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fd.png b/images/emoji/1f471-1f3fd.png
deleted file mode 100644
index 684677e8e..000000000
--- a/images/emoji/1f471-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3fe.png b/images/emoji/1f471-1f3fe.png
deleted file mode 100644
index 012be0b51..000000000
--- a/images/emoji/1f471-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471-1f3ff.png b/images/emoji/1f471-1f3ff.png
deleted file mode 100644
index d4ecc4cf4..000000000
--- a/images/emoji/1f471-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f471.png b/images/emoji/1f471.png
deleted file mode 100644
index ad6f01a7d..000000000
--- a/images/emoji/1f471.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fb.png b/images/emoji/1f472-1f3fb.png
deleted file mode 100644
index 5b7b3def1..000000000
--- a/images/emoji/1f472-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fc.png b/images/emoji/1f472-1f3fc.png
deleted file mode 100644
index c8b9cf87f..000000000
--- a/images/emoji/1f472-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fd.png b/images/emoji/1f472-1f3fd.png
deleted file mode 100644
index effdd0c4c..000000000
--- a/images/emoji/1f472-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3fe.png b/images/emoji/1f472-1f3fe.png
deleted file mode 100644
index f885ff46f..000000000
--- a/images/emoji/1f472-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472-1f3ff.png b/images/emoji/1f472-1f3ff.png
deleted file mode 100644
index a6d55ca13..000000000
--- a/images/emoji/1f472-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f472.png b/images/emoji/1f472.png
deleted file mode 100644
index 7841e1360..000000000
--- a/images/emoji/1f472.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fb.png b/images/emoji/1f473-1f3fb.png
deleted file mode 100644
index 1e12ee4b2..000000000
--- a/images/emoji/1f473-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fc.png b/images/emoji/1f473-1f3fc.png
deleted file mode 100644
index 7fe9f01c6..000000000
--- a/images/emoji/1f473-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fd.png b/images/emoji/1f473-1f3fd.png
deleted file mode 100644
index f607afd34..000000000
--- a/images/emoji/1f473-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3fe.png b/images/emoji/1f473-1f3fe.png
deleted file mode 100644
index c05695888..000000000
--- a/images/emoji/1f473-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473-1f3ff.png b/images/emoji/1f473-1f3ff.png
deleted file mode 100644
index df935551c..000000000
--- a/images/emoji/1f473-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f473.png b/images/emoji/1f473.png
deleted file mode 100644
index 993fd952c..000000000
--- a/images/emoji/1f473.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fb.png b/images/emoji/1f474-1f3fb.png
deleted file mode 100644
index cd7d20789..000000000
--- a/images/emoji/1f474-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fc.png b/images/emoji/1f474-1f3fc.png
deleted file mode 100644
index 3574be8d4..000000000
--- a/images/emoji/1f474-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fd.png b/images/emoji/1f474-1f3fd.png
deleted file mode 100644
index bbd95afe0..000000000
--- a/images/emoji/1f474-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3fe.png b/images/emoji/1f474-1f3fe.png
deleted file mode 100644
index b350a764b..000000000
--- a/images/emoji/1f474-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474-1f3ff.png b/images/emoji/1f474-1f3ff.png
deleted file mode 100644
index 05fe24a17..000000000
--- a/images/emoji/1f474-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f474.png b/images/emoji/1f474.png
deleted file mode 100644
index 5f214571b..000000000
--- a/images/emoji/1f474.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fb.png b/images/emoji/1f475-1f3fb.png
deleted file mode 100644
index b49e82140..000000000
--- a/images/emoji/1f475-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fc.png b/images/emoji/1f475-1f3fc.png
deleted file mode 100644
index e86bf5ab3..000000000
--- a/images/emoji/1f475-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fd.png b/images/emoji/1f475-1f3fd.png
deleted file mode 100644
index 83fc14b08..000000000
--- a/images/emoji/1f475-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3fe.png b/images/emoji/1f475-1f3fe.png
deleted file mode 100644
index ebbf7930f..000000000
--- a/images/emoji/1f475-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475-1f3ff.png b/images/emoji/1f475-1f3ff.png
deleted file mode 100644
index 4009012bb..000000000
--- a/images/emoji/1f475-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f475.png b/images/emoji/1f475.png
deleted file mode 100644
index 52dc49871..000000000
--- a/images/emoji/1f475.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fb.png b/images/emoji/1f476-1f3fb.png
deleted file mode 100644
index 8c1cada59..000000000
--- a/images/emoji/1f476-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fc.png b/images/emoji/1f476-1f3fc.png
deleted file mode 100644
index 4ba95bd75..000000000
--- a/images/emoji/1f476-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fd.png b/images/emoji/1f476-1f3fd.png
deleted file mode 100644
index f4734c0dc..000000000
--- a/images/emoji/1f476-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3fe.png b/images/emoji/1f476-1f3fe.png
deleted file mode 100644
index 02d864833..000000000
--- a/images/emoji/1f476-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476-1f3ff.png b/images/emoji/1f476-1f3ff.png
deleted file mode 100644
index 0653e1603..000000000
--- a/images/emoji/1f476-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f476.png b/images/emoji/1f476.png
deleted file mode 100644
index 7b28ba891..000000000
--- a/images/emoji/1f476.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fb.png b/images/emoji/1f477-1f3fb.png
deleted file mode 100644
index 2f24a2bab..000000000
--- a/images/emoji/1f477-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fc.png b/images/emoji/1f477-1f3fc.png
deleted file mode 100644
index 93c8fec5a..000000000
--- a/images/emoji/1f477-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fd.png b/images/emoji/1f477-1f3fd.png
deleted file mode 100644
index abc1f2af2..000000000
--- a/images/emoji/1f477-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3fe.png b/images/emoji/1f477-1f3fe.png
deleted file mode 100644
index eed83289a..000000000
--- a/images/emoji/1f477-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477-1f3ff.png b/images/emoji/1f477-1f3ff.png
deleted file mode 100644
index acbb220b8..000000000
--- a/images/emoji/1f477-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f477.png b/images/emoji/1f477.png
deleted file mode 100644
index a9970a890..000000000
--- a/images/emoji/1f477.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fb.png b/images/emoji/1f478-1f3fb.png
deleted file mode 100644
index 7e4d850d1..000000000
--- a/images/emoji/1f478-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fc.png b/images/emoji/1f478-1f3fc.png
deleted file mode 100644
index 8179de403..000000000
--- a/images/emoji/1f478-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fd.png b/images/emoji/1f478-1f3fd.png
deleted file mode 100644
index de04809d1..000000000
--- a/images/emoji/1f478-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3fe.png b/images/emoji/1f478-1f3fe.png
deleted file mode 100644
index c71e69caa..000000000
--- a/images/emoji/1f478-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478-1f3ff.png b/images/emoji/1f478-1f3ff.png
deleted file mode 100644
index 063e26459..000000000
--- a/images/emoji/1f478-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f478.png b/images/emoji/1f478.png
deleted file mode 100644
index a9958dfff..000000000
--- a/images/emoji/1f478.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f479.png b/images/emoji/1f479.png
deleted file mode 100644
index fe8670fda..000000000
--- a/images/emoji/1f479.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47a.png b/images/emoji/1f47a.png
deleted file mode 100644
index e2ffb0c19..000000000
--- a/images/emoji/1f47a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47b.png b/images/emoji/1f47b.png
deleted file mode 100644
index d22b1ccba..000000000
--- a/images/emoji/1f47b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fb.png b/images/emoji/1f47c-1f3fb.png
deleted file mode 100644
index 391694dc0..000000000
--- a/images/emoji/1f47c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fc.png b/images/emoji/1f47c-1f3fc.png
deleted file mode 100644
index 700cbe6ed..000000000
--- a/images/emoji/1f47c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fd.png b/images/emoji/1f47c-1f3fd.png
deleted file mode 100644
index be597437d..000000000
--- a/images/emoji/1f47c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3fe.png b/images/emoji/1f47c-1f3fe.png
deleted file mode 100644
index b06d3c853..000000000
--- a/images/emoji/1f47c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c-1f3ff.png b/images/emoji/1f47c-1f3ff.png
deleted file mode 100644
index 17bd677e3..000000000
--- a/images/emoji/1f47c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47c.png b/images/emoji/1f47c.png
deleted file mode 100644
index 66ea97a3b..000000000
--- a/images/emoji/1f47c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47d.png b/images/emoji/1f47d.png
deleted file mode 100644
index 3b90e9743..000000000
--- a/images/emoji/1f47d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47e.png b/images/emoji/1f47e.png
deleted file mode 100644
index 2e73f5f32..000000000
--- a/images/emoji/1f47e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f47f.png b/images/emoji/1f47f.png
deleted file mode 100644
index 83b68e404..000000000
--- a/images/emoji/1f47f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f480.png b/images/emoji/1f480.png
deleted file mode 100644
index 26abb1729..000000000
--- a/images/emoji/1f480.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fb.png b/images/emoji/1f481-1f3fb.png
deleted file mode 100644
index 3d9e22479..000000000
--- a/images/emoji/1f481-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fc.png b/images/emoji/1f481-1f3fc.png
deleted file mode 100644
index 7853bc60a..000000000
--- a/images/emoji/1f481-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fd.png b/images/emoji/1f481-1f3fd.png
deleted file mode 100644
index 307514eab..000000000
--- a/images/emoji/1f481-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3fe.png b/images/emoji/1f481-1f3fe.png
deleted file mode 100644
index 95cc7ff36..000000000
--- a/images/emoji/1f481-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481-1f3ff.png b/images/emoji/1f481-1f3ff.png
deleted file mode 100644
index 26f8f22b2..000000000
--- a/images/emoji/1f481-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f481.png b/images/emoji/1f481.png
deleted file mode 100644
index 328cfb316..000000000
--- a/images/emoji/1f481.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fb.png b/images/emoji/1f482-1f3fb.png
deleted file mode 100644
index cea9ba274..000000000
--- a/images/emoji/1f482-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fc.png b/images/emoji/1f482-1f3fc.png
deleted file mode 100644
index c8c3c6444..000000000
--- a/images/emoji/1f482-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fd.png b/images/emoji/1f482-1f3fd.png
deleted file mode 100644
index 29d9fc477..000000000
--- a/images/emoji/1f482-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3fe.png b/images/emoji/1f482-1f3fe.png
deleted file mode 100644
index 85fcf9a3b..000000000
--- a/images/emoji/1f482-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482-1f3ff.png b/images/emoji/1f482-1f3ff.png
deleted file mode 100644
index b140a2d23..000000000
--- a/images/emoji/1f482-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f482.png b/images/emoji/1f482.png
deleted file mode 100644
index 8d7ab3c47..000000000
--- a/images/emoji/1f482.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fb.png b/images/emoji/1f483-1f3fb.png
deleted file mode 100644
index 27975615e..000000000
--- a/images/emoji/1f483-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fc.png b/images/emoji/1f483-1f3fc.png
deleted file mode 100644
index cb04b1f90..000000000
--- a/images/emoji/1f483-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fd.png b/images/emoji/1f483-1f3fd.png
deleted file mode 100644
index 98c5bca7b..000000000
--- a/images/emoji/1f483-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3fe.png b/images/emoji/1f483-1f3fe.png
deleted file mode 100644
index fdb1e00cb..000000000
--- a/images/emoji/1f483-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483-1f3ff.png b/images/emoji/1f483-1f3ff.png
deleted file mode 100644
index 0e34e0e23..000000000
--- a/images/emoji/1f483-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f483.png b/images/emoji/1f483.png
deleted file mode 100644
index d1cdad8dd..000000000
--- a/images/emoji/1f483.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f484.png b/images/emoji/1f484.png
deleted file mode 100644
index 61a0c084c..000000000
--- a/images/emoji/1f484.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fb.png b/images/emoji/1f485-1f3fb.png
deleted file mode 100644
index f1fbfcf52..000000000
--- a/images/emoji/1f485-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fc.png b/images/emoji/1f485-1f3fc.png
deleted file mode 100644
index 02b836b2f..000000000
--- a/images/emoji/1f485-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fd.png b/images/emoji/1f485-1f3fd.png
deleted file mode 100644
index 7432e3cf2..000000000
--- a/images/emoji/1f485-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3fe.png b/images/emoji/1f485-1f3fe.png
deleted file mode 100644
index e4272692c..000000000
--- a/images/emoji/1f485-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485-1f3ff.png b/images/emoji/1f485-1f3ff.png
deleted file mode 100644
index d29e1c553..000000000
--- a/images/emoji/1f485-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f485.png b/images/emoji/1f485.png
deleted file mode 100644
index aa52af705..000000000
--- a/images/emoji/1f485.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fb.png b/images/emoji/1f486-1f3fb.png
deleted file mode 100644
index f9dea75f3..000000000
--- a/images/emoji/1f486-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fc.png b/images/emoji/1f486-1f3fc.png
deleted file mode 100644
index 0bb244a27..000000000
--- a/images/emoji/1f486-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fd.png b/images/emoji/1f486-1f3fd.png
deleted file mode 100644
index 06941c86b..000000000
--- a/images/emoji/1f486-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3fe.png b/images/emoji/1f486-1f3fe.png
deleted file mode 100644
index 671d52310..000000000
--- a/images/emoji/1f486-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486-1f3ff.png b/images/emoji/1f486-1f3ff.png
deleted file mode 100644
index 6a388c0d0..000000000
--- a/images/emoji/1f486-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f486.png b/images/emoji/1f486.png
deleted file mode 100644
index 9ed04ff13..000000000
--- a/images/emoji/1f486.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fb.png b/images/emoji/1f487-1f3fb.png
deleted file mode 100644
index c743b74ab..000000000
--- a/images/emoji/1f487-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fc.png b/images/emoji/1f487-1f3fc.png
deleted file mode 100644
index dbbddcb34..000000000
--- a/images/emoji/1f487-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fd.png b/images/emoji/1f487-1f3fd.png
deleted file mode 100644
index d5ad19563..000000000
--- a/images/emoji/1f487-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3fe.png b/images/emoji/1f487-1f3fe.png
deleted file mode 100644
index 244fd3af0..000000000
--- a/images/emoji/1f487-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487-1f3ff.png b/images/emoji/1f487-1f3ff.png
deleted file mode 100644
index 20a94a886..000000000
--- a/images/emoji/1f487-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f487.png b/images/emoji/1f487.png
deleted file mode 100644
index 91266b129..000000000
--- a/images/emoji/1f487.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f488.png b/images/emoji/1f488.png
deleted file mode 100644
index 896f4d716..000000000
--- a/images/emoji/1f488.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f489.png b/images/emoji/1f489.png
deleted file mode 100644
index 71c1a9528..000000000
--- a/images/emoji/1f489.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48a.png b/images/emoji/1f48a.png
deleted file mode 100644
index 1d4530e77..000000000
--- a/images/emoji/1f48a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48c.png b/images/emoji/1f48c.png
deleted file mode 100644
index 3c3c767e7..000000000
--- a/images/emoji/1f48c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48d.png b/images/emoji/1f48d.png
deleted file mode 100644
index 87d227adb..000000000
--- a/images/emoji/1f48d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48e.png b/images/emoji/1f48e.png
deleted file mode 100644
index db122d26a..000000000
--- a/images/emoji/1f48e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f48f.png b/images/emoji/1f48f.png
deleted file mode 100644
index 9aa519da9..000000000
--- a/images/emoji/1f48f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f490.png b/images/emoji/1f490.png
deleted file mode 100644
index 11455af6d..000000000
--- a/images/emoji/1f490.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f491.png b/images/emoji/1f491.png
deleted file mode 100644
index 62111601b..000000000
--- a/images/emoji/1f491.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f492.png b/images/emoji/1f492.png
deleted file mode 100644
index d0d8aa0bf..000000000
--- a/images/emoji/1f492.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f493.png b/images/emoji/1f493.png
deleted file mode 100644
index 0bcf2d1d5..000000000
--- a/images/emoji/1f493.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f494.png b/images/emoji/1f494.png
deleted file mode 100644
index 718e26ee1..000000000
--- a/images/emoji/1f494.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f495.png b/images/emoji/1f495.png
deleted file mode 100644
index 4d8c33860..000000000
--- a/images/emoji/1f495.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f496.png b/images/emoji/1f496.png
deleted file mode 100644
index 670926945..000000000
--- a/images/emoji/1f496.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f497.png b/images/emoji/1f497.png
deleted file mode 100644
index d6e694e97..000000000
--- a/images/emoji/1f497.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f498.png b/images/emoji/1f498.png
deleted file mode 100644
index 2df0078dd..000000000
--- a/images/emoji/1f498.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f499.png b/images/emoji/1f499.png
deleted file mode 100644
index bdf1287e5..000000000
--- a/images/emoji/1f499.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49a.png b/images/emoji/1f49a.png
deleted file mode 100644
index c52d60a58..000000000
--- a/images/emoji/1f49a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49b.png b/images/emoji/1f49b.png
deleted file mode 100644
index 7901a9d01..000000000
--- a/images/emoji/1f49b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49c.png b/images/emoji/1f49c.png
deleted file mode 100644
index 95c53a9ad..000000000
--- a/images/emoji/1f49c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49d.png b/images/emoji/1f49d.png
deleted file mode 100644
index 902ceafe4..000000000
--- a/images/emoji/1f49d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49e.png b/images/emoji/1f49e.png
deleted file mode 100644
index 7b9d1948f..000000000
--- a/images/emoji/1f49e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f49f.png b/images/emoji/1f49f.png
deleted file mode 100644
index 5443f60bc..000000000
--- a/images/emoji/1f49f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a0.png b/images/emoji/1f4a0.png
deleted file mode 100644
index 2a22a26d1..000000000
--- a/images/emoji/1f4a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a1.png b/images/emoji/1f4a1.png
deleted file mode 100644
index 38e32e02d..000000000
--- a/images/emoji/1f4a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a2.png b/images/emoji/1f4a2.png
deleted file mode 100644
index d63c2e000..000000000
--- a/images/emoji/1f4a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a3.png b/images/emoji/1f4a3.png
deleted file mode 100644
index c7f8f81c9..000000000
--- a/images/emoji/1f4a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a4.png b/images/emoji/1f4a4.png
deleted file mode 100644
index 9bc72b446..000000000
--- a/images/emoji/1f4a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a5.png b/images/emoji/1f4a5.png
deleted file mode 100644
index 9b0f027b1..000000000
--- a/images/emoji/1f4a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a6.png b/images/emoji/1f4a6.png
deleted file mode 100644
index 4106117eb..000000000
--- a/images/emoji/1f4a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a7.png b/images/emoji/1f4a7.png
deleted file mode 100644
index 71241ec30..000000000
--- a/images/emoji/1f4a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a8.png b/images/emoji/1f4a8.png
deleted file mode 100644
index 064b8525c..000000000
--- a/images/emoji/1f4a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4a9.png b/images/emoji/1f4a9.png
deleted file mode 100644
index 10b15e72d..000000000
--- a/images/emoji/1f4a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fb.png b/images/emoji/1f4aa-1f3fb.png
deleted file mode 100644
index 1522942ce..000000000
--- a/images/emoji/1f4aa-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fc.png b/images/emoji/1f4aa-1f3fc.png
deleted file mode 100644
index 569c6e832..000000000
--- a/images/emoji/1f4aa-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fd.png b/images/emoji/1f4aa-1f3fd.png
deleted file mode 100644
index 0a76b00fa..000000000
--- a/images/emoji/1f4aa-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3fe.png b/images/emoji/1f4aa-1f3fe.png
deleted file mode 100644
index f0cf31328..000000000
--- a/images/emoji/1f4aa-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa-1f3ff.png b/images/emoji/1f4aa-1f3ff.png
deleted file mode 100644
index 4fda92460..000000000
--- a/images/emoji/1f4aa-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4aa.png b/images/emoji/1f4aa.png
deleted file mode 100644
index 7e67c1880..000000000
--- a/images/emoji/1f4aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ab.png b/images/emoji/1f4ab.png
deleted file mode 100644
index 85f52efad..000000000
--- a/images/emoji/1f4ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ac.png b/images/emoji/1f4ac.png
deleted file mode 100644
index a34ef7417..000000000
--- a/images/emoji/1f4ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ad.png b/images/emoji/1f4ad.png
deleted file mode 100644
index 72fe8fa70..000000000
--- a/images/emoji/1f4ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ae.png b/images/emoji/1f4ae.png
deleted file mode 100644
index d6af8b600..000000000
--- a/images/emoji/1f4ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4af.png b/images/emoji/1f4af.png
deleted file mode 100644
index 6903ff030..000000000
--- a/images/emoji/1f4af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b0.png b/images/emoji/1f4b0.png
deleted file mode 100644
index b9296be09..000000000
--- a/images/emoji/1f4b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b1.png b/images/emoji/1f4b1.png
deleted file mode 100644
index 4d46c6050..000000000
--- a/images/emoji/1f4b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b2.png b/images/emoji/1f4b2.png
deleted file mode 100644
index ef2c2e205..000000000
--- a/images/emoji/1f4b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b3.png b/images/emoji/1f4b3.png
deleted file mode 100644
index 372777d5c..000000000
--- a/images/emoji/1f4b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b4.png b/images/emoji/1f4b4.png
deleted file mode 100644
index 63ee4799d..000000000
--- a/images/emoji/1f4b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b5.png b/images/emoji/1f4b5.png
deleted file mode 100644
index a9904c282..000000000
--- a/images/emoji/1f4b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b6.png b/images/emoji/1f4b6.png
deleted file mode 100644
index a49020820..000000000
--- a/images/emoji/1f4b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b7.png b/images/emoji/1f4b7.png
deleted file mode 100644
index a0d4c4099..000000000
--- a/images/emoji/1f4b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b8.png b/images/emoji/1f4b8.png
deleted file mode 100644
index f022b04b3..000000000
--- a/images/emoji/1f4b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4b9.png b/images/emoji/1f4b9.png
deleted file mode 100644
index 9773f03be..000000000
--- a/images/emoji/1f4b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ba.png b/images/emoji/1f4ba.png
deleted file mode 100644
index a6d72d95a..000000000
--- a/images/emoji/1f4ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bb.png b/images/emoji/1f4bb.png
deleted file mode 100644
index c1fee27e3..000000000
--- a/images/emoji/1f4bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bc.png b/images/emoji/1f4bc.png
deleted file mode 100644
index b9912ba21..000000000
--- a/images/emoji/1f4bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bd.png b/images/emoji/1f4bd.png
deleted file mode 100644
index 9fa94cfbe..000000000
--- a/images/emoji/1f4bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4be.png b/images/emoji/1f4be.png
deleted file mode 100644
index 072a76d3c..000000000
--- a/images/emoji/1f4be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4bf.png b/images/emoji/1f4bf.png
deleted file mode 100644
index e6b01449c..000000000
--- a/images/emoji/1f4bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c0.png b/images/emoji/1f4c0.png
deleted file mode 100644
index 045a6f7a0..000000000
--- a/images/emoji/1f4c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c1.png b/images/emoji/1f4c1.png
deleted file mode 100644
index addedaf08..000000000
--- a/images/emoji/1f4c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c2.png b/images/emoji/1f4c2.png
deleted file mode 100644
index 3993b0922..000000000
--- a/images/emoji/1f4c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c3.png b/images/emoji/1f4c3.png
deleted file mode 100644
index 06355319c..000000000
--- a/images/emoji/1f4c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c4.png b/images/emoji/1f4c4.png
deleted file mode 100644
index ba4ed757e..000000000
--- a/images/emoji/1f4c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c5.png b/images/emoji/1f4c5.png
deleted file mode 100644
index f05b3da97..000000000
--- a/images/emoji/1f4c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c6.png b/images/emoji/1f4c6.png
deleted file mode 100644
index 47353b744..000000000
--- a/images/emoji/1f4c6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c7.png b/images/emoji/1f4c7.png
deleted file mode 100644
index 151e11cb3..000000000
--- a/images/emoji/1f4c7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c8.png b/images/emoji/1f4c8.png
deleted file mode 100644
index f13cfcf99..000000000
--- a/images/emoji/1f4c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4c9.png b/images/emoji/1f4c9.png
deleted file mode 100644
index 5222ec72d..000000000
--- a/images/emoji/1f4c9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ca.png b/images/emoji/1f4ca.png
deleted file mode 100644
index 53c894550..000000000
--- a/images/emoji/1f4ca.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cb.png b/images/emoji/1f4cb.png
deleted file mode 100644
index ffd5b315d..000000000
--- a/images/emoji/1f4cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cc.png b/images/emoji/1f4cc.png
deleted file mode 100644
index 57e07d7f4..000000000
--- a/images/emoji/1f4cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cd.png b/images/emoji/1f4cd.png
deleted file mode 100644
index 28b9d7286..000000000
--- a/images/emoji/1f4cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ce.png b/images/emoji/1f4ce.png
deleted file mode 100644
index 8cd8d4f87..000000000
--- a/images/emoji/1f4ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4cf.png b/images/emoji/1f4cf.png
deleted file mode 100644
index 1017b7433..000000000
--- a/images/emoji/1f4cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d0.png b/images/emoji/1f4d0.png
deleted file mode 100644
index 77dee9ee8..000000000
--- a/images/emoji/1f4d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d1.png b/images/emoji/1f4d1.png
deleted file mode 100644
index 23a3083ad..000000000
--- a/images/emoji/1f4d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d2.png b/images/emoji/1f4d2.png
deleted file mode 100644
index ef0ea3b1f..000000000
--- a/images/emoji/1f4d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d3.png b/images/emoji/1f4d3.png
deleted file mode 100644
index f6c28b491..000000000
--- a/images/emoji/1f4d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d4.png b/images/emoji/1f4d4.png
deleted file mode 100644
index 03f566b6d..000000000
--- a/images/emoji/1f4d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d5.png b/images/emoji/1f4d5.png
deleted file mode 100644
index 6395cf215..000000000
--- a/images/emoji/1f4d5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d6.png b/images/emoji/1f4d6.png
deleted file mode 100644
index 0f4447ed3..000000000
--- a/images/emoji/1f4d6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d7.png b/images/emoji/1f4d7.png
deleted file mode 100644
index e5e411cf3..000000000
--- a/images/emoji/1f4d7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d8.png b/images/emoji/1f4d8.png
deleted file mode 100644
index d73dfd725..000000000
--- a/images/emoji/1f4d8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4d9.png b/images/emoji/1f4d9.png
deleted file mode 100644
index ab40e6ae6..000000000
--- a/images/emoji/1f4d9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4da.png b/images/emoji/1f4da.png
deleted file mode 100644
index 59a8bafeb..000000000
--- a/images/emoji/1f4da.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4db.png b/images/emoji/1f4db.png
deleted file mode 100644
index ec5ee213e..000000000
--- a/images/emoji/1f4db.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4dc.png b/images/emoji/1f4dc.png
deleted file mode 100644
index 50ee5dcd4..000000000
--- a/images/emoji/1f4dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4dd.png b/images/emoji/1f4dd.png
deleted file mode 100644
index 9e44f60f4..000000000
--- a/images/emoji/1f4dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4de.png b/images/emoji/1f4de.png
deleted file mode 100644
index 69388316c..000000000
--- a/images/emoji/1f4de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4df.png b/images/emoji/1f4df.png
deleted file mode 100644
index b24b99306..000000000
--- a/images/emoji/1f4df.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e0.png b/images/emoji/1f4e0.png
deleted file mode 100644
index 6f929e294..000000000
--- a/images/emoji/1f4e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e1.png b/images/emoji/1f4e1.png
deleted file mode 100644
index db0372795..000000000
--- a/images/emoji/1f4e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e2.png b/images/emoji/1f4e2.png
deleted file mode 100644
index 5fd76a95b..000000000
--- a/images/emoji/1f4e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e3.png b/images/emoji/1f4e3.png
deleted file mode 100644
index 4e6735188..000000000
--- a/images/emoji/1f4e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e4.png b/images/emoji/1f4e4.png
deleted file mode 100644
index 46493ed5b..000000000
--- a/images/emoji/1f4e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e5.png b/images/emoji/1f4e5.png
deleted file mode 100644
index 41a6be2b0..000000000
--- a/images/emoji/1f4e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e6.png b/images/emoji/1f4e6.png
deleted file mode 100644
index 85431756a..000000000
--- a/images/emoji/1f4e6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e7.png b/images/emoji/1f4e7.png
deleted file mode 100644
index d22e654a2..000000000
--- a/images/emoji/1f4e7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e8.png b/images/emoji/1f4e8.png
deleted file mode 100644
index fd22e8818..000000000
--- a/images/emoji/1f4e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4e9.png b/images/emoji/1f4e9.png
deleted file mode 100644
index 7448a6b76..000000000
--- a/images/emoji/1f4e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ea.png b/images/emoji/1f4ea.png
deleted file mode 100644
index ddc705db0..000000000
--- a/images/emoji/1f4ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4eb.png b/images/emoji/1f4eb.png
deleted file mode 100644
index ef5174e40..000000000
--- a/images/emoji/1f4eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ec.png b/images/emoji/1f4ec.png
deleted file mode 100644
index 5460616a5..000000000
--- a/images/emoji/1f4ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ed.png b/images/emoji/1f4ed.png
deleted file mode 100644
index f9aeee6b1..000000000
--- a/images/emoji/1f4ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ee.png b/images/emoji/1f4ee.png
deleted file mode 100644
index 07c9c4ab3..000000000
--- a/images/emoji/1f4ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ef.png b/images/emoji/1f4ef.png
deleted file mode 100644
index c173b8dbd..000000000
--- a/images/emoji/1f4ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f0.png b/images/emoji/1f4f0.png
deleted file mode 100644
index 2aa8f060b..000000000
--- a/images/emoji/1f4f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f1.png b/images/emoji/1f4f1.png
deleted file mode 100644
index fd377acf8..000000000
--- a/images/emoji/1f4f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f2.png b/images/emoji/1f4f2.png
deleted file mode 100644
index e2f308f8e..000000000
--- a/images/emoji/1f4f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f3.png b/images/emoji/1f4f3.png
deleted file mode 100644
index cc46510e4..000000000
--- a/images/emoji/1f4f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f4.png b/images/emoji/1f4f4.png
deleted file mode 100644
index 8b661ec1c..000000000
--- a/images/emoji/1f4f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f5.png b/images/emoji/1f4f5.png
deleted file mode 100644
index 7b1ae6ea5..000000000
--- a/images/emoji/1f4f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f6.png b/images/emoji/1f4f6.png
deleted file mode 100644
index ee2b5a4b5..000000000
--- a/images/emoji/1f4f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f7.png b/images/emoji/1f4f7.png
deleted file mode 100644
index 0a3429f72..000000000
--- a/images/emoji/1f4f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f8.png b/images/emoji/1f4f8.png
deleted file mode 100644
index 27471da20..000000000
--- a/images/emoji/1f4f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4f9.png b/images/emoji/1f4f9.png
deleted file mode 100644
index 8008d1414..000000000
--- a/images/emoji/1f4f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fa.png b/images/emoji/1f4fa.png
deleted file mode 100644
index 999f1fb5c..000000000
--- a/images/emoji/1f4fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fb.png b/images/emoji/1f4fb.png
deleted file mode 100644
index dec381fa2..000000000
--- a/images/emoji/1f4fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fc.png b/images/emoji/1f4fc.png
deleted file mode 100644
index b9eb78ecd..000000000
--- a/images/emoji/1f4fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4fd.png b/images/emoji/1f4fd.png
deleted file mode 100644
index ce9ab0daa..000000000
--- a/images/emoji/1f4fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f4ff.png b/images/emoji/1f4ff.png
deleted file mode 100644
index a4b6dfcc6..000000000
--- a/images/emoji/1f4ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f500.png b/images/emoji/1f500.png
deleted file mode 100644
index 5904badde..000000000
--- a/images/emoji/1f500.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f501.png b/images/emoji/1f501.png
deleted file mode 100644
index 540ce4e0f..000000000
--- a/images/emoji/1f501.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f502.png b/images/emoji/1f502.png
deleted file mode 100644
index 9567e8333..000000000
--- a/images/emoji/1f502.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f503.png b/images/emoji/1f503.png
deleted file mode 100644
index 26e49c383..000000000
--- a/images/emoji/1f503.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f504.png b/images/emoji/1f504.png
deleted file mode 100644
index 8d06d8e09..000000000
--- a/images/emoji/1f504.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f505.png b/images/emoji/1f505.png
deleted file mode 100644
index 543011d39..000000000
--- a/images/emoji/1f505.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f506.png b/images/emoji/1f506.png
deleted file mode 100644
index c41f2d5fd..000000000
--- a/images/emoji/1f506.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f507.png b/images/emoji/1f507.png
deleted file mode 100644
index 7c1788e50..000000000
--- a/images/emoji/1f507.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f508.png b/images/emoji/1f508.png
deleted file mode 100644
index 7bcffb8fc..000000000
--- a/images/emoji/1f508.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f509.png b/images/emoji/1f509.png
deleted file mode 100644
index e75ddca53..000000000
--- a/images/emoji/1f509.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50a.png b/images/emoji/1f50a.png
deleted file mode 100644
index 8370033a5..000000000
--- a/images/emoji/1f50a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50b.png b/images/emoji/1f50b.png
deleted file mode 100644
index f593e2bdb..000000000
--- a/images/emoji/1f50b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50c.png b/images/emoji/1f50c.png
deleted file mode 100644
index 31d1eb215..000000000
--- a/images/emoji/1f50c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50d.png b/images/emoji/1f50d.png
deleted file mode 100644
index 55487156a..000000000
--- a/images/emoji/1f50d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50e.png b/images/emoji/1f50e.png
deleted file mode 100644
index 0f4b1bca8..000000000
--- a/images/emoji/1f50e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f50f.png b/images/emoji/1f50f.png
deleted file mode 100644
index 19a07d162..000000000
--- a/images/emoji/1f50f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f510.png b/images/emoji/1f510.png
deleted file mode 100644
index 1c1cd5d07..000000000
--- a/images/emoji/1f510.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f511.png b/images/emoji/1f511.png
deleted file mode 100644
index 319cd1b88..000000000
--- a/images/emoji/1f511.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f512.png b/images/emoji/1f512.png
deleted file mode 100644
index 5a739c466..000000000
--- a/images/emoji/1f512.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f513.png b/images/emoji/1f513.png
deleted file mode 100644
index 4a74a6939..000000000
--- a/images/emoji/1f513.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f514.png b/images/emoji/1f514.png
deleted file mode 100644
index 776f4fdd0..000000000
--- a/images/emoji/1f514.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f515.png b/images/emoji/1f515.png
deleted file mode 100644
index 15cb38dd1..000000000
--- a/images/emoji/1f515.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f516.png b/images/emoji/1f516.png
deleted file mode 100644
index bbb444611..000000000
--- a/images/emoji/1f516.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f517.png b/images/emoji/1f517.png
deleted file mode 100644
index ae20f0f8e..000000000
--- a/images/emoji/1f517.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f518.png b/images/emoji/1f518.png
deleted file mode 100644
index 3a23449d9..000000000
--- a/images/emoji/1f518.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f519.png b/images/emoji/1f519.png
deleted file mode 100644
index d32c5d4f1..000000000
--- a/images/emoji/1f519.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51a.png b/images/emoji/1f51a.png
deleted file mode 100644
index ef3ccd5f3..000000000
--- a/images/emoji/1f51a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51b.png b/images/emoji/1f51b.png
deleted file mode 100644
index a0c371ae2..000000000
--- a/images/emoji/1f51b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51c.png b/images/emoji/1f51c.png
deleted file mode 100644
index 8cdfd8669..000000000
--- a/images/emoji/1f51c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51d.png b/images/emoji/1f51d.png
deleted file mode 100644
index 49dea8c08..000000000
--- a/images/emoji/1f51d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51e.png b/images/emoji/1f51e.png
deleted file mode 100644
index 6dfe6da51..000000000
--- a/images/emoji/1f51e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f51f.png b/images/emoji/1f51f.png
deleted file mode 100644
index 782d40049..000000000
--- a/images/emoji/1f51f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f520.png b/images/emoji/1f520.png
deleted file mode 100644
index fe9482d2d..000000000
--- a/images/emoji/1f520.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f521.png b/images/emoji/1f521.png
deleted file mode 100644
index 0996a8705..000000000
--- a/images/emoji/1f521.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f522.png b/images/emoji/1f522.png
deleted file mode 100644
index 248dc7e55..000000000
--- a/images/emoji/1f522.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f523.png b/images/emoji/1f523.png
deleted file mode 100644
index ac2fc1f35..000000000
--- a/images/emoji/1f523.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f524.png b/images/emoji/1f524.png
deleted file mode 100644
index 7688de692..000000000
--- a/images/emoji/1f524.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f525.png b/images/emoji/1f525.png
deleted file mode 100644
index bd3775a46..000000000
--- a/images/emoji/1f525.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f526.png b/images/emoji/1f526.png
deleted file mode 100644
index eee36c250..000000000
--- a/images/emoji/1f526.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f527.png b/images/emoji/1f527.png
deleted file mode 100644
index c16b74396..000000000
--- a/images/emoji/1f527.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f528.png b/images/emoji/1f528.png
deleted file mode 100644
index 00736cce4..000000000
--- a/images/emoji/1f528.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f529.png b/images/emoji/1f529.png
deleted file mode 100644
index 4b9ae1553..000000000
--- a/images/emoji/1f529.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52a.png b/images/emoji/1f52a.png
deleted file mode 100644
index 1acb9f307..000000000
--- a/images/emoji/1f52a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52b.png b/images/emoji/1f52b.png
deleted file mode 100644
index 89c5c244c..000000000
--- a/images/emoji/1f52b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52c.png b/images/emoji/1f52c.png
deleted file mode 100644
index 90f5acf6a..000000000
--- a/images/emoji/1f52c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52d.png b/images/emoji/1f52d.png
deleted file mode 100644
index d63154614..000000000
--- a/images/emoji/1f52d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52e.png b/images/emoji/1f52e.png
deleted file mode 100644
index 54334c18b..000000000
--- a/images/emoji/1f52e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f52f.png b/images/emoji/1f52f.png
deleted file mode 100644
index 2eb170745..000000000
--- a/images/emoji/1f52f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f530.png b/images/emoji/1f530.png
deleted file mode 100644
index bc434fb7c..000000000
--- a/images/emoji/1f530.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f531.png b/images/emoji/1f531.png
deleted file mode 100644
index 777a1dad1..000000000
--- a/images/emoji/1f531.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f532.png b/images/emoji/1f532.png
deleted file mode 100644
index a78fc2f6b..000000000
--- a/images/emoji/1f532.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f533.png b/images/emoji/1f533.png
deleted file mode 100644
index 934b1cedf..000000000
--- a/images/emoji/1f533.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f534.png b/images/emoji/1f534.png
deleted file mode 100644
index 4bef930d9..000000000
--- a/images/emoji/1f534.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f535.png b/images/emoji/1f535.png
deleted file mode 100644
index 84078ef31..000000000
--- a/images/emoji/1f535.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f536.png b/images/emoji/1f536.png
deleted file mode 100644
index 73ff0ac36..000000000
--- a/images/emoji/1f536.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f537.png b/images/emoji/1f537.png
deleted file mode 100644
index 416a58bd5..000000000
--- a/images/emoji/1f537.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f538.png b/images/emoji/1f538.png
deleted file mode 100644
index e1c6ed9b2..000000000
--- a/images/emoji/1f538.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f539.png b/images/emoji/1f539.png
deleted file mode 100644
index b86b5bc4d..000000000
--- a/images/emoji/1f539.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53a.png b/images/emoji/1f53a.png
deleted file mode 100644
index 785887c19..000000000
--- a/images/emoji/1f53a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53b.png b/images/emoji/1f53b.png
deleted file mode 100644
index a83beff19..000000000
--- a/images/emoji/1f53b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53c.png b/images/emoji/1f53c.png
deleted file mode 100644
index 20a13dcd5..000000000
--- a/images/emoji/1f53c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f53d.png b/images/emoji/1f53d.png
deleted file mode 100644
index 5870b9a22..000000000
--- a/images/emoji/1f53d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f549.png b/images/emoji/1f549.png
deleted file mode 100644
index a35c63c45..000000000
--- a/images/emoji/1f549.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54a.png b/images/emoji/1f54a.png
deleted file mode 100644
index 9580c4917..000000000
--- a/images/emoji/1f54a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54b.png b/images/emoji/1f54b.png
deleted file mode 100644
index 1778c1138..000000000
--- a/images/emoji/1f54b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54c.png b/images/emoji/1f54c.png
deleted file mode 100644
index ef770b26d..000000000
--- a/images/emoji/1f54c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54d.png b/images/emoji/1f54d.png
deleted file mode 100644
index ee347904c..000000000
--- a/images/emoji/1f54d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f54e.png b/images/emoji/1f54e.png
deleted file mode 100644
index b42973628..000000000
--- a/images/emoji/1f54e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f550.png b/images/emoji/1f550.png
deleted file mode 100644
index d6e34941f..000000000
--- a/images/emoji/1f550.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f551.png b/images/emoji/1f551.png
deleted file mode 100644
index a54253d7d..000000000
--- a/images/emoji/1f551.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f552.png b/images/emoji/1f552.png
deleted file mode 100644
index 27ec4b1f5..000000000
--- a/images/emoji/1f552.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f553.png b/images/emoji/1f553.png
deleted file mode 100644
index 60a1ef4cc..000000000
--- a/images/emoji/1f553.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f554.png b/images/emoji/1f554.png
deleted file mode 100644
index c9382d1e0..000000000
--- a/images/emoji/1f554.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f555.png b/images/emoji/1f555.png
deleted file mode 100644
index 8fd5d3f5b..000000000
--- a/images/emoji/1f555.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f556.png b/images/emoji/1f556.png
deleted file mode 100644
index 8c7084036..000000000
--- a/images/emoji/1f556.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f557.png b/images/emoji/1f557.png
deleted file mode 100644
index fcddf722e..000000000
--- a/images/emoji/1f557.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f558.png b/images/emoji/1f558.png
deleted file mode 100644
index dfbe01179..000000000
--- a/images/emoji/1f558.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f559.png b/images/emoji/1f559.png
deleted file mode 100644
index e62b245cd..000000000
--- a/images/emoji/1f559.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55a.png b/images/emoji/1f55a.png
deleted file mode 100644
index 098334527..000000000
--- a/images/emoji/1f55a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55b.png b/images/emoji/1f55b.png
deleted file mode 100644
index e61caa4b3..000000000
--- a/images/emoji/1f55b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55c.png b/images/emoji/1f55c.png
deleted file mode 100644
index 86b7689b8..000000000
--- a/images/emoji/1f55c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55d.png b/images/emoji/1f55d.png
deleted file mode 100644
index 7a787e018..000000000
--- a/images/emoji/1f55d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55e.png b/images/emoji/1f55e.png
deleted file mode 100644
index c6860395c..000000000
--- a/images/emoji/1f55e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f55f.png b/images/emoji/1f55f.png
deleted file mode 100644
index 3c05b3621..000000000
--- a/images/emoji/1f55f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f560.png b/images/emoji/1f560.png
deleted file mode 100644
index c21fa926d..000000000
--- a/images/emoji/1f560.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f561.png b/images/emoji/1f561.png
deleted file mode 100644
index 2aec87fef..000000000
--- a/images/emoji/1f561.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f562.png b/images/emoji/1f562.png
deleted file mode 100644
index f7a1135e0..000000000
--- a/images/emoji/1f562.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f563.png b/images/emoji/1f563.png
deleted file mode 100644
index 799b4aebc..000000000
--- a/images/emoji/1f563.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f564.png b/images/emoji/1f564.png
deleted file mode 100644
index 4a2092ee6..000000000
--- a/images/emoji/1f564.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f565.png b/images/emoji/1f565.png
deleted file mode 100644
index 0802b3c65..000000000
--- a/images/emoji/1f565.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f566.png b/images/emoji/1f566.png
deleted file mode 100644
index d970d03b8..000000000
--- a/images/emoji/1f566.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f567.png b/images/emoji/1f567.png
deleted file mode 100644
index f2b1d2617..000000000
--- a/images/emoji/1f567.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f56f.png b/images/emoji/1f56f.png
deleted file mode 100644
index 0b56444e3..000000000
--- a/images/emoji/1f56f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f570.png b/images/emoji/1f570.png
deleted file mode 100644
index ffdb451e3..000000000
--- a/images/emoji/1f570.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f573.png b/images/emoji/1f573.png
deleted file mode 100644
index 517d2ae0d..000000000
--- a/images/emoji/1f573.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f574.png b/images/emoji/1f574.png
deleted file mode 100644
index 3dc315a3d..000000000
--- a/images/emoji/1f574.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fb.png b/images/emoji/1f575-1f3fb.png
deleted file mode 100644
index 2d1c022ca..000000000
--- a/images/emoji/1f575-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fc.png b/images/emoji/1f575-1f3fc.png
deleted file mode 100644
index 13e01ad93..000000000
--- a/images/emoji/1f575-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fd.png b/images/emoji/1f575-1f3fd.png
deleted file mode 100644
index a814dca2e..000000000
--- a/images/emoji/1f575-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3fe.png b/images/emoji/1f575-1f3fe.png
deleted file mode 100644
index d8300af49..000000000
--- a/images/emoji/1f575-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575-1f3ff.png b/images/emoji/1f575-1f3ff.png
deleted file mode 100644
index ca1462595..000000000
--- a/images/emoji/1f575-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f575.png b/images/emoji/1f575.png
deleted file mode 100644
index a729e9584..000000000
--- a/images/emoji/1f575.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f576.png b/images/emoji/1f576.png
deleted file mode 100644
index b1b6db0ac..000000000
--- a/images/emoji/1f576.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f577.png b/images/emoji/1f577.png
deleted file mode 100644
index 3849fa90b..000000000
--- a/images/emoji/1f577.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f578.png b/images/emoji/1f578.png
deleted file mode 100644
index ba448ee7f..000000000
--- a/images/emoji/1f578.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f579.png b/images/emoji/1f579.png
deleted file mode 100644
index 1ee190543..000000000
--- a/images/emoji/1f579.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fb.png b/images/emoji/1f57a-1f3fb.png
deleted file mode 100644
index e0b9f82d9..000000000
--- a/images/emoji/1f57a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fc.png b/images/emoji/1f57a-1f3fc.png
deleted file mode 100644
index a5beed56e..000000000
--- a/images/emoji/1f57a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fd.png b/images/emoji/1f57a-1f3fd.png
deleted file mode 100644
index 2fa20180a..000000000
--- a/images/emoji/1f57a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3fe.png b/images/emoji/1f57a-1f3fe.png
deleted file mode 100644
index bd3528c83..000000000
--- a/images/emoji/1f57a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a-1f3ff.png b/images/emoji/1f57a-1f3ff.png
deleted file mode 100644
index 41fd4f880..000000000
--- a/images/emoji/1f57a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f57a.png b/images/emoji/1f57a.png
deleted file mode 100644
index ccff3bede..000000000
--- a/images/emoji/1f57a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f587.png b/images/emoji/1f587.png
deleted file mode 100644
index 76021e8c7..000000000
--- a/images/emoji/1f587.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58a.png b/images/emoji/1f58a.png
deleted file mode 100644
index 6ef7a3424..000000000
--- a/images/emoji/1f58a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58b.png b/images/emoji/1f58b.png
deleted file mode 100644
index 3ca4bd2c2..000000000
--- a/images/emoji/1f58b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58c.png b/images/emoji/1f58c.png
deleted file mode 100644
index 28bffbaa3..000000000
--- a/images/emoji/1f58c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f58d.png b/images/emoji/1f58d.png
deleted file mode 100644
index 8d7b427aa..000000000
--- a/images/emoji/1f58d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fb.png b/images/emoji/1f590-1f3fb.png
deleted file mode 100644
index a7888e6bd..000000000
--- a/images/emoji/1f590-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fc.png b/images/emoji/1f590-1f3fc.png
deleted file mode 100644
index cc10fbc27..000000000
--- a/images/emoji/1f590-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fd.png b/images/emoji/1f590-1f3fd.png
deleted file mode 100644
index 707236ae8..000000000
--- a/images/emoji/1f590-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3fe.png b/images/emoji/1f590-1f3fe.png
deleted file mode 100644
index 1430df9c6..000000000
--- a/images/emoji/1f590-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590-1f3ff.png b/images/emoji/1f590-1f3ff.png
deleted file mode 100644
index 80bec971b..000000000
--- a/images/emoji/1f590-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f590.png b/images/emoji/1f590.png
deleted file mode 100644
index fb5ae8ebb..000000000
--- a/images/emoji/1f590.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fb.png b/images/emoji/1f595-1f3fb.png
deleted file mode 100644
index 61ef12a15..000000000
--- a/images/emoji/1f595-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fc.png b/images/emoji/1f595-1f3fc.png
deleted file mode 100644
index c31a69be9..000000000
--- a/images/emoji/1f595-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fd.png b/images/emoji/1f595-1f3fd.png
deleted file mode 100644
index 73ac216ce..000000000
--- a/images/emoji/1f595-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3fe.png b/images/emoji/1f595-1f3fe.png
deleted file mode 100644
index 80b8ab770..000000000
--- a/images/emoji/1f595-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595-1f3ff.png b/images/emoji/1f595-1f3ff.png
deleted file mode 100644
index a8826b196..000000000
--- a/images/emoji/1f595-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f595.png b/images/emoji/1f595.png
deleted file mode 100644
index 697f7a25e..000000000
--- a/images/emoji/1f595.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fb.png b/images/emoji/1f596-1f3fb.png
deleted file mode 100644
index 8aff5d8fa..000000000
--- a/images/emoji/1f596-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fc.png b/images/emoji/1f596-1f3fc.png
deleted file mode 100644
index 82b7ad519..000000000
--- a/images/emoji/1f596-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fd.png b/images/emoji/1f596-1f3fd.png
deleted file mode 100644
index d1400e1dd..000000000
--- a/images/emoji/1f596-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3fe.png b/images/emoji/1f596-1f3fe.png
deleted file mode 100644
index 47e2b2801..000000000
--- a/images/emoji/1f596-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596-1f3ff.png b/images/emoji/1f596-1f3ff.png
deleted file mode 100644
index 60b5c6077..000000000
--- a/images/emoji/1f596-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f596.png b/images/emoji/1f596.png
deleted file mode 100644
index 54728bcaf..000000000
--- a/images/emoji/1f596.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a4.png b/images/emoji/1f5a4.png
deleted file mode 100644
index b4068c3e6..000000000
--- a/images/emoji/1f5a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a5.png b/images/emoji/1f5a5.png
deleted file mode 100644
index 909bd42b5..000000000
--- a/images/emoji/1f5a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5a8.png b/images/emoji/1f5a8.png
deleted file mode 100644
index 027c830f0..000000000
--- a/images/emoji/1f5a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5b1.png b/images/emoji/1f5b1.png
deleted file mode 100644
index e84e96ff6..000000000
--- a/images/emoji/1f5b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5b2.png b/images/emoji/1f5b2.png
deleted file mode 100644
index 3bea84ad7..000000000
--- a/images/emoji/1f5b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5bc.png b/images/emoji/1f5bc.png
deleted file mode 100644
index 9fe84607b..000000000
--- a/images/emoji/1f5bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c2.png b/images/emoji/1f5c2.png
deleted file mode 100644
index 46a7e403f..000000000
--- a/images/emoji/1f5c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c3.png b/images/emoji/1f5c3.png
deleted file mode 100644
index f2e764ce5..000000000
--- a/images/emoji/1f5c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5c4.png b/images/emoji/1f5c4.png
deleted file mode 100644
index fddc65dde..000000000
--- a/images/emoji/1f5c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d1.png b/images/emoji/1f5d1.png
deleted file mode 100644
index 2b3c484b4..000000000
--- a/images/emoji/1f5d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d2.png b/images/emoji/1f5d2.png
deleted file mode 100644
index 85faa10d8..000000000
--- a/images/emoji/1f5d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5d3.png b/images/emoji/1f5d3.png
deleted file mode 100644
index dec8d49bf..000000000
--- a/images/emoji/1f5d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5dc.png b/images/emoji/1f5dc.png
deleted file mode 100644
index 67c13258d..000000000
--- a/images/emoji/1f5dc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5dd.png b/images/emoji/1f5dd.png
deleted file mode 100644
index e11d706c6..000000000
--- a/images/emoji/1f5dd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5de.png b/images/emoji/1f5de.png
deleted file mode 100644
index f64748df2..000000000
--- a/images/emoji/1f5de.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e1.png b/images/emoji/1f5e1.png
deleted file mode 100644
index 66e97b0aa..000000000
--- a/images/emoji/1f5e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e3.png b/images/emoji/1f5e3.png
deleted file mode 100644
index 2df93aaae..000000000
--- a/images/emoji/1f5e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5e8.png b/images/emoji/1f5e8.png
deleted file mode 100644
index 00c05959b..000000000
--- a/images/emoji/1f5e8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5ef.png b/images/emoji/1f5ef.png
deleted file mode 100644
index f5c97c4d2..000000000
--- a/images/emoji/1f5ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5f3.png b/images/emoji/1f5f3.png
deleted file mode 100644
index 9b6767aea..000000000
--- a/images/emoji/1f5f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fa.png b/images/emoji/1f5fa.png
deleted file mode 100644
index 15efe32c7..000000000
--- a/images/emoji/1f5fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fb.png b/images/emoji/1f5fb.png
deleted file mode 100644
index 88a547524..000000000
--- a/images/emoji/1f5fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fc.png b/images/emoji/1f5fc.png
deleted file mode 100644
index 37df7fc65..000000000
--- a/images/emoji/1f5fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fd.png b/images/emoji/1f5fd.png
deleted file mode 100644
index 05df8289b..000000000
--- a/images/emoji/1f5fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5fe.png b/images/emoji/1f5fe.png
deleted file mode 100644
index d86d0a59e..000000000
--- a/images/emoji/1f5fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f5ff.png b/images/emoji/1f5ff.png
deleted file mode 100644
index e6a7779c4..000000000
--- a/images/emoji/1f5ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f600.png b/images/emoji/1f600.png
deleted file mode 100644
index 3e8e0dab7..000000000
--- a/images/emoji/1f600.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f601.png b/images/emoji/1f601.png
deleted file mode 100644
index 418d94c81..000000000
--- a/images/emoji/1f601.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f602.png b/images/emoji/1f602.png
deleted file mode 100644
index 0ba3b1859..000000000
--- a/images/emoji/1f602.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f603.png b/images/emoji/1f603.png
deleted file mode 100644
index 30957a659..000000000
--- a/images/emoji/1f603.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f604.png b/images/emoji/1f604.png
deleted file mode 100644
index aa47ffe97..000000000
--- a/images/emoji/1f604.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f605.png b/images/emoji/1f605.png
deleted file mode 100644
index cb18d9c89..000000000
--- a/images/emoji/1f605.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f609.png b/images/emoji/1f609.png
deleted file mode 100644
index 7ea7810a3..000000000
--- a/images/emoji/1f609.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60b.png b/images/emoji/1f60b.png
deleted file mode 100644
index 2df15753c..000000000
--- a/images/emoji/1f60b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60c.png b/images/emoji/1f60c.png
deleted file mode 100644
index 715ad0bf5..000000000
--- a/images/emoji/1f60c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60d.png b/images/emoji/1f60d.png
deleted file mode 100644
index 73fbee29d..000000000
--- a/images/emoji/1f60d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60e.png b/images/emoji/1f60e.png
deleted file mode 100644
index 200117351..000000000
--- a/images/emoji/1f60e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f60f.png b/images/emoji/1f60f.png
deleted file mode 100644
index 878521099..000000000
--- a/images/emoji/1f60f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f610.png b/images/emoji/1f610.png
deleted file mode 100644
index 065d193af..000000000
--- a/images/emoji/1f610.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f611.png b/images/emoji/1f611.png
deleted file mode 100644
index 2954017f6..000000000
--- a/images/emoji/1f611.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f612.png b/images/emoji/1f612.png
deleted file mode 100644
index 25e3677f2..000000000
--- a/images/emoji/1f612.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f613.png b/images/emoji/1f613.png
deleted file mode 100644
index f0dae7b78..000000000
--- a/images/emoji/1f613.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f614.png b/images/emoji/1f614.png
deleted file mode 100644
index 490fb5669..000000000
--- a/images/emoji/1f614.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f615.png b/images/emoji/1f615.png
deleted file mode 100644
index 502b6bf0e..000000000
--- a/images/emoji/1f615.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f616.png b/images/emoji/1f616.png
deleted file mode 100644
index aa4b29e93..000000000
--- a/images/emoji/1f616.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f617.png b/images/emoji/1f617.png
deleted file mode 100644
index 39d325fd8..000000000
--- a/images/emoji/1f617.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f618.png b/images/emoji/1f618.png
deleted file mode 100644
index 0ff808fd6..000000000
--- a/images/emoji/1f618.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f619.png b/images/emoji/1f619.png
deleted file mode 100644
index e181f1709..000000000
--- a/images/emoji/1f619.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61a.png b/images/emoji/1f61a.png
deleted file mode 100644
index b684d7d4d..000000000
--- a/images/emoji/1f61a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61b.png b/images/emoji/1f61b.png
deleted file mode 100644
index 25757341f..000000000
--- a/images/emoji/1f61b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61d.png b/images/emoji/1f61d.png
deleted file mode 100644
index 5c0401e9b..000000000
--- a/images/emoji/1f61d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f61f.png b/images/emoji/1f61f.png
deleted file mode 100644
index 7074afcf5..000000000
--- a/images/emoji/1f61f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f620.png b/images/emoji/1f620.png
deleted file mode 100644
index cfc4a6ecd..000000000
--- a/images/emoji/1f620.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f621.png b/images/emoji/1f621.png
deleted file mode 100644
index 9d739bd40..000000000
--- a/images/emoji/1f621.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f622.png b/images/emoji/1f622.png
deleted file mode 100644
index b7877f8a1..000000000
--- a/images/emoji/1f622.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f623.png b/images/emoji/1f623.png
deleted file mode 100644
index 646a05fe9..000000000
--- a/images/emoji/1f623.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f624.png b/images/emoji/1f624.png
deleted file mode 100644
index 4f3312854..000000000
--- a/images/emoji/1f624.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f625.png b/images/emoji/1f625.png
deleted file mode 100644
index aef864d2b..000000000
--- a/images/emoji/1f625.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f626.png b/images/emoji/1f626.png
deleted file mode 100644
index 43ab6b0a1..000000000
--- a/images/emoji/1f626.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f627.png b/images/emoji/1f627.png
deleted file mode 100644
index f99026a3b..000000000
--- a/images/emoji/1f627.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f628.png b/images/emoji/1f628.png
deleted file mode 100644
index eb8b347ce..000000000
--- a/images/emoji/1f628.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f629.png b/images/emoji/1f629.png
deleted file mode 100644
index 98bfbd24a..000000000
--- a/images/emoji/1f629.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62a.png b/images/emoji/1f62a.png
deleted file mode 100644
index 836b41077..000000000
--- a/images/emoji/1f62a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62b.png b/images/emoji/1f62b.png
deleted file mode 100644
index 19aba1bc1..000000000
--- a/images/emoji/1f62b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62c.png b/images/emoji/1f62c.png
deleted file mode 100644
index 871b2f071..000000000
--- a/images/emoji/1f62c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62d.png b/images/emoji/1f62d.png
deleted file mode 100644
index e4f818360..000000000
--- a/images/emoji/1f62d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f62f.png b/images/emoji/1f62f.png
deleted file mode 100644
index cad0e2313..000000000
--- a/images/emoji/1f62f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f630.png b/images/emoji/1f630.png
deleted file mode 100644
index 85b2231bb..000000000
--- a/images/emoji/1f630.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f631.png b/images/emoji/1f631.png
deleted file mode 100644
index 6ab43a0d3..000000000
--- a/images/emoji/1f631.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f632.png b/images/emoji/1f632.png
deleted file mode 100644
index bd0ac55ec..000000000
--- a/images/emoji/1f632.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f633.png b/images/emoji/1f633.png
deleted file mode 100644
index 829220bc4..000000000
--- a/images/emoji/1f633.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f635.png b/images/emoji/1f635.png
deleted file mode 100644
index 3120316ab..000000000
--- a/images/emoji/1f635.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f636.png b/images/emoji/1f636.png
deleted file mode 100644
index b642f6c11..000000000
--- a/images/emoji/1f636.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f637.png b/images/emoji/1f637.png
deleted file mode 100644
index 23852e578..000000000
--- a/images/emoji/1f637.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f638.png b/images/emoji/1f638.png
deleted file mode 100644
index e27290a67..000000000
--- a/images/emoji/1f638.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f639.png b/images/emoji/1f639.png
deleted file mode 100644
index aac353179..000000000
--- a/images/emoji/1f639.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63a.png b/images/emoji/1f63a.png
deleted file mode 100644
index d5b1cef0b..000000000
--- a/images/emoji/1f63a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63b.png b/images/emoji/1f63b.png
deleted file mode 100644
index 5a59eed04..000000000
--- a/images/emoji/1f63b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63c.png b/images/emoji/1f63c.png
deleted file mode 100644
index 0bfeae4eb..000000000
--- a/images/emoji/1f63c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63d.png b/images/emoji/1f63d.png
deleted file mode 100644
index 7f1ef2056..000000000
--- a/images/emoji/1f63d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63e.png b/images/emoji/1f63e.png
deleted file mode 100644
index 41ddfeab4..000000000
--- a/images/emoji/1f63e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f63f.png b/images/emoji/1f63f.png
deleted file mode 100644
index ccc8d4f25..000000000
--- a/images/emoji/1f63f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f640.png b/images/emoji/1f640.png
deleted file mode 100644
index 15803ad8e..000000000
--- a/images/emoji/1f640.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f641.png b/images/emoji/1f641.png
deleted file mode 100644
index b2f1d983d..000000000
--- a/images/emoji/1f641.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f642.png b/images/emoji/1f642.png
deleted file mode 100644
index ddd7d65dd..000000000
--- a/images/emoji/1f642.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f643.png b/images/emoji/1f643.png
deleted file mode 100644
index 128f31c98..000000000
--- a/images/emoji/1f643.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f644.png b/images/emoji/1f644.png
deleted file mode 100644
index 2f77b9fc3..000000000
--- a/images/emoji/1f644.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fb.png b/images/emoji/1f645-1f3fb.png
deleted file mode 100644
index 7f28bf121..000000000
--- a/images/emoji/1f645-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fc.png b/images/emoji/1f645-1f3fc.png
deleted file mode 100644
index 80d8021f8..000000000
--- a/images/emoji/1f645-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fd.png b/images/emoji/1f645-1f3fd.png
deleted file mode 100644
index 635e6a008..000000000
--- a/images/emoji/1f645-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3fe.png b/images/emoji/1f645-1f3fe.png
deleted file mode 100644
index 42006e7da..000000000
--- a/images/emoji/1f645-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645-1f3ff.png b/images/emoji/1f645-1f3ff.png
deleted file mode 100644
index 309096cba..000000000
--- a/images/emoji/1f645-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f645.png b/images/emoji/1f645.png
deleted file mode 100644
index 381753cd8..000000000
--- a/images/emoji/1f645.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fb.png b/images/emoji/1f646-1f3fb.png
deleted file mode 100644
index ac28746a5..000000000
--- a/images/emoji/1f646-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fc.png b/images/emoji/1f646-1f3fc.png
deleted file mode 100644
index 5d845b042..000000000
--- a/images/emoji/1f646-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fd.png b/images/emoji/1f646-1f3fd.png
deleted file mode 100644
index 74c7b794f..000000000
--- a/images/emoji/1f646-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3fe.png b/images/emoji/1f646-1f3fe.png
deleted file mode 100644
index 2fbcd7f67..000000000
--- a/images/emoji/1f646-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646-1f3ff.png b/images/emoji/1f646-1f3ff.png
deleted file mode 100644
index da2d13546..000000000
--- a/images/emoji/1f646-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f646.png b/images/emoji/1f646.png
deleted file mode 100644
index 3de4594bd..000000000
--- a/images/emoji/1f646.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fb.png b/images/emoji/1f647-1f3fb.png
deleted file mode 100644
index 003d66052..000000000
--- a/images/emoji/1f647-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fc.png b/images/emoji/1f647-1f3fc.png
deleted file mode 100644
index d774be9c9..000000000
--- a/images/emoji/1f647-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fd.png b/images/emoji/1f647-1f3fd.png
deleted file mode 100644
index 43e06fd86..000000000
--- a/images/emoji/1f647-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3fe.png b/images/emoji/1f647-1f3fe.png
deleted file mode 100644
index 2d0f1a7c7..000000000
--- a/images/emoji/1f647-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647-1f3ff.png b/images/emoji/1f647-1f3ff.png
deleted file mode 100644
index 91f1a8ace..000000000
--- a/images/emoji/1f647-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f647.png b/images/emoji/1f647.png
deleted file mode 100644
index 3a0e83ee8..000000000
--- a/images/emoji/1f647.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f648.png b/images/emoji/1f648.png
deleted file mode 100644
index 5187e4745..000000000
--- a/images/emoji/1f648.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f649.png b/images/emoji/1f649.png
deleted file mode 100644
index 74b6be0c6..000000000
--- a/images/emoji/1f649.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64a.png b/images/emoji/1f64a.png
deleted file mode 100644
index c75f42ae7..000000000
--- a/images/emoji/1f64a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fb.png b/images/emoji/1f64b-1f3fb.png
deleted file mode 100644
index 1c90e3e26..000000000
--- a/images/emoji/1f64b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fc.png b/images/emoji/1f64b-1f3fc.png
deleted file mode 100644
index 82c3ef2bf..000000000
--- a/images/emoji/1f64b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fd.png b/images/emoji/1f64b-1f3fd.png
deleted file mode 100644
index 92a389f72..000000000
--- a/images/emoji/1f64b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3fe.png b/images/emoji/1f64b-1f3fe.png
deleted file mode 100644
index 8b95f0533..000000000
--- a/images/emoji/1f64b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b-1f3ff.png b/images/emoji/1f64b-1f3ff.png
deleted file mode 100644
index b86200fd8..000000000
--- a/images/emoji/1f64b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64b.png b/images/emoji/1f64b.png
deleted file mode 100644
index 7c803b315..000000000
--- a/images/emoji/1f64b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fb.png b/images/emoji/1f64c-1f3fb.png
deleted file mode 100644
index 1168b8236..000000000
--- a/images/emoji/1f64c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fc.png b/images/emoji/1f64c-1f3fc.png
deleted file mode 100644
index 322de6229..000000000
--- a/images/emoji/1f64c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fd.png b/images/emoji/1f64c-1f3fd.png
deleted file mode 100644
index 2aa24e05a..000000000
--- a/images/emoji/1f64c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3fe.png b/images/emoji/1f64c-1f3fe.png
deleted file mode 100644
index f31bf0db9..000000000
--- a/images/emoji/1f64c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c-1f3ff.png b/images/emoji/1f64c-1f3ff.png
deleted file mode 100644
index 5e95067f9..000000000
--- a/images/emoji/1f64c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64c.png b/images/emoji/1f64c.png
deleted file mode 100644
index c0155f728..000000000
--- a/images/emoji/1f64c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fb.png b/images/emoji/1f64d-1f3fb.png
deleted file mode 100644
index 21d3bb439..000000000
--- a/images/emoji/1f64d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fc.png b/images/emoji/1f64d-1f3fc.png
deleted file mode 100644
index 973f5fc83..000000000
--- a/images/emoji/1f64d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fd.png b/images/emoji/1f64d-1f3fd.png
deleted file mode 100644
index 41fbcc788..000000000
--- a/images/emoji/1f64d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3fe.png b/images/emoji/1f64d-1f3fe.png
deleted file mode 100644
index 5a37c7410..000000000
--- a/images/emoji/1f64d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d-1f3ff.png b/images/emoji/1f64d-1f3ff.png
deleted file mode 100644
index e08141f3e..000000000
--- a/images/emoji/1f64d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64d.png b/images/emoji/1f64d.png
deleted file mode 100644
index 579324959..000000000
--- a/images/emoji/1f64d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fb.png b/images/emoji/1f64e-1f3fb.png
deleted file mode 100644
index 57e826b75..000000000
--- a/images/emoji/1f64e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fc.png b/images/emoji/1f64e-1f3fc.png
deleted file mode 100644
index 3f317c0c2..000000000
--- a/images/emoji/1f64e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fd.png b/images/emoji/1f64e-1f3fd.png
deleted file mode 100644
index d2fbb6c20..000000000
--- a/images/emoji/1f64e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3fe.png b/images/emoji/1f64e-1f3fe.png
deleted file mode 100644
index 643ceb4a5..000000000
--- a/images/emoji/1f64e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e-1f3ff.png b/images/emoji/1f64e-1f3ff.png
deleted file mode 100644
index b2eb6859c..000000000
--- a/images/emoji/1f64e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64e.png b/images/emoji/1f64e.png
deleted file mode 100644
index 10eb05710..000000000
--- a/images/emoji/1f64e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fb.png b/images/emoji/1f64f-1f3fb.png
deleted file mode 100644
index 060ef2571..000000000
--- a/images/emoji/1f64f-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fc.png b/images/emoji/1f64f-1f3fc.png
deleted file mode 100644
index 56dc607c0..000000000
--- a/images/emoji/1f64f-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fd.png b/images/emoji/1f64f-1f3fd.png
deleted file mode 100644
index 0f33b8620..000000000
--- a/images/emoji/1f64f-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3fe.png b/images/emoji/1f64f-1f3fe.png
deleted file mode 100644
index 2ea8dc116..000000000
--- a/images/emoji/1f64f-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f-1f3ff.png b/images/emoji/1f64f-1f3ff.png
deleted file mode 100644
index 2128a6c47..000000000
--- a/images/emoji/1f64f-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f64f.png b/images/emoji/1f64f.png
deleted file mode 100644
index 8347f2435..000000000
--- a/images/emoji/1f64f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f680.png b/images/emoji/1f680.png
deleted file mode 100644
index 0d8da089a..000000000
--- a/images/emoji/1f680.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f681.png b/images/emoji/1f681.png
deleted file mode 100644
index 7ec5f39a5..000000000
--- a/images/emoji/1f681.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f682.png b/images/emoji/1f682.png
deleted file mode 100644
index 9ac0d999c..000000000
--- a/images/emoji/1f682.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f683.png b/images/emoji/1f683.png
deleted file mode 100644
index a9acbf130..000000000
--- a/images/emoji/1f683.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f684.png b/images/emoji/1f684.png
deleted file mode 100644
index ed61c67bf..000000000
--- a/images/emoji/1f684.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f685.png b/images/emoji/1f685.png
deleted file mode 100644
index 4f698e056..000000000
--- a/images/emoji/1f685.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f686.png b/images/emoji/1f686.png
deleted file mode 100644
index 8701e41e7..000000000
--- a/images/emoji/1f686.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f687.png b/images/emoji/1f687.png
deleted file mode 100644
index 1de8f0551..000000000
--- a/images/emoji/1f687.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f688.png b/images/emoji/1f688.png
deleted file mode 100644
index a64829f50..000000000
--- a/images/emoji/1f688.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f689.png b/images/emoji/1f689.png
deleted file mode 100644
index 5c26fee52..000000000
--- a/images/emoji/1f689.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68a.png b/images/emoji/1f68a.png
deleted file mode 100644
index b6f0e6903..000000000
--- a/images/emoji/1f68a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68b.png b/images/emoji/1f68b.png
deleted file mode 100644
index 3c80321f7..000000000
--- a/images/emoji/1f68b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68c.png b/images/emoji/1f68c.png
deleted file mode 100644
index 641ddc56c..000000000
--- a/images/emoji/1f68c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68d.png b/images/emoji/1f68d.png
deleted file mode 100644
index ad91e256c..000000000
--- a/images/emoji/1f68d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68e.png b/images/emoji/1f68e.png
deleted file mode 100644
index 139a9931b..000000000
--- a/images/emoji/1f68e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f68f.png b/images/emoji/1f68f.png
deleted file mode 100644
index b2b62208b..000000000
--- a/images/emoji/1f68f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f690.png b/images/emoji/1f690.png
deleted file mode 100644
index c60dd8f47..000000000
--- a/images/emoji/1f690.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f691.png b/images/emoji/1f691.png
deleted file mode 100644
index 6fb8076d7..000000000
--- a/images/emoji/1f691.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f692.png b/images/emoji/1f692.png
deleted file mode 100644
index 249ffaabd..000000000
--- a/images/emoji/1f692.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f693.png b/images/emoji/1f693.png
deleted file mode 100644
index 3da4253de..000000000
--- a/images/emoji/1f693.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f694.png b/images/emoji/1f694.png
deleted file mode 100644
index a50388fc9..000000000
--- a/images/emoji/1f694.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f695.png b/images/emoji/1f695.png
deleted file mode 100644
index 55f4cc847..000000000
--- a/images/emoji/1f695.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f696.png b/images/emoji/1f696.png
deleted file mode 100644
index b4a9ddde4..000000000
--- a/images/emoji/1f696.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f697.png b/images/emoji/1f697.png
deleted file mode 100644
index b3e6a774d..000000000
--- a/images/emoji/1f697.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f698.png b/images/emoji/1f698.png
deleted file mode 100644
index 3c7e1d52e..000000000
--- a/images/emoji/1f698.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f699.png b/images/emoji/1f699.png
deleted file mode 100644
index e8ba817d3..000000000
--- a/images/emoji/1f699.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69a.png b/images/emoji/1f69a.png
deleted file mode 100644
index c7677a769..000000000
--- a/images/emoji/1f69a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69b.png b/images/emoji/1f69b.png
deleted file mode 100644
index b3b7742e6..000000000
--- a/images/emoji/1f69b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69c.png b/images/emoji/1f69c.png
deleted file mode 100644
index c1bf8cae4..000000000
--- a/images/emoji/1f69c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69d.png b/images/emoji/1f69d.png
deleted file mode 100644
index 11eb1f574..000000000
--- a/images/emoji/1f69d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69e.png b/images/emoji/1f69e.png
deleted file mode 100644
index d136d60aa..000000000
--- a/images/emoji/1f69e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f69f.png b/images/emoji/1f69f.png
deleted file mode 100644
index a59d5f48c..000000000
--- a/images/emoji/1f69f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a0.png b/images/emoji/1f6a0.png
deleted file mode 100644
index 1dea73ca5..000000000
--- a/images/emoji/1f6a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a1.png b/images/emoji/1f6a1.png
deleted file mode 100644
index 3eb4b61bf..000000000
--- a/images/emoji/1f6a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a2.png b/images/emoji/1f6a2.png
deleted file mode 100644
index 62d54f7d6..000000000
--- a/images/emoji/1f6a2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fb.png b/images/emoji/1f6a3-1f3fb.png
deleted file mode 100644
index 947471874..000000000
--- a/images/emoji/1f6a3-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fc.png b/images/emoji/1f6a3-1f3fc.png
deleted file mode 100644
index 9b123ef88..000000000
--- a/images/emoji/1f6a3-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fd.png b/images/emoji/1f6a3-1f3fd.png
deleted file mode 100644
index 8ebd89a55..000000000
--- a/images/emoji/1f6a3-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3fe.png b/images/emoji/1f6a3-1f3fe.png
deleted file mode 100644
index 2b0d04f87..000000000
--- a/images/emoji/1f6a3-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3-1f3ff.png b/images/emoji/1f6a3-1f3ff.png
deleted file mode 100644
index b346f2dfc..000000000
--- a/images/emoji/1f6a3-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a3.png b/images/emoji/1f6a3.png
deleted file mode 100644
index dd4dfc095..000000000
--- a/images/emoji/1f6a3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a4.png b/images/emoji/1f6a4.png
deleted file mode 100644
index 74059d12d..000000000
--- a/images/emoji/1f6a4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a5.png b/images/emoji/1f6a5.png
deleted file mode 100644
index 6b312285b..000000000
--- a/images/emoji/1f6a5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a6.png b/images/emoji/1f6a6.png
deleted file mode 100644
index 8085973ee..000000000
--- a/images/emoji/1f6a6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a7.png b/images/emoji/1f6a7.png
deleted file mode 100644
index ef8db5f47..000000000
--- a/images/emoji/1f6a7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a8.png b/images/emoji/1f6a8.png
deleted file mode 100644
index cad66b0af..000000000
--- a/images/emoji/1f6a8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6a9.png b/images/emoji/1f6a9.png
deleted file mode 100644
index c12d8b068..000000000
--- a/images/emoji/1f6a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6aa.png b/images/emoji/1f6aa.png
deleted file mode 100644
index 36ae3e274..000000000
--- a/images/emoji/1f6aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ab.png b/images/emoji/1f6ab.png
deleted file mode 100644
index d2efd65e7..000000000
--- a/images/emoji/1f6ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ac.png b/images/emoji/1f6ac.png
deleted file mode 100644
index 910f648c8..000000000
--- a/images/emoji/1f6ac.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ad.png b/images/emoji/1f6ad.png
deleted file mode 100644
index d33b9de53..000000000
--- a/images/emoji/1f6ad.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ae.png b/images/emoji/1f6ae.png
deleted file mode 100644
index 82a84f9a3..000000000
--- a/images/emoji/1f6ae.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6af.png b/images/emoji/1f6af.png
deleted file mode 100644
index 341d2575f..000000000
--- a/images/emoji/1f6af.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b0.png b/images/emoji/1f6b0.png
deleted file mode 100644
index 2c6100494..000000000
--- a/images/emoji/1f6b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b1.png b/images/emoji/1f6b1.png
deleted file mode 100644
index 827d4193f..000000000
--- a/images/emoji/1f6b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b2.png b/images/emoji/1f6b2.png
deleted file mode 100644
index 6125842f8..000000000
--- a/images/emoji/1f6b2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b3.png b/images/emoji/1f6b3.png
deleted file mode 100644
index 19c85421c..000000000
--- a/images/emoji/1f6b3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fb.png b/images/emoji/1f6b4-1f3fb.png
deleted file mode 100644
index decc2f728..000000000
--- a/images/emoji/1f6b4-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fc.png b/images/emoji/1f6b4-1f3fc.png
deleted file mode 100644
index 0067717b8..000000000
--- a/images/emoji/1f6b4-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fd.png b/images/emoji/1f6b4-1f3fd.png
deleted file mode 100644
index a4f7b5e27..000000000
--- a/images/emoji/1f6b4-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3fe.png b/images/emoji/1f6b4-1f3fe.png
deleted file mode 100644
index a3c8a797d..000000000
--- a/images/emoji/1f6b4-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4-1f3ff.png b/images/emoji/1f6b4-1f3ff.png
deleted file mode 100644
index 1606a8740..000000000
--- a/images/emoji/1f6b4-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b4.png b/images/emoji/1f6b4.png
deleted file mode 100644
index 9274da110..000000000
--- a/images/emoji/1f6b4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fb.png b/images/emoji/1f6b5-1f3fb.png
deleted file mode 100644
index e9f1daf5e..000000000
--- a/images/emoji/1f6b5-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fc.png b/images/emoji/1f6b5-1f3fc.png
deleted file mode 100644
index 555b9e29d..000000000
--- a/images/emoji/1f6b5-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fd.png b/images/emoji/1f6b5-1f3fd.png
deleted file mode 100644
index 7df5508ec..000000000
--- a/images/emoji/1f6b5-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3fe.png b/images/emoji/1f6b5-1f3fe.png
deleted file mode 100644
index f94b34506..000000000
--- a/images/emoji/1f6b5-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5-1f3ff.png b/images/emoji/1f6b5-1f3ff.png
deleted file mode 100644
index 16a45861e..000000000
--- a/images/emoji/1f6b5-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b5.png b/images/emoji/1f6b5.png
deleted file mode 100644
index 41d3dc3ac..000000000
--- a/images/emoji/1f6b5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fb.png b/images/emoji/1f6b6-1f3fb.png
deleted file mode 100644
index 4e391b45a..000000000
--- a/images/emoji/1f6b6-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fc.png b/images/emoji/1f6b6-1f3fc.png
deleted file mode 100644
index 31f94a1bc..000000000
--- a/images/emoji/1f6b6-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fd.png b/images/emoji/1f6b6-1f3fd.png
deleted file mode 100644
index f7ed8e39c..000000000
--- a/images/emoji/1f6b6-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3fe.png b/images/emoji/1f6b6-1f3fe.png
deleted file mode 100644
index e58dc04c7..000000000
--- a/images/emoji/1f6b6-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6-1f3ff.png b/images/emoji/1f6b6-1f3ff.png
deleted file mode 100644
index ba4e1b58f..000000000
--- a/images/emoji/1f6b6-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b6.png b/images/emoji/1f6b6.png
deleted file mode 100644
index 06dc169a3..000000000
--- a/images/emoji/1f6b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b7.png b/images/emoji/1f6b7.png
deleted file mode 100644
index 286aa577a..000000000
--- a/images/emoji/1f6b7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b8.png b/images/emoji/1f6b8.png
deleted file mode 100644
index fa4c091c7..000000000
--- a/images/emoji/1f6b8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6b9.png b/images/emoji/1f6b9.png
deleted file mode 100644
index f5a1e1ba0..000000000
--- a/images/emoji/1f6b9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ba.png b/images/emoji/1f6ba.png
deleted file mode 100644
index d4ecc22e7..000000000
--- a/images/emoji/1f6ba.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bb.png b/images/emoji/1f6bb.png
deleted file mode 100644
index 9588e0f0e..000000000
--- a/images/emoji/1f6bb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bc.png b/images/emoji/1f6bc.png
deleted file mode 100644
index 64a10b717..000000000
--- a/images/emoji/1f6bc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bd.png b/images/emoji/1f6bd.png
deleted file mode 100644
index 1392f7618..000000000
--- a/images/emoji/1f6bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6be.png b/images/emoji/1f6be.png
deleted file mode 100644
index aa433e84b..000000000
--- a/images/emoji/1f6be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6bf.png b/images/emoji/1f6bf.png
deleted file mode 100644
index 156776a2e..000000000
--- a/images/emoji/1f6bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fb.png b/images/emoji/1f6c0-1f3fb.png
deleted file mode 100644
index 2152eabf2..000000000
--- a/images/emoji/1f6c0-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fc.png b/images/emoji/1f6c0-1f3fc.png
deleted file mode 100644
index 2102e6133..000000000
--- a/images/emoji/1f6c0-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fd.png b/images/emoji/1f6c0-1f3fd.png
deleted file mode 100644
index fae66181e..000000000
--- a/images/emoji/1f6c0-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3fe.png b/images/emoji/1f6c0-1f3fe.png
deleted file mode 100644
index 1f8959d0d..000000000
--- a/images/emoji/1f6c0-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0-1f3ff.png b/images/emoji/1f6c0-1f3ff.png
deleted file mode 100644
index c8a08e84f..000000000
--- a/images/emoji/1f6c0-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c0.png b/images/emoji/1f6c0.png
deleted file mode 100644
index 43fba5c8a..000000000
--- a/images/emoji/1f6c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c1.png b/images/emoji/1f6c1.png
deleted file mode 100644
index 9a5f09361..000000000
--- a/images/emoji/1f6c1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c2.png b/images/emoji/1f6c2.png
deleted file mode 100644
index 079e34ee4..000000000
--- a/images/emoji/1f6c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c3.png b/images/emoji/1f6c3.png
deleted file mode 100644
index 21b7ce2c6..000000000
--- a/images/emoji/1f6c3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c4.png b/images/emoji/1f6c4.png
deleted file mode 100644
index 409b593e7..000000000
--- a/images/emoji/1f6c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6c5.png b/images/emoji/1f6c5.png
deleted file mode 100644
index 887b23f3f..000000000
--- a/images/emoji/1f6c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cb.png b/images/emoji/1f6cb.png
deleted file mode 100644
index 27b19b13b..000000000
--- a/images/emoji/1f6cb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cc.png b/images/emoji/1f6cc.png
deleted file mode 100644
index c739e7fb6..000000000
--- a/images/emoji/1f6cc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cd.png b/images/emoji/1f6cd.png
deleted file mode 100644
index 99f2a2b13..000000000
--- a/images/emoji/1f6cd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ce.png b/images/emoji/1f6ce.png
deleted file mode 100644
index 6b3297cea..000000000
--- a/images/emoji/1f6ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6cf.png b/images/emoji/1f6cf.png
deleted file mode 100644
index cf75349a3..000000000
--- a/images/emoji/1f6cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d0.png b/images/emoji/1f6d0.png
deleted file mode 100644
index 207d59cce..000000000
--- a/images/emoji/1f6d0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d1.png b/images/emoji/1f6d1.png
deleted file mode 100644
index 5ed610040..000000000
--- a/images/emoji/1f6d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6d2.png b/images/emoji/1f6d2.png
deleted file mode 100644
index 1086fe6e4..000000000
--- a/images/emoji/1f6d2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e0.png b/images/emoji/1f6e0.png
deleted file mode 100644
index 3c6049273..000000000
--- a/images/emoji/1f6e0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e1.png b/images/emoji/1f6e1.png
deleted file mode 100644
index 610bf033c..000000000
--- a/images/emoji/1f6e1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e2.png b/images/emoji/1f6e2.png
deleted file mode 100644
index c4c4d42da..000000000
--- a/images/emoji/1f6e2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e3.png b/images/emoji/1f6e3.png
deleted file mode 100644
index 8c3d3d03e..000000000
--- a/images/emoji/1f6e3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e4.png b/images/emoji/1f6e4.png
deleted file mode 100644
index 3bde6fb65..000000000
--- a/images/emoji/1f6e4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e5.png b/images/emoji/1f6e5.png
deleted file mode 100644
index 0506db1a4..000000000
--- a/images/emoji/1f6e5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6e9.png b/images/emoji/1f6e9.png
deleted file mode 100644
index b731b15e3..000000000
--- a/images/emoji/1f6e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6eb.png b/images/emoji/1f6eb.png
deleted file mode 100644
index a5766f9f4..000000000
--- a/images/emoji/1f6eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6ec.png b/images/emoji/1f6ec.png
deleted file mode 100644
index d66841962..000000000
--- a/images/emoji/1f6ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f0.png b/images/emoji/1f6f0.png
deleted file mode 100644
index 4ba55d6e2..000000000
--- a/images/emoji/1f6f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f3.png b/images/emoji/1f6f3.png
deleted file mode 100644
index 19d4acbe4..000000000
--- a/images/emoji/1f6f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f4.png b/images/emoji/1f6f4.png
deleted file mode 100644
index 4ab7ef59c..000000000
--- a/images/emoji/1f6f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f5.png b/images/emoji/1f6f5.png
deleted file mode 100644
index c5afa72d8..000000000
--- a/images/emoji/1f6f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f6f6.png b/images/emoji/1f6f6.png
deleted file mode 100644
index e26cdb9da..000000000
--- a/images/emoji/1f6f6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f910.png b/images/emoji/1f910.png
deleted file mode 100644
index f8ced2502..000000000
--- a/images/emoji/1f910.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f911.png b/images/emoji/1f911.png
deleted file mode 100644
index 75fd1e90c..000000000
--- a/images/emoji/1f911.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f912.png b/images/emoji/1f912.png
deleted file mode 100644
index 8a1e841af..000000000
--- a/images/emoji/1f912.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f913.png b/images/emoji/1f913.png
deleted file mode 100644
index 7820bd581..000000000
--- a/images/emoji/1f913.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f914.png b/images/emoji/1f914.png
deleted file mode 100644
index c18f6fd14..000000000
--- a/images/emoji/1f914.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f915.png b/images/emoji/1f915.png
deleted file mode 100644
index 53c7be1d2..000000000
--- a/images/emoji/1f915.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f916.png b/images/emoji/1f916.png
deleted file mode 100644
index 7cc62612c..000000000
--- a/images/emoji/1f916.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f917.png b/images/emoji/1f917.png
deleted file mode 100644
index f398b783a..000000000
--- a/images/emoji/1f917.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fb.png b/images/emoji/1f918-1f3fb.png
deleted file mode 100644
index c080d2add..000000000
--- a/images/emoji/1f918-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fc.png b/images/emoji/1f918-1f3fc.png
deleted file mode 100644
index 12313529b..000000000
--- a/images/emoji/1f918-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fd.png b/images/emoji/1f918-1f3fd.png
deleted file mode 100644
index ca9be6ae6..000000000
--- a/images/emoji/1f918-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3fe.png b/images/emoji/1f918-1f3fe.png
deleted file mode 100644
index abe28cbf8..000000000
--- a/images/emoji/1f918-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918-1f3ff.png b/images/emoji/1f918-1f3ff.png
deleted file mode 100644
index 0c6b5dd34..000000000
--- a/images/emoji/1f918-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f918.png b/images/emoji/1f918.png
deleted file mode 100644
index 4aa6e7e0a..000000000
--- a/images/emoji/1f918.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fb.png b/images/emoji/1f919-1f3fb.png
deleted file mode 100644
index 2c9320118..000000000
--- a/images/emoji/1f919-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fc.png b/images/emoji/1f919-1f3fc.png
deleted file mode 100644
index c39f45a41..000000000
--- a/images/emoji/1f919-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fd.png b/images/emoji/1f919-1f3fd.png
deleted file mode 100644
index 83a57f63c..000000000
--- a/images/emoji/1f919-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3fe.png b/images/emoji/1f919-1f3fe.png
deleted file mode 100644
index 65b3468fe..000000000
--- a/images/emoji/1f919-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919-1f3ff.png b/images/emoji/1f919-1f3ff.png
deleted file mode 100644
index 94ef68ff3..000000000
--- a/images/emoji/1f919-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f919.png b/images/emoji/1f919.png
deleted file mode 100644
index a10c59ba7..000000000
--- a/images/emoji/1f919.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fb.png b/images/emoji/1f91a-1f3fb.png
deleted file mode 100644
index 813d28499..000000000
--- a/images/emoji/1f91a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fc.png b/images/emoji/1f91a-1f3fc.png
deleted file mode 100644
index 192ff795e..000000000
--- a/images/emoji/1f91a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fd.png b/images/emoji/1f91a-1f3fd.png
deleted file mode 100644
index 61a727abe..000000000
--- a/images/emoji/1f91a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3fe.png b/images/emoji/1f91a-1f3fe.png
deleted file mode 100644
index 2e83da511..000000000
--- a/images/emoji/1f91a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a-1f3ff.png b/images/emoji/1f91a-1f3ff.png
deleted file mode 100644
index d7a5b95a0..000000000
--- a/images/emoji/1f91a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91a.png b/images/emoji/1f91a.png
deleted file mode 100644
index 479234294..000000000
--- a/images/emoji/1f91a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fb.png b/images/emoji/1f91b-1f3fb.png
deleted file mode 100644
index 1262a6b4b..000000000
--- a/images/emoji/1f91b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fc.png b/images/emoji/1f91b-1f3fc.png
deleted file mode 100644
index 40bf70b82..000000000
--- a/images/emoji/1f91b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fd.png b/images/emoji/1f91b-1f3fd.png
deleted file mode 100644
index 93f581451..000000000
--- a/images/emoji/1f91b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3fe.png b/images/emoji/1f91b-1f3fe.png
deleted file mode 100644
index d82b5ec91..000000000
--- a/images/emoji/1f91b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b-1f3ff.png b/images/emoji/1f91b-1f3ff.png
deleted file mode 100644
index 09ae4cd49..000000000
--- a/images/emoji/1f91b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91b.png b/images/emoji/1f91b.png
deleted file mode 100644
index a9d9fd8d5..000000000
--- a/images/emoji/1f91b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fb.png b/images/emoji/1f91c-1f3fb.png
deleted file mode 100644
index 33ded2f61..000000000
--- a/images/emoji/1f91c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fc.png b/images/emoji/1f91c-1f3fc.png
deleted file mode 100644
index 88054e335..000000000
--- a/images/emoji/1f91c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fd.png b/images/emoji/1f91c-1f3fd.png
deleted file mode 100644
index 84b9f5da7..000000000
--- a/images/emoji/1f91c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3fe.png b/images/emoji/1f91c-1f3fe.png
deleted file mode 100644
index e741cfea6..000000000
--- a/images/emoji/1f91c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c-1f3ff.png b/images/emoji/1f91c-1f3ff.png
deleted file mode 100644
index cf66d760c..000000000
--- a/images/emoji/1f91c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91c.png b/images/emoji/1f91c.png
deleted file mode 100644
index 754ed066d..000000000
--- a/images/emoji/1f91c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fb.png b/images/emoji/1f91d-1f3fb.png
deleted file mode 100644
index 255fc7ec6..000000000
--- a/images/emoji/1f91d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fc.png b/images/emoji/1f91d-1f3fc.png
deleted file mode 100644
index 1aec7450e..000000000
--- a/images/emoji/1f91d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fd.png b/images/emoji/1f91d-1f3fd.png
deleted file mode 100644
index 104d65691..000000000
--- a/images/emoji/1f91d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3fe.png b/images/emoji/1f91d-1f3fe.png
deleted file mode 100644
index 999966d4b..000000000
--- a/images/emoji/1f91d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d-1f3ff.png b/images/emoji/1f91d-1f3ff.png
deleted file mode 100644
index 9a38f1b66..000000000
--- a/images/emoji/1f91d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91d.png b/images/emoji/1f91d.png
deleted file mode 100644
index 75e8d58e9..000000000
--- a/images/emoji/1f91d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fb.png b/images/emoji/1f91e-1f3fb.png
deleted file mode 100644
index dd2384a6c..000000000
--- a/images/emoji/1f91e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fc.png b/images/emoji/1f91e-1f3fc.png
deleted file mode 100644
index 6228401be..000000000
--- a/images/emoji/1f91e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fd.png b/images/emoji/1f91e-1f3fd.png
deleted file mode 100644
index b1074da15..000000000
--- a/images/emoji/1f91e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3fe.png b/images/emoji/1f91e-1f3fe.png
deleted file mode 100644
index 75e05e4d3..000000000
--- a/images/emoji/1f91e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e-1f3ff.png b/images/emoji/1f91e-1f3ff.png
deleted file mode 100644
index 761aebdc3..000000000
--- a/images/emoji/1f91e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f91e.png b/images/emoji/1f91e.png
deleted file mode 100644
index 4cd18514e..000000000
--- a/images/emoji/1f91e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f920.png b/images/emoji/1f920.png
deleted file mode 100644
index e67709b88..000000000
--- a/images/emoji/1f920.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f921.png b/images/emoji/1f921.png
deleted file mode 100644
index f0e05bac4..000000000
--- a/images/emoji/1f921.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f922.png b/images/emoji/1f922.png
deleted file mode 100644
index a566c109c..000000000
--- a/images/emoji/1f922.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f923.png b/images/emoji/1f923.png
deleted file mode 100644
index b1736fedf..000000000
--- a/images/emoji/1f923.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f924.png b/images/emoji/1f924.png
deleted file mode 100644
index a54605325..000000000
--- a/images/emoji/1f924.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f925.png b/images/emoji/1f925.png
deleted file mode 100644
index 02827e262..000000000
--- a/images/emoji/1f925.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fb.png b/images/emoji/1f926-1f3fb.png
deleted file mode 100644
index 2f4b010bb..000000000
--- a/images/emoji/1f926-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fc.png b/images/emoji/1f926-1f3fc.png
deleted file mode 100644
index 9cba0b0e1..000000000
--- a/images/emoji/1f926-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fd.png b/images/emoji/1f926-1f3fd.png
deleted file mode 100644
index b5b5c1e53..000000000
--- a/images/emoji/1f926-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3fe.png b/images/emoji/1f926-1f3fe.png
deleted file mode 100644
index 2840b1134..000000000
--- a/images/emoji/1f926-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926-1f3ff.png b/images/emoji/1f926-1f3ff.png
deleted file mode 100644
index 6f070db98..000000000
--- a/images/emoji/1f926-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f926.png b/images/emoji/1f926.png
deleted file mode 100644
index defc796cf..000000000
--- a/images/emoji/1f926.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f927.png b/images/emoji/1f927.png
deleted file mode 100644
index d6c796746..000000000
--- a/images/emoji/1f927.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fb.png b/images/emoji/1f930-1f3fb.png
deleted file mode 100644
index a78703b33..000000000
--- a/images/emoji/1f930-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fc.png b/images/emoji/1f930-1f3fc.png
deleted file mode 100644
index 0068c6c4a..000000000
--- a/images/emoji/1f930-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fd.png b/images/emoji/1f930-1f3fd.png
deleted file mode 100644
index 3206296b6..000000000
--- a/images/emoji/1f930-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3fe.png b/images/emoji/1f930-1f3fe.png
deleted file mode 100644
index 120fda5cd..000000000
--- a/images/emoji/1f930-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930-1f3ff.png b/images/emoji/1f930-1f3ff.png
deleted file mode 100644
index 569bfdf05..000000000
--- a/images/emoji/1f930-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f930.png b/images/emoji/1f930.png
deleted file mode 100644
index 084e83a41..000000000
--- a/images/emoji/1f930.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fb.png b/images/emoji/1f933-1f3fb.png
deleted file mode 100644
index 290e075b5..000000000
--- a/images/emoji/1f933-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fc.png b/images/emoji/1f933-1f3fc.png
deleted file mode 100644
index fcd9595b6..000000000
--- a/images/emoji/1f933-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fd.png b/images/emoji/1f933-1f3fd.png
deleted file mode 100644
index f3a22fdf4..000000000
--- a/images/emoji/1f933-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3fe.png b/images/emoji/1f933-1f3fe.png
deleted file mode 100644
index cdecf6d9f..000000000
--- a/images/emoji/1f933-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933-1f3ff.png b/images/emoji/1f933-1f3ff.png
deleted file mode 100644
index 86acbb6c2..000000000
--- a/images/emoji/1f933-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f933.png b/images/emoji/1f933.png
deleted file mode 100644
index 6a1ba75c7..000000000
--- a/images/emoji/1f933.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fb.png b/images/emoji/1f934-1f3fb.png
deleted file mode 100644
index 9102f9c46..000000000
--- a/images/emoji/1f934-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fc.png b/images/emoji/1f934-1f3fc.png
deleted file mode 100644
index 23d8b3b12..000000000
--- a/images/emoji/1f934-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fd.png b/images/emoji/1f934-1f3fd.png
deleted file mode 100644
index e7692efb7..000000000
--- a/images/emoji/1f934-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3fe.png b/images/emoji/1f934-1f3fe.png
deleted file mode 100644
index 8e10f8be6..000000000
--- a/images/emoji/1f934-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934-1f3ff.png b/images/emoji/1f934-1f3ff.png
deleted file mode 100644
index 138d4ea70..000000000
--- a/images/emoji/1f934-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f934.png b/images/emoji/1f934.png
deleted file mode 100644
index 38d69344c..000000000
--- a/images/emoji/1f934.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fb.png b/images/emoji/1f935-1f3fb.png
deleted file mode 100644
index 7b6b3acd9..000000000
--- a/images/emoji/1f935-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fc.png b/images/emoji/1f935-1f3fc.png
deleted file mode 100644
index 7975191b3..000000000
--- a/images/emoji/1f935-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fd.png b/images/emoji/1f935-1f3fd.png
deleted file mode 100644
index a2816f600..000000000
--- a/images/emoji/1f935-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3fe.png b/images/emoji/1f935-1f3fe.png
deleted file mode 100644
index ea8291760..000000000
--- a/images/emoji/1f935-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935-1f3ff.png b/images/emoji/1f935-1f3ff.png
deleted file mode 100644
index c743e05fc..000000000
--- a/images/emoji/1f935-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f935.png b/images/emoji/1f935.png
deleted file mode 100644
index 5f7e9303f..000000000
--- a/images/emoji/1f935.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fb.png b/images/emoji/1f936-1f3fb.png
deleted file mode 100644
index d8a695d70..000000000
--- a/images/emoji/1f936-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fc.png b/images/emoji/1f936-1f3fc.png
deleted file mode 100644
index 0e17e8c51..000000000
--- a/images/emoji/1f936-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fd.png b/images/emoji/1f936-1f3fd.png
deleted file mode 100644
index 195ebc400..000000000
--- a/images/emoji/1f936-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3fe.png b/images/emoji/1f936-1f3fe.png
deleted file mode 100644
index 68a556da2..000000000
--- a/images/emoji/1f936-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936-1f3ff.png b/images/emoji/1f936-1f3ff.png
deleted file mode 100644
index ccab3c40f..000000000
--- a/images/emoji/1f936-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f936.png b/images/emoji/1f936.png
deleted file mode 100644
index 078f0657f..000000000
--- a/images/emoji/1f936.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fb.png b/images/emoji/1f937-1f3fb.png
deleted file mode 100644
index 1c895e644..000000000
--- a/images/emoji/1f937-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fc.png b/images/emoji/1f937-1f3fc.png
deleted file mode 100644
index d76ac4b19..000000000
--- a/images/emoji/1f937-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fd.png b/images/emoji/1f937-1f3fd.png
deleted file mode 100644
index dc3a5a9fb..000000000
--- a/images/emoji/1f937-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3fe.png b/images/emoji/1f937-1f3fe.png
deleted file mode 100644
index 5fbef3f22..000000000
--- a/images/emoji/1f937-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937-1f3ff.png b/images/emoji/1f937-1f3ff.png
deleted file mode 100644
index 303640fe7..000000000
--- a/images/emoji/1f937-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f937.png b/images/emoji/1f937.png
deleted file mode 100644
index 76e63bfac..000000000
--- a/images/emoji/1f937.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fb.png b/images/emoji/1f938-1f3fb.png
deleted file mode 100644
index db6d65895..000000000
--- a/images/emoji/1f938-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fc.png b/images/emoji/1f938-1f3fc.png
deleted file mode 100644
index e00ffbc27..000000000
--- a/images/emoji/1f938-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fd.png b/images/emoji/1f938-1f3fd.png
deleted file mode 100644
index 49321be39..000000000
--- a/images/emoji/1f938-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3fe.png b/images/emoji/1f938-1f3fe.png
deleted file mode 100644
index d4562b5e3..000000000
--- a/images/emoji/1f938-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938-1f3ff.png b/images/emoji/1f938-1f3ff.png
deleted file mode 100644
index 6e09a8707..000000000
--- a/images/emoji/1f938-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f938.png b/images/emoji/1f938.png
deleted file mode 100644
index cbcaa5782..000000000
--- a/images/emoji/1f938.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fb.png b/images/emoji/1f939-1f3fb.png
deleted file mode 100644
index c18eda400..000000000
--- a/images/emoji/1f939-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fc.png b/images/emoji/1f939-1f3fc.png
deleted file mode 100644
index de3b7a555..000000000
--- a/images/emoji/1f939-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fd.png b/images/emoji/1f939-1f3fd.png
deleted file mode 100644
index 74ab6d854..000000000
--- a/images/emoji/1f939-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3fe.png b/images/emoji/1f939-1f3fe.png
deleted file mode 100644
index 1c5782320..000000000
--- a/images/emoji/1f939-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939-1f3ff.png b/images/emoji/1f939-1f3ff.png
deleted file mode 100644
index c343d6ee9..000000000
--- a/images/emoji/1f939-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f939.png b/images/emoji/1f939.png
deleted file mode 100644
index a37f6224a..000000000
--- a/images/emoji/1f939.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93a.png b/images/emoji/1f93a.png
deleted file mode 100644
index 9f6cb6ff8..000000000
--- a/images/emoji/1f93a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fb.png b/images/emoji/1f93b-1f3fb.png
deleted file mode 100644
index f29209325..000000000
--- a/images/emoji/1f93b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fc.png b/images/emoji/1f93b-1f3fc.png
deleted file mode 100644
index fea2cc7ee..000000000
--- a/images/emoji/1f93b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fd.png b/images/emoji/1f93b-1f3fd.png
deleted file mode 100644
index 030f32fdd..000000000
--- a/images/emoji/1f93b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3fe.png b/images/emoji/1f93b-1f3fe.png
deleted file mode 100644
index d4d011091..000000000
--- a/images/emoji/1f93b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b-1f3ff.png b/images/emoji/1f93b-1f3ff.png
deleted file mode 100644
index 69a9789f5..000000000
--- a/images/emoji/1f93b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93b.png b/images/emoji/1f93b.png
deleted file mode 100644
index 71e67cfad..000000000
--- a/images/emoji/1f93b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fb.png b/images/emoji/1f93c-1f3fb.png
deleted file mode 100644
index 379070fd0..000000000
--- a/images/emoji/1f93c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fc.png b/images/emoji/1f93c-1f3fc.png
deleted file mode 100644
index 6863ea920..000000000
--- a/images/emoji/1f93c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fd.png b/images/emoji/1f93c-1f3fd.png
deleted file mode 100644
index b7e629101..000000000
--- a/images/emoji/1f93c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3fe.png b/images/emoji/1f93c-1f3fe.png
deleted file mode 100644
index 750f95892..000000000
--- a/images/emoji/1f93c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c-1f3ff.png b/images/emoji/1f93c-1f3ff.png
deleted file mode 100644
index 36ab9bb3f..000000000
--- a/images/emoji/1f93c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93c.png b/images/emoji/1f93c.png
deleted file mode 100644
index 9838f24e5..000000000
--- a/images/emoji/1f93c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fb.png b/images/emoji/1f93d-1f3fb.png
deleted file mode 100644
index bed1a908d..000000000
--- a/images/emoji/1f93d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fc.png b/images/emoji/1f93d-1f3fc.png
deleted file mode 100644
index 2e44151d3..000000000
--- a/images/emoji/1f93d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fd.png b/images/emoji/1f93d-1f3fd.png
deleted file mode 100644
index b081a4a5a..000000000
--- a/images/emoji/1f93d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3fe.png b/images/emoji/1f93d-1f3fe.png
deleted file mode 100644
index 82cfbc3b0..000000000
--- a/images/emoji/1f93d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d-1f3ff.png b/images/emoji/1f93d-1f3ff.png
deleted file mode 100644
index 6b8e245dc..000000000
--- a/images/emoji/1f93d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93d.png b/images/emoji/1f93d.png
deleted file mode 100644
index 8d6114761..000000000
--- a/images/emoji/1f93d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fb.png b/images/emoji/1f93e-1f3fb.png
deleted file mode 100644
index a68057a7d..000000000
--- a/images/emoji/1f93e-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fc.png b/images/emoji/1f93e-1f3fc.png
deleted file mode 100644
index 74972f8a5..000000000
--- a/images/emoji/1f93e-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fd.png b/images/emoji/1f93e-1f3fd.png
deleted file mode 100644
index 0e3a37c3d..000000000
--- a/images/emoji/1f93e-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3fe.png b/images/emoji/1f93e-1f3fe.png
deleted file mode 100644
index e1233f382..000000000
--- a/images/emoji/1f93e-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e-1f3ff.png b/images/emoji/1f93e-1f3ff.png
deleted file mode 100644
index 6b1eb9b64..000000000
--- a/images/emoji/1f93e-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93e.png b/images/emoji/1f93e.png
deleted file mode 100644
index cb4457678..000000000
--- a/images/emoji/1f93e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f93f.png b/images/emoji/1f93f.png
deleted file mode 100644
index 677c060b4..000000000
--- a/images/emoji/1f93f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f940.png b/images/emoji/1f940.png
deleted file mode 100644
index 62412b143..000000000
--- a/images/emoji/1f940.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f942.png b/images/emoji/1f942.png
deleted file mode 100644
index 32f18d4c9..000000000
--- a/images/emoji/1f942.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f943.png b/images/emoji/1f943.png
deleted file mode 100644
index 7bf092298..000000000
--- a/images/emoji/1f943.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f944.png b/images/emoji/1f944.png
deleted file mode 100644
index 3c4da766a..000000000
--- a/images/emoji/1f944.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f945.png b/images/emoji/1f945.png
deleted file mode 100644
index 3bec11c5b..000000000
--- a/images/emoji/1f945.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f946.png b/images/emoji/1f946.png
deleted file mode 100644
index 2815a1bb3..000000000
--- a/images/emoji/1f946.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f947.png b/images/emoji/1f947.png
deleted file mode 100644
index 83011ad99..000000000
--- a/images/emoji/1f947.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f948.png b/images/emoji/1f948.png
deleted file mode 100644
index 41926fcf5..000000000
--- a/images/emoji/1f948.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f949.png b/images/emoji/1f949.png
deleted file mode 100644
index c713851bc..000000000
--- a/images/emoji/1f949.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f950.png b/images/emoji/1f950.png
deleted file mode 100644
index 502df5b15..000000000
--- a/images/emoji/1f950.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f951.png b/images/emoji/1f951.png
deleted file mode 100644
index 96b847232..000000000
--- a/images/emoji/1f951.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f952.png b/images/emoji/1f952.png
deleted file mode 100644
index c01fd0edd..000000000
--- a/images/emoji/1f952.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f953.png b/images/emoji/1f953.png
deleted file mode 100644
index f38a485fb..000000000
--- a/images/emoji/1f953.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f954.png b/images/emoji/1f954.png
deleted file mode 100644
index 5fa341216..000000000
--- a/images/emoji/1f954.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f955.png b/images/emoji/1f955.png
deleted file mode 100644
index c68829b58..000000000
--- a/images/emoji/1f955.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f956.png b/images/emoji/1f956.png
deleted file mode 100644
index 72477ff78..000000000
--- a/images/emoji/1f956.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f957.png b/images/emoji/1f957.png
deleted file mode 100644
index c89f93411..000000000
--- a/images/emoji/1f957.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f958.png b/images/emoji/1f958.png
deleted file mode 100644
index 663a1006a..000000000
--- a/images/emoji/1f958.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f959.png b/images/emoji/1f959.png
deleted file mode 100644
index a2e10df40..000000000
--- a/images/emoji/1f959.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95a.png b/images/emoji/1f95a.png
deleted file mode 100644
index c171974d9..000000000
--- a/images/emoji/1f95a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95b.png b/images/emoji/1f95b.png
deleted file mode 100644
index e4fcf2e64..000000000
--- a/images/emoji/1f95b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95c.png b/images/emoji/1f95c.png
deleted file mode 100644
index b64fadad0..000000000
--- a/images/emoji/1f95c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95d.png b/images/emoji/1f95d.png
deleted file mode 100644
index f04835776..000000000
--- a/images/emoji/1f95d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f95e.png b/images/emoji/1f95e.png
deleted file mode 100644
index 6223d1a28..000000000
--- a/images/emoji/1f95e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f960.png b/images/emoji/1f960.png
deleted file mode 100644
index e890c30d4..000000000
--- a/images/emoji/1f960.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f961.png b/images/emoji/1f961.png
deleted file mode 100644
index 4d09f0ee4..000000000
--- a/images/emoji/1f961.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f980.png b/images/emoji/1f980.png
deleted file mode 100644
index ca9350f51..000000000
--- a/images/emoji/1f980.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f981.png b/images/emoji/1f981.png
deleted file mode 100644
index 5062ab47e..000000000
--- a/images/emoji/1f981.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f982.png b/images/emoji/1f982.png
deleted file mode 100644
index 449a6b281..000000000
--- a/images/emoji/1f982.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f983.png b/images/emoji/1f983.png
deleted file mode 100644
index 344af94c9..000000000
--- a/images/emoji/1f983.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f984.png b/images/emoji/1f984.png
deleted file mode 100644
index 05a97969f..000000000
--- a/images/emoji/1f984.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f985.png b/images/emoji/1f985.png
deleted file mode 100644
index 4f277debe..000000000
--- a/images/emoji/1f985.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f986.png b/images/emoji/1f986.png
deleted file mode 100644
index 74330b77c..000000000
--- a/images/emoji/1f986.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f987.png b/images/emoji/1f987.png
deleted file mode 100644
index c8f23c515..000000000
--- a/images/emoji/1f987.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f988.png b/images/emoji/1f988.png
deleted file mode 100644
index c75076d57..000000000
--- a/images/emoji/1f988.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f989.png b/images/emoji/1f989.png
deleted file mode 100644
index a2c318b15..000000000
--- a/images/emoji/1f989.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98a.png b/images/emoji/1f98a.png
deleted file mode 100644
index aaf1dad35..000000000
--- a/images/emoji/1f98a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98b.png b/images/emoji/1f98b.png
deleted file mode 100644
index 5631fe992..000000000
--- a/images/emoji/1f98b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98c.png b/images/emoji/1f98c.png
deleted file mode 100644
index 4a501f880..000000000
--- a/images/emoji/1f98c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98d.png b/images/emoji/1f98d.png
deleted file mode 100644
index 4f2f9bb38..000000000
--- a/images/emoji/1f98d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98e.png b/images/emoji/1f98e.png
deleted file mode 100644
index 836387605..000000000
--- a/images/emoji/1f98e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f98f.png b/images/emoji/1f98f.png
deleted file mode 100644
index 12f4e0d9d..000000000
--- a/images/emoji/1f98f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f990.png b/images/emoji/1f990.png
deleted file mode 100644
index 49eff28a7..000000000
--- a/images/emoji/1f990.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f991.png b/images/emoji/1f991.png
deleted file mode 100644
index f01eeba24..000000000
--- a/images/emoji/1f991.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/1f9c0.png b/images/emoji/1f9c0.png
deleted file mode 100644
index 00e997622..000000000
--- a/images/emoji/1f9c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/203c.png b/images/emoji/203c.png
deleted file mode 100644
index 58a9c528f..000000000
--- a/images/emoji/203c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2049.png b/images/emoji/2049.png
deleted file mode 100644
index 509813e9b..000000000
--- a/images/emoji/2049.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2122.png b/images/emoji/2122.png
deleted file mode 100644
index 7a0c44a2c..000000000
--- a/images/emoji/2122.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2139.png b/images/emoji/2139.png
deleted file mode 100644
index 871f2db93..000000000
--- a/images/emoji/2139.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2194.png b/images/emoji/2194.png
deleted file mode 100644
index 7937f24f2..000000000
--- a/images/emoji/2194.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2195.png b/images/emoji/2195.png
deleted file mode 100644
index dfa32b971..000000000
--- a/images/emoji/2195.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2196.png b/images/emoji/2196.png
deleted file mode 100644
index f38718fbe..000000000
--- a/images/emoji/2196.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2197.png b/images/emoji/2197.png
deleted file mode 100644
index c43e12d0f..000000000
--- a/images/emoji/2197.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2198.png b/images/emoji/2198.png
deleted file mode 100644
index 7e807da73..000000000
--- a/images/emoji/2198.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2199.png b/images/emoji/2199.png
deleted file mode 100644
index 88b377160..000000000
--- a/images/emoji/2199.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/21a9.png b/images/emoji/21a9.png
deleted file mode 100644
index ba45c2ad9..000000000
--- a/images/emoji/21a9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/21aa.png b/images/emoji/21aa.png
deleted file mode 100644
index e7258ad32..000000000
--- a/images/emoji/21aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/231a.png b/images/emoji/231a.png
deleted file mode 100644
index 64819bc6e..000000000
--- a/images/emoji/231a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/231b.png b/images/emoji/231b.png
deleted file mode 100644
index a5db2d1d3..000000000
--- a/images/emoji/231b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2328.png b/images/emoji/2328.png
deleted file mode 100644
index 75027cb9a..000000000
--- a/images/emoji/2328.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23cf.png b/images/emoji/23cf.png
deleted file mode 100644
index ec5cfc489..000000000
--- a/images/emoji/23cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23e9.png b/images/emoji/23e9.png
deleted file mode 100644
index c406fedfd..000000000
--- a/images/emoji/23e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ea.png b/images/emoji/23ea.png
deleted file mode 100644
index e22e2bd3d..000000000
--- a/images/emoji/23ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23eb.png b/images/emoji/23eb.png
deleted file mode 100644
index 13543d5ee..000000000
--- a/images/emoji/23eb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ec.png b/images/emoji/23ec.png
deleted file mode 100644
index 90193bfcb..000000000
--- a/images/emoji/23ec.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ed.png b/images/emoji/23ed.png
deleted file mode 100644
index f8880d33b..000000000
--- a/images/emoji/23ed.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ee.png b/images/emoji/23ee.png
deleted file mode 100644
index 1ffd0566c..000000000
--- a/images/emoji/23ee.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23ef.png b/images/emoji/23ef.png
deleted file mode 100644
index a9f857139..000000000
--- a/images/emoji/23ef.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f0.png b/images/emoji/23f0.png
deleted file mode 100644
index cdbc2fbb9..000000000
--- a/images/emoji/23f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f1.png b/images/emoji/23f1.png
deleted file mode 100644
index 6a3a2ef64..000000000
--- a/images/emoji/23f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f2.png b/images/emoji/23f2.png
deleted file mode 100644
index 8a3be574c..000000000
--- a/images/emoji/23f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f3.png b/images/emoji/23f3.png
deleted file mode 100644
index b93b15ed6..000000000
--- a/images/emoji/23f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f8.png b/images/emoji/23f8.png
deleted file mode 100644
index 4f07e7ebf..000000000
--- a/images/emoji/23f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23f9.png b/images/emoji/23f9.png
deleted file mode 100644
index cfa99988a..000000000
--- a/images/emoji/23f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/23fa.png b/images/emoji/23fa.png
deleted file mode 100644
index ada52830f..000000000
--- a/images/emoji/23fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/24c2.png b/images/emoji/24c2.png
deleted file mode 100644
index 8a3506fc1..000000000
--- a/images/emoji/24c2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25aa.png b/images/emoji/25aa.png
deleted file mode 100644
index 48595d3e1..000000000
--- a/images/emoji/25aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25ab.png b/images/emoji/25ab.png
deleted file mode 100644
index d7ebdb0c0..000000000
--- a/images/emoji/25ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25b6.png b/images/emoji/25b6.png
deleted file mode 100644
index 4e2b68285..000000000
--- a/images/emoji/25b6.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25c0.png b/images/emoji/25c0.png
deleted file mode 100644
index ee38e3b03..000000000
--- a/images/emoji/25c0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fb.png b/images/emoji/25fb.png
deleted file mode 100644
index 8daacf570..000000000
--- a/images/emoji/25fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fc.png b/images/emoji/25fc.png
deleted file mode 100644
index 05a30a6aa..000000000
--- a/images/emoji/25fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fd.png b/images/emoji/25fd.png
deleted file mode 100644
index ae8741267..000000000
--- a/images/emoji/25fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/25fe.png b/images/emoji/25fe.png
deleted file mode 100644
index 39765bba6..000000000
--- a/images/emoji/25fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2600.png b/images/emoji/2600.png
deleted file mode 100644
index fd521ae31..000000000
--- a/images/emoji/2600.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2601.png b/images/emoji/2601.png
deleted file mode 100644
index 5b4f57f77..000000000
--- a/images/emoji/2601.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2602.png b/images/emoji/2602.png
deleted file mode 100644
index 97fe859e7..000000000
--- a/images/emoji/2602.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2603.png b/images/emoji/2603.png
deleted file mode 100644
index 896f28502..000000000
--- a/images/emoji/2603.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2604.png b/images/emoji/2604.png
deleted file mode 100644
index d775d6387..000000000
--- a/images/emoji/2604.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/260e.png b/images/emoji/260e.png
deleted file mode 100644
index 0fbb8c12c..000000000
--- a/images/emoji/260e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2611.png b/images/emoji/2611.png
deleted file mode 100644
index 284d95738..000000000
--- a/images/emoji/2611.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2614.png b/images/emoji/2614.png
deleted file mode 100644
index 5b35b7ff6..000000000
--- a/images/emoji/2614.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2615.png b/images/emoji/2615.png
deleted file mode 100644
index 553061471..000000000
--- a/images/emoji/2615.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2618.png b/images/emoji/2618.png
deleted file mode 100644
index f202aecfe..000000000
--- a/images/emoji/2618.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fb.png b/images/emoji/261d-1f3fb.png
deleted file mode 100644
index 6a9db21d6..000000000
--- a/images/emoji/261d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fc.png b/images/emoji/261d-1f3fc.png
deleted file mode 100644
index 15aa9ea0e..000000000
--- a/images/emoji/261d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fd.png b/images/emoji/261d-1f3fd.png
deleted file mode 100644
index 652b73a9c..000000000
--- a/images/emoji/261d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3fe.png b/images/emoji/261d-1f3fe.png
deleted file mode 100644
index 692bad926..000000000
--- a/images/emoji/261d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d-1f3ff.png b/images/emoji/261d-1f3ff.png
deleted file mode 100644
index 1e1b10fb7..000000000
--- a/images/emoji/261d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/261d.png b/images/emoji/261d.png
deleted file mode 100644
index f4978ff0f..000000000
--- a/images/emoji/261d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2620.png b/images/emoji/2620.png
deleted file mode 100644
index b459df922..000000000
--- a/images/emoji/2620.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2622.png b/images/emoji/2622.png
deleted file mode 100644
index 3b46199fe..000000000
--- a/images/emoji/2622.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2623.png b/images/emoji/2623.png
deleted file mode 100644
index 007b4fc2d..000000000
--- a/images/emoji/2623.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2626.png b/images/emoji/2626.png
deleted file mode 100644
index 0530e33a4..000000000
--- a/images/emoji/2626.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262a.png b/images/emoji/262a.png
deleted file mode 100644
index e18263645..000000000
--- a/images/emoji/262a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262e.png b/images/emoji/262e.png
deleted file mode 100644
index 86033faf4..000000000
--- a/images/emoji/262e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/262f.png b/images/emoji/262f.png
deleted file mode 100644
index f2900f633..000000000
--- a/images/emoji/262f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2638.png b/images/emoji/2638.png
deleted file mode 100644
index 3666db001..000000000
--- a/images/emoji/2638.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2639.png b/images/emoji/2639.png
deleted file mode 100644
index 6ae71f233..000000000
--- a/images/emoji/2639.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/263a.png b/images/emoji/263a.png
deleted file mode 100644
index e9e53c03d..000000000
--- a/images/emoji/263a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2648.png b/images/emoji/2648.png
deleted file mode 100644
index 21a189d0e..000000000
--- a/images/emoji/2648.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2649.png b/images/emoji/2649.png
deleted file mode 100644
index b2a370df4..000000000
--- a/images/emoji/2649.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264a.png b/images/emoji/264a.png
deleted file mode 100644
index 1a09698cf..000000000
--- a/images/emoji/264a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264b.png b/images/emoji/264b.png
deleted file mode 100644
index a64af07cb..000000000
--- a/images/emoji/264b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264c.png b/images/emoji/264c.png
deleted file mode 100644
index 30158d34d..000000000
--- a/images/emoji/264c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264d.png b/images/emoji/264d.png
deleted file mode 100644
index a6b56c2cb..000000000
--- a/images/emoji/264d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264e.png b/images/emoji/264e.png
deleted file mode 100644
index 8fd133a35..000000000
--- a/images/emoji/264e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/264f.png b/images/emoji/264f.png
deleted file mode 100644
index c31a99204..000000000
--- a/images/emoji/264f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2650.png b/images/emoji/2650.png
deleted file mode 100644
index f8d94ff29..000000000
--- a/images/emoji/2650.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2651.png b/images/emoji/2651.png
deleted file mode 100644
index 6293d31d4..000000000
--- a/images/emoji/2651.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2652.png b/images/emoji/2652.png
deleted file mode 100644
index 641a4f688..000000000
--- a/images/emoji/2652.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2653.png b/images/emoji/2653.png
deleted file mode 100644
index 7f6f646a9..000000000
--- a/images/emoji/2653.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2660.png b/images/emoji/2660.png
deleted file mode 100644
index f822f184c..000000000
--- a/images/emoji/2660.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2663.png b/images/emoji/2663.png
deleted file mode 100644
index 4f2abf791..000000000
--- a/images/emoji/2663.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2666.png b/images/emoji/2666.png
deleted file mode 100644
index 1f25f51f9..000000000
--- a/images/emoji/2666.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2668.png b/images/emoji/2668.png
deleted file mode 100644
index 3d9df2d94..000000000
--- a/images/emoji/2668.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/267b.png b/images/emoji/267b.png
deleted file mode 100644
index 9221f095c..000000000
--- a/images/emoji/267b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/267f.png b/images/emoji/267f.png
deleted file mode 100644
index 4e5b2698e..000000000
--- a/images/emoji/267f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2692.png b/images/emoji/2692.png
deleted file mode 100644
index 3bee30ec5..000000000
--- a/images/emoji/2692.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2693.png b/images/emoji/2693.png
deleted file mode 100644
index b036f70a0..000000000
--- a/images/emoji/2693.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2694.png b/images/emoji/2694.png
deleted file mode 100644
index 907e96071..000000000
--- a/images/emoji/2694.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2696.png b/images/emoji/2696.png
deleted file mode 100644
index 0757eda16..000000000
--- a/images/emoji/2696.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2697.png b/images/emoji/2697.png
deleted file mode 100644
index 307a73242..000000000
--- a/images/emoji/2697.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2699.png b/images/emoji/2699.png
deleted file mode 100644
index 2a1cc2c0f..000000000
--- a/images/emoji/2699.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/269b.png b/images/emoji/269b.png
deleted file mode 100644
index 5f4567aa0..000000000
--- a/images/emoji/269b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/269c.png b/images/emoji/269c.png
deleted file mode 100644
index c9250d27f..000000000
--- a/images/emoji/269c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26a0.png b/images/emoji/26a0.png
deleted file mode 100644
index 35691c2ed..000000000
--- a/images/emoji/26a0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26a1.png b/images/emoji/26a1.png
deleted file mode 100644
index 47e68e48e..000000000
--- a/images/emoji/26a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26aa.png b/images/emoji/26aa.png
deleted file mode 100644
index c19e15684..000000000
--- a/images/emoji/26aa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ab.png b/images/emoji/26ab.png
deleted file mode 100644
index b62b87170..000000000
--- a/images/emoji/26ab.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26b0.png b/images/emoji/26b0.png
deleted file mode 100644
index fb2932aa5..000000000
--- a/images/emoji/26b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26b1.png b/images/emoji/26b1.png
deleted file mode 100644
index 6b5b35034..000000000
--- a/images/emoji/26b1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26bd.png b/images/emoji/26bd.png
deleted file mode 100644
index 28cfa218d..000000000
--- a/images/emoji/26bd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26be.png b/images/emoji/26be.png
deleted file mode 100644
index f8463f153..000000000
--- a/images/emoji/26be.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c4.png b/images/emoji/26c4.png
deleted file mode 100644
index 20c177c2a..000000000
--- a/images/emoji/26c4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c5.png b/images/emoji/26c5.png
deleted file mode 100644
index a55e59c34..000000000
--- a/images/emoji/26c5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26c8.png b/images/emoji/26c8.png
deleted file mode 100644
index 31a26a1b6..000000000
--- a/images/emoji/26c8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ce.png b/images/emoji/26ce.png
deleted file mode 100644
index 0a780a700..000000000
--- a/images/emoji/26ce.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26cf.png b/images/emoji/26cf.png
deleted file mode 100644
index 6370fe6d7..000000000
--- a/images/emoji/26cf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d1.png b/images/emoji/26d1.png
deleted file mode 100644
index 7140a6760..000000000
--- a/images/emoji/26d1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d3.png b/images/emoji/26d3.png
deleted file mode 100644
index 57f46139a..000000000
--- a/images/emoji/26d3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26d4.png b/images/emoji/26d4.png
deleted file mode 100644
index 476800fc5..000000000
--- a/images/emoji/26d4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26e9.png b/images/emoji/26e9.png
deleted file mode 100644
index 5a344975b..000000000
--- a/images/emoji/26e9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26ea.png b/images/emoji/26ea.png
deleted file mode 100644
index 24df10f1a..000000000
--- a/images/emoji/26ea.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f0.png b/images/emoji/26f0.png
deleted file mode 100644
index 6722ebdd2..000000000
--- a/images/emoji/26f0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f1.png b/images/emoji/26f1.png
deleted file mode 100644
index 258e1e757..000000000
--- a/images/emoji/26f1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f2.png b/images/emoji/26f2.png
deleted file mode 100644
index 293f5d91c..000000000
--- a/images/emoji/26f2.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f3.png b/images/emoji/26f3.png
deleted file mode 100644
index f65a21d8a..000000000
--- a/images/emoji/26f3.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f4.png b/images/emoji/26f4.png
deleted file mode 100644
index 41816b3ae..000000000
--- a/images/emoji/26f4.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f5.png b/images/emoji/26f5.png
deleted file mode 100644
index 772ef11da..000000000
--- a/images/emoji/26f5.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f7.png b/images/emoji/26f7.png
deleted file mode 100644
index 2eb3bdce2..000000000
--- a/images/emoji/26f7.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f8.png b/images/emoji/26f8.png
deleted file mode 100644
index c56b7b8a5..000000000
--- a/images/emoji/26f8.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fb.png b/images/emoji/26f9-1f3fb.png
deleted file mode 100644
index 43f97e7c3..000000000
--- a/images/emoji/26f9-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fc.png b/images/emoji/26f9-1f3fc.png
deleted file mode 100644
index f892fd596..000000000
--- a/images/emoji/26f9-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fd.png b/images/emoji/26f9-1f3fd.png
deleted file mode 100644
index e109997a9..000000000
--- a/images/emoji/26f9-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3fe.png b/images/emoji/26f9-1f3fe.png
deleted file mode 100644
index 354e8f9c2..000000000
--- a/images/emoji/26f9-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9-1f3ff.png b/images/emoji/26f9-1f3ff.png
deleted file mode 100644
index 9581dbbea..000000000
--- a/images/emoji/26f9-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26f9.png b/images/emoji/26f9.png
deleted file mode 100644
index 63bff9c3e..000000000
--- a/images/emoji/26f9.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26fa.png b/images/emoji/26fa.png
deleted file mode 100644
index 3fddcfc56..000000000
--- a/images/emoji/26fa.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/26fd.png b/images/emoji/26fd.png
deleted file mode 100644
index 05b187944..000000000
--- a/images/emoji/26fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2702.png b/images/emoji/2702.png
deleted file mode 100644
index 270571c8c..000000000
--- a/images/emoji/2702.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2705.png b/images/emoji/2705.png
deleted file mode 100644
index e55f087e5..000000000
--- a/images/emoji/2705.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2708.png b/images/emoji/2708.png
deleted file mode 100644
index 268d2ac3c..000000000
--- a/images/emoji/2708.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2709.png b/images/emoji/2709.png
deleted file mode 100644
index ec77ac375..000000000
--- a/images/emoji/2709.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fb.png b/images/emoji/270a-1f3fb.png
deleted file mode 100644
index 02809e2dd..000000000
--- a/images/emoji/270a-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fc.png b/images/emoji/270a-1f3fc.png
deleted file mode 100644
index 5de348103..000000000
--- a/images/emoji/270a-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fd.png b/images/emoji/270a-1f3fd.png
deleted file mode 100644
index 0d5240129..000000000
--- a/images/emoji/270a-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3fe.png b/images/emoji/270a-1f3fe.png
deleted file mode 100644
index a95c0dd63..000000000
--- a/images/emoji/270a-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a-1f3ff.png b/images/emoji/270a-1f3ff.png
deleted file mode 100644
index a2f092fd8..000000000
--- a/images/emoji/270a-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270a.png b/images/emoji/270a.png
deleted file mode 100644
index de33592bf..000000000
--- a/images/emoji/270a.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fb.png b/images/emoji/270b-1f3fb.png
deleted file mode 100644
index 3b752902c..000000000
--- a/images/emoji/270b-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fc.png b/images/emoji/270b-1f3fc.png
deleted file mode 100644
index 44e2a514c..000000000
--- a/images/emoji/270b-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fd.png b/images/emoji/270b-1f3fd.png
deleted file mode 100644
index 5bb62a752..000000000
--- a/images/emoji/270b-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3fe.png b/images/emoji/270b-1f3fe.png
deleted file mode 100644
index c7f8c9ec2..000000000
--- a/images/emoji/270b-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b-1f3ff.png b/images/emoji/270b-1f3ff.png
deleted file mode 100644
index c601b58a7..000000000
--- a/images/emoji/270b-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270b.png b/images/emoji/270b.png
deleted file mode 100644
index 6b2954315..000000000
--- a/images/emoji/270b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fb.png b/images/emoji/270c-1f3fb.png
deleted file mode 100644
index 6ac54a745..000000000
--- a/images/emoji/270c-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fc.png b/images/emoji/270c-1f3fc.png
deleted file mode 100644
index 6dd966986..000000000
--- a/images/emoji/270c-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fd.png b/images/emoji/270c-1f3fd.png
deleted file mode 100644
index a615e53f0..000000000
--- a/images/emoji/270c-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3fe.png b/images/emoji/270c-1f3fe.png
deleted file mode 100644
index 33a34bd5a..000000000
--- a/images/emoji/270c-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c-1f3ff.png b/images/emoji/270c-1f3ff.png
deleted file mode 100644
index 45ad14b6c..000000000
--- a/images/emoji/270c-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270c.png b/images/emoji/270c.png
deleted file mode 100644
index 70c5516ff..000000000
--- a/images/emoji/270c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fb.png b/images/emoji/270d-1f3fb.png
deleted file mode 100644
index 7923d8ebb..000000000
--- a/images/emoji/270d-1f3fb.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fc.png b/images/emoji/270d-1f3fc.png
deleted file mode 100644
index bcb304e15..000000000
--- a/images/emoji/270d-1f3fc.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fd.png b/images/emoji/270d-1f3fd.png
deleted file mode 100644
index fd885fd2d..000000000
--- a/images/emoji/270d-1f3fd.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3fe.png b/images/emoji/270d-1f3fe.png
deleted file mode 100644
index d065b8c64..000000000
--- a/images/emoji/270d-1f3fe.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d-1f3ff.png b/images/emoji/270d-1f3ff.png
deleted file mode 100644
index a44b3dd75..000000000
--- a/images/emoji/270d-1f3ff.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270d.png b/images/emoji/270d.png
deleted file mode 100644
index 85639f8ac..000000000
--- a/images/emoji/270d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/270f.png b/images/emoji/270f.png
deleted file mode 100644
index 3833d590f..000000000
--- a/images/emoji/270f.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2712.png b/images/emoji/2712.png
deleted file mode 100644
index 872d0ae15..000000000
--- a/images/emoji/2712.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2714.png b/images/emoji/2714.png
deleted file mode 100644
index 03bd69537..000000000
--- a/images/emoji/2714.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2716.png b/images/emoji/2716.png
deleted file mode 100644
index e47cc1b68..000000000
--- a/images/emoji/2716.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/271d.png b/images/emoji/271d.png
deleted file mode 100644
index 42b10e822..000000000
--- a/images/emoji/271d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2721.png b/images/emoji/2721.png
deleted file mode 100644
index fc59d0dde..000000000
--- a/images/emoji/2721.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2728.png b/images/emoji/2728.png
deleted file mode 100644
index 169bc10b0..000000000
--- a/images/emoji/2728.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2733.png b/images/emoji/2733.png
deleted file mode 100644
index 3307ffa62..000000000
--- a/images/emoji/2733.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2734.png b/images/emoji/2734.png
deleted file mode 100644
index 820179bda..000000000
--- a/images/emoji/2734.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2744.png b/images/emoji/2744.png
deleted file mode 100644
index db319a77e..000000000
--- a/images/emoji/2744.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2747.png b/images/emoji/2747.png
deleted file mode 100644
index 6aa7b6ec9..000000000
--- a/images/emoji/2747.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/274c.png b/images/emoji/274c.png
deleted file mode 100644
index 9f9ed0f7a..000000000
--- a/images/emoji/274c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/274e.png b/images/emoji/274e.png
deleted file mode 100644
index dae487f1f..000000000
--- a/images/emoji/274e.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2753.png b/images/emoji/2753.png
deleted file mode 100644
index 5a58f3458..000000000
--- a/images/emoji/2753.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2754.png b/images/emoji/2754.png
deleted file mode 100644
index 6e7824c75..000000000
--- a/images/emoji/2754.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2755.png b/images/emoji/2755.png
deleted file mode 100644
index 9b64da8bf..000000000
--- a/images/emoji/2755.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2757.png b/images/emoji/2757.png
deleted file mode 100644
index 2c1440642..000000000
--- a/images/emoji/2757.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2763.png b/images/emoji/2763.png
deleted file mode 100644
index 91b520be4..000000000
--- a/images/emoji/2763.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2764.png b/images/emoji/2764.png
deleted file mode 100644
index 638cb72dc..000000000
--- a/images/emoji/2764.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2795.png b/images/emoji/2795.png
deleted file mode 100644
index 40799798a..000000000
--- a/images/emoji/2795.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2796.png b/images/emoji/2796.png
deleted file mode 100644
index 054211caf..000000000
--- a/images/emoji/2796.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2797.png b/images/emoji/2797.png
deleted file mode 100644
index df32ab21b..000000000
--- a/images/emoji/2797.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27a1.png b/images/emoji/27a1.png
deleted file mode 100644
index 4755670b5..000000000
--- a/images/emoji/27a1.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27b0.png b/images/emoji/27b0.png
deleted file mode 100644
index 440aa56d5..000000000
--- a/images/emoji/27b0.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/27bf.png b/images/emoji/27bf.png
deleted file mode 100644
index 0b82c8fe3..000000000
--- a/images/emoji/27bf.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2934.png b/images/emoji/2934.png
deleted file mode 100644
index f29bfcfc0..000000000
--- a/images/emoji/2934.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2935.png b/images/emoji/2935.png
deleted file mode 100644
index 2d9d24bca..000000000
--- a/images/emoji/2935.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b05.png b/images/emoji/2b05.png
deleted file mode 100644
index 8c685e0a8..000000000
--- a/images/emoji/2b05.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b06.png b/images/emoji/2b06.png
deleted file mode 100644
index af8218a87..000000000
--- a/images/emoji/2b06.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b07.png b/images/emoji/2b07.png
deleted file mode 100644
index b8eefd0b1..000000000
--- a/images/emoji/2b07.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b1b.png b/images/emoji/2b1b.png
deleted file mode 100644
index 162f2bb42..000000000
--- a/images/emoji/2b1b.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b1c.png b/images/emoji/2b1c.png
deleted file mode 100644
index 6f06c1c79..000000000
--- a/images/emoji/2b1c.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b50.png b/images/emoji/2b50.png
deleted file mode 100644
index c93094707..000000000
--- a/images/emoji/2b50.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/2b55.png b/images/emoji/2b55.png
deleted file mode 100644
index 3fe75ce46..000000000
--- a/images/emoji/2b55.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3030.png b/images/emoji/3030.png
deleted file mode 100644
index 001c8d6e4..000000000
--- a/images/emoji/3030.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/303d.png b/images/emoji/303d.png
deleted file mode 100644
index 70453d415..000000000
--- a/images/emoji/303d.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3297.png b/images/emoji/3297.png
deleted file mode 100644
index ba8c89d95..000000000
--- a/images/emoji/3297.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/3299.png b/images/emoji/3299.png
deleted file mode 100644
index 5fd72608e..000000000
--- a/images/emoji/3299.png
+++ /dev/null
Binary files differ
diff --git a/images/emoji/README b/images/emoji/README
deleted file mode 100644
index ab478b753..000000000
--- a/images/emoji/README
+++ /dev/null
@@ -1,2 +0,0 @@
-These files supplied by emojione. License is CC BY 4.0. Attribution is required for commercial use.
-See http://emojione.com
diff --git a/include/attach.php b/include/attach.php
index 937d33ea3..ac50b05b1 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -209,7 +209,7 @@ function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $
// Retrieve all columns except 'data'
- $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra ORDER BY $orderby $limit",
+ $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, os_path, display_path, os_storage, is_dir, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra ORDER BY $orderby $limit",
intval($channel_id)
);
@@ -284,6 +284,7 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
return $ret;
}
+
function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
$sql_extra = permissions_sql($uid,$ob_hash);
@@ -348,7 +349,7 @@ function attach_by_hash_nodata($hash, $observer_hash, $rev = 0) {
// Now we'll see if we can access the attachment
- $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_photo, os_path, display_path, is_dir, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_extra limit 1",
intval($r[0]['uid']),
dbesc($hash)
);
@@ -531,7 +532,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($options === 'update' && $arr && array_key_exists('revision',$arr))
$sql_options = " and revision = " . intval($arr['revision']) . " ";
- $x = q("select id, aid, uid, filename, filetype, filesize, hash, revision, folder, os_storage, is_photo, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where hash = '%s' and uid = %d $sql_options limit 1",
+ $x = q("select id, aid, uid, filename, filetype, filesize, hash, revision, folder, os_storage, is_photo, os_path, display_path, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where hash = '%s' and uid = %d $sql_options limit 1",
dbesc($arr['hash']),
intval($channel_id)
);
@@ -702,11 +703,11 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$os_relpath .= $folder_hash . '/';
}
- $os_relpath .= $hash;
+ $os_relpath .= $hash;
+ $os_relpath = ltrim($os_relpath,'/');
- // not yet used
- $os_path = '';
- $display_path = '';
+ $os_path = $os_relpath;
+ $display_path = $pathname . '/' . $filename;
if($src)
@file_put_contents($os_basepath . $os_relpath,@file_get_contents($src));
@@ -810,7 +811,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
if($is_photo) {
- $args = array( 'source' => $source, 'visible' => $visible, 'resource_id' => $hash, 'album' => basename($pathname), 'os_path' => $os_basepath . $os_relpath, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct, 'options' => $options );
+ $args = array( 'source' => $source, 'visible' => $visible, 'resource_id' => $hash, 'album' => $pathname, 'os_syspath' => $os_basepath . $os_relpath, 'os_path' => $os_path, 'display_path' => $display_path, 'filename' => $filename, 'getimagesize' => $gis, 'directory' => $direct, 'options' => $options );
if($arr['contact_allow'])
$args['contact_allow'] = $arr['contact_allow'];
if($arr['group_allow'])
@@ -914,7 +915,7 @@ function z_readdir($channel_id, $observer_hash, $pathname, $parent_hash = '') {
if(count($paths) > 1) {
$curpath = array_shift($paths);
- $r = q("select hash, id, is_dir from attach where uid = %d and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id) . " limit 1",
+ $r = q("select hash, id, is_dir from attach where uid = %d and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id,$observer_hash) . " limit 1",
intval($channel_id),
dbesc($curpath)
);
@@ -929,7 +930,7 @@ function z_readdir($channel_id, $observer_hash, $pathname, $parent_hash = '') {
else
$paths = array($pathname);
- $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, is_photo, is_dir, os_storage, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id),
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_path, display_path, is_photo, is_dir, os_storage, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and is_dir != 0 " . permissions_sql($channel_id),
intval($channel_id),
dbesc($parent_hash),
dbesc($paths[0])
@@ -968,12 +969,15 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$sql_options = '';
- $basepath = 'store/' . $channel['channel_address'];
+ $os_basepath = 'store/' . $channel['channel_address'];
- logger('attach_mkdir: basepath: ' . $basepath);
+ logger('attach_mkdir: basepath: ' . $os_basepath);
- if(! is_dir($basepath))
- os_mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS, true);
+ if(! is_dir($os_basepath))
+ os_mkdir($os_basepath,STORAGE_DEFAULT_PERMISSIONS, true);
+
+
+ $os_basepath .= '/';
if(! perm_is_allowed($channel_id, $observer_hash, 'write_storage')) {
$ret['message'] = t('Permission denied.');
@@ -1019,10 +1023,13 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$lpath = '';
$lfile = $arr['folder'];
+ $dpath = '';
+
$sql_options = permissions_sql($channel['channel_id']);
+
do {
- $r = q("select filename, hash, flags, is_dir, folder from attach where uid = %d and hash = '%s' and is_dir != 0
+ $r = q("select filename, hash, flags, is_dir, folder, display_path from attach where uid = %d and hash = '%s' and is_dir = 1
$sql_options limit 1",
intval($channel['channel_id']),
dbesc($lfile)
@@ -1032,22 +1039,26 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$ret['message'] = t('Path not found.');
return $ret;
}
+
+ $dpath = $r[0]['filename'] . (($dpath) ? '/' . $dpath : '');
+
if($lfile)
- $lpath = $r[0]['hash'] . '/' . $lpath;
+ $lpath = $r[0]['hash'] . (($lpath) ? '/' . $lpath : '');
+
$lfile = $r[0]['folder'];
+
} while ( ($r[0]['folder']) && intval($r[0]['is_dir'])) ;
- $path = $basepath . '/' . $lpath;
+
+ $path = $lpath;
}
else
- $path = $basepath . '/';
-
- $path .= $arr['hash'];
+ $path = '';
$created = datetime_convert();
- // not yet used
- $os_path = '';
- $display_path = '';
+ $os_path = ltrim($path . '/' . $arr['hash'],'/');
+ $display_path = ltrim($dpath . '/' . $arr['filename'],'/');
+
$r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, os_storage, is_dir, content, created, edited, os_path, display_path, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
@@ -1062,7 +1073,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
dbesc($arr['folder']),
intval(1),
intval(1),
- dbescbin($path),
+ dbescbin($os_basepath . $os_path),
dbesc($created),
dbesc($created),
dbesc($os_path),
@@ -1074,7 +1085,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
);
if($r) {
- if(os_mkdir($path, STORAGE_DEFAULT_PERMISSIONS, true)) {
+ if(os_mkdir($os_basepath . $os_path, STORAGE_DEFAULT_PERMISSIONS, true)) {
$ret['success'] = true;
// update the parent folder's lastmodified timestamp
@@ -1092,7 +1103,7 @@ function attach_mkdir($channel, $observer_hash, $arr = null) {
$ret['data'] = $z[0];
}
else {
- logger('attach_mkdir: ' . mkdir . ' ' . $path . ' failed.');
+ logger('attach_mkdir: ' . mkdir . ' ' . $os_basepath . $os_path . ' failed.');
$ret['message'] = t('mkdir failed.');
}
}
@@ -1477,18 +1488,34 @@ function find_folder_hash_by_attach_hash($channel_id, $attachHash, $recurse = fa
function find_folder_hash_by_path($channel_id, $path) {
- $filename = end(explode('/', $path));
+ if(! $path)
+ return '';
- $r = q("SELECT hash FROM attach WHERE uid = %d AND filename = '%s' LIMIT 1",
- intval($channel_id),
- dbesc($filename)
- );
+ $comps = explode('/',$path);
+ $errors = false;
+ $parent_hash = '';
- $hash = '';
- if($r && $r[0]['hash']) {
- $hash = $r[0]['hash'];
+ for($x = 0; $x < count($comps); $x ++) {
+ $element = $comps[$x];
+ $r = q("SELECT hash FROM attach WHERE uid = %d AND filename = '%s' AND folder = '%s' LIMIT 1",
+ intval($channel_id),
+ dbesc($element),
+ dbesc($parent_hash)
+ );
+ if($r) {
+ $parent_hash = $r[0]['hash'];
+ }
+ else {
+ $errors ++;
+ break;
+ }
}
- return $hash;
+
+ if($errors)
+ return '';
+
+ return $parent_hash;
+
}
/**
@@ -2196,10 +2223,23 @@ function attach_move($channel_id, $resource_id, $new_folder_hash) {
intval($r[0]['id'])
);
+
+ $x = attach_syspaths($channel_id,$resource_id);
+
+ $t1 = q("update attach set os_path = '%s', display_path = '%s' where id = %d",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($r[0]['id'])
+ );
+
+
if($r[0]['is_photo']) {
- $t = q("update photo set album = '%s', filename = '%s' where resource_id = '%s' and uid = %d",
+ $t = q("update photo set album = '%s', filename = '%s', os_path = '%s', display_path = '%s'
+ where resource_id = '%s' and uid = %d",
dbesc($newdirname),
dbesc($filename),
+ dbesc($x['os_path']),
+ dbesc($x['path']),
dbesc($resource_id),
intval($channel_id)
);
@@ -2227,8 +2267,9 @@ function attach_folder_select_list($channel_id) {
if($r) {
foreach($r as $rv) {
$x = attach_folder_rpaths($r,$rv);
- if($x)
+ if($x) {
$out[$x[0]] = $x[1];
+ }
}
}
@@ -2250,7 +2291,6 @@ function attach_folder_rpaths($all_folders,$that_folder) {
continue;
if($selected['hash'] == $parent_hash) {
$path = '/' . $selected['filename'] . $path;
- $current_hash = $selected['hash'];
$parent_hash = $selected['folder'];
$found = true;
break;
@@ -2264,3 +2304,54 @@ function attach_folder_rpaths($all_folders,$that_folder) {
return (($error) ? false : [ $current_hash , $path ]);
}
+
+
+function attach_syspaths($channel_id,$attach_hash) {
+
+ $os_path = '';
+ $path = '';
+ do {
+
+ $r = q("select folder, filename, hash from attach where hash = '%s' and uid = %d",
+ dbesc($attach_hash),
+ intval($channel_id)
+ );
+ if(! $r)
+ break;
+
+ $os_path = $r[0]['hash'] . (($os_path) ? '/' . $os_path : '');
+ $path = $r[0]['filename'] . (($path) ? '/' . $path : '');
+ $attach_hash = $r[0]['folder'];
+ }
+ while($attach_hash);
+
+ return [ 'os_path' => $os_path, 'path' => $path ];
+
+
+}
+
+
+
+function attach_upgrade() {
+
+ $r = q("select id, uid, hash from attach where os_path = '' and display_path = '' limit 100");
+ if($r) {
+ foreach($r as $rv) {
+ $x = attach_syspaths($rv['uid'],$rv['hash']);
+ if($x) {
+ $w = q("update attach set os_path = '%s', display_path = '%s' where id = %d",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($rv['id'])
+ );
+ $y = q("update photo set os_path = '%s', display_path = '%s' where uid = %d and resource_id = '%s'",
+ dbesc($x['os_path']),
+ dbesc($x['path']),
+ intval($rv['uid']),
+ dbesc($rv['hash'])
+ );
+ }
+ }
+ }
+}
+
diff --git a/include/channel.php b/include/channel.php
index 856fb6303..1bdd5a478 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -242,24 +242,22 @@ function create_identity($arr) {
$expire = 0;
- $r = q("insert into channel ( channel_account_id, channel_primary,
- channel_name, channel_address, channel_guid, channel_guid_sig,
- channel_hash, channel_prvkey, channel_pubkey, channel_pageflags, channel_system, channel_expire_days, channel_timezone )
- values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s' ) ",
-
- intval($arr['account_id']),
- intval($primary),
- dbesc($name),
- dbesc($nick),
- dbesc($guid),
- dbesc($sig),
- dbesc($hash),
- dbesc($key['prvkey']),
- dbesc($key['pubkey']),
- intval($pageflags),
- intval($system),
- intval($expire),
- dbesc(App::$timezone)
+ $r = channel_store_lowlevel(
+ [
+ 'channel_account_id' => intval($arr['account_id']),
+ 'channel_primary' => intval($primary),
+ 'channel_name' => $name,
+ 'channel_address' => $nick,
+ 'channel_guid' => $guid,
+ 'channel_guid_sig' => $sig,
+ 'channel_hash' => $hash,
+ 'channel_prvkey' => $key['prvkey'],
+ 'channel_pubkey' => $key['pubkey'],
+ 'channel_pageflags' => intval($pageflags),
+ 'channel_system' => intval($system),
+ 'channel_expire_days' => intval($expire),
+ 'channel_timezone' => App::$timezone
+ ]
);
$r = q("select * from channel where channel_account_id = %d
@@ -1193,11 +1191,6 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
else
$tpl = get_markup_template('profile_vcard.tpl');
- require_once('include/widgets.php');
-
-// if(! feature_enabled($profile['uid'],'hide_rating'))
- $z = widget_rating(array('target' => $profile['channel_hash']));
-
$o .= replace_macros($tpl, array(
'$zcard' => $zcard,
'$profile' => $profile,
@@ -1211,7 +1204,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
'$chanmenu' => $channel_menu,
'$diaspora' => $diaspora,
'$reddress' => $reddress,
- '$rating' => $z,
+ '$rating' => '',
'$contact_block' => $contact_block,
'$editmenu' => profile_edit_menu($profile['uid'])
));
@@ -1608,7 +1601,7 @@ function get_profile_fields_basic($filter = 0) {
$profile_fields_basic = (($filter == 0) ? get_config('system','profile_fields_basic') : null);
if(! $profile_fields_basic)
- $profile_fields_basic = array('fullname','pdesc','chandesc','gender','dob','dob_tz','address','locality','region','postal_code','country_name','marital','sexual','homepage','hometown','keywords','about','contact');
+ $profile_fields_basic = array('fullname','pdesc','chandesc','comms','gender','dob','dob_tz','address','locality','region','postal_code','country_name','marital','sexual','homepage','hometown','keywords','about','contact');
$x = array();
if($profile_fields_basic)
@@ -1976,9 +1969,7 @@ function channel_manual_conv_update($channel_id) {
$x = get_pconfig($channel_id, 'system','manual_conversation_update');
if($x === false)
- $x = get_config('system','manual_conversation_update');
- if($x === false)
- $x = 1;
+ $x = get_config('system','manual_conversation_update', 1);
return intval($x);
@@ -1997,6 +1988,45 @@ function remote_login() {
}
+function channel_store_lowlevel($arr) {
+
+ $store = [
+ 'channel_account_id' => ((array_key_exists('channel_account_id',$arr)) ? $arr['channel_account_id'] : '0'),
+ 'channel_primary' => ((array_key_exists('channel_primary',$arr)) ? $arr['channel_primary'] : '0'),
+ 'channel_name' => ((array_key_exists('channel_name',$arr)) ? $arr['channel_name'] : ''),
+ 'channel_address' => ((array_key_exists('channel_address',$arr)) ? $arr['channel_address'] : ''),
+ 'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''),
+ 'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''),
+ 'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''),
+ 'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'),
+ 'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''),
+ 'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''),
+ 'channel_startpage' => ((array_key_exists('channel_startpage',$arr)) ? $arr['channel_startpage'] : ''),
+ 'channel_pubkey' => ((array_key_exists('channel_pubkey',$arr)) ? $arr['channel_pubkey'] : ''),
+ 'channel_prvkey' => ((array_key_exists('channel_prvkey',$arr)) ? $arr['channel_prvkey'] : ''),
+ 'channel_notifyflags' => ((array_key_exists('channel_notifyflags',$arr)) ? $arr['channel_notifyflags'] : '65535'),
+ 'channel_pageflags' => ((array_key_exists('channel_pageflags',$arr)) ? $arr['channel_pageflags'] : '0'),
+ 'channel_dirdate' => ((array_key_exists('channel_dirdate',$arr)) ? $arr['channel_dirdate'] : NULL_DATE),
+ 'channel_lastpost' => ((array_key_exists('channel_lastpost',$arr)) ? $arr['channel_lastpost'] : NULL_DATE),
+ 'channel_deleted' => ((array_key_exists('channel_deleted',$arr)) ? $arr['channel_deleted'] : NULL_DATE),
+ 'channel_max_anon_mail' => ((array_key_exists('channel_max_anon_mail',$arr)) ? $arr['channel_max_anon_mail'] : '10'),
+ 'channel_max_friend_req' => ((array_key_exists('channel_max_friend_req',$arr)) ? $arr['channel_max_friend_req'] : '10'),
+ 'channel_expire_days' => ((array_key_exists('channel_expire_days',$arr)) ? $arr['channel_expire_days'] : '0'),
+ 'channel_passwd_reset' => ((array_key_exists('channel_passwd_reset',$arr)) ? $arr['channel_passwd_reset'] : ''),
+ 'channel_default_group' => ((array_key_exists('channel_default_group',$arr)) ? $arr['channel_default_group'] : ''),
+ 'channel_allow_cid' => ((array_key_exists('channel_allow_cid',$arr)) ? $arr['channel_allow_cid'] : ''),
+ 'channel_allow_gid' => ((array_key_exists('channel_allow_gid',$arr)) ? $arr['channel_allow_gid'] : ''),
+ 'channel_deny_cid' => ((array_key_exists('channel_deny_cid',$arr)) ? $arr['channel_deny_cid'] : ''),
+ 'channel_deny_gid' => ((array_key_exists('channel_deny_gid',$arr)) ? $arr['channel_deny_gid'] : ''),
+ 'channel_removed' => ((array_key_exists('channel_removed',$arr)) ? $arr['channel_removed'] : '0'),
+ 'channel_system' => ((array_key_exists('channel_system',$arr)) ? $arr['channel_system'] : '0'),
+ 'channel_moved' => ((array_key_exists('channel_moved',$arr)) ? $arr['channel_moved'] : '')
+ ];
+
+ return create_table_from_array('channel',$store);
+
+}
+
function profile_store_lowlevel($arr) {
@@ -2048,4 +2078,226 @@ function profile_store_lowlevel($arr) {
];
return create_table_from_array('profile',$store);
-} \ No newline at end of file
+}
+
+
+// Included here for completeness, but this is a very dangerous operation.
+// It is the caller's responsibility to confirm the requestor's intent and
+// authorisation to do this.
+
+function account_remove($account_id,$local = true,$unset_session=true) {
+
+ logger('account_remove: ' . $account_id);
+
+ if(! intval($account_id)) {
+ logger('account_remove: no account.');
+ return false;
+ }
+
+ // Don't let anybody nuke the only admin account.
+
+ $r = q("select account_id from account where (account_roles & %d) > 0",
+ intval(ACCOUNT_ROLE_ADMIN)
+ );
+
+ if($r !== false && count($r) == 1 && $r[0]['account_id'] == $account_id) {
+ logger("Unable to remove the only remaining admin account");
+ return false;
+ }
+
+ $r = q("select * from account where account_id = %d limit 1",
+ intval($account_id)
+ );
+ $account_email=$r[0]['account_email'];
+
+ if(! $r) {
+ logger('account_remove: No account with id: ' . $account_id);
+ return false;
+ }
+
+ $x = q("select channel_id from channel where channel_account_id = %d",
+ intval($account_id)
+ );
+ if($x) {
+ foreach($x as $xx) {
+ channel_remove($xx['channel_id'],$local,false);
+ }
+ }
+
+ $r = q("delete from account where account_id = %d",
+ intval($account_id)
+ );
+
+
+ if ($unset_session) {
+ unset($_SESSION['authenticated']);
+ unset($_SESSION['uid']);
+ notice( sprintf(t("User '%s' deleted"),$account_email) . EOL);
+ goaway(z_root());
+ }
+ return $r;
+
+}
+
+function channel_remove($channel_id, $local = true, $unset_session=false) {
+
+ if(! $channel_id)
+ return;
+
+ logger('Removing channel: ' . $channel_id);
+ logger('channel_remove: local only: ' . intval($local));
+
+ $r = q("select * from channel where channel_id = %d limit 1", intval($channel_id));
+ if(! $r) {
+ logger('channel_remove: channel not found: ' . $channel_id);
+ return;
+ }
+
+ $channel = $r[0];
+
+ call_hooks('channel_remove',$r[0]);
+
+ if(! $local) {
+
+ $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($channel_id)
+ );
+
+ q("delete from pconfig where uid = %d",
+ intval($channel_id)
+ );
+
+ logger('deleting hublocs',LOGGER_DEBUG);
+
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ Zotlabs\Daemon\Master::Summon(array('Notifier','purge_all',$channel_id));
+ }
+
+
+ $r = q("select * from iconfig left join item on item.id = iconfig.iid
+ where item.uid = %d",
+ intval($channel_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ q("delete from iconfig where iid = %d",
+ intval($rr['iid'])
+ );
+ }
+ }
+
+
+ q("DELETE FROM groups WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM group_member WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM event WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM item WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM mail WHERE channel_id = %d", intval($channel_id));
+ q("DELETE FROM notify WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM photo WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM attach WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM profile WHERE uid = %d", intval($channel_id));
+ q("DELETE FROM pconfig WHERE uid = %d", intval($channel_id));
+
+ // @FIXME At this stage we need to remove the file resources located under /store/$nickname
+
+
+ q("delete from abook where abook_xchan = '%s' and abook_self = 1 ",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
+ dbesc(datetime_convert()),
+ intval($channel_id)
+ );
+
+ // if this was the default channel, set another one as default
+ if(App::$account['account_default_channel'] == $channel_id) {
+ $r = q("select channel_id from channel where channel_account_id = %d and channel_removed = 0 limit 1",
+ intval(App::$account['account_id']),
+ intval(PAGE_REMOVED));
+ if ($r) {
+ $rr = q("update account set account_default_channel = %d where account_id = %d",
+ intval($r[0]['channel_id']),
+ intval(App::$account['account_id']));
+ logger("Default channel deleted, changing default to channel_id " . $r[0]['channel_id']);
+ }
+ else {
+ $rr = q("update account set account_default_channel = 0 where account_id = %d",
+ intval(App::$account['account_id'])
+ );
+ }
+ }
+
+ logger('deleting hublocs',LOGGER_DEBUG);
+
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s' and hubloc_url = '%s' ",
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
+ );
+
+ // Do we have any valid hublocs remaining?
+
+ $hublocs = 0;
+
+ $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
+ dbesc($channel['channel_hash'])
+ );
+ if($r)
+ $hublocs = count($r);
+
+ if(! $hublocs) {
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s' ",
+ dbesc($channel['channel_hash'])
+ );
+ }
+
+ //remove from file system
+ $r = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ if($r) {
+ $channel_address = $r[0]['channel_address'] ;
+ }
+ if($channel_address) {
+ $f = 'store/' . $channel_address.'/';
+ logger('delete '. $f);
+ if(is_dir($f)) {
+ @rrmdir($f);
+ }
+ }
+
+ Zotlabs\Daemon\Master::Summon(array('Directory',$channel_id));
+
+ if($channel_id == local_channel() && $unset_session) {
+ App::$session->nuke();
+ goaway(z_root());
+ }
+
+}
+
+/*
+ * This checks if a channel is allowed to publish executable code.
+ * It is up to the caller to determine if the observer or local_channel
+ * is in fact the resource owner whose channel_id is being checked
+ */
+
+function channel_codeallowed($channel_id) {
+
+ if(! intval($channel_id))
+ return false;
+
+ $x = channelx_by_n($channel_id);
+ if(($x) && ($x['channel_pageflags'] & PAGE_ALLOWCODE))
+ return true;
+ return false;
+}
diff --git a/include/connections.php b/include/connections.php
index e26943b68..a8d7d8483 100644
--- a/include/connections.php
+++ b/include/connections.php
@@ -188,232 +188,6 @@ function abook_toggle_flag($abook,$flag) {
}
-// Included here for completeness, but this is a very dangerous operation.
-// It is the caller's responsibility to confirm the requestor's intent and
-// authorisation to do this.
-
-function user_remove($uid) {
-
-}
-
-function account_remove($account_id,$local = true,$unset_session=true) {
-
- logger('account_remove: ' . $account_id);
-
- if(! intval($account_id)) {
- logger('account_remove: no account.');
- return false;
- }
-
- // Don't let anybody nuke the only admin account.
-
- $r = q("select account_id from account where (account_roles & %d) > 0",
- intval(ACCOUNT_ROLE_ADMIN)
- );
-
- if($r !== false && count($r) == 1 && $r[0]['account_id'] == $account_id) {
- logger("Unable to remove the only remaining admin account");
- return false;
- }
-
- $r = q("select * from account where account_id = %d limit 1",
- intval($account_id)
- );
- $account_email=$r[0]['account_email'];
-
- if(! $r) {
- logger('account_remove: No account with id: ' . $account_id);
- return false;
- }
-
- $x = q("select channel_id from channel where channel_account_id = %d",
- intval($account_id)
- );
- if($x) {
- foreach($x as $xx) {
- channel_remove($xx['channel_id'],$local,false);
- }
- }
-
- $r = q("delete from account where account_id = %d",
- intval($account_id)
- );
-
-
- if ($unset_session) {
- unset($_SESSION['authenticated']);
- unset($_SESSION['uid']);
- notice( sprintf(t("User '%s' deleted"),$account_email) . EOL);
- goaway(z_root());
- }
- return $r;
-
-}
-// recursively delete a directory
-function rrmdir($path)
-{
- if (is_dir($path) === true)
- {
- $files = array_diff(scandir($path), array('.', '..'));
-
- foreach ($files as $file)
- {
- rrmdir(realpath($path) . '/' . $file);
- }
-
- return rmdir($path);
- }
-
- else if (is_file($path) === true)
- {
- return unlink($path);
- }
-
- return false;
-}
-
-function channel_remove($channel_id, $local = true, $unset_session=false) {
-
- if(! $channel_id)
- return;
-
- logger('Removing channel: ' . $channel_id);
- logger('channel_remove: local only: ' . intval($local));
-
- $r = q("select * from channel where channel_id = %d limit 1", intval($channel_id));
- if(! $r) {
- logger('channel_remove: channel not found: ' . $channel_id);
- return;
- }
-
- $channel = $r[0];
-
- call_hooks('channel_remove',$r[0]);
-
- if(! $local) {
-
- $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
- dbesc(datetime_convert()),
- intval($channel_id)
- );
-
- q("delete from pconfig where uid = %d",
- intval($channel_id)
- );
-
- logger('deleting hublocs',LOGGER_DEBUG);
-
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
-
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
- dbesc($channel['channel_hash'])
- );
-
- Zotlabs\Daemon\Master::Summon(array('Notifier','purge_all',$channel_id));
- }
-
-
- $r = q("select * from iconfig left join item on item.id = iconfig.iid
- where item.uid = %d",
- intval($channel_id)
- );
- if($r) {
- foreach($r as $rr) {
- q("delete from iconfig where iid = %d",
- intval($rr['iid'])
- );
- }
- }
-
-
- q("DELETE FROM groups WHERE uid = %d", intval($channel_id));
- q("DELETE FROM group_member WHERE uid = %d", intval($channel_id));
- q("DELETE FROM event WHERE uid = %d", intval($channel_id));
- q("DELETE FROM item WHERE uid = %d", intval($channel_id));
- q("DELETE FROM mail WHERE channel_id = %d", intval($channel_id));
- q("DELETE FROM notify WHERE uid = %d", intval($channel_id));
- q("DELETE FROM photo WHERE uid = %d", intval($channel_id));
- q("DELETE FROM attach WHERE uid = %d", intval($channel_id));
- q("DELETE FROM profile WHERE uid = %d", intval($channel_id));
- q("DELETE FROM pconfig WHERE uid = %d", intval($channel_id));
-
- // @FIXME At this stage we need to remove the file resources located under /store/$nickname
-
-
- q("delete from abook where abook_xchan = '%s' and abook_self = 1 ",
- dbesc($channel['channel_hash'])
- );
-
- $r = q("update channel set channel_deleted = '%s', channel_removed = 1 where channel_id = %d",
- dbesc(datetime_convert()),
- intval($channel_id)
- );
-
- // if this was the default channel, set another one as default
- if(App::$account['account_default_channel'] == $channel_id) {
- $r = q("select channel_id from channel where channel_account_id = %d and channel_removed = 0 limit 1",
- intval(App::$account['account_id']),
- intval(PAGE_REMOVED));
- if ($r) {
- $rr = q("update account set account_default_channel = %d where account_id = %d",
- intval($r[0]['channel_id']),
- intval(App::$account['account_id']));
- logger("Default channel deleted, changing default to channel_id " . $r[0]['channel_id']);
- }
- else {
- $rr = q("update account set account_default_channel = 0 where account_id = %d",
- intval(App::$account['account_id'])
- );
- }
- }
-
- logger('deleting hublocs',LOGGER_DEBUG);
-
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s' and hubloc_url = '%s' ",
- dbesc($channel['channel_hash']),
- dbesc(z_root())
- );
-
- // Do we have any valid hublocs remaining?
-
- $hublocs = 0;
-
- $r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0",
- dbesc($channel['channel_hash'])
- );
- if($r)
- $hublocs = count($r);
-
- if(! $hublocs) {
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s' ",
- dbesc($channel['channel_hash'])
- );
- }
-
- //remove from file system
- $r = q("select channel_address from channel where channel_id = %d limit 1",
- intval($channel_id)
- );
- if($r)
- $channel_address = $r[0]['channel_address'] ;
- if ($channel_address !== '') {
- $f = 'store/' . $channel_address.'/';
- logger ('delete '. $f);
- if(is_dir($f))
- @rrmdir($f);
- }
-
- Zotlabs\Daemon\Master::Summon(array('Directory',$channel_id));
-
- if($channel_id == local_channel() && $unset_session) {
- App::$session->nuke();
- goaway(z_root());
- }
-
-}
/**
* mark any hubs "offline" that haven't been heard from in more than 30 days
@@ -430,10 +204,10 @@ function mark_orphan_hubsxchans() {
if($dirmode == DIRECTORY_MODE_NORMAL)
return;
- $r = q("update hubloc set hubloc_error = 1 where hubloc_error = 0
+ $r = q("update hubloc set hubloc_error = 1 where hubloc_error = 0
and hubloc_network = 'zot' and hubloc_connected < %s - interval %s",
- db_utcnow(), db_quoteinterval('36 day')
- );
+ db_utcnow(), db_quoteinterval('36 day')
+ );
// $realm = get_directory_realm();
// if($realm == DIRECTORY_REALM) {
@@ -547,13 +321,13 @@ function remove_all_xchan_resources($xchan, $channel_id = 0) {
// directory servers need to keep the record around for sync purposes - mark it deleted
- $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
- dbesc($xchan)
- );
+ $r = q("update hubloc set hubloc_deleted = 1 where hubloc_hash = '%s'",
+ dbesc($xchan)
+ );
- $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
- dbesc($xchan)
- );
+ $r = q("update xchan set xchan_deleted = 1 where xchan_hash = '%s'",
+ dbesc($xchan)
+ );
}
}
}
diff --git a/include/conversation.php b/include/conversation.php
index 285ee752f..5b2d60583 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -2,10 +2,6 @@
require_once('include/items.php');
-// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
-// is identical to the code in mod/message.php for 'item_extract_images' and
-// 'item_redir_and_replace_images'
-
function item_extract_images($body) {
@@ -375,13 +371,14 @@ function localize_item(&$item){
* * \e array \b children
* @return number
*/
+
function count_descendants($item) {
$total = count($item['children']);
- if ($total > 0) {
- foreach ($item['children'] as $child) {
- if (! visible_activity($child))
+ if($total > 0) {
+ foreach($item['children'] as $child) {
+ if(! visible_activity($child))
$total --;
$total += count_descendants($child);
@@ -408,8 +405,8 @@ function visible_activity($item) {
if(intval($item['item_notshown']))
return false;
- foreach ($hidden_activities as $act) {
- if ((activity_match($item['verb'], $act)) && ($item['mid'] != $item['parent_mid'])) {
+ foreach($hidden_activities as $act) {
+ if((activity_match($item['verb'], $act)) && ($item['mid'] != $item['parent_mid'])) {
return false;
}
}
@@ -614,6 +611,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$owner_photo = '';
$owner_name = '';
$sparkle = '';
+ $is_new = false;
if($mode === 'search' || $mode === 'community') {
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
@@ -682,6 +680,9 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$has_tags = (($body['tags'] || $body['categories'] || $body['mentions'] || $body['attachments'] || $body['folders']) ? true : false);
+ if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
+ $is_new = true;
+
$tmp_item = array(
'template' => $tpl,
'toplevel' => 'toplevel_item',
@@ -738,6 +739,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
'wait' => t('Please wait'),
'thread_level' => 1,
'has_tags' => $has_tags,
+ 'is_new' => $is_new
);
$arr = array('item' => $item, 'output' => $tmp_item);
@@ -870,98 +872,6 @@ function best_link_url($item) {
-function item_photo_menu($item){
-
- $contact = null;
-
- $ssl_state = false;
-
- $sub_link="";
- $poke_link="";
- $contact_url="";
- $pm_url="";
- $vsrc_link = "";
- $follow_url = "";
-
- $local_channel = local_channel();
-
- if($local_channel) {
- $ssl_state = true;
- if(! count(App::$contacts))
- load_contact_links($local_channel);
- $channel = App::get_channel();
- $channel_hash = (($channel) ? $channel['channel_hash'] : '');
- }
-
- if(($local_channel) && $local_channel == $item['uid']) {
- $vsrc_link = 'javascript:viewsrc(' . $item['id'] . '); return false;';
- if($item['parent'] == $item['id'] && $channel && ($channel_hash != $item['author_xchan'])) {
- $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
- }
- if($channel) {
- $unsub_link = 'javascript:dounsubthread(' . $item['id'] . '); return false;';
- }
- }
-
- $profile_link = chanlink_hash($item['author_xchan']);
- if($item['uid'] > 0)
- $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan'];
-
- if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts))
- $contact = App::$contacts[$item['author_xchan']];
- else
- if($local_channel && $item['author']['xchan_addr'])
- $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr'];
-
- if($contact) {
- $poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id'];
- if (! intval($contact['abook_self']))
- $contact_url = z_root() . '/connedit/' . $contact['abook_id'];
- $posts_link = z_root() . '/network/?cid=' . $contact['abook_id'];
-
- $clean_url = normalise_link($item['author-link']);
- }
-
- $rating_enabled = get_config('system','rating_enabled');
-
- $ratings_url = (($rating_enabled) ? z_root() . '/ratings/' . urlencode($item['author_xchan']) : '');
-
- $post_menu = Array(
- t("View Source") => $vsrc_link,
- t("Follow Thread") => $sub_link,
- t("Unfollow Thread") => $unsub_link,
- );
-
- $author_menu = array(
- t("View Profile") => $profile_link,
- t("Activity/Posts") => $posts_link,
- t("Connect") => $follow_url,
- t("Edit Connection") => $contact_url,
- t("Message") => $pm_url,
- t('Ratings') => $ratings_url,
- t("Poke") => $poke_link
- );
-
-
- $args = array('item' => $item, 'post_menu' => $post_menu, 'author_menu' => $author_menu);
-
- call_hooks('item_photo_menu', $args);
-
- $menu = array_merge($args['post_menu'],$args['author_menu']);
-
- $o = "";
- foreach($menu as $k=>$v){
- if(strpos($v,'javascript:') === 0) {
- $v = substr($v,11);
- $o .= "<li><a href=\"#\" onclick=\"$v\">$k</a></li>\n";
- }
- elseif ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
- }
-
- return $o;
-}
-
-
function thread_action_menu($item,$mode = '') {
$menu = [];
@@ -1007,6 +917,24 @@ function thread_action_menu($item,$mode = '') {
}
+function author_is_pmable($xchan) {
+
+ $x = [ 'xchan' => $xchan, 'result' => 'unset' ];
+ call_hooks('author_is_pmable',$x);
+ if($x['result'] !== 'unset')
+ return $x['result'];
+
+ if($xchan['xchan_network'] === 'zot')
+ return true;
+ return false;
+
+}
+
+
+
+
+
+
function thread_author_menu($item, $mode = '') {
$menu = [];
@@ -1021,14 +949,19 @@ function thread_author_menu($item, $mode = '') {
}
$profile_link = chanlink_hash($item['author_xchan']);
- if($item['uid'] > 0)
- $pm_url = z_root() . '/mail/new/?f=&hash=' . $item['author_xchan'];
+
if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts))
$contact = App::$contacts[$item['author_xchan']];
else
if($local_channel && $item['author']['xchan_addr'])
- $follow_url = z_root() . '/follow/?f=&url=' . $item['author']['xchan_addr'];
+ $follow_url = z_root() . '/follow/?f=&url=' . urlencode($item['author']['xchan_addr']);
+
+
+ if($item['uid'] > 0 && author_is_pmable($item['author']))
+ $pm_url = z_root() . '/mail/new/?f=&hash=' . urlencode($item['author_xchan']);
+
+
if($contact) {
$poke_link = z_root() . '/poke/?f=&c=' . $contact['abook_id'];
@@ -1175,9 +1108,9 @@ function builtin_activity_puller($item, &$conv_responses) {
if((activity_match($item['verb'], $verb)) && ($item['id'] != $item['parent'])) {
$name = (($item['author']['xchan_name']) ? $item['author']['xchan_name'] : t('Unknown'));
- $url = (($item['author']['xchan_url'] && $item['author']['xchan_photo_s'])
- ? '<a href="' . chanlink_url($item['author']['xchan_url']) . '">' . '<img class="dropdown-menu-img-xs" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" />' . $name . '</a>'
- : '<a href="#" class="disabled">' . $name . '</a>'
+ $url = (($item['author_xchan'] && $item['author']['xchan_photo_s'])
+ ? '<a class="dropdown-item" href="' . chanlink_hash($item['author_xchan']) . '">' . '<img class="menu-img-1" src="' . zid($item['author']['xchan_photo_s']) . '" alt="' . urlencode($name) . '" />' . $name . '</a>'
+ : '<a class="dropdown-item" href="#" class="disabled">' . $name . '</a>'
);
if(! $item['thr_parent'])
@@ -1770,6 +1703,9 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
if (App::$is_sys)
return;
+ if (get_pconfig($uid, 'system', 'noprofiletabs'))
+ return;
+
$channel = App::get_channel();
if (is_null($nickname))
@@ -1779,6 +1715,9 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
$uid = ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : local_channel());
$account_id = ((App::$profile['profile_uid']) ? App::$profile['channel_account_id'] : App::$channel['channel_account_id']);
+ if ($uid == local_channel())
+ return;
+
if($uid == local_channel()) {
$cal_link = '';
}
@@ -1801,9 +1740,6 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
$has_webpages = (($r) ? true : false);
- if (get_pconfig($uid, 'system', 'noprofiletabs'))
- return;
-
if (x($_GET, 'tab'))
$tab = notags(trim($_GET['tab']));
@@ -1817,6 +1753,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'channel') ? 'active' : ''),
'title' => t('Status Messages and Posts'),
'id' => 'status-tab',
+ 'icon' => 'home'
),
);
@@ -1829,6 +1766,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'profile') ? 'active' : ''),
'title' => t('Profile Details'),
'id' => 'profile-tab',
+ 'icon' => 'user'
);
}
if ($p['view_storage']) {
@@ -1838,6 +1776,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'photos') ? 'active' : ''),
'title' => t('Photo Albums'),
'id' => 'photo-tab',
+ 'icon' => 'photo'
);
$tabs[] = array(
'label' => t('Files'),
@@ -1845,6 +1784,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'cloud' || argv(0) == 'sharedwithme') ? 'active' : ''),
'title' => t('Files and Storage'),
'id' => 'files-tab',
+ 'icon' => 'folder-open'
);
}
@@ -1855,6 +1795,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'cal' || argv(0) == 'events') ? 'active' : ''),
'title' => t('Events'),
'id' => 'event-tab',
+ 'icon' => 'calendar'
);
}
@@ -1868,6 +1809,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'chat') ? 'active' : '' ),
'title' => t('Chatrooms'),
'id' => 'chat-tab',
+ 'icon' => 'comments-o'
);
}
}
@@ -1881,6 +1823,7 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'bookmarks') ? 'active' : ''),
'title' => t('Saved Bookmarks'),
'id' => 'bookmarks-tab',
+ 'icon' => 'bookmark'
);
}
@@ -1891,27 +1834,34 @@ function profile_tabs($a, $is_owner = false, $nickname = null){
'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
'title' => t('View Webpages'),
'id' => 'webpages-tab',
+ 'icon' => 'newspaper-o'
);
}
- if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
- $tabs[] = array(
- 'label' => t('Wikis'),
- 'url' => z_root() . '/wiki/' . $nickname,
- 'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
- 'title' => t('Wiki'),
- 'id' => 'wiki-tab',
- );
+ if ($p['view_wiki']) {
+ if(feature_enabled($uid,'wiki') && (get_account_techlevel($account_id) > 3)) {
+ $tabs[] = array(
+ 'label' => t('Wikis'),
+ 'url' => z_root() . '/wiki/' . $nickname,
+ 'sel' => ((argv(0) == 'wiki') ? 'active' : ''),
+ 'title' => t('Wiki'),
+ 'id' => 'wiki-tab',
+ 'icon' => 'pencil-square-o'
+ );
+ }
}
-
$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
call_hooks('profile_tabs', $arr);
- $tpl = get_markup_template('common_tabs.tpl');
+ $tpl = get_markup_template('profile_tabs.tpl');
- return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+ return replace_macros($tpl, array(
+ '$tabs' => $arr['tabs'],
+ '$name' => App::$profile['channel_name'],
+ '$thumb' => App::$profile['thumb']
+ ));
}
@@ -1922,15 +1872,11 @@ function get_responses($conv_responses,$response_verbs,$ob,$item) {
$ret[$v] = array();
$ret[$v]['count'] = ((x($conv_responses[$v],$item['mid'])) ? $conv_responses[$v][$item['mid']] : '');
$ret[$v]['list'] = ((x($conv_responses[$v],$item['mid'])) ? $conv_responses[$v][$item['mid'] . '-l'] : '');
- if(count($ret[$v]['list']) > MAX_LIKERS) {
- $ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS);
- array_push($ret[$v]['list_part'], '<a href="#" data-toggle="modal" data-target="#' . $v . 'Modal-'
- . (($ob) ? $ob->get_id() : $item['id']) . '"><b>' . t('View all') . '</b></a>');
- } else {
- $ret[$v]['list_part'] = '';
- }
$ret[$v]['button'] = get_response_button_text($v,$ret[$v]['count']);
$ret[$v]['title'] = $conv_responses[$v]['title'];
+ if($ret[$v]['count'] > MAX_LIKERS) {
+ $ret[$v]['modal'] = true;
+ }
}
$count = 0;
diff --git a/include/crypto.php b/include/crypto.php
index f75390985..2c5545e9b 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -55,6 +55,7 @@ function AES256CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
+
function AES128CBC_encrypt($data,$key,$iv) {
$key = substr($key,0,16);
$iv = substr($iv,0,16);
@@ -67,18 +68,33 @@ function AES128CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'aes-128-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
-function STD_encrypt($data,$key,$iv) {
+
+function AES256CTR_encrypt($data,$key,$iv) {
$key = substr($key,0,32);
$iv = substr($iv,0,16);
- return openssl_encrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+ return openssl_encrypt($data,'aes-256-ctr',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
-function STD_decrypt($data,$key,$iv) {
+function AES256CTR_decrypt($data,$key,$iv) {
$key = substr($key,0,32);
$iv = substr($iv,0,16);
- return openssl_decrypt($data,'aes-256-cbc',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+ return openssl_decrypt($data,'aes-256-ctr',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+
+function CAMELLIA256CFB_encrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_encrypt($data,'camellia-256-cfb',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
+}
+
+function CAMELLIA256CFB_decrypt($data,$key,$iv) {
+ $key = substr($key,0,32);
+ $iv = substr($iv,0,16);
+ return openssl_decrypt($data,'camellia-256-cfb',str_pad($key,32,"\0"),OPENSSL_RAW_DATA,str_pad($iv,16,"\0"));
}
+
function CAST5CBC_encrypt($data,$key,$iv) {
$key = substr($key,0,16);
$iv = substr($iv,0,8);
@@ -91,6 +107,20 @@ function CAST5CBC_decrypt($data,$key,$iv) {
return openssl_decrypt($data,'cast5-cbc',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
}
+function CAST5CFB_encrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_encrypt($data,'cast5-cfb',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
+}
+
+function CAST5CFB_decrypt($data,$key,$iv) {
+ $key = substr($key,0,16);
+ $iv = substr($iv,0,8);
+ return openssl_decrypt($data,'cast5-cfb',str_pad($key,16,"\0"),OPENSSL_RAW_DATA,str_pad($iv,8,"\0"));
+}
+
+
+
function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') {
$fn = strtoupper($alg) . '_encrypt';
@@ -142,17 +172,13 @@ function other_encapsulate($data,$pubkey,$alg) {
function crypto_methods() {
- if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
- return [ 'aes256cbc' ];
-
- // 'std' is the new project standard which is aes256cbc but transmits/receives 256-byte key and iv.
// aes256cbc is provided for compatibility with earlier zot implementations which assume 32-byte key and 16-byte iv.
// other_encapsulate() now produces these longer keys/ivs by default so that it is difficult to guess a
// particular implementation or choice of underlying implementations based on the key/iv length.
// The actual methods are responsible for deriving the actual key/iv from the provided parameters;
// possibly by truncation or segmentation - though many other methods could be used.
- $r = [ 'std', 'aes256cbc', 'aes128cbc', 'cast5cbc' ];
+ $r = [ 'aes256ctr', 'camellia256cfb', 'cast5cfb', 'aes256cbc', 'aes128cbc', 'cast5cbc' ];
call_hooks('crypto_methods',$r);
return $r;
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
index e47f97387..ad1d9d194 100755
--- a/include/dba/dba_driver.php
+++ b/include/dba/dba_driver.php
@@ -15,7 +15,7 @@ class DBA {
static public $scheme = 'mysql';
static public $logging = false;
- static public $install_script = 'install/schema_mysql.sql';
+ static public $install_script = 'schema_mysql.sql';
static public $null_date = '0001-01-01 00:00:00';
static public $utc_now = 'UTC_TIMESTAMP()';
static public $tquot = "`";
@@ -46,7 +46,7 @@ class DBA {
if(!($port))
$port = 5432;
- self::$install_script = 'install/schema_postgres.sql';
+ self::$install_script = 'schema_postgres.sql';
self::$utc_now = "now() at time zone 'UTC'";
self::$tquot = '"';
self::$scheme = 'pgsql';
@@ -163,7 +163,9 @@ abstract class dba_driver {
}
function get_install_script() {
- return \DBA::$install_script;
+ if(file_exists('install/' . PLATFORM_NAME . '/' . \DBA::$install_script))
+ return 'install/' . PLATFORM_NAME . '/' . \DBA::$install_script;
+ return 'install/' . \DBA::$install_script;
}
function get_table_quote() {
diff --git a/include/dir_fns.php b/include/dir_fns.php
index 3922730fc..2bd1228ec 100644
--- a/include/dir_fns.php
+++ b/include/dir_fns.php
@@ -185,26 +185,17 @@ function sync_directories($dirmode) {
/** @FIXME What to do if we're in a different realm? */
if ((! $r) && (z_root() != DIRECTORY_FALLBACK_MASTER)) {
- $r = array();
- $r[] = array(
- 'site_url' => DIRECTORY_FALLBACK_MASTER,
- 'site_flags' => DIRECTORY_MODE_PRIMARY,
- 'site_update' => NULL_DATE,
- 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
- 'site_realm' => DIRECTORY_REALM,
- 'site_valid' => 1,
- 'site_crypto' => 'aes256cbc'
-
- );
- $x = q("insert into site ( site_url, site_flags, site_update, site_directory, site_realm, site_valid, site_crypto )
- values ( '%s', %d, '%s', '%s', '%s', %d, '%s' ) ",
- dbesc($r[0]['site_url']),
- intval($r[0]['site_flags']),
- dbesc($r[0]['site_update']),
- dbesc($r[0]['site_directory']),
- dbesc($r[0]['site_realm']),
- intval($r[0]['site_valid']),
- dbesc($r[0]['site_crypto'])
+
+ $x = site_store_lowlevel(
+ [
+ 'site_url' => DIRECTORY_FALLBACK_MASTER,
+ 'site_flags' => DIRECTORY_MODE_PRIMARY,
+ 'site_update' => NULL_DATE,
+ 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch',
+ 'site_realm' => DIRECTORY_REALM,
+ 'site_valid' => 1,
+ 'site_crypto' => 'aes256cbc'
+ ]
);
$r = q("select * from site where site_flags in (%d, %d) and site_url != '%s' and site_type = %d ",
diff --git a/include/environment.php b/include/environment.php
index 11d465b84..96a614821 100644
--- a/include/environment.php
+++ b/include/environment.php
@@ -65,4 +65,4 @@ function phpiniSizeToBytes($val) {
}
return (int)$val;
-} \ No newline at end of file
+}
diff --git a/include/event.php b/include/event.php
index cf1cc331d..c57e52bc0 100644
--- a/include/event.php
+++ b/include/event.php
@@ -249,6 +249,15 @@ function bbtoevent($s) {
$ev = array();
+
+ $match = '';
+ if(preg_match("/\[event\](.*?)\[\/event\]/is",$s,$match)) {
+ // only parse one object per event tag
+ $x = ical_to_ev($match[1]);
+ if($x)
+ $ev = $x[0];
+ }
+
$match = '';
if(preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match))
$ev['summary'] = $match[1];
@@ -283,6 +292,8 @@ function bbtoevent($s) {
$ev['nofinish'] = 1;
}
+// logger('bbtoevent: ' . print_r($ev,true));
+
return $ev;
}
@@ -555,6 +566,136 @@ function event_addtocal($item_id, $uid) {
}
+function ical_to_ev($s) {
+ require_once('vendor/autoload.php');
+
+ $saved_timezone = date_default_timezone_get();
+ date_default_timezone_set('Australia/Sydney');
+
+ $ical = VObject\Reader::read($s);
+
+ $ev = [];
+
+ if($ical) {
+ if($ical->VEVENT) {
+ foreach($ical->VEVENT as $event) {
+ $ev[] = parse_vobject($event,'event');
+ }
+ }
+ if($ical->VTODO) {
+ foreach($ical->VTODO as $event) {
+ $ev[] = parse_vobject($event,'task');
+ }
+ }
+ }
+
+ date_default_timezone_set($saved_timezone);
+
+ return $ev;
+
+}
+
+
+
+function parse_vobject($ical, $type) {
+
+
+ $ev = [];
+
+ if(! isset($ical->DTSTART)) {
+ logger('no event start');
+ return $ev;
+ }
+
+ $ev['etype'] = $type;
+
+ $dtstart = $ical->DTSTART->getDateTime();
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
+
+ $ev['dtstart'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtstart->format(\DateTime::W3C));
+
+
+ if(isset($ical->DUE)) {
+ $dtend = $ical->DUE->getDateTime();
+ $ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtend->format(\DateTime::W3C));
+ }
+ elseif(isset($ical->DTEND)) {
+ $dtend = $ical->DTEND->getDateTime();
+ $ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
+ $dtend->format(\DateTime::W3C));
+ }
+ else
+ $ev['nofinish'] = 1;
+
+
+ if($ev['dtstart'] === $ev['dtend'])
+ $ev['nofinish'] = 1;
+
+ if(isset($ical->CREATED)) {
+ $created = $ical->CREATED->getDateTime();
+ $ev['created'] = datetime_convert('UTC','UTC',$created->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'DTSTAMP'})) {
+ $edited = $ical->{'DTSTAMP'}->getDateTime();
+ $ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
+ }
+ if(isset($ical->{'LAST-MODIFIED'})) {
+ $edited = $ical->{'LAST-MODIFIED'}->getDateTime();
+ $ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'X-ZOT-LOCATION'}))
+ $ev['location'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-LOCATION'});
+ elseif(isset($ical->LOCATION))
+ $ev['location'] = (string) $ical->LOCATION;
+
+ if(isset($ical->{'X-ZOT-DESCRIPTION'}))
+ $ev['description'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-DESCRIPTION'});
+ elseif(isset($ical->DESCRIPTION))
+ $ev['description'] = (string) $ical->DESCRIPTION;
+
+ if(isset($ical->{'X-ZOT-SUMMARY'}))
+ $ev['summary'] = event_ical_get_sourcetext( (string) $ical->{'X-ZOT-SUMMARY'});
+ elseif(isset($ical->SUMMARY))
+ $ev['summary'] = (string) $ical->SUMMARY;
+
+ if(isset($ical->PRIORITY))
+ $ev['event_priority'] = intval((string) $ical->PRIORITY);
+
+ if(isset($ical->UID)) {
+ $evuid = (string) $ical->UID;
+ $ev['event_hash'] = $evuid;
+ }
+
+ if(isset($ical->SEQUENCE)) {
+ $ev['event_sequence'] = (string) $ical->SEQUENCE;
+ }
+
+ if(isset($ical->STATUS)) {
+ $ev['event_status'] = (string) $ical->STATUS;
+ }
+
+ if(isset($ical->{'COMPLETED'})) {
+ $completed = $ical->{'COMPLETED'}->getDateTime();
+ $ev['event_status_date'] = datetime_convert('UTC','UTC',$completed->format(\DateTime::W3C));
+ }
+
+ if(isset($ical->{'PERCENT-COMPLETE'})) {
+ $ev['event_percent'] = (string) $ical->{'PERCENT-COMPLETE'} ;
+ }
+
+ $ev['event_vdata'] = $ical->serialize();
+
+ return $ev;
+}
+
+
+
+
+
function parse_ical_file($f,$uid) {
require_once('vendor/autoload.php');
@@ -610,22 +751,21 @@ function event_import_ical($ical, $uid) {
}
$dtstart = $ical->DTSTART->getDateTime();
- $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 1 : 0);
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
// logger('dtstart: ' . var_export($dtstart,true));
$ev['dtstart'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
$dtstart->format(\DateTime::W3C));
-
if(isset($ical->DTEND)) {
$dtend = $ical->DTEND->getDateTime();
$ev['dtend'] = datetime_convert((($ev['adjust']) ? 'UTC' : date_default_timezone_get()),'UTC',
$dtend->format(\DateTime::W3C));
}
- else
+ else {
$ev['nofinish'] = 1;
-
+ }
if($ev['dtstart'] === $ev['dtend'])
$ev['nofinish'] = 1;
@@ -635,6 +775,7 @@ function event_import_ical($ical, $uid) {
$ev['created'] = datetime_convert('UTC','UTC',$created->format(\DateTime::W3C));
}
+
if(isset($ical->{'LAST-MODIFIED'})) {
$edited = $ical->{'LAST-MODIFIED'}->getDateTime();
$ev['edited'] = datetime_convert('UTC','UTC',$edited->format(\DateTime::W3C));
@@ -713,7 +854,7 @@ function event_import_ical_task($ical, $uid) {
$dtstart = $ical->DTSTART->getDateTime();
- $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 1 : 0);
+ $ev['adjust'] = (($ical->DTSTART->isFloating()) ? 0 : 1);
// logger('dtstart: ' . var_export($dtstart,true));
diff --git a/include/feedutils.php b/include/feedutils.php
index b122a8e4b..d1985649d 100644
--- a/include/feedutils.php
+++ b/include/feedutils.php
@@ -793,6 +793,10 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
+ if($datarray['mid'])
+ $datarray['mid'] = normalise_id($item->get_id());
+
+
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
@@ -865,6 +869,9 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
+ if($datarray['mid'])
+ $datarray['mid'] = normalise_id($item->get_id());
+
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
@@ -939,6 +946,7 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
continue;
}
+
$datarray['parent_mid'] = $item_id;
$datarray['uid'] = $importer['channel_id'];
$datarray['aid'] = $importer['channel_account_id'];
diff --git a/include/help.php b/include/help.php
index 6e779f000..e4725575d 100644
--- a/include/help.php
+++ b/include/help.php
@@ -1,5 +1,7 @@
<?php
+use \Michelf\MarkdownExtra;
+
/**
* @brief
*
@@ -15,7 +17,7 @@ function get_help_content($tocpath = false) {
$text = '';
$path = (($tocpath !== false) ? $tocpath : '');
-
+
if($tocpath === false && argc() > 1) {
$path = '';
for($x = 1; $x < argc(); $x ++) {
@@ -55,7 +57,7 @@ function get_help_content($tocpath = false) {
if(! $text) {
$doctype = 'bbcode';
$text = load_doc_file('doc/main.bb');
- goaway('/help/about/about_hubzilla');
+ goaway('/help/about/about_hubzilla');
\App::$page['title'] = t('Help');
}
@@ -69,12 +71,11 @@ function get_help_content($tocpath = false) {
}
if($doctype === 'html')
- $content = parseIdentityAwareHTML($text);
- if($doctype === 'markdown') {
- require_once('library/markdown.php');
+ $content = parseIdentityAwareHTML($text);
+ if($doctype === 'markdown') {
# escape #include tags
$text = preg_replace('/#include/ism', '%%include', $text);
- $content = Markdown($text);
+ $content = MarkdownExtra::defaultTransform($text);
$content = preg_replace('/%%include/ism', '#include', $content);
}
if($doctype === 'bbcode') {
@@ -99,8 +100,7 @@ function preg_callback_help_include($matches) {
$include = str_replace(' target="_blank"','',$include);
}
elseif(preg_match('/\.md$/', $matches[1])) {
- require_once('library/markdown.php');
- $include = Markdown($include);
+ $include = MarkdownExtra::defaultTransform($include);
}
return $include;
}
diff --git a/include/hubloc.php b/include/hubloc.php
index e17be028c..0daa5908c 100644
--- a/include/hubloc.php
+++ b/include/hubloc.php
@@ -1,6 +1,17 @@
-<?php /** @file */
-
-
+<?php
+/**
+ * @file include/hubloc.php
+ * @brief Hubloc related functions.
+ */
+
+/**
+ * @brief Create an array for hubloc table and insert record.
+ *
+ * Creates an assoziative array which will be inserted into the hubloc table.
+ *
+ * @param array $arr An assoziative array with hubloc values
+ * @return boolean|PDOStatement
+ */
function hubloc_store_lowlevel($arr) {
$store = [
@@ -25,12 +36,38 @@ function hubloc_store_lowlevel($arr) {
'hubloc_deleted' => ((array_key_exists('hubloc_deleted',$arr)) ? $arr['hubloc_deleted'] : 0)
];
- return create_table_from_array('hubloc',$store);
+ return create_table_from_array('hubloc', $store);
+}
+
+function site_store_lowlevel($arr) {
+ $store = [
+ 'site_url' => ((array_key_exists('site_url',$arr)) ? $arr['site_url'] : ''),
+ 'site_access' => ((array_key_exists('site_access',$arr)) ? $arr['site_access'] : 0),
+ 'site_flags' => ((array_key_exists('site_flags',$arr)) ? $arr['site_flags'] : 0),
+ 'site_update' => ((array_key_exists('site_update',$arr)) ? $arr['site_update'] : NULL_DATE),
+ 'site_pull' => ((array_key_exists('site_pull',$arr)) ? $arr['site_pull'] : NULL_DATE),
+ 'site_sync' => ((array_key_exists('site_sync',$arr)) ? $arr['site_sync'] : NULL_DATE),
+ 'site_directory' => ((array_key_exists('site_directory',$arr)) ? $arr['site_directory'] : ''),
+ 'site_register' => ((array_key_exists('site_register',$arr)) ? $arr['site_register'] : 0),
+ 'site_sellpage' => ((array_key_exists('site_sellpage',$arr)) ? $arr['site_sellpage'] : ''),
+ 'site_location' => ((array_key_exists('site_location',$arr)) ? $arr['site_location'] : ''),
+ 'site_realm' => ((array_key_exists('site_realm',$arr)) ? $arr['site_realm'] : ''),
+ 'site_valid' => ((array_key_exists('site_valid',$arr)) ? $arr['site_valid'] : 0),
+ 'site_dead' => ((array_key_exists('site_dead',$arr)) ? $arr['site_dead'] : 0),
+ 'site_type' => ((array_key_exists('site_type',$arr)) ? $arr['site_type'] : 0),
+ 'site_project' => ((array_key_exists('site_project',$arr)) ? $arr['site_project'] : ''),
+ 'site_version' => ((array_key_exists('site_version',$arr)) ? $arr['site_version'] : ''),
+ 'site_crypto' => ((array_key_exists('site_crypto',$arr)) ? $arr['site_crypto'] : '')
+ ];
+
+ return create_table_from_array('site', $store);
}
+
+
function prune_hub_reinstalls() {
$r = q("select site_url from site where site_type = %d",
@@ -45,9 +82,8 @@ function prune_hub_reinstalls() {
// see if this url has more than one sitekey, indicating it has been re-installed.
if(count($x) > 1) {
-
- $d1 = datetime_convert('UTC','UTC',$x[0]['c']);
- $d2 = datetime_convert('UTC','UTC','now - 3 days');
+ $d1 = datetime_convert('UTC', 'UTC', $x[0]['c']);
+ $d2 = datetime_convert('UTC', 'UTC', 'now - 3 days');
// allow some slop period, say 3 days - just in case this is a glitch or transient occurrence
// Then remove any hublocs pointing to the oldest entry.
@@ -63,18 +99,22 @@ function prune_hub_reinstalls() {
}
}
-function remove_obsolete_hublocs() {
-
- logger('remove_obsolete_hublocs',LOGGER_DEBUG);
- // Get rid of any hublocs which are ours but aren't valid anymore -
- // e.g. they point to a different and perhaps transient URL that we aren't using.
+/**
+ * @brief Remove obsolete hublocs.
+ *
+ * Get rid of any hublocs which are ours but aren't valid anymore -
+ * e.g. they point to a different and perhaps transient URL that we aren't using.
+ *
+ * I need to stress that this shouldn't happen. fix_system_urls() fixes hublocs
+ * when it discovers the URL has changed. So it's unclear how we could end up
+ * with URLs pointing to the old site name. But it happens. This may be an artifact
+ * of an old bug or maybe a regression in some newer code. In any event, they
+ * mess up communications and we have to take action if we find any.
+ */
+function remove_obsolete_hublocs() {
- // I need to stress that this shouldn't happen. fix_system_urls() fixes hublocs
- // when it discovers the URL has changed. So it's unclear how we could end up
- // with URLs pointing to the old site name. But it happens. This may be an artifact
- // of an old bug or maybe a regression in some newer code. In any event, they
- // mess up communications and we have to take action if we find any.
+ logger('remove_obsolete_hublocs', LOGGER_DEBUG);
// First make sure we have any hublocs (at all) with this URL and sitekey.
// We don't want to perform this operation while somebody is in the process
@@ -82,27 +122,25 @@ function remove_obsolete_hublocs() {
$r = q("select hubloc_id from hubloc where hubloc_url = '%s' and hubloc_sitekey = '%s'",
dbesc(z_root()),
- dbesc(get_config('system','pubkey'))
+ dbesc(get_config('system', 'pubkey'))
);
if((! $r) || (! count($r)))
return;
- $channels = array();
-
// Good. We have at least one *valid* hubloc.
// Do we have any invalid ones?
$r = q("select hubloc_id from hubloc where hubloc_sitekey = '%s' and hubloc_url != '%s'",
- dbesc(get_config('system','pubkey')),
+ dbesc(get_config('system', 'pubkey')),
dbesc(z_root())
);
$p = q("select hubloc_id from hubloc where hubloc_sitekey != '%s' and hubloc_url = '%s'",
- dbesc(get_config('system','pubkey')),
+ dbesc(get_config('system', 'pubkey')),
dbesc(z_root())
);
if(is_array($r) && is_array($p))
- $r = array_merge($r,$p);
+ $r = array_merge($r, $p);
if(! $r)
return;
@@ -111,8 +149,8 @@ function remove_obsolete_hublocs() {
logger('remove_obsolete_hublocs: removing ' . count($r) . ' hublocs.');
- $interval = ((get_config('system','delivery_interval') !== false)
- ? intval(get_config('system','delivery_interval')) : 2 );
+ $interval = ((get_config('system', 'delivery_interval') !== false)
+ ? intval(get_config('system', 'delivery_interval')) : 2 );
foreach($r as $rr) {
q("update hubloc set hubloc_deleted = 1 where hubloc_id = %d",
@@ -120,10 +158,10 @@ function remove_obsolete_hublocs() {
);
$x = q("select channel_id from channel where channel_hash = '%s' limit 1",
- dbesc($rr['hubloc_hash'])
+ dbesc($rr['hubloc_hash'])
);
if($x) {
- Zotlabs\Daemon\Master::Summon(array('Notifier','location',$x[0]['channel_id']));
+ Zotlabs\Daemon\Master::Summon(array('Notifier', 'location', $x[0]['channel_id']));
if($interval)
@time_sleep_until(microtime(true) + (float) $interval);
}
@@ -131,8 +169,15 @@ function remove_obsolete_hublocs() {
}
-// This actually changes other structures to match the given (presumably current) hubloc primary selection
-
+/**
+ * @brief Change primary hubloc.
+ *
+ * This actually changes other structures to match the given (presumably current)
+ * hubloc primary selection.
+ *
+ * @param array $hubloc
+ * @return boolean
+ */
function hubloc_change_primary($hubloc) {
if(! is_array($hubloc)) {
@@ -170,7 +215,7 @@ function hubloc_change_primary($hubloc) {
dbesc($hubloc['hubloc_hash'])
);
if(! $r) {
- logger('xchan not found');
+ logger('xchan not found');
return false;
}
if($r[0]['xchan_addr'] === $hubloc['hubloc_addr']) {
@@ -179,7 +224,7 @@ function hubloc_change_primary($hubloc) {
}
$url = $hubloc['hubloc_url'];
- $lwebbie = substr($hubloc['hubloc_addr'],0,strpos($hubloc['hubloc_addr'],'@'));
+ $lwebbie = substr($hubloc['hubloc_addr'], 0, strpos($hubloc['hubloc_addr'], '@'));
$r = q("update xchan set xchan_addr = '%s', xchan_url = '%s', xchan_follow = '%s', xchan_connurl = '%s' where xchan_hash = '%s'",
dbesc($hubloc['hubloc_addr']),
@@ -191,14 +236,19 @@ function hubloc_change_primary($hubloc) {
if(! $r)
logger('xchan_update failed.');
- logger('primary hubloc changed.' . print_r($hubloc,true),LOGGER_DEBUG);
+ logger('primary hubloc changed.' . print_r($hubloc, true), LOGGER_DEBUG);
return true;
-
}
-// We use the post url to distinguish between http and https hublocs.
-// The https might be alive, and the http dead.
+/**
+ * @brief Mark a hubloc as down.
+ *
+ * We use the post url to distinguish between http and https hublocs.
+ * The https might be alive, and the http dead.
+ *
+ * @param string $posturl Hubloc callback url which to disable
+ */
function hubloc_mark_as_down($posturl) {
$r = q("update hubloc set hubloc_status = ( hubloc_status | %d ) where hubloc_callback = '%s'",
intval(HUBLOC_OFFLINE),
@@ -208,22 +258,21 @@ function hubloc_mark_as_down($posturl) {
-
function ping_site($url) {
$ret = array('success' => false);
$sys = get_sys_channel();
- $m = zot_build_packet($sys,'ping');
- $r = zot_zot($url . '/post',$m);
+ $m = zot_build_packet($sys, 'ping');
+ $r = zot_zot($url . '/post', $m);
if(! $r['success']) {
$ret['message'] = 'no answer from ' . $url;
return $ret;
}
- $packet_result = json_decode($r['body'],true);
+ $packet_result = json_decode($r['body'], true);
if(! $packet_result['success']) {
- $ret['message'] = 'packet failure from ' . $url;
+ $ret['message'] = 'packet failure from ' . $url;
return $ret;
}
diff --git a/include/import.php b/include/import.php
index 5c73b7ca3..9007dbe74 100644
--- a/include/import.php
+++ b/include/import.php
@@ -1,8 +1,19 @@
<?php
+use Zotlabs\Lib\IConfig;
+
require_once('include/menu.php');
require_once('include/perm_upgrade.php');
+
+/**
+ * @brief Import a channel.
+ *
+ * @param array $channel
+ * @param int $account_id
+ * @param int $seize
+ * @return boolean|array
+ */
function import_channel($channel, $account_id, $seize) {
if(! array_key_exists('channel_system',$channel)) {
@@ -51,7 +62,7 @@ function import_channel($channel, $account_id, $seize) {
notice( t('Unable to create a unique channel address. Import failed.') . EOL);
return false;
}
- }
+ }
}
unset($channel['channel_id']);
@@ -66,12 +77,12 @@ function import_channel($channel, $account_id, $seize) {
// remove all the permissions related settings, we will import/upgrade them after the channel
// is created.
- $disallowed = [
- 'channel_id', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
- 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
- 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
- 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
- 'channel_a_delegate', 'perm_limits'
+ $disallowed = [
+ 'channel_id', 'channel_r_stream', 'channel_r_profile', 'channel_r_abook',
+ 'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
+ 'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
+ 'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
+ 'channel_a_delegate', 'perm_limits'
];
$clean = array();
@@ -85,15 +96,9 @@ function import_channel($channel, $account_id, $seize) {
create_table_from_array('channel',$clean);
}
- if(! $r) {
- logger('mod_import: channel clone failed. ' . print_r($channel,true));
- notice( t('Channel clone failed. Import failed.') . EOL);
- return false;
- }
-
$r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
intval($account_id),
- $channel['channel_guid'] // Already dbesc'd
+ dbesc($channel['channel_guid'])
);
if(! $r) {
logger('mod_import: channel not found. ' . print_r($channel,true));
@@ -114,24 +119,37 @@ function import_channel($channel, $account_id, $seize) {
set_default_login_identity($account_id,$channel['channel_id'],false);
logger('import step 1');
$_SESSION['import_step'] = 1;
- return $channel;
+ return $channel;
}
-function import_config($channel,$configs) {
+/**
+ * @brief Import pconfig for channel.
+ *
+ * @param array $channel
+ * @param array $configs
+ */
+function import_config($channel, $configs) {
if($channel && $configs) {
foreach($configs as $config) {
unset($config['id']);
$config['uid'] = $channel['channel_id'];
- create_table_from_array('pconfig',$config);
+
+ create_table_from_array('pconfig', $config);
}
+
load_pconfig($channel['channel_id']);
- }
+ }
}
-
-function import_profiles($channel,$profiles) {
+/**
+ * @brief Import profiles.
+ *
+ * @param array $channel
+ * @param array $profiles
+ */
+function import_profiles($channel, $profiles) {
if($channel && $profiles) {
foreach($profiles as $profile) {
@@ -143,19 +161,29 @@ function import_profiles($channel,$profiles) {
convert_oldfields($profile,'with','partner');
convert_oldfields($profile,'work','employment');
+ /**
+ * @TODO we are going to reset all profile photos to the original
+ * somebody will have to fix this later and put all the applicable
+ * photos into the export.
+ */
- // we are going to reset all profile photos to the original
- // somebody will have to fix this later and put all the applicable photos into the export
-
$profile['photo'] = z_root() . '/photo/profile/l/' . $channel['channel_id'];
$profile['thumb'] = z_root() . '/photo/profile/m/' . $channel['channel_id'];
- create_table_from_array('profile',$profile);
+
+ create_table_from_array('profile', $profile);
}
}
}
-
-function import_hublocs($channel,$hublocs,$seize,$moving = false) {
+/**
+ * @brief Import hublocs.
+ *
+ * @param array $channel
+ * @param array $hublocs
+ * @param unknown $seize
+ * @param boolean $moving
+ */
+function import_hublocs($channel, $hublocs, $seize, $moving = false) {
if($channel && $hublocs) {
foreach($hublocs as $hubloc) {
@@ -167,45 +195,49 @@ function import_hublocs($channel,$hublocs,$seize,$moving = false) {
}
if(! array_key_exists('hubloc_primary',$hubloc)) {
- $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0);
- $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0);
- $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0);
- $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0);
+ $hubloc['hubloc_primary'] = (($hubloc['hubloc_flags'] & 0x0001) ? 1 : 0);
+ $hubloc['hubloc_orphancheck'] = (($hubloc['hubloc_flags'] & 0x0004) ? 1 : 0);
+ $hubloc['hubloc_error'] = (($hubloc['hubloc_status'] & 0x0003) ? 1 : 0);
+ $hubloc['hubloc_deleted'] = (($hubloc['hubloc_flags'] & 0x1000) ? 1 : 0);
}
if($moving && $hubloc['hubloc_hash'] === $channel['channel_hash'] && $hubloc['hubloc_url'] !== z_root()) {
$hubloc['hubloc_deleted'] = 1;
}
- $arr = array(
- 'guid' => $hubloc['hubloc_guid'],
+ $arr = [
+ 'guid' => $hubloc['hubloc_guid'],
'guid_sig' => $hubloc['hubloc_guid_sig'],
- 'url' => $hubloc['hubloc_url'],
- 'url_sig' => $hubloc['hubloc_url_sig'],
- 'sitekey' => ((array_key_exists('hubloc_sitekey',$hubloc)) ? $hubloc['hubloc_sitekey'] : '')
- );
+ 'url' => $hubloc['hubloc_url'],
+ 'url_sig' => $hubloc['hubloc_url_sig'],
+ 'sitekey' => ((array_key_exists('hubloc_sitekey',$hubloc)) ? $hubloc['hubloc_sitekey'] : '')
+ ];
+
if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && intval($hubloc['hubloc_primary']) && ($seize))
$hubloc['hubloc_primary'] = 0;
- if(($x = zot_gethub($arr,false)) === false) {
+ if(($x = zot_gethub($arr,false)) === false) {
unset($hubloc['hubloc_id']);
- create_table_from_array('hubloc',$hubloc);
+ create_table_from_array('hubloc', $hubloc);
}
else {
q("UPDATE hubloc set hubloc_primary = %d, hubloc_deleted = %d where hubloc_id = %d",
intval($hubloc['hubloc_primary']),
intval($hubloc['hubloc_deleted']),
intval($x['hubloc_id'])
- );
-
+ );
}
}
}
}
-
-
-function import_objs($channel,$objs) {
+/**
+ * @brief Import things.
+ *
+ * @param array $channel
+ * @param array $objs
+ */
+function import_objs($channel, $objs) {
if($channel && $objs) {
foreach($objs as $obj) {
@@ -220,21 +252,27 @@ function import_objs($channel,$objs) {
$obj['obj_channel'] = $channel['channel_id'];
- if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) {
- $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']);
+ if($baseurl && (strpos($obj['obj_url'], $baseurl . '/thing/') !== false)) {
+ $obj['obj_url'] = str_replace($baseurl, z_root(), $obj['obj_url']);
}
if($obj['obj_imgurl']) {
- $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($obj['obj_imgurl'], $channel['channel_hash'], true);
$obj['obj_imgurl'] = $x[0];
}
- create_table_from_array('obj',$obj);
+ create_table_from_array('obj', $obj);
}
}
}
-function sync_objs($channel,$objs) {
+/**
+ * @brief Import things.
+ *
+ * @param array $channel
+ * @param array $objs
+ */
+function sync_objs($channel, $objs) {
if($channel && $objs) {
foreach($objs as $obj) {
@@ -257,8 +295,8 @@ function sync_objs($channel,$objs) {
$obj['obj_channel'] = $channel['channel_id'];
- if($baseurl && (strpos($obj['obj_url'],$baseurl . '/thing/') !== false)) {
- $obj['obj_url'] = str_replace($baseurl,z_root(),$obj['obj_url']);
+ if($baseurl && (strpos($obj['obj_url'], $baseurl . '/thing/') !== false)) {
+ $obj['obj_url'] = str_replace($baseurl, z_root(), $obj['obj_url']);
}
$exists = false;
@@ -275,12 +313,12 @@ function sync_objs($channel,$objs) {
}
if($obj['obj_imgurl']) {
- $x = import_xchan_photo($obj['obj_imgurl'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($obj['obj_imgurl'], $channel['channel_hash'], true);
$obj['obj_imgurl'] = $x[0];
}
$hash = $obj['obj_obj'];
-
+
if($exists) {
unset($obj['obj_obj']);
foreach($obj as $k => $v) {
@@ -292,23 +330,25 @@ function sync_objs($channel,$objs) {
);
}
}
- else {
- create_table_from_array('obj',$obj);
+ else {
+ create_table_from_array('obj', $obj);
}
}
}
}
-
-
-
-
-function import_apps($channel,$apps) {
+/**
+ * @brief Import apps.
+ *
+ * @param array $channel
+ * @param array $apps
+ */
+function import_apps($channel, $apps) {
if($channel && $apps) {
foreach($apps as $app) {
- $term = ((array_key_exists('term',$app) && is_array($app['term'])) ? $app['term'] : null);
+ $term = ((array_key_exists('term',$app) && is_array($app['term'])) ? $app['term'] : null);
unset($app['id']);
unset($app['app_channel']);
@@ -317,13 +357,13 @@ function import_apps($channel,$apps) {
$app['app_channel'] = $channel['channel_id'];
if($app['app_photo']) {
- $x = import_xchan_photo($app['app_photo'],$channel['channel_hash'],true);
+ $x = import_xchan_photo($app['app_photo'], $channel['channel_hash'], true);
$app['app_photo'] = $x[0];
}
$hash = $app['app_id'];
- create_table_from_array('app',$app);
+ create_table_from_array('app', $app);
if($term) {
$x = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
@@ -334,20 +374,22 @@ function import_apps($channel,$apps) {
foreach($term as $t) {
if(array_key_exists('type',$t))
$t['ttype'] = $t['type'];
+
store_item_tag($channel['channel_id'],$x[0]['id'],TERM_OBJ_APP,$t['ttype'],escape_tags($t['term']),escape_tags($t['url']));
}
}
}
-
-
-
}
}
}
-
-
-function sync_apps($channel,$apps) {
+/**
+ * @brief Sync apps.
+ *
+ * @param array $channel
+ * @param array $apps
+ */
+function sync_apps($channel, $apps) {
if($channel && $apps) {
foreach($apps as $app) {
@@ -362,20 +404,20 @@ function sync_apps($channel,$apps) {
if($x) {
$exists = $x[0];
}
-
+
if(array_key_exists('app_deleted',$app) && $app['app_deleted'] && $app['app_id']) {
- q("delete from app where app_id = '%s' and app_channel = %d",
- dbesc($app['app_id']),
- intval($channel['channel_id'])
- );
+ q("delete from app where app_id = '%s' and app_channel = %d",
+ dbesc($app['app_id']),
+ intval($channel['channel_id'])
+ );
if($exists) {
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($exists['id'])
- );
+ );
}
- continue;
- }
+ continue;
+ }
unset($app['id']);
unset($app['app_channel']);
@@ -385,7 +427,7 @@ function sync_apps($channel,$apps) {
q("delete from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($exists['id'])
- );
+ );
}
if((! $app['app_created']) || ($app['app_created'] <= NULL_DATE))
@@ -446,9 +488,13 @@ function sync_apps($channel,$apps) {
}
}
-
-
-function import_chatrooms($channel,$chatrooms) {
+/**
+ * @brief Import chatrooms.
+ *
+ * @param array $channel
+ * @param array $chatrooms
+ */
+function import_chatrooms($channel, $chatrooms) {
if($channel && $chatrooms) {
foreach($chatrooms as $chatroom) {
@@ -463,14 +509,18 @@ function import_chatrooms($channel,$chatrooms) {
$chatroom['cr_aid'] = $channel['channel_account_id'];
$chatroom['cr_uid'] = $channel['channel_id'];
- create_table_from_array('chatroom',$chatroom);
+ create_table_from_array('chatroom', $chatroom);
}
}
}
-
-
-function sync_chatrooms($channel,$chatrooms) {
+/**
+ * @brief Sync chatrooms.
+ *
+ * @param array $channel
+ * @param array $chatrooms
+ */
+function sync_chatrooms($channel, $chatrooms) {
if($channel && $chatrooms) {
foreach($chatrooms as $chatroom) {
@@ -479,13 +529,12 @@ function sync_chatrooms($channel,$chatrooms) {
continue;
if(array_key_exists('cr_deleted',$chatroom) && $chatroom['cr_deleted']) {
- q("delete from chatroom where cr_name = '%s' and cr_uid = %d",
- dbesc($chatroom['cr_name']),
- intval($channel['channel_id'])
- );
- continue;
- }
-
+ q("delete from chatroom where cr_name = '%s' and cr_uid = %d",
+ dbesc($chatroom['cr_name']),
+ intval($channel['channel_id'])
+ );
+ continue;
+ }
unset($chatroom['cr_id']);
unset($chatroom['cr_aid']);
@@ -508,6 +557,7 @@ function sync_chatrooms($channel,$chatrooms) {
if($x) {
if($x[0]['cr_edited'] >= $chatroom['cr_edited'])
continue;
+
$exists = true;
}
$name = $chatroom['cr_name'];
@@ -523,29 +573,28 @@ function sync_chatrooms($channel,$chatrooms) {
}
}
else {
- create_table_from_array('chatroom',$chatroom);
+ create_table_from_array('chatroom', $chatroom);
}
}
}
}
-
-function import_items($channel,$items,$sync = false,$relocate = null) {
+/**
+ * @brief Import items to channel.
+ *
+ * @param array $channel where to import to
+ * @param array $items
+ * @param boolean $sync
+ * @param array $relocate default null
+ */
+function import_items($channel, $items, $sync = false, $relocate = null) {
if($channel && $items) {
- $allow_code = false;
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id
- where channel_id = %d limit 1",
- intval($channel['channel_id'])
- );
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- $allow_code = true;
- }
- }
- $deliver = false; // Don't deliver any messages or notifications when importing
+ $allow_code = channel_codeallowed($channel['channel_id']);
+
+ $deliver = false; // Don't deliver any messages or notifications when importing
foreach($items as $i) {
$item_result = false;
@@ -563,14 +612,14 @@ function import_items($channel,$items,$sync = false,$relocate = null) {
);
if($r) {
- // flags may have changed and we are probably relocating the post,
+ // flags may have changed and we are probably relocating the post,
// so force an update even if we have the same timestamp
if($item['edited'] >= $r[0]['edited']) {
$item['id'] = $r[0]['id'];
$item['uid'] = $channel['channel_id'];
$item_result = item_store_update($item,$allow_code,$deliver);
- }
+ }
}
else {
$item['aid'] = $channel['channel_account_id'];
@@ -592,9 +641,17 @@ function import_items($channel,$items,$sync = false,$relocate = null) {
}
}
-
-function sync_items($channel,$items,$relocate = null) {
- import_items($channel,$items,true,$relocate);
+/**
+ * @brief Sync items to channel.
+ *
+ * @see import_items
+ *
+ * @param array $channel where to import to
+ * @param array $items
+ * @param array $relocate default null
+ */
+function sync_items($channel, $items, $relocate = null) {
+ import_items($channel, $items, true, $relocate);
}
@@ -608,20 +665,26 @@ function import_item_ids($channel,$itemids) {
);
if(! $r)
continue;
- $z = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = '%s'
+ $z = q("select * from iconfig where iconfig.cat = 'system' and iconfig.k = '%s'
and iconfig.v = '%s' and iid = %d limit 1",
dbesc($i['service']),
dbesc($i['sid']),
intval($r[0]['id'])
);
if(! $z) {
- \Zotlabs\Lib\IConfig::Set($r[0]['id'],'system',$i['service'],$i['sid'],true);
+ IConfig::Set($r[0]['id'],'system',$i['service'],$i['sid'],true);
}
}
}
}
-function import_events($channel,$events) {
+/**
+ * @brief Import events.
+ *
+ * @param array $channel
+ * @param array $events
+ */
+function import_events($channel, $events) {
if($channel && $events) {
foreach($events as $event) {
@@ -633,13 +696,18 @@ function import_events($channel,$events) {
convert_oldfields($event,'type','etype');
convert_oldfields($event,'ignore','dismissed');
- create_table_from_array('event',$event);
+ create_table_from_array('event', $event);
}
}
}
-
-function sync_events($channel,$events) {
+/**
+ * @brief Sync events.
+ *
+ * @param array $channel
+ * @param array $events
+ */
+function sync_events($channel, $events) {
if($channel && $events) {
foreach($events as $event) {
@@ -651,7 +719,7 @@ function sync_events($channel,$events) {
$r = q("delete from event where event_hash = '%s' and uid = %d",
dbesc($event['event_hash']),
intval($channel['channel_id'])
- );
+ );
continue;
}
@@ -664,7 +732,6 @@ function sync_events($channel,$events) {
convert_oldfields($event,'type','etype');
convert_oldfields($event,'ignore','dismissed');
-
$exists = false;
$x = q("select * from event where event_hash = '%s' and uid = %d limit 1",
@@ -674,6 +741,7 @@ function sync_events($channel,$events) {
if($x) {
if($x[0]['edited'] >= $event['edited'])
continue;
+
$exists = true;
}
@@ -688,15 +756,19 @@ function sync_events($channel,$events) {
}
}
else {
- create_table_from_array('event',$event);
+ create_table_from_array('event', $event);
}
}
}
}
-
-function import_menus($channel,$menus) {
-
+/**
+ * @brief Import menus.
+ *
+ * @param array $channel
+ * @param array $menus
+ */
+function import_menus($channel, $menus) {
if($channel && $menus) {
foreach($menus as $menu) {
@@ -715,7 +787,6 @@ function import_menus($channel,$menus) {
$m['menu_flags'] |= MENU_BOOKMARK;
if(in_array('system',$menu['flags']))
$m['menu_flags'] |= MENU_SYSTEM;
-
}
$menu_id = menu_create($m);
@@ -743,16 +814,19 @@ function import_menus($channel,$menus) {
}
menu_add_item($menu_id,$channel['channel_id'],$mitem);
}
- }
+ }
}
}
}
-
-
}
-
-function sync_menus($channel,$menus) {
+/**
+ * @brief Sync menus.
+ *
+ * @param array $channel
+ * @param array $menus
+ */
+function sync_menus($channel, $menus) {
if($channel && $menus) {
foreach($menus as $menu) {
@@ -809,7 +883,6 @@ function sync_menus($channel,$menus) {
foreach($menu['items'] as $it) {
$mitem = array();
-
$mitem['mitem_link'] = str_replace('[channelurl]',z_root() . '/channel/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[pageurl]',z_root() . '/page/' . $channel['channel_address'],$it['link']);
$mitem['mitem_link'] = str_replace('[cloudurl]',z_root() . '/cloud/' . $channel['channel_address'],$it['link']);
@@ -828,15 +901,19 @@ function sync_menus($channel,$menus) {
}
menu_add_item($menu_id,$channel['channel_id'],$mitem);
}
- }
+ }
}
}
}
}
-
-
-function import_likes($channel,$likes) {
+/**
+ * @brief Import likes.
+ *
+ * @param array $channel
+ * @param array $likes
+ */
+function import_likes($channel, $likes) {
if($channel && $likes) {
foreach($likes as $like) {
if($like['deleted']) {
@@ -849,7 +926,7 @@ function import_likes($channel,$likes) {
);
continue;
}
-
+
unset($like['id']);
unset($like['iid']);
$like['channel_id'] = $channel['channel_id'];
@@ -864,9 +941,9 @@ function import_likes($channel,$likes) {
if($r)
continue;
- create_table_from_array('likes',$like);
+ create_table_from_array('likes', $like);
}
- }
+ }
}
function import_conv($channel,$convs) {
@@ -879,7 +956,7 @@ function import_conv($channel,$convs) {
);
continue;
}
-
+
unset($conv['id']);
$conv['uid'] = $channel['channel_id'];
@@ -891,14 +968,19 @@ function import_conv($channel,$convs) {
);
if($r)
continue;
+
create_table_from_array('conv',$conv);
}
- }
+ }
}
-
-
-function import_mail($channel,$mails,$sync = false) {
+/**
+ * @brief Import mails.
+ *
+ * @param array $channel
+ * @param array $mails
+ */
+function import_mail($channel, $mails, $sync = false) {
if($channel && $mails) {
foreach($mails as $mail) {
if(array_key_exists('flags',$mail) && in_array('deleted',$mail['flags'])) {
@@ -927,14 +1009,27 @@ function import_mail($channel,$mails,$sync = false) {
Zotlabs\Daemon\Master::Summon(array('Notifier','single_mail',$mail_id));
}
}
- }
+ }
}
-function sync_mail($channel,$mails) {
- import_mail($channel,$mails,true);
+/**
+ * @brief Synchronise mails.
+ *
+ * @see import_mail
+ * @param array $channel
+ * @param array $mails
+ */
+function sync_mail($channel, $mails) {
+ import_mail($channel, $mails, true);
}
-function sync_files($channel,$files) {
+/**
+ * @brief Synchronise files.
+ *
+ * @param array $channel
+ * @param array $files
+ */
+function sync_files($channel, $files) {
require_once('include/attach.php');
@@ -948,7 +1043,7 @@ function sync_files($channel,$files) {
$original_channel = $f['original_channel'];
if(! ($fetch_url && $original_channel))
- continue;
+ continue;
if($f['attach']) {
$attachment_stored = false;
@@ -978,12 +1073,11 @@ function sync_files($channel,$files) {
$att['aid'] = $channel['channel_account_id'];
$att['uid'] = $channel['channel_id'];
-
- // check for duplicate folder names with the same parent.
+ // check for duplicate folder names with the same parent.
// If we have a duplicate that doesn't match this hash value
- // change the name so that the contents won't be "covered over"
- // by the existing directory. Use the same logic we use for
- // duplicate files.
+ // change the name so that the contents won't be "covered over"
+ // by the existing directory. Use the same logic we use for
+ // duplicate files.
if(strpos($att['filename'],'.') !== false) {
$basename = substr($att['filename'],0,strrpos($att['filename'],'.'));
@@ -1014,7 +1108,7 @@ function sync_files($channel,$files) {
}
if($found)
$x++;
- }
+ }
while($found);
$att['filename'] = $basename . '(' . $x . ')' . $ext;
}
@@ -1023,30 +1117,31 @@ function sync_files($channel,$files) {
// end duplicate detection
-// @fixme - update attachment structures if they are modified rather than created
+ /// @FIXME update attachment structures if they are modified rather than created
$att['content'] = $newfname;
// Note: we use $att['hash'] below after it has been escaped to
- // fetch the file contents.
+ // fetch the file contents.
// If the hash ever contains any escapable chars this could cause
- // problems. Currently it does not.
+ // problems. Currently it does not.
- // @TODO implement os_path
+ /// @TODO implement os_path
if(!isset($att['os_path']))
$att['os_path'] = '';
-
if($attach_exists) {
logger('sync_files attach exists: ' . print_r($att,true), LOGGER_DEBUG);
if(! dbesc_array($att))
continue;
+
$str = '';
- foreach($att as $k => $v) {
- if($str)
- $str .= ",";
- $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
- }
+ foreach($att as $k => $v) {
+ if($str)
+ $str .= ",";
+
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
+ }
$r = dbq("update attach set " . $str . " where id = " . intval($attach_id) );
}
else {
@@ -1054,7 +1149,6 @@ function sync_files($channel,$files) {
create_table_from_array('attach',$att);
}
-
// is this a directory?
if($att['filetype'] === 'multipart/mixed' && $att['is_dir']) {
@@ -1063,17 +1157,16 @@ function sync_files($channel,$files) {
continue;
}
else {
-
// it's a file
// for the sync version of this algorithm (as opposed to 'offline import')
- // we will fetch the actual file from the source server so it can be
+ // we will fetch the actual file from the source server so it can be
// streamed directly to disk and avoid consuming PHP memory if it's a huge
- // audio/video file or something.
+ // audio/video file or something.
$time = datetime_convert();
- $parr = array('hash' => $channel['channel_hash'],
- 'time' => $time,
+ $parr = array('hash' => $channel['channel_hash'],
+ 'time' => $time,
'resource' => $att['hash'],
'revision' => 0,
'signature' => base64url_encode(rsa_sign($channel['channel_hash'] . '.' . $time, $channel['channel_prvkey']))
@@ -1098,7 +1191,7 @@ function sync_files($channel,$files) {
}
}
if(! $attachment_stored) {
- // @TODO should we queue this and retry or delete everything or what?
+ /// @TODO should we queue this and retry or delete everything or what?
logger('attachment store failed',LOGGER_NORMAL,LOG_ERR);
}
if($f['photo']) {
@@ -1142,7 +1235,6 @@ function sync_files($channel,$files) {
else
$p['content'] = base64_decode($p['content']);
-
if(!isset($p['display_path']))
$p['display_path'] = '';
@@ -1152,17 +1244,18 @@ function sync_files($channel,$files) {
intval($channel['channel_id'])
);
-
if($exists) {
if(! dbesc_array($p))
continue;
- $str = '';
- foreach($p as $k => $v) {
- if($str)
- $str .= ",";
- $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
- }
- $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
+
+ $str = '';
+ foreach($p as $k => $v) {
+ if($str)
+ $str .= ",";
+
+ $str .= " " . TQUOT . $k . TQUOT . " = '" . $v . "' ";
+ }
+ $r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
}
else {
create_attach_from_array('photo',$p);
@@ -1178,9 +1271,17 @@ function sync_files($channel,$files) {
}
}
-
-function convert_oldfields(&$arr,$old,$new) {
- if(array_key_exists($old,$arr)) {
+/**
+ * @brief Rename a key in an array.
+ *
+ * Replaces $old key with $new key in $arr.
+ *
+ * @param array[in,out] $arr The array where to work on
+ * @param string $old The old key in the array
+ * @param string $new The new key in the array
+ */
+function convert_oldfields(&$arr, $old, $new) {
+ if(array_key_exists($old, $arr)) {
$arr[$new] = $arr[$old];
unset($arr[$old]);
}
@@ -1254,14 +1355,15 @@ function scan_webpage_elements($path, $type, $cloud = false) {
}
}
}
+
return $elements;
}
-
+
function import_webpage_element($element, $channel, $type) {
-
+
$arr = array(); // construct information for the webpage element item table record
-
+
switch($type) {
//
// PAGES
@@ -1270,26 +1372,26 @@ function import_webpage_element($element, $channel, $type) {
$arr['item_type'] = ITEM_TYPE_WEBPAGE;
$namespace = 'WEBPAGE';
$name = $element['pagelink'];
- if($name) {
+ if($name) {
require_once('library/urlify/URLify.php');
$name = strtolower(\URLify::transliterate($name));
- }
+ }
$arr['title'] = $element['title'];
$arr['term'] = $element['term'];
$arr['layout_mid'] = ''; // by default there is no layout associated with the page
// If a layout was specified, find it in the database and get its info. If
- // it does not exist, leave layout_mid empty
- if($element['layout'] !== '') {
- $liid = q("select iid from iconfig where k = 'PDL' and v = '%s' and cat = 'system'",
+ // it does not exist, leave layout_mid empty
+ if($element['layout'] !== '') {
+ $liid = q("select iid from iconfig where k = 'PDL' and v = '%s' and cat = 'system'",
dbesc($element['layout'])
- );
+ );
if($liid) {
- $linfo = q("select mid from item where id = %d",
+ $linfo = q("select mid from item where id = %d",
intval($liid[0]['iid'])
- );
- $arr['layout_mid'] = $linfo[0]['mid'];
- }
- }
+ );
+ $arr['layout_mid'] = $linfo[0]['mid'];
+ }
+ }
break;
//
// LAYOUTS
@@ -1309,15 +1411,15 @@ function import_webpage_element($element, $channel, $type) {
$namespace = 'BUILDBLOCK';
$name = $element['name'];
$arr['title'] = $element['title'];
-
+
break;
default :
return null; // return null if invalid element type
}
-
+
$arr['uid'] = local_channel();
$arr['aid'] = $channel['channel_account_id'];
-
+
// Check if an item already exists based on the name
$iid = q("select iid from iconfig where k = '" . $namespace . "' and v = '%s' and cat = 'system'",
dbesc($name)
@@ -1342,12 +1444,13 @@ function import_webpage_element($element, $channel, $type) {
// The author is either the owner or whomever was specified
$arr['author_xchan'] = (($element['author_xchan']) ? $element['author_xchan'] : get_observer_hash());
// Import mimetype if it is a valid mimetype for the element
- $mimetypes = [ 'text/bbcode',
+ $mimetypes = [
+ 'text/bbcode',
'text/html',
'text/markdown',
'text/plain',
'application/x-pdl',
- 'application/x-php'
+ 'application/x-php'
];
// Blocks and pages can have any of the valid mimetypes, but layouts must be text/bbcode
if((in_array($element['mimetype'], $mimetypes)) && ($type === 'page' || $type === 'block') ) {
@@ -1358,37 +1461,16 @@ function import_webpage_element($element, $channel, $type) {
}
// Verify ability to use html or php!!!
- $execflag = false;
- if($arr['mimetype'] === 'application/x-php' || $arr['mimetype'] === 'text/html') {
- $z = q("select account_id, account_roles, channel_pageflags from account "
- . "left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval(local_channel())
- );
- if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) {
- $execflag = true;
- }
- else {
- logger('Unable to import element "' . $name .'" because AllowCode permission is denied.');
- notice( t('Unable to import element "' . $name .'" because AllowCode permission is denied.') . EOL);
- $element['import_success'] = 0;
- return $element;
- }
- }
-
-// $z = q("select * from iconfig where v = '%s' and k = '%s' and cat = 'system' limit 1",
-// dbesc($name),
-// dbesc($namespace)
-// );
-
- $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
- dbesc($arr['mid']),
+ $execflag = channel_codeallowed(local_channel());
+
+ $i = q("select id, edited, item_deleted from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
intval(local_channel())
);
-
- \Zotlabs\Lib\IConfig::Set($arr,'system',$namespace,(($name) ? $name : substr($arr['mid'],0,16)),true);
-
-
+
+ IConfig::Set($arr,'system',$namespace,(($name) ? $name : substr($arr['mid'],0,16)),true);
+
if($i) {
$arr['id'] = $i[0]['id'];
// don't update if it has the same timestamp as the original
@@ -1406,23 +1488,23 @@ function import_webpage_element($element, $channel, $type) {
else
$x = item_store($arr,$execflag);
}
-
+
if($x && $x['success']) {
- $item_id = $x['item_id'];
+ //$item_id = $x['item_id'];
//update_remote_id($channel, $item_id, $arr['item_type'], $name, $namespace, $remote_id, $arr['mid']);
$element['import_success'] = 1;
}
else {
$element['import_success'] = 0;
}
-
- return $element;
+
+ return $element;
}
function get_webpage_elements($channel, $type = 'all') {
$elements = array();
- if(!$channel['channel_id']) {
- return null;
+ if(!$channel['channel_id']) {
+ return null;
}
switch($type) {
case 'all':
@@ -1430,17 +1512,16 @@ function get_webpage_elements($channel, $type = 'all') {
case 'pages':
$elements['pages'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
+ $r = q("select * from iconfig left join item on iconfig.iid = item.id
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
$sql_extra order by item.created desc",
intval($owner),
intval(ITEM_TYPE_WEBPAGE)
);
-
+
$pages = null;
if($r) {
@@ -1473,7 +1554,6 @@ function get_webpage_elements($channel, $type = 'all') {
);
$elements['pages'][] = $element_arr;
}
-
}
if($type !== 'all') {
break;
@@ -1482,91 +1562,91 @@ function get_webpage_elements($channel, $type = 'all') {
case 'layouts':
$elements['layouts'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' and item_type = %d
+ $r = q("select * from iconfig left join item on iconfig.iid = item.id
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' and item_type = %d
$sql_extra order by item.created desc",
intval($owner),
intval(ITEM_TYPE_PDL)
);
-
- $layouts = null;
if($r) {
$elements['layouts'] = array();
- $layouts = array();
+
foreach($r as $rr) {
unobscure($rr);
$elements['layouts'][] = array(
- 'type' => 'layout',
- 'description' => $rr['title'], // description of the layout
- 'body' => $rr['body'],
- 'created' => $rr['created'],
- 'edited' => $rr['edited'],
- 'mimetype' => $rr['mimetype'],
- 'name' => $rr['v'], // name of reference for the layout
- 'mid' => $rr['mid'],
+ 'type' => 'layout',
+ 'description' => $rr['title'], // description of the layout
+ 'body' => $rr['body'],
+ 'created' => $rr['created'],
+ 'edited' => $rr['edited'],
+ 'mimetype' => $rr['mimetype'],
+ 'name' => $rr['v'], // name of reference for the layout
+ 'mid' => $rr['mid'],
);
}
}
-
+
if($type !== 'all') {
break;
}
-
+
case 'blocks':
$elements['blocks'] = null;
$owner = $channel['channel_id'];
-
- $sql_extra = item_permissions_sql($owner);
+ $sql_extra = item_permissions_sql($owner);
- $r = q("select iconfig.iid, iconfig.k, iconfig.v, mid, title, body, mimetype, created, edited from iconfig
+ $r = q("select iconfig.iid, iconfig.k, iconfig.v, mid, title, body, mimetype, created, edited from iconfig
left join item on iconfig.iid = item.id
- where uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK'
+ where uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK'
and item_type = %d order by item.created desc",
intval($owner),
intval(ITEM_TYPE_BLOCK)
);
-
- $blocks = null;
if($r) {
$elements['blocks'] = array();
- $blocks = array();
+
foreach($r as $rr) {
unobscure($rr);
$elements['blocks'][] = array(
'type' => 'block',
- 'title' => $rr['title'],
+ 'title' => $rr['title'],
'body' => $rr['body'],
'created' => $rr['created'],
'edited' => $rr['edited'],
'mimetype' => $rr['mimetype'],
- 'name' => $rr['v'],
+ 'name' => $rr['v'],
'mid' => $rr['mid']
);
}
-
}
-
+
if($type !== 'all') {
break;
}
-
+
default:
break;
}
+
return $elements;
}
-/* creates a compressed zip file */
-
+/**
+ * @brief Create a compressed zip file.
+ *
+ * @param array $files List of files to put in zip file
+ * @param string $destination
+ * @param boolean $overwrite
+ * @return boolean Success status
+ */
function create_zip_file($files = array(), $destination = '', $overwrite = false) {
// if the zip file already exists and overwrite is false, return false
if(file_exists($destination) && !$overwrite) {
@@ -1583,13 +1663,13 @@ function create_zip_file($files = array(), $destination = '', $overwrite = false
$valid_files[] = $file;
}
}
- }
+ }
// if we have good files...
if(count($valid_files)) {
//create the archive
$zip = new ZipArchive();
- if($zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
+ if($zip->open($destination, $overwrite ? ZipArchive::OVERWRITE : ZipArchive::CREATE) !== true) {
return false;
}
// add the files
@@ -1603,7 +1683,7 @@ function create_zip_file($files = array(), $destination = '', $overwrite = false
// check to make sure the file exists
return file_exists($destination);
- }
+ }
else {
return false;
}
diff --git a/include/items.php b/include/items.php
index 139c637e5..933b9ef81 100755
--- a/include/items.php
+++ b/include/items.php
@@ -328,25 +328,14 @@ function post_activity_item($arr,$allow_code = false,$deliver = true) {
return $ret;
}
- $arr['public_policy'] = ((x($_REQUEST,'public_policy')) ? escape_tags($_REQUEST['public_policy']) : map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_stream'),true));
+ $arr['public_policy'] = ((array_key_exists('public_policy',$arr)) ? escape_tags($arr['public_policy']) : map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'view_stream'),true));
+
if($arr['public_policy'])
$arr['item_private'] = 1;
if(! array_key_exists('mimetype',$arr))
$arr['mimetype'] = 'text/bbcode';
- if(array_key_exists('item_private',$arr) && $arr['item_private']) {
-
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
-
- if($channel) {
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
- }
-
$arr['mid'] = ((x($arr,'mid')) ? $arr['mid'] : item_message_id());
$arr['parent_mid'] = ((x($arr,'parent_mid')) ? $arr['parent_mid'] : $arr['mid']);
$arr['thr_parent'] = ((x($arr,'thr_parent')) ? $arr['thr_parent'] : $arr['mid']);
@@ -359,10 +348,13 @@ function post_activity_item($arr,$allow_code = false,$deliver = true) {
if(($is_comment) && ($arr['obj_type'] === ACTIVITY_OBJ_NOTE))
$arr['obj_type'] = ACTIVITY_OBJ_COMMENT;
- $arr['allow_cid'] = ((x($arr,'allow_cid')) ? $arr['allow_cid'] : $channel['channel_allow_cid']);
- $arr['allow_gid'] = ((x($arr,'allow_gid')) ? $arr['allow_gid'] : $channel['channel_allow_gid']);
- $arr['deny_cid'] = ((x($arr,'deny_cid')) ? $arr['deny_cid'] : $channel['channel_deny_cid']);
- $arr['deny_gid'] = ((x($arr,'deny_gid')) ? $arr['deny_gid'] : $channel['channel_deny_gid']);
+ if(! ( array_key_exists('allow_cid',$arr) || array_key_exists('allow_gid',$arr)
+ || array_key_exists('deny_cid',$arr) || array_key_exists('deny_gid',$arr))) {
+ $arr['allow_cid'] = $channel['channel_allow_cid'];
+ $arr['allow_gid'] = $channel['channel_allow_gid'];
+ $arr['deny_cid'] = $channel['channel_deny_cid'];
+ $arr['deny_gid'] = $channel['channel_deny_gid'];
+ }
$arr['comment_policy'] = map_scope(\Zotlabs\Access\PermissionLimits::Get($channel['channel_id'],'post_comments'));
@@ -424,7 +416,7 @@ function validate_item_elements($message,$arr) {
/**
- * @brief Limit lenght on imported system messages.
+ * @brief Limit length on imported system messages.
*
* The purpose of this function is to apply system message length limits to
* imported messages without including any embedded photos in the length.
@@ -538,12 +530,7 @@ function get_item_elements($x,$allow_code = false) {
$arr = array();
- if($allow_code)
- $arr['body'] = $x['body'];
- else
- $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : '');
-
- $key = get_config('system','pubkey');
+ $arr['body'] = $x['body'];
$maxlen = get_max_import_size();
@@ -655,7 +642,17 @@ function get_item_elements($x,$allow_code = false) {
return array();
}
+ // Check signature on the body text received.
+ // This presents an issue that we aren't verifying the text that is actually displayed
+ // on this site. We are however verifying the received text was exactly as received.
+ // We have every right to strip content that poses a security risk. You are welcome to
+ // create a plugin to verify the content after filtering if this offends you.
+
if($arr['sig']) {
+
+ // check the supplied signature against the supplied content.
+ // Note that we will purify the content which could change it.
+
$r = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
dbesc($arr['author_xchan'])
);
@@ -665,6 +662,14 @@ function get_item_elements($x,$allow_code = false) {
logger('get_item_elements: message verification failed.');
}
+ // if the input is markdown, remove one level of html escaping.
+ // It will be re-applied in item_store() and/or item_store_update().
+ // Do this after signature checking as the original signature
+ // was generated on the escaped content.
+
+ if($arr['mimetype'] === 'text/markdown')
+ $arr['body'] = \Zotlabs\Lib\MarkdownSoap::unescape($arr['body']);
+
if(array_key_exists('revision',$x)) {
// extended export encoding
@@ -764,6 +769,8 @@ function import_author_xchan($x) {
if($arr['xchan_hash'])
return $arr['xchan_hash'];
+ $y = false;
+
if((! array_key_exists('network', $x)) || ($x['network'] === 'zot')) {
$y = import_author_zot($x);
}
@@ -774,11 +781,11 @@ function import_author_xchan($x) {
$y = import_author_rss($x);
}
- if($x['network'] === 'unknown') {
+ if(! $y) {
$y = import_author_unknown($x);
}
- return(($y) ? $y : false);
+ return($y);
}
/**
@@ -1452,6 +1459,26 @@ function get_profile_elements($x) {
}
+
+
+function item_sign(&$item) {
+
+ if(array_key_exists('sig',$item) && $item['sig'])
+ return;
+
+ $r = q("select channel_prvkey from channel where channel_id = %d and channel_hash = '%s' ",
+ intval($item['uid']),
+ dbesc($item['author_xchan'])
+ );
+ if(! $r)
+ return;
+
+ $item['sig'] = base64url_encode(rsa_sign($item['body'],$r[0]['channel_prvkey']));
+ $item['item_verified'] = 1;
+
+}
+
+
/**
* @brief
*
@@ -1529,35 +1556,30 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
// obsolete, but needed so as not to throw not-null constraints on some database driveres
$arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : 0 );
- // only detect language if we have text content, and if the post is private but not yet
- // obscured, make it so.
- if((! array_key_exists('item_obscured',$arr)) || $arr['item_obscured'] == 0) {
- $arr['lang'] = detect_language($arr['body']);
- // apply the input filter here - if it is obscured it has been filtered already
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
+ $arr['lang'] = detect_language($arr['body']);
- if(local_channel() && (local_channel() == $arr['uid']) && (! $arr['sig'])) {
- $channel = App::get_channel();
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
+ // apply the input filter here
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
- if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
- $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
- call_hooks('item_translate', $translate);
- if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
- logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
- $ret['message'] = 'language not accepted';
- return $ret;
- }
- $arr = $translate['item'];
+ item_sign($arr);
+
+ if(! array_key_exists('sig',$arr))
+ $arr['sig'] = '';
+
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
}
+ $arr = $translate['item'];
}
if((x($arr,'obj')) && is_array($arr['obj'])) {
@@ -1804,9 +1826,12 @@ logger('revision: ' . $arr['revision']);
intval($arr['revision'])
);
- if($r && count($r)) {
+ if($r) {
+ // This will gives us a fresh copy of what's now in the DB and undo the db escaping,
+ // which really messes up the notifications
+
$current_post = $r[0]['id'];
- $arr = $r[0]; // This will gives us a fresh copy of what's now in the DB and undo the db escaping, which really messes up the notifications
+ $arr = $r[0];
logger('item_store: created item ' . $current_post, LOGGER_DEBUG);
}
else {
@@ -1953,33 +1978,25 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
return $ret;
}
- if((! array_key_exists('item_obscured', $arr)) || $arr['item_obscured'] == 0) {
+ $arr['lang'] = detect_language($arr['body']);
- $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here
- // apply the input filter here - if it is obscured it has been filtered already
- $arr['body'] = trim(z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']));
+ $arr['body'] = trim(z_input_filter($arr['body'],$arr['mimetype'],$allow_exec));
- if(local_channel() && (local_channel() == $arr['uid']) && (! $arr['sig'])) {
- $channel = App::get_channel();
- if($channel['channel_hash'] === $arr['author_xchan']) {
- $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
- $arr['item_verified'] = 1;
- }
- }
+ item_sign($arr);
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
- if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
- $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
- call_hooks('item_translate', $translate);
- if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
- logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
- $ret['message'] = 'language not accepted';
- return $ret;
- }
- $arr = $translate['item'];
+ if((is_array($allowed_languages)) && ($arr['lang']) && (! array_key_exists($arr['lang'],$allowed_languages))) {
+ $translate = array('item' => $arr, 'from' => $arr['lang'], 'to' => $allowed_languages, 'translated' => false);
+ call_hooks('item_translate', $translate);
+ if((! $translate['translated']) && (intval(get_pconfig($arr['uid'],'system','reject_disallowed_languages')))) {
+ logger('item_store: language ' . $arr['lang'] . ' not accepted for uid ' . $arr['uid']);
+ $ret['message'] = 'language not accepted';
+ return $ret;
}
+ $arr = $translate['item'];
}
if((x($arr,'obj')) && is_array($arr['obj'])) {
@@ -3769,7 +3786,7 @@ function zot_feed($uid,$observer_hash,$arr) {
if(! is_sys_channel($uid))
$sql_extra = item_permissions_sql($uid,$observer_hash);
- $limit = " LIMIT 100 ";
+ $limit = " LIMIT 5000 ";
if($mindate > NULL_DATE) {
$sql_extra .= " and ( created > '$mindate' or changed > '$mindate' ) ";
@@ -3781,15 +3798,7 @@ function zot_feed($uid,$observer_hash,$arr) {
}
- $items = array();
-
- /** @FIXME re-unite these SQL statements. There is no need for them to be separate. The mySQL is convoluted with misuse of group by. As it stands, there is a slight difference where the postgres version doesn't remove the duplicate parents up to 100. In practice this doesn't matter. It could be made to match behavior by adding "distinct on (parent) " to the front of the selection list, at a not-worth-it performance penalty (page temp results to disk). duplicates are still ignored in the in() clause, you just get less than 100 parents if there are many children. */
-
- if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
- $groupby = '';
- } else {
- $groupby = 'GROUP BY parent';
- }
+ $items = [];
$item_normal = item_normal();
@@ -3798,7 +3807,7 @@ function zot_feed($uid,$observer_hash,$arr) {
WHERE uid != %d
$item_normal
AND item_wall = 1
- and item_private = 0 $sql_extra $groupby ORDER BY created ASC $limit",
+ and item_private = 0 $sql_extra ORDER BY created ASC $limit",
intval($uid)
);
}
@@ -3806,19 +3815,25 @@ function zot_feed($uid,$observer_hash,$arr) {
$r = q("SELECT parent, created, postopts from item
WHERE uid = %d $item_normal
AND item_wall = 1
- $sql_extra $groupby ORDER BY created ASC $limit",
+ $sql_extra ORDER BY created ASC $limit",
intval($uid)
);
}
+ $parents = [];
+
if($r) {
- for($x = 0; $x < count($r); $x ++) {
- if(strpos($r[$x]['postopts'],'nodeliver') !== false) {
- unset($r[$x]);
- }
+ foreach($r as $rv) {
+ if(array_key_exists($rv['parent'],$parents))
+ continue;
+ if(strpos($rv['postopts'],'nodeliver') !== false)
+ continue;
+ $parents[$rv['parent']] = $rv;
+ if(count($parents) > 200)
+ break;
}
- $parents_str = ids_to_querystr($r,'parent');
+ $parents_str = ids_to_querystr($parents,'parent');
$sys_query = ((is_sys_channel($uid)) ? $sql_extra : '');
$item_normal = item_normal();
diff --git a/include/markdown.php b/include/markdown.php
index 7afdc6c54..7e1f1c42c 100644
--- a/include/markdown.php
+++ b/include/markdown.php
@@ -4,12 +4,13 @@
* @brief Some functions for BB conversions for Diaspora protocol.
*/
+use Michelf\MarkdownExtra;
+use Markdownify\Converter;
+
require_once("include/oembed.php");
require_once("include/event.php");
-require_once("library/markdown.php");
require_once("include/html2bbcode.php");
require_once("include/bbcode.php");
-require_once("library/markdownify/markdownify.php");
function get_bb_tag_pos($s, $name, $occurance = 1) {
@@ -73,7 +74,7 @@ function bb_tag_preg_replace($pattern, $replace, $name, $s) {
function share_shield($m) {
return str_replace($m[1],'!=+=+=!' . base64url_encode($m[1]) . '=+!=+!=',$m[0]);
-}
+}
function share_unshield($m) {
$x = str_replace(array('!=+=+=!','=+!=+!='),array('',''),$m[1]);
@@ -184,7 +185,7 @@ function markdown_to_bb($s, $use_zrl = false) {
// This seems to work
$s = preg_replace('/\#([^\s\#])/','&#35;$1',$s);
- $s = Markdown($s);
+ $s = MarkdownExtra::defaultTransform($s);
$s = str_replace("\r","",$s);
@@ -299,7 +300,7 @@ function bb2dmention_callback($match) {
$r = q("select xchan_addr from xchan where xchan_url = '%s'",
dbesc($match[2])
- );
+ );
if($r)
return '@{' . $match[3] . ' ; ' . $r[0]['xchan_addr'] . '}';
@@ -333,7 +334,7 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
$has_meta = true;
if($item['author_xchan'] != $item['owner_xchan']) {
- if($item['mid'] == $item['parent_mid'])
+ if($item['mid'] == $item['parent_mid'])
$wallwall = true;
else {
if(! $has_meta) {
@@ -348,12 +349,12 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
if(($wallwall) && (is_array($item['author'])) && $item['author']['xchan_url'] && $item['author']['xchan_name'] && $item['author']['xchan_photo_s']) {
logger('bb2diaspora_itemwallwall: wall to wall post',LOGGER_DEBUG);
// post will come across with the owner's identity. Throw a preamble onto the post to indicate the true author.
- $item['body'] = "\n\n"
- . '[quote]'
- . '[img]' . $item['author']['xchan_photo_s'] . '[/img]'
- . ' '
- . '[url=' . $item['author']['xchan_url'] . '][b]' . $item['author']['xchan_name'] . '[/b][/url]' . "\n\n"
- . $item['body']
+ $item['body'] = "\n\n"
+ . '[quote]'
+ . '[img]' . $item['author']['xchan_photo_s'] . '[/img]'
+ . ' '
+ . '[url=' . $item['author']['xchan_url'] . '][b]' . $item['author']['xchan_name'] . '[/b][/url]' . "\n\n"
+ . $item['body']
. '[/quote]';
}
@@ -366,7 +367,6 @@ function bb2diaspora_itemwallwall(&$item,$uplink = false) {
function bb2diaspora_itembody($item, $force_update = false, $have_channel = false, $uplink = false) {
-
if(! get_iconfig($item,'diaspora','fields')) {
$force_update = true;
}
@@ -453,7 +453,7 @@ function bb2diaspora_itembody($item, $force_update = false, $have_channel = fals
return html_entity_decode($body);
}
-function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
+function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
// Re-enabling the converter again.
// The bbcode parser now handles youtube-links (and the other stuff) correctly.
@@ -490,17 +490,16 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
// Convert it to HTML - don't try oembed
$Text = bbcode($Text, $preserve_nl, false);
- // Markdownify does not preserve previously escaped html entities such as <> and &.
+ // Markdownify does not preserve previously escaped html entities such as <> and &.
$Text = str_replace(array('&lt;','&gt;','&amp;'),array('&_lt_;','&_gt_;','&_amp_;'),$Text);
// Now convert HTML to Markdown
- $md = new Markdownify(false, false, false);
+ $md = new Converter(Converter::LINK_AFTER_CONTENT, false, false);
$Text = $md->parseString($Text);
-
- // It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
+ // It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
$Text = str_replace(array('&\\_lt\\_;','&\\_gt\\_;','&\\_amp\\_;'),array('&lt;','&gt;','&amp;'),$Text);
@@ -510,7 +509,7 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
// So take off the angle brackets of any such URL
$Text = preg_replace("/<http(.*?)>/is", "http$1", $Text);
- // Remove empty zrl links
+ // Remove empty zrl links
$Text = preg_replace("/\[zrl\=\].*?\[\/zrl\]/is", "", $Text);
// Remove all unconverted tags
@@ -521,7 +520,7 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
$Text = trim($Text);
- call_hooks('bb2diaspora',$Text);
+ call_hooks('bb2diaspora', $Text);
return $Text;
}
@@ -543,22 +542,22 @@ function format_event_diaspora($ev) {
$o .= '**' . (($ev['summary']) ? bb2diaspora($ev['summary']) : bb2diaspora($ev['desc'])) . '**' . "\n";
$o .= t('Starts:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
+ . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
$ev['start'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
+ : day_translate(datetime_convert('UTC', 'UTC',
$ev['start'] , $bd_format)))
. '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['start'])) . ")\n";
if(! $ev['nofinish'])
- $o .= t('Finishes:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
+ $o .= t('Finishes:') . ' ' . '['
+ . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
$ev['finish'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
+ : day_translate(datetime_convert('UTC', 'UTC',
$ev['finish'] , $bd_format )))
. '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['finish'])) . ")\n";
if(strlen($ev['location']))
- $o .= t('Location:') . bb2diaspora($ev['location'])
+ $o .= t('Location:') . bb2diaspora($ev['location'])
. "\n";
$o .= "\n";
diff --git a/include/message.php b/include/message.php
index bde07afd8..da3514184 100644
--- a/include/message.php
+++ b/include/message.php
@@ -13,10 +13,8 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
$ret = array('success' => false);
$is_reply = false;
- $a = get_app();
$observer_hash = get_observer_hash();
-
if($uid) {
$r = q("select * from channel where channel_id = %d limit 1",
intval($uid)
diff --git a/include/nav.php b/include/nav.php
index 43c7771ec..2d12f2950 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -36,14 +36,15 @@ EOT;
}
elseif(remote_channel())
$observer = App::get_observer();
-
+
+ require_once('include/conversation.php');
+ $is_owner = (((local_channel()) && (\App::$profile['profile_uid'] == local_channel())) ? true : false);
+ $navapps[] = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$myident = (($channel) ? $channel['xchan_addr'] : '');
$sitelocation = (($myident) ? $myident : App::get_hostname());
-
-
/**
*
* Provide a banner/logo/whatever
@@ -55,10 +56,9 @@ EOT;
if($banner === false)
$banner = get_config('system','sitename');
+ //the notifications template is in hdr.tpl
App::$page['header'] .= replace_macros(get_markup_template('hdr.tpl'), array(
- '$baseurl' => z_root(),
- '$sitelocation' => $sitelocation,
- '$banner' => $banner
+ //we could additionally use this to display important system notifications e.g. for updates
));
$server_role = get_config('system','server_role');
@@ -66,21 +66,21 @@ EOT;
$techlevel = get_account_techlevel();
// nav links: array of array('href', 'text', 'extra css classes', 'title')
- $nav = Array();
+ $nav = [];
/**
* Display login or logout
*/
- $nav['usermenu']=array();
+ $nav['usermenu'] = [];
$userinfo = null;
- $nav['loginmenu']=array();
+ $nav['loginmenu'] = [];
if($observer) {
- $userinfo = array(
+ $userinfo = [
'icon' => $observer['xchan_photo_m'],
'name' => $observer['xchan_addr'],
- );
+ ];
}
elseif(! $_SESSION['authenticated']) {
@@ -96,38 +96,21 @@ EOT;
if($chans && count($chans) > 1 && feature_enabled(local_channel(),'nav_channel_select') && (! $basic))
$nav['channels'] = $chans;
- $nav['logout'] = Array('logout',t('Logout'), "", t('End this session'),'logout_nav_btn');
+ $nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
// user menu
- //$nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'),'channel_nav_btn');
- $nav['usermenu'][] = Array('profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'),'profile_nav_btn');
+ $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'),'profile_nav_btn'];
+
if(feature_enabled(local_channel(),'multi_profiles') && (! $basic))
- $nav['usermenu'][] = Array('profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'),'profiles_nav_btn');
+ $nav['usermenu'][] = ['profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'),'profiles_nav_btn'];
else
- $nav['usermenu'][] = Array('profiles/' . $prof[0]['id'], t('Edit Profile'),"", t('Edit your profile'),'profiles_nav_btn');
-
- //$nav['usermenu'][] = Array('photos/' . $channel['channel_address'], t('Photos'), "", t('Your photos'),'photos_nav_btn');
- //$nav['usermenu'][] = Array('cloud/' . $channel['channel_address'],t('Files'),"",t('Your files'),'cloud_nav_btn');
+ $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'),"", t('Edit your profile'),'profiles_nav_btn'];
- //if((! $basic) && feature_enabled(local_channel(),'ajaxchat'))
- // $nav['usermenu'][] = Array('chat/' . $channel['channel_address'], t('Chat'),"",t('Your chatrooms'),'chat_nav_btn');
-
-
- //require_once('include/menu.php');
- //$has_bookmarks = menu_list_count(local_channel(),'',MENU_BOOKMARK) + menu_list_count(local_channel(),'',MENU_SYSTEM|MENU_BOOKMARK);
- //if(($has_bookmarks) && (! $basic)) {
- // $nav['usermenu'][] = Array('bookmarks', t('Bookmarks'), "", t('Your bookmarks'),'bookmarks_nav_btn');
- //}
-
- //if(feature_enabled($channel['channel_id'],'webpages') && (! $basic))
- // $nav['usermenu'][] = Array('webpages/' . $channel['channel_address'],t('Webpages'),"",t('Your webpages'),'webpages_nav_btn');
- //if(feature_enabled($channel['channel_id'],'wiki') && (! $basic))
- // $nav['usermenu'][] = Array('wiki/' . $channel['channel_address'],t('Wikis'),"",t('Your wikis'),'wiki_nav_btn');
}
else {
if(! get_account_id()) {
$nav['login'] = login(true,'main-login',false,false);
- $nav['loginmenu'][] = Array('login',t('Login'),'',t('Sign in'),'login_nav_btn');
+ $nav['loginmenu'][] = ['login',t('Login'),'',t('Sign in'),'login_nav_btn'];
App::$page['content'] .= replace_macros(get_markup_template('nav_login.tpl'),
[
'$nav' => $nav,
@@ -137,7 +120,7 @@ EOT;
}
else
- $nav['alogout'] = Array('logout',t('Logout'), "", t('End this session'),'logout_nav_btn');
+ $nav['alogout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
}
@@ -152,14 +135,14 @@ EOT;
if(! local_channel()) {
$nav['rusermenu'] = array(
$homelink,
- t('Get me home'),
+ t('Take me home'),
'logout',
t('Log me out of this site')
);
}
if(((get_config('system','register_policy') == REGISTER_OPEN) || (get_config('system','register_policy') == REGISTER_APPROVE)) && (! $_SESSION['authenticated']))
- $nav['register'] = array('register',t('Register'), "", t('Create an account'),'register_nav_btn');
+ $nav['register'] = ['register',t('Register'), "", t('Create an account'),'register_nav_btn'];
if(! get_config('system','hide_help')) {
$help_url = z_root() . '/help?f=&cmd=' . App::$cmd;
@@ -171,15 +154,10 @@ EOT;
//point directly to /help if $context_help is empty - this can be removed once we have context help for all modules
$enable_context_help = (($context_help) ? true : false);
}
- $nav['help'] = array($help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help);
+ $nav['help'] = [$help_url, t('Help'), "", t('Help and documentation'), 'help_nav_btn', $context_help, $enable_context_help];
}
- if(! $basic)
- $nav['apps'] = array('apps', t('Apps'), "", t('Applications, utilities, links, games'),'apps_nav_btn');
-
- $nav['search'] = array('search', t('Search'), "", t('Search site @name, #tag, ?docs, content'));
-
- $nav['directory'] = array('directory', t('Directory'), "", t('Channel Directory'),'directory_nav_btn');
+ $nav['search'] = ['search', t('Search'), "", t('Search site @name, #tag, ?docs, content')];
/**
@@ -246,15 +224,13 @@ EOT;
$banner = get_config('system','sitename');
$x = array('nav' => $nav, 'usermenu' => $userinfo );
+
call_hooks('nav', $x);
// Not sure the best place to put this on the page. So I'm implementing it but leaving it
// turned off until somebody discovers this and figures out a good location for it.
$powered_by = '';
- // $powered_by = '<strong>red<img class="smiley" src="' . z_root() . '/images/rm-16.png" alt="r#" />matrix</strong>';
-
-
//app bin
if(local_channel()) {
if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) {
@@ -285,7 +261,7 @@ EOT;
App::$page['nav'] .= replace_macros($tpl, array(
'$baseurl' => z_root(),
- '$fulldocs' => t('Documentation'),
+ '$fulldocs' => t('Help'),
'$sitelocation' => $sitelocation,
'$nav' => $x['nav'],
'$banner' => $banner,
@@ -296,7 +272,8 @@ EOT;
'$powered_by' => $powered_by,
'$help' => t('@name, #tag, ?doc, content'),
'$pleasewait' => t('Please wait...'),
- '$navapps' => $navapps
+ '$navapps' => $navapps,
+ '$addapps' => t('Add Apps')
));
if(x($_SESSION, 'reload_avatar') && $observer) {
diff --git a/include/network.php b/include/network.php
index 66716ef9e..6d1a05e9f 100644
--- a/include/network.php
+++ b/include/network.php
@@ -24,6 +24,7 @@ function get_capath() {
* @param array $opts (optional parameters) associative array with:
* * \b accept_content => supply Accept: header with 'accept_content' as the value
* * \b timeout => int seconds, default system config value or 60 seconds
+ * * \b headers => array of additional header fields
* * \b http_auth => username:password
* * \b novalidate => do not validate SSL certs, default is to validate using our CA list
* * \b nobody => only return the header
@@ -31,6 +32,7 @@ function get_capath() {
* * \b custom => custom request method: e.g. 'PUT', 'DELETE'
* * \b cookiejar => cookie file (write)
* * \b cookiefile => cookie file (read)
+ * * \b session => boolean; append session cookie *if* $url is our own site
*
* @return array an associative array with:
* * \e int \b return_code => HTTP return code or 0 if timeout or failure
@@ -74,8 +76,21 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
if(x($opts,'readfunc'))
@curl_setopt($ch, CURLOPT_READFUNCTION, $opts['readfunc']);
- if(x($opts,'headers'))
- @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+ // When using the session option and fetching from our own site,
+ // append the PHPSESSID cookie to any existing headers.
+ // Don't add to $opts['headers'] so that the cookie does not get
+ // sent to other sites via redirects
+
+ $instance_headers = ((array_key_exists('headers',$opts) && is_array($opts['headers'])) ? $opts['headers'] : []);
+
+ if(x($opts,'session')) {
+ if(strpos($url,z_root()) === 0) {
+ $instance_headers[] = 'Cookie: PHPSESSID=' . session_id();
+ }
+ }
+ if($instance_headers)
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $instance_headers);
+
if(x($opts,'nobody'))
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
@@ -91,6 +106,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
+
if(x($opts,'http_auth')) {
// "username" . ':' . "password"
@curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
@@ -229,9 +245,16 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_HEADER, false);
}
- if(x($opts,'headers')) {
- @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+ $instance_headers = ((array_key_exists('headers',$opts) && is_array($opts['headers'])) ? $opts['headers'] : []);
+
+ if(x($opts,'session')) {
+ if(strpos($url,z_root()) === 0) {
+ $instance_headers[] = 'Cookie: PHPSESSID=' . session_id();
+ }
}
+ if($instance_headers)
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $instance_headers);
+
if(x($opts,'nobody'))
@curl_setopt($ch, CURLOPT_NOBODY, $opts['nobody']);
diff --git a/include/permissions.php b/include/permissions.php
index d21b45550..f719394c5 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -314,11 +314,12 @@ function perm_is_allowed($uid, $observer_xchan, $permission) {
'channel_id' => $uid,
'observer_hash' => $observer_xchan,
'permission' => $permission,
- 'result' => false);
+ 'result' => 'unset');
call_hooks('perm_is_allowed', $arr);
- if($arr['result'])
- return true;
+ if($arr['result'] !== 'unset') {
+ return $arr['result'];
+ }
$global_perms = \Zotlabs\Access\Permissions::Perms();
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index c8b3c3782..cc1f3b5d0 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -330,6 +330,7 @@ abstract class photo_driver {
$p['photo_usage'] = intval($arr['photo_usage']);
$p['os_storage'] = intval($arr['os_storage']);
$p['os_path'] = $arr['os_path'];
+ $p['os_syspath'] = ((array_key_exists('os_syspath',$arr)) ? $arr['os_syspath'] : '');
$p['display_path'] = (($arr['display_path']) ? $arr['display_path'] : '');
if(! intval($p['imgscale']))
@@ -380,7 +381,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -411,7 +412,7 @@ abstract class photo_driver {
dbesc($p['album']),
intval($this->getHeight()),
intval($this->getWidth()),
- (intval($p['os_storage']) ? dbescbin($p['os_path']) : dbescbin($this->imageString())),
+ (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())),
intval($p['os_storage']),
intval(strlen($this->imageString())),
intval($p['imgscale']),
@@ -429,90 +430,6 @@ abstract class photo_driver {
return $r;
}
-
- // should be obsolete now
-
- public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $usage = PHOTO_NORMAL, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
-
- $x = q("select id from photo where resource_id = '%s' and uid = %d and xchan = '%s' and imgscale = %d limit 1",
- dbesc($rid),
- intval($uid),
- dbesc($xchan),
- intval($scale)
- );
- if(count($x)) {
- $r = q("UPDATE photo
- set aid = %d,
- uid = %d,
- xchan = '%s',
- resource_id = '%s',
- created = '%s',
- edited = '%s',
- filename = '%s',
- mimetype = '%s',
- album = '%s',
- height = %d,
- width = %d,
- content = '%s',
- filesize = %d,
- imgscale = %d,
- photo_usage = %d,
- allow_cid = '%s',
- allow_gid = '%s',
- deny_cid = '%s',
- deny_gid = '%s'
- where id = %d",
-
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbescbin($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($photo_usage),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid),
- intval($x[0]['id'])
- );
- }
- else {
- $r = q("INSERT INTO photo
- ( aid, uid, xchan, resource_id, created, edited, filename, mimetype, album, height, width, content, filesize, imgscale, photo_usage, allow_cid, allow_gid, deny_cid, deny_gid )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s' )",
- intval($aid),
- intval($uid),
- dbesc($xchan),
- dbesc($rid),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(basename($filename)),
- dbesc($this->getType()),
- dbesc($album),
- intval($this->getHeight()),
- intval($this->getWidth()),
- dbescbin($this->imageString()),
- intval(strlen($this->imageString())),
- intval($scale),
- intval($photo_usage),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid)
- );
- }
- return $r;
- }
-
}
diff --git a/include/photos.php b/include/photos.php
index c0f7dc8c4..a3869a72e 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -67,8 +67,8 @@ function photo_upload($channel, $observer, $args) {
$os_storage = 0;
- if($args['os_path'] && $args['getimagesize']) {
- $imagedata = @file_get_contents($args['os_path']);
+ if($args['os_syspath'] && $args['getimagesize']) {
+ $imagedata = @file_get_contents($args['os_syspath']);
$filename = $args['filename'];
$filesize = strlen($imagedata);
// this is going to be deleted if it exists
@@ -153,7 +153,7 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
- $exif = $ph->orient(($args['os_path']) ? $args['os_path'] : $src);
+ $exif = $ph->orient(($args['os_syspath']) ? $args['os_syspath'] : $src);
@unlink($src);
@@ -180,7 +180,8 @@ function photo_upload($channel, $observer, $args) {
'filename' => $filename, 'album' => $album, 'imgscale' => 0, 'photo_usage' => PHOTO_NORMAL,
'allow_cid' => $ac['allow_cid'], 'allow_gid' => $ac['allow_gid'],
'deny_cid' => $ac['deny_cid'], 'deny_gid' => $ac['deny_gid'],
- 'os_storage' => $os_storage, 'os_path' => $args['os_path']
+ 'os_storage' => $os_storage, 'os_syspath' => $args['os_syspath'],
+ 'os_path' => $args['os_path'], 'display_path' => $args['display_path']
);
if($args['created'])
$p['created'] = $args['created'];
@@ -205,7 +206,7 @@ function photo_upload($channel, $observer, $args) {
$errors = true;
unset($p['os_storage']);
- unset($p['os_path']);
+ unset($p['os_syspath']);
if(($width > 1024 || $height > 1024) && (! $errors))
$ph->scaleImage(1024);
@@ -336,19 +337,13 @@ function photo_upload($channel, $observer, $args) {
if($item['mid'] === $item['parent_mid']) {
$item['body'] = $summary;
+ $item['mimetype'] = 'text/bbcode';
$item['obj_type'] = ACTIVITY_OBJ_PHOTO;
$item['obj'] = json_encode($object);
$item['tgt_type'] = ACTIVITY_OBJ_ALBUM;
$item['target'] = json_encode($target);
- if($item['author_xchan'] === $channel['channel_hash']) {
- $item['sig'] = base64url_encode(rsa_sign($item['body'],$channel['channel_prvkey']));
- $item['item_verified'] = 1;
- }
- else {
- $item['sig'] = '';
- }
$force = true;
}
@@ -451,7 +446,7 @@ function photo_upload($channel, $observer, $args) {
* * \e boolean \b success
* * \e array \b albums
*/
-function photos_albums_list($channel, $observer, $sort_key = 'album', $direction = 'asc') {
+function photos_albums_list($channel, $observer, $sort_key = 'display_path', $direction = 'asc') {
$channel_id = $channel['channel_id'];
$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
@@ -464,17 +459,33 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
$sort_key = dbesc($sort_key);
$direction = dbesc($direction);
- //$albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and photo_usage IN ( %d, %d ) $sql_extra group by album order by $sort_key $direction",
- // intval($channel_id),
- // intval(PHOTO_NORMAL),
- // intval(PHOTO_PROFILE)
- //);
-
- // this query provides the same results but might perform better
- $albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and os_storage = 1 $sql_extra group by album order by $sort_key $direction",
+ $r = q("select display_path, hash from attach where is_dir = 1 and uid = %d $sql_extra order by $sort_key $direction",
intval($channel_id)
);
+ array_unshift($r,[ 'display_path' => '/', 'hash' => '' ]);
+ $str = ids_to_querystr($r,'hash',true);
+
+ $albums = [];
+
+ if($str) {
+ $x = q("select count( distinct hash ) as total, folder from attach where is_photo = 1 and uid = %d and folder in ( $str ) $sql_extra group by folder ",
+ intval($channel_id)
+ );
+ if($x) {
+ foreach($r as $rv) {
+ foreach($x as $xv) {
+ if($xv['folder'] === $rv['hash']) {
+ if($xv['total'] != 0 && attach_can_view_folder($channel_id,$observer_xchan,$xv['folder'])) {
+ $albums[] = [ 'album' => $rv['display_path'], 'folder' => $xv['folder'], 'total' => $xv['total'] ];
+ }
+ continue;
+ }
+ }
+ }
+ }
+ }
+
// add various encodings to the array so we can just loop through and pick them out in a template
$ret = array('success' => false);
@@ -485,11 +496,12 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
foreach($albums as $k => $album) {
$entry = array(
'text' => (($album['album']) ? $album['album'] : '/'),
+ 'shorttext' => (($album['album']) ? ellipsify($album['album'],28) : '/'),
'jstext' => (($album['album']) ? addslashes($album['album']) : '/'),
'total' => $album['total'],
- 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . bin2hex($album['album']),
+ 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . $album['folder'],
'urlencode' => urlencode($album['album']),
- 'bin2hex' => bin2hex($album['album'])
+ 'bin2hex' => $album['folder']
);
$ret['albums'][] = $entry;
}
@@ -500,7 +512,7 @@ function photos_albums_list($channel, $observer, $sort_key = 'album', $direction
return $ret;
}
-function photos_album_widget($channelx,$observer,$sortkey = 'album',$direction = 'asc') {
+function photos_album_widget($channelx,$observer,$sortkey = 'display_path',$direction = 'asc') {
$o = '';
@@ -513,6 +525,7 @@ function photos_album_widget($channelx,$observer,$sortkey = 'album',$direction =
$o = replace_macros(get_markup_template('photo_albums.tpl'),array(
'$nick' => $channelx['channel_address'],
'$title' => t('Photo Albums'),
+ '$recent' => t('Recent Photos'),
'$albums' => $albums['albums'],
'$baseurl' => z_root(),
'$upload' => ((perm_is_allowed($channelx['channel_id'],(($observer) ? $observer['xchan_hash'] : ''),'write_storage'))
@@ -570,13 +583,15 @@ function photos_list_photos($channel, $observer, $album = '') {
* @param string $album name of the album
* @return boolean
*/
-function photos_album_exists($channel_id, $album) {
- $r = q("SELECT id FROM photo WHERE album = '%s' AND uid = %d limit 1",
+function photos_album_exists($channel_id, $observer_hash, $album) {
+ $sql_extra = permissions_sql($channel_id,$observer_hash);
+
+ $r = q("SELECT folder, hash, is_dir, filename, os_path, display_path FROM attach WHERE hash = '%s' AND is_dir = 1 AND uid = %d $sql_extra limit 1",
dbesc($album),
intval($channel_id)
);
- return (($r) ? true : false);
+ return (($r) ? $r[0] : false);
}
/**
@@ -609,14 +624,15 @@ function photos_album_rename($channel_id, $oldname, $newname) {
*/
function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
- if ($remote_xchan) {
- $r = q("SELECT distinct resource_id from photo where xchan = '%s' and uid = %d and album = '%s' ",
+ if($remote_xchan) {
+ $r = q("SELECT hash from attach where creator = '%s' and uid = %d and folder = '%s' ",
dbesc($remote_xchan),
intval($channel_id),
dbesc($album)
);
- } else {
- $r = q("SELECT distinct resource_id from photo where uid = %d and album = '%s' ",
+ }
+ else {
+ $r = q("SELECT hash from attach where uid = %d and folder = '%s' ",
intval($channel_id),
dbesc($album)
);
@@ -624,7 +640,7 @@ function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
if ($r) {
$arr = array();
foreach ($r as $rr) {
- $arr[] = "'" . dbesc($rr['resource_id']) . "'" ;
+ $arr[] = "'" . dbesc($rr['hash']) . "'" ;
}
$str = implode(',',$arr);
return $str;
diff --git a/include/plugin.php b/include/plugin.php
index 3a64f67cc..29474735e 100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -471,6 +471,8 @@ function get_theme_info($theme){
'description' => '',
'author' => array(),
'version' => '',
+ 'minversion' => '',
+ 'maxversion' => '',
'compat' => '',
'credits' => '',
'maintainer' => array(),
@@ -598,16 +600,23 @@ function head_get_links() {
function format_css_if_exists($source) {
- $path_prefix = script_path() . '/';
- if (strpos($source[0], '/') !== false) {
- // The source is a URL
- $path = $source[0];
+ // script_path() returns https://yoursite.tld
+
+ $path_prefix = script_path();
+
+ $script = $source[0];
+
+ if(strpos($script, '/') !== false) {
+ // The script is a path relative to the server root
+ $path = $script;
// If the url starts with // then it's an absolute URL
- if($source[0][0] === '/' && $source[0][1] === '/') $path_prefix = '';
+ if(substr($script,0,2) === '//') {
+ $path_prefix = '';
+ }
} else {
// It's a file from the theme
- $path = theme_include($source[0]);
+ $path = '/' . theme_include($script);
}
if($path) {
@@ -677,7 +686,7 @@ function head_get_js() {
foreach(App::$js_sources as $sources) {
if(count($sources)) {
foreach($sources as $source) {
- if($src === 'main.js')
+ if($source === 'main.js')
continue;
$str .= format_js_if_exists($source);
}
@@ -697,16 +706,19 @@ function head_get_main_js() {
}
function format_js_if_exists($source) {
- $path_prefix = script_path() . '/';
+ $path_prefix = script_path();
if(strpos($source,'/') !== false) {
- // The source is a URL
+ // The source is a known path on the system
$path = $source;
// If the url starts with // then it's an absolute URL
- if($source[0] === '/' && $source[1] === '/') $path_prefix = '';
- } else {
+ if(substr($source,0,2) === '//') {
+ $path_prefix = '';
+ }
+ }
+ else {
// It's a file from the theme
- $path = theme_include($source);
+ $path = '/' . theme_include($source);
}
if($path) {
$qstring = ((parse_url($path, PHP_URL_QUERY)) ? '&' : '?') . 'v=' . STD_VERSION;
diff --git a/include/probe.php b/include/probe.php
deleted file mode 100644
index 29635f963..000000000
--- a/include/probe.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php /** @file */
-
-
-/**
- * Functions to assist in probing various legacy networks to figure out what kind of capabilities might be present.
- */
-
-
-function net_have_driver($net) {
-
- if(function_exists('net_discover_' . $net))
- return true;
- return false;
-}
-
-function probe_well_known($addr) {
-
- $ret = array();
-
- $ret['src'] = $addr;
-
- if(strpos($addr,'@') !== false) {
- $ret['address'] = $addr;
- }
- else {
- $ret['url'] = $addr;
- }
-
- if(stristr($addr,'facebook.com')) {
- $ret['network'] = 'facebook';
- }
- if(stristr($addr,'google.com')) {
- $ret['network'] = 'google';
- }
- if(stristr($addr,'linkedin.com')) {
- $ret['network'] = 'linkedin';
- }
-
- call_hooks('probe_well_known', $ret);
-
- if(array_key_exists('network',$ret) && net_have_driver($ret['network'])) {
- $fn = 'net_discover_' . $ret['network'];
- $ret = $fn($ret);
- }
-
-
- return $ret;
-
-}
-
-
-
-
-function probe_webfinger($addr) {
-
-
-
-
-
-}
-
-
-function probe_legacy_webfinger($addr) {
-
-
-
-
-}
-
-function probe_zot($addr) {
-
-
-
-}
-
-function probe_dfrn($addr) {
-
-
-}
-
-
-function probe_diaspora($addr) {
-
-
-}
-
-
-function probe_legacy_feed($addr) {
-
-
-
-}
-
-
-function probe_activity_stream($addr) {
-
-
-}
-
diff --git a/include/queue_fn.php b/include/queue_fn.php
index ede6c8f11..c9179b953 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -146,10 +146,14 @@ function queue_deliver($outq, $immediate = false) {
// your site has existed. Since we don't know for sure what these sites are,
// call them unknown
- q("insert into site (site_url, site_update, site_dead, site_type, site_crypto) values ('%s','%s',0,%d,'') ",
- dbesc($base),
- dbesc(datetime_convert()),
- intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN)
+ site_store_lowlevel(
+ [
+ 'site_url' => $base,
+ 'site_update' => datetime_convert(),
+ 'site_dead' => 0,
+ 'site_type' => intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
+ 'site_crypto' => ''
+ ]
);
}
}
diff --git a/include/text.php b/include/text.php
index 8c01ed1d2..fa9dadc31 100644
--- a/include/text.php
+++ b/include/text.php
@@ -3,8 +3,10 @@
* @file include/text.php
*/
-require_once("include/bbcode.php");
+use \Zotlabs\Lib as Zlib;
+use \Michelf\MarkdownExtra;
+require_once("include/bbcode.php");
// random string, there are 86 characters max in text mode, 128 for hex
// output is urlsafe
@@ -88,12 +90,10 @@ function escape_tags($string) {
}
-function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
+function z_input_filter($s,$type = 'text/bbcode',$allow_code = false) {
if($type === 'text/bbcode')
return escape_tags($s);
- if($type === 'text/markdown')
- return escape_tags($s);
if($type == 'text/plain')
return escape_tags($s);
if($type == 'application/x-pdl')
@@ -103,15 +103,15 @@ function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
return $s;
}
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
- intval($channel_id)
- );
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- if(local_channel() && (get_account_id() == $r[0]['account_id'])) {
- return $s;
- }
- }
+ if($allow_code) {
+ if($type === 'text/markdown')
+ return htmlspecialchars($s,ENT_QUOTES);
+ return $s;
+ }
+
+ if($type === 'text/markdown') {
+ $x = new Zlib\MarkdownSoap($s);
+ return $x->clean();
}
if($type === 'text/html')
@@ -121,13 +121,23 @@ function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
}
-
+/**
+ * @brief Use HTMLPurifier to get standards compliant HTML.
+ *
+ * Use the <a href="http://htmlpurifier.org/" target="_blank">HTMLPurifier</a>
+ * library to get filtered and standards compliant HTML.
+ *
+ * @see HTMLPurifier
+ *
+ * @param string $s raw HTML
+ * @param boolean $allow_position allow CSS position
+ * @return string standards compliant filtered HTML
+ */
function purify_html($s, $allow_position = false) {
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
/**
* @FIXME this function has html output, not bbcode - so safely purify these
+ * require_once('include/html2bbcode.php');
* $s = html2bb_video($s);
* $s = oembed_html2bbcode($s);
*/
@@ -136,6 +146,15 @@ function purify_html($s, $allow_position = false) {
$config->set('Cache.DefinitionImpl', null);
$config->set('Attr.EnableID', true);
+ // If enabled, target=blank attributes are added to all links.
+ //$config->set('HTML.TargetBlank', true);
+ //$config->set('Attr.AllowedFrameTargets', ['_blank', '_self', '_parent', '_top']);
+ // restore old behavior of HTMLPurifier < 4.8, only used when targets allowed at all
+ // do not add rel="noreferrer" to all links with target attributes
+ //$config->set('HTML.TargetNoreferrer', false);
+ // do not add noopener rel attributes to links which have a target attribute associated with them
+ //$config->set('HTML.TargetNoopener', false);
+
//Allow some custom data- attributes used by built-in libs.
//In this way members which do not have allowcode set can still use the built-in js libs in webpages to some extent.
@@ -273,7 +292,6 @@ function purify_html($s, $allow_position = false) {
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage()
));
-
}
$purifier = new HTMLPurifier($config);
@@ -586,8 +604,10 @@ function photo_new_resource() {
* @return boolean true if found
*/
function attribute_contains($attr, $s) {
+ // remove quotes
+ $attr = str_replace([ '"',"'" ],['',''],$attr);
$a = explode(' ', $attr);
- if(count($a) && in_array($s, $a))
+ if($a && in_array($s, $a))
return true;
return false;
@@ -851,6 +871,11 @@ function tag_sort_length($a,$b) {
return((mb_strlen($b) < mb_strlen($a)) ? (-1) : 1);
}
+function total_sort($a,$b) {
+ if($a['total'] == $b['total'])
+ return 0;
+ return(($b['total'] > $a['total']) ? 1 : (-1));
+}
/**
@@ -1216,20 +1241,6 @@ function list_smilies() {
);
- $x = get_config('feature','emoji');
- if($x === false)
- $x = 1;
- if($x) {
- if(! App::$emojitab)
- App::$emojitab = json_decode(file_get_contents('library/emoji.json'),true);
- foreach(App::$emojitab as $e) {
- if(strpos($e['shortname'],':tone') === 0)
- continue;
- $texts[] = $e['shortname'];
- $icons[] = '<img class="smiley emoji" height="16" width="16" src="images/emoji/' . $e['unicode'] . '.png' . '" alt="' . $e['name'] . '" />';
- }
- }
-
$params = array('texts' => $texts, 'icons' => $icons);
call_hooks('smilie', $params);
@@ -1465,11 +1476,10 @@ function format_hashtags(&$item) {
continue;
if(strpos($item['body'], $t['url']))
continue;
-
if($s)
- $s .= '&nbsp';
+ $s .= ' ';
- $s .= '#<a href="' . zid($t['url']) . '" >' . $term . '</a>';
+ $s .= '<span class="badge badge-pill badge-info"><i class="fa fa-hashtag"></i>&nbsp;<a class="text-white" href="' . zid($t['url']) . '" >' . $term . '</a></span>';
}
}
@@ -1489,11 +1499,9 @@ function format_mentions(&$item) {
continue;
if(strpos($item['body'], $t['url']))
continue;
-
if($s)
- $s .= '&nbsp';
-
- $s .= '@<a href="' . zid($t['url']) . '" >' . $term . '</a>';
+ $s .= ' ';
+ $s .= '<span class="badge badge-pill badge-success"><i class="fa fa-at"></i>&nbsp;<a class="text-white" href="' . zid($t['url']) . '" >' . $term . '</a></span>';
}
}
@@ -1581,11 +1589,6 @@ function prepare_body(&$item,$attach = false) {
$photo = $prep_arr['photo'];
$event = $prep_arr['event'];
-// q("update item set html = '%s' where id = %d",
-// dbesc($s),
-// intval($item['id'])
-// );
-
if(! $attach) {
return $s;
}
@@ -1653,8 +1656,8 @@ function prepare_text($text, $content_type = 'text/bbcode', $cache = false) {
break;
case 'text/markdown':
- require_once('library/markdown.php');
- $s = Markdown($text);
+ $text = Zlib\MarkdownSoap::unescape($text);
+ $s = MarkdownExtra::defaultTransform($text);
break;
case 'application/x-pdl';
@@ -1809,23 +1812,9 @@ function mimetype_select($channel_id, $current = 'text/bbcode') {
);
- if(App::$is_sys) {
+ if((App::$is_sys) || (channel_codeallowed($channel_id) && $channel_id == local_channel())){
$x[] = 'application/x-php';
}
- else {
- $r = q("select account_id, account_roles, channel_pageflags from account left join channel on account_id = channel_account_id where
- channel_id = %d limit 1",
- intval($channel_id)
- );
-
- if($r) {
- if(($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($r[0]['channel_pageflags'] & PAGE_ALLOWCODE)) {
- if(local_channel() && get_account_id() == $r[0]['account_id']) {
- $x[] = 'application/x-php';
- }
- }
- }
- }
foreach($x as $y) {
$selected = (($y == $current) ? ' selected="selected" ' : '');
@@ -2065,7 +2054,7 @@ function ids_to_array($arr,$idx = 'id') {
$t = array();
if($arr) {
foreach($arr as $x) {
- if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
+ if(array_key_exists($idx,$x) && strlen($x[$idx]) && (! in_array($x[$idx],$t))) {
$t[] = $x[$idx];
}
}
@@ -2081,7 +2070,7 @@ function ids_to_querystr($arr,$idx = 'id',$quote = false) {
if($arr) {
foreach($arr as $x) {
if(! in_array($x[$idx],$t)) {
- if($quote)
+ if($quote)
$t[] = "'" . dbesc($x[$idx]) . "'";
else
$t[] = $x[$idx];
@@ -3061,7 +3050,15 @@ function array2XML($obj, $array) {
}
}
-
+/**
+ * @brief Inserts an array into $table.
+ *
+ * @TODO Why is this function in include/text.php?
+ *
+ * @param string $table
+ * @param array $arr
+ * @return boolean|PDOStatement
+ */
function create_table_from_array($table, $arr) {
if(! ($arr && $table))
@@ -3141,3 +3138,14 @@ function array_escape_tags(&$v,$k) {
$v = escape_tags($v);
}
+function ellipsify($s,$maxlen) {
+ if($maxlen & 1)
+ $maxlen --;
+ if($maxlen < 4)
+ $maxlen = 4;
+
+ if(mb_strlen($s) < $maxlen)
+ return $s;
+
+ return mb_substr($s,0,$maxlen / 2) . '...' . mb_substr($s,mb_strlen($s) - ($maxlen / 2));
+} \ No newline at end of file
diff --git a/include/widgets.php b/include/widgets.php
deleted file mode 100644
index cb8a6133e..000000000
--- a/include/widgets.php
+++ /dev/null
@@ -1,1735 +0,0 @@
-<?php
-/**
- * @file include/widgets.php
- *
- * @brief This file contains the widgets.
- */
-
-require_once('include/dir_fns.php');
-require_once('include/contact_widgets.php');
-require_once('include/attach.php');
-
-
-function widget_profile($args) {
-
- $block = observer_prohibited();
- return profile_sidebar(App::$profile, $block, true);
-}
-
-function widget_zcard($args) {
-
- $block = observer_prohibited();
- $channel = channelx_by_n(App::$profile_uid);
- return get_zcard($channel,get_observer_hash(),array('width' => 875));
-}
-
-
-
-
-// FIXME The problem with the next widget is that we don't have a search function for webpages that we can send the links to.
-// Then we should also provide an option to search webpages and conversations.
-
-function widget_tagcloud($args) {
-
- $o = '';
- //$tab = 0;
-
- $uid = App::$profile_uid;
- $count = ((x($args,'count')) ? intval($args['count']) : 24);
- $flags = 0;
- $type = TERM_CATEGORY;
-
- // FIXME there exists no $authors variable
- $r = tagadelic($uid, $count, $authors, $owner, $flags, ITEM_TYPE_WEBPAGE, $type);
-
- if($r) {
- $o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
- foreach($r as $rr) {
- $o .= '<span class="tag'.$rr[2].'">'.$rr[0].'</span> ' . "\r\n";
- }
- $o .= '</div></div>';
- }
- return $o;
-}
-
-function widget_collections($args) {
- require_once('include/group.php');
-
- $mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
- switch($mode) {
- case 'conversation':
- $every = argv(0);
- $each = argv(0);
- $edit = true;
- $current = $_REQUEST['gid'];
- $abook_id = 0;
- $wmode = 0;
- break;
- case 'connections':
- $every = 'connections';
- $each = 'group';
- $edit = true;
- $current = $_REQUEST['gid'];
- $abook_id = 0;
- $wmode = 0;
- case 'groups':
- $every = 'connections';
- $each = argv(0);
- $edit = false;
- $current = intval(argv(1));
- $abook_id = 0;
- $wmode = 1;
- break;
- case 'abook':
- $every = 'connections';
- $each = 'group';
- $edit = false;
- $current = 0;
- $abook_id = App::$poi['abook_xchan'];
- $wmode = 1;
- break;
- default:
- return '';
- break;
- }
-
- return group_side($every, $each, $edit, $current, $abook_id, $wmode);
-}
-
-
-function widget_appselect($arr) {
- return replace_macros(get_markup_template('app_select.tpl'),array(
- '$title' => t('Apps'),
- '$system' => t('System'),
- '$authed' => ((local_channel()) ? true : false),
- '$personal' => t('Personal'),
- '$new' => t('New App'),
- '$edit' => t('Edit Apps'),
- '$cat' => ((array_key_exists('cat',$_REQUEST)) ? $_REQUEST['cat'] : '')
- ));
-}
-
-
-function widget_suggestions($arr) {
-
- if((! local_channel()) || (! feature_enabled(local_channel(),'suggest')))
- return '';
-
- require_once('include/socgraph.php');
-
- $r = suggestion_query(local_channel(),get_observer_hash(),0,20);
-
- if(! $r) {
- return;
- }
-
- $arr = array();
-
- // Get two random entries from the top 20 returned.
- // We'll grab the first one and the one immediately following.
- // This will throw some entropy intot he situation so you won't
- // be looking at the same two mug shots every time the widget runs
-
- $index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
-
- for($x = $index; $x <= ($index+1); $x ++) {
- $rr = $r[$x];
- if(! $rr['xchan_url'])
- break;
-
- $connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
-
- $arr[] = array(
- 'url' => chanlink_url($rr['xchan_url']),
- 'profile' => $rr['xchan_url'],
- 'name' => $rr['xchan_name'],
- 'photo' => $rr['xchan_photo_m'],
- 'ignlnk' => z_root() . '/directory?ignore=' . $rr['xchan_hash'],
- 'conntxt' => t('Connect'),
- 'connlnk' => $connlnk,
- 'ignore' => t('Ignore/Hide')
- );
- }
-
- $o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
- '$title' => t('Suggestions'),
- '$more' => t('See more...'),
- '$entries' => $arr
- ));
-
- return $o;
-}
-
-
-function widget_follow($args) {
- if(! local_channel())
- return '';
-
- $uid = App::$channel['channel_id'];
- $r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
- intval($uid)
- );
- if($r)
- $total_channels = $r[0]['total'];
- $limit = service_class_fetch($uid,'total_channels');
- if($limit !== false) {
- $abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
- }
- else {
- $abook_usage_message = '';
- }
- return replace_macros(get_markup_template('follow.tpl'),array(
- '$connect' => t('Add New Connection'),
- '$desc' => t('Enter channel address'),
- '$hint' => t('Examples: bob@example.com, https://example.com/barbara'),
- '$follow' => t('Connect'),
- '$abook_usage_message' => $abook_usage_message
- ));
-}
-
-
-function widget_notes($arr) {
- if(! local_channel())
- return '';
- if(! feature_enabled(local_channel(),'private_notes'))
- return '';
-
- $text = get_pconfig(local_channel(),'notes','text');
-
- $o = replace_macros(get_markup_template('notes.tpl'), array(
- '$banner' => t('Notes'),
- '$text' => $text,
- '$save' => t('Save'),
- ));
-
- return $o;
-}
-
-
-function widget_savedsearch($arr) {
- if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
- return '';
-
- $search = ((x($_GET,'netsearch')) ? $_GET['netsearch'] : '');
- if(! $search)
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- if(x($_GET,'searchsave') && $search) {
- $r = q("select * from term where uid = %d and ttype = %d and term = '%s' limit 1",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! $r) {
- q("insert into term ( uid,ttype,term ) values ( %d, %d, '%s') ",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
-
- if(x($_GET,'searchremove') && $search) {
- q("delete from term where uid = %d and ttype = %d and term = '%s'",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- $search = '';
- }
-
- $srchurl = App::$query_string;
-
- $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
-
- $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
-
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
-
- if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
-
- $o = '';
-
- $r = q("select tid,term from term WHERE uid = %d and ttype = %d ",
- intval(local_channel()),
- intval(TERM_SAVEDSEARCH)
- );
-
- $saved = array();
-
- if(count($r)) {
- foreach($r as $rr) {
- $saved[] = array(
- 'id' => $rr['tid'],
- 'term' => $rr['term'],
- 'dellink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
- 'srchlink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
- 'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
- 'encodedterm' => urlencode($rr['term']),
- 'delete' => t('Remove term'),
- 'selected' => ($search==$rr['term']),
- );
- }
- }
-
- $tpl = get_markup_template("saved_searches.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Saved Searches'),
- '$add' => t('add'),
- '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), true),
- '$saved' => $saved,
- ));
-
- return $o;
-}
-
-function widget_sitesearch($arr) {
-
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- $srchurl = App::$query_string;
-
- $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
-
- $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
- $hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
-
- if(($hasamp) && (! $hasq))
- $srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
-
- $o = '';
-
- $saved = array();
-
- $tpl = get_markup_template("sitesearch.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Search'),
- '$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), false),
- '$saved' => $saved,
- ));
-
- return $o;
-}
-
-
-
-
-
-function widget_filer($arr) {
- if(! local_channel())
- return '';
-
-
- $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
-
- $terms = array();
- $r = q("select distinct term from term where uid = %d and ttype = %d order by term asc",
- intval(local_channel()),
- intval(TERM_FILE)
- );
- if(! $r)
- return;
-
- foreach($r as $rr)
- $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
-
- return replace_macros(get_markup_template('fileas_widget.tpl'),array(
- '$title' => t('Saved Folders'),
- '$desc' => '',
- '$sel_all' => (($selected == '') ? 'selected' : ''),
- '$all' => t('Everything'),
- '$terms' => $terms,
- '$base' => z_root() . '/' . App::$cmd
- ));
-}
-
-function widget_archive($arr) {
-
- $o = '';
-
- if(! App::$profile_uid) {
- return '';
- }
-
- $uid = App::$profile_uid;
-
- if(! feature_enabled($uid,'archives'))
- return '';
-
- if(! perm_is_allowed($uid,get_observer_hash(),'view_stream'))
- return '';
-
- $wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
- $style = ((array_key_exists('style', $arr)) ? $arr['style'] : 'select');
- $showend = ((get_pconfig($uid,'system','archive_show_end_date')) ? true : false);
- $mindate = get_pconfig($uid,'system','archive_mindate');
- $visible_years = get_pconfig($uid,'system','archive_visible_years');
- if(! $visible_years)
- $visible_years = 5;
-
- $url = z_root() . '/' . App::$cmd;
-
- $ret = list_post_dates($uid,$wall,$mindate);
-
- if(! count($ret))
- return '';
-
- $cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
- $cutoff = ((array_key_exists($cutoff_year,$ret))? true : false);
-
- $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
- '$title' => t('Archives'),
- '$size' => $visible_years,
- '$cutoff_year' => $cutoff_year,
- '$cutoff' => $cutoff,
- '$url' => $url,
- '$style' => $style,
- '$showend' => $showend,
- '$dates' => $ret
- ));
- return $o;
-}
-
-
-function widget_fullprofile($arr) {
-
- if(! App::$profile['profile_uid'])
- return;
-
- $block = observer_prohibited();
-
- return profile_sidebar(App::$profile, $block);
-}
-
-function widget_shortprofile($arr) {
-
- if(! App::$profile['profile_uid'])
- return;
-
- $block = observer_prohibited();
-
- return profile_sidebar(App::$profile, $block, true, true);
-}
-
-
-function widget_categories($arr) {
-
-
- if(App::$profile['profile_uid'] && (! perm_is_allowed(App::$profile['profile_uid'],get_observer_hash(),'view_stream')))
- return '';
-
- $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
- $srchurl = App::$query_string;
- $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
- return categories_widget($srchurl, $cat);
-
-}
-
-function widget_appcategories($arr) {
-
- if(! local_channel())
- return '';
-
- $selected = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
-
- $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
- $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
-
- $srchurl = z_root() . '/apps';
-
- $terms = array();
-
- $r = q("select distinct(term.term)
- from term join app on term.oid = app.id
- where app_channel = %d
- and term.uid = app_channel
- and term.otype = %d
- and term.term != 'nav_featured_app'
- order by term.term asc",
- intval(local_channel()),
- intval(TERM_OBJ_APP)
- );
- if($r) {
- foreach($r as $rr)
- $terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
-
- return replace_macros(get_markup_template('categories_widget.tpl'),array(
- '$title' => t('Categories'),
- '$desc' => '',
- '$sel_all' => (($selected == '') ? 'selected' : ''),
- '$all' => t('Everything'),
- '$terms' => $terms,
- '$base' => $srchurl,
-
- ));
- }
-
-
-
-}
-
-
-
-function widget_appcloud($arr) {
- if(! local_channel())
- return '';
- return app_tagblock(z_root() . '/apps');
-}
-
-
-function widget_tagcloud_wall($arr) {
-
-
- if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
- return '';
- if(! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
- return '';
-
- $limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
- if(feature_enabled(App::$profile['profile_uid'], 'tagadelic'))
- return wtagblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
-
- return '';
-}
-
-function widget_catcloud_wall($arr) {
-
-
- if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
- return '';
- if(! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
- return '';
-
- $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
-
- return catblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
-}
-
-
-function widget_affinity($arr) {
-
- if(! local_channel())
- return '';
-
- // Get default cmin value from pconfig, but allow GET parameter to override
- $cmin = intval(get_pconfig(local_channel(),'affinity','cmin'));
- $cmin = (($cmin) ? $cmin : 0);
- $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : $cmin);
-
- // Get default cmax value from pconfig, but allow GET parameter to override
- $cmax = intval(get_pconfig(local_channel(),'affinity','cmax'));
- $cmax = (($cmax) ? $cmax : 99);
- $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : $cmax);
-
-
- if(feature_enabled(local_channel(),'affinity')) {
-
- $labels = array(
- t('Me'),
- t('Family'),
- t('Friends'),
- t('Acquaintances'),
- t('All')
- );
- call_hooks('affinity_labels',$labels);
- $label_str = '';
-
- if($labels) {
- foreach($labels as $l) {
- if($label_str) {
- $label_str .= ", '|'";
- $label_str .= ", '" . $l . "'";
- }
- else
- $label_str .= "'" . $l . "'";
- }
- }
-
- $tpl = get_markup_template('main_slider.tpl');
- $x = replace_macros($tpl,array(
- '$val' => $cmin . ',' . $cmax,
- '$refresh' => t('Refresh'),
- '$labels' => $label_str,
- ));
- $arr = array('html' => $x);
- call_hooks('main_slider',$arr);
- return $arr['html'];
- }
-
- return '';
-}
-
-
-function widget_settings_menu($arr) {
-
- if(! local_channel())
- return;
-
-
- $channel = App::get_channel();
-
- $abook_self_id = 0;
-
- // Retrieve the 'self' address book entry for use in the auto-permissions link
-
- $role = get_pconfig(local_channel(),'system','permissions_role');
-
- $abk = q("select abook_id from abook where abook_channel = %d and abook_self = 1 limit 1",
- intval(local_channel())
- );
- if($abk)
- $abook_self_id = $abk[0]['abook_id'];
-
- $x = q("select count(*) as total from hubloc where hubloc_hash = '%s' and hubloc_deleted = 0 ",
- dbesc($channel['channel_hash'])
- );
-
- $hublocs = (($x && $x[0]['total'] > 1) ? true : false);
-
- $tabs = array(
- array(
- 'label' => t('Account settings'),
- 'url' => z_root().'/settings/account',
- 'selected' => ((argv(1) === 'account') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Channel settings'),
- 'url' => z_root().'/settings/channel',
- 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
- ),
-
- );
-
- if(get_account_techlevel() > 0 && get_features()) {
- $tabs[] = array(
- 'label' => t('Additional features'),
- 'url' => z_root().'/settings/features',
- 'selected' => ((argv(1) === 'features') ? 'active' : ''),
- );
- }
-
- $tabs[] = array(
- 'label' => t('Feature/Addon settings'),
- 'url' => z_root().'/settings/featured',
- 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
- );
-
- $tabs[] = array(
- 'label' => t('Display settings'),
- 'url' => z_root().'/settings/display',
- 'selected' => ((argv(1) === 'display') ? 'active' : ''),
- );
-
- if($hublocs) {
- $tabs[] = array(
- 'label' => t('Manage locations'),
- 'url' => z_root() . '/locs',
- 'selected' => ((argv(1) === 'locs') ? 'active' : ''),
- );
- }
-
- $tabs[] = array(
- 'label' => t('Export channel'),
- 'url' => z_root() . '/uexport',
- 'selected' => ''
- );
-
- $tabs[] = array(
- 'label' => t('Connected apps'),
- 'url' => z_root() . '/settings/oauth',
- 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
- );
-
- if(get_account_techlevel() > 2) {
- $tabs[] = array(
- 'label' => t('Guest Access Tokens'),
- 'url' => z_root() . '/settings/tokens',
- 'selected' => ((argv(1) === 'tokens') ? 'active' : ''),
- );
- }
-
- if(feature_enabled(local_channel(),'permcats')) {
- $tabs[] = array(
- 'label' => t('Permission Groups'),
- 'url' => z_root() . '/settings/permcats',
- 'selected' => ((argv(1) === 'permcats') ? 'active' : ''),
- );
- }
-
-
- if($role === false || $role === 'custom') {
- $tabs[] = array(
- 'label' => t('Connection Default Permissions'),
- 'url' => z_root() . '/connedit/' . $abook_self_id,
- 'selected' => ''
- );
- }
-
- if(feature_enabled(local_channel(),'premium_channel')) {
- $tabs[] = array(
- 'label' => t('Premium Channel Settings'),
- 'url' => z_root() . '/connect/' . $channel['channel_address'],
- 'selected' => ''
- );
- }
-
- if(feature_enabled(local_channel(),'channel_sources')) {
- $tabs[] = array(
- 'label' => t('Channel Sources'),
- 'url' => z_root() . '/sources',
- 'selected' => ''
- );
- }
-
- $tabtpl = get_markup_template("generic_links_widget.tpl");
- return replace_macros($tabtpl, array(
- '$title' => t('Settings'),
- '$class' => 'settings-widget',
- '$items' => $tabs,
- ));
-}
-
-
-function widget_mailmenu($arr) {
- if (! local_channel())
- return;
-
-
- return replace_macros(get_markup_template('message_side.tpl'), array(
- '$title' => t('Private Mail Menu'),
- '$combined'=>array(
- 'label' => t('Combined View'),
- 'url' => z_root() . '/mail/combined',
- 'sel' => (argv(1) == 'combined'),
- ),
- '$inbox'=>array(
- 'label' => t('Inbox'),
- 'url' => z_root() . '/mail/inbox',
- 'sel' => (argv(1) == 'inbox'),
- ),
- '$outbox'=>array(
- 'label' => t('Outbox'),
- 'url' => z_root() . '/mail/outbox',
- 'sel' => (argv(1) == 'outbox'),
- ),
- '$new'=>array(
- 'label' => t('New Message'),
- 'url' => z_root() . '/mail/new',
- 'sel'=> (argv(1) == 'new'),
- )
- ));
-}
-
-
-function widget_conversations($arr) {
- if (! local_channel())
- return;
-
- if(argc() > 1) {
-
- switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
- break;
- case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
- break;
- default:
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- }
-
- require_once('include/message.php');
-
- // private_messages_list() can do other more complicated stuff, for now keep it simple
- $r = private_messages_list(local_channel(), $mailbox, App::$pager['start'], App::$pager['itemspage']);
-
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
- }
-
- $messages = array();
-
- foreach($r as $rr) {
-
- $messages[] = array(
- 'mailbox' => $mailbox,
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => $rr['body'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
- 'seen' => $rr['seen'],
- 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
- );
- }
-
- $tpl = get_markup_template('mail_head.tpl');
- $o .= replace_macros($tpl, array(
- '$header' => $header,
- '$messages' => $messages
- ));
-
- //$o .= alt_pager($a,count($r));
-
- }
-
- return $o;
-}
-
-function widget_eventstools($arr) {
- if (! local_channel())
- return;
-
- return replace_macros(get_markup_template('events_tools_side.tpl'), array(
- '$title' => t('Events Tools'),
- '$export' => t('Export Calendar'),
- '$import' => t('Import Calendar'),
- '$submit' => t('Submit')
- ));
-}
-
-function widget_design_tools($arr) {
-
- // mod menu doesn't load a profile. For any modules which load a profile, check it.
- // otherwise local_channel() is sufficient for permissions.
-
- if(App::$profile['profile_uid'])
- if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
- return '';
-
- if(! local_channel())
- return '';
-
- return design_tools();
-}
-
-function widget_website_portation_tools($arr) {
-
- // mod menu doesn't load a profile. For any modules which load a profile, check it.
- // otherwise local_channel() is sufficient for permissions.
-
- if(App::$profile['profile_uid'])
- if((App::$profile['profile_uid'] != local_channel()) && (! App::$is_sys))
- return '';
-
- if(! local_channel())
- return '';
-
- return website_portation_tools();
-}
-
-function widget_findpeople($arr) {
- return findpeople_widget();
-}
-
-
-function widget_photo_albums($arr) {
-
- if(! App::$profile['profile_uid'])
- return '';
- $channelx = channelx_by_n(App::$profile['profile_uid']);
- if((! $channelx) || (! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_storage')))
- return '';
- require_once('include/photos.php');
- $sortkey = ((array_key_exists('sortkey',$arr)) ? $arr['sortkey'] : 'album');
- $direction = ((array_key_exists('direction',$arr)) ? $arr['direction'] : 'asc');
-
- return photos_album_widget($channelx, App::get_observer(),$sortkey,$direction);
-}
-
-
-function widget_vcard($arr) {
- return vcard_from_xchan('', App::get_observer());
-}
-
-
-/*
- * The following directory widgets are only useful on the directory page
- */
-
-
-function widget_dirsort($arr) {
- return dir_sort_links();
-}
-
-function widget_dirtags($arr) {
- return dir_tagblock(z_root() . '/directory', null);
-}
-
-function widget_menu_preview($arr) {
- if(! App::$data['menu_item'])
- return;
- require_once('include/menu.php');
-
- return menu_render(App::$data['menu_item']);
-}
-
-function widget_chatroom_list($arr) {
-
-
- $r = Zotlabs\Lib\Chatroom::roomlist(App::$profile['profile_uid']);
-
- if($r) {
- return replace_macros(get_markup_template('chatroomlist.tpl'), array(
- '$header' => t('Chatrooms'),
- '$baseurl' => z_root(),
- '$nickname' => App::$profile['channel_address'],
- '$items' => $r,
- '$overview' => t('Overview')
- ));
- }
-}
-
-function widget_chatroom_members() {
- $o = replace_macros(get_markup_template('chatroom_members.tpl'), array(
- '$header' => t('Chat Members')
- ));
-
- return $o;
-}
-
-function widget_wiki_list($arr) {
-
- $channel = channelx_by_n(App::$profile_uid);
-
- $wikis = Zotlabs\Lib\NativeWiki::listwikis($channel,get_observer_hash());
-
- if($wikis) {
- return replace_macros(get_markup_template('wikilist_widget.tpl'), array(
- '$header' => t('Wiki List'),
- '$channel' => $channel['channel_address'],
- '$wikis' => $wikis['wikis']
- ));
- }
- return '';
-}
-
-function widget_wiki_pages($arr) {
-
- $channelname = ((array_key_exists('channel',$arr)) ? $arr['channel'] : '');
- $c = channelx_by_nick($channelname);
-
- $wikiname = '';
- if (array_key_exists('refresh', $arr)) {
- $not_refresh = (($arr['refresh']=== true) ? false : true);
- } else {
- $not_refresh = true;
- }
- $pages = array();
- if (! array_key_exists('resource_id', $arr)) {
- $hide = true;
- } else {
- $p = Zotlabs\Lib\NativeWikiPage::page_list($c['channel_id'],get_observer_hash(),$arr['resource_id']);
-
- if($p['pages']) {
- $pages = $p['pages'];
- $w = $p['wiki'];
- // Wiki item record is $w['wiki']
- $wikiname = $w['urlName'];
- if (!$wikiname) {
- $wikiname = '';
- }
- }
- }
- $can_create = perm_is_allowed(\App::$profile['uid'],get_observer_hash(),'write_pages');
-
- $can_delete = ((local_channel() && (local_channel() == \App::$profile['uid'])) ? true : false);
-
- return replace_macros(get_markup_template('wiki_page_list.tpl'), array(
- '$hide' => $hide,
- '$resource_id' => $arr['resource_id'],
- '$not_refresh' => $not_refresh,
- '$header' => t('Wiki Pages'),
- '$channel' => $channelname,
- '$wikiname' => $wikiname,
- '$pages' => $pages,
- '$canadd' => $can_create,
- '$candel' => $can_delete,
- '$addnew' => t('Add new page'),
- '$pageName' => array('pageName', t('Page name')),
- ));
-}
-
-function widget_wiki_page_history($arr) {
-
- $pageUrlName = ((array_key_exists('pageUrlName', $arr)) ? $arr['pageUrlName'] : '');
- $resource_id = ((array_key_exists('resource_id', $arr)) ? $arr['resource_id'] : '');
-
- $pageHistory = Zotlabs\Lib\NativeWikiPage::page_history(array('channel_id' => App::$profile_uid, 'observer_hash' => get_observer_hash(), 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
- return replace_macros(get_markup_template('nwiki_page_history.tpl'), array(
- '$pageHistory' => $pageHistory['history'],
- '$permsWrite' => $arr['permsWrite'],
- '$name_lbl' => t('Name'),
- '$msg_label' => t('Message','wiki_history')
- ));
-
-}
-
-function widget_bookmarkedchats($arr) {
-
- if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat'))
- return '';
-
- $h = get_observer_hash();
- if(! $h)
- return;
- $r = q("select xchat_url, xchat_desc from xchat where xchat_xchan = '%s' order by xchat_desc",
- dbesc($h)
- );
- if($r) {
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
- }
- }
- return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
- '$header' => t('Bookmarked Chatrooms'),
- '$rooms' => $r
- ));
-}
-
-function widget_suggestedchats($arr) {
-
- if(! feature_enabled(App::$profile['profile_uid'],'ajaxchat'))
- return '';
-
- // There are reports that this tool does not ever remove chatrooms on dead sites,
- // and also will happily link to private chats which you cannot enter.
- // For those reasons, it will be disabled until somebody decides it's worth
- // fixing and comes up with a plan for doing so.
-
- return '';
-
-
- // probably should restrict this to your friends, but then the widget will only work
- // if you are logged in locally.
-
- $h = get_observer_hash();
- if(! $h)
- return;
- $r = q("select xchat_url, xchat_desc, count(xchat_xchan) as total from xchat group by xchat_url, xchat_desc order by total desc, xchat_desc limit 24");
- if($r) {
- for($x = 0; $x < count($r); $x ++) {
- $r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
- }
- }
- return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
- '$header' => t('Suggested Chatrooms'),
- '$rooms' => $r
- ));
-}
-
-function widget_item($arr) {
-
- $channel_id = 0;
- if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
-
- if((! $arr['mid']) && (! $arr['title']))
- return '';
-
- if(! perm_is_allowed($channel_id, get_observer_hash(), 'view_pages'))
- return '';
-
- require_once('include/security.php');
- $sql_extra = item_permissions_sql($channel_id);
-
- if($arr['title']) {
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s'
- and iconfig.k = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
- intval($channel_id),
- dbesc($arr['title']),
- intval(ITEM_TYPE_WEBPAGE)
- );
- }
- else {
- $r = q("select * from item where mid = '%s' and uid = %d and item_type = " . intval(ITEM_TYPE_WEBPAGE) . " $sql_extra limit 1",
- dbesc($arr['mid']),
- intval($channel_id)
- );
- }
-
- if(! $r)
- return '';
-
- xchan_query($r);
- $r = fetch_post_tags($r, true);
-
- $o = prepare_page($r[0]);
- return $o;
-}
-
-function widget_clock($arr) {
-
- $miltime = 0;
- if(isset($arr['military']) && $arr['military'])
- $miltime = 1;
-
-$o = <<< EOT
-<div class="widget">
-<h3 class="clockface"></h3>
-<script>
-
-var timerID = null
-var timerRunning = false
-
-function stopclock(){
- if(timerRunning)
- clearTimeout(timerID)
- timerRunning = false
-}
-
-function startclock(){
- stopclock()
- showtime()
-}
-
-function showtime(){
- var now = new Date()
- var hours = now.getHours()
- var minutes = now.getMinutes()
- var seconds = now.getSeconds()
- var military = $miltime
- var timeValue = ""
- if(military)
- timeValue = hours
- else
- timeValue = ((hours > 12) ? hours - 12 : hours)
- timeValue += ((minutes < 10) ? ":0" : ":") + minutes
-// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
- if(! military)
- timeValue += (hours >= 12) ? " P.M." : " A.M."
- $('.clockface').html(timeValue)
- timerID = setTimeout("showtime()",1000)
- timerRunning = true
-}
-
-$(document).ready(function() {
- startclock();
-});
-
-</script>
-</div>
-EOT;
-return $o;
-
-}
-
-/**
- * @brief Widget to display a single photo.
- *
- * @param array $arr associative array with
- * * \e string \b src URL of photo; URL must be an http or https URL
- * * \e boolean \b zrl use zid in URL
- * * \e string \b style CSS string
- *
- * @return string with parsed HTML
- */
-function widget_photo($arr) {
-
- $style = $zrl = false;
-
- if(array_key_exists('src', $arr) && isset($arr['src']))
- $url = $arr['src'];
-
- if(strpos($url, 'http') !== 0)
- return '';
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpbrk($style, '(\'"<>') !== false)
- $style = '';
-
- if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
- $zrl = (($arr['zrl']) ? true : false);
-
- if($zrl)
- $url = zid($url);
-
- $o = '<div class="widget">';
-
- $o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
- . (($style) ? ' style="' . $style . '"' : '')
- . ' src="' . $url . '" alt="' . t('photo/image') . '">';
-
- $o .= '</div>';
-
- return $o;
-}
-
-
-function widget_cover_photo($arr) {
-
- require_once('include/channel.php');
- $o = '';
-
- if(App::$module == 'channel' && $_REQUEST['mid'])
- return '';
-
- $channel_id = 0;
- if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- $channel = channelx_by_n($channel_id);
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
- else
- $style = 'width:100%; height: auto;';
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpbrk($style,'(\'"<>') !== false)
- $style = '';
-
- if(array_key_exists('title', $arr) && isset($arr['title']))
- $title = $arr['title'];
- else
- $title = $channel['channel_name'];
-
- if(array_key_exists('subtitle', $arr) && isset($arr['subtitle']))
- $subtitle = $arr['subtitle'];
- else
- $subtitle = str_replace('@','&#x40;',$channel['xchan_addr']);
-
- $c = get_cover_photo($channel_id,'html');
-
- if($c) {
- $photo_html = (($style) ? str_replace('alt=',' style="' . $style . '" alt=',$c) : $c);
-
- $o = replace_macros(get_markup_template('cover_photo_widget.tpl'),array(
- '$photo_html' => $photo_html,
- '$title' => $title,
- '$subtitle' => $subtitle,
- '$hovertitle' => t('Click to show more'),
- ));
- }
- return $o;
-}
-
-
-function widget_photo_rand($arr) {
-
- require_once('include/photos.php');
- $style = false;
-
- if(array_key_exists('album', $arr) && isset($arr['album']))
- $album = $arr['album'];
- else
- $album = '';
-
- $channel_id = 0;
- if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- $scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
-
- $ret = photos_list_photos(array('channel_id' => $channel_id),App::get_observer(),$album);
-
- $filtered = array();
- if($ret['success'] && $ret['photos'])
- foreach($ret['photos'] as $p)
- if($p['imgscale'] == $scale)
- $filtered[] = $p['src'];
-
- if($filtered) {
- $e = mt_rand(0, count($filtered) - 1);
- $url = $filtered[$e];
- }
-
- if(strpos($url, 'http') !== 0)
- return '';
-
- if(array_key_exists('style', $arr) && isset($arr['style']))
- $style = $arr['style'];
-
- // ensure they can't sneak in an eval(js) function
-
- if(strpos($style,'(') !== false)
- return '';
-
- $url = zid($url);
-
- $o = '<div class="widget">';
-
- $o .= '<img class="zrl" '
- . (($style) ? ' style="' . $style . '"' : '')
- . ' src="' . $url . '" alt="' . t('photo/image') . '">';
-
- $o .= '</div>';
-
- return $o;
-}
-
-
-function widget_random_block($arr) {
-
- $channel_id = 0;
- if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
- $channel_id = intval($arr['channel_id']);
- if(! $channel_id)
- $channel_id = App::$profile_uid;
- if(! $channel_id)
- return '';
-
- if(array_key_exists('contains',$arr))
- $contains = $arr['contains'];
-
- $o = '';
-
- require_once('include/security.php');
- $sql_options = item_permissions_sql($channel_id);
-
- $randfunc = db_getfunc('RAND');
-
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v like '%s' and iconfig.k = 'BUILDBLOCK' and
- item_type = %d $sql_options order by $randfunc limit 1",
- intval($channel_id),
- dbesc('%' . $contains . '%'),
- intval(ITEM_TYPE_BLOCK)
- );
-
- if($r) {
- $o = '<div class="widget bblock">';
- if($r[0]['title'])
- $o .= '<h3>' . $r[0]['title'] . '</h3>';
-
- $o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
- $o .= '</div>';
- }
-
- return $o;
-}
-
-
-function widget_rating($arr) {
-
-
- $rating_enabled = get_config('system','rating_enabled');
- if(! $rating_enabled) {
- return;
- }
-
- if($arr['target'])
- $hash = $arr['target'];
- else
- $hash = App::$poi['xchan_hash'];
-
- if(! $hash)
- return;
-
- $url = '';
- $remote = false;
-
- if(remote_channel() && ! local_channel()) {
- $ob = App::get_observer();
- if($ob && $ob['xchan_url']) {
- $p = parse_url($ob['xchan_url']);
- if($p) {
- $url = $p['scheme'] . '://' . $p['host'] . (($p['port']) ? ':' . $p['port'] : '');
- $url .= '/rate?f=&target=' . urlencode($hash);
- }
- $remote = true;
- }
- }
-
- $self = false;
-
- if(local_channel()) {
- $channel = App::get_channel();
-
- if($hash == $channel['channel_hash'])
- $self = true;
-
- head_add_js('ratings.js');
-
- }
-
-
- $o = '<div class="widget">';
- $o .= '<h3>' . t('Rating Tools') . '</h3>';
-
- if((($remote) || (local_channel())) && (! $self)) {
- if($remote)
- $o .= '<a class="btn btn-block btn-primary btn-sm" href="' . $url . '"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</a>';
- else
- $o .= '<div class="btn btn-block btn-primary btn-sm" onclick="doRatings(\'' . $hash . '\'); return false;"><i class="fa fa-pencil"></i> ' . t('Rate Me') . '</div>';
- }
-
- $o .= '<a class="btn btn-block btn-default btn-sm" href="ratings/' . $hash . '"><i class="fa fa-eye"></i> ' . t('View Ratings') . '</a>';
- $o .= '</div>';
-
- return $o;
-
-}
-
-// used by site ratings pages to provide a return link
-function widget_pubsites($arr) {
- if(App::$poi)
- return;
- return '<div class="widget"><ul class="nav nav-pills"><li><a href="pubsites">' . t('Public Hubs') . '</a></li></ul></div>';
-}
-
-
-function widget_forums($arr) {
-
- if(! local_channel())
- return '';
-
- $o = '';
-
- if(is_array($arr) && array_key_exists('limit',$arr))
- $limit = " limit " . intval($limit) . " ";
- else
- $limit = '';
-
- $unseen = 0;
- if(is_array($arr) && array_key_exists('unseen',$arr) && intval($arr['unseen']))
- $unseen = 1;
-
- $perms_sql = item_permissions_sql(local_channel()) . item_normal();
-
- $xf = false;
-
- $x1 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'send_stream' and v = '0'",
- intval(local_channel())
- );
- if($x1) {
- $xc = ids_to_querystr($x1,'xchan',true);
- $x2 = q("select xchan from abconfig where chan = %d and cat = 'their_perms' and k = 'tag_deliver' and v = '1' and xchan in (" . $xc . ") ",
- intval(local_channel())
- );
- if($x2)
- $xf = ids_to_querystr($x2,'xchan',true);
- }
-
- $sql_extra = (($xf) ? " and ( xchan_hash in (" . $xf . ") or xchan_pubforum = 1 ) " : " and xchan_pubforum = 1 ");
-
- $r1 = q("select abook_id, xchan_hash, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash where xchan_deleted = 0 and abook_channel = %d $sql_extra order by xchan_name $limit ",
- intval(local_channel())
- );
- if(! $r1)
- return $o;
-
- $str = '';
-
- // Trying to cram all this into a single query with joins and the proper group by's is tough.
- // There also should be a way to update this via ajax.
-
- for($x = 0; $x < count($r1); $x ++) {
- $r = q("select sum(item_unseen) as unseen from item where owner_xchan = '%s' and uid = %d and item_unseen = 1 $perms_sql ",
- dbesc($r1[$x]['xchan_hash']),
- intval(local_channel())
- );
- if($r)
- $r1[$x]['unseen'] = $r[0]['unseen'];
-
-/**
- * @FIXME
- * This SQL makes the counts correct when you get forum posts arriving from different routes/sources
- * (like personal channels). However the network query for these posts doesn't yet include this
- * correction and it makes the SQL for that query pretty hairy so this is left as a future exercise.
- * It may make more sense in that query to look for the mention in the body rather than another join,
- * but that makes it very inefficient.
- *
- $r = q("select sum(item_unseen) as unseen from item left join term on oid = id where otype = %d and owner_xchan != '%s' and item.uid = %d and url = '%s' and ttype = %d $perms_sql ",
- intval(TERM_OBJ_POST),
- dbesc($r1[$x]['xchan_hash']),
- intval(local_channel()),
- dbesc($r1[$x]['xchan_url']),
- intval(TERM_MENTION)
- );
- if($r)
- $r1[$x]['unseen'] = ((array_key_exists('unseen',$r1[$x])) ? $r1[$x]['unseen'] + $r[0]['unseen'] : $r[0]['unseen']);
- *
- * end @FIXME
- */
-
- }
-
- if($r1) {
- $o .= '<div class="widget">';
- $o .= '<h3>' . t('Forums') . '</h3><ul class="nav nav-pills nav-stacked">';
-
- foreach($r1 as $rr) {
- if($unseen && (! intval($rr['unseen'])))
- continue;
- $o .= '<li><a href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge pull-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img src="' . $rr['xchan_photo_s'] . '" style="width: 16px; height: 16px;" /> ' . $rr['xchan_name'] . '</a></li>';
- }
- $o .= '</ul></div>';
- }
- return $o;
-
-}
-
-
-function widget_tasklist($arr) {
-
- if (! local_channel())
- return;
-
- require_once('include/event.php');
- $o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
- $o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
- function tasksFetch() {
- $.get("tasks/fetch" + ((tasksShowAll) ? "/all" : ""), function(data) {
- $(".tasklist-tasks").html(data.html);
- });
- }
- </script>';
-
- $o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
- $o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
- $o .= '</div>';
- return $o;
-
-}
-
-
-function widget_helpindex($arr) {
-
- $o .= '<div class="widget">';
-
- $level_0 = get_help_content('sitetoc');
- if(! $level_0)
- $level_0 = get_help_content('toc');
-
- $level_0 = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills nav-stacked">',$level_0);
-
- $levels = array();
-
-
- if(argc() > 2) {
- $path = '';
- for($x = 1; $x < argc(); $x ++) {
- $path .= argv($x) . '/';
- $y = get_help_content($path . 'sitetoc');
- if(! $y)
- $y = get_help_content($path . 'toc');
- if($y)
- $levels[] = preg_replace('/\<ul(.*?)\>/','<ul class="nav nav-pills nav-stacked">',$y);
- }
- }
-
- if($level_0)
- $o .= $level_0;
- if($levels) {
- foreach($levels as $l) {
- $o .= '<br /><br />';
- $o .= $l;
- }
- }
-
- $o .= '</div>';
-
- return $o;
-
-}
-
-
-
-function widget_admin($arr) {
-
- /*
- * Side bar links
- */
-
- if(! is_site_admin()) {
- return login(false);
- }
-
- $o = '';
-
- // array( url, name, extra css classes )
-
- $aside = array(
- 'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
- 'accounts' => array(z_root() . '/admin/accounts/', t('Accounts'), 'accounts', 'pending-update', t('Member registrations waiting for confirmation')),
- 'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
- 'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
- 'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
- 'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'),
- 'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'),
- 'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'),
- 'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'),
- 'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync')
-
- );
-
- /* get plugins admin page */
-
- $r = q("SELECT * FROM addon WHERE plugin_admin = 1");
-
- $plugins = array();
- if($r) {
- foreach ($r as $h){
- $plugin = $h['aname'];
- $plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin');
- // temp plugins with admin
- App::$plugins_admin[] = $plugin;
- }
- }
-
- $logs = array(z_root() . '/admin/logs/', t('Logs'), 'logs');
-
- $arr = array('links' => $aside,'plugins' => $plugins,'logs' => $logs);
- call_hooks('admin_aside',$arr);
-
- $o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
- '$admin' => $aside,
- '$admtxt' => t('Admin'),
- '$plugadmtxt' => t('Plugin Features'),
- '$plugins' => $plugins,
- '$logtxt' => t('Logs'),
- '$logs' => $logs,
- '$h_pending' => t('Member registrations waiting for confirmation'),
- '$admurl'=> z_root() . '/admin/'
- ));
-
- return $o;
-
-}
-
-
-
-function widget_album($args) {
-
- $owner_uid = App::$profile_uid;
- $sql_extra = permissions_sql($owner_uid);
-
-
- if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
- return '';
-
- if($args['album'])
- $album = $args['album'];
- if($args['title'])
- $title = $args['title'];
-
- /**
- * This may return incorrect permissions if you have multiple directories of the same name.
- * It is a limitation of the photo table using a name for a photo album instead of a folder hash
- */
-
- if($album) {
- $x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
- dbesc($album),
- intval($owner_uid)
- );
- if($x) {
- $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
- if(! $y)
- return '';
- }
- }
-
- $order = 'DESC';
-
- $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
- (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
- ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
- ORDER BY created $order ",
- intval($owner_uid),
- dbesc($album),
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE)
- );
-
- //edit album name
- $album_edit = null;
-
- $photos = array();
- if($r) {
- $twist = 'rotright';
- foreach($r as $rr) {
-
- if($twist == 'rotright')
- $twist = 'rotleft';
- else
- $twist = 'rotright';
-
- $ext = $phototypes[$rr['mimetype']];
-
- $imgalt_e = $rr['filename'];
- $desc_e = $rr['description'];
-
- $imagelink = (z_root() . '/photos/' . App::$profile['channel_address'] . '/image/' . $rr['resource_id']);
-
-
- $photos[] = array(
- 'id' => $rr['id'],
- 'twist' => ' ' . $twist . rand(2,4),
- 'link' => $imagelink,
- 'title' => t('View Photo'),
- 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
- 'alt' => $imgalt_e,
- 'desc'=> $desc_e,
- 'ext' => $ext,
- 'hash'=> $rr['resource_id'],
- 'unknown' => t('Unknown')
- );
- }
- }
-
-
- $tpl = get_markup_template('photo_album.tpl');
- $o .= replace_macros($tpl, array(
- '$photos' => $photos,
- '$album' => (($title) ? $title : $album),
- '$album_id' => rand(),
- '$album_edit' => array(t('Edit Album'), $album_edit),
- '$can_post' => false,
- '$upload' => array(t('Upload'), z_root() . '/photos/' . App::$profile['channel_address'] . '/upload/' . bin2hex($album)),
- '$order' => false,
- '$upload_form' => $upload_form,
- '$usage' => $usage_message
- ));
-
- return $o;
-}
-
diff --git a/include/zot.php b/include/zot.php
index 736712c81..3e1b27c83 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -165,9 +165,6 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot
function zot_best_algorithm($methods) {
- if(\Zotlabs\Lib\System::get_server_role() !== 'pro')
- return 'aes256cbc';
-
$x = [ 'methods' => $methods, 'result' => '' ];
call_hooks('zot_best_algorithm',$x);
if($x['result'])
@@ -313,8 +310,6 @@ function zot_refresh($them, $channel = null, $force = false) {
$result = z_post_url($url . $rhs,$postvars);
- logger('zot_refresh: zot-info: ' . print_r($result,true), LOGGER_DATA, LOG_DEBUG);
-
if ($result['success']) {
$j = json_decode($result['body'],true);
@@ -324,6 +319,8 @@ function zot_refresh($them, $channel = null, $force = false) {
return false;
}
+ logger('zot-info: ' . print_r($result,true), LOGGER_DATA, LOG_DEBUG);
+
$signed_token = ((is_array($j) && array_key_exists('signed_token',$j)) ? $j['signed_token'] : null);
if($signed_token) {
$valid = rsa_verify('token.' . $token,base64url_decode($signed_token),$j['key']);
@@ -334,10 +331,7 @@ function zot_refresh($them, $channel = null, $force = false) {
}
else {
logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- // after 2017-01-01 this will be a hard error unless you over-ride it.
- if((time() > 1483228800) && (! get_config('system','allow_unsigned_zotfinger'))) {
- return false;
- }
+ return false;
}
$x = import_xchan($j, (($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
@@ -2903,22 +2897,24 @@ function import_site($arr, $pubkey) {
else {
$update = true;
- $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage, site_realm, site_type, site_project, site_version, site_crypto )
- values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s', '%s', %d, '%s', '%s', '%s' )",
- dbesc($site_location),
- dbesc($url),
- intval($access_policy),
- intval($site_directory),
- dbesc(datetime_convert()),
- dbesc($directory_url),
- intval($register_policy),
- dbesc($sellpage),
- dbesc($site_realm),
- intval(SITE_TYPE_ZOT),
- dbesc($site_project),
- dbesc($site_version),
- dbesc($site_crypto)
+ $r = site_store_lowlevel(
+ [
+ 'site_location' => $site_location,
+ 'site_url' => $url,
+ 'site_access' => intval($access_policy),
+ 'site_flags' => intval($site_directory),
+ 'site_update' => datetime_convert(),
+ 'site_directory' => $directory_url,
+ 'site_register' => intval($register_policy),
+ 'site_sellpage' => $sellpage,
+ 'site_realm' => $site_realm,
+ 'site_type' => intval(SITE_TYPE_ZOT),
+ 'site_project' => $site_project,
+ 'site_version' => $site_version,
+ 'site_crypto' => $site_crypto
+ ]
);
+
if(! $r) {
logger('import_site: record create failed. ' . print_r($arr,true));
}
@@ -3584,21 +3580,62 @@ function get_rpost_path($observer) {
function import_author_zot($x) {
+ // Check that we have both a hubloc and xchan record - as occasionally storage calls will fail and
+ // we may only end up with one; which results in posts with no author name or photo and are a bit
+ // of a hassle to repair. If either or both are missing, do a full discovery probe.
+
$hash = make_xchan_hash($x['guid'],$x['guid_sig']);
- $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_primary = 1 limit 1",
+
+ $r1 = q("select hubloc_url, hubloc_updated, site_dead from hubloc left join site on
+ hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_primary = 1 limit 1",
dbesc($x['guid']),
dbesc($x['guid_sig'])
);
- if ($r) {
- logger('import_author_zot: in cache', LOGGER_DEBUG);
+ $r2 = q("select xchan_hash from xchan where xchan_guid = '%s' and xchan_guid_sig = '%s' limit 1",
+ dbesc($x['guid']),
+ dbesc($x['guid_sig'])
+ );
+
+ $site_dead = false;
+
+ if($r1 && intval($r1[0]['site_dead'])) {
+ $site_dead = true;
+ }
+
+ // We have valid and somewhat fresh information.
+
+ if($r1 && $r2 && $r1[0]['hubloc_updated'] > datetime_convert('UTC','UTC','now - 1 week')) {
+ logger('in cache', LOGGER_DEBUG);
return $hash;
}
- logger('import_author_zot: entry not in cache - probing: ' . print_r($x,true), LOGGER_DEBUG);
+ logger('not in cache or cache stale - probing: ' . print_r($x,true), LOGGER_DEBUG,LOG_INFO);
+
+ // The primary hub may be dead. Try to find another one associated with this identity that is
+ // still alive. If we find one, use that url for the discovery/refresh probe. Otherwise, the dead site
+ // is all we have and there is no point probing it. Just return the hash indicating we have a
+ // cached entry and the identity is valid. It's just unreachable until they bring back their
+ // server from the grave or create another clone elsewhere.
+
+ if($site_dead) {
+ logger('dead site - ignoring', LOGGER_DEBUG,LOG_INFO);
+
+ $r = q("select hubloc_url from hubloc left join site on hubloc_url = site_url
+ where hubloc_hash = '%s' and site_dead = 0",
+ dbesc($hash)
+ );
+ if($r) {
+ logger('found another site that is not dead: ' . $r[0]['hubloc_url'], LOGGER_DEBUG,LOG_INFO);
+ $x['url'] = $r[0]['hubloc_url'];
+ }
+ else {
+ return $hash;
+ }
+ }
$them = array('hubloc_url' => $x['url'], 'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
- if (zot_refresh($them))
+ if(zot_refresh($them))
return $hash;
return false;
diff --git a/install/update.php b/install/update.php
index 87cf4ba60..dd3a42c78 100644
--- a/install/update.php
+++ b/install/update.php
@@ -2508,4 +2508,5 @@ function update_r1187() {
return UPDATE_FAILED;
-} \ No newline at end of file
+}
+
diff --git a/library/HTMLPurifier.composer.php b/library/HTMLPurifier.composer.php
deleted file mode 100644
index 6706f4e39..000000000
--- a/library/HTMLPurifier.composer.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-if (!defined('HTMLPURIFIER_PREFIX')) {
- define('HTMLPURIFIER_PREFIX', __DIR__);
-}
diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php
deleted file mode 100644
index 9b7b88a87..000000000
--- a/library/HTMLPurifier.includes.php
+++ /dev/null
@@ -1,229 +0,0 @@
-<?php
-
-/**
- * @file
- * This file was auto-generated by generate-includes.php and includes all of
- * the core files required by HTML Purifier. Use this if performance is a
- * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
- * FILE, changes will be overwritten the next time the script is run.
- *
- * @version 4.6.0
- *
- * @warning
- * You must *not* include any other HTML Purifier files before this file,
- * because 'require' not 'require_once' is used.
- *
- * @warning
- * This file requires that the include path contains the HTML Purifier
- * library directory; this is not auto-set.
- */
-
-require 'HTMLPurifier.php';
-require 'HTMLPurifier/Arborize.php';
-require 'HTMLPurifier/AttrCollections.php';
-require 'HTMLPurifier/AttrDef.php';
-require 'HTMLPurifier/AttrTransform.php';
-require 'HTMLPurifier/AttrTypes.php';
-require 'HTMLPurifier/AttrValidator.php';
-require 'HTMLPurifier/Bootstrap.php';
-require 'HTMLPurifier/Definition.php';
-require 'HTMLPurifier/CSSDefinition.php';
-require 'HTMLPurifier/ChildDef.php';
-require 'HTMLPurifier/Config.php';
-require 'HTMLPurifier/ConfigSchema.php';
-require 'HTMLPurifier/ContentSets.php';
-require 'HTMLPurifier/Context.php';
-require 'HTMLPurifier/DefinitionCache.php';
-require 'HTMLPurifier/DefinitionCacheFactory.php';
-require 'HTMLPurifier/Doctype.php';
-require 'HTMLPurifier/DoctypeRegistry.php';
-require 'HTMLPurifier/ElementDef.php';
-require 'HTMLPurifier/Encoder.php';
-require 'HTMLPurifier/EntityLookup.php';
-require 'HTMLPurifier/EntityParser.php';
-require 'HTMLPurifier/ErrorCollector.php';
-require 'HTMLPurifier/ErrorStruct.php';
-require 'HTMLPurifier/Exception.php';
-require 'HTMLPurifier/Filter.php';
-require 'HTMLPurifier/Generator.php';
-require 'HTMLPurifier/HTMLDefinition.php';
-require 'HTMLPurifier/HTMLModule.php';
-require 'HTMLPurifier/HTMLModuleManager.php';
-require 'HTMLPurifier/IDAccumulator.php';
-require 'HTMLPurifier/Injector.php';
-require 'HTMLPurifier/Language.php';
-require 'HTMLPurifier/LanguageFactory.php';
-require 'HTMLPurifier/Length.php';
-require 'HTMLPurifier/Lexer.php';
-require 'HTMLPurifier/Node.php';
-require 'HTMLPurifier/PercentEncoder.php';
-require 'HTMLPurifier/PropertyList.php';
-require 'HTMLPurifier/PropertyListIterator.php';
-require 'HTMLPurifier/Queue.php';
-require 'HTMLPurifier/Strategy.php';
-require 'HTMLPurifier/StringHash.php';
-require 'HTMLPurifier/StringHashParser.php';
-require 'HTMLPurifier/TagTransform.php';
-require 'HTMLPurifier/Token.php';
-require 'HTMLPurifier/TokenFactory.php';
-require 'HTMLPurifier/URI.php';
-require 'HTMLPurifier/URIDefinition.php';
-require 'HTMLPurifier/URIFilter.php';
-require 'HTMLPurifier/URIParser.php';
-require 'HTMLPurifier/URIScheme.php';
-require 'HTMLPurifier/URISchemeRegistry.php';
-require 'HTMLPurifier/UnitConverter.php';
-require 'HTMLPurifier/VarParser.php';
-require 'HTMLPurifier/VarParserException.php';
-require 'HTMLPurifier/Zipper.php';
-require 'HTMLPurifier/AttrDef/CSS.php';
-require 'HTMLPurifier/AttrDef/Clone.php';
-require 'HTMLPurifier/AttrDef/Enum.php';
-require 'HTMLPurifier/AttrDef/Integer.php';
-require 'HTMLPurifier/AttrDef/Lang.php';
-require 'HTMLPurifier/AttrDef/Switch.php';
-require 'HTMLPurifier/AttrDef/Text.php';
-require 'HTMLPurifier/AttrDef/URI.php';
-require 'HTMLPurifier/AttrDef/CSS/Number.php';
-require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
-require 'HTMLPurifier/AttrDef/CSS/Background.php';
-require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
-require 'HTMLPurifier/AttrDef/CSS/Border.php';
-require 'HTMLPurifier/AttrDef/CSS/Color.php';
-require 'HTMLPurifier/AttrDef/CSS/Composite.php';
-require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
-require 'HTMLPurifier/AttrDef/CSS/Filter.php';
-require 'HTMLPurifier/AttrDef/CSS/Font.php';
-require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
-require 'HTMLPurifier/AttrDef/CSS/Ident.php';
-require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
-require 'HTMLPurifier/AttrDef/CSS/Length.php';
-require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
-require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
-require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
-require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
-require 'HTMLPurifier/AttrDef/CSS/URI.php';
-require 'HTMLPurifier/AttrDef/HTML/Bool.php';
-require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
-require 'HTMLPurifier/AttrDef/HTML/Class.php';
-require 'HTMLPurifier/AttrDef/HTML/Color.php';
-require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
-require 'HTMLPurifier/AttrDef/HTML/ID.php';
-require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
-require 'HTMLPurifier/AttrDef/HTML/Length.php';
-require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
-require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
-require 'HTMLPurifier/AttrDef/URI/Email.php';
-require 'HTMLPurifier/AttrDef/URI/Host.php';
-require 'HTMLPurifier/AttrDef/URI/IPv4.php';
-require 'HTMLPurifier/AttrDef/URI/IPv6.php';
-require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
-require 'HTMLPurifier/AttrTransform/Background.php';
-require 'HTMLPurifier/AttrTransform/BdoDir.php';
-require 'HTMLPurifier/AttrTransform/BgColor.php';
-require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
-require 'HTMLPurifier/AttrTransform/Border.php';
-require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
-require 'HTMLPurifier/AttrTransform/ImgRequired.php';
-require 'HTMLPurifier/AttrTransform/ImgSpace.php';
-require 'HTMLPurifier/AttrTransform/Input.php';
-require 'HTMLPurifier/AttrTransform/Lang.php';
-require 'HTMLPurifier/AttrTransform/Length.php';
-require 'HTMLPurifier/AttrTransform/Name.php';
-require 'HTMLPurifier/AttrTransform/NameSync.php';
-require 'HTMLPurifier/AttrTransform/Nofollow.php';
-require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
-require 'HTMLPurifier/AttrTransform/SafeObject.php';
-require 'HTMLPurifier/AttrTransform/SafeParam.php';
-require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
-require 'HTMLPurifier/AttrTransform/TargetBlank.php';
-require 'HTMLPurifier/AttrTransform/Textarea.php';
-require 'HTMLPurifier/ChildDef/Chameleon.php';
-require 'HTMLPurifier/ChildDef/Custom.php';
-require 'HTMLPurifier/ChildDef/Empty.php';
-require 'HTMLPurifier/ChildDef/List.php';
-require 'HTMLPurifier/ChildDef/Required.php';
-require 'HTMLPurifier/ChildDef/Optional.php';
-require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
-require 'HTMLPurifier/ChildDef/Table.php';
-require 'HTMLPurifier/DefinitionCache/Decorator.php';
-require 'HTMLPurifier/DefinitionCache/Null.php';
-require 'HTMLPurifier/DefinitionCache/Serializer.php';
-require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
-require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
-require 'HTMLPurifier/HTMLModule/Bdo.php';
-require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Edit.php';
-require 'HTMLPurifier/HTMLModule/Forms.php';
-require 'HTMLPurifier/HTMLModule/Hypertext.php';
-require 'HTMLPurifier/HTMLModule/Iframe.php';
-require 'HTMLPurifier/HTMLModule/Image.php';
-require 'HTMLPurifier/HTMLModule/Legacy.php';
-require 'HTMLPurifier/HTMLModule/List.php';
-require 'HTMLPurifier/HTMLModule/Name.php';
-require 'HTMLPurifier/HTMLModule/Nofollow.php';
-require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Object.php';
-require 'HTMLPurifier/HTMLModule/Presentation.php';
-require 'HTMLPurifier/HTMLModule/Proprietary.php';
-require 'HTMLPurifier/HTMLModule/Ruby.php';
-require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
-require 'HTMLPurifier/HTMLModule/SafeObject.php';
-require 'HTMLPurifier/HTMLModule/SafeScripting.php';
-require 'HTMLPurifier/HTMLModule/Scripting.php';
-require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
-require 'HTMLPurifier/HTMLModule/Tables.php';
-require 'HTMLPurifier/HTMLModule/Target.php';
-require 'HTMLPurifier/HTMLModule/TargetBlank.php';
-require 'HTMLPurifier/HTMLModule/Text.php';
-require 'HTMLPurifier/HTMLModule/Tidy.php';
-require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
-require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
-require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
-require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
-require 'HTMLPurifier/Injector/AutoParagraph.php';
-require 'HTMLPurifier/Injector/DisplayLinkURI.php';
-require 'HTMLPurifier/Injector/Linkify.php';
-require 'HTMLPurifier/Injector/PurifierLinkify.php';
-require 'HTMLPurifier/Injector/RemoveEmpty.php';
-require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
-require 'HTMLPurifier/Injector/SafeObject.php';
-require 'HTMLPurifier/Lexer/DOMLex.php';
-require 'HTMLPurifier/Lexer/DirectLex.php';
-require 'HTMLPurifier/Node/Comment.php';
-require 'HTMLPurifier/Node/Element.php';
-require 'HTMLPurifier/Node/Text.php';
-require 'HTMLPurifier/Strategy/Composite.php';
-require 'HTMLPurifier/Strategy/Core.php';
-require 'HTMLPurifier/Strategy/FixNesting.php';
-require 'HTMLPurifier/Strategy/MakeWellFormed.php';
-require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
-require 'HTMLPurifier/Strategy/ValidateAttributes.php';
-require 'HTMLPurifier/TagTransform/Font.php';
-require 'HTMLPurifier/TagTransform/Simple.php';
-require 'HTMLPurifier/Token/Comment.php';
-require 'HTMLPurifier/Token/Tag.php';
-require 'HTMLPurifier/Token/Empty.php';
-require 'HTMLPurifier/Token/End.php';
-require 'HTMLPurifier/Token/Start.php';
-require 'HTMLPurifier/Token/Text.php';
-require 'HTMLPurifier/URIFilter/DisableExternal.php';
-require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
-require 'HTMLPurifier/URIFilter/DisableResources.php';
-require 'HTMLPurifier/URIFilter/HostBlacklist.php';
-require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
-require 'HTMLPurifier/URIFilter/Munge.php';
-require 'HTMLPurifier/URIFilter/SafeIframe.php';
-require 'HTMLPurifier/URIScheme/data.php';
-require 'HTMLPurifier/URIScheme/file.php';
-require 'HTMLPurifier/URIScheme/ftp.php';
-require 'HTMLPurifier/URIScheme/http.php';
-require 'HTMLPurifier/URIScheme/https.php';
-require 'HTMLPurifier/URIScheme/mailto.php';
-require 'HTMLPurifier/URIScheme/news.php';
-require 'HTMLPurifier/URIScheme/nntp.php';
-require 'HTMLPurifier/VarParser/Flexible.php';
-require 'HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier.php b/library/HTMLPurifier.php
deleted file mode 100644
index 6f654fde5..000000000
--- a/library/HTMLPurifier.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php
-
-/*! @mainpage
- *
- * HTML Purifier is an HTML filter that will take an arbitrary snippet of
- * HTML and rigorously test, validate and filter it into a version that
- * is safe for output onto webpages. It achieves this by:
- *
- * -# Lexing (parsing into tokens) the document,
- * -# Executing various strategies on the tokens:
- * -# Removing all elements not in the whitelist,
- * -# Making the tokens well-formed,
- * -# Fixing the nesting of the nodes, and
- * -# Validating attributes of the nodes; and
- * -# Generating HTML from the purified tokens.
- *
- * However, most users will only need to interface with the HTMLPurifier
- * and HTMLPurifier_Config.
- */
-
-/*
- HTML Purifier 4.6.0 - Standards Compliant HTML Filtering
- Copyright (C) 2006-2008 Edward Z. Yang
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
- *
- * @note There are several points in which configuration can be specified
- * for HTML Purifier. The precedence of these (from lowest to
- * highest) is as follows:
- * -# Instance: new HTMLPurifier($config)
- * -# Invocation: purify($html, $config)
- * These configurations are entirely independent of each other and
- * are *not* merged (this behavior may change in the future).
- *
- * @todo We need an easier way to inject strategies using the configuration
- * object.
- */
-class HTMLPurifier
-{
-
- /**
- * Version of HTML Purifier.
- * @type string
- */
- public $version = '4.6.0';
-
- /**
- * Constant with version of HTML Purifier.
- */
- const VERSION = '4.6.0';
-
- /**
- * Global configuration object.
- * @type HTMLPurifier_Config
- */
- public $config;
-
- /**
- * Array of extra filter objects to run on HTML,
- * for backwards compatibility.
- * @type HTMLPurifier_Filter[]
- */
- private $filters = array();
-
- /**
- * Single instance of HTML Purifier.
- * @type HTMLPurifier
- */
- private static $instance;
-
- /**
- * @type HTMLPurifier_Strategy_Core
- */
- protected $strategy;
-
- /**
- * @type HTMLPurifier_Generator
- */
- protected $generator;
-
- /**
- * Resultant context of last run purification.
- * Is an array of contexts if the last called method was purifyArray().
- * @type HTMLPurifier_Context
- */
- public $context;
-
- /**
- * Initializes the purifier.
- *
- * @param HTMLPurifier_Config $config Optional HTMLPurifier_Config object
- * for all instances of the purifier, if omitted, a default
- * configuration is supplied (which can be overridden on a
- * per-use basis).
- * The parameter can also be any type that
- * HTMLPurifier_Config::create() supports.
- */
- public function __construct($config = null)
- {
- $this->config = HTMLPurifier_Config::create($config);
- $this->strategy = new HTMLPurifier_Strategy_Core();
- }
-
- /**
- * Adds a filter to process the output. First come first serve
- *
- * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
- */
- public function addFilter($filter)
- {
- trigger_error(
- 'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
- ' in the Filter namespace or Filter.Custom',
- E_USER_WARNING
- );
- $this->filters[] = $filter;
- }
-
- /**
- * Filters an HTML snippet/document to be XSS-free and standards-compliant.
- *
- * @param string $html String of HTML to purify
- * @param HTMLPurifier_Config $config Config object for this operation,
- * if omitted, defaults to the config object specified during this
- * object's construction. The parameter can also be any type
- * that HTMLPurifier_Config::create() supports.
- *
- * @return string Purified HTML
- */
- public function purify($html, $config = null)
- {
- // :TODO: make the config merge in, instead of replace
- $config = $config ? HTMLPurifier_Config::create($config) : $this->config;
-
- // implementation is partially environment dependant, partially
- // configuration dependant
- $lexer = HTMLPurifier_Lexer::create($config);
-
- $context = new HTMLPurifier_Context();
-
- // setup HTML generator
- $this->generator = new HTMLPurifier_Generator($config, $context);
- $context->register('Generator', $this->generator);
-
- // set up global context variables
- if ($config->get('Core.CollectErrors')) {
- // may get moved out if other facilities use it
- $language_factory = HTMLPurifier_LanguageFactory::instance();
- $language = $language_factory->create($config, $context);
- $context->register('Locale', $language);
-
- $error_collector = new HTMLPurifier_ErrorCollector($context);
- $context->register('ErrorCollector', $error_collector);
- }
-
- // setup id_accumulator context, necessary due to the fact that
- // AttrValidator can be called from many places
- $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
- $context->register('IDAccumulator', $id_accumulator);
-
- $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
-
- // setup filters
- $filter_flags = $config->getBatch('Filter');
- $custom_filters = $filter_flags['Custom'];
- unset($filter_flags['Custom']);
- $filters = array();
- foreach ($filter_flags as $filter => $flag) {
- if (!$flag) {
- continue;
- }
- if (strpos($filter, '.') !== false) {
- continue;
- }
- $class = "HTMLPurifier_Filter_$filter";
- $filters[] = new $class;
- }
- foreach ($custom_filters as $filter) {
- // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
- $filters[] = $filter;
- }
- $filters = array_merge($filters, $this->filters);
- // maybe prepare(), but later
-
- for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
- $html = $filters[$i]->preFilter($html, $config, $context);
- }
-
- // purified HTML
- $html =
- $this->generator->generateFromTokens(
- // list of tokens
- $this->strategy->execute(
- // list of un-purified tokens
- $lexer->tokenizeHTML(
- // un-purified HTML
- $html,
- $config,
- $context
- ),
- $config,
- $context
- )
- );
-
- for ($i = $filter_size - 1; $i >= 0; $i--) {
- $html = $filters[$i]->postFilter($html, $config, $context);
- }
-
- $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
- $this->context =& $context;
- return $html;
- }
-
- /**
- * Filters an array of HTML snippets
- *
- * @param string[] $array_of_html Array of html snippets
- * @param HTMLPurifier_Config $config Optional config object for this operation.
- * See HTMLPurifier::purify() for more details.
- *
- * @return string[] Array of purified HTML
- */
- public function purifyArray($array_of_html, $config = null)
- {
- $context_array = array();
- foreach ($array_of_html as $key => $html) {
- $array_of_html[$key] = $this->purify($html, $config);
- $context_array[$key] = $this->context;
- }
- $this->context = $context_array;
- return $array_of_html;
- }
-
- /**
- * Singleton for enforcing just one HTML Purifier in your system
- *
- * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
- * HTMLPurifier instance to overload singleton with,
- * or HTMLPurifier_Config instance to configure the
- * generated version with.
- *
- * @return HTMLPurifier
- */
- public static function instance($prototype = null)
- {
- if (!self::$instance || $prototype) {
- if ($prototype instanceof HTMLPurifier) {
- self::$instance = $prototype;
- } elseif ($prototype) {
- self::$instance = new HTMLPurifier($prototype);
- } else {
- self::$instance = new HTMLPurifier();
- }
- }
- return self::$instance;
- }
-
- /**
- * Singleton for enforcing just one HTML Purifier in your system
- *
- * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
- * HTMLPurifier instance to overload singleton with,
- * or HTMLPurifier_Config instance to configure the
- * generated version with.
- *
- * @return HTMLPurifier
- * @note Backwards compatibility, see instance()
- */
- public static function getInstance($prototype = null)
- {
- return HTMLPurifier::instance($prototype);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier.safe-includes.php b/library/HTMLPurifier.safe-includes.php
deleted file mode 100644
index 9dea6d1ed..000000000
--- a/library/HTMLPurifier.safe-includes.php
+++ /dev/null
@@ -1,223 +0,0 @@
-<?php
-
-/**
- * @file
- * This file was auto-generated by generate-includes.php and includes all of
- * the core files required by HTML Purifier. This is a convenience stub that
- * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
- * EDIT THIS FILE, changes will be overwritten the next time the script is run.
- *
- * Changes to include_path are not necessary.
- */
-
-$__dir = dirname(__FILE__);
-
-require_once $__dir . '/HTMLPurifier.php';
-require_once $__dir . '/HTMLPurifier/Arborize.php';
-require_once $__dir . '/HTMLPurifier/AttrCollections.php';
-require_once $__dir . '/HTMLPurifier/AttrDef.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform.php';
-require_once $__dir . '/HTMLPurifier/AttrTypes.php';
-require_once $__dir . '/HTMLPurifier/AttrValidator.php';
-require_once $__dir . '/HTMLPurifier/Bootstrap.php';
-require_once $__dir . '/HTMLPurifier/Definition.php';
-require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
-require_once $__dir . '/HTMLPurifier/ChildDef.php';
-require_once $__dir . '/HTMLPurifier/Config.php';
-require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
-require_once $__dir . '/HTMLPurifier/ContentSets.php';
-require_once $__dir . '/HTMLPurifier/Context.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
-require_once $__dir . '/HTMLPurifier/Doctype.php';
-require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
-require_once $__dir . '/HTMLPurifier/ElementDef.php';
-require_once $__dir . '/HTMLPurifier/Encoder.php';
-require_once $__dir . '/HTMLPurifier/EntityLookup.php';
-require_once $__dir . '/HTMLPurifier/EntityParser.php';
-require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
-require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
-require_once $__dir . '/HTMLPurifier/Exception.php';
-require_once $__dir . '/HTMLPurifier/Filter.php';
-require_once $__dir . '/HTMLPurifier/Generator.php';
-require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule.php';
-require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
-require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
-require_once $__dir . '/HTMLPurifier/Injector.php';
-require_once $__dir . '/HTMLPurifier/Language.php';
-require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
-require_once $__dir . '/HTMLPurifier/Length.php';
-require_once $__dir . '/HTMLPurifier/Lexer.php';
-require_once $__dir . '/HTMLPurifier/Node.php';
-require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
-require_once $__dir . '/HTMLPurifier/PropertyList.php';
-require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
-require_once $__dir . '/HTMLPurifier/Queue.php';
-require_once $__dir . '/HTMLPurifier/Strategy.php';
-require_once $__dir . '/HTMLPurifier/StringHash.php';
-require_once $__dir . '/HTMLPurifier/StringHashParser.php';
-require_once $__dir . '/HTMLPurifier/TagTransform.php';
-require_once $__dir . '/HTMLPurifier/Token.php';
-require_once $__dir . '/HTMLPurifier/TokenFactory.php';
-require_once $__dir . '/HTMLPurifier/URI.php';
-require_once $__dir . '/HTMLPurifier/URIDefinition.php';
-require_once $__dir . '/HTMLPurifier/URIFilter.php';
-require_once $__dir . '/HTMLPurifier/URIParser.php';
-require_once $__dir . '/HTMLPurifier/URIScheme.php';
-require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
-require_once $__dir . '/HTMLPurifier/UnitConverter.php';
-require_once $__dir . '/HTMLPurifier/VarParser.php';
-require_once $__dir . '/HTMLPurifier/VarParserException.php';
-require_once $__dir . '/HTMLPurifier/Zipper.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
-require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
-require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
-require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
-require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
-require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
-require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
-require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
-require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
-require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
-require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
-require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
-require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
-require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
-require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
-require_once $__dir . '/HTMLPurifier/Node/Comment.php';
-require_once $__dir . '/HTMLPurifier/Node/Element.php';
-require_once $__dir . '/HTMLPurifier/Node/Text.php';
-require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
-require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
-require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
-require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
-require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
-require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
-require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
-require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
-require_once $__dir . '/HTMLPurifier/Token/Comment.php';
-require_once $__dir . '/HTMLPurifier/Token/Tag.php';
-require_once $__dir . '/HTMLPurifier/Token/Empty.php';
-require_once $__dir . '/HTMLPurifier/Token/End.php';
-require_once $__dir . '/HTMLPurifier/Token/Start.php';
-require_once $__dir . '/HTMLPurifier/Token/Text.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
-require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
-require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
-require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
-require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier/Arborize.php b/library/HTMLPurifier/Arborize.php
deleted file mode 100644
index 9e6617be5..000000000
--- a/library/HTMLPurifier/Arborize.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
- * and back again.
- *
- * @note This transformation is not an equivalence. We mutate the input
- * token stream to make it so; see all [MUT] markers in code.
- */
-class HTMLPurifier_Arborize
-{
- public static function arborize($tokens, $config, $context) {
- $definition = $config->getHTMLDefinition();
- $parent = new HTMLPurifier_Token_Start($definition->info_parent);
- $stack = array($parent->toNode());
- foreach ($tokens as $token) {
- $token->skip = null; // [MUT]
- $token->carryover = null; // [MUT]
- if ($token instanceof HTMLPurifier_Token_End) {
- $token->start = null; // [MUT]
- $r = array_pop($stack);
- assert($r->name === $token->name);
- assert(empty($token->attr));
- $r->endCol = $token->col;
- $r->endLine = $token->line;
- $r->endArmor = $token->armor;
- continue;
- }
- $node = $token->toNode();
- $stack[count($stack)-1]->children[] = $node;
- if ($token instanceof HTMLPurifier_Token_Start) {
- $stack[] = $node;
- }
- }
- assert(count($stack) == 1);
- return $stack[0];
- }
-
- public static function flatten($node, $config, $context) {
- $level = 0;
- $nodes = array($level => new HTMLPurifier_Queue(array($node)));
- $closingTokens = array();
- $tokens = array();
- do {
- while (!$nodes[$level]->isEmpty()) {
- $node = $nodes[$level]->shift(); // FIFO
- list($start, $end) = $node->toTokenPair();
- if ($level > 0) {
- $tokens[] = $start;
- }
- if ($end !== NULL) {
- $closingTokens[$level][] = $end;
- }
- if ($node instanceof HTMLPurifier_Node_Element) {
- $level++;
- $nodes[$level] = new HTMLPurifier_Queue();
- foreach ($node->children as $childNode) {
- $nodes[$level]->push($childNode);
- }
- }
- }
- $level--;
- if ($level && isset($closingTokens[$level])) {
- while ($token = array_pop($closingTokens[$level])) {
- $tokens[] = $token;
- }
- }
- } while ($level > 0);
- return $tokens;
- }
-}
diff --git a/library/HTMLPurifier/AttrCollections.php b/library/HTMLPurifier/AttrCollections.php
deleted file mode 100644
index 4f6c2e39a..000000000
--- a/library/HTMLPurifier/AttrCollections.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-/**
- * Defines common attribute collections that modules reference
- */
-
-class HTMLPurifier_AttrCollections
-{
-
- /**
- * Associative array of attribute collections, indexed by name.
- * @type array
- */
- public $info = array();
-
- /**
- * Performs all expansions on internal data for use by other inclusions
- * It also collects all attribute collection extensions from
- * modules
- * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
- * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
- */
- public function __construct($attr_types, $modules)
- {
- // load extensions from the modules
- foreach ($modules as $module) {
- foreach ($module->attr_collections as $coll_i => $coll) {
- if (!isset($this->info[$coll_i])) {
- $this->info[$coll_i] = array();
- }
- foreach ($coll as $attr_i => $attr) {
- if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
- // merge in includes
- $this->info[$coll_i][$attr_i] = array_merge(
- $this->info[$coll_i][$attr_i],
- $attr
- );
- continue;
- }
- $this->info[$coll_i][$attr_i] = $attr;
- }
- }
- }
- // perform internal expansions and inclusions
- foreach ($this->info as $name => $attr) {
- // merge attribute collections that include others
- $this->performInclusions($this->info[$name]);
- // replace string identifiers with actual attribute objects
- $this->expandIdentifiers($this->info[$name], $attr_types);
- }
- }
-
- /**
- * Takes a reference to an attribute associative array and performs
- * all inclusions specified by the zero index.
- * @param array &$attr Reference to attribute array
- */
- public function performInclusions(&$attr)
- {
- if (!isset($attr[0])) {
- return;
- }
- $merge = $attr[0];
- $seen = array(); // recursion guard
- // loop through all the inclusions
- for ($i = 0; isset($merge[$i]); $i++) {
- if (isset($seen[$merge[$i]])) {
- continue;
- }
- $seen[$merge[$i]] = true;
- // foreach attribute of the inclusion, copy it over
- if (!isset($this->info[$merge[$i]])) {
- continue;
- }
- foreach ($this->info[$merge[$i]] as $key => $value) {
- if (isset($attr[$key])) {
- continue;
- } // also catches more inclusions
- $attr[$key] = $value;
- }
- if (isset($this->info[$merge[$i]][0])) {
- // recursion
- $merge = array_merge($merge, $this->info[$merge[$i]][0]);
- }
- }
- unset($attr[0]);
- }
-
- /**
- * Expands all string identifiers in an attribute array by replacing
- * them with the appropriate values inside HTMLPurifier_AttrTypes
- * @param array &$attr Reference to attribute array
- * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
- */
- public function expandIdentifiers(&$attr, $attr_types)
- {
- // because foreach will process new elements we add, make sure we
- // skip duplicates
- $processed = array();
-
- foreach ($attr as $def_i => $def) {
- // skip inclusions
- if ($def_i === 0) {
- continue;
- }
-
- if (isset($processed[$def_i])) {
- continue;
- }
-
- // determine whether or not attribute is required
- if ($required = (strpos($def_i, '*') !== false)) {
- // rename the definition
- unset($attr[$def_i]);
- $def_i = trim($def_i, '*');
- $attr[$def_i] = $def;
- }
-
- $processed[$def_i] = true;
-
- // if we've already got a literal object, move on
- if (is_object($def)) {
- // preserve previous required
- $attr[$def_i]->required = ($required || $attr[$def_i]->required);
- continue;
- }
-
- if ($def === false) {
- unset($attr[$def_i]);
- continue;
- }
-
- if ($t = $attr_types->get($def)) {
- $attr[$def_i] = $t;
- $attr[$def_i]->required = $required;
- } else {
- unset($attr[$def_i]);
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef.php b/library/HTMLPurifier/AttrDef.php
deleted file mode 100644
index 5ac06522b..000000000
--- a/library/HTMLPurifier/AttrDef.php
+++ /dev/null
@@ -1,138 +0,0 @@
-<?php
-
-/**
- * Base class for all validating attribute definitions.
- *
- * This family of classes forms the core for not only HTML attribute validation,
- * but also any sort of string that needs to be validated or cleaned (which
- * means CSS properties and composite definitions are defined here too).
- * Besides defining (through code) what precisely makes the string valid,
- * subclasses are also responsible for cleaning the code if possible.
- */
-
-abstract class HTMLPurifier_AttrDef
-{
-
- /**
- * Tells us whether or not an HTML attribute is minimized.
- * Has no meaning in other contexts.
- * @type bool
- */
- public $minimized = false;
-
- /**
- * Tells us whether or not an HTML attribute is required.
- * Has no meaning in other contexts
- * @type bool
- */
- public $required = false;
-
- /**
- * Validates and cleans passed string according to a definition.
- *
- * @param string $string String to be validated and cleaned.
- * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
- * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
- */
- abstract public function validate($string, $config, $context);
-
- /**
- * Convenience method that parses a string as if it were CDATA.
- *
- * This method process a string in the manner specified at
- * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
- * leading and trailing whitespace, ignoring line feeds, and replacing
- * carriage returns and tabs with spaces. While most useful for HTML
- * attributes specified as CDATA, it can also be applied to most CSS
- * values.
- *
- * @note This method is not entirely standards compliant, as trim() removes
- * more types of whitespace than specified in the spec. In practice,
- * this is rarely a problem, as those extra characters usually have
- * already been removed by HTMLPurifier_Encoder.
- *
- * @warning This processing is inconsistent with XML's whitespace handling
- * as specified by section 3.3.3 and referenced XHTML 1.0 section
- * 4.7. However, note that we are NOT necessarily
- * parsing XML, thus, this behavior may still be correct. We
- * assume that newlines have been normalized.
- */
- public function parseCDATA($string)
- {
- $string = trim($string);
- $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
- return $string;
- }
-
- /**
- * Factory method for creating this class from a string.
- * @param string $string String construction info
- * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
- */
- public function make($string)
- {
- // default implementation, return a flyweight of this object.
- // If $string has an effect on the returned object (i.e. you
- // need to overload this method), it is best
- // to clone or instantiate new copies. (Instantiation is safer.)
- return $this;
- }
-
- /**
- * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
- * properly. THIS IS A HACK!
- * @param string $string a CSS colour definition
- * @return string
- */
- protected function mungeRgb($string)
- {
- return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string);
- }
-
- /**
- * Parses a possibly escaped CSS string and returns the "pure"
- * version of it.
- */
- protected function expandCSSEscape($string)
- {
- // flexibly parse it
- $ret = '';
- for ($i = 0, $c = strlen($string); $i < $c; $i++) {
- if ($string[$i] === '\\') {
- $i++;
- if ($i >= $c) {
- $ret .= '\\';
- break;
- }
- if (ctype_xdigit($string[$i])) {
- $code = $string[$i];
- for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
- if (!ctype_xdigit($string[$i])) {
- break;
- }
- $code .= $string[$i];
- }
- // We have to be extremely careful when adding
- // new characters, to make sure we're not breaking
- // the encoding.
- $char = HTMLPurifier_Encoder::unichr(hexdec($code));
- if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
- continue;
- }
- $ret .= $char;
- if ($i < $c && trim($string[$i]) !== '') {
- $i--;
- }
- continue;
- }
- if ($string[$i] === "\n") {
- continue;
- }
- }
- $ret .= $string[$i];
- }
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS.php b/library/HTMLPurifier/AttrDef/CSS.php
deleted file mode 100644
index 02c1641fb..000000000
--- a/library/HTMLPurifier/AttrDef/CSS.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-/**
- * Validates the HTML attribute style, otherwise known as CSS.
- * @note We don't implement the whole CSS specification, so it might be
- * difficult to reuse this component in the context of validating
- * actual stylesheet declarations.
- * @note If we were really serious about validating the CSS, we would
- * tokenize the styles and then parse the tokens. Obviously, we
- * are not doing that. Doing that could seriously harm performance,
- * but would make these components a lot more viable for a CSS
- * filtering solution.
- */
-class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
-{
-
- /**
- * @param string $css
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($css, $config, $context)
- {
- $css = $this->parseCDATA($css);
-
- $definition = $config->getCSSDefinition();
-
- // we're going to break the spec and explode by semicolons.
- // This is because semicolon rarely appears in escaped form
- // Doing this is generally flaky but fast
- // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI
- // for details
-
- $declarations = explode(';', $css);
- $propvalues = array();
-
- /**
- * Name of the current CSS property being validated.
- */
- $property = false;
- $context->register('CurrentCSSProperty', $property);
-
- foreach ($declarations as $declaration) {
- if (!$declaration) {
- continue;
- }
- if (!strpos($declaration, ':')) {
- continue;
- }
- list($property, $value) = explode(':', $declaration, 2);
- $property = trim($property);
- $value = trim($value);
- $ok = false;
- do {
- if (isset($definition->info[$property])) {
- $ok = true;
- break;
- }
- if (ctype_lower($property)) {
- break;
- }
- $property = strtolower($property);
- if (isset($definition->info[$property])) {
- $ok = true;
- break;
- }
- } while (0);
- if (!$ok) {
- continue;
- }
- // inefficient call, since the validator will do this again
- if (strtolower(trim($value)) !== 'inherit') {
- // inherit works for everything (but only on the base property)
- $result = $definition->info[$property]->validate(
- $value,
- $config,
- $context
- );
- } else {
- $result = 'inherit';
- }
- if ($result === false) {
- continue;
- }
- $propvalues[$property] = $result;
- }
-
- $context->destroy('CurrentCSSProperty');
-
- // procedure does not write the new CSS simultaneously, so it's
- // slightly inefficient, but it's the only way of getting rid of
- // duplicates. Perhaps config to optimize it, but not now.
-
- $new_declarations = '';
- foreach ($propvalues as $prop => $value) {
- $new_declarations .= "$prop:$value;";
- }
-
- return $new_declarations ? $new_declarations : false;
-
- }
-
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Color.php b/library/HTMLPurifier/AttrDef/CSS/Color.php
deleted file mode 100644
index 16d2a6b98..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/Color.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * Validates Color as defined by CSS.
- */
-class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
-{
-
- /**
- * @param string $color
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($color, $config, $context)
- {
- static $colors = null;
- if ($colors === null) {
- $colors = $config->get('Core.ColorKeywords');
- }
-
- $color = trim($color);
- if ($color === '') {
- return false;
- }
-
- $lower = strtolower($color);
- if (isset($colors[$lower])) {
- return $colors[$lower];
- }
-
- if (strpos($color, 'rgb(') !== false) {
- // rgb literal handling
- $length = strlen($color);
- if (strpos($color, ')') !== $length - 1) {
- return false;
- }
- $triad = substr($color, 4, $length - 4 - 1);
- $parts = explode(',', $triad);
- if (count($parts) !== 3) {
- return false;
- }
- $type = false; // to ensure that they're all the same type
- $new_parts = array();
- foreach ($parts as $part) {
- $part = trim($part);
- if ($part === '') {
- return false;
- }
- $length = strlen($part);
- if ($part[$length - 1] === '%') {
- // handle percents
- if (!$type) {
- $type = 'percentage';
- } elseif ($type !== 'percentage') {
- return false;
- }
- $num = (float)substr($part, 0, $length - 1);
- if ($num < 0) {
- $num = 0;
- }
- if ($num > 100) {
- $num = 100;
- }
- $new_parts[] = "$num%";
- } else {
- // handle integers
- if (!$type) {
- $type = 'integer';
- } elseif ($type !== 'integer') {
- return false;
- }
- $num = (int)$part;
- if ($num < 0) {
- $num = 0;
- }
- if ($num > 255) {
- $num = 255;
- }
- $new_parts[] = (string)$num;
- }
- }
- $new_triad = implode(',', $new_parts);
- $color = "rgb($new_triad)";
- } else {
- // hexadecimal handling
- if ($color[0] === '#') {
- $hex = substr($color, 1);
- } else {
- $hex = $color;
- $color = '#' . $color;
- }
- $length = strlen($hex);
- if ($length !== 3 && $length !== 6) {
- return false;
- }
- if (!ctype_xdigit($hex)) {
- return false;
- }
- }
- return $color;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/library/HTMLPurifier/AttrDef/CSS/Multiple.php
deleted file mode 100644
index 9f266cdd1..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/Multiple.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-
-/**
- * Framework class for strings that involve multiple values.
- *
- * Certain CSS properties such as border-width and margin allow multiple
- * lengths to be specified. This class can take a vanilla border-width
- * definition and multiply it, usually into a max of four.
- *
- * @note Even though the CSS specification isn't clear about it, inherit
- * can only be used alone: it will never manifest as part of a multi
- * shorthand declaration. Thus, this class does not allow inherit.
- */
-class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
-{
- /**
- * Instance of component definition to defer validation to.
- * @type HTMLPurifier_AttrDef
- * @todo Make protected
- */
- public $single;
-
- /**
- * Max number of values allowed.
- * @todo Make protected
- */
- public $max;
-
- /**
- * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
- * @param int $max Max number of values allowed (usually four)
- */
- public function __construct($single, $max = 4)
- {
- $this->single = $single;
- $this->max = $max;
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- $string = $this->parseCDATA($string);
- if ($string === '') {
- return false;
- }
- $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
- $length = count($parts);
- $final = '';
- for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
- if (ctype_space($parts[$i])) {
- continue;
- }
- $result = $this->single->validate($parts[$i], $config, $context);
- if ($result !== false) {
- $final .= $result . ' ';
- $num++;
- }
- }
- if ($final === '') {
- return false;
- }
- return rtrim($final);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/URI.php b/library/HTMLPurifier/AttrDef/CSS/URI.php
deleted file mode 100644
index f9434230e..000000000
--- a/library/HTMLPurifier/AttrDef/CSS/URI.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/**
- * Validates a URI in CSS syntax, which uses url('http://example.com')
- * @note While theoretically speaking a URI in a CSS document could
- * be non-embedded, as of CSS2 there is no such usage so we're
- * generalizing it. This may need to be changed in the future.
- * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
- * the separator, you cannot put a literal semicolon in
- * in the URI. Try percent encoding it, in that case.
- */
-class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
-{
-
- public function __construct()
- {
- parent::__construct(true); // always embedded
- }
-
- /**
- * @param string $uri_string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($uri_string, $config, $context)
- {
- // parse the URI out of the string and then pass it onto
- // the parent object
-
- $uri_string = $this->parseCDATA($uri_string);
- if (strpos($uri_string, 'url(') !== 0) {
- return false;
- }
- $uri_string = substr($uri_string, 4);
- $new_length = strlen($uri_string) - 1;
- if ($uri_string[$new_length] != ')') {
- return false;
- }
- $uri = trim(substr($uri_string, 0, $new_length));
-
- if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
- $quote = $uri[0];
- $new_length = strlen($uri) - 1;
- if ($uri[$new_length] !== $quote) {
- return false;
- }
- $uri = substr($uri, 1, $new_length - 1);
- }
-
- $uri = $this->expandCSSEscape($uri);
-
- $result = parent::validate($uri, $config, $context);
-
- if ($result === false) {
- return false;
- }
-
- // extra sanity check; should have been done by URI
- $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);
-
- // suspicious characters are ()'; we're going to percent encode
- // them for safety.
- $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);
-
- // there's an extra bug where ampersands lose their escaping on
- // an innerHTML cycle, so a very unlucky query parameter could
- // then change the meaning of the URL. Unfortunately, there's
- // not much we can do about that...
- return "url(\"$result\")";
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Bool.php b/library/HTMLPurifier/AttrDef/HTML/Bool.php
deleted file mode 100644
index 036a240e1..000000000
--- a/library/HTMLPurifier/AttrDef/HTML/Bool.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/**
- * Validates a boolean attribute
- */
-class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
-{
-
- /**
- * @type bool
- */
- protected $name;
-
- /**
- * @type bool
- */
- public $minimized = true;
-
- /**
- * @param bool $name
- */
- public function __construct($name = false)
- {
- $this->name = $name;
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- if (empty($string)) {
- return false;
- }
- return $this->name;
- }
-
- /**
- * @param string $string Name of attribute
- * @return HTMLPurifier_AttrDef_HTML_Bool
- */
- public function make($string)
- {
- return new HTMLPurifier_AttrDef_HTML_Bool($string);
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/ID.php b/library/HTMLPurifier/AttrDef/HTML/ID.php
deleted file mode 100644
index 3d86efb44..000000000
--- a/library/HTMLPurifier/AttrDef/HTML/ID.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-/**
- * Validates the HTML attribute ID.
- * @warning Even though this is the id processor, it
- * will ignore the directive Attr:IDBlacklist, since it will only
- * go according to the ID accumulator. Since the accumulator is
- * automatically generated, it will have already absorbed the
- * blacklist. If you're hacking around, make sure you use load()!
- */
-
-class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
-{
-
- // selector is NOT a valid thing to use for IDREFs, because IDREFs
- // *must* target IDs that exist, whereas selector #ids do not.
-
- /**
- * Determines whether or not we're validating an ID in a CSS
- * selector context.
- * @type bool
- */
- protected $selector;
-
- /**
- * @param bool $selector
- */
- public function __construct($selector = false)
- {
- $this->selector = $selector;
- }
-
- /**
- * @param string $id
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($id, $config, $context)
- {
- if (!$this->selector && !$config->get('Attr.EnableID')) {
- return false;
- }
-
- $id = trim($id); // trim it first
-
- if ($id === '') {
- return false;
- }
-
- $prefix = $config->get('Attr.IDPrefix');
- if ($prefix !== '') {
- $prefix .= $config->get('Attr.IDPrefixLocal');
- // prevent re-appending the prefix
- if (strpos($id, $prefix) !== 0) {
- $id = $prefix . $id;
- }
- } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
- trigger_error(
- '%Attr.IDPrefixLocal cannot be used unless ' .
- '%Attr.IDPrefix is set',
- E_USER_WARNING
- );
- }
-
- if (!$this->selector) {
- $id_accumulator =& $context->get('IDAccumulator');
- if (isset($id_accumulator->ids[$id])) {
- return false;
- }
- }
-
- // we purposely avoid using regex, hopefully this is faster
-
- if (ctype_alpha($id)) {
- $result = true;
- } else {
- if (!ctype_alpha(@$id[0])) {
- return false;
- }
- // primitive style of regexps, I suppose
- $trim = trim(
- $id,
- 'A..Za..z0..9:-._'
- );
- $result = ($trim === '');
- }
-
- $regexp = $config->get('Attr.IDBlacklistRegexp');
- if ($regexp && preg_match($regexp, $id)) {
- return false;
- }
-
- if (!$this->selector && $result) {
- $id_accumulator->add($id);
- }
-
- // if no change was made to the ID, return the result
- // else, return the new id if stripping whitespace made it
- // valid, or return false.
- return $result ? $id : false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/URI/Host.php b/library/HTMLPurifier/AttrDef/URI/Host.php
deleted file mode 100644
index e7df800b1..000000000
--- a/library/HTMLPurifier/AttrDef/URI/Host.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-
-/**
- * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
- */
-class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
-{
-
- /**
- * IPv4 sub-validator.
- * @type HTMLPurifier_AttrDef_URI_IPv4
- */
- protected $ipv4;
-
- /**
- * IPv6 sub-validator.
- * @type HTMLPurifier_AttrDef_URI_IPv6
- */
- protected $ipv6;
-
- public function __construct()
- {
- $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
- $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
- }
-
- /**
- * @param string $string
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool|string
- */
- public function validate($string, $config, $context)
- {
- $length = strlen($string);
- // empty hostname is OK; it's usually semantically equivalent:
- // the default host as defined by a URI scheme is used:
- //
- // If the URI scheme defines a default for host, then that
- // default applies when the host subcomponent is undefined
- // or when the registered name is empty (zero length).
- if ($string === '') {
- return '';
- }
- if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
- //IPv6
- $ip = substr($string, 1, $length - 2);
- $valid = $this->ipv6->validate($ip, $config, $context);
- if ($valid === false) {
- return false;
- }
- return '[' . $valid . ']';
- }
-
- // need to do checks on unusual encodings too
- $ipv4 = $this->ipv4->validate($string, $config, $context);
- if ($ipv4 !== false) {
- return $ipv4;
- }
-
- // A regular domain name.
-
- // This doesn't match I18N domain names, but we don't have proper IRI support,
- // so force users to insert Punycode.
-
- // There is not a good sense in which underscores should be
- // allowed, since it's technically not! (And if you go as
- // far to allow everything as specified by the DNS spec...
- // well, that's literally everything, modulo some space limits
- // for the components and the overall name (which, by the way,
- // we are NOT checking!). So we (arbitrarily) decide this:
- // let's allow underscores wherever we would have allowed
- // hyphens, if they are enabled. This is a pretty good match
- // for browser behavior, for example, a large number of browsers
- // cannot handle foo_.example.com, but foo_bar.example.com is
- // fairly well supported.
- $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
-
- // The productions describing this are:
- $a = '[a-z]'; // alpha
- $an = '[a-z0-9]'; // alphanum
- $and = "[a-z0-9-$underscore]"; // alphanum | "-"
- // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
- $domainlabel = "$an($and*$an)?";
- // toplabel = alpha | alpha *( alphanum | "-" ) alphanum
- $toplabel = "$a($and*$an)?";
- // hostname = *( domainlabel "." ) toplabel [ "." ]
- if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
- return $string;
- }
-
- // If we have Net_IDNA2 support, we can support IRIs by
- // punycoding them. (This is the most portable thing to do,
- // since otherwise we have to assume browsers support
-
- if ($config->get('Core.EnableIDNA')) {
- $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
- // we need to encode each period separately
- $parts = explode('.', $string);
- try {
- $new_parts = array();
- foreach ($parts as $part) {
- $encodable = false;
- for ($i = 0, $c = strlen($part); $i < $c; $i++) {
- if (ord($part[$i]) > 0x7a) {
- $encodable = true;
- break;
- }
- }
- if (!$encodable) {
- $new_parts[] = $part;
- } else {
- $new_parts[] = $idna->encode($part);
- }
- }
- $string = implode('.', $new_parts);
- if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
- return $string;
- }
- } catch (Exception $e) {
- // XXX error reporting
- }
- }
- return false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrTransform/ImgRequired.php b/library/HTMLPurifier/AttrTransform/ImgRequired.php
deleted file mode 100644
index 7df6cb3e1..000000000
--- a/library/HTMLPurifier/AttrTransform/ImgRequired.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-// must be called POST validation
-
-/**
- * Transform that supplies default values for the src and alt attributes
- * in img tags, as well as prevents the img tag from being removed
- * because of a missing alt tag. This needs to be registered as both
- * a pre and post attribute transform.
- */
-class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
-{
-
- /**
- * @param array $attr
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function transform($attr, $config, $context)
- {
- $src = true;
- if (!isset($attr['src'])) {
- if ($config->get('Core.RemoveInvalidImg')) {
- return $attr;
- }
- $attr['src'] = $config->get('Attr.DefaultInvalidImage');
- $src = false;
- }
-
- if (!isset($attr['alt'])) {
- if ($src) {
- $alt = $config->get('Attr.DefaultImageAlt');
- if ($alt === null) {
- // truncate if the alt is too long
- $attr['alt'] = substr(basename($attr['src']), 0, 40);
- } else {
- $attr['alt'] = $alt;
- }
- } else {
- $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
- }
- }
- return $attr;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/CSSDefinition.php b/library/HTMLPurifier/CSSDefinition.php
deleted file mode 100644
index 0acdee2d9..000000000
--- a/library/HTMLPurifier/CSSDefinition.php
+++ /dev/null
@@ -1,474 +0,0 @@
-<?php
-
-/**
- * Defines allowed CSS attributes and what their values are.
- * @see HTMLPurifier_HTMLDefinition
- */
-class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
-{
-
- public $type = 'CSS';
-
- /**
- * Assoc array of attribute name to definition object.
- * @type HTMLPurifier_AttrDef[]
- */
- public $info = array();
-
- /**
- * Constructs the info array. The meat of this class.
- * @param HTMLPurifier_Config $config
- */
- protected function doSetup($config)
- {
- $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
- array('left', 'right', 'center', 'justify'),
- false
- );
-
- $border_style =
- $this->info['border-bottom-style'] =
- $this->info['border-right-style'] =
- $this->info['border-left-style'] =
- $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'none',
- 'hidden',
- 'dotted',
- 'dashed',
- 'solid',
- 'double',
- 'groove',
- 'ridge',
- 'inset',
- 'outset'
- ),
- false
- );
-
- $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
-
- $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
- array('none', 'left', 'right', 'both'),
- false
- );
- $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
- array('none', 'left', 'right'),
- false
- );
- $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
- array('normal', 'italic', 'oblique'),
- false
- );
- $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
- array('normal', 'small-caps'),
- false
- );
-
- $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('none')),
- new HTMLPurifier_AttrDef_CSS_URI()
- )
- );
-
- $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
- array('inside', 'outside'),
- false
- );
- $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'disc',
- 'circle',
- 'square',
- 'decimal',
- 'lower-roman',
- 'upper-roman',
- 'lower-alpha',
- 'upper-alpha',
- 'none'
- ),
- false
- );
- $this->info['list-style-image'] = $uri_or_none;
-
- $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
-
- $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
- array('capitalize', 'uppercase', 'lowercase', 'none'),
- false
- );
- $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
-
- $this->info['background-image'] = $uri_or_none;
- $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
- array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
- );
- $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
- array('scroll', 'fixed')
- );
- $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
-
- $border_color =
- $this->info['border-top-color'] =
- $this->info['border-bottom-color'] =
- $this->info['border-left-color'] =
- $this->info['border-right-color'] =
- $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('transparent')),
- new HTMLPurifier_AttrDef_CSS_Color()
- )
- );
-
- $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
-
- $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
-
- $border_width =
- $this->info['border-top-width'] =
- $this->info['border-bottom-width'] =
- $this->info['border-left-width'] =
- $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
- new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
- )
- );
-
- $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
-
- $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(
- array(
- 'xx-small',
- 'x-small',
- 'small',
- 'medium',
- 'large',
- 'x-large',
- 'xx-large',
- 'larger',
- 'smaller'
- )
- ),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_CSS_Length()
- )
- );
-
- $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(array('normal')),
- new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true)
- )
- );
-
- $margin =
- $this->info['margin-top'] =
- $this->info['margin-bottom'] =
- $this->info['margin-left'] =
- $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- );
-
- $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
-
- // non-negative
- $padding =
- $this->info['padding-top'] =
- $this->info['padding-bottom'] =
- $this->info['padding-left'] =
- $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true)
- )
- );
-
- $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
-
- $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage()
- )
- );
-
- $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0'),
- new HTMLPurifier_AttrDef_CSS_Percentage(true),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- );
- $max = $config->get('CSS.MaxImgLength');
-
- $this->info['width'] =
- $this->info['height'] =
- $max === null ?
- $trusted_wh :
- new HTMLPurifier_AttrDef_Switch(
- 'img',
- // For img tags:
- new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length('0', $max),
- new HTMLPurifier_AttrDef_Enum(array('auto'))
- )
- ),
- // For everyone else:
- $trusted_wh
- );
-
- $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
-
- $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
-
- // this could use specialized code
- $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'normal',
- 'bold',
- 'bolder',
- 'lighter',
- '100',
- '200',
- '300',
- '400',
- '500',
- '600',
- '700',
- '800',
- '900'
- ),
- false
- );
-
- // MUST be called after other font properties, as it references
- // a CSSDefinition object
- $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);
-
- // same here
- $this->info['border'] =
- $this->info['border-bottom'] =
- $this->info['border-top'] =
- $this->info['border-left'] =
- $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
-
- $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
- array('collapse', 'separate')
- );
-
- $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
- array('top', 'bottom')
- );
-
- $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
- array('auto', 'fixed')
- );
-
- $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Enum(
- array(
- 'baseline',
- 'sub',
- 'super',
- 'top',
- 'text-top',
- 'middle',
- 'bottom',
- 'text-bottom'
- )
- ),
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage()
- )
- );
-
- $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
-
- // These CSS properties don't work on many browsers, but we live
- // in THE FUTURE!
- $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
- array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
- );
-
- if ($config->get('CSS.Proprietary')) {
- $this->doSetupProprietary($config);
- }
-
- if ($config->get('CSS.AllowTricky')) {
- $this->doSetupTricky($config);
- }
-
- if ($config->get('CSS.Trusted')) {
- $this->doSetupTrusted($config);
- }
-
- $allow_important = $config->get('CSS.AllowImportant');
- // wrap all attr-defs with decorator that handles !important
- foreach ($this->info as $k => $v) {
- $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
- }
-
- $this->setupConfigStuff($config);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupProprietary($config)
- {
- // Internet Explorer only scrollbar colors
- $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
- $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-
- // technically not proprietary, but CSS3, and no one supports it
- $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
- $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
- $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
-
- // only opacity, for now
- $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
-
- // more CSS3
- $this->info['page-break-after'] =
- $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'auto',
- 'always',
- 'avoid',
- 'left',
- 'right'
- )
- );
- $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
-
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupTricky($config)
- {
- $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
- array(
- 'inline',
- 'block',
- 'list-item',
- 'run-in',
- 'compact',
- 'marker',
- 'table',
- 'inline-block',
- 'inline-table',
- 'table-row-group',
- 'table-header-group',
- 'table-footer-group',
- 'table-row',
- 'table-column-group',
- 'table-column',
- 'table-cell',
- 'table-caption',
- 'none'
- )
- );
- $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
- array('visible', 'hidden', 'collapse')
- );
- $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
- }
-
- /**
- * @param HTMLPurifier_Config $config
- */
- protected function doSetupTrusted($config)
- {
- $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
- array('static', 'relative', 'absolute', 'fixed')
- );
- $this->info['top'] =
- $this->info['left'] =
- $this->info['right'] =
- $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_CSS_Length(),
- new HTMLPurifier_AttrDef_CSS_Percentage(),
- new HTMLPurifier_AttrDef_Enum(array('auto')),
- )
- );
- $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
- array(
- new HTMLPurifier_AttrDef_Integer(),
- new HTMLPurifier_AttrDef_Enum(array('auto')),
- )
- );
- }
-
- /**
- * Performs extra config-based processing. Based off of
- * HTMLPurifier_HTMLDefinition.
- * @param HTMLPurifier_Config $config
- * @todo Refactor duplicate elements into common class (probably using
- * composition, not inheritance).
- */
- protected function setupConfigStuff($config)
- {
- // setup allowed elements
- $support = "(for information on implementing this, see the " .
- "support forums) ";
- $allowed_properties = $config->get('CSS.AllowedProperties');
- if ($allowed_properties !== null) {
- foreach ($this->info as $name => $d) {
- if (!isset($allowed_properties[$name])) {
- unset($this->info[$name]);
- }
- unset($allowed_properties[$name]);
- }
- // emit errors
- foreach ($allowed_properties as $name => $d) {
- // :TODO: Is this htmlspecialchars() call really necessary?
- $name = htmlspecialchars($name);
- trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
- }
- }
-
- $forbidden_properties = $config->get('CSS.ForbiddenProperties');
- if ($forbidden_properties !== null) {
- foreach ($this->info as $name => $d) {
- if (isset($forbidden_properties[$name])) {
- unset($this->info[$name]);
- }
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/List.php b/library/HTMLPurifier/ChildDef/List.php
deleted file mode 100644
index 891b9f6f5..000000000
--- a/library/HTMLPurifier/ChildDef/List.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/**
- * Definition for list containers ul and ol.
- *
- * What does this do? The big thing is to handle ol/ul at the top
- * level of list nodes, which should be handled specially by /folding/
- * them into the previous list node. We generally shouldn't ever
- * see other disallowed elements, because the autoclose behavior
- * in MakeWellFormed handles it.
- */
-class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
-{
- /**
- * @type string
- */
- public $type = 'list';
- /**
- * @type array
- */
- // lying a little bit, so that we can handle ul and ol ourselves
- // XXX: This whole business with 'wrap' is all a bit unsatisfactory
- public $elements = array('li' => true, 'ul' => true, 'ol' => true);
-
- /**
- * @param array $children
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function validateChildren($children, $config, $context)
- {
- // Flag for subclasses
- $this->whitespace = false;
-
- // if there are no tokens, delete parent node
- if (empty($children)) {
- return false;
- }
-
- // the new set of children
- $result = array();
-
- // a little sanity check to make sure it's not ALL whitespace
- $all_whitespace = true;
-
- $current_li = false;
-
- foreach ($children as $node) {
- if (!empty($node->is_whitespace)) {
- $result[] = $node;
- continue;
- }
- $all_whitespace = false; // phew, we're not talking about whitespace
-
- if ($node->name === 'li') {
- // good
- $current_li = $node;
- $result[] = $node;
- } else {
- // we want to tuck this into the previous li
- // Invariant: we expect the node to be ol/ul
- // ToDo: Make this more robust in the case of not ol/ul
- // by distinguishing between existing li and li created
- // to handle non-list elements; non-list elements should
- // not be appended to an existing li; only li created
- // for non-list. This distinction is not currently made.
- if ($current_li === false) {
- $current_li = new HTMLPurifier_Node_Element('li');
- $result[] = $current_li;
- }
- $current_li->children[] = $node;
- $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
- }
- }
- if (empty($result)) {
- return false;
- }
- if ($all_whitespace) {
- return false;
- }
- return $result;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/Table.php b/library/HTMLPurifier/ChildDef/Table.php
deleted file mode 100644
index 3e4a0f218..000000000
--- a/library/HTMLPurifier/ChildDef/Table.php
+++ /dev/null
@@ -1,224 +0,0 @@
-<?php
-
-/**
- * Definition for tables. The general idea is to extract out all of the
- * essential bits, and then reconstruct it later.
- *
- * This is a bit confusing, because the DTDs and the W3C
- * validators seem to disagree on the appropriate definition. The
- * DTD claims:
- *
- * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
- *
- * But actually, the HTML4 spec then has this to say:
- *
- * The TBODY start tag is always required except when the table
- * contains only one table body and no table head or foot sections.
- * The TBODY end tag may always be safely omitted.
- *
- * So the DTD is kind of wrong. The validator is, unfortunately, kind
- * of on crack.
- *
- * The definition changed again in XHTML1.1; and in my opinion, this
- * formulation makes the most sense.
- *
- * caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
- *
- * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
- * If we encounter a thead, tfoot or tbody, we are placed in the former
- * mode, and we *must* wrap any stray tr segments with a tbody. But if
- * we don't run into any of them, just have tr tags is OK.
- */
-class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
-{
- /**
- * @type bool
- */
- public $allow_empty = false;
-
- /**
- * @type string
- */
- public $type = 'table';
-
- /**
- * @type array
- */
- public $elements = array(
- 'tr' => true,
- 'tbody' => true,
- 'thead' => true,
- 'tfoot' => true,
- 'caption' => true,
- 'colgroup' => true,
- 'col' => true
- );
-
- public function __construct()
- {
- }
-
- /**
- * @param array $children
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array
- */
- public function validateChildren($children, $config, $context)
- {
- if (empty($children)) {
- return false;
- }
-
- // only one of these elements is allowed in a table
- $caption = false;
- $thead = false;
- $tfoot = false;
-
- // whitespace
- $initial_ws = array();
- $after_caption_ws = array();
- $after_thead_ws = array();
- $after_tfoot_ws = array();
-
- // as many of these as you want
- $cols = array();
- $content = array();
-
- $tbody_mode = false; // if true, then we need to wrap any stray
- // <tr>s with a <tbody>.
-
- $ws_accum =& $initial_ws;
-
- foreach ($children as $node) {
- if ($node instanceof HTMLPurifier_Node_Comment) {
- $ws_accum[] = $node;
- continue;
- }
- switch ($node->name) {
- case 'tbody':
- $tbody_mode = true;
- // fall through
- case 'tr':
- $content[] = $node;
- $ws_accum =& $content;
- break;
- case 'caption':
- // there can only be one caption!
- if ($caption !== false) break;
- $caption = $node;
- $ws_accum =& $after_caption_ws;
- break;
- case 'thead':
- $tbody_mode = true;
- // XXX This breaks rendering properties with
- // Firefox, which never floats a <thead> to
- // the top. Ever. (Our scheme will float the
- // first <thead> to the top.) So maybe
- // <thead>s that are not first should be
- // turned into <tbody>? Very tricky, indeed.
- if ($thead === false) {
- $thead = $node;
- $ws_accum =& $after_thead_ws;
- } else {
- // Oops, there's a second one! What
- // should we do? Current behavior is to
- // transmutate the first and last entries into
- // tbody tags, and then put into content.
- // Maybe a better idea is to *attach
- // it* to the existing thead or tfoot?
- // We don't do this, because Firefox
- // doesn't float an extra tfoot to the
- // bottom like it does for the first one.
- $node->name = 'tbody';
- $content[] = $node;
- $ws_accum =& $content;
- }
- break;
- case 'tfoot':
- // see above for some aveats
- $tbody_mode = true;
- if ($tfoot === false) {
- $tfoot = $node;
- $ws_accum =& $after_tfoot_ws;
- } else {
- $node->name = 'tbody';
- $content[] = $node;
- $ws_accum =& $content;
- }
- break;
- case 'colgroup':
- case 'col':
- $cols[] = $node;
- $ws_accum =& $cols;
- break;
- case '#PCDATA':
- // How is whitespace handled? We treat is as sticky to
- // the *end* of the previous element. So all of the
- // nonsense we have worked on is to keep things
- // together.
- if (!empty($node->is_whitespace)) {
- $ws_accum[] = $node;
- }
- break;
- }
- }
-
- if (empty($content)) {
- return false;
- }
-
- $ret = $initial_ws;
- if ($caption !== false) {
- $ret[] = $caption;
- $ret = array_merge($ret, $after_caption_ws);
- }
- if ($cols !== false) {
- $ret = array_merge($ret, $cols);
- }
- if ($thead !== false) {
- $ret[] = $thead;
- $ret = array_merge($ret, $after_thead_ws);
- }
- if ($tfoot !== false) {
- $ret[] = $tfoot;
- $ret = array_merge($ret, $after_tfoot_ws);
- }
-
- if ($tbody_mode) {
- // we have to shuffle tr into tbody
- $current_tr_tbody = null;
-
- foreach($content as $node) {
- switch ($node->name) {
- case 'tbody':
- $current_tr_tbody = null;
- $ret[] = $node;
- break;
- case 'tr':
- if ($current_tr_tbody === null) {
- $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
- $ret[] = $current_tr_tbody;
- }
- $current_tr_tbody->children[] = $node;
- break;
- case '#PCDATA':
- assert($node->is_whitespace);
- if ($current_tr_tbody === null) {
- $ret[] = $node;
- } else {
- $current_tr_tbody->children[] = $node;
- }
- break;
- }
- }
- } else {
- $ret = array_merge($ret, $content);
- }
-
- return $ret;
-
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Config.php b/library/HTMLPurifier/Config.php
deleted file mode 100644
index 7ada59b94..000000000
--- a/library/HTMLPurifier/Config.php
+++ /dev/null
@@ -1,911 +0,0 @@
-<?php
-
-/**
- * Configuration object that triggers customizable behavior.
- *
- * @warning This class is strongly defined: that means that the class
- * will fail if an undefined directive is retrieved or set.
- *
- * @note Many classes that could (although many times don't) use the
- * configuration object make it a mandatory parameter. This is
- * because a configuration object should always be forwarded,
- * otherwise, you run the risk of missing a parameter and then
- * being stumped when a configuration directive doesn't work.
- *
- * @todo Reconsider some of the public member variables
- */
-class HTMLPurifier_Config
-{
-
- /**
- * HTML Purifier's version
- * @type string
- */
- public $version = '4.6.0';
-
- /**
- * Whether or not to automatically finalize
- * the object if a read operation is done.
- * @type bool
- */
- public $autoFinalize = true;
-
- // protected member variables
-
- /**
- * Namespace indexed array of serials for specific namespaces.
- * @see getSerial() for more info.
- * @type string[]
- */
- protected $serials = array();
-
- /**
- * Serial for entire configuration object.
- * @type string
- */
- protected $serial;
-
- /**
- * Parser for variables.
- * @type HTMLPurifier_VarParser_Flexible
- */
- protected $parser = null;
-
- /**
- * Reference HTMLPurifier_ConfigSchema for value checking.
- * @type HTMLPurifier_ConfigSchema
- * @note This is public for introspective purposes. Please don't
- * abuse!
- */
- public $def;
-
- /**
- * Indexed array of definitions.
- * @type HTMLPurifier_Definition[]
- */
- protected $definitions;
-
- /**
- * Whether or not config is finalized.
- * @type bool
- */
- protected $finalized = false;
-
- /**
- * Property list containing configuration directives.
- * @type array
- */
- protected $plist;
-
- /**
- * Whether or not a set is taking place due to an alias lookup.
- * @type bool
- */
- private $aliasMode;
-
- /**
- * Set to false if you do not want line and file numbers in errors.
- * (useful when unit testing). This will also compress some errors
- * and exceptions.
- * @type bool
- */
- public $chatty = true;
-
- /**
- * Current lock; only gets to this namespace are allowed.
- * @type string
- */
- private $lock;
-
- /**
- * Constructor
- * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
- * what directives are allowed.
- * @param HTMLPurifier_PropertyList $parent
- */
- public function __construct($definition, $parent = null)
- {
- $parent = $parent ? $parent : $definition->defaultPlist;
- $this->plist = new HTMLPurifier_PropertyList($parent);
- $this->def = $definition; // keep a copy around for checking
- $this->parser = new HTMLPurifier_VarParser_Flexible();
- }
-
- /**
- * Convenience constructor that creates a config object based on a mixed var
- * @param mixed $config Variable that defines the state of the config
- * object. Can be: a HTMLPurifier_Config() object,
- * an array of directives based on loadArray(),
- * or a string filename of an ini file.
- * @param HTMLPurifier_ConfigSchema $schema Schema object
- * @return HTMLPurifier_Config Configured object
- */
- public static function create($config, $schema = null)
- {
- if ($config instanceof HTMLPurifier_Config) {
- // pass-through
- return $config;
- }
- if (!$schema) {
- $ret = HTMLPurifier_Config::createDefault();
- } else {
- $ret = new HTMLPurifier_Config($schema);
- }
- if (is_string($config)) {
- $ret->loadIni($config);
- } elseif (is_array($config)) $ret->loadArray($config);
- return $ret;
- }
-
- /**
- * Creates a new config object that inherits from a previous one.
- * @param HTMLPurifier_Config $config Configuration object to inherit from.
- * @return HTMLPurifier_Config object with $config as its parent.
- */
- public static function inherit(HTMLPurifier_Config $config)
- {
- return new HTMLPurifier_Config($config->def, $config->plist);
- }
-
- /**
- * Convenience constructor that creates a default configuration object.
- * @return HTMLPurifier_Config default object.
- */
- public static function createDefault()
- {
- $definition = HTMLPurifier_ConfigSchema::instance();
- $config = new HTMLPurifier_Config($definition);
- return $config;
- }
-
- /**
- * Retrieves a value from the configuration.
- *
- * @param string $key String key
- * @param mixed $a
- *
- * @return mixed
- */
- public function get($key, $a = null)
- {
- if ($a !== null) {
- $this->triggerError(
- "Using deprecated API: use \$config->get('$key.$a') instead",
- E_USER_WARNING
- );
- $key = "$key.$a";
- }
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- if (!isset($this->def->info[$key])) {
- // can't add % due to SimpleTest bug
- $this->triggerError(
- 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
- E_USER_WARNING
- );
- return;
- }
- if (isset($this->def->info[$key]->isAlias)) {
- $d = $this->def->info[$key];
- $this->triggerError(
- 'Cannot get value from aliased directive, use real name ' . $d->key,
- E_USER_ERROR
- );
- return;
- }
- if ($this->lock) {
- list($ns) = explode('.', $key);
- if ($ns !== $this->lock) {
- $this->triggerError(
- 'Cannot get value of namespace ' . $ns . ' when lock for ' .
- $this->lock .
- ' is active, this probably indicates a Definition setup method ' .
- 'is accessing directives that are not within its namespace',
- E_USER_ERROR
- );
- return;
- }
- }
- return $this->plist->get($key);
- }
-
- /**
- * Retrieves an array of directives to values from a given namespace
- *
- * @param string $namespace String namespace
- *
- * @return array
- */
- public function getBatch($namespace)
- {
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- $full = $this->getAll();
- if (!isset($full[$namespace])) {
- $this->triggerError(
- 'Cannot retrieve undefined namespace ' .
- htmlspecialchars($namespace),
- E_USER_WARNING
- );
- return;
- }
- return $full[$namespace];
- }
-
- /**
- * Returns a SHA-1 signature of a segment of the configuration object
- * that uniquely identifies that particular configuration
- *
- * @param string $namespace Namespace to get serial for
- *
- * @return string
- * @note Revision is handled specially and is removed from the batch
- * before processing!
- */
- public function getBatchSerial($namespace)
- {
- if (empty($this->serials[$namespace])) {
- $batch = $this->getBatch($namespace);
- unset($batch['DefinitionRev']);
- $this->serials[$namespace] = sha1(serialize($batch));
- }
- return $this->serials[$namespace];
- }
-
- /**
- * Returns a SHA-1 signature for the entire configuration object
- * that uniquely identifies that particular configuration
- *
- * @return string
- */
- public function getSerial()
- {
- if (empty($this->serial)) {
- $this->serial = sha1(serialize($this->getAll()));
- }
- return $this->serial;
- }
-
- /**
- * Retrieves all directives, organized by namespace
- *
- * @warning This is a pretty inefficient function, avoid if you can
- */
- public function getAll()
- {
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- $ret = array();
- foreach ($this->plist->squash() as $name => $value) {
- list($ns, $key) = explode('.', $name, 2);
- $ret[$ns][$key] = $value;
- }
- return $ret;
- }
-
- /**
- * Sets a value to configuration.
- *
- * @param string $key key
- * @param mixed $value value
- * @param mixed $a
- */
- public function set($key, $value, $a = null)
- {
- if (strpos($key, '.') === false) {
- $namespace = $key;
- $directive = $value;
- $value = $a;
- $key = "$key.$directive";
- $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
- } else {
- list($namespace) = explode('.', $key);
- }
- if ($this->isFinalized('Cannot set directive after finalization')) {
- return;
- }
- if (!isset($this->def->info[$key])) {
- $this->triggerError(
- 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
- E_USER_WARNING
- );
- return;
- }
- $def = $this->def->info[$key];
-
- if (isset($def->isAlias)) {
- if ($this->aliasMode) {
- $this->triggerError(
- 'Double-aliases not allowed, please fix '.
- 'ConfigSchema bug with' . $key,
- E_USER_ERROR
- );
- return;
- }
- $this->aliasMode = true;
- $this->set($def->key, $value);
- $this->aliasMode = false;
- $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
- return;
- }
-
- // Raw type might be negative when using the fully optimized form
- // of stdclass, which indicates allow_null == true
- $rtype = is_int($def) ? $def : $def->type;
- if ($rtype < 0) {
- $type = -$rtype;
- $allow_null = true;
- } else {
- $type = $rtype;
- $allow_null = isset($def->allow_null);
- }
-
- try {
- $value = $this->parser->parse($value, $type, $allow_null);
- } catch (HTMLPurifier_VarParserException $e) {
- $this->triggerError(
- 'Value for ' . $key . ' is of invalid type, should be ' .
- HTMLPurifier_VarParser::getTypeName($type),
- E_USER_WARNING
- );
- return;
- }
- if (is_string($value) && is_object($def)) {
- // resolve value alias if defined
- if (isset($def->aliases[$value])) {
- $value = $def->aliases[$value];
- }
- // check to see if the value is allowed
- if (isset($def->allowed) && !isset($def->allowed[$value])) {
- $this->triggerError(
- 'Value not supported, valid values are: ' .
- $this->_listify($def->allowed),
- E_USER_WARNING
- );
- return;
- }
- }
- $this->plist->set($key, $value);
-
- // reset definitions if the directives they depend on changed
- // this is a very costly process, so it's discouraged
- // with finalization
- if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
- $this->definitions[$namespace] = null;
- }
-
- $this->serials[$namespace] = false;
- }
-
- /**
- * Convenience function for error reporting
- *
- * @param array $lookup
- *
- * @return string
- */
- private function _listify($lookup)
- {
- $list = array();
- foreach ($lookup as $name => $b) {
- $list[] = $name;
- }
- return implode(', ', $list);
- }
-
- /**
- * Retrieves object reference to the HTML definition.
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawHTMLDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_HTMLDefinition
- */
- public function getHTMLDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('HTML', $raw, $optimized);
- }
-
- /**
- * Retrieves object reference to the CSS definition
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawCSSDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_CSSDefinition
- */
- public function getCSSDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('CSS', $raw, $optimized);
- }
-
- /**
- * Retrieves object reference to the URI definition
- *
- * @param bool $raw Return a copy that has not been setup yet. Must be
- * called before it's been setup, otherwise won't work.
- * @param bool $optimized If true, this method may return null, to
- * indicate that a cached version of the modified
- * definition object is available and no further edits
- * are necessary. Consider using
- * maybeGetRawURIDefinition, which is more explicitly
- * named, instead.
- *
- * @return HTMLPurifier_URIDefinition
- */
- public function getURIDefinition($raw = false, $optimized = false)
- {
- return $this->getDefinition('URI', $raw, $optimized);
- }
-
- /**
- * Retrieves a definition
- *
- * @param string $type Type of definition: HTML, CSS, etc
- * @param bool $raw Whether or not definition should be returned raw
- * @param bool $optimized Only has an effect when $raw is true. Whether
- * or not to return null if the result is already present in
- * the cache. This is off by default for backwards
- * compatibility reasons, but you need to do things this
- * way in order to ensure that caching is done properly.
- * Check out enduser-customize.html for more details.
- * We probably won't ever change this default, as much as the
- * maybe semantics is the "right thing to do."
- *
- * @throws HTMLPurifier_Exception
- * @return HTMLPurifier_Definition
- */
- public function getDefinition($type, $raw = false, $optimized = false)
- {
- if ($optimized && !$raw) {
- throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
- }
- if (!$this->finalized) {
- $this->autoFinalize();
- }
- // temporarily suspend locks, so we can handle recursive definition calls
- $lock = $this->lock;
- $this->lock = null;
- $factory = HTMLPurifier_DefinitionCacheFactory::instance();
- $cache = $factory->create($type, $this);
- $this->lock = $lock;
- if (!$raw) {
- // full definition
- // ---------------
- // check if definition is in memory
- if (!empty($this->definitions[$type])) {
- $def = $this->definitions[$type];
- // check if the definition is setup
- if ($def->setup) {
- return $def;
- } else {
- $def->setup($this);
- if ($def->optimized) {
- $cache->add($def, $this);
- }
- return $def;
- }
- }
- // check if definition is in cache
- $def = $cache->get($this);
- if ($def) {
- // definition in cache, save to memory and return it
- $this->definitions[$type] = $def;
- return $def;
- }
- // initialize it
- $def = $this->initDefinition($type);
- // set it up
- $this->lock = $type;
- $def->setup($this);
- $this->lock = null;
- // save in cache
- $cache->add($def, $this);
- // return it
- return $def;
- } else {
- // raw definition
- // --------------
- // check preconditions
- $def = null;
- if ($optimized) {
- if (is_null($this->get($type . '.DefinitionID'))) {
- // fatally error out if definition ID not set
- throw new HTMLPurifier_Exception(
- "Cannot retrieve raw version without specifying %$type.DefinitionID"
- );
- }
- }
- if (!empty($this->definitions[$type])) {
- $def = $this->definitions[$type];
- if ($def->setup && !$optimized) {
- $extra = $this->chatty ?
- " (try moving this code block earlier in your initialization)" :
- "";
- throw new HTMLPurifier_Exception(
- "Cannot retrieve raw definition after it has already been setup" .
- $extra
- );
- }
- if ($def->optimized === null) {
- $extra = $this->chatty ? " (try flushing your cache)" : "";
- throw new HTMLPurifier_Exception(
- "Optimization status of definition is unknown" . $extra
- );
- }
- if ($def->optimized !== $optimized) {
- $msg = $optimized ? "optimized" : "unoptimized";
- $extra = $this->chatty ?
- " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
- : "";
- throw new HTMLPurifier_Exception(
- "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
- );
- }
- }
- // check if definition was in memory
- if ($def) {
- if ($def->setup) {
- // invariant: $optimized === true (checked above)
- return null;
- } else {
- return $def;
- }
- }
- // if optimized, check if definition was in cache
- // (because we do the memory check first, this formulation
- // is prone to cache slamming, but I think
- // guaranteeing that either /all/ of the raw
- // setup code or /none/ of it is run is more important.)
- if ($optimized) {
- // This code path only gets run once; once we put
- // something in $definitions (which is guaranteed by the
- // trailing code), we always short-circuit above.
- $def = $cache->get($this);
- if ($def) {
- // save the full definition for later, but don't
- // return it yet
- $this->definitions[$type] = $def;
- return null;
- }
- }
- // check invariants for creation
- if (!$optimized) {
- if (!is_null($this->get($type . '.DefinitionID'))) {
- if ($this->chatty) {
- $this->triggerError(
- 'Due to a documentation error in previous version of HTML Purifier, your ' .
- 'definitions are not being cached. If this is OK, you can remove the ' .
- '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' .
- 'modify your code to use maybeGetRawDefinition, and test if the returned ' .
- 'value is null before making any edits (if it is null, that means that a ' .
- 'cached version is available, and no raw operations are necessary). See ' .
- '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
- 'Customize</a> for more details',
- E_USER_WARNING
- );
- } else {
- $this->triggerError(
- "Useless DefinitionID declaration",
- E_USER_WARNING
- );
- }
- }
- }
- // initialize it
- $def = $this->initDefinition($type);
- $def->optimized = $optimized;
- return $def;
- }
- throw new HTMLPurifier_Exception("The impossible happened!");
- }
-
- /**
- * Initialise definition
- *
- * @param string $type What type of definition to create
- *
- * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
- * @throws HTMLPurifier_Exception
- */
- private function initDefinition($type)
- {
- // quick checks failed, let's create the object
- if ($type == 'HTML') {
- $def = new HTMLPurifier_HTMLDefinition();
- } elseif ($type == 'CSS') {
- $def = new HTMLPurifier_CSSDefinition();
- } elseif ($type == 'URI') {
- $def = new HTMLPurifier_URIDefinition();
- } else {
- throw new HTMLPurifier_Exception(
- "Definition of $type type not supported"
- );
- }
- $this->definitions[$type] = $def;
- return $def;
- }
-
- public function maybeGetRawDefinition($name)
- {
- return $this->getDefinition($name, true, true);
- }
-
- public function maybeGetRawHTMLDefinition()
- {
- return $this->getDefinition('HTML', true, true);
- }
-
- public function maybeGetRawCSSDefinition()
- {
- return $this->getDefinition('CSS', true, true);
- }
-
- public function maybeGetRawURIDefinition()
- {
- return $this->getDefinition('URI', true, true);
- }
-
- /**
- * Loads configuration values from an array with the following structure:
- * Namespace.Directive => Value
- *
- * @param array $config_array Configuration associative array
- */
- public function loadArray($config_array)
- {
- if ($this->isFinalized('Cannot load directives after finalization')) {
- return;
- }
- foreach ($config_array as $key => $value) {
- $key = str_replace('_', '.', $key);
- if (strpos($key, '.') !== false) {
- $this->set($key, $value);
- } else {
- $namespace = $key;
- $namespace_values = $value;
- foreach ($namespace_values as $directive => $value2) {
- $this->set($namespace .'.'. $directive, $value2);
- }
- }
- }
- }
-
- /**
- * Returns a list of array(namespace, directive) for all directives
- * that are allowed in a web-form context as per an allowed
- * namespaces/directives list.
- *
- * @param array $allowed List of allowed namespaces/directives
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return array
- */
- public static function getAllowedDirectivesForForm($allowed, $schema = null)
- {
- if (!$schema) {
- $schema = HTMLPurifier_ConfigSchema::instance();
- }
- if ($allowed !== true) {
- if (is_string($allowed)) {
- $allowed = array($allowed);
- }
- $allowed_ns = array();
- $allowed_directives = array();
- $blacklisted_directives = array();
- foreach ($allowed as $ns_or_directive) {
- if (strpos($ns_or_directive, '.') !== false) {
- // directive
- if ($ns_or_directive[0] == '-') {
- $blacklisted_directives[substr($ns_or_directive, 1)] = true;
- } else {
- $allowed_directives[$ns_or_directive] = true;
- }
- } else {
- // namespace
- $allowed_ns[$ns_or_directive] = true;
- }
- }
- }
- $ret = array();
- foreach ($schema->info as $key => $def) {
- list($ns, $directive) = explode('.', $key, 2);
- if ($allowed !== true) {
- if (isset($blacklisted_directives["$ns.$directive"])) {
- continue;
- }
- if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
- continue;
- }
- }
- if (isset($def->isAlias)) {
- continue;
- }
- if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
- continue;
- }
- $ret[] = array($ns, $directive);
- }
- return $ret;
- }
-
- /**
- * Loads configuration values from $_GET/$_POST that were posted
- * via ConfigForm
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return mixed
- */
- public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
- {
- $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
- $config = HTMLPurifier_Config::create($ret, $schema);
- return $config;
- }
-
- /**
- * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- */
- public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
- {
- $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
- $this->loadArray($ret);
- }
-
- /**
- * Prepares an array from a form into something usable for the more
- * strict parts of HTMLPurifier_Config
- *
- * @param array $array $_GET or $_POST array to import
- * @param string|bool $index Index/name that the config variables are in
- * @param array|bool $allowed List of allowed namespaces/directives
- * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
- * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
- *
- * @return array
- */
- public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
- {
- if ($index !== false) {
- $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
- }
- $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();
-
- $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
- $ret = array();
- foreach ($allowed as $key) {
- list($ns, $directive) = $key;
- $skey = "$ns.$directive";
- if (!empty($array["Null_$skey"])) {
- $ret[$ns][$directive] = null;
- continue;
- }
- if (!isset($array[$skey])) {
- continue;
- }
- $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
- $ret[$ns][$directive] = $value;
- }
- return $ret;
- }
-
- /**
- * Loads configuration values from an ini file
- *
- * @param string $filename Name of ini file
- */
- public function loadIni($filename)
- {
- if ($this->isFinalized('Cannot load directives after finalization')) {
- return;
- }
- $array = parse_ini_file($filename, true);
- $this->loadArray($array);
- }
-
- /**
- * Checks whether or not the configuration object is finalized.
- *
- * @param string|bool $error String error message, or false for no error
- *
- * @return bool
- */
- public function isFinalized($error = false)
- {
- if ($this->finalized && $error) {
- $this->triggerError($error, E_USER_ERROR);
- }
- return $this->finalized;
- }
-
- /**
- * Finalizes configuration only if auto finalize is on and not
- * already finalized
- */
- public function autoFinalize()
- {
- if ($this->autoFinalize) {
- $this->finalize();
- } else {
- $this->plist->squash(true);
- }
- }
-
- /**
- * Finalizes a configuration object, prohibiting further change
- */
- public function finalize()
- {
- $this->finalized = true;
- $this->parser = null;
- }
-
- /**
- * Produces a nicely formatted error message by supplying the
- * stack frame information OUTSIDE of HTMLPurifier_Config.
- *
- * @param string $msg An error message
- * @param int $no An error number
- */
- protected function triggerError($msg, $no)
- {
- // determine previous stack frame
- $extra = '';
- if ($this->chatty) {
- $trace = debug_backtrace();
- // zip(tail(trace), trace) -- but PHP is not Haskell har har
- for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
- // XXX this is not correct on some versions of HTML Purifier
- if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
- continue;
- }
- $frame = $trace[$i];
- $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
- break;
- }
- }
- trigger_error($msg . $extra, $no);
- }
-
- /**
- * Returns a serialized form of the configuration object that can
- * be reconstituted.
- *
- * @return string
- */
- public function serialize()
- {
- $this->getDefinition('HTML');
- $this->getDefinition('CSS');
- $this->getDefinition('URI');
- return serialize($this);
- }
-
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema.ser b/library/HTMLPurifier/ConfigSchema/schema.ser
deleted file mode 100644
index 22ea32185..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema.ser
+++ /dev/null
Binary files differ
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
deleted file mode 100644
index b2b83d9ab..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Cache.SerializerPermissions
-TYPE: int
-VERSION: 4.3.0
-DEFAULT: 0755
---DESCRIPTION--
-
-<p>
- Directory permissions of the files and directories created inside
- the DefinitionCache/Serializer or other custom serializer path.
-</p>
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
deleted file mode 100644
index a64e3d7c3..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-HTML.CustomDoctype
-TYPE: string/null
-VERSION: 2.0.1
-DEFAULT: NULL
---DESCRIPTION--
-
-A custom doctype for power-users who defined there own document
-type. This directive only applies when %HTML.Doctype is blank.
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
deleted file mode 100644
index 666635a5f..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-URI.AllowedSchemes
-TYPE: lookup
---DEFAULT--
-array (
- 'http' => true,
- 'https' => true,
- 'mailto' => true,
- 'ftp' => true,
- 'nntp' => true,
- 'news' => true,
-)
---DESCRIPTION--
-Whitelist that defines the schemes that a URI is allowed to have. This
-prevents XSS attacks from using pseudo-schemes like javascript or mocha.
-There is also support for the <code>data</code> and <code>file</code>
-URI schemes, but they are not enabled by default.
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
deleted file mode 100644
index 728e378cb..000000000
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-URI.DefaultScheme
-TYPE: string
-DEFAULT: 'http'
---DESCRIPTION--
-
-<p>
- Defines through what scheme the output will be served, in order to
- select the proper object validator when no scheme information is present.
-</p>
---# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache.php b/library/HTMLPurifier/DefinitionCache.php
deleted file mode 100644
index 67bb5b1e6..000000000
--- a/library/HTMLPurifier/DefinitionCache.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-
-/**
- * Abstract class representing Definition cache managers that implements
- * useful common methods and is a factory.
- * @todo Create a separate maintenance file advanced users can use to
- * cache their custom HTMLDefinition, which can be loaded
- * via a configuration directive
- * @todo Implement memcached
- */
-abstract class HTMLPurifier_DefinitionCache
-{
- /**
- * @type string
- */
- public $type;
-
- /**
- * @param string $type Type of definition objects this instance of the
- * cache will handle.
- */
- public function __construct($type)
- {
- $this->type = $type;
- }
-
- /**
- * Generates a unique identifier for a particular configuration
- * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
- * @return string
- */
- public function generateKey($config)
- {
- return $config->version . ',' . // possibly replace with function calls
- $config->getBatchSerial($this->type) . ',' .
- $config->get($this->type . '.DefinitionRev');
- }
-
- /**
- * Tests whether or not a key is old with respect to the configuration's
- * version and revision number.
- * @param string $key Key to test
- * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
- * @return bool
- */
- public function isOld($key, $config)
- {
- if (substr_count($key, ',') < 2) {
- return true;
- }
- list($version, $hash, $revision) = explode(',', $key, 3);
- $compare = version_compare($version, $config->version);
- // version mismatch, is always old
- if ($compare != 0) {
- return true;
- }
- // versions match, ids match, check revision number
- if ($hash == $config->getBatchSerial($this->type) &&
- $revision < $config->get($this->type . '.DefinitionRev')) {
- return true;
- }
- return false;
- }
-
- /**
- * Checks if a definition's type jives with the cache's type
- * @note Throws an error on failure
- * @param HTMLPurifier_Definition $def Definition object to check
- * @return bool true if good, false if not
- */
- public function checkDefType($def)
- {
- if ($def->type !== $this->type) {
- trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
- return false;
- }
- return true;
- }
-
- /**
- * Adds a definition object to the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function add($def, $config);
-
- /**
- * Unconditionally saves a definition object to the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function set($def, $config);
-
- /**
- * Replace an object in the cache
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- */
- abstract public function replace($def, $config);
-
- /**
- * Retrieves a definition object from the cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function get($config);
-
- /**
- * Removes a definition object to the cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function remove($config);
-
- /**
- * Clears all objects from cache
- * @param HTMLPurifier_Config $config
- */
- abstract public function flush($config);
-
- /**
- * Clears all expired (older version or revision) objects from cache
- * @note Be carefuly implementing this method as flush. Flush must
- * not interfere with other Definition types, and cleanup()
- * should not be repeatedly called by userland code.
- * @param HTMLPurifier_Config $config
- */
- abstract public function cleanup($config);
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Serializer.php b/library/HTMLPurifier/DefinitionCache/Serializer.php
deleted file mode 100644
index ecacb88fe..000000000
--- a/library/HTMLPurifier/DefinitionCache/Serializer.php
+++ /dev/null
@@ -1,285 +0,0 @@
-<?php
-
-class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
-{
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function add($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (file_exists($file)) {
- return false;
- }
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function set($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Definition $def
- * @param HTMLPurifier_Config $config
- * @return int|bool
- */
- public function replace($def, $config)
- {
- if (!$this->checkDefType($def)) {
- return;
- }
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- if (!$this->_prepareDir($config)) {
- return false;
- }
- return $this->_write($file, serialize($def), $config);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool|HTMLPurifier_Config
- */
- public function get($config)
- {
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- return unserialize(file_get_contents($file));
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function remove($config)
- {
- $file = $this->generateFilePath($config);
- if (!file_exists($file)) {
- return false;
- }
- return unlink($file);
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function flush($config)
- {
- if (!$this->_prepareDir($config)) {
- return false;
- }
- $dir = $this->generateDirectoryPath($config);
- $dh = opendir($dir);
- while (false !== ($filename = readdir($dh))) {
- if (empty($filename)) {
- continue;
- }
- if ($filename[0] === '.') {
- continue;
- }
- unlink($dir . '/' . $filename);
- }
- }
-
- /**
- * @param HTMLPurifier_Config $config
- * @return bool
- */
- public function cleanup($config)
- {
- if (!$this->_prepareDir($config)) {
- return false;
- }
- $dir = $this->generateDirectoryPath($config);
- $dh = opendir($dir);
- while (false !== ($filename = readdir($dh))) {
- if (empty($filename)) {
- continue;
- }
- if ($filename[0] === '.') {
- continue;
- }
- $key = substr($filename, 0, strlen($filename) - 4);
- if ($this->isOld($key, $config)) {
- unlink($dir . '/' . $filename);
- }
- }
- }
-
- /**
- * Generates the file path to the serial file corresponding to
- * the configuration and definition name
- * @param HTMLPurifier_Config $config
- * @return string
- * @todo Make protected
- */
- public function generateFilePath($config)
- {
- $key = $this->generateKey($config);
- return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
- }
-
- /**
- * Generates the path to the directory contain this cache's serial files
- * @param HTMLPurifier_Config $config
- * @return string
- * @note No trailing slash
- * @todo Make protected
- */
- public function generateDirectoryPath($config)
- {
- $base = $this->generateBaseDirectoryPath($config);
- return $base . '/' . $this->type;
- }
-
- /**
- * Generates path to base directory that contains all definition type
- * serials
- * @param HTMLPurifier_Config $config
- * @return mixed|string
- * @todo Make protected
- */
- public function generateBaseDirectoryPath($config)
- {
- $base = $config->get('Cache.SerializerPath');
- $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
- return $base;
- }
-
- /**
- * Convenience wrapper function for file_put_contents
- * @param string $file File name to write to
- * @param string $data Data to write into file
- * @param HTMLPurifier_Config $config
- * @return int|bool Number of bytes written if success, or false if failure.
- */
- private function _write($file, $data, $config)
- {
- $result = file_put_contents($file, $data);
- if ($result !== false) {
- // set permissions of the new file (no execute)
- $chmod = $config->get('Cache.SerializerPermissions');
- if (!$chmod) {
- $chmod = 0644; // invalid config or simpletest
- }
- $chmod = $chmod & 0666;
- chmod($file, $chmod);
- }
- return $result;
- }
-
- /**
- * Prepares the directory that this type stores the serials in
- * @param HTMLPurifier_Config $config
- * @return bool True if successful
- */
- private function _prepareDir($config)
- {
- $directory = $this->generateDirectoryPath($config);
- $chmod = $config->get('Cache.SerializerPermissions');
- if (!$chmod) {
- $chmod = 0755; // invalid config or simpletest
- }
- if (!is_dir($directory)) {
- $base = $this->generateBaseDirectoryPath($config);
- if (!is_dir($base)) {
- trigger_error(
- 'Base directory ' . $base . ' does not exist,
- please create or change using %Cache.SerializerPath',
- E_USER_WARNING
- );
- return false;
- } elseif (!$this->_testPermissions($base, $chmod)) {
- return false;
- }
- $old = umask(0000);
- mkdir($directory, $chmod);
- umask($old);
- } elseif (!$this->_testPermissions($directory, $chmod)) {
- return false;
- }
- return true;
- }
-
- /**
- * Tests permissions on a directory and throws out friendly
- * error messages and attempts to chmod it itself if possible
- * @param string $dir Directory path
- * @param int $chmod Permissions
- * @return bool True if directory is writable
- */
- private function _testPermissions($dir, $chmod)
- {
- // early abort, if it is writable, everything is hunky-dory
- if (is_writable($dir)) {
- return true;
- }
- if (!is_dir($dir)) {
- // generally, you'll want to handle this beforehand
- // so a more specific error message can be given
- trigger_error(
- 'Directory ' . $dir . ' does not exist',
- E_USER_WARNING
- );
- return false;
- }
- if (function_exists('posix_getuid')) {
- // POSIX system, we can give more specific advice
- if (fileowner($dir) === posix_getuid()) {
- // we can chmod it ourselves
- $chmod = $chmod | 0700;
- if (chmod($dir, $chmod)) {
- return true;
- }
- } elseif (filegroup($dir) === posix_getgid()) {
- $chmod = $chmod | 0070;
- } else {
- // PHP's probably running as nobody, so we'll
- // need to give global permissions
- $chmod = $chmod | 0777;
- }
- trigger_error(
- 'Directory ' . $dir . ' not writable, ' .
- 'please chmod to ' . decoct($chmod),
- E_USER_WARNING
- );
- } else {
- // generic error message
- trigger_error(
- 'Directory ' . $dir . ' not writable, ' .
- 'please alter file permissions',
- E_USER_WARNING
- );
- }
- return false;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Encoder.php b/library/HTMLPurifier/Encoder.php
deleted file mode 100644
index fef9b5890..000000000
--- a/library/HTMLPurifier/Encoder.php
+++ /dev/null
@@ -1,611 +0,0 @@
-<?php
-
-/**
- * A UTF-8 specific character encoder that handles cleaning and transforming.
- * @note All functions in this class should be static.
- */
-class HTMLPurifier_Encoder
-{
-
- /**
- * Constructor throws fatal error if you attempt to instantiate class
- */
- private function __construct()
- {
- trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
- }
-
- /**
- * Error-handler that mutes errors, alternative to shut-up operator.
- */
- public static function muteErrorHandler()
- {
- }
-
- /**
- * iconv wrapper which mutes errors, but doesn't work around bugs.
- * @param string $in Input encoding
- * @param string $out Output encoding
- * @param string $text The text to convert
- * @return string
- */
- public static function unsafeIconv($in, $out, $text)
- {
- set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
- $r = iconv($in, $out, $text);
- restore_error_handler();
- return $r;
- }
-
- /**
- * iconv wrapper which mutes errors and works around bugs.
- * @param string $in Input encoding
- * @param string $out Output encoding
- * @param string $text The text to convert
- * @param int $max_chunk_size
- * @return string
- */
- public static function iconv($in, $out, $text, $max_chunk_size = 8000)
- {
- $code = self::testIconvTruncateBug();
- if ($code == self::ICONV_OK) {
- return self::unsafeIconv($in, $out, $text);
- } elseif ($code == self::ICONV_TRUNCATES) {
- // we can only work around this if the input character set
- // is utf-8
- if ($in == 'utf-8') {
- if ($max_chunk_size < 4) {
- trigger_error('max_chunk_size is too small', E_USER_WARNING);
- return false;
- }
- // split into 8000 byte chunks, but be careful to handle
- // multibyte boundaries properly
- if (($c = strlen($text)) <= $max_chunk_size) {
- return self::unsafeIconv($in, $out, $text);
- }
- $r = '';
- $i = 0;
- while (true) {
- if ($i + $max_chunk_size >= $c) {
- $r .= self::unsafeIconv($in, $out, substr($text, $i));
- break;
- }
- // wibble the boundary
- if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
- $chunk_size = $max_chunk_size;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
- $chunk_size = $max_chunk_size - 1;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
- $chunk_size = $max_chunk_size - 2;
- } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
- $chunk_size = $max_chunk_size - 3;
- } else {
- return false; // rather confusing UTF-8...
- }
- $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
- $r .= self::unsafeIconv($in, $out, $chunk);
- $i += $chunk_size;
- }
- return $r;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
- /**
- * Cleans a UTF-8 string for well-formedness and SGML validity
- *
- * It will parse according to UTF-8 and return a valid UTF8 string, with
- * non-SGML codepoints excluded.
- *
- * @param string $str The string to clean
- * @param bool $force_php
- * @return string
- *
- * @note Just for reference, the non-SGML code points are 0 to 31 and
- * 127 to 159, inclusive. However, we allow code points 9, 10
- * and 13, which are the tab, line feed and carriage return
- * respectively. 128 and above the code points map to multibyte
- * UTF-8 representations.
- *
- * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
- * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
- * LGPL license. Notes on what changed are inside, but in general,
- * the original code transformed UTF-8 text into an array of integer
- * Unicode codepoints. Understandably, transforming that back to
- * a string would be somewhat expensive, so the function was modded to
- * directly operate on the string. However, this discourages code
- * reuse, and the logic enumerated here would be useful for any
- * function that needs to be able to understand UTF-8 characters.
- * As of right now, only smart lossless character encoding converters
- * would need that, and I'm probably not going to implement them.
- * Once again, PHP 6 should solve all our problems.
- */
- public static function cleanUTF8($str, $force_php = false)
- {
- // UTF-8 validity is checked since PHP 4.3.5
- // This is an optimization: if the string is already valid UTF-8, no
- // need to do PHP stuff. 99% of the time, this will be the case.
- // The regexp matches the XML char production, as well as well as excluding
- // non-SGML codepoints U+007F to U+009F
- if (preg_match(
- '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
- $str
- )) {
- return $str;
- }
-
- $mState = 0; // cached expected number of octets after the current octet
- // until the beginning of the next UTF8 character sequence
- $mUcs4 = 0; // cached Unicode character
- $mBytes = 1; // cached expected number of octets in the current sequence
-
- // original code involved an $out that was an array of Unicode
- // codepoints. Instead of having to convert back into UTF-8, we've
- // decided to directly append valid UTF-8 characters onto a string
- // $out once they're done. $char accumulates raw bytes, while $mUcs4
- // turns into the Unicode code point, so there's some redundancy.
-
- $out = '';
- $char = '';
-
- $len = strlen($str);
- for ($i = 0; $i < $len; $i++) {
- $in = ord($str{$i});
- $char .= $str[$i]; // append byte to char
- if (0 == $mState) {
- // When mState is zero we expect either a US-ASCII character
- // or a multi-octet sequence.
- if (0 == (0x80 & ($in))) {
- // US-ASCII, pass straight through.
- if (($in <= 31 || $in == 127) &&
- !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
- ) {
- // control characters, remove
- } else {
- $out .= $char;
- }
- // reset
- $char = '';
- $mBytes = 1;
- } elseif (0xC0 == (0xE0 & ($in))) {
- // First octet of 2 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x1F) << 6;
- $mState = 1;
- $mBytes = 2;
- } elseif (0xE0 == (0xF0 & ($in))) {
- // First octet of 3 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x0F) << 12;
- $mState = 2;
- $mBytes = 3;
- } elseif (0xF0 == (0xF8 & ($in))) {
- // First octet of 4 octet sequence
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x07) << 18;
- $mState = 3;
- $mBytes = 4;
- } elseif (0xF8 == (0xFC & ($in))) {
- // First octet of 5 octet sequence.
- //
- // This is illegal because the encoded codepoint must be
- // either:
- // (a) not the shortest form or
- // (b) outside the Unicode range of 0-0x10FFFF.
- // Rather than trying to resynchronize, we will carry on
- // until the end of the sequence and let the later error
- // handling code catch it.
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 0x03) << 24;
- $mState = 4;
- $mBytes = 5;
- } elseif (0xFC == (0xFE & ($in))) {
- // First octet of 6 octet sequence, see comments for 5
- // octet sequence.
- $mUcs4 = ($in);
- $mUcs4 = ($mUcs4 & 1) << 30;
- $mState = 5;
- $mBytes = 6;
- } else {
- // Current octet is neither in the US-ASCII range nor a
- // legal first octet of a multi-octet sequence.
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char = '';
- }
- } else {
- // When mState is non-zero, we expect a continuation of the
- // multi-octet sequence
- if (0x80 == (0xC0 & ($in))) {
- // Legal continuation.
- $shift = ($mState - 1) * 6;
- $tmp = $in;
- $tmp = ($tmp & 0x0000003F) << $shift;
- $mUcs4 |= $tmp;
-
- if (0 == --$mState) {
- // End of the multi-octet sequence. mUcs4 now contains
- // the final Unicode codepoint to be output
-
- // Check for illegal sequences and codepoints.
-
- // From Unicode 3.1, non-shortest form is illegal
- if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
- ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
- ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
- (4 < $mBytes) ||
- // From Unicode 3.2, surrogate characters = illegal
- (($mUcs4 & 0xFFFFF800) == 0xD800) ||
- // Codepoints outside the Unicode range are illegal
- ($mUcs4 > 0x10FFFF)
- ) {
-
- } elseif (0xFEFF != $mUcs4 && // omit BOM
- // check for valid Char unicode codepoints
- (
- 0x9 == $mUcs4 ||
- 0xA == $mUcs4 ||
- 0xD == $mUcs4 ||
- (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
- // 7F-9F is not strictly prohibited by XML,
- // but it is non-SGML, and thus we don't allow it
- (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
- (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
- )
- ) {
- $out .= $char;
- }
- // initialize UTF8 cache (reset)
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char = '';
- }
- } else {
- // ((0xC0 & (*in) != 0x80) && (mState != 0))
- // Incomplete multi-octet sequence.
- // used to result in complete fail, but we'll reset
- $mState = 0;
- $mUcs4 = 0;
- $mBytes = 1;
- $char ='';
- }
- }
- }
- return $out;
- }
-
- /**
- * Translates a Unicode codepoint into its corresponding UTF-8 character.
- * @note Based on Feyd's function at
- * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
- * which is in public domain.
- * @note While we're going to do code point parsing anyway, a good
- * optimization would be to refuse to translate code points that
- * are non-SGML characters. However, this could lead to duplication.
- * @note This is very similar to the unichr function in
- * maintenance/generate-entity-file.php (although this is superior,
- * due to its sanity checks).
- */
-
- // +----------+----------+----------+----------+
- // | 33222222 | 22221111 | 111111 | |
- // | 10987654 | 32109876 | 54321098 | 76543210 | bit
- // +----------+----------+----------+----------+
- // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
- // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
- // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
- // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
- // +----------+----------+----------+----------+
- // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
- // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
- // +----------+----------+----------+----------+
-
- public static function unichr($code)
- {
- if ($code > 1114111 or $code < 0 or
- ($code >= 55296 and $code <= 57343) ) {
- // bits are set outside the "valid" range as defined
- // by UNICODE 4.1.0
- return '';
- }
-
- $x = $y = $z = $w = 0;
- if ($code < 128) {
- // regular ASCII character
- $x = $code;
- } else {
- // set up bits for UTF-8
- $x = ($code & 63) | 128;
- if ($code < 2048) {
- $y = (($code & 2047) >> 6) | 192;
- } else {
- $y = (($code & 4032) >> 6) | 128;
- if ($code < 65536) {
- $z = (($code >> 12) & 15) | 224;
- } else {
- $z = (($code >> 12) & 63) | 128;
- $w = (($code >> 18) & 7) | 240;
- }
- }
- }
- // set up the actual character
- $ret = '';
- if ($w) {
- $ret .= chr($w);
- }
- if ($z) {
- $ret .= chr($z);
- }
- if ($y) {
- $ret .= chr($y);
- }
- $ret .= chr($x);
-
- return $ret;
- }
-
- /**
- * @return bool
- */
- public static function iconvAvailable()
- {
- static $iconv = null;
- if ($iconv === null) {
- $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
- }
- return $iconv;
- }
-
- /**
- * Convert a string to UTF-8 based on configuration.
- * @param string $str The string to convert
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public static function convertToUTF8($str, $config, $context)
- {
- $encoding = $config->get('Core.Encoding');
- if ($encoding === 'utf-8') {
- return $str;
- }
- static $iconv = null;
- if ($iconv === null) {
- $iconv = self::iconvAvailable();
- }
- if ($iconv && !$config->get('Test.ForceNoIconv')) {
- // unaffected by bugs, since UTF-8 support all characters
- $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
- if ($str === false) {
- // $encoding is not a valid encoding
- trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
- return '';
- }
- // If the string is bjorked by Shift_JIS or a similar encoding
- // that doesn't support all of ASCII, convert the naughty
- // characters to their true byte-wise ASCII/UTF-8 equivalents.
- $str = strtr($str, self::testEncodingSupportsASCII($encoding));
- return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_encode($str);
- return $str;
- }
- $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
- if ($bug == self::ICONV_OK) {
- trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
- } else {
- trigger_error(
- 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
- 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
- E_USER_ERROR
- );
- }
- }
-
- /**
- * Converts a string from UTF-8 based on configuration.
- * @param string $str The string to convert
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @note Currently, this is a lossy conversion, with unexpressable
- * characters being omitted.
- */
- public static function convertFromUTF8($str, $config, $context)
- {
- $encoding = $config->get('Core.Encoding');
- if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
- $str = self::convertToASCIIDumbLossless($str);
- }
- if ($encoding === 'utf-8') {
- return $str;
- }
- static $iconv = null;
- if ($iconv === null) {
- $iconv = self::iconvAvailable();
- }
- if ($iconv && !$config->get('Test.ForceNoIconv')) {
- // Undo our previous fix in convertToUTF8, otherwise iconv will barf
- $ascii_fix = self::testEncodingSupportsASCII($encoding);
- if (!$escape && !empty($ascii_fix)) {
- $clear_fix = array();
- foreach ($ascii_fix as $utf8 => $native) {
- $clear_fix[$utf8] = '';
- }
- $str = strtr($str, $clear_fix);
- }
- $str = strtr($str, array_flip($ascii_fix));
- // Normal stuff
- $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
- return $str;
- } elseif ($encoding === 'iso-8859-1') {
- $str = utf8_decode($str);
- return $str;
- }
- trigger_error('Encoding not supported', E_USER_ERROR);
- // You might be tempted to assume that the ASCII representation
- // might be OK, however, this is *not* universally true over all
- // encodings. So we take the conservative route here, rather
- // than forcibly turn on %Core.EscapeNonASCIICharacters
- }
-
- /**
- * Lossless (character-wise) conversion of HTML to ASCII
- * @param string $str UTF-8 string to be converted to ASCII
- * @return string ASCII encoded string with non-ASCII character entity-ized
- * @warning Adapted from MediaWiki, claiming fair use: this is a common
- * algorithm. If you disagree with this license fudgery,
- * implement it yourself.
- * @note Uses decimal numeric entities since they are best supported.
- * @note This is a DUMB function: it has no concept of keeping
- * character entities that the projected character encoding
- * can allow. We could possibly implement a smart version
- * but that would require it to also know which Unicode
- * codepoints the charset supported (not an easy task).
- * @note Sort of with cleanUTF8() but it assumes that $str is
- * well-formed UTF-8
- */
- public static function convertToASCIIDumbLossless($str)
- {
- $bytesleft = 0;
- $result = '';
- $working = 0;
- $len = strlen($str);
- for ($i = 0; $i < $len; $i++) {
- $bytevalue = ord($str[$i]);
- if ($bytevalue <= 0x7F) { //0xxx xxxx
- $result .= chr($bytevalue);
- $bytesleft = 0;
- } elseif ($bytevalue <= 0xBF) { //10xx xxxx
- $working = $working << 6;
- $working += ($bytevalue & 0x3F);
- $bytesleft--;
- if ($bytesleft <= 0) {
- $result .= "&#" . $working . ";";
- }
- } elseif ($bytevalue <= 0xDF) { //110x xxxx
- $working = $bytevalue & 0x1F;
- $bytesleft = 1;
- } elseif ($bytevalue <= 0xEF) { //1110 xxxx
- $working = $bytevalue & 0x0F;
- $bytesleft = 2;
- } else { //1111 0xxx
- $working = $bytevalue & 0x07;
- $bytesleft = 3;
- }
- }
- return $result;
- }
-
- /** No bugs detected in iconv. */
- const ICONV_OK = 0;
-
- /** Iconv truncates output if converting from UTF-8 to another
- * character set with //IGNORE, and a non-encodable character is found */
- const ICONV_TRUNCATES = 1;
-
- /** Iconv does not support //IGNORE, making it unusable for
- * transcoding purposes */
- const ICONV_UNUSABLE = 2;
-
- /**
- * glibc iconv has a known bug where it doesn't handle the magic
- * //IGNORE stanza correctly. In particular, rather than ignore
- * characters, it will return an EILSEQ after consuming some number
- * of characters, and expect you to restart iconv as if it were
- * an E2BIG. Old versions of PHP did not respect the errno, and
- * returned the fragment, so as a result you would see iconv
- * mysteriously truncating output. We can work around this by
- * manually chopping our input into segments of about 8000
- * characters, as long as PHP ignores the error code. If PHP starts
- * paying attention to the error code, iconv becomes unusable.
- *
- * @return int Error code indicating severity of bug.
- */
- public static function testIconvTruncateBug()
- {
- static $code = null;
- if ($code === null) {
- // better not use iconv, otherwise infinite loop!
- $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
- if ($r === false) {
- $code = self::ICONV_UNUSABLE;
- } elseif (($c = strlen($r)) < 9000) {
- $code = self::ICONV_TRUNCATES;
- } elseif ($c > 9000) {
- trigger_error(
- 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
- 'include your iconv version as per phpversion()',
- E_USER_ERROR
- );
- } else {
- $code = self::ICONV_OK;
- }
- }
- return $code;
- }
-
- /**
- * This expensive function tests whether or not a given character
- * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
- * fail this test, and require special processing. Variable width
- * encodings shouldn't ever fail.
- *
- * @param string $encoding Encoding name to test, as per iconv format
- * @param bool $bypass Whether or not to bypass the precompiled arrays.
- * @return Array of UTF-8 characters to their corresponding ASCII,
- * which can be used to "undo" any overzealous iconv action.
- */
- public static function testEncodingSupportsASCII($encoding, $bypass = false)
- {
- // All calls to iconv here are unsafe, proof by case analysis:
- // If ICONV_OK, no difference.
- // If ICONV_TRUNCATE, all calls involve one character inputs,
- // so bug is not triggered.
- // If ICONV_UNUSABLE, this call is irrelevant
- static $encodings = array();
- if (!$bypass) {
- if (isset($encodings[$encoding])) {
- return $encodings[$encoding];
- }
- $lenc = strtolower($encoding);
- switch ($lenc) {
- case 'shift_jis':
- return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
- case 'johab':
- return array("\xE2\x82\xA9" => '\\');
- }
- if (strpos($lenc, 'iso-8859-') === 0) {
- return array();
- }
- }
- $ret = array();
- if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
- return false;
- }
- for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
- $c = chr($i); // UTF-8 char
- $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
- if ($r === '' ||
- // This line is needed for iconv implementations that do not
- // omit characters that do not exist in the target character set
- ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
- ) {
- // Reverse engineer: what's the UTF-8 equiv of this byte
- // sequence? This assumes that there's no variable width
- // encoding that doesn't support ASCII.
- $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
- }
- }
- $encodings[$encoding] = $ret;
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/EntityParser.php b/library/HTMLPurifier/EntityParser.php
deleted file mode 100644
index 61529dcd9..000000000
--- a/library/HTMLPurifier/EntityParser.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-
-// if want to implement error collecting here, we'll need to use some sort
-// of global data (probably trigger_error) because it's impossible to pass
-// $config or $context to the callback functions.
-
-/**
- * Handles referencing and derefencing character entities
- */
-class HTMLPurifier_EntityParser
-{
-
- /**
- * Reference to entity lookup table.
- * @type HTMLPurifier_EntityLookup
- */
- protected $_entity_lookup;
-
- /**
- * Callback regex string for parsing entities.
- * @type string
- */
- protected $_substituteEntitiesRegex =
- '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
- // 1. hex 2. dec 3. string (XML style)
-
- /**
- * Decimal to parsed string conversion table for special entities.
- * @type array
- */
- protected $_special_dec2str =
- array(
- 34 => '"',
- 38 => '&',
- 39 => "'",
- 60 => '<',
- 62 => '>'
- );
-
- /**
- * Stripped entity names to decimal conversion table for special entities.
- * @type array
- */
- protected $_special_ent2dec =
- array(
- 'quot' => 34,
- 'amp' => 38,
- 'lt' => 60,
- 'gt' => 62
- );
-
- /**
- * Substitutes non-special entities with their parsed equivalents. Since
- * running this whenever you have parsed character is t3h 5uck, we run
- * it before everything else.
- *
- * @param string $string String to have non-special entities parsed.
- * @return string Parsed string.
- */
- public function substituteNonSpecialEntities($string)
- {
- // it will try to detect missing semicolons, but don't rely on it
- return preg_replace_callback(
- $this->_substituteEntitiesRegex,
- array($this, 'nonSpecialEntityCallback'),
- $string
- );
- }
-
- /**
- * Callback function for substituteNonSpecialEntities() that does the work.
- *
- * @param array $matches PCRE matches array, with 0 the entire match, and
- * either index 1, 2 or 3 set with a hex value, dec value,
- * or string (respectively).
- * @return string Replacement string.
- */
-
- protected function nonSpecialEntityCallback($matches)
- {
- // replaces all but big five
- $entity = $matches[0];
- $is_num = (@$matches[0][1] === '#');
- if ($is_num) {
- $is_hex = (@$entity[2] === 'x');
- $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
- // abort for special characters
- if (isset($this->_special_dec2str[$code])) {
- return $entity;
- }
- return HTMLPurifier_Encoder::unichr($code);
- } else {
- if (isset($this->_special_ent2dec[$matches[3]])) {
- return $entity;
- }
- if (!$this->_entity_lookup) {
- $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
- }
- if (isset($this->_entity_lookup->table[$matches[3]])) {
- return $this->_entity_lookup->table[$matches[3]];
- } else {
- return $entity;
- }
- }
- }
-
- /**
- * Substitutes only special entities with their parsed equivalents.
- *
- * @notice We try to avoid calling this function because otherwise, it
- * would have to be called a lot (for every parsed section).
- *
- * @param string $string String to have non-special entities parsed.
- * @return string Parsed string.
- */
- public function substituteSpecialEntities($string)
- {
- return preg_replace_callback(
- $this->_substituteEntitiesRegex,
- array($this, 'specialEntityCallback'),
- $string
- );
- }
-
- /**
- * Callback function for substituteSpecialEntities() that does the work.
- *
- * This callback has same syntax as nonSpecialEntityCallback().
- *
- * @param array $matches PCRE-style matches array, with 0 the entire match, and
- * either index 1, 2 or 3 set with a hex value, dec value,
- * or string (respectively).
- * @return string Replacement string.
- */
- protected function specialEntityCallback($matches)
- {
- $entity = $matches[0];
- $is_num = (@$matches[0][1] === '#');
- if ($is_num) {
- $is_hex = (@$entity[2] === 'x');
- $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
- return isset($this->_special_dec2str[$int]) ?
- $this->_special_dec2str[$int] :
- $entity;
- } else {
- return isset($this->_special_ent2dec[$matches[3]]) ?
- $this->_special_ent2dec[$matches[3]] :
- $entity;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
deleted file mode 100644
index 08e62c16b..000000000
--- a/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
+++ /dev/null
@@ -1,338 +0,0 @@
-<?php
-
-// why is this a top level function? Because PHP 5.2.0 doesn't seem to
-// understand how to interpret this filter if it's a static method.
-// It's all really silly, but if we go this route it might be reasonable
-// to coalesce all of these methods into one.
-function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
-{
-}
-
-/**
- * This filter extracts <style> blocks from input HTML, cleans them up
- * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
- * so they can be used elsewhere in the document.
- *
- * @note
- * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
- * sample usage.
- *
- * @note
- * This filter can also be used on stylesheets not included in the
- * document--something purists would probably prefer. Just directly
- * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
- */
-class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
-{
- /**
- * @type string
- */
- public $name = 'ExtractStyleBlocks';
-
- /**
- * @type array
- */
- private $_styleMatches = array();
-
- /**
- * @type csstidy
- */
- private $_tidy;
-
- /**
- * @type HTMLPurifier_AttrDef_HTML_ID
- */
- private $_id_attrdef;
-
- /**
- * @type HTMLPurifier_AttrDef_CSS_Ident
- */
- private $_class_attrdef;
-
- /**
- * @type HTMLPurifier_AttrDef_Enum
- */
- private $_enum_attrdef;
-
- public function __construct()
- {
- $this->_tidy = new csstidy();
- $this->_tidy->set_cfg('lowercase_s', false);
- $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
- $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
- $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
- array(
- 'first-child',
- 'link',
- 'visited',
- 'active',
- 'hover',
- 'focus'
- )
- );
- }
-
- /**
- * Save the contents of CSS blocks to style matches
- * @param array $matches preg_replace style $matches array
- */
- protected function styleCallback($matches)
- {
- $this->_styleMatches[] = $matches[1];
- }
-
- /**
- * Removes inline <style> tags from HTML, saves them for later use
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @todo Extend to indicate non-text/css style blocks
- */
- public function preFilter($html, $config, $context)
- {
- $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
- if ($tidy !== null) {
- $this->_tidy = $tidy;
- }
- $html = preg_replace_callback('#<style(?:\s.*)?>(.+)</style>#isU', array($this, 'styleCallback'), $html);
- $style_blocks = $this->_styleMatches;
- $this->_styleMatches = array(); // reset
- $context->register('StyleBlocks', $style_blocks); // $context must not be reused
- if ($this->_tidy) {
- foreach ($style_blocks as &$style) {
- $style = $this->cleanCSS($style, $config, $context);
- }
- }
- return $html;
- }
-
- /**
- * Takes CSS (the stuff found in <style>) and cleans it.
- * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
- * @param string $css CSS styling to clean
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @throws HTMLPurifier_Exception
- * @return string Cleaned CSS
- */
- public function cleanCSS($css, $config, $context)
- {
- // prepare scope
- $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
- if ($scope !== null) {
- $scopes = array_map('trim', explode(',', $scope));
- } else {
- $scopes = array();
- }
- // remove comments from CSS
- $css = trim($css);
- if (strncmp('<!--', $css, 4) === 0) {
- $css = substr($css, 4);
- }
- if (strlen($css) > 3 && substr($css, -3) == '-->') {
- $css = substr($css, 0, -3);
- }
- $css = trim($css);
- set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
- $this->_tidy->parse($css);
- restore_error_handler();
- $css_definition = $config->getDefinition('CSS');
- $html_definition = $config->getDefinition('HTML');
- $new_css = array();
- foreach ($this->_tidy->css as $k => $decls) {
- // $decls are all CSS declarations inside an @ selector
- $new_decls = array();
- foreach ($decls as $selector => $style) {
- $selector = trim($selector);
- if ($selector === '') {
- continue;
- } // should not happen
- // Parse the selector
- // Here is the relevant part of the CSS grammar:
- //
- // ruleset
- // : selector [ ',' S* selector ]* '{' ...
- // selector
- // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
- // combinator
- // : '+' S*
- // : '>' S*
- // simple_selector
- // : element_name [ HASH | class | attrib | pseudo ]*
- // | [ HASH | class | attrib | pseudo ]+
- // element_name
- // : IDENT | '*'
- // ;
- // class
- // : '.' IDENT
- // ;
- // attrib
- // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
- // [ IDENT | STRING ] S* ]? ']'
- // ;
- // pseudo
- // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
- // ;
- //
- // For reference, here are the relevant tokens:
- //
- // HASH #{name}
- // IDENT {ident}
- // INCLUDES ==
- // DASHMATCH |=
- // STRING {string}
- // FUNCTION {ident}\(
- //
- // And the lexical scanner tokens
- //
- // name {nmchar}+
- // nmchar [_a-z0-9-]|{nonascii}|{escape}
- // nonascii [\240-\377]
- // escape {unicode}|\\[^\r\n\f0-9a-f]
- // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
- // ident -?{nmstart}{nmchar*}
- // nmstart [_a-z]|{nonascii}|{escape}
- // string {string1}|{string2}
- // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
- // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
- //
- // We'll implement a subset (in order to reduce attack
- // surface); in particular:
- //
- // - No Unicode support
- // - No escapes support
- // - No string support (by proxy no attrib support)
- // - element_name is matched against allowed
- // elements (some people might find this
- // annoying...)
- // - Pseudo-elements one of :first-child, :link,
- // :visited, :active, :hover, :focus
-
- // handle ruleset
- $selectors = array_map('trim', explode(',', $selector));
- $new_selectors = array();
- foreach ($selectors as $sel) {
- // split on +, > and spaces
- $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
- // even indices are chunks, odd indices are
- // delimiters
- $nsel = null;
- $delim = null; // guaranteed to be non-null after
- // two loop iterations
- for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
- $x = $basic_selectors[$i];
- if ($i % 2) {
- // delimiter
- if ($x === ' ') {
- $delim = ' ';
- } else {
- $delim = ' ' . $x . ' ';
- }
- } else {
- // simple selector
- $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
- $sdelim = null;
- $nx = null;
- for ($j = 0, $cc = count($components); $j < $cc; $j++) {
- $y = $components[$j];
- if ($j === 0) {
- if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
- $nx = $y;
- } else {
- // $nx stays null; this matters
- // if we don't manage to find
- // any valid selector content,
- // in which case we ignore the
- // outer $delim
- }
- } elseif ($j % 2) {
- // set delimiter
- $sdelim = $y;
- } else {
- $attrdef = null;
- if ($sdelim === '#') {
- $attrdef = $this->_id_attrdef;
- } elseif ($sdelim === '.') {
- $attrdef = $this->_class_attrdef;
- } elseif ($sdelim === ':') {
- $attrdef = $this->_enum_attrdef;
- } else {
- throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
- }
- $r = $attrdef->validate($y, $config, $context);
- if ($r !== false) {
- if ($r !== true) {
- $y = $r;
- }
- if ($nx === null) {
- $nx = '';
- }
- $nx .= $sdelim . $y;
- }
- }
- }
- if ($nx !== null) {
- if ($nsel === null) {
- $nsel = $nx;
- } else {
- $nsel .= $delim . $nx;
- }
- } else {
- // delimiters to the left of invalid
- // basic selector ignored
- }
- }
- }
- if ($nsel !== null) {
- if (!empty($scopes)) {
- foreach ($scopes as $s) {
- $new_selectors[] = "$s $nsel";
- }
- } else {
- $new_selectors[] = $nsel;
- }
- }
- }
- if (empty($new_selectors)) {
- continue;
- }
- $selector = implode(', ', $new_selectors);
- foreach ($style as $name => $value) {
- if (!isset($css_definition->info[$name])) {
- unset($style[$name]);
- continue;
- }
- $def = $css_definition->info[$name];
- $ret = $def->validate($value, $config, $context);
- if ($ret === false) {
- unset($style[$name]);
- } else {
- $style[$name] = $ret;
- }
- }
- $new_decls[$selector] = $style;
- }
- $new_css[$k] = $new_decls;
- }
- // remove stuff that shouldn't be used, could be reenabled
- // after security risks are analyzed
- $this->_tidy->css = $new_css;
- $this->_tidy->import = array();
- $this->_tidy->charset = null;
- $this->_tidy->namespace = null;
- $css = $this->_tidy->print->plain();
- // we are going to escape any special characters <>& to ensure
- // that no funny business occurs (i.e. </style> in a font-family prop).
- if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
- $css = str_replace(
- array('<', '>', '&'),
- array('\3C ', '\3E ', '\26 '),
- $css
- );
- }
- return $css;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Filter/YouTube.php b/library/HTMLPurifier/Filter/YouTube.php
deleted file mode 100644
index 411519ad6..000000000
--- a/library/HTMLPurifier/Filter/YouTube.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
-{
-
- /**
- * @type string
- */
- public $name = 'YouTube';
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public function preFilter($html, $config, $context)
- {
- $pre_regex = '#<object[^>]+>.+?' .
- 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
- $pre_replace = '<span class="youtube-embed">\1</span>';
- return preg_replace($pre_regex, $pre_replace, $html);
- }
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- public function postFilter($html, $config, $context)
- {
- $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
- return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
- }
-
- /**
- * @param $url
- * @return string
- */
- protected function armorUrl($url)
- {
- return str_replace('--', '-&#45;', $url);
- }
-
- /**
- * @param array $matches
- * @return string
- */
- protected function postFilterCallback($matches)
- {
- $url = $this->armorUrl($matches[1]);
- return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
- 'data="http://www.youtube.com/' . $url . '">' .
- '<param name="movie" value="http://www.youtube.com/' . $url . '"></param>' .
- '<!--[if IE]>' .
- '<embed src="http://www.youtube.com/' . $url . '"' .
- 'type="application/x-shockwave-flash"' .
- 'wmode="transparent" width="425" height="350" />' .
- '<![endif]-->' .
- '</object>';
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/HTMLModuleManager.php b/library/HTMLPurifier/HTMLModuleManager.php
deleted file mode 100644
index f3a17cb03..000000000
--- a/library/HTMLPurifier/HTMLModuleManager.php
+++ /dev/null
@@ -1,459 +0,0 @@
-<?php
-
-class HTMLPurifier_HTMLModuleManager
-{
-
- /**
- * @type HTMLPurifier_DoctypeRegistry
- */
- public $doctypes;
-
- /**
- * Instance of current doctype.
- * @type string
- */
- public $doctype;
-
- /**
- * @type HTMLPurifier_AttrTypes
- */
- public $attrTypes;
-
- /**
- * Active instances of modules for the specified doctype are
- * indexed, by name, in this array.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $modules = array();
-
- /**
- * Array of recognized HTMLPurifier_HTMLModule instances,
- * indexed by module's class name. This array is usually lazy loaded, but a
- * user can overload a module by pre-emptively registering it.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $registeredModules = array();
-
- /**
- * List of extra modules that were added by the user
- * using addModule(). These get unconditionally merged into the current doctype, whatever
- * it may be.
- * @type HTMLPurifier_HTMLModule[]
- */
- public $userModules = array();
-
- /**
- * Associative array of element name to list of modules that have
- * definitions for the element; this array is dynamically filled.
- * @type array
- */
- public $elementLookup = array();
-
- /**
- * List of prefixes we should use for registering small names.
- * @type array
- */
- public $prefixes = array('HTMLPurifier_HTMLModule_');
-
- /**
- * @type HTMLPurifier_ContentSets
- */
- public $contentSets;
-
- /**
- * @type HTMLPurifier_AttrCollections
- */
- public $attrCollections;
-
- /**
- * If set to true, unsafe elements and attributes will be allowed.
- * @type bool
- */
- public $trusted = false;
-
- public function __construct()
- {
- // editable internal objects
- $this->attrTypes = new HTMLPurifier_AttrTypes();
- $this->doctypes = new HTMLPurifier_DoctypeRegistry();
-
- // setup basic modules
- $common = array(
- 'CommonAttributes', 'Text', 'Hypertext', 'List',
- 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
- 'StyleAttribute',
- // Unsafe:
- 'Scripting', 'Object', 'Forms',
- // Sorta legacy, but present in strict:
- 'Name',
- );
- $transitional = array('Legacy', 'Target', 'Iframe');
- $xml = array('XMLCommonAttributes');
- $non_xml = array('NonXMLCommonAttributes');
-
- // setup basic doctypes
- $this->doctypes->register(
- 'HTML 4.01 Transitional',
- false,
- array_merge($common, $transitional, $non_xml),
- array('Tidy_Transitional', 'Tidy_Proprietary'),
- array(),
- '-//W3C//DTD HTML 4.01 Transitional//EN',
- 'http://www.w3.org/TR/html4/loose.dtd'
- );
-
- $this->doctypes->register(
- 'HTML 4.01 Strict',
- false,
- array_merge($common, $non_xml),
- array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD HTML 4.01//EN',
- 'http://www.w3.org/TR/html4/strict.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.0 Transitional',
- true,
- array_merge($common, $transitional, $xml, $non_xml),
- array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD XHTML 1.0 Transitional//EN',
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.0 Strict',
- true,
- array_merge($common, $xml, $non_xml),
- array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
- array(),
- '-//W3C//DTD XHTML 1.0 Strict//EN',
- 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
- );
-
- $this->doctypes->register(
- 'XHTML 1.1',
- true,
- // Iframe is a real XHTML 1.1 module, despite being
- // "transitional"!
- array_merge($common, $xml, array('Ruby', 'Iframe')),
- array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
- array(),
- '-//W3C//DTD XHTML 1.1//EN',
- 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
- );
-
- }
-
- /**
- * Registers a module to the recognized module list, useful for
- * overloading pre-existing modules.
- * @param $module Mixed: string module name, with or without
- * HTMLPurifier_HTMLModule prefix, or instance of
- * subclass of HTMLPurifier_HTMLModule.
- * @param $overload Boolean whether or not to overload previous modules.
- * If this is not set, and you do overload a module,
- * HTML Purifier will complain with a warning.
- * @note This function will not call autoload, you must instantiate
- * (and thus invoke) autoload outside the method.
- * @note If a string is passed as a module name, different variants
- * will be tested in this order:
- * - Check for HTMLPurifier_HTMLModule_$name
- * - Check all prefixes with $name in order they were added
- * - Check for literal object name
- * - Throw fatal error
- * If your object name collides with an internal class, specify
- * your module manually. All modules must have been included
- * externally: registerModule will not perform inclusions for you!
- */
- public function registerModule($module, $overload = false)
- {
- if (is_string($module)) {
- // attempt to load the module
- $original_module = $module;
- $ok = false;
- foreach ($this->prefixes as $prefix) {
- $module = $prefix . $original_module;
- if (class_exists($module)) {
- $ok = true;
- break;
- }
- }
- if (!$ok) {
- $module = $original_module;
- if (!class_exists($module)) {
- trigger_error(
- $original_module . ' module does not exist',
- E_USER_ERROR
- );
- return;
- }
- }
- $module = new $module();
- }
- if (empty($module->name)) {
- trigger_error('Module instance of ' . get_class($module) . ' must have name');
- return;
- }
- if (!$overload && isset($this->registeredModules[$module->name])) {
- trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
- }
- $this->registeredModules[$module->name] = $module;
- }
-
- /**
- * Adds a module to the current doctype by first registering it,
- * and then tacking it on to the active doctype
- */
- public function addModule($module)
- {
- $this->registerModule($module);
- if (is_object($module)) {
- $module = $module->name;
- }
- $this->userModules[] = $module;
- }
-
- /**
- * Adds a class prefix that registerModule() will use to resolve a
- * string name to a concrete class
- */
- public function addPrefix($prefix)
- {
- $this->prefixes[] = $prefix;
- }
-
- /**
- * Performs processing on modules, after being called you may
- * use getElement() and getElements()
- * @param HTMLPurifier_Config $config
- */
- public function setup($config)
- {
- $this->trusted = $config->get('HTML.Trusted');
-
- // generate
- $this->doctype = $this->doctypes->make($config);
- $modules = $this->doctype->modules;
-
- // take out the default modules that aren't allowed
- $lookup = $config->get('HTML.AllowedModules');
- $special_cases = $config->get('HTML.CoreModules');
-
- if (is_array($lookup)) {
- foreach ($modules as $k => $m) {
- if (isset($special_cases[$m])) {
- continue;
- }
- if (!isset($lookup[$m])) {
- unset($modules[$k]);
- }
- }
- }
-
- // custom modules
- if ($config->get('HTML.Proprietary')) {
- $modules[] = 'Proprietary';
- }
- if ($config->get('HTML.SafeObject')) {
- $modules[] = 'SafeObject';
- }
- if ($config->get('HTML.SafeEmbed')) {
- $modules[] = 'SafeEmbed';
- }
- if ($config->get('HTML.SafeScripting') !== array()) {
- $modules[] = 'SafeScripting';
- }
- if ($config->get('HTML.Nofollow')) {
- $modules[] = 'Nofollow';
- }
- if ($config->get('HTML.TargetBlank')) {
- $modules[] = 'TargetBlank';
- }
-
- // merge in custom modules
- $modules = array_merge($modules, $this->userModules);
-
- foreach ($modules as $module) {
- $this->processModule($module);
- $this->modules[$module]->setup($config);
- }
-
- foreach ($this->doctype->tidyModules as $module) {
- $this->processModule($module);
- $this->modules[$module]->setup($config);
- }
-
- // prepare any injectors
- foreach ($this->modules as $module) {
- $n = array();
- foreach ($module->info_injector as $injector) {
- if (!is_object($injector)) {
- $class = "HTMLPurifier_Injector_$injector";
- $injector = new $class;
- }
- $n[$injector->name] = $injector;
- }
- $module->info_injector = $n;
- }
-
- // setup lookup table based on all valid modules
- foreach ($this->modules as $module) {
- foreach ($module->info as $name => $def) {
- if (!isset($this->elementLookup[$name])) {
- $this->elementLookup[$name] = array();
- }
- $this->elementLookup[$name][] = $module->name;
- }
- }
-
- // note the different choice
- $this->contentSets = new HTMLPurifier_ContentSets(
- // content set assembly deals with all possible modules,
- // not just ones deemed to be "safe"
- $this->modules
- );
- $this->attrCollections = new HTMLPurifier_AttrCollections(
- $this->attrTypes,
- // there is no way to directly disable a global attribute,
- // but using AllowedAttributes or simply not including
- // the module in your custom doctype should be sufficient
- $this->modules
- );
- }
-
- /**
- * Takes a module and adds it to the active module collection,
- * registering it if necessary.
- */
- public function processModule($module)
- {
- if (!isset($this->registeredModules[$module]) || is_object($module)) {
- $this->registerModule($module);
- }
- $this->modules[$module] = $this->registeredModules[$module];
- }
-
- /**
- * Retrieves merged element definitions.
- * @return Array of HTMLPurifier_ElementDef
- */
- public function getElements()
- {
- $elements = array();
- foreach ($this->modules as $module) {
- if (!$this->trusted && !$module->safe) {
- continue;
- }
- foreach ($module->info as $name => $v) {
- if (isset($elements[$name])) {
- continue;
- }
- $elements[$name] = $this->getElement($name);
- }
- }
-
- // remove dud elements, this happens when an element that
- // appeared to be safe actually wasn't
- foreach ($elements as $n => $v) {
- if ($v === false) {
- unset($elements[$n]);
- }
- }
-
- return $elements;
-
- }
-
- /**
- * Retrieves a single merged element definition
- * @param string $name Name of element
- * @param bool $trusted Boolean trusted overriding parameter: set to true
- * if you want the full version of an element
- * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
- * @note You may notice that modules are getting iterated over twice (once
- * in getElements() and once here). This
- * is because
- */
- public function getElement($name, $trusted = null)
- {
- if (!isset($this->elementLookup[$name])) {
- return false;
- }
-
- // setup global state variables
- $def = false;
- if ($trusted === null) {
- $trusted = $this->trusted;
- }
-
- // iterate through each module that has registered itself to this
- // element
- foreach ($this->elementLookup[$name] as $module_name) {
- $module = $this->modules[$module_name];
-
- // refuse to create/merge from a module that is deemed unsafe--
- // pretend the module doesn't exist--when trusted mode is not on.
- if (!$trusted && !$module->safe) {
- continue;
- }
-
- // clone is used because, ideally speaking, the original
- // definition should not be modified. Usually, this will
- // make no difference, but for consistency's sake
- $new_def = clone $module->info[$name];
-
- if (!$def && $new_def->standalone) {
- $def = $new_def;
- } elseif ($def) {
- // This will occur even if $new_def is standalone. In practice,
- // this will usually result in a full replacement.
- $def->mergeIn($new_def);
- } else {
- // :TODO:
- // non-standalone definitions that don't have a standalone
- // to merge into could be deferred to the end
- // HOWEVER, it is perfectly valid for a non-standalone
- // definition to lack a standalone definition, even
- // after all processing: this allows us to safely
- // specify extra attributes for elements that may not be
- // enabled all in one place. In particular, this might
- // be the case for trusted elements. WARNING: care must
- // be taken that the /extra/ definitions are all safe.
- continue;
- }
-
- // attribute value expansions
- $this->attrCollections->performInclusions($def->attr);
- $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);
-
- // descendants_are_inline, for ChildDef_Chameleon
- if (is_string($def->content_model) &&
- strpos($def->content_model, 'Inline') !== false) {
- if ($name != 'del' && $name != 'ins') {
- // this is for you, ins/del
- $def->descendants_are_inline = true;
- }
- }
-
- $this->contentSets->generateChildDef($def, $module);
- }
-
- // This can occur if there is a blank definition, but no base to
- // mix it in with
- if (!$def) {
- return false;
- }
-
- // add information on required attributes
- foreach ($def->attr as $attr_name => $attr_def) {
- if ($attr_def->required) {
- $def->required_attr[] = $attr_name;
- }
- }
- return $def;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/Linkify.php b/library/HTMLPurifier/Injector/Linkify.php
deleted file mode 100644
index 069708c25..000000000
--- a/library/HTMLPurifier/Injector/Linkify.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/**
- * Injector that converts http, https and ftp text URLs to actual links.
- */
-class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
-{
- /**
- * @type string
- */
- public $name = 'Linkify';
-
- /**
- * @type array
- */
- public $needed = array('a' => array('href'));
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleText(&$token)
- {
- if (!$this->allowsElement('a')) {
- return;
- }
-
- if (strpos($token->data, '://') === false) {
- // our really quick heuristic failed, abort
- // this may not work so well if we want to match things like
- // "google.com", but then again, most people don't
- return;
- }
-
- // there is/are URL(s). Let's split the string:
- // Note: this regex is extremely permissive
- $bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-
- $token = array();
-
- // $i = index
- // $c = count
- // $l = is link
- for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
- if (!$l) {
- if ($bits[$i] === '') {
- continue;
- }
- $token[] = new HTMLPurifier_Token_Text($bits[$i]);
- } else {
- $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
- $token[] = new HTMLPurifier_Token_Text($bits[$i]);
- $token[] = new HTMLPurifier_Token_End('a');
- }
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/RemoveEmpty.php b/library/HTMLPurifier/Injector/RemoveEmpty.php
deleted file mode 100644
index cd885722e..000000000
--- a/library/HTMLPurifier/Injector/RemoveEmpty.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
-{
- /**
- * @type HTMLPurifier_Context
- */
- private $context;
-
- /**
- * @type HTMLPurifier_Config
- */
- private $config;
-
- /**
- * @type HTMLPurifier_AttrValidator
- */
- private $attrValidator;
-
- /**
- * @type bool
- */
- private $removeNbsp;
-
- /**
- * @type bool
- */
- private $removeNbspExceptions;
-
- /**
- * @type array
- * TODO: make me configurable
- */
- private $_exclude = array('colgroup' => 1, 'th' => 1, 'td' => 1, 'iframe' => 1);
-
- /**
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return void
- */
- public function prepare($config, $context)
- {
- parent::prepare($config, $context);
- $this->config = $config;
- $this->context = $context;
- $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
- $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
- $this->attrValidator = new HTMLPurifier_AttrValidator();
- }
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleElement(&$token)
- {
- if (!$token instanceof HTMLPurifier_Token_Start) {
- return;
- }
- $next = false;
- $deleted = 1; // the current tag
- for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
- $next = $this->inputZipper->back[$i];
- if ($next instanceof HTMLPurifier_Token_Text) {
- if ($next->is_whitespace) {
- continue;
- }
- if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
- $plain = str_replace("\xC2\xA0", "", $next->data);
- $isWsOrNbsp = $plain === '' || ctype_space($plain);
- if ($isWsOrNbsp) {
- continue;
- }
- }
- }
- break;
- }
- if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
- if (isset($this->_exclude[$token->name])) {
- return;
- }
- $this->attrValidator->validateToken($token, $this->config, $this->context);
- $token->armor['ValidateAttributes'] = true;
- if (isset($token->attr['id']) || isset($token->attr['name'])) {
- return;
- }
- $token = $deleted + 1;
- for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
- $prev = $this->inputZipper->front[$b];
- if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
- continue;
- }
- break;
- }
- // This is safe because we removed the token that triggered this.
- $this->rewindOffset($b+$deleted);
- return;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/SafeObject.php b/library/HTMLPurifier/Injector/SafeObject.php
deleted file mode 100644
index 3d17e07af..000000000
--- a/library/HTMLPurifier/Injector/SafeObject.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-
-/**
- * Adds important param elements to inside of object in order to make
- * things safe.
- */
-class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
-{
- /**
- * @type string
- */
- public $name = 'SafeObject';
-
- /**
- * @type array
- */
- public $needed = array('object', 'param');
-
- /**
- * @type array
- */
- protected $objectStack = array();
-
- /**
- * @type array
- */
- protected $paramStack = array();
-
- /**
- * Keep this synchronized with AttrTransform/SafeParam.php.
- * @type array
- */
- protected $addParam = array(
- 'allowScriptAccess' => 'never',
- 'allowNetworking' => 'internal',
- );
-
- /**
- * @type array
- */
- protected $allowedParam = array(
- 'wmode' => true,
- 'movie' => true,
- 'flashvars' => true,
- 'src' => true,
- 'allowFullScreen' => true, // if omitted, assume to be 'false'
- );
-
- /**
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return void
- */
- public function prepare($config, $context)
- {
- parent::prepare($config, $context);
- }
-
- /**
- * @param HTMLPurifier_Token $token
- */
- public function handleElement(&$token)
- {
- if ($token->name == 'object') {
- $this->objectStack[] = $token;
- $this->paramStack[] = array();
- $new = array($token);
- foreach ($this->addParam as $name => $value) {
- $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
- }
- $token = $new;
- } elseif ($token->name == 'param') {
- $nest = count($this->currentNesting) - 1;
- if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
- $i = count($this->objectStack) - 1;
- if (!isset($token->attr['name'])) {
- $token = false;
- return;
- }
- $n = $token->attr['name'];
- // We need this fix because YouTube doesn't supply a data
- // attribute, which we need if a type is specified. This is
- // *very* Flash specific.
- if (!isset($this->objectStack[$i]->attr['data']) &&
- ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
- ) {
- $this->objectStack[$i]->attr['data'] = $token->attr['value'];
- }
- // Check if the parameter is the correct value but has not
- // already been added
- if (!isset($this->paramStack[$i][$n]) &&
- isset($this->addParam[$n]) &&
- $token->attr['name'] === $this->addParam[$n]) {
- // keep token, and add to param stack
- $this->paramStack[$i][$n] = true;
- } elseif (isset($this->allowedParam[$n])) {
- // keep token, don't do anything to it
- // (could possibly check for duplicates here)
- } else {
- $token = false;
- }
- } else {
- // not directly inside an object, DENY!
- $token = false;
- }
- }
- }
-
- public function handleEnd(&$token)
- {
- // This is the WRONG way of handling the object and param stacks;
- // we should be inserting them directly on the relevant object tokens
- // so that the global stack handling handles it.
- if ($token->name == 'object') {
- array_pop($this->objectStack);
- array_pop($this->paramStack);
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer.php b/library/HTMLPurifier/Lexer.php
deleted file mode 100644
index 43732621d..000000000
--- a/library/HTMLPurifier/Lexer.php
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-
-/**
- * Forgivingly lexes HTML (SGML-style) markup into tokens.
- *
- * A lexer parses a string of SGML-style markup and converts them into
- * corresponding tokens. It doesn't check for well-formedness, although its
- * internal mechanism may make this automatic (such as the case of
- * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose
- * from.
- *
- * A lexer is HTML-oriented: it might work with XML, but it's not
- * recommended, as we adhere to a subset of the specification for optimization
- * reasons. This might change in the future. Also, most tokenizers are not
- * expected to handle DTDs or PIs.
- *
- * This class should not be directly instantiated, but you may use create() to
- * retrieve a default copy of the lexer. Being a supertype, this class
- * does not actually define any implementation, but offers commonly used
- * convenience functions for subclasses.
- *
- * @note The unit tests will instantiate this class for testing purposes, as
- * many of the utility functions require a class to be instantiated.
- * This means that, even though this class is not runnable, it will
- * not be declared abstract.
- *
- * @par
- *
- * @note
- * We use tokens rather than create a DOM representation because DOM would:
- *
- * @par
- * -# Require more processing and memory to create,
- * -# Is not streamable, and
- * -# Has the entire document structure (html and body not needed).
- *
- * @par
- * However, DOM is helpful in that it makes it easy to move around nodes
- * without a lot of lookaheads to see when a tag is closed. This is a
- * limitation of the token system and some workarounds would be nice.
- */
-class HTMLPurifier_Lexer
-{
-
- /**
- * Whether or not this lexer implements line-number/column-number tracking.
- * If it does, set to true.
- */
- public $tracksLineNumbers = false;
-
- // -- STATIC ----------------------------------------------------------
-
- /**
- * Retrieves or sets the default Lexer as a Prototype Factory.
- *
- * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
- * a few exceptions involving special features that only DirectLex
- * implements.
- *
- * @note The behavior of this class has changed, rather than accepting
- * a prototype object, it now accepts a configuration object.
- * To specify your own prototype, set %Core.LexerImpl to it.
- * This change in behavior de-singletonizes the lexer object.
- *
- * @param HTMLPurifier_Config $config
- * @return HTMLPurifier_Lexer
- * @throws HTMLPurifier_Exception
- */
- public static function create($config)
- {
- if (!($config instanceof HTMLPurifier_Config)) {
- $lexer = $config;
- trigger_error(
- "Passing a prototype to
- HTMLPurifier_Lexer::create() is deprecated, please instead
- use %Core.LexerImpl",
- E_USER_WARNING
- );
- } else {
- $lexer = $config->get('Core.LexerImpl');
- }
-
- $needs_tracking =
- $config->get('Core.MaintainLineNumbers') ||
- $config->get('Core.CollectErrors');
-
- $inst = null;
- if (is_object($lexer)) {
- $inst = $lexer;
- } else {
- if (is_null($lexer)) {
- do {
- // auto-detection algorithm
- if ($needs_tracking) {
- $lexer = 'DirectLex';
- break;
- }
-
- if (class_exists('DOMDocument') &&
- method_exists('DOMDocument', 'loadHTML') &&
- !extension_loaded('domxml')
- ) {
- // check for DOM support, because while it's part of the
- // core, it can be disabled compile time. Also, the PECL
- // domxml extension overrides the default DOM, and is evil
- // and nasty and we shan't bother to support it
- $lexer = 'DOMLex';
- } else {
- $lexer = 'DirectLex';
- }
- } while (0);
- } // do..while so we can break
-
- // instantiate recognized string names
- switch ($lexer) {
- case 'DOMLex':
- $inst = new HTMLPurifier_Lexer_DOMLex();
- break;
- case 'DirectLex':
- $inst = new HTMLPurifier_Lexer_DirectLex();
- break;
- case 'PH5P':
- $inst = new HTMLPurifier_Lexer_PH5P();
- break;
- default:
- throw new HTMLPurifier_Exception(
- "Cannot instantiate unrecognized Lexer type " .
- htmlspecialchars($lexer)
- );
- }
- }
-
- if (!$inst) {
- throw new HTMLPurifier_Exception('No lexer was instantiated');
- }
-
- // once PHP DOM implements native line numbers, or we
- // hack out something using XSLT, remove this stipulation
- if ($needs_tracking && !$inst->tracksLineNumbers) {
- throw new HTMLPurifier_Exception(
- 'Cannot use lexer that does not support line numbers with ' .
- 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
- );
- }
-
- return $inst;
-
- }
-
- // -- CONVENIENCE MEMBERS ---------------------------------------------
-
- public function __construct()
- {
- $this->_entity_parser = new HTMLPurifier_EntityParser();
- }
-
- /**
- * Most common entity to raw value conversion table for special entities.
- * @type array
- */
- protected $_special_entity2str =
- array(
- '&quot;' => '"',
- '&amp;' => '&',
- '&lt;' => '<',
- '&gt;' => '>',
- '&#39;' => "'",
- '&#039;' => "'",
- '&#x27;' => "'"
- );
-
- /**
- * Parses special entities into the proper characters.
- *
- * This string will translate escaped versions of the special characters
- * into the correct ones.
- *
- * @warning
- * You should be able to treat the output of this function as
- * completely parsed, but that's only because all other entities should
- * have been handled previously in substituteNonSpecialEntities()
- *
- * @param string $string String character data to be parsed.
- * @return string Parsed character data.
- */
- public function parseData($string)
- {
- // following functions require at least one character
- if ($string === '') {
- return '';
- }
-
- // subtracts amps that cannot possibly be escaped
- $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
- ($string[strlen($string) - 1] === '&' ? 1 : 0);
-
- if (!$num_amp) {
- return $string;
- } // abort if no entities
- $num_esc_amp = substr_count($string, '&amp;');
- $string = strtr($string, $this->_special_entity2str);
-
- // code duplication for sake of optimization, see above
- $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
- ($string[strlen($string) - 1] === '&' ? 1 : 0);
-
- if ($num_amp_2 <= $num_esc_amp) {
- return $string;
- }
-
- // hmm... now we have some uncommon entities. Use the callback.
- $string = $this->_entity_parser->substituteSpecialEntities($string);
- return $string;
- }
-
- /**
- * Lexes an HTML string into tokens.
- * @param $string String HTML.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[] array representation of HTML.
- */
- public function tokenizeHTML($string, $config, $context)
- {
- trigger_error('Call to abstract class', E_USER_ERROR);
- }
-
- /**
- * Translates CDATA sections into regular sections (through escaping).
- * @param string $string HTML string to process.
- * @return string HTML with CDATA sections escaped.
- */
- protected static function escapeCDATA($string)
- {
- return preg_replace_callback(
- '/<!\[CDATA\[(.+?)\]\]>/s',
- array('HTMLPurifier_Lexer', 'CDATACallback'),
- $string
- );
- }
-
- /**
- * Special CDATA case that is especially convoluted for <script>
- * @param string $string HTML string to process.
- * @return string HTML with CDATA sections escaped.
- */
- protected static function escapeCommentedCDATA($string)
- {
- return preg_replace_callback(
- '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
- array('HTMLPurifier_Lexer', 'CDATACallback'),
- $string
- );
- }
-
- /**
- * Special Internet Explorer conditional comments should be removed.
- * @param string $string HTML string to process.
- * @return string HTML with conditional comments removed.
- */
- protected static function removeIEConditional($string)
- {
- return preg_replace(
- '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
- '',
- $string
- );
- }
-
- /**
- * Callback function for escapeCDATA() that does the work.
- *
- * @warning Though this is public in order to let the callback happen,
- * calling it directly is not recommended.
- * @param array $matches PCRE matches array, with index 0 the entire match
- * and 1 the inside of the CDATA section.
- * @return string Escaped internals of the CDATA section.
- */
- protected static function CDATACallback($matches)
- {
- // not exactly sure why the character set is needed, but whatever
- return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
- }
-
- /**
- * Takes a piece of HTML and normalizes it by converting entities, fixing
- * encoding, extracting bits, and other good stuff.
- * @param string $html HTML.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- * @todo Consider making protected
- */
- public function normalize($html, $config, $context)
- {
- // normalize newlines to \n
- if ($config->get('Core.NormalizeNewlines')) {
- $html = str_replace("\r\n", "\n", $html);
- $html = str_replace("\r", "\n", $html);
- }
-
- if ($config->get('HTML.Trusted')) {
- // escape convoluted CDATA
- $html = $this->escapeCommentedCDATA($html);
- }
-
- // escape CDATA
- $html = $this->escapeCDATA($html);
-
- $html = $this->removeIEConditional($html);
-
- // extract body from document if applicable
- if ($config->get('Core.ConvertDocumentToFragment')) {
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
- $new_html = $this->extractBody($html);
- if ($e && $new_html != $html) {
- $e->send(E_WARNING, 'Lexer: Extracted body');
- }
- $html = $new_html;
- }
-
- // expand entities that aren't the big five
- $html = $this->_entity_parser->substituteNonSpecialEntities($html);
-
- // clean into wellformed UTF-8 string for an SGML context: this has
- // to be done after entity expansion because the entities sometimes
- // represent non-SGML characters (horror, horror!)
- $html = HTMLPurifier_Encoder::cleanUTF8($html);
-
- // if processing instructions are to removed, remove them now
- if ($config->get('Core.RemoveProcessingInstructions')) {
- $html = preg_replace('#<\?.+?\?>#s', '', $html);
- }
-
- return $html;
- }
-
- /**
- * Takes a string of HTML (fragment or document) and returns the content
- * @todo Consider making protected
- */
- public function extractBody($html)
- {
- $matches = array();
- $result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);
- if ($result) {
- return $matches[1];
- } else {
- return $html;
- }
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/DOMLex.php b/library/HTMLPurifier/Lexer/DOMLex.php
deleted file mode 100644
index 720754454..000000000
--- a/library/HTMLPurifier/Lexer/DOMLex.php
+++ /dev/null
@@ -1,280 +0,0 @@
-<?php
-
-/**
- * Parser that uses PHP 5's DOM extension (part of the core).
- *
- * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
- * It gives us a forgiving HTML parser, which we use to transform the HTML
- * into a DOM, and then into the tokens. It is blazingly fast (for large
- * documents, it performs twenty times faster than
- * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
- *
- * @note Any empty elements will have empty tokens associated with them, even if
- * this is prohibited by the spec. This is cannot be fixed until the spec
- * comes into play.
- *
- * @note PHP's DOM extension does not actually parse any entities, we use
- * our own function to do that.
- *
- * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
- * If this is a huge problem, due to the fact that HTML is hand
- * edited and you are unable to get a parser cache that caches the
- * the output of HTML Purifier while keeping the original HTML lying
- * around, you may want to run Tidy on the resulting output or use
- * HTMLPurifier_DirectLex
- */
-
-class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
-{
-
- /**
- * @type HTMLPurifier_TokenFactory
- */
- private $factory;
-
- public function __construct()
- {
- // setup the factory
- parent::__construct();
- $this->factory = new HTMLPurifier_TokenFactory();
- }
-
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- $html = $this->normalize($html, $config, $context);
-
- // attempt to armor stray angled brackets that cannot possibly
- // form tags and thus are probably being used as emoticons
- if ($config->get('Core.AggressivelyFixLt')) {
- $char = '[^a-z!\/]';
- $comment = "/<!--(.*?)(-->|\z)/is";
- $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
- do {
- $old = $html;
- $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
- } while ($html !== $old);
- $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
- }
-
- // preprocess html, essential for UTF-8
- $html = $this->wrapHTML($html, $config, $context);
-
- $doc = new DOMDocument();
- $doc->encoding = 'UTF-8'; // theoretically, the above has this covered
-
- set_error_handler(array($this, 'muteErrorHandler'));
- $doc->loadHTML($html);
- restore_error_handler();
-
- $tokens = array();
- $this->tokenizeDOM(
- $doc->getElementsByTagName('html')->item(0)-> // <html>
- getElementsByTagName('body')->item(0)-> // <body>
- getElementsByTagName('div')->item(0), // <div>
- $tokens
- );
- return $tokens;
- }
-
- /**
- * Iterative function that tokenizes a node, putting it into an accumulator.
- * To iterate is human, to recurse divine - L. Peter Deutsch
- * @param DOMNode $node DOMNode to be tokenized.
- * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
- * @return HTMLPurifier_Token of node appended to previously passed tokens.
- */
- protected function tokenizeDOM($node, &$tokens)
- {
- $level = 0;
- $nodes = array($level => new HTMLPurifier_Queue(array($node)));
- $closingNodes = array();
- do {
- while (!$nodes[$level]->isEmpty()) {
- $node = $nodes[$level]->shift(); // FIFO
- $collect = $level > 0 ? true : false;
- $needEndingTag = $this->createStartNode($node, $tokens, $collect);
- if ($needEndingTag) {
- $closingNodes[$level][] = $node;
- }
- if ($node->childNodes && $node->childNodes->length) {
- $level++;
- $nodes[$level] = new HTMLPurifier_Queue();
- foreach ($node->childNodes as $childNode) {
- $nodes[$level]->push($childNode);
- }
- }
- }
- $level--;
- if ($level && isset($closingNodes[$level])) {
- while ($node = array_pop($closingNodes[$level])) {
- $this->createEndNode($node, $tokens);
- }
- }
- } while ($level > 0);
- }
-
- /**
- * @param DOMNode $node DOMNode to be tokenized.
- * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
- * @param bool $collect Says whether or start and close are collected, set to
- * false at first recursion because it's the implicit DIV
- * tag you're dealing with.
- * @return bool if the token needs an endtoken
- * @todo data and tagName properties don't seem to exist in DOMNode?
- */
- protected function createStartNode($node, &$tokens, $collect)
- {
- // intercept non element nodes. WE MUST catch all of them,
- // but we're not getting the character reference nodes because
- // those should have been preprocessed
- if ($node->nodeType === XML_TEXT_NODE) {
- $tokens[] = $this->factory->createText($node->data);
- return false;
- } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
- // undo libxml's special treatment of <script> and <style> tags
- $last = end($tokens);
- $data = $node->data;
- // (note $node->tagname is already normalized)
- if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
- $new_data = trim($data);
- if (substr($new_data, 0, 4) === '<!--') {
- $data = substr($new_data, 4);
- if (substr($data, -3) === '-->') {
- $data = substr($data, 0, -3);
- } else {
- // Highly suspicious! Not sure what to do...
- }
- }
- }
- $tokens[] = $this->factory->createText($this->parseData($data));
- return false;
- } elseif ($node->nodeType === XML_COMMENT_NODE) {
- // this is code is only invoked for comments in script/style in versions
- // of libxml pre-2.6.28 (regular comments, of course, are still
- // handled regularly)
- $tokens[] = $this->factory->createComment($node->data);
- return false;
- } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
- // not-well tested: there may be other nodes we have to grab
- return false;
- }
-
- $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
-
- // We still have to make sure that the element actually IS empty
- if (!$node->childNodes->length) {
- if ($collect) {
- $tokens[] = $this->factory->createEmpty($node->tagName, $attr);
- }
- return false;
- } else {
- if ($collect) {
- $tokens[] = $this->factory->createStart(
- $tag_name = $node->tagName, // somehow, it get's dropped
- $attr
- );
- }
- return true;
- }
- }
-
- /**
- * @param DOMNode $node
- * @param HTMLPurifier_Token[] $tokens
- */
- protected function createEndNode($node, &$tokens)
- {
- $tokens[] = $this->factory->createEnd($node->tagName);
- }
-
-
- /**
- * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
- *
- * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
- * @return array Associative array of attributes.
- */
- protected function transformAttrToAssoc($node_map)
- {
- // NamedNodeMap is documented very well, so we're using undocumented
- // features, namely, the fact that it implements Iterator and
- // has a ->length attribute
- if ($node_map->length === 0) {
- return array();
- }
- $array = array();
- foreach ($node_map as $attr) {
- $array[$attr->name] = $attr->value;
- }
- return $array;
- }
-
- /**
- * An error handler that mutes all errors
- * @param int $errno
- * @param string $errstr
- */
- public function muteErrorHandler($errno, $errstr)
- {
- }
-
- /**
- * Callback function for undoing escaping of stray angled brackets
- * in comments
- * @param array $matches
- * @return string
- */
- public function callbackUndoCommentSubst($matches)
- {
- return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
- }
-
- /**
- * Callback function that entity-izes ampersands in comments so that
- * callbackUndoCommentSubst doesn't clobber them
- * @param array $matches
- * @return string
- */
- public function callbackArmorCommentEntities($matches)
- {
- return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
- }
-
- /**
- * Wraps an HTML fragment in the necessary HTML
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return string
- */
- protected function wrapHTML($html, $config, $context)
- {
- $def = $config->getDefinition('HTML');
- $ret = '';
-
- if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
- $ret .= '<!DOCTYPE html ';
- if (!empty($def->doctype->dtdPublic)) {
- $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
- }
- if (!empty($def->doctype->dtdSystem)) {
- $ret .= '"' . $def->doctype->dtdSystem . '" ';
- }
- $ret .= '>';
- }
-
- $ret .= '<html><head>';
- $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
- // No protection if $html contains a stray </div>!
- $ret .= '</head><body><div>' . $html . '</div></body></html>';
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/DirectLex.php b/library/HTMLPurifier/Lexer/DirectLex.php
deleted file mode 100644
index 746b6e315..000000000
--- a/library/HTMLPurifier/Lexer/DirectLex.php
+++ /dev/null
@@ -1,539 +0,0 @@
-<?php
-
-/**
- * Our in-house implementation of a parser.
- *
- * A pure PHP parser, DirectLex has absolutely no dependencies, making
- * it a reasonably good default for PHP4. Written with efficiency in mind,
- * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
- * pales in comparison to HTMLPurifier_Lexer_DOMLex.
- *
- * @todo Reread XML spec and document differences.
- */
-class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
-{
- /**
- * @type bool
- */
- public $tracksLineNumbers = true;
-
- /**
- * Whitespace characters for str(c)spn.
- * @type string
- */
- protected $_whitespace = "\x20\x09\x0D\x0A";
-
- /**
- * Callback function for script CDATA fudge
- * @param array $matches, in form of array(opening tag, contents, closing tag)
- * @return string
- */
- protected function scriptCallback($matches)
- {
- return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
- }
-
- /**
- * @param String $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array|HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- // special normalization for script tags without any armor
- // our "armor" heurstic is a < sign any number of whitespaces after
- // the first script tag
- if ($config->get('HTML.Trusted')) {
- $html = preg_replace_callback(
- '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
- array($this, 'scriptCallback'),
- $html
- );
- }
-
- $html = $this->normalize($html, $config, $context);
-
- $cursor = 0; // our location in the text
- $inside_tag = false; // whether or not we're parsing the inside of a tag
- $array = array(); // result array
-
- // This is also treated to mean maintain *column* numbers too
- $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');
-
- if ($maintain_line_numbers === null) {
- // automatically determine line numbering by checking
- // if error collection is on
- $maintain_line_numbers = $config->get('Core.CollectErrors');
- }
-
- if ($maintain_line_numbers) {
- $current_line = 1;
- $current_col = 0;
- $length = strlen($html);
- } else {
- $current_line = false;
- $current_col = false;
- $length = false;
- }
- $context->register('CurrentLine', $current_line);
- $context->register('CurrentCol', $current_col);
- $nl = "\n";
- // how often to manually recalculate. This will ALWAYS be right,
- // but it's pretty wasteful. Set to 0 to turn off
- $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');
-
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
-
- // for testing synchronization
- $loops = 0;
-
- while (++$loops) {
- // $cursor is either at the start of a token, or inside of
- // a tag (i.e. there was a < immediately before it), as indicated
- // by $inside_tag
-
- if ($maintain_line_numbers) {
- // $rcursor, however, is always at the start of a token.
- $rcursor = $cursor - (int)$inside_tag;
-
- // Column number is cheap, so we calculate it every round.
- // We're interested at the *end* of the newline string, so
- // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
- // from our "rcursor" position.
- $nl_pos = strrpos($html, $nl, $rcursor - $length);
- $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);
-
- // recalculate lines
- if ($synchronize_interval && // synchronization is on
- $cursor > 0 && // cursor is further than zero
- $loops % $synchronize_interval === 0) { // time to synchronize!
- $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
- }
- }
-
- $position_next_lt = strpos($html, '<', $cursor);
- $position_next_gt = strpos($html, '>', $cursor);
-
- // triggers on "<b>asdf</b>" but not "asdf <b></b>"
- // special case to set up context
- if ($position_next_lt === $cursor) {
- $inside_tag = true;
- $cursor++;
- }
-
- if (!$inside_tag && $position_next_lt !== false) {
- // We are not inside tag and there still is another tag to parse
- $token = new
- HTMLPurifier_Token_Text(
- $this->parseData(
- substr(
- $html,
- $cursor,
- $position_next_lt - $cursor
- )
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
- }
- $array[] = $token;
- $cursor = $position_next_lt + 1;
- $inside_tag = true;
- continue;
- } elseif (!$inside_tag) {
- // We are not inside tag but there are no more tags
- // If we're already at the end, break
- if ($cursor === strlen($html)) {
- break;
- }
- // Create Text of rest of string
- $token = new
- HTMLPurifier_Token_Text(
- $this->parseData(
- substr(
- $html,
- $cursor
- )
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- }
- $array[] = $token;
- break;
- } elseif ($inside_tag && $position_next_gt !== false) {
- // We are in tag and it is well formed
- // Grab the internals of the tag
- $strlen_segment = $position_next_gt - $cursor;
-
- if ($strlen_segment < 1) {
- // there's nothing to process!
- $token = new HTMLPurifier_Token_Text('<');
- $cursor++;
- continue;
- }
-
- $segment = substr($html, $cursor, $strlen_segment);
-
- if ($segment === false) {
- // somehow, we attempted to access beyond the end of
- // the string, defense-in-depth, reported by Nate Abele
- break;
- }
-
- // Check if it's a comment
- if (substr($segment, 0, 3) === '!--') {
- // re-determine segment length, looking for -->
- $position_comment_end = strpos($html, '-->', $cursor);
- if ($position_comment_end === false) {
- // uh oh, we have a comment that extends to
- // infinity. Can't be helped: set comment
- // end position to end of string
- if ($e) {
- $e->send(E_WARNING, 'Lexer: Unclosed comment');
- }
- $position_comment_end = strlen($html);
- $end = true;
- } else {
- $end = false;
- }
- $strlen_segment = $position_comment_end - $cursor;
- $segment = substr($html, $cursor, $strlen_segment);
- $token = new
- HTMLPurifier_Token_Comment(
- substr(
- $segment,
- 3,
- $strlen_segment - 3
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
- }
- $array[] = $token;
- $cursor = $end ? $position_comment_end : $position_comment_end + 3;
- $inside_tag = false;
- continue;
- }
-
- // Check if it's an end tag
- $is_end_tag = (strpos($segment, '/') === 0);
- if ($is_end_tag) {
- $type = substr($segment, 1);
- $token = new HTMLPurifier_Token_End($type);
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- $cursor = $position_next_gt + 1;
- continue;
- }
-
- // Check leading character is alnum, if not, we may
- // have accidently grabbed an emoticon. Translate into
- // text and go our merry way
- if (!ctype_alpha($segment[0])) {
- // XML: $segment[0] !== '_' && $segment[0] !== ':'
- if ($e) {
- $e->send(E_NOTICE, 'Lexer: Unescaped lt');
- }
- $token = new HTMLPurifier_Token_Text('<');
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- continue;
- }
-
- // Check if it is explicitly self closing, if so, remove
- // trailing slash. Remember, we could have a tag like <br>, so
- // any later token processing scripts must convert improperly
- // classified EmptyTags from StartTags.
- $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
- if ($is_self_closing) {
- $strlen_segment--;
- $segment = substr($segment, 0, $strlen_segment);
- }
-
- // Check if there are any attributes
- $position_first_space = strcspn($segment, $this->_whitespace);
-
- if ($position_first_space >= $strlen_segment) {
- if ($is_self_closing) {
- $token = new HTMLPurifier_Token_Empty($segment);
- } else {
- $token = new HTMLPurifier_Token_Start($segment);
- }
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $inside_tag = false;
- $cursor = $position_next_gt + 1;
- continue;
- }
-
- // Grab out all the data
- $type = substr($segment, 0, $position_first_space);
- $attribute_string =
- trim(
- substr(
- $segment,
- $position_first_space
- )
- );
- if ($attribute_string) {
- $attr = $this->parseAttributeString(
- $attribute_string,
- $config,
- $context
- );
- } else {
- $attr = array();
- }
-
- if ($is_self_closing) {
- $token = new HTMLPurifier_Token_Empty($type, $attr);
- } else {
- $token = new HTMLPurifier_Token_Start($type, $attr);
- }
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
- }
- $array[] = $token;
- $cursor = $position_next_gt + 1;
- $inside_tag = false;
- continue;
- } else {
- // inside tag, but there's no ending > sign
- if ($e) {
- $e->send(E_WARNING, 'Lexer: Missing gt');
- }
- $token = new
- HTMLPurifier_Token_Text(
- '<' .
- $this->parseData(
- substr($html, $cursor)
- )
- );
- if ($maintain_line_numbers) {
- $token->rawPosition($current_line, $current_col);
- }
- // no cursor scroll? Hmm...
- $array[] = $token;
- break;
- }
- break;
- }
-
- $context->destroy('CurrentLine');
- $context->destroy('CurrentCol');
- return $array;
- }
-
- /**
- * PHP 5.0.x compatible substr_count that implements offset and length
- * @param string $haystack
- * @param string $needle
- * @param int $offset
- * @param int $length
- * @return int
- */
- protected function substrCount($haystack, $needle, $offset, $length)
- {
- static $oldVersion;
- if ($oldVersion === null) {
- $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
- }
- if ($oldVersion) {
- $haystack = substr($haystack, $offset, $length);
- return substr_count($haystack, $needle);
- } else {
- return substr_count($haystack, $needle, $offset, $length);
- }
- }
-
- /**
- * Takes the inside of an HTML tag and makes an assoc array of attributes.
- *
- * @param string $string Inside of tag excluding name.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return array Assoc array of attributes.
- */
- public function parseAttributeString($string, $config, $context)
- {
- $string = (string)$string; // quick typecast
-
- if ($string == '') {
- return array();
- } // no attributes
-
- $e = false;
- if ($config->get('Core.CollectErrors')) {
- $e =& $context->get('ErrorCollector');
- }
-
- // let's see if we can abort as quickly as possible
- // one equal sign, no spaces => one attribute
- $num_equal = substr_count($string, '=');
- $has_space = strpos($string, ' ');
- if ($num_equal === 0 && !$has_space) {
- // bool attribute
- return array($string => $string);
- } elseif ($num_equal === 1 && !$has_space) {
- // only one attribute
- list($key, $quoted_value) = explode('=', $string);
- $quoted_value = trim($quoted_value);
- if (!$key) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- return array();
- }
- if (!$quoted_value) {
- return array($key => '');
- }
- $first_char = @$quoted_value[0];
- $last_char = @$quoted_value[strlen($quoted_value) - 1];
-
- $same_quote = ($first_char == $last_char);
- $open_quote = ($first_char == '"' || $first_char == "'");
-
- if ($same_quote && $open_quote) {
- // well behaved
- $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
- } else {
- // not well behaved
- if ($open_quote) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing end quote');
- }
- $value = substr($quoted_value, 1);
- } else {
- $value = $quoted_value;
- }
- }
- if ($value === false) {
- $value = '';
- }
- return array($key => $this->parseData($value));
- }
-
- // setup loop environment
- $array = array(); // return assoc array of attributes
- $cursor = 0; // current position in string (moves forward)
- $size = strlen($string); // size of the string (stays the same)
-
- // if we have unquoted attributes, the parser expects a terminating
- // space, so let's guarantee that there's always a terminating space.
- $string .= ' ';
-
- $old_cursor = -1;
- while ($cursor < $size) {
- if ($old_cursor >= $cursor) {
- throw new Exception("Infinite loop detected");
- }
- $old_cursor = $cursor;
-
- $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
- // grab the key
-
- $key_begin = $cursor; //we're currently at the start of the key
-
- // scroll past all characters that are the key (not whitespace or =)
- $cursor += strcspn($string, $this->_whitespace . '=', $cursor);
-
- $key_end = $cursor; // now at the end of the key
-
- $key = substr($string, $key_begin, $key_end - $key_begin);
-
- if (!$key) {
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
- continue; // empty key
- }
-
- // scroll past all whitespace
- $cursor += strspn($string, $this->_whitespace, $cursor);
-
- if ($cursor >= $size) {
- $array[$key] = $key;
- break;
- }
-
- // if the next character is an equal sign, we've got a regular
- // pair, otherwise, it's a bool attribute
- $first_char = @$string[$cursor];
-
- if ($first_char == '=') {
- // key="value"
-
- $cursor++;
- $cursor += strspn($string, $this->_whitespace, $cursor);
-
- if ($cursor === false) {
- $array[$key] = '';
- break;
- }
-
- // we might be in front of a quote right now
-
- $char = @$string[$cursor];
-
- if ($char == '"' || $char == "'") {
- // it's quoted, end bound is $char
- $cursor++;
- $value_begin = $cursor;
- $cursor = strpos($string, $char, $cursor);
- $value_end = $cursor;
- } else {
- // it's not quoted, end bound is whitespace
- $value_begin = $cursor;
- $cursor += strcspn($string, $this->_whitespace, $cursor);
- $value_end = $cursor;
- }
-
- // we reached a premature end
- if ($cursor === false) {
- $cursor = $size;
- $value_end = $cursor;
- }
-
- $value = substr($string, $value_begin, $value_end - $value_begin);
- if ($value === false) {
- $value = '';
- }
- $array[$key] = $this->parseData($value);
- $cursor++;
- } else {
- // boolattr
- if ($key !== '') {
- $array[$key] = $key;
- } else {
- // purely theoretical
- if ($e) {
- $e->send(E_ERROR, 'Lexer: Missing attribute key');
- }
- }
- }
- }
- return $array;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Lexer/PH5P.php b/library/HTMLPurifier/Lexer/PH5P.php
deleted file mode 100644
index a4587e4cd..000000000
--- a/library/HTMLPurifier/Lexer/PH5P.php
+++ /dev/null
@@ -1,4788 +0,0 @@
-<?php
-
-/**
- * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
- * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
- *
- * @note
- * Recent changes to PHP's DOM extension have resulted in some fatal
- * error conditions with the original version of PH5P. Pending changes,
- * this lexer will punt to DirectLex if DOM throws an exception.
- */
-
-class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
-{
- /**
- * @param string $html
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- */
- public function tokenizeHTML($html, $config, $context)
- {
- $new_html = $this->normalize($html, $config, $context);
- $new_html = $this->wrapHTML($new_html, $config, $context);
- try {
- $parser = new HTML5($new_html);
- $doc = $parser->save();
- } catch (DOMException $e) {
- // Uh oh, it failed. Punt to DirectLex.
- $lexer = new HTMLPurifier_Lexer_DirectLex();
- $context->register('PH5PError', $e); // save the error, so we can detect it
- return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
- }
- $tokens = array();
- $this->tokenizeDOM(
- $doc->getElementsByTagName('html')->item(0)-> // <html>
- getElementsByTagName('body')->item(0)-> // <body>
- getElementsByTagName('div')->item(0) // <div>
- ,
- $tokens
- );
- return $tokens;
- }
-}
-
-/*
-
-Copyright 2007 Jeroen van der Meer <http://jero.net/>
-
-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.
-
-*/
-
-class HTML5
-{
- private $data;
- private $char;
- private $EOF;
- private $state;
- private $tree;
- private $token;
- private $content_model;
- private $escape = false;
- private $entities = array(
- 'AElig;',
- 'AElig',
- 'AMP;',
- 'AMP',
- 'Aacute;',
- 'Aacute',
- 'Acirc;',
- 'Acirc',
- 'Agrave;',
- 'Agrave',
- 'Alpha;',
- 'Aring;',
- 'Aring',
- 'Atilde;',
- 'Atilde',
- 'Auml;',
- 'Auml',
- 'Beta;',
- 'COPY;',
- 'COPY',
- 'Ccedil;',
- 'Ccedil',
- 'Chi;',
- 'Dagger;',
- 'Delta;',
- 'ETH;',
- 'ETH',
- 'Eacute;',
- 'Eacute',
- 'Ecirc;',
- 'Ecirc',
- 'Egrave;',
- 'Egrave',
- 'Epsilon;',
- 'Eta;',
- 'Euml;',
- 'Euml',
- 'GT;',
- 'GT',
- 'Gamma;',
- 'Iacute;',
- 'Iacute',
- 'Icirc;',
- 'Icirc',
- 'Igrave;',
- 'Igrave',
- 'Iota;',
- 'Iuml;',
- 'Iuml',
- 'Kappa;',
- 'LT;',
- 'LT',
- 'Lambda;',
- 'Mu;',
- 'Ntilde;',
- 'Ntilde',
- 'Nu;',
- 'OElig;',
- 'Oacute;',
- 'Oacute',
- 'Ocirc;',
- 'Ocirc',
- 'Ograve;',
- 'Ograve',
- 'Omega;',
- 'Omicron;',
- 'Oslash;',
- 'Oslash',
- 'Otilde;',
- 'Otilde',
- 'Ouml;',
- 'Ouml',
- 'Phi;',
- 'Pi;',
- 'Prime;',
- 'Psi;',
- 'QUOT;',
- 'QUOT',
- 'REG;',
- 'REG',
- 'Rho;',
- 'Scaron;',
- 'Sigma;',
- 'THORN;',
- 'THORN',
- 'TRADE;',
- 'Tau;',
- 'Theta;',
- 'Uacute;',
- 'Uacute',
- 'Ucirc;',
- 'Ucirc',
- 'Ugrave;',
- 'Ugrave',
- 'Upsilon;',
- 'Uuml;',
- 'Uuml',
- 'Xi;',
- 'Yacute;',
- 'Yacute',
- 'Yuml;',
- 'Zeta;',
- 'aacute;',
- 'aacute',
- 'acirc;',
- 'acirc',
- 'acute;',
- 'acute',
- 'aelig;',
- 'aelig',
- 'agrave;',
- 'agrave',
- 'alefsym;',
- 'alpha;',
- 'amp;',
- 'amp',
- 'and;',
- 'ang;',
- 'apos;',
- 'aring;',
- 'aring',
- 'asymp;',
- 'atilde;',
- 'atilde',
- 'auml;',
- 'auml',
- 'bdquo;',
- 'beta;',
- 'brvbar;',
- 'brvbar',
- 'bull;',
- 'cap;',
- 'ccedil;',
- 'ccedil',
- 'cedil;',
- 'cedil',
- 'cent;',
- 'cent',
- 'chi;',
- 'circ;',
- 'clubs;',
- 'cong;',
- 'copy;',
- 'copy',
- 'crarr;',
- 'cup;',
- 'curren;',
- 'curren',
- 'dArr;',
- 'dagger;',
- 'darr;',
- 'deg;',
- 'deg',
- 'delta;',
- 'diams;',
- 'divide;',
- 'divide',
- 'eacute;',
- 'eacute',
- 'ecirc;',
- 'ecirc',
- 'egrave;',
- 'egrave',
- 'empty;',
- 'emsp;',
- 'ensp;',
- 'epsilon;',
- 'equiv;',
- 'eta;',
- 'eth;',
- 'eth',
- 'euml;',
- 'euml',
- 'euro;',
- 'exist;',
- 'fnof;',
- 'forall;',
- 'frac12;',
- 'frac12',
- 'frac14;',
- 'frac14',
- 'frac34;',
- 'frac34',
- 'frasl;',
- 'gamma;',
- 'ge;',
- 'gt;',
- 'gt',
- 'hArr;',
- 'harr;',
- 'hearts;',
- 'hellip;',
- 'iacute;',
- 'iacute',
- 'icirc;',
- 'icirc',
- 'iexcl;',
- 'iexcl',
- 'igrave;',
- 'igrave',
- 'image;',
- 'infin;',
- 'int;',
- 'iota;',
- 'iquest;',
- 'iquest',
- 'isin;',
- 'iuml;',
- 'iuml',
- 'kappa;',
- 'lArr;',
- 'lambda;',
- 'lang;',
- 'laquo;',
- 'laquo',
- 'larr;',
- 'lceil;',
- 'ldquo;',
- 'le;',
- 'lfloor;',
- 'lowast;',
- 'loz;',
- 'lrm;',
- 'lsaquo;',
- 'lsquo;',
- 'lt;',
- 'lt',
- 'macr;',
- 'macr',
- 'mdash;',
- 'micro;',
- 'micro',
- 'middot;',
- 'middot',
- 'minus;',
- 'mu;',
- 'nabla;',
- 'nbsp;',
- 'nbsp',
- 'ndash;',
- 'ne;',
- 'ni;',
- 'not;',
- 'not',
- 'notin;',
- 'nsub;',
- 'ntilde;',
- 'ntilde',
- 'nu;',
- 'oacute;',
- 'oacute',
- 'ocirc;',
- 'ocirc',
- 'oelig;',
- 'ograve;',
- 'ograve',
- 'oline;',
- 'omega;',
- 'omicron;',
- 'oplus;',
- 'or;',
- 'ordf;',
- 'ordf',
- 'ordm;',
- 'ordm',
- 'oslash;',
- 'oslash',
- 'otilde;',
- 'otilde',
- 'otimes;',
- 'ouml;',
- 'ouml',
- 'para;',
- 'para',
- 'part;',
- 'permil;',
- 'perp;',
- 'phi;',
- 'pi;',
- 'piv;',
- 'plusmn;',
- 'plusmn',
- 'pound;',
- 'pound',
- 'prime;',
- 'prod;',
- 'prop;',
- 'psi;',
- 'quot;',
- 'quot',
- 'rArr;',
- 'radic;',
- 'rang;',
- 'raquo;',
- 'raquo',
- 'rarr;',
- 'rceil;',
- 'rdquo;',
- 'real;',
- 'reg;',
- 'reg',
- 'rfloor;',
- 'rho;',
- 'rlm;',
- 'rsaquo;',
- 'rsquo;',
- 'sbquo;',
- 'scaron;',
- 'sdot;',
- 'sect;',
- 'sect',
- 'shy;',
- 'shy',
- 'sigma;',
- 'sigmaf;',
- 'sim;',
- 'spades;',
- 'sub;',
- 'sube;',
- 'sum;',
- 'sup1;',
- 'sup1',
- 'sup2;',
- 'sup2',
- 'sup3;',
- 'sup3',
- 'sup;',
- 'supe;',
- 'szlig;',
- 'szlig',
- 'tau;',
- 'there4;',
- 'theta;',
- 'thetasym;',
- 'thinsp;',
- 'thorn;',
- 'thorn',
- 'tilde;',
- 'times;',
- 'times',
- 'trade;',
- 'uArr;',
- 'uacute;',
- 'uacute',
- 'uarr;',
- 'ucirc;',
- 'ucirc',
- 'ugrave;',
- 'ugrave',
- 'uml;',
- 'uml',
- 'upsih;',
- 'upsilon;',
- 'uuml;',
- 'uuml',
- 'weierp;',
- 'xi;',
- 'yacute;',
- 'yacute',
- 'yen;',
- 'yen',
- 'yuml;',
- 'yuml',
- 'zeta;',
- 'zwj;',
- 'zwnj;'
- );
-
- const PCDATA = 0;
- const RCDATA = 1;
- const CDATA = 2;
- const PLAINTEXT = 3;
-
- const DOCTYPE = 0;
- const STARTTAG = 1;
- const ENDTAG = 2;
- const COMMENT = 3;
- const CHARACTR = 4;
- const EOF = 5;
-
- public function __construct($data)
- {
- $this->data = $data;
- $this->char = -1;
- $this->EOF = strlen($data);
- $this->tree = new HTML5TreeConstructer;
- $this->content_model = self::PCDATA;
-
- $this->state = 'data';
-
- while ($this->state !== null) {
- $this->{$this->state . 'State'}();
- }
- }
-
- public function save()
- {
- return $this->tree->save();
- }
-
- private function char()
- {
- return ($this->char < $this->EOF)
- ? $this->data[$this->char]
- : false;
- }
-
- private function character($s, $l = 0)
- {
- if ($s + $l < $this->EOF) {
- if ($l === 0) {
- return $this->data[$s];
- } else {
- return substr($this->data, $s, $l);
- }
- }
- }
-
- private function characters($char_class, $start)
- {
- return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
- }
-
- private function dataState()
- {
- // Consume the next input character
- $this->char++;
- $char = $this->char();
-
- if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
- /* U+0026 AMPERSAND (&)
- When the content model flag is set to one of the PCDATA or RCDATA
- states: switch to the entity data state. Otherwise: treat it as per
- the "anything else" entry below. */
- $this->state = 'entityData';
-
- } elseif ($char === '-') {
- /* If the content model flag is set to either the RCDATA state or
- the CDATA state, and the escape flag is false, and there are at
- least three characters before this one in the input stream, and the
- last four characters in the input stream, including this one, are
- U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
- and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
- if (($this->content_model === self::RCDATA || $this->content_model ===
- self::CDATA) && $this->escape === false &&
- $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
- ) {
- $this->escape = true;
- }
-
- /* In any case, emit the input character as a character token. Stay
- in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- /* U+003C LESS-THAN SIGN (<) */
- } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
- (($this->content_model === self::RCDATA ||
- $this->content_model === self::CDATA) && $this->escape === false))
- ) {
- /* When the content model flag is set to the PCDATA state: switch
- to the tag open state.
-
- When the content model flag is set to either the RCDATA state or
- the CDATA state and the escape flag is false: switch to the tag
- open state.
-
- Otherwise: treat it as per the "anything else" entry below. */
- $this->state = 'tagOpen';
-
- /* U+003E GREATER-THAN SIGN (>) */
- } elseif ($char === '>') {
- /* If the content model flag is set to either the RCDATA state or
- the CDATA state, and the escape flag is true, and the last three
- characters in the input stream including this one are U+002D
- HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
- set the escape flag to false. */
- if (($this->content_model === self::RCDATA ||
- $this->content_model === self::CDATA) && $this->escape === true &&
- $this->character($this->char, 3) === '-->'
- ) {
- $this->escape = false;
- }
-
- /* In any case, emit the input character as a character token.
- Stay in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Emit an end-of-file token. */
- $this->EOF();
-
- } elseif ($this->content_model === self::PLAINTEXT) {
- /* When the content model flag is set to the PLAINTEXT state
- THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
- the text and emit it as a character token. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => substr($this->data, $this->char)
- )
- );
-
- $this->EOF();
-
- } else {
- /* Anything else
- THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
- otherwise would also be treated as a character token and emit it
- as a single character token. Stay in the data state. */
- $len = strcspn($this->data, '<&', $this->char);
- $char = substr($this->data, $this->char, $len);
- $this->char += $len - 1;
-
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- $this->state = 'data';
- }
- }
-
- private function entityDataState()
- {
- // Attempt to consume an entity.
- $entity = $this->entity();
-
- // If nothing is returned, emit a U+0026 AMPERSAND character token.
- // Otherwise, emit the character token that was returned.
- $char = (!$entity) ? '&' : $entity;
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => $char
- )
- );
-
- // Finally, switch to the data state.
- $this->state = 'data';
- }
-
- private function tagOpenState()
- {
- switch ($this->content_model) {
- case self::RCDATA:
- case self::CDATA:
- /* If the next input character is a U+002F SOLIDUS (/) character,
- consume it and switch to the close tag open state. If the next
- input character is not a U+002F SOLIDUS (/) character, emit a
- U+003C LESS-THAN SIGN character token and switch to the data
- state to process the next input character. */
- if ($this->character($this->char + 1) === '/') {
- $this->char++;
- $this->state = 'closeTagOpen';
-
- } else {
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<'
- )
- );
-
- $this->state = 'data';
- }
- break;
-
- case self::PCDATA:
- // If the content model flag is set to the PCDATA state
- // Consume the next input character:
- $this->char++;
- $char = $this->char();
-
- if ($char === '!') {
- /* U+0021 EXCLAMATION MARK (!)
- Switch to the markup declaration open state. */
- $this->state = 'markupDeclarationOpen';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Switch to the close tag open state. */
- $this->state = 'closeTagOpen';
-
- } elseif (preg_match('/^[A-Za-z]$/', $char)) {
- /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
- Create a new start tag token, set its tag name to the lowercase
- version of the input character (add 0x0020 to the character's code
- point), then switch to the tag name state. (Don't emit the token
- yet; further details will be filled in before it is emitted.) */
- $this->token = array(
- 'name' => strtolower($char),
- 'type' => self::STARTTAG,
- 'attr' => array()
- );
-
- $this->state = 'tagName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Parse error. Emit a U+003C LESS-THAN SIGN character token and a
- U+003E GREATER-THAN SIGN character token. Switch to the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<>'
- )
- );
-
- $this->state = 'data';
-
- } elseif ($char === '?') {
- /* U+003F QUESTION MARK (?)
- Parse error. Switch to the bogus comment state. */
- $this->state = 'bogusComment';
-
- } else {
- /* Anything else
- Parse error. Emit a U+003C LESS-THAN SIGN character token and
- reconsume the current input character in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '<'
- )
- );
-
- $this->char--;
- $this->state = 'data';
- }
- break;
- }
- }
-
- private function closeTagOpenState()
- {
- $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
- $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
-
- if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
- (!$the_same || ($the_same && (!preg_match(
- '/[\t\n\x0b\x0c >\/]/',
- $this->character($this->char + 1 + strlen($next_node))
- ) || $this->EOF === $this->char)))
- ) {
- /* If the content model flag is set to the RCDATA or CDATA states then
- examine the next few characters. If they do not match the tag name of
- the last start tag token emitted (case insensitively), or if they do but
- they are not immediately followed by one of the following characters:
- * U+0009 CHARACTER TABULATION
- * U+000A LINE FEED (LF)
- * U+000B LINE TABULATION
- * U+000C FORM FEED (FF)
- * U+0020 SPACE
- * U+003E GREATER-THAN SIGN (>)
- * U+002F SOLIDUS (/)
- * EOF
- ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
- token, a U+002F SOLIDUS character token, and switch to the data state
- to process the next input character. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '</'
- )
- );
-
- $this->state = 'data';
-
- } else {
- /* Otherwise, if the content model flag is set to the PCDATA state,
- or if the next few characters do match that tag name, consume the
- next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[A-Za-z]$/', $char)) {
- /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
- Create a new end tag token, set its tag name to the lowercase version
- of the input character (add 0x0020 to the character's code point), then
- switch to the tag name state. (Don't emit the token yet; further details
- will be filled in before it is emitted.) */
- $this->token = array(
- 'name' => strtolower($char),
- 'type' => self::ENDTAG
- );
-
- $this->state = 'tagName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Parse error. Switch to the data state. */
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
- SOLIDUS character token. Reconsume the EOF character in the data state. */
- $this->emitToken(
- array(
- 'type' => self::CHARACTR,
- 'data' => '</'
- )
- );
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Parse error. Switch to the bogus comment state. */
- $this->state = 'bogusComment';
- }
- }
- }
-
- private function tagNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } else {
- /* Anything else
- Append the current input character to the current tag token's tag name.
- Stay in the tag name state. */
- $this->token['name'] .= strtolower($char);
- $this->state = 'tagName';
- }
- }
-
- private function beforeAttributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Stay in the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Start a new attribute in the current tag token. Set that attribute's
- name to the current input character, and its value to the empty string.
- Switch to the attribute name state. */
- $this->token['attr'][] = array(
- 'name' => strtolower($char),
- 'value' => null
- );
-
- $this->state = 'attributeName';
- }
- }
-
- private function attributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute name state. */
- $this->state = 'afterAttributeName';
-
- } elseif ($char === '=') {
- /* U+003D EQUALS SIGN (=)
- Switch to the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the before
- attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's name.
- Stay in the attribute name state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['name'] .= strtolower($char);
-
- $this->state = 'attributeName';
- }
- }
-
- private function afterAttributeNameState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the after attribute name state. */
- $this->state = 'afterAttributeName';
-
- } elseif ($char === '=') {
- /* U+003D EQUALS SIGN (=)
- Switch to the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
- /* U+002F SOLIDUS (/)
- Parse error unless this is a permitted slash. Switch to the
- before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the EOF
- character in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Start a new attribute in the current tag token. Set that attribute's
- name to the current input character, and its value to the empty string.
- Switch to the attribute name state. */
- $this->token['attr'][] = array(
- 'name' => strtolower($char),
- 'value' => null
- );
-
- $this->state = 'attributeName';
- }
- }
-
- private function beforeAttributeValueState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Stay in the before attribute value state. */
- $this->state = 'beforeAttributeValue';
-
- } elseif ($char === '"') {
- /* U+0022 QUOTATION MARK (")
- Switch to the attribute value (double-quoted) state. */
- $this->state = 'attributeValueDoubleQuoted';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the attribute value (unquoted) state and reconsume
- this input character. */
- $this->char--;
- $this->state = 'attributeValueUnquoted';
-
- } elseif ($char === '\'') {
- /* U+0027 APOSTROPHE (')
- Switch to the attribute value (single-quoted) state. */
- $this->state = 'attributeValueSingleQuoted';
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Switch to the attribute value (unquoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueUnquoted';
- }
- }
-
- private function attributeValueDoubleQuotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if ($char === '"') {
- /* U+0022 QUOTATION MARK (")
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState('double');
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the character
- in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (double-quoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueDoubleQuoted';
- }
- }
-
- private function attributeValueSingleQuotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if ($char === '\'') {
- /* U+0022 QUOTATION MARK (')
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState('single');
-
- } elseif ($this->char === $this->EOF) {
- /* EOF
- Parse error. Emit the current tag token. Reconsume the character
- in the data state. */
- $this->emitToken($this->token);
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (single-quoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueSingleQuoted';
- }
- }
-
- private function attributeValueUnquotedState()
- {
- // Consume the next input character:
- $this->char++;
- $char = $this->character($this->char);
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- /* U+0009 CHARACTER TABULATION
- U+000A LINE FEED (LF)
- U+000B LINE TABULATION
- U+000C FORM FEED (FF)
- U+0020 SPACE
- Switch to the before attribute name state. */
- $this->state = 'beforeAttributeName';
-
- } elseif ($char === '&') {
- /* U+0026 AMPERSAND (&)
- Switch to the entity in attribute value state. */
- $this->entityInAttributeValueState();
-
- } elseif ($char === '>') {
- /* U+003E GREATER-THAN SIGN (>)
- Emit the current tag token. Switch to the data state. */
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } else {
- /* Anything else
- Append the current input character to the current attribute's value.
- Stay in the attribute value (unquoted) state. */
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
-
- $this->state = 'attributeValueUnquoted';
- }
- }
-
- private function entityInAttributeValueState()
- {
- // Attempt to consume an entity.
- $entity = $this->entity();
-
- // If nothing is returned, append a U+0026 AMPERSAND character to the
- // current attribute's value. Otherwise, emit the character token that
- // was returned.
- $char = (!$entity)
- ? '&'
- : $entity;
-
- $last = count($this->token['attr']) - 1;
- $this->token['attr'][$last]['value'] .= $char;
- }
-
- private function bogusCommentState()
- {
- /* Consume every character up to the first U+003E GREATER-THAN SIGN
- character (>) or the end of the file (EOF), whichever comes first. Emit
- a comment token whose data is the concatenation of all the characters
- starting from and including the character that caused the state machine
- to switch into the bogus comment state, up to and including the last
- consumed character before the U+003E character, if any, or up to the
- end of the file otherwise. (If the comment was started by the end of
- the file (EOF), the token is empty.) */
- $data = $this->characters('^>', $this->char);
- $this->emitToken(
- array(
- 'data' => $data,
- 'type' => self::COMMENT
- )
- );
-
- $this->char += strlen($data);
-
- /* Switch to the data state. */
- $this->state = 'data';
-
- /* If the end of the file was reached, reconsume the EOF character. */
- if ($this->char === $this->EOF) {
- $this->char = $this->EOF - 1;
- }
- }
-
- private function markupDeclarationOpenState()
- {
- /* If the next two characters are both U+002D HYPHEN-MINUS (-)
- characters, consume those two characters, create a comment token whose
- data is the empty string, and switch to the comment state. */
- if ($this->character($this->char + 1, 2) === '--') {
- $this->char += 2;
- $this->state = 'comment';
- $this->token = array(
- 'data' => null,
- 'type' => self::COMMENT
- );
-
- /* Otherwise if the next seven chacacters are a case-insensitive match
- for the word "DOCTYPE", then consume those characters and switch to the
- DOCTYPE state. */
- } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
- $this->char += 7;
- $this->state = 'doctype';
-
- /* Otherwise, is is a parse error. Switch to the bogus comment state.
- The next character that is consumed, if any, is the first character
- that will be in the comment. */
- } else {
- $this->char++;
- $this->state = 'bogusComment';
- }
- }
-
- private function commentState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- /* U+002D HYPHEN-MINUS (-) */
- if ($char === '-') {
- /* Switch to the comment dash state */
- $this->state = 'commentDash';
-
- /* EOF */
- } elseif ($this->char === $this->EOF) {
- /* Parse error. Emit the comment token. Reconsume the EOF character
- in the data state. */
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- /* Anything else */
- } else {
- /* Append the input character to the comment token's data. Stay in
- the comment state. */
- $this->token['data'] .= $char;
- }
- }
-
- private function commentDashState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- /* U+002D HYPHEN-MINUS (-) */
- if ($char === '-') {
- /* Switch to the comment end state */
- $this->state = 'commentEnd';
-
- /* EOF */
- } elseif ($this->char === $this->EOF) {
- /* Parse error. Emit the comment token. Reconsume the EOF character
- in the data state. */
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- /* Anything else */
- } else {
- /* Append a U+002D HYPHEN-MINUS (-) character and the input
- character to the comment token's data. Switch to the comment state. */
- $this->token['data'] .= '-' . $char;
- $this->state = 'comment';
- }
- }
-
- private function commentEndState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($char === '-') {
- $this->token['data'] .= '-';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['data'] .= '--' . $char;
- $this->state = 'comment';
- }
- }
-
- private function doctypeState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- $this->state = 'beforeDoctypeName';
-
- } else {
- $this->char--;
- $this->state = 'beforeDoctypeName';
- }
- }
-
- private function beforeDoctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- // Stay in the before DOCTYPE name state.
-
- } elseif (preg_match('/^[a-z]$/', $char)) {
- $this->token = array(
- 'name' => strtoupper($char),
- 'type' => self::DOCTYPE,
- 'error' => true
- );
-
- $this->state = 'doctypeName';
-
- } elseif ($char === '>') {
- $this->emitToken(
- array(
- 'name' => null,
- 'type' => self::DOCTYPE,
- 'error' => true
- )
- );
-
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken(
- array(
- 'name' => null,
- 'type' => self::DOCTYPE,
- 'error' => true
- )
- );
-
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token = array(
- 'name' => $char,
- 'type' => self::DOCTYPE,
- 'error' => true
- );
-
- $this->state = 'doctypeName';
- }
- }
-
- private function doctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- $this->state = 'AfterDoctypeName';
-
- } elseif ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif (preg_match('/^[a-z]$/', $char)) {
- $this->token['name'] .= strtoupper($char);
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['name'] .= $char;
- }
-
- $this->token['error'] = ($this->token['name'] === 'HTML')
- ? false
- : true;
- }
-
- private function afterDoctypeNameState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
- // Stay in the DOCTYPE name state.
-
- } elseif ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- $this->token['error'] = true;
- $this->state = 'bogusDoctype';
- }
- }
-
- private function bogusDoctypeState()
- {
- /* Consume the next input character: */
- $this->char++;
- $char = $this->char();
-
- if ($char === '>') {
- $this->emitToken($this->token);
- $this->state = 'data';
-
- } elseif ($this->char === $this->EOF) {
- $this->emitToken($this->token);
- $this->char--;
- $this->state = 'data';
-
- } else {
- // Stay in the bogus DOCTYPE state.
- }
- }
-
- private function entity()
- {
- $start = $this->char;
-
- // This section defines how to consume an entity. This definition is
- // used when parsing entities in text and in attributes.
-
- // The behaviour depends on the identity of the next character (the
- // one immediately after the U+0026 AMPERSAND character):
-
- switch ($this->character($this->char + 1)) {
- // U+0023 NUMBER SIGN (#)
- case '#':
-
- // The behaviour further depends on the character after the
- // U+0023 NUMBER SIGN:
- switch ($this->character($this->char + 1)) {
- // U+0078 LATIN SMALL LETTER X
- // U+0058 LATIN CAPITAL LETTER X
- case 'x':
- case 'X':
- // Follow the steps below, but using the range of
- // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
- // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
- // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
- // A, through to U+0046 LATIN CAPITAL LETTER F (in other
- // words, 0-9, A-F, a-f).
- $char = 1;
- $char_class = '0-9A-Fa-f';
- break;
-
- // Anything else
- default:
- // Follow the steps below, but using the range of
- // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
- // NINE (i.e. just 0-9).
- $char = 0;
- $char_class = '0-9';
- break;
- }
-
- // Consume as many characters as match the range of characters
- // given above.
- $this->char++;
- $e_name = $this->characters($char_class, $this->char + $char + 1);
- $entity = $this->character($start, $this->char);
- $cond = strlen($e_name) > 0;
-
- // The rest of the parsing happens bellow.
- break;
-
- // Anything else
- default:
- // Consume the maximum number of characters possible, with the
- // consumed characters case-sensitively matching one of the
- // identifiers in the first column of the entities table.
- $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
- $len = strlen($e_name);
-
- for ($c = 1; $c <= $len; $c++) {
- $id = substr($e_name, 0, $c);
- $this->char++;
-
- if (in_array($id, $this->entities)) {
- if ($e_name[$c - 1] !== ';') {
- if ($c < $len && $e_name[$c] == ';') {
- $this->char++; // consume extra semicolon
- }
- }
- $entity = $id;
- break;
- }
- }
-
- $cond = isset($entity);
- // The rest of the parsing happens bellow.
- break;
- }
-
- if (!$cond) {
- // If no match can be made, then this is a parse error. No
- // characters are consumed, and nothing is returned.
- $this->char = $start;
- return false;
- }
-
- // Return a character token for the character corresponding to the
- // entity name (as given by the second column of the entities table).
- return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8');
- }
-
- private function emitToken($token)
- {
- $emit = $this->tree->emitToken($token);
-
- if (is_int($emit)) {
- $this->content_model = $emit;
-
- } elseif ($token['type'] === self::ENDTAG) {
- $this->content_model = self::PCDATA;
- }
- }
-
- private function EOF()
- {
- $this->state = null;
- $this->tree->emitToken(
- array(
- 'type' => self::EOF
- )
- );
- }
-}
-
-class HTML5TreeConstructer
-{
- public $stack = array();
-
- private $phase;
- private $mode;
- private $dom;
- private $foster_parent = null;
- private $a_formatting = array();
-
- private $head_pointer = null;
- private $form_pointer = null;
-
- private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
- private $formatting = array(
- 'a',
- 'b',
- 'big',
- 'em',
- 'font',
- 'i',
- 'nobr',
- 's',
- 'small',
- 'strike',
- 'strong',
- 'tt',
- 'u'
- );
- private $special = array(
- 'address',
- 'area',
- 'base',
- 'basefont',
- 'bgsound',
- 'blockquote',
- 'body',
- 'br',
- 'center',
- 'col',
- 'colgroup',
- 'dd',
- 'dir',
- 'div',
- 'dl',
- 'dt',
- 'embed',
- 'fieldset',
- 'form',
- 'frame',
- 'frameset',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'head',
- 'hr',
- 'iframe',
- 'image',
- 'img',
- 'input',
- 'isindex',
- 'li',
- 'link',
- 'listing',
- 'menu',
- 'meta',
- 'noembed',
- 'noframes',
- 'noscript',
- 'ol',
- 'optgroup',
- 'option',
- 'p',
- 'param',
- 'plaintext',
- 'pre',
- 'script',
- 'select',
- 'spacer',
- 'style',
- 'tbody',
- 'textarea',
- 'tfoot',
- 'thead',
- 'title',
- 'tr',
- 'ul',
- 'wbr'
- );
-
- // The different phases.
- const INIT_PHASE = 0;
- const ROOT_PHASE = 1;
- const MAIN_PHASE = 2;
- const END_PHASE = 3;
-
- // The different insertion modes for the main phase.
- const BEFOR_HEAD = 0;
- const IN_HEAD = 1;
- const AFTER_HEAD = 2;
- const IN_BODY = 3;
- const IN_TABLE = 4;
- const IN_CAPTION = 5;
- const IN_CGROUP = 6;
- const IN_TBODY = 7;
- const IN_ROW = 8;
- const IN_CELL = 9;
- const IN_SELECT = 10;
- const AFTER_BODY = 11;
- const IN_FRAME = 12;
- const AFTR_FRAME = 13;
-
- // The different types of elements.
- const SPECIAL = 0;
- const SCOPING = 1;
- const FORMATTING = 2;
- const PHRASING = 3;
-
- const MARKER = 0;
-
- public function __construct()
- {
- $this->phase = self::INIT_PHASE;
- $this->mode = self::BEFOR_HEAD;
- $this->dom = new DOMDocument;
-
- $this->dom->encoding = 'UTF-8';
- $this->dom->preserveWhiteSpace = true;
- $this->dom->substituteEntities = true;
- $this->dom->strictErrorChecking = false;
- }
-
- // Process tag tokens
- public function emitToken($token)
- {
- switch ($this->phase) {
- case self::INIT_PHASE:
- return $this->initPhase($token);
- break;
- case self::ROOT_PHASE:
- return $this->rootElementPhase($token);
- break;
- case self::MAIN_PHASE:
- return $this->mainPhase($token);
- break;
- case self::END_PHASE :
- return $this->trailingEndPhase($token);
- break;
- }
- }
-
- private function initPhase($token)
- {
- /* Initially, the tree construction stage must handle each token
- emitted from the tokenisation stage as follows: */
-
- /* A DOCTYPE token that is marked as being in error
- A comment token
- A start tag token
- An end tag token
- A character token that is not one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE
- An end-of-file token */
- if ((isset($token['error']) && $token['error']) ||
- $token['type'] === HTML5::COMMENT ||
- $token['type'] === HTML5::STARTTAG ||
- $token['type'] === HTML5::ENDTAG ||
- $token['type'] === HTML5::EOF ||
- ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
- !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
- ) {
- /* This specification does not define how to handle this case. In
- particular, user agents may ignore the entirety of this specification
- altogether for such documents, and instead invoke special parse modes
- with a greater emphasis on backwards compatibility. */
-
- $this->phase = self::ROOT_PHASE;
- return $this->rootElementPhase($token);
-
- /* A DOCTYPE token marked as being correct */
- } elseif (isset($token['error']) && !$token['error']) {
- /* Append a DocumentType node to the Document node, with the name
- attribute set to the name given in the DOCTYPE token (which will be
- "HTML"), and the other attributes specific to DocumentType objects
- set to null, empty lists, or the empty string as appropriate. */
- $doctype = new DOMDocumentType(null, null, 'HTML');
-
- /* Then, switch to the root element phase of the tree construction
- stage. */
- $this->phase = self::ROOT_PHASE;
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif (isset($token['data']) && preg_match(
- '/^[\t\n\x0b\x0c ]+$/',
- $token['data']
- )
- ) {
- /* Append that character to the Document node. */
- $text = $this->dom->createTextNode($token['data']);
- $this->dom->appendChild($text);
- }
- }
-
- private function rootElementPhase($token)
- {
- /* After the initial phase, as each token is emitted from the tokenisation
- stage, it must be processed as described in this section. */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the Document object with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->dom->appendChild($comment);
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append that character to the Document node. */
- $text = $this->dom->createTextNode($token['data']);
- $this->dom->appendChild($text);
-
- /* A character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
- (FF), or U+0020 SPACE
- A start tag token
- An end tag token
- An end-of-file token */
- } elseif (($token['type'] === HTML5::CHARACTR &&
- !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
- $token['type'] === HTML5::STARTTAG ||
- $token['type'] === HTML5::ENDTAG ||
- $token['type'] === HTML5::EOF
- ) {
- /* Create an HTMLElement node with the tag name html, in the HTML
- namespace. Append it to the Document object. Switch to the main
- phase and reprocess the current token. */
- $html = $this->dom->createElement('html');
- $this->dom->appendChild($html);
- $this->stack[] = $html;
-
- $this->phase = self::MAIN_PHASE;
- return $this->mainPhase($token);
- }
- }
-
- private function mainPhase($token)
- {
- /* Tokens in the main phase must be handled as follows: */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A start tag token with the tag name "html" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
- /* If this start tag token was not the first start tag token, then
- it is a parse error. */
-
- /* For each attribute on the token, check to see if the attribute
- is already present on the top element of the stack of open elements.
- If it is not, add the attribute and its corresponding value to that
- element. */
- foreach ($token['attr'] as $attr) {
- if (!$this->stack[0]->hasAttribute($attr['name'])) {
- $this->stack[0]->setAttribute($attr['name'], $attr['value']);
- }
- }
-
- /* An end-of-file token */
- } elseif ($token['type'] === HTML5::EOF) {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Anything else. */
- } else {
- /* Depends on the insertion mode: */
- switch ($this->mode) {
- case self::BEFOR_HEAD:
- return $this->beforeHead($token);
- break;
- case self::IN_HEAD:
- return $this->inHead($token);
- break;
- case self::AFTER_HEAD:
- return $this->afterHead($token);
- break;
- case self::IN_BODY:
- return $this->inBody($token);
- break;
- case self::IN_TABLE:
- return $this->inTable($token);
- break;
- case self::IN_CAPTION:
- return $this->inCaption($token);
- break;
- case self::IN_CGROUP:
- return $this->inColumnGroup($token);
- break;
- case self::IN_TBODY:
- return $this->inTableBody($token);
- break;
- case self::IN_ROW:
- return $this->inRow($token);
- break;
- case self::IN_CELL:
- return $this->inCell($token);
- break;
- case self::IN_SELECT:
- return $this->inSelect($token);
- break;
- case self::AFTER_BODY:
- return $this->afterBody($token);
- break;
- case self::IN_FRAME:
- return $this->inFrameset($token);
- break;
- case self::AFTR_FRAME:
- return $this->afterFrameset($token);
- break;
- case self::END_PHASE:
- return $this->trailingEndPhase($token);
- break;
- }
- }
- }
-
- private function beforeHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token with the tag name "head" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
- /* Create an element for the token, append the new element to the
- current node and push it onto the stack of open elements. */
- $element = $this->insertElement($token);
-
- /* Set the head element pointer to this new element node. */
- $this->head_pointer = $element;
-
- /* Change the insertion mode to "in head". */
- $this->mode = self::IN_HEAD;
-
- /* A start tag token whose tag name is one of: "base", "link", "meta",
- "script", "style", "title". Or an end tag with the tag name "html".
- Or a character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE. Or any other start tag token */
- } elseif ($token['type'] === HTML5::STARTTAG ||
- ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
- ($token['type'] === HTML5::CHARACTR && !preg_match(
- '/^[\t\n\x0b\x0c ]$/',
- $token['data']
- ))
- ) {
- /* Act as if a start tag token with the tag name "head" and no
- attributes had been seen, then reprocess the current token. */
- $this->beforeHead(
- array(
- 'name' => 'head',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inHead($token);
-
- /* Any other end tag */
- } elseif ($token['type'] === HTML5::ENDTAG) {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function inHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE.
-
- THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
- or script element, append the character to the current node regardless
- of its content. */
- if (($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
- $token['type'] === HTML5::CHARACTR && in_array(
- end($this->stack)->nodeName,
- array('title', 'style', 'script')
- ))
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('title', 'style', 'script'))
- ) {
- array_pop($this->stack);
- return HTML5::PCDATA;
-
- /* A start tag with the tag name "title" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- } else {
- $element = $this->insertElement($token);
- }
-
- /* Switch the tokeniser's content model flag to the RCDATA state. */
- return HTML5::RCDATA;
-
- /* A start tag with the tag name "style" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- } else {
- $this->insertElement($token);
- }
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
-
- /* A start tag with the tag name "script" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
- /* Create an element for the token. */
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
-
- /* A start tag with the tag name "base", "link", or "meta" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('base', 'link', 'meta')
- )
- ) {
- /* Create an element for the token and append the new element to the
- node pointed to by the head element pointer, or, if that is null
- (innerHTML case), to the current node. */
- if ($this->head_pointer !== null) {
- $element = $this->insertElement($token, false);
- $this->head_pointer->appendChild($element);
- array_pop($this->stack);
-
- } else {
- $this->insertElement($token);
- }
-
- /* An end tag with the tag name "head" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
- /* If the current node is a head element, pop the current node off
- the stack of open elements. */
- if ($this->head_pointer->isSameNode(end($this->stack))) {
- array_pop($this->stack);
-
- /* Otherwise, this is a parse error. */
- } else {
- // k
- }
-
- /* Change the insertion mode to "after head". */
- $this->mode = self::AFTER_HEAD;
-
- /* A start tag with the tag name "head" or an end tag except "html". */
- } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
- ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* If the current node is a head element, act as if an end tag
- token with the tag name "head" had been seen. */
- if ($this->head_pointer->isSameNode(end($this->stack))) {
- $this->inHead(
- array(
- 'name' => 'head',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Otherwise, change the insertion mode to "after head". */
- } else {
- $this->mode = self::AFTER_HEAD;
- }
-
- /* Then, reprocess the current token. */
- return $this->afterHead($token);
- }
- }
-
- private function afterHead($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data attribute
- set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token with the tag name "body" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
- /* Insert a body element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in body". */
- $this->mode = self::IN_BODY;
-
- /* A start tag token with the tag name "frameset" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
- /* Insert a frameset element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in frameset". */
- $this->mode = self::IN_FRAME;
-
- /* A start tag token whose tag name is one of: "base", "link", "meta",
- "script", "style", "title" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('base', 'link', 'meta', 'script', 'style', 'title')
- )
- ) {
- /* Parse error. Switch the insertion mode back to "in head" and
- reprocess the token. */
- $this->mode = self::IN_HEAD;
- return $this->inHead($token);
-
- /* Anything else */
- } else {
- /* Act as if a start tag token with the tag name "body" and no
- attributes had been seen, and then reprocess the current token. */
- $this->afterHead(
- array(
- 'name' => 'body',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inBody($token);
- }
- }
-
- private function inBody($token)
- {
- /* Handle the token as follows: */
-
- switch ($token['type']) {
- /* A character token */
- case HTML5::CHARACTR:
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Append the token's character to the current node. */
- $this->insertText($token['data']);
- break;
-
- /* A comment token */
- case HTML5::COMMENT:
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
- break;
-
- case HTML5::STARTTAG:
- switch ($token['name']) {
- /* A start tag token whose tag name is one of: "script",
- "style" */
- case 'script':
- case 'style':
- /* Process the token as if the insertion mode had been "in
- head". */
- return $this->inHead($token);
- break;
-
- /* A start tag token whose tag name is one of: "base", "link",
- "meta", "title" */
- case 'base':
- case 'link':
- case 'meta':
- case 'title':
- /* Parse error. Process the token as if the insertion mode
- had been "in head". */
- return $this->inHead($token);
- break;
-
- /* A start tag token with the tag name "body" */
- case 'body':
- /* Parse error. If the second element on the stack of open
- elements is not a body element, or, if the stack of open
- elements has only one node on it, then ignore the token.
- (innerHTML case) */
- if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
- // Ignore
-
- /* Otherwise, for each attribute on the token, check to see
- if the attribute is already present on the body element (the
- second element) on the stack of open elements. If it is not,
- add the attribute and its corresponding value to that
- element. */
- } else {
- foreach ($token['attr'] as $attr) {
- if (!$this->stack[1]->hasAttribute($attr['name'])) {
- $this->stack[1]->setAttribute($attr['name'], $attr['value']);
- }
- }
- }
- break;
-
- /* A start tag whose tag name is one of: "address",
- "blockquote", "center", "dir", "div", "dl", "fieldset",
- "listing", "menu", "ol", "p", "ul" */
- case 'address':
- case 'blockquote':
- case 'center':
- case 'dir':
- case 'div':
- case 'dl':
- case 'fieldset':
- case 'listing':
- case 'menu':
- case 'ol':
- case 'p':
- case 'ul':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
- break;
-
- /* A start tag whose tag name is "form" */
- case 'form':
- /* If the form element pointer is not null, ignore the
- token with a parse error. */
- if ($this->form_pointer !== null) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* If the stack of open elements has a p element in
- scope, then act as if an end tag with the tag name p
- had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token, and set the
- form element pointer to point to the element created. */
- $element = $this->insertElement($token);
- $this->form_pointer = $element;
- }
- break;
-
- /* A start tag whose tag name is "li", "dd" or "dt" */
- case 'li':
- case 'dd':
- case 'dt':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- $stack_length = count($this->stack) - 1;
-
- for ($n = $stack_length; 0 <= $n; $n--) {
- /* 1. Initialise node to be the current node (the
- bottommost node of the stack). */
- $stop = false;
- $node = $this->stack[$n];
- $cat = $this->getElementCategory($node->tagName);
-
- /* 2. If node is an li, dd or dt element, then pop all
- the nodes from the current node up to node, including
- node, then stop this algorithm. */
- if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
- && ($node->tagName === 'dd' || $node->tagName === 'dt'))
- ) {
- for ($x = $stack_length; $x >= $n; $x--) {
- array_pop($this->stack);
- }
-
- break;
- }
-
- /* 3. If node is not in the formatting category, and is
- not in the phrasing category, and is not an address or
- div element, then stop this algorithm. */
- if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
- $node->tagName !== 'address' && $node->tagName !== 'div'
- ) {
- break;
- }
- }
-
- /* Finally, insert an HTML element with the same tag
- name as the token's. */
- $this->insertElement($token);
- break;
-
- /* A start tag token whose tag name is "plaintext" */
- case 'plaintext':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been
- seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- return HTML5::PLAINTEXT;
- break;
-
- /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
- "h5", "h6" */
- case 'h1':
- case 'h2':
- case 'h3':
- case 'h4':
- case 'h5':
- case 'h6':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the stack of open elements has in scope an element whose
- tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
- this is a parse error; pop elements from the stack until an
- element with one of those tag names has been popped from the
- stack. */
- while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
- array_pop($this->stack);
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
- break;
-
- /* A start tag whose tag name is "a" */
- case 'a':
- /* If the list of active formatting elements contains
- an element whose tag name is "a" between the end of the
- list and the last marker on the list (or the start of
- the list if there is no marker on the list), then this
- is a parse error; act as if an end tag with the tag name
- "a" had been seen, then remove that element from the list
- of active formatting elements and the stack of open
- elements if the end tag didn't already remove it (it
- might not have if the element is not in table scope). */
- $leng = count($this->a_formatting);
-
- for ($n = $leng - 1; $n >= 0; $n--) {
- if ($this->a_formatting[$n] === self::MARKER) {
- break;
-
- } elseif ($this->a_formatting[$n]->nodeName === 'a') {
- $this->emitToken(
- array(
- 'name' => 'a',
- 'type' => HTML5::ENDTAG
- )
- );
- break;
- }
- }
-
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $el = $this->insertElement($token);
-
- /* Add that element to the list of active formatting
- elements. */
- $this->a_formatting[] = $el;
- break;
-
- /* A start tag whose tag name is one of: "b", "big", "em", "font",
- "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
- case 'b':
- case 'big':
- case 'em':
- case 'font':
- case 'i':
- case 'nobr':
- case 's':
- case 'small':
- case 'strike':
- case 'strong':
- case 'tt':
- case 'u':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $el = $this->insertElement($token);
-
- /* Add that element to the list of active formatting
- elements. */
- $this->a_formatting[] = $el;
- break;
-
- /* A start tag token whose tag name is "button" */
- case 'button':
- /* If the stack of open elements has a button element in scope,
- then this is a parse error; act as if an end tag with the tag
- name "button" had been seen, then reprocess the token. (We don't
- do that. Unnecessary.) */
- if ($this->elementInScope('button')) {
- $this->inBody(
- array(
- 'name' => 'button',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
- break;
-
- /* A start tag token whose tag name is one of: "marquee", "object" */
- case 'marquee':
- case 'object':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
- break;
-
- /* A start tag token whose tag name is "xmp" */
- case 'xmp':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Switch the content model flag to the CDATA state. */
- return HTML5::CDATA;
- break;
-
- /* A start tag whose tag name is "table" */
- case 'table':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in table". */
- $this->mode = self::IN_TABLE;
- break;
-
- /* A start tag whose tag name is one of: "area", "basefont",
- "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
- case 'area':
- case 'basefont':
- case 'bgsound':
- case 'br':
- case 'embed':
- case 'img':
- case 'param':
- case 'spacer':
- case 'wbr':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "hr" */
- case 'hr':
- /* If the stack of open elements has a p element in scope,
- then act as if an end tag with the tag name p had been seen. */
- if ($this->elementInScope('p')) {
- $this->emitToken(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "image" */
- case 'image':
- /* Parse error. Change the token's tag name to "img" and
- reprocess it. (Don't ask.) */
- $token['name'] = 'img';
- return $this->inBody($token);
- break;
-
- /* A start tag whose tag name is "input" */
- case 'input':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an input element for the token. */
- $element = $this->insertElement($token, false);
-
- /* If the form element pointer is not null, then associate the
- input element with the form element pointed to by the form
- element pointer. */
- $this->form_pointer !== null
- ? $this->form_pointer->appendChild($element)
- : end($this->stack)->appendChild($element);
-
- /* Pop that input element off the stack of open elements. */
- array_pop($this->stack);
- break;
-
- /* A start tag whose tag name is "isindex" */
- case 'isindex':
- /* Parse error. */
- // w/e
-
- /* If the form element pointer is not null,
- then ignore the token. */
- if ($this->form_pointer === null) {
- /* Act as if a start tag token with the tag name "form" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'body',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "hr" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'hr',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "p" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'p',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a start tag token with the tag name "label"
- had been seen. */
- $this->inBody(
- array(
- 'name' => 'label',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- /* Act as if a stream of character tokens had been seen. */
- $this->insertText(
- 'This is a searchable index. ' .
- 'Insert your search keywords here: '
- );
-
- /* Act as if a start tag token with the tag name "input"
- had been seen, with all the attributes from the "isindex"
- token, except with the "name" attribute set to the value
- "isindex" (ignoring any explicit "name" attribute). */
- $attr = $token['attr'];
- $attr[] = array('name' => 'name', 'value' => 'isindex');
-
- $this->inBody(
- array(
- 'name' => 'input',
- 'type' => HTML5::STARTTAG,
- 'attr' => $attr
- )
- );
-
- /* Act as if a stream of character tokens had been seen
- (see below for what they should say). */
- $this->insertText(
- 'This is a searchable index. ' .
- 'Insert your search keywords here: '
- );
-
- /* Act as if an end tag token with the tag name "label"
- had been seen. */
- $this->inBody(
- array(
- 'name' => 'label',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if an end tag token with the tag name "p" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'p',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if a start tag token with the tag name "hr" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'hr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* Act as if an end tag token with the tag name "form" had
- been seen. */
- $this->inBody(
- array(
- 'name' => 'form',
- 'type' => HTML5::ENDTAG
- )
- );
- }
- break;
-
- /* A start tag whose tag name is "textarea" */
- case 'textarea':
- $this->insertElement($token);
-
- /* Switch the tokeniser's content model flag to the
- RCDATA state. */
- return HTML5::RCDATA;
- break;
-
- /* A start tag whose tag name is one of: "iframe", "noembed",
- "noframes" */
- case 'iframe':
- case 'noembed':
- case 'noframes':
- $this->insertElement($token);
-
- /* Switch the tokeniser's content model flag to the CDATA state. */
- return HTML5::CDATA;
- break;
-
- /* A start tag whose tag name is "select" */
- case 'select':
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Change the insertion mode to "in select". */
- $this->mode = self::IN_SELECT;
- break;
-
- /* A start or end tag whose tag name is one of: "caption", "col",
- "colgroup", "frame", "frameset", "head", "option", "optgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr". */
- case 'caption':
- case 'col':
- case 'colgroup':
- case 'frame':
- case 'frameset':
- case 'head':
- case 'option':
- case 'optgroup':
- case 'tbody':
- case 'td':
- case 'tfoot':
- case 'th':
- case 'thead':
- case 'tr':
- // Parse error. Ignore the token.
- break;
-
- /* A start or end tag whose tag name is one of: "event-source",
- "section", "nav", "article", "aside", "header", "footer",
- "datagrid", "command" */
- case 'event-source':
- case 'section':
- case 'nav':
- case 'article':
- case 'aside':
- case 'header':
- case 'footer':
- case 'datagrid':
- case 'command':
- // Work in progress!
- break;
-
- /* A start tag token not covered by the previous entries */
- default:
- /* Reconstruct the active formatting elements, if any. */
- $this->reconstructActiveFormattingElements();
-
- $this->insertElement($token, true, true);
- break;
- }
- break;
-
- case HTML5::ENDTAG:
- switch ($token['name']) {
- /* An end tag with the tag name "body" */
- case 'body':
- /* If the second element in the stack of open elements is
- not a body element, this is a parse error. Ignore the token.
- (innerHTML case) */
- if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
- // Ignore.
-
- /* If the current node is not the body element, then this
- is a parse error. */
- } elseif (end($this->stack)->nodeName !== 'body') {
- // Parse error.
- }
-
- /* Change the insertion mode to "after body". */
- $this->mode = self::AFTER_BODY;
- break;
-
- /* An end tag with the tag name "html" */
- case 'html':
- /* Act as if an end tag with tag name "body" had been seen,
- then, if that token wasn't ignored, reprocess the current
- token. */
- $this->inBody(
- array(
- 'name' => 'body',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->afterBody($token);
- break;
-
- /* An end tag whose tag name is one of: "address", "blockquote",
- "center", "dir", "div", "dl", "fieldset", "listing", "menu",
- "ol", "pre", "ul" */
- case 'address':
- case 'blockquote':
- case 'center':
- case 'dir':
- case 'div':
- case 'dl':
- case 'fieldset':
- case 'listing':
- case 'menu':
- case 'ol':
- case 'pre':
- case 'ul':
- /* If the stack of open elements has an element in scope
- with the same tag name as that of the token, then generate
- implied end tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with
- the same tag name as that of the token, then this
- is a parse error. */
- // w/e
-
- /* If the stack of open elements has an element in
- scope with the same tag name as that of the token,
- then pop elements from this stack until an element
- with that tag name has been popped from the stack. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is "form" */
- case 'form':
- /* If the stack of open elements has an element in scope
- with the same tag name as that of the token, then generate
- implied end tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- }
-
- if (end($this->stack)->nodeName !== $token['name']) {
- /* Now, if the current node is not an element with the
- same tag name as that of the token, then this is a parse
- error. */
- // w/e
-
- } else {
- /* Otherwise, if the current node is an element with
- the same tag name as that of the token pop that element
- from the stack. */
- array_pop($this->stack);
- }
-
- /* In any case, set the form element pointer to null. */
- $this->form_pointer = null;
- break;
-
- /* An end tag whose tag name is "p" */
- case 'p':
- /* If the stack of open elements has a p element in scope,
- then generate implied end tags, except for p elements. */
- if ($this->elementInScope('p')) {
- $this->generateImpliedEndTags(array('p'));
-
- /* If the current node is not a p element, then this is
- a parse error. */
- // k
-
- /* If the stack of open elements has a p element in
- scope, then pop elements from this stack until the stack
- no longer has a p element in scope. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->elementInScope('p')) {
- array_pop($this->stack);
-
- } else {
- break;
- }
- }
- }
- break;
-
- /* An end tag whose tag name is "dd", "dt", or "li" */
- case 'dd':
- case 'dt':
- case 'li':
- /* If the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then
- generate implied end tags, except for elements with the
- same tag name as the token. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags(array($token['name']));
-
- /* If the current node is not an element with the same
- tag name as the token, then this is a parse error. */
- // w/e
-
- /* If the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then
- pop elements from this stack until an element with that
- tag name has been popped from the stack. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
- "h5", "h6" */
- case 'h1':
- case 'h2':
- case 'h3':
- case 'h4':
- case 'h5':
- case 'h6':
- $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
-
- /* If the stack of open elements has in scope an element whose
- tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
- generate implied end tags. */
- if ($this->elementInScope($elements)) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with the same
- tag name as that of the token, then this is a parse error. */
- // w/e
-
- /* If the stack of open elements has in scope an element
- whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
- "h6", then pop elements from the stack until an element
- with one of those tag names has been popped from the stack. */
- while ($this->elementInScope($elements)) {
- array_pop($this->stack);
- }
- }
- break;
-
- /* An end tag whose tag name is one of: "a", "b", "big", "em",
- "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
- case 'a':
- case 'b':
- case 'big':
- case 'em':
- case 'font':
- case 'i':
- case 'nobr':
- case 's':
- case 'small':
- case 'strike':
- case 'strong':
- case 'tt':
- case 'u':
- /* 1. Let the formatting element be the last element in
- the list of active formatting elements that:
- * is between the end of the list and the last scope
- marker in the list, if any, or the start of the list
- otherwise, and
- * has the same tag name as the token.
- */
- while (true) {
- for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
- if ($this->a_formatting[$a] === self::MARKER) {
- break;
-
- } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
- $formatting_element = $this->a_formatting[$a];
- $in_stack = in_array($formatting_element, $this->stack, true);
- $fe_af_pos = $a;
- break;
- }
- }
-
- /* If there is no such node, or, if that node is
- also in the stack of open elements but the element
- is not in scope, then this is a parse error. Abort
- these steps. The token is ignored. */
- if (!isset($formatting_element) || ($in_stack &&
- !$this->elementInScope($token['name']))
- ) {
- break;
-
- /* Otherwise, if there is such a node, but that node
- is not in the stack of open elements, then this is a
- parse error; remove the element from the list, and
- abort these steps. */
- } elseif (isset($formatting_element) && !$in_stack) {
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
- break;
- }
-
- /* 2. Let the furthest block be the topmost node in the
- stack of open elements that is lower in the stack
- than the formatting element, and is not an element in
- the phrasing or formatting categories. There might
- not be one. */
- $fe_s_pos = array_search($formatting_element, $this->stack, true);
- $length = count($this->stack);
-
- for ($s = $fe_s_pos + 1; $s < $length; $s++) {
- $category = $this->getElementCategory($this->stack[$s]->nodeName);
-
- if ($category !== self::PHRASING && $category !== self::FORMATTING) {
- $furthest_block = $this->stack[$s];
- }
- }
-
- /* 3. If there is no furthest block, then the UA must
- skip the subsequent steps and instead just pop all
- the nodes from the bottom of the stack of open
- elements, from the current node up to the formatting
- element, and remove the formatting element from the
- list of active formatting elements. */
- if (!isset($furthest_block)) {
- for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
- array_pop($this->stack);
- }
-
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
- break;
- }
-
- /* 4. Let the common ancestor be the element
- immediately above the formatting element in the stack
- of open elements. */
- $common_ancestor = $this->stack[$fe_s_pos - 1];
-
- /* 5. If the furthest block has a parent node, then
- remove the furthest block from its parent node. */
- if ($furthest_block->parentNode !== null) {
- $furthest_block->parentNode->removeChild($furthest_block);
- }
-
- /* 6. Let a bookmark note the position of the
- formatting element in the list of active formatting
- elements relative to the elements on either side
- of it in the list. */
- $bookmark = $fe_af_pos;
-
- /* 7. Let node and last node be the furthest block.
- Follow these steps: */
- $node = $furthest_block;
- $last_node = $furthest_block;
-
- while (true) {
- for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
- /* 7.1 Let node be the element immediately
- prior to node in the stack of open elements. */
- $node = $this->stack[$n];
-
- /* 7.2 If node is not in the list of active
- formatting elements, then remove node from
- the stack of open elements and then go back
- to step 1. */
- if (!in_array($node, $this->a_formatting, true)) {
- unset($this->stack[$n]);
- $this->stack = array_merge($this->stack);
-
- } else {
- break;
- }
- }
-
- /* 7.3 Otherwise, if node is the formatting
- element, then go to the next step in the overall
- algorithm. */
- if ($node === $formatting_element) {
- break;
-
- /* 7.4 Otherwise, if last node is the furthest
- block, then move the aforementioned bookmark to
- be immediately after the node in the list of
- active formatting elements. */
- } elseif ($last_node === $furthest_block) {
- $bookmark = array_search($node, $this->a_formatting, true) + 1;
- }
-
- /* 7.5 If node has any children, perform a
- shallow clone of node, replace the entry for
- node in the list of active formatting elements
- with an entry for the clone, replace the entry
- for node in the stack of open elements with an
- entry for the clone, and let node be the clone. */
- if ($node->hasChildNodes()) {
- $clone = $node->cloneNode();
- $s_pos = array_search($node, $this->stack, true);
- $a_pos = array_search($node, $this->a_formatting, true);
-
- $this->stack[$s_pos] = $clone;
- $this->a_formatting[$a_pos] = $clone;
- $node = $clone;
- }
-
- /* 7.6 Insert last node into node, first removing
- it from its previous parent node if any. */
- if ($last_node->parentNode !== null) {
- $last_node->parentNode->removeChild($last_node);
- }
-
- $node->appendChild($last_node);
-
- /* 7.7 Let last node be node. */
- $last_node = $node;
- }
-
- /* 8. Insert whatever last node ended up being in
- the previous step into the common ancestor node,
- first removing it from its previous parent node if
- any. */
- if ($last_node->parentNode !== null) {
- $last_node->parentNode->removeChild($last_node);
- }
-
- $common_ancestor->appendChild($last_node);
-
- /* 9. Perform a shallow clone of the formatting
- element. */
- $clone = $formatting_element->cloneNode();
-
- /* 10. Take all of the child nodes of the furthest
- block and append them to the clone created in the
- last step. */
- while ($furthest_block->hasChildNodes()) {
- $child = $furthest_block->firstChild;
- $furthest_block->removeChild($child);
- $clone->appendChild($child);
- }
-
- /* 11. Append that clone to the furthest block. */
- $furthest_block->appendChild($clone);
-
- /* 12. Remove the formatting element from the list
- of active formatting elements, and insert the clone
- into the list of active formatting elements at the
- position of the aforementioned bookmark. */
- $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
- unset($this->a_formatting[$fe_af_pos]);
- $this->a_formatting = array_merge($this->a_formatting);
-
- $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
- $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
- $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
-
- /* 13. Remove the formatting element from the stack
- of open elements, and insert the clone into the stack
- of open elements immediately after (i.e. in a more
- deeply nested position than) the position of the
- furthest block in that stack. */
- $fe_s_pos = array_search($formatting_element, $this->stack, true);
- $fb_s_pos = array_search($furthest_block, $this->stack, true);
- unset($this->stack[$fe_s_pos]);
-
- $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
- $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
- $this->stack = array_merge($s_part1, array($clone), $s_part2);
-
- /* 14. Jump back to step 1 in this series of steps. */
- unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
- }
- break;
-
- /* An end tag token whose tag name is one of: "button",
- "marquee", "object" */
- case 'button':
- case 'marquee':
- case 'object':
- /* If the stack of open elements has an element in scope whose
- tag name matches the tag name of the token, then generate implied
- tags. */
- if ($this->elementInScope($token['name'])) {
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not an element with the same
- tag name as the token, then this is a parse error. */
- // k
-
- /* Now, if the stack of open elements has an element in scope
- whose tag name matches the tag name of the token, then pop
- elements from the stack until that element has been popped from
- the stack, and clear the list of active formatting elements up
- to the last marker. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === $token['name']) {
- $n = -1;
- }
-
- array_pop($this->stack);
- }
-
- $marker = end(array_keys($this->a_formatting, self::MARKER, true));
-
- for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
- array_pop($this->a_formatting);
- }
- }
- break;
-
- /* Or an end tag whose tag name is one of: "area", "basefont",
- "bgsound", "br", "embed", "hr", "iframe", "image", "img",
- "input", "isindex", "noembed", "noframes", "param", "select",
- "spacer", "table", "textarea", "wbr" */
- case 'area':
- case 'basefont':
- case 'bgsound':
- case 'br':
- case 'embed':
- case 'hr':
- case 'iframe':
- case 'image':
- case 'img':
- case 'input':
- case 'isindex':
- case 'noembed':
- case 'noframes':
- case 'param':
- case 'select':
- case 'spacer':
- case 'table':
- case 'textarea':
- case 'wbr':
- // Parse error. Ignore the token.
- break;
-
- /* An end tag token not covered by the previous entries */
- default:
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- /* Initialise node to be the current node (the bottommost
- node of the stack). */
- $node = end($this->stack);
-
- /* If node has the same tag name as the end tag token,
- then: */
- if ($token['name'] === $node->nodeName) {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* If the tag name of the end tag token does not
- match the tag name of the current node, this is a
- parse error. */
- // k
-
- /* Pop all the nodes from the current node up to
- node, including node, then stop this algorithm. */
- for ($x = count($this->stack) - $n; $x >= $n; $x--) {
- array_pop($this->stack);
- }
-
- } else {
- $category = $this->getElementCategory($node);
-
- if ($category !== self::SPECIAL && $category !== self::SCOPING) {
- /* Otherwise, if node is in neither the formatting
- category nor the phrasing category, then this is a
- parse error. Stop this algorithm. The end tag token
- is ignored. */
- return false;
- }
- }
- }
- break;
- }
- break;
- }
- }
-
- private function inTable($token)
- {
- $clear = array('html', 'table');
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $text = $this->dom->createTextNode($token['data']);
- end($this->stack)->appendChild($text);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- end($this->stack)->appendChild($comment);
-
- /* A start tag whose tag name is "caption" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'caption'
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert a marker at the end of the list of active
- formatting elements. */
- $this->a_formatting[] = self::MARKER;
-
- /* Insert an HTML element for the token, then switch the
- insertion mode to "in caption". */
- $this->insertElement($token);
- $this->mode = self::IN_CAPTION;
-
- /* A start tag whose tag name is "colgroup" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'colgroup'
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the
- insertion mode to "in column group". */
- $this->insertElement($token);
- $this->mode = self::IN_CGROUP;
-
- /* A start tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'col'
- ) {
- $this->inTable(
- array(
- 'name' => 'colgroup',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- $this->inColumnGroup($token);
-
- /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('tbody', 'tfoot', 'thead')
- )
- ) {
- /* Clear the stack back to a table context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the insertion
- mode to "in table body". */
- $this->insertElement($token);
- $this->mode = self::IN_TBODY;
-
- /* A start tag whose tag name is one of: "td", "th", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- in_array($token['name'], array('td', 'th', 'tr'))
- ) {
- /* Act as if a start tag token with the tag name "tbody" had been
- seen, then reprocess the current token. */
- $this->inTable(
- array(
- 'name' => 'tbody',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inTableBody($token);
-
- /* A start tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'table'
- ) {
- /* Parse error. Act as if an end tag token with the tag name "table"
- had been seen, then, if that token wasn't ignored, reprocess the
- current token. */
- $this->inTable(
- array(
- 'name' => 'table',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->mainPhase($token);
-
- /* An end tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'table'
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- return false;
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not a table element, then this
- is a parse error. */
- // w/e
-
- /* Pop elements from this stack until a table element has been
- popped from the stack. */
- while (true) {
- $current = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($current === 'table') {
- break;
- }
- }
-
- /* Reset the insertion mode appropriately. */
- $this->resetInsertionMode();
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array(
- 'body',
- 'caption',
- 'col',
- 'colgroup',
- 'html',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* Parse error. Process the token as if the insertion mode was "in
- body", with the following exception: */
-
- /* If the current node is a table, tbody, tfoot, thead, or tr
- element, then, whenever a node would be inserted into the current
- node, it must instead be inserted into the foster parent element. */
- if (in_array(
- end($this->stack)->nodeName,
- array('table', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* The foster parent element is the parent element of the last
- table element in the stack of open elements, if there is a
- table element and it has such a parent element. If there is no
- table element in the stack of open elements (innerHTML case),
- then the foster parent element is the first element in the
- stack of open elements (the html element). Otherwise, if there
- is a table element in the stack of open elements, but the last
- table element in the stack of open elements has no parent, or
- its parent node is not an element, then the foster parent
- element is the element before the last table element in the
- stack of open elements. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === 'table') {
- $table = $this->stack[$n];
- break;
- }
- }
-
- if (isset($table) && $table->parentNode !== null) {
- $this->foster_parent = $table->parentNode;
-
- } elseif (!isset($table)) {
- $this->foster_parent = $this->stack[0];
-
- } elseif (isset($table) && ($table->parentNode === null ||
- $table->parentNode->nodeType !== XML_ELEMENT_NODE)
- ) {
- $this->foster_parent = $this->stack[$n - 1];
- }
- }
-
- $this->inBody($token);
- }
- }
-
- private function inCaption($token)
- {
- /* An end tag whose tag name is "caption" */
- if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags. */
- $this->generateImpliedEndTags();
-
- /* Now, if the current node is not a caption element, then this
- is a parse error. */
- // w/e
-
- /* Pop elements from this stack until a caption element has
- been popped from the stack. */
- while (true) {
- $node = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($node === 'caption') {
- break;
- }
- }
-
- /* Clear the list of active formatting elements up to the last
- marker. */
- $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
- /* Switch the insertion mode to "in table". */
- $this->mode = self::IN_TABLE;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
- name is "table" */
- } elseif (($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )) || ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'table')
- ) {
- /* Parse error. Act as if an end tag with the tag name "caption"
- had been seen, then, if that token wasn't ignored, reprocess the
- current token. */
- $this->inCaption(
- array(
- 'name' => 'caption',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inTable($token);
-
- /* An end tag whose tag name is one of: "body", "col", "colgroup",
- "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array(
- 'body',
- 'col',
- 'colgroup',
- 'html',
- 'tbody',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- // Parse error. Ignore the token.
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in body". */
- $this->inBody($token);
- }
- }
-
- private function inColumnGroup($token)
- {
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $text = $this->dom->createTextNode($token['data']);
- end($this->stack)->appendChild($text);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- end($this->stack)->appendChild($comment);
-
- /* A start tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
- /* Insert a col element for the token. Immediately pop the current
- node off the stack of open elements. */
- $this->insertElement($token);
- array_pop($this->stack);
-
- /* An end tag whose tag name is "colgroup" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'colgroup'
- ) {
- /* If the current node is the root html element, then this is a
- parse error, ignore the token. (innerHTML case) */
- if (end($this->stack)->nodeName === 'html') {
- // Ignore
-
- /* Otherwise, pop the current node (which will be a colgroup
- element) from the stack of open elements. Switch the insertion
- mode to "in table". */
- } else {
- array_pop($this->stack);
- $this->mode = self::IN_TABLE;
- }
-
- /* An end tag whose tag name is "col" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Act as if an end tag with the tag name "colgroup" had been seen,
- and then, if that token wasn't ignored, reprocess the current token. */
- $this->inColumnGroup(
- array(
- 'name' => 'colgroup',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inTable($token);
- }
- }
-
- private function inTableBody($token)
- {
- $clear = array('tbody', 'tfoot', 'thead', 'html');
-
- /* A start tag whose tag name is "tr" */
- if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert a tr element for the token, then switch the insertion
- mode to "in row". */
- $this->insertElement($token);
- $this->mode = self::IN_ROW;
-
- /* A start tag whose tag name is one of: "th", "td" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- ($token['name'] === 'th' || $token['name'] === 'td')
- ) {
- /* Parse error. Act as if a start tag with the tag name "tr" had
- been seen, then reprocess the current token. */
- $this->inTableBody(
- array(
- 'name' => 'tr',
- 'type' => HTML5::STARTTAG,
- 'attr' => array()
- )
- );
-
- return $this->inRow($token);
-
- /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('tbody', 'tfoot', 'thead'))
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Pop the current node from the stack of open elements. Switch
- the insertion mode to "in table". */
- array_pop($this->stack);
- $this->mode = self::IN_TABLE;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
- } elseif (($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
- )) ||
- ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
- ) {
- /* If the stack of open elements does not have a tbody, thead, or
- tfoot element in table scope, this is a parse error. Ignore the
- token. (innerHTML case) */
- if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table body context. */
- $this->clearStackToTableContext($clear);
-
- /* Act as if an end tag with the same tag name as the current
- node ("tbody", "tfoot", or "thead") had been seen, then
- reprocess the current token. */
- $this->inTableBody(
- array(
- 'name' => end($this->stack)->nodeName,
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->mainPhase($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "td", "th", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in table". */
- $this->inTable($token);
- }
- }
-
- private function inRow($token)
- {
- $clear = array('tr', 'html');
-
- /* A start tag whose tag name is one of: "th", "td" */
- if ($token['type'] === HTML5::STARTTAG &&
- ($token['name'] === 'th' || $token['name'] === 'td')
- ) {
- /* Clear the stack back to a table row context. */
- $this->clearStackToTableContext($clear);
-
- /* Insert an HTML element for the token, then switch the insertion
- mode to "in cell". */
- $this->insertElement($token);
- $this->mode = self::IN_CELL;
-
- /* Insert a marker at the end of the list of active formatting
- elements. */
- $this->a_formatting[] = self::MARKER;
-
- /* An end tag whose tag name is "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Clear the stack back to a table row context. */
- $this->clearStackToTableContext($clear);
-
- /* Pop the current node (which will be a tr element) from the
- stack of open elements. Switch the insertion mode to "in table
- body". */
- array_pop($this->stack);
- $this->mode = self::IN_TBODY;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* Act as if an end tag with the tag name "tr" had been seen, then,
- if that token wasn't ignored, reprocess the current token. */
- $this->inRow(
- array(
- 'name' => 'tr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inCell($token);
-
- /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- in_array($token['name'], array('tbody', 'tfoot', 'thead'))
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Otherwise, act as if an end tag with the tag name "tr" had
- been seen, then reprocess the current token. */
- $this->inRow(
- array(
- 'name' => 'tr',
- 'type' => HTML5::ENDTAG
- )
- );
-
- return $this->inCell($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html", "td", "th" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in table". */
- $this->inTable($token);
- }
- }
-
- private function inCell($token)
- {
- /* An end tag whose tag name is one of: "td", "th" */
- if ($token['type'] === HTML5::ENDTAG &&
- ($token['name'] === 'td' || $token['name'] === 'th')
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as that of the token, then this is a
- parse error and the token must be ignored. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise: */
- } else {
- /* Generate implied end tags, except for elements with the same
- tag name as the token. */
- $this->generateImpliedEndTags(array($token['name']));
-
- /* Now, if the current node is not an element with the same tag
- name as the token, then this is a parse error. */
- // k
-
- /* Pop elements from this stack until an element with the same
- tag name as the token has been popped from the stack. */
- while (true) {
- $node = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($node === $token['name']) {
- break;
- }
- }
-
- /* Clear the list of active formatting elements up to the last
- marker. */
- $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
- /* Switch the insertion mode to "in row". (The current node
- will be a tr element at this point.) */
- $this->mode = self::IN_ROW;
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- /* If the stack of open elements does not have a td or th element
- in table scope, then this is a parse error; ignore the token.
- (innerHTML case) */
- if (!$this->elementInScope(array('td', 'th'), true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* A start tag whose tag name is one of: "caption", "col", "colgroup",
- "tbody", "td", "tfoot", "th", "thead", "tr" */
- } elseif ($token['type'] === HTML5::STARTTAG && in_array(
- $token['name'],
- array(
- 'caption',
- 'col',
- 'colgroup',
- 'tbody',
- 'td',
- 'tfoot',
- 'th',
- 'thead',
- 'tr'
- )
- )
- ) {
- /* If the stack of open elements does not have a td or th element
- in table scope, then this is a parse error; ignore the token.
- (innerHTML case) */
- if (!$this->elementInScope(array('td', 'th'), true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* An end tag whose tag name is one of: "body", "caption", "col",
- "colgroup", "html" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('body', 'caption', 'col', 'colgroup', 'html')
- )
- ) {
- /* Parse error. Ignore the token. */
-
- /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
- "thead", "tr" */
- } elseif ($token['type'] === HTML5::ENDTAG && in_array(
- $token['name'],
- array('table', 'tbody', 'tfoot', 'thead', 'tr')
- )
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as that of the token (which can only
- happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
- then this is a parse error and the token must be ignored. */
- if (!$this->elementInScope($token['name'], true)) {
- // Ignore.
-
- /* Otherwise, close the cell (see below) and reprocess the current
- token. */
- } else {
- $this->closeCell();
- return $this->inRow($token);
- }
-
- /* Anything else */
- } else {
- /* Process the token as if the insertion mode was "in body". */
- $this->inBody($token);
- }
- }
-
- private function inSelect($token)
- {
- /* Handle the token as follows: */
-
- /* A character token */
- if ($token['type'] === HTML5::CHARACTR) {
- /* Append the token's character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag token whose tag name is "option" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'option'
- ) {
- /* If the current node is an option element, act as if an end tag
- with the tag name "option" had been seen. */
- if (end($this->stack)->nodeName === 'option') {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* A start tag token whose tag name is "optgroup" */
- } elseif ($token['type'] === HTML5::STARTTAG &&
- $token['name'] === 'optgroup'
- ) {
- /* If the current node is an option element, act as if an end tag
- with the tag name "option" had been seen. */
- if (end($this->stack)->nodeName === 'option') {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the current node is an optgroup element, act as if an end tag
- with the tag name "optgroup" had been seen. */
- if (end($this->stack)->nodeName === 'optgroup') {
- $this->inSelect(
- array(
- 'name' => 'optgroup',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* An end tag token whose tag name is "optgroup" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'optgroup'
- ) {
- /* First, if the current node is an option element, and the node
- immediately before it in the stack of open elements is an optgroup
- element, then act as if an end tag with the tag name "option" had
- been seen. */
- $elements_in_stack = count($this->stack);
-
- if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
- $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
- ) {
- $this->inSelect(
- array(
- 'name' => 'option',
- 'type' => HTML5::ENDTAG
- )
- );
- }
-
- /* If the current node is an optgroup element, then pop that node
- from the stack of open elements. Otherwise, this is a parse error,
- ignore the token. */
- if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
- array_pop($this->stack);
- }
-
- /* An end tag token whose tag name is "option" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'option'
- ) {
- /* If the current node is an option element, then pop that node
- from the stack of open elements. Otherwise, this is a parse error,
- ignore the token. */
- if (end($this->stack)->nodeName === 'option') {
- array_pop($this->stack);
- }
-
- /* An end tag whose tag name is "select" */
- } elseif ($token['type'] === HTML5::ENDTAG &&
- $token['name'] === 'select'
- ) {
- /* If the stack of open elements does not have an element in table
- scope with the same tag name as the token, this is a parse error.
- Ignore the token. (innerHTML case) */
- if (!$this->elementInScope($token['name'], true)) {
- // w/e
-
- /* Otherwise: */
- } else {
- /* Pop elements from the stack of open elements until a select
- element has been popped from the stack. */
- while (true) {
- $current = end($this->stack)->nodeName;
- array_pop($this->stack);
-
- if ($current === 'select') {
- break;
- }
- }
-
- /* Reset the insertion mode appropriately. */
- $this->resetInsertionMode();
- }
-
- /* A start tag whose tag name is "select" */
- } elseif ($token['name'] === 'select' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Parse error. Act as if the token had been an end tag with the
- tag name "select" instead. */
- $this->inSelect(
- array(
- 'name' => 'select',
- 'type' => HTML5::ENDTAG
- )
- );
-
- /* An end tag whose tag name is one of: "caption", "table", "tbody",
- "tfoot", "thead", "tr", "td", "th" */
- } elseif (in_array(
- $token['name'],
- array(
- 'caption',
- 'table',
- 'tbody',
- 'tfoot',
- 'thead',
- 'tr',
- 'td',
- 'th'
- )
- ) && $token['type'] === HTML5::ENDTAG
- ) {
- /* Parse error. */
- // w/e
-
- /* If the stack of open elements has an element in table scope with
- the same tag name as that of the token, then act as if an end tag
- with the tag name "select" had been seen, and reprocess the token.
- Otherwise, ignore the token. */
- if ($this->elementInScope($token['name'], true)) {
- $this->inSelect(
- array(
- 'name' => 'select',
- 'type' => HTML5::ENDTAG
- )
- );
-
- $this->mainPhase($token);
- }
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function afterBody($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Process the token as it would be processed if the insertion mode
- was "in body". */
- $this->inBody($token);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the first element in the stack of open
- elements (the html element), with the data attribute set to the
- data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->stack[0]->appendChild($comment);
-
- /* An end tag with the tag name "html" */
- } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
- /* If the parser was originally created in order to handle the
- setting of an element's innerHTML attribute, this is a parse error;
- ignore the token. (The element will be an html element in this
- case.) (innerHTML case) */
-
- /* Otherwise, switch to the trailing end phase. */
- $this->phase = self::END_PHASE;
-
- /* Anything else */
- } else {
- /* Parse error. Set the insertion mode to "in body" and reprocess
- the token. */
- $this->mode = self::IN_BODY;
- return $this->inBody($token);
- }
- }
-
- private function inFrameset($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* A start tag with the tag name "frameset" */
- } elseif ($token['name'] === 'frameset' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- $this->insertElement($token);
-
- /* An end tag with the tag name "frameset" */
- } elseif ($token['name'] === 'frameset' &&
- $token['type'] === HTML5::ENDTAG
- ) {
- /* If the current node is the root html element, then this is a
- parse error; ignore the token. (innerHTML case) */
- if (end($this->stack)->nodeName === 'html') {
- // Ignore
-
- } else {
- /* Otherwise, pop the current node from the stack of open
- elements. */
- array_pop($this->stack);
-
- /* If the parser was not originally created in order to handle
- the setting of an element's innerHTML attribute (innerHTML case),
- and the current node is no longer a frameset element, then change
- the insertion mode to "after frameset". */
- $this->mode = self::AFTR_FRAME;
- }
-
- /* A start tag with the tag name "frame" */
- } elseif ($token['name'] === 'frame' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Insert an HTML element for the token. */
- $this->insertElement($token);
-
- /* Immediately pop the current node off the stack of open elements. */
- array_pop($this->stack);
-
- /* A start tag with the tag name "noframes" */
- } elseif ($token['name'] === 'noframes' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Process the token as if the insertion mode had been "in body". */
- $this->inBody($token);
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function afterFrameset($token)
- {
- /* Handle the token as follows: */
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
- if ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Append the character to the current node. */
- $this->insertText($token['data']);
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the current node with the data
- attribute set to the data given in the comment token. */
- $this->insertComment($token['data']);
-
- /* An end tag with the tag name "html" */
- } elseif ($token['name'] === 'html' &&
- $token['type'] === HTML5::ENDTAG
- ) {
- /* Switch to the trailing end phase. */
- $this->phase = self::END_PHASE;
-
- /* A start tag with the tag name "noframes" */
- } elseif ($token['name'] === 'noframes' &&
- $token['type'] === HTML5::STARTTAG
- ) {
- /* Process the token as if the insertion mode had been "in body". */
- $this->inBody($token);
-
- /* Anything else */
- } else {
- /* Parse error. Ignore the token. */
- }
- }
-
- private function trailingEndPhase($token)
- {
- /* After the main phase, as each token is emitted from the tokenisation
- stage, it must be processed as described in this section. */
-
- /* A DOCTYPE token */
- if ($token['type'] === HTML5::DOCTYPE) {
- // Parse error. Ignore the token.
-
- /* A comment token */
- } elseif ($token['type'] === HTML5::COMMENT) {
- /* Append a Comment node to the Document object with the data
- attribute set to the data given in the comment token. */
- $comment = $this->dom->createComment($token['data']);
- $this->dom->appendChild($comment);
-
- /* A character token that is one of one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE */
- } elseif ($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
- ) {
- /* Process the token as it would be processed in the main phase. */
- $this->mainPhase($token);
-
- /* A character token that is not one of U+0009 CHARACTER TABULATION,
- U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
- or U+0020 SPACE. Or a start tag token. Or an end tag token. */
- } elseif (($token['type'] === HTML5::CHARACTR &&
- preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
- $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
- ) {
- /* Parse error. Switch back to the main phase and reprocess the
- token. */
- $this->phase = self::MAIN_PHASE;
- return $this->mainPhase($token);
-
- /* An end-of-file token */
- } elseif ($token['type'] === HTML5::EOF) {
- /* OMG DONE!! */
- }
- }
-
- private function insertElement($token, $append = true, $check = false)
- {
- // Proprietary workaround for libxml2's limitations with tag names
- if ($check) {
- // Slightly modified HTML5 tag-name modification,
- // removing anything that's not an ASCII letter, digit, or hyphen
- $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
- // Remove leading hyphens and numbers
- $token['name'] = ltrim($token['name'], '-0..9');
- // In theory, this should ever be needed, but just in case
- if ($token['name'] === '') {
- $token['name'] = 'span';
- } // arbitrary generic choice
- }
-
- $el = $this->dom->createElement($token['name']);
-
- foreach ($token['attr'] as $attr) {
- if (!$el->hasAttribute($attr['name'])) {
- $el->setAttribute($attr['name'], $attr['value']);
- }
- }
-
- $this->appendToRealParent($el);
- $this->stack[] = $el;
-
- return $el;
- }
-
- private function insertText($data)
- {
- $text = $this->dom->createTextNode($data);
- $this->appendToRealParent($text);
- }
-
- private function insertComment($data)
- {
- $comment = $this->dom->createComment($data);
- $this->appendToRealParent($comment);
- }
-
- private function appendToRealParent($node)
- {
- if ($this->foster_parent === null) {
- end($this->stack)->appendChild($node);
-
- } elseif ($this->foster_parent !== null) {
- /* If the foster parent element is the parent element of the
- last table element in the stack of open elements, then the new
- node must be inserted immediately before the last table element
- in the stack of open elements in the foster parent element;
- otherwise, the new node must be appended to the foster parent
- element. */
- for ($n = count($this->stack) - 1; $n >= 0; $n--) {
- if ($this->stack[$n]->nodeName === 'table' &&
- $this->stack[$n]->parentNode !== null
- ) {
- $table = $this->stack[$n];
- break;
- }
- }
-
- if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
- $this->foster_parent->insertBefore($node, $table);
- } else {
- $this->foster_parent->appendChild($node);
- }
-
- $this->foster_parent = null;
- }
- }
-
- private function elementInScope($el, $table = false)
- {
- if (is_array($el)) {
- foreach ($el as $element) {
- if ($this->elementInScope($element, $table)) {
- return true;
- }
- }
-
- return false;
- }
-
- $leng = count($this->stack);
-
- for ($n = 0; $n < $leng; $n++) {
- /* 1. Initialise node to be the current node (the bottommost node of
- the stack). */
- $node = $this->stack[$leng - 1 - $n];
-
- if ($node->tagName === $el) {
- /* 2. If node is the target node, terminate in a match state. */
- return true;
-
- } elseif ($node->tagName === 'table') {
- /* 3. Otherwise, if node is a table element, terminate in a failure
- state. */
- return false;
-
- } elseif ($table === true && in_array(
- $node->tagName,
- array(
- 'caption',
- 'td',
- 'th',
- 'button',
- 'marquee',
- 'object'
- )
- )
- ) {
- /* 4. Otherwise, if the algorithm is the "has an element in scope"
- variant (rather than the "has an element in table scope" variant),
- and node is one of the following, terminate in a failure state. */
- return false;
-
- } elseif ($node === $node->ownerDocument->documentElement) {
- /* 5. Otherwise, if node is an html element (root element), terminate
- in a failure state. (This can only happen if the node is the topmost
- node of the stack of open elements, and prevents the next step from
- being invoked if there are no more elements in the stack.) */
- return false;
- }
-
- /* Otherwise, set node to the previous entry in the stack of open
- elements and return to step 2. (This will never fail, since the loop
- will always terminate in the previous step if the top of the stack
- is reached.) */
- }
- }
-
- private function reconstructActiveFormattingElements()
- {
- /* 1. If there are no entries in the list of active formatting elements,
- then there is nothing to reconstruct; stop this algorithm. */
- $formatting_elements = count($this->a_formatting);
-
- if ($formatting_elements === 0) {
- return false;
- }
-
- /* 3. Let entry be the last (most recently added) element in the list
- of active formatting elements. */
- $entry = end($this->a_formatting);
-
- /* 2. If the last (most recently added) entry in the list of active
- formatting elements is a marker, or if it is an element that is in the
- stack of open elements, then there is nothing to reconstruct; stop this
- algorithm. */
- if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
- return false;
- }
-
- for ($a = $formatting_elements - 1; $a >= 0; true) {
- /* 4. If there are no entries before entry in the list of active
- formatting elements, then jump to step 8. */
- if ($a === 0) {
- $step_seven = false;
- break;
- }
-
- /* 5. Let entry be the entry one earlier than entry in the list of
- active formatting elements. */
- $a--;
- $entry = $this->a_formatting[$a];
-
- /* 6. If entry is neither a marker nor an element that is also in
- thetack of open elements, go to step 4. */
- if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
- break;
- }
- }
-
- while (true) {
- /* 7. Let entry be the element one later than entry in the list of
- active formatting elements. */
- if (isset($step_seven) && $step_seven === true) {
- $a++;
- $entry = $this->a_formatting[$a];
- }
-
- /* 8. Perform a shallow clone of the element entry to obtain clone. */
- $clone = $entry->cloneNode();
-
- /* 9. Append clone to the current node and push it onto the stack
- of open elements so that it is the new current node. */
- end($this->stack)->appendChild($clone);
- $this->stack[] = $clone;
-
- /* 10. Replace the entry for entry in the list with an entry for
- clone. */
- $this->a_formatting[$a] = $clone;
-
- /* 11. If the entry for clone in the list of active formatting
- elements is not the last entry in the list, return to step 7. */
- if (end($this->a_formatting) !== $clone) {
- $step_seven = true;
- } else {
- break;
- }
- }
- }
-
- private function clearTheActiveFormattingElementsUpToTheLastMarker()
- {
- /* When the steps below require the UA to clear the list of active
- formatting elements up to the last marker, the UA must perform the
- following steps: */
-
- while (true) {
- /* 1. Let entry be the last (most recently added) entry in the list
- of active formatting elements. */
- $entry = end($this->a_formatting);
-
- /* 2. Remove entry from the list of active formatting elements. */
- array_pop($this->a_formatting);
-
- /* 3. If entry was a marker, then stop the algorithm at this point.
- The list has been cleared up to the last marker. */
- if ($entry === self::MARKER) {
- break;
- }
- }
- }
-
- private function generateImpliedEndTags($exclude = array())
- {
- /* When the steps below require the UA to generate implied end tags,
- then, if the current node is a dd element, a dt element, an li element,
- a p element, a td element, a th element, or a tr element, the UA must
- act as if an end tag with the respective tag name had been seen and
- then generate implied end tags again. */
- $node = end($this->stack);
- $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
-
- while (in_array(end($this->stack)->nodeName, $elements)) {
- array_pop($this->stack);
- }
- }
-
- private function getElementCategory($node)
- {
- $name = $node->tagName;
- if (in_array($name, $this->special)) {
- return self::SPECIAL;
- } elseif (in_array($name, $this->scoping)) {
- return self::SCOPING;
- } elseif (in_array($name, $this->formatting)) {
- return self::FORMATTING;
- } else {
- return self::PHRASING;
- }
- }
-
- private function clearStackToTableContext($elements)
- {
- /* When the steps above require the UA to clear the stack back to a
- table context, it means that the UA must, while the current node is not
- a table element or an html element, pop elements from the stack of open
- elements. If this causes any elements to be popped from the stack, then
- this is a parse error. */
- while (true) {
- $node = end($this->stack)->nodeName;
-
- if (in_array($node, $elements)) {
- break;
- } else {
- array_pop($this->stack);
- }
- }
- }
-
- private function resetInsertionMode()
- {
- /* 1. Let last be false. */
- $last = false;
- $leng = count($this->stack);
-
- for ($n = $leng - 1; $n >= 0; $n--) {
- /* 2. Let node be the last node in the stack of open elements. */
- $node = $this->stack[$n];
-
- /* 3. If node is the first node in the stack of open elements, then
- set last to true. If the element whose innerHTML attribute is being
- set is neither a td element nor a th element, then set node to the
- element whose innerHTML attribute is being set. (innerHTML case) */
- if ($this->stack[0]->isSameNode($node)) {
- $last = true;
- }
-
- /* 4. If node is a select element, then switch the insertion mode to
- "in select" and abort these steps. (innerHTML case) */
- if ($node->nodeName === 'select') {
- $this->mode = self::IN_SELECT;
- break;
-
- /* 5. If node is a td or th element, then switch the insertion mode
- to "in cell" and abort these steps. */
- } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
- $this->mode = self::IN_CELL;
- break;
-
- /* 6. If node is a tr element, then switch the insertion mode to
- "in row" and abort these steps. */
- } elseif ($node->nodeName === 'tr') {
- $this->mode = self::IN_ROW;
- break;
-
- /* 7. If node is a tbody, thead, or tfoot element, then switch the
- insertion mode to "in table body" and abort these steps. */
- } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
- $this->mode = self::IN_TBODY;
- break;
-
- /* 8. If node is a caption element, then switch the insertion mode
- to "in caption" and abort these steps. */
- } elseif ($node->nodeName === 'caption') {
- $this->mode = self::IN_CAPTION;
- break;
-
- /* 9. If node is a colgroup element, then switch the insertion mode
- to "in column group" and abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'colgroup') {
- $this->mode = self::IN_CGROUP;
- break;
-
- /* 10. If node is a table element, then switch the insertion mode
- to "in table" and abort these steps. */
- } elseif ($node->nodeName === 'table') {
- $this->mode = self::IN_TABLE;
- break;
-
- /* 11. If node is a head element, then switch the insertion mode
- to "in body" ("in body"! not "in head"!) and abort these steps.
- (innerHTML case) */
- } elseif ($node->nodeName === 'head') {
- $this->mode = self::IN_BODY;
- break;
-
- /* 12. If node is a body element, then switch the insertion mode to
- "in body" and abort these steps. */
- } elseif ($node->nodeName === 'body') {
- $this->mode = self::IN_BODY;
- break;
-
- /* 13. If node is a frameset element, then switch the insertion
- mode to "in frameset" and abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'frameset') {
- $this->mode = self::IN_FRAME;
- break;
-
- /* 14. If node is an html element, then: if the head element
- pointer is null, switch the insertion mode to "before head",
- otherwise, switch the insertion mode to "after head". In either
- case, abort these steps. (innerHTML case) */
- } elseif ($node->nodeName === 'html') {
- $this->mode = ($this->head_pointer === null)
- ? self::BEFOR_HEAD
- : self::AFTER_HEAD;
-
- break;
-
- /* 15. If last is true, then set the insertion mode to "in body"
- and abort these steps. (innerHTML case) */
- } elseif ($last) {
- $this->mode = self::IN_BODY;
- break;
- }
- }
- }
-
- private function closeCell()
- {
- /* If the stack of open elements has a td or th element in table scope,
- then act as if an end tag token with that tag name had been seen. */
- foreach (array('td', 'th') as $cell) {
- if ($this->elementInScope($cell, true)) {
- $this->inCell(
- array(
- 'name' => $cell,
- 'type' => HTML5::ENDTAG
- )
- );
-
- break;
- }
- }
- }
-
- public function save()
- {
- return $this->dom;
- }
-}
diff --git a/library/HTMLPurifier/Printer/ConfigForm.php b/library/HTMLPurifier/Printer/ConfigForm.php
deleted file mode 100644
index 36100ce73..000000000
--- a/library/HTMLPurifier/Printer/ConfigForm.php
+++ /dev/null
@@ -1,447 +0,0 @@
-<?php
-
-/**
- * @todo Rewrite to use Interchange objects
- */
-class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
-{
-
- /**
- * Printers for specific fields.
- * @type HTMLPurifier_Printer[]
- */
- protected $fields = array();
-
- /**
- * Documentation URL, can have fragment tagged on end.
- * @type string
- */
- protected $docURL;
-
- /**
- * Name of form element to stuff config in.
- * @type string
- */
- protected $name;
-
- /**
- * Whether or not to compress directive names, clipping them off
- * after a certain amount of letters. False to disable or integer letters
- * before clipping.
- * @type bool
- */
- protected $compress = false;
-
- /**
- * @param string $name Form element name for directives to be stuffed into
- * @param string $doc_url String documentation URL, will have fragment tagged on
- * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
- */
- public function __construct(
- $name,
- $doc_url = null,
- $compress = false
- ) {
- parent::__construct();
- $this->docURL = $doc_url;
- $this->name = $name;
- $this->compress = $compress;
- // initialize sub-printers
- $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
- $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
- }
-
- /**
- * Sets default column and row size for textareas in sub-printers
- * @param $cols Integer columns of textarea, null to use default
- * @param $rows Integer rows of textarea, null to use default
- */
- public function setTextareaDimensions($cols = null, $rows = null)
- {
- if ($cols) {
- $this->fields['default']->cols = $cols;
- }
- if ($rows) {
- $this->fields['default']->rows = $rows;
- }
- }
-
- /**
- * Retrieves styling, in case it is not accessible by webserver
- */
- public static function getCSS()
- {
- return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
- }
-
- /**
- * Retrieves JavaScript, in case it is not accessible by webserver
- */
- public static function getJavaScript()
- {
- return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
- }
-
- /**
- * Returns HTML output for a configuration form
- * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
- * where [0] has an HTML namespace and [1] is being rendered.
- * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
- * @param bool $render_controls
- * @return string
- */
- public function render($config, $allowed = true, $render_controls = true)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
-
- $this->config = $config;
- $this->genConfig = $gen_config;
- $this->prepareGenerator($gen_config);
-
- $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
- $all = array();
- foreach ($allowed as $key) {
- list($ns, $directive) = $key;
- $all[$ns][$directive] = $config->get($ns . '.' . $directive);
- }
-
- $ret = '';
- $ret .= $this->start('table', array('class' => 'hp-config'));
- $ret .= $this->start('thead');
- $ret .= $this->start('tr');
- $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
- $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
- $ret .= $this->end('tr');
- $ret .= $this->end('thead');
- foreach ($all as $ns => $directives) {
- $ret .= $this->renderNamespace($ns, $directives);
- }
- if ($render_controls) {
- $ret .= $this->start('tbody');
- $ret .= $this->start('tr');
- $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
- $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
- $ret .= '[<a href="?">Reset</a>]';
- $ret .= $this->end('td');
- $ret .= $this->end('tr');
- $ret .= $this->end('tbody');
- }
- $ret .= $this->end('table');
- return $ret;
- }
-
- /**
- * Renders a single namespace
- * @param $ns String namespace name
- * @param array $directives array of directives to values
- * @return string
- */
- protected function renderNamespace($ns, $directives)
- {
- $ret = '';
- $ret .= $this->start('tbody', array('class' => 'namespace'));
- $ret .= $this->start('tr');
- $ret .= $this->element('th', $ns, array('colspan' => 2));
- $ret .= $this->end('tr');
- $ret .= $this->end('tbody');
- $ret .= $this->start('tbody');
- foreach ($directives as $directive => $value) {
- $ret .= $this->start('tr');
- $ret .= $this->start('th');
- if ($this->docURL) {
- $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
- $ret .= $this->start('a', array('href' => $url));
- }
- $attr = array('for' => "{$this->name}:$ns.$directive");
-
- // crop directive name if it's too long
- if (!$this->compress || (strlen($directive) < $this->compress)) {
- $directive_disp = $directive;
- } else {
- $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
- $attr['title'] = $directive;
- }
-
- $ret .= $this->element(
- 'label',
- $directive_disp,
- // component printers must create an element with this id
- $attr
- );
- if ($this->docURL) {
- $ret .= $this->end('a');
- }
- $ret .= $this->end('th');
-
- $ret .= $this->start('td');
- $def = $this->config->def->info["$ns.$directive"];
- if (is_int($def)) {
- $allow_null = $def < 0;
- $type = abs($def);
- } else {
- $type = $def->type;
- $allow_null = isset($def->allow_null);
- }
- if (!isset($this->fields[$type])) {
- $type = 0;
- } // default
- $type_obj = $this->fields[$type];
- if ($allow_null) {
- $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
- }
- $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
- $ret .= $this->end('td');
- $ret .= $this->end('tr');
- }
- $ret .= $this->end('tbody');
- return $ret;
- }
-
-}
-
-/**
- * Printer decorator for directives that accept null
- */
-class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
-{
- /**
- * Printer being decorated
- * @type HTMLPurifier_Printer
- */
- protected $obj;
-
- /**
- * @param HTMLPurifier_Printer $obj Printer to decorate
- */
- public function __construct($obj)
- {
- parent::__construct();
- $this->obj = $obj;
- }
-
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
-
- $ret = '';
- $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' Null/Disabled');
- $ret .= $this->end('label');
- $attr = array(
- 'type' => 'checkbox',
- 'value' => '1',
- 'class' => 'null-toggle',
- 'name' => "$name" . "[Null_$ns.$directive]",
- 'id' => "$name:Null_$ns.$directive",
- 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
- );
- if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
- // modify inline javascript slightly
- $attr['onclick'] =
- "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
- "toggleWriteability('$name:No_$ns.$directive',checked)";
- }
- if ($value === null) {
- $attr['checked'] = 'checked';
- }
- $ret .= $this->elementEmpty('input', $attr);
- $ret .= $this->text(' or ');
- $ret .= $this->elementEmpty('br');
- $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
- return $ret;
- }
-}
-
-/**
- * Swiss-army knife configuration form field printer
- */
-class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
-{
- /**
- * @type int
- */
- public $cols = 18;
-
- /**
- * @type int
- */
- public $rows = 5;
-
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
- // this should probably be split up a little
- $ret = '';
- $def = $config->def->info["$ns.$directive"];
- if (is_int($def)) {
- $type = abs($def);
- } else {
- $type = $def->type;
- }
- if (is_array($value)) {
- switch ($type) {
- case HTMLPurifier_VarParser::LOOKUP:
- $array = $value;
- $value = array();
- foreach ($array as $val => $b) {
- $value[] = $val;
- }
- //TODO does this need a break?
- case HTMLPurifier_VarParser::ALIST:
- $value = implode(PHP_EOL, $value);
- break;
- case HTMLPurifier_VarParser::HASH:
- $nvalue = '';
- foreach ($value as $i => $v) {
- $nvalue .= "$i:$v" . PHP_EOL;
- }
- $value = $nvalue;
- break;
- default:
- $value = '';
- }
- }
- if ($type === HTMLPurifier_VarParser::MIXED) {
- return 'Not supported';
- $value = serialize($value);
- }
- $attr = array(
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:$ns.$directive"
- );
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- if (isset($def->allowed)) {
- $ret .= $this->start('select', $attr);
- foreach ($def->allowed as $val => $b) {
- $attr = array();
- if ($value == $val) {
- $attr['selected'] = 'selected';
- }
- $ret .= $this->element('option', $val, $attr);
- }
- $ret .= $this->end('select');
- } elseif ($type === HTMLPurifier_VarParser::TEXT ||
- $type === HTMLPurifier_VarParser::ITEXT ||
- $type === HTMLPurifier_VarParser::ALIST ||
- $type === HTMLPurifier_VarParser::HASH ||
- $type === HTMLPurifier_VarParser::LOOKUP) {
- $attr['cols'] = $this->cols;
- $attr['rows'] = $this->rows;
- $ret .= $this->start('textarea', $attr);
- $ret .= $this->text($value);
- $ret .= $this->end('textarea');
- } else {
- $attr['value'] = $value;
- $attr['type'] = 'text';
- $ret .= $this->elementEmpty('input', $attr);
- }
- return $ret;
- }
-}
-
-/**
- * Bool form field printer
- */
-class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
-{
- /**
- * @param string $ns
- * @param string $directive
- * @param string $value
- * @param string $name
- * @param HTMLPurifier_Config|array $config
- * @return string
- */
- public function render($ns, $directive, $value, $name, $config)
- {
- if (is_array($config) && isset($config[0])) {
- $gen_config = $config[0];
- $config = $config[1];
- } else {
- $gen_config = $config;
- }
- $this->prepareGenerator($gen_config);
- $ret = '';
- $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
-
- $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' Yes');
- $ret .= $this->end('label');
-
- $attr = array(
- 'type' => 'radio',
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:Yes_$ns.$directive",
- 'value' => '1'
- );
- if ($value === true) {
- $attr['checked'] = 'checked';
- }
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- $ret .= $this->elementEmpty('input', $attr);
-
- $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
- $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
- $ret .= $this->text(' No');
- $ret .= $this->end('label');
-
- $attr = array(
- 'type' => 'radio',
- 'name' => "$name" . "[$ns.$directive]",
- 'id' => "$name:No_$ns.$directive",
- 'value' => '0'
- );
- if ($value === false) {
- $attr['checked'] = 'checked';
- }
- if ($value === null) {
- $attr['disabled'] = 'disabled';
- }
- $ret .= $this->elementEmpty('input', $attr);
-
- $ret .= $this->end('div');
-
- return $ret;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Strategy/MakeWellFormed.php b/library/HTMLPurifier/Strategy/MakeWellFormed.php
deleted file mode 100644
index e389e0011..000000000
--- a/library/HTMLPurifier/Strategy/MakeWellFormed.php
+++ /dev/null
@@ -1,600 +0,0 @@
-<?php
-
-/**
- * Takes tokens makes them well-formed (balance end tags, etc.)
- *
- * Specification of the armor attributes this strategy uses:
- *
- * - MakeWellFormed_TagClosedError: This armor field is used to
- * suppress tag closed errors for certain tokens [TagClosedSuppress],
- * in particular, if a tag was generated automatically by HTML
- * Purifier, we may rely on our infrastructure to close it for us
- * and shouldn't report an error to the user [TagClosedAuto].
- */
-class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
-{
-
- /**
- * Array stream of tokens being processed.
- * @type HTMLPurifier_Token[]
- */
- protected $tokens;
-
- /**
- * Current token.
- * @type HTMLPurifier_Token
- */
- protected $token;
-
- /**
- * Zipper managing the true state.
- * @type HTMLPurifier_Zipper
- */
- protected $zipper;
-
- /**
- * Current nesting of elements.
- * @type array
- */
- protected $stack;
-
- /**
- * Injectors active in this stream processing.
- * @type HTMLPurifier_Injector[]
- */
- protected $injectors;
-
- /**
- * Current instance of HTMLPurifier_Config.
- * @type HTMLPurifier_Config
- */
- protected $config;
-
- /**
- * Current instance of HTMLPurifier_Context.
- * @type HTMLPurifier_Context
- */
- protected $context;
-
- /**
- * @param HTMLPurifier_Token[] $tokens
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_Token[]
- * @throws HTMLPurifier_Exception
- */
- public function execute($tokens, $config, $context)
- {
- $definition = $config->getHTMLDefinition();
-
- // local variables
- $generator = new HTMLPurifier_Generator($config, $context);
- $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
- // used for autoclose early abortion
- $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
- $e = $context->get('ErrorCollector', true);
- $i = false; // injector index
- list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
- if ($token === NULL) {
- return array();
- }
- $reprocess = false; // whether or not to reprocess the same token
- $stack = array();
-
- // member variables
- $this->stack =& $stack;
- $this->tokens =& $tokens;
- $this->token =& $token;
- $this->zipper =& $zipper;
- $this->config = $config;
- $this->context = $context;
-
- // context variables
- $context->register('CurrentNesting', $stack);
- $context->register('InputZipper', $zipper);
- $context->register('CurrentToken', $token);
-
- // -- begin INJECTOR --
-
- $this->injectors = array();
-
- $injectors = $config->getBatch('AutoFormat');
- $def_injectors = $definition->info_injector;
- $custom_injectors = $injectors['Custom'];
- unset($injectors['Custom']); // special case
- foreach ($injectors as $injector => $b) {
- // XXX: Fix with a legitimate lookup table of enabled filters
- if (strpos($injector, '.') !== false) {
- continue;
- }
- $injector = "HTMLPurifier_Injector_$injector";
- if (!$b) {
- continue;
- }
- $this->injectors[] = new $injector;
- }
- foreach ($def_injectors as $injector) {
- // assumed to be objects
- $this->injectors[] = $injector;
- }
- foreach ($custom_injectors as $injector) {
- if (!$injector) {
- continue;
- }
- if (is_string($injector)) {
- $injector = "HTMLPurifier_Injector_$injector";
- $injector = new $injector;
- }
- $this->injectors[] = $injector;
- }
-
- // give the injectors references to the definition and context
- // variables for performance reasons
- foreach ($this->injectors as $ix => $injector) {
- $error = $injector->prepare($config, $context);
- if (!$error) {
- continue;
- }
- array_splice($this->injectors, $ix, 1); // rm the injector
- trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
- }
-
- // -- end INJECTOR --
-
- // a note on reprocessing:
- // In order to reduce code duplication, whenever some code needs
- // to make HTML changes in order to make things "correct", the
- // new HTML gets sent through the purifier, regardless of its
- // status. This means that if we add a start token, because it
- // was totally necessary, we don't have to update nesting; we just
- // punt ($reprocess = true; continue;) and it does that for us.
-
- // isset is in loop because $tokens size changes during loop exec
- for (;;
- // only increment if we don't need to reprocess
- $reprocess ? $reprocess = false : $token = $zipper->next($token)) {
-
- // check for a rewind
- if (is_int($i)) {
- // possibility: disable rewinding if the current token has a
- // rewind set on it already. This would offer protection from
- // infinite loop, but might hinder some advanced rewinding.
- $rewind_offset = $this->injectors[$i]->getRewindOffset();
- if (is_int($rewind_offset)) {
- for ($j = 0; $j < $rewind_offset; $j++) {
- if (empty($zipper->front)) break;
- $token = $zipper->prev($token);
- // indicate that other injectors should not process this token,
- // but we need to reprocess it
- unset($token->skip[$i]);
- $token->rewind = $i;
- if ($token instanceof HTMLPurifier_Token_Start) {
- array_pop($this->stack);
- } elseif ($token instanceof HTMLPurifier_Token_End) {
- $this->stack[] = $token->start;
- }
- }
- }
- $i = false;
- }
-
- // handle case of document end
- if ($token === NULL) {
- // kill processing if stack is empty
- if (empty($this->stack)) {
- break;
- }
-
- // peek
- $top_nesting = array_pop($this->stack);
- $this->stack[] = $top_nesting;
-
- // send error [TagClosedSuppress]
- if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
- }
-
- // append, don't splice, since this is the end
- $token = new HTMLPurifier_Token_End($top_nesting->name);
-
- // punt!
- $reprocess = true;
- continue;
- }
-
- //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
- //flush();
-
- // quick-check: if it's not a tag, no need to process
- if (empty($token->is_tag)) {
- if ($token instanceof HTMLPurifier_Token_Text) {
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- // XXX fuckup
- $r = $token;
- $injector->handleText($r);
- $token = $this->processToken($r, $i);
- $reprocess = true;
- break;
- }
- }
- // another possibility is a comment
- continue;
- }
-
- if (isset($definition->info[$token->name])) {
- $type = $definition->info[$token->name]->child->type;
- } else {
- $type = false; // Type is unknown, treat accordingly
- }
-
- // quick tag checks: anything that's *not* an end tag
- $ok = false;
- if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
- // claims to be a start tag but is empty
- $token = new HTMLPurifier_Token_Empty(
- $token->name,
- $token->attr,
- $token->line,
- $token->col,
- $token->armor
- );
- $ok = true;
- } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
- // claims to be empty but really is a start tag
- // NB: this assignment is required
- $old_token = $token;
- $token = new HTMLPurifier_Token_End($token->name);
- $token = $this->insertBefore(
- new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
- );
- // punt (since we had to modify the input stream in a non-trivial way)
- $reprocess = true;
- continue;
- } elseif ($token instanceof HTMLPurifier_Token_Empty) {
- // real empty token
- $ok = true;
- } elseif ($token instanceof HTMLPurifier_Token_Start) {
- // start tag
-
- // ...unless they also have to close their parent
- if (!empty($this->stack)) {
-
- // Performance note: you might think that it's rather
- // inefficient, recalculating the autoclose information
- // for every tag that a token closes (since when we
- // do an autoclose, we push a new token into the
- // stream and then /process/ that, before
- // re-processing this token.) But this is
- // necessary, because an injector can make an
- // arbitrary transformations to the autoclosing
- // tokens we introduce, so things may have changed
- // in the meantime. Also, doing the inefficient thing is
- // "easy" to reason about (for certain perverse definitions
- // of "easy")
-
- $parent = array_pop($this->stack);
- $this->stack[] = $parent;
-
- $parent_def = null;
- $parent_elements = null;
- $autoclose = false;
- if (isset($definition->info[$parent->name])) {
- $parent_def = $definition->info[$parent->name];
- $parent_elements = $parent_def->child->getAllowedElements($config);
- $autoclose = !isset($parent_elements[$token->name]);
- }
-
- if ($autoclose && $definition->info[$token->name]->wrap) {
- // Check if an element can be wrapped by another
- // element to make it valid in a context (for
- // example, <ul><ul> needs a <li> in between)
- $wrapname = $definition->info[$token->name]->wrap;
- $wrapdef = $definition->info[$wrapname];
- $elements = $wrapdef->child->getAllowedElements($config);
- if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
- $newtoken = new HTMLPurifier_Token_Start($wrapname);
- $token = $this->insertBefore($newtoken);
- $reprocess = true;
- continue;
- }
- }
-
- $carryover = false;
- if ($autoclose && $parent_def->formatting) {
- $carryover = true;
- }
-
- if ($autoclose) {
- // check if this autoclose is doomed to fail
- // (this rechecks $parent, which his harmless)
- $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
- if (!$autoclose_ok) {
- foreach ($this->stack as $ancestor) {
- $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
- if (isset($elements[$token->name])) {
- $autoclose_ok = true;
- break;
- }
- if ($definition->info[$token->name]->wrap) {
- $wrapname = $definition->info[$token->name]->wrap;
- $wrapdef = $definition->info[$wrapname];
- $wrap_elements = $wrapdef->child->getAllowedElements($config);
- if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
- $autoclose_ok = true;
- break;
- }
- }
- }
- }
- if ($autoclose_ok) {
- // errors need to be updated
- $new_token = new HTMLPurifier_Token_End($parent->name);
- $new_token->start = $parent;
- // [TagClosedSuppress]
- if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
- if (!$carryover) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
- } else {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
- }
- }
- if ($carryover) {
- $element = clone $parent;
- // [TagClosedAuto]
- $element->armor['MakeWellFormed_TagClosedError'] = true;
- $element->carryover = true;
- $token = $this->processToken(array($new_token, $token, $element));
- } else {
- $token = $this->insertBefore($new_token);
- }
- } else {
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- }
- $ok = true;
- }
-
- if ($ok) {
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- $r = $token;
- $injector->handleElement($r);
- $token = $this->processToken($r, $i);
- $reprocess = true;
- break;
- }
- if (!$reprocess) {
- // ah, nothing interesting happened; do normal processing
- if ($token instanceof HTMLPurifier_Token_Start) {
- $this->stack[] = $token;
- } elseif ($token instanceof HTMLPurifier_Token_End) {
- throw new HTMLPurifier_Exception(
- 'Improper handling of end tag in start code; possible error in MakeWellFormed'
- );
- }
- }
- continue;
- }
-
- // sanity check: we should be dealing with a closing tag
- if (!$token instanceof HTMLPurifier_Token_End) {
- throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
- }
-
- // make sure that we have something open
- if (empty($this->stack)) {
- if ($escape_invalid_tags) {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
- }
- $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
- } else {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
- }
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- // first, check for the simplest case: everything closes neatly.
- // Eventually, everything passes through here; if there are problems
- // we modify the input stream accordingly and then punt, so that
- // the tokens get processed again.
- $current_parent = array_pop($this->stack);
- if ($current_parent->name == $token->name) {
- $token->start = $current_parent;
- foreach ($this->injectors as $i => $injector) {
- if (isset($token->skip[$i])) {
- continue;
- }
- if ($token->rewind !== null && $token->rewind !== $i) {
- continue;
- }
- $r = $token;
- $injector->handleEnd($r);
- $token = $this->processToken($r, $i);
- $this->stack[] = $current_parent;
- $reprocess = true;
- break;
- }
- continue;
- }
-
- // okay, so we're trying to close the wrong tag
-
- // undo the pop previous pop
- $this->stack[] = $current_parent;
-
- // scroll back the entire nest, trying to find our tag.
- // (feature could be to specify how far you'd like to go)
- $size = count($this->stack);
- // -2 because -1 is the last element, but we already checked that
- $skipped_tags = false;
- for ($j = $size - 2; $j >= 0; $j--) {
- if ($this->stack[$j]->name == $token->name) {
- $skipped_tags = array_slice($this->stack, $j);
- break;
- }
- }
-
- // we didn't find the tag, so remove
- if ($skipped_tags === false) {
- if ($escape_invalid_tags) {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
- }
- $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
- } else {
- if ($e) {
- $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
- }
- $token = $this->remove();
- }
- $reprocess = true;
- continue;
- }
-
- // do errors, in REVERSE $j order: a,b,c with </a></b></c>
- $c = count($skipped_tags);
- if ($e) {
- for ($j = $c - 1; $j > 0; $j--) {
- // notice we exclude $j == 0, i.e. the current ending tag, from
- // the errors... [TagClosedSuppress]
- if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
- $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
- }
- }
- }
-
- // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
- $replace = array($token);
- for ($j = 1; $j < $c; $j++) {
- // ...as well as from the insertions
- $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
- $new_token->start = $skipped_tags[$j];
- array_unshift($replace, $new_token);
- if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
- // [TagClosedAuto]
- $element = clone $skipped_tags[$j];
- $element->carryover = true;
- $element->armor['MakeWellFormed_TagClosedError'] = true;
- $replace[] = $element;
- }
- }
- $token = $this->processToken($replace);
- $reprocess = true;
- continue;
- }
-
- $context->destroy('CurrentToken');
- $context->destroy('CurrentNesting');
- $context->destroy('InputZipper');
-
- unset($this->injectors, $this->stack, $this->tokens);
- return $zipper->toArray($token);
- }
-
- /**
- * Processes arbitrary token values for complicated substitution patterns.
- * In general:
- *
- * If $token is an array, it is a list of tokens to substitute for the
- * current token. These tokens then get individually processed. If there
- * is a leading integer in the list, that integer determines how many
- * tokens from the stream should be removed.
- *
- * If $token is a regular token, it is swapped with the current token.
- *
- * If $token is false, the current token is deleted.
- *
- * If $token is an integer, that number of tokens (with the first token
- * being the current one) will be deleted.
- *
- * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
- * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
- * this is not an injector related operation.
- * @throws HTMLPurifier_Exception
- */
- protected function processToken($token, $injector = -1)
- {
- // normalize forms of token
- if (is_object($token)) {
- $token = array(1, $token);
- }
- if (is_int($token)) {
- $token = array($token);
- }
- if ($token === false) {
- $token = array(1);
- }
- if (!is_array($token)) {
- throw new HTMLPurifier_Exception('Invalid token type from injector');
- }
- if (!is_int($token[0])) {
- array_unshift($token, 1);
- }
- if ($token[0] === 0) {
- throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
- }
-
- // $token is now an array with the following form:
- // array(number nodes to delete, new node 1, new node 2, ...)
-
- $delete = array_shift($token);
- list($old, $r) = $this->zipper->splice($this->token, $delete, $token);
-
- if ($injector > -1) {
- // determine appropriate skips
- $oldskip = isset($old[0]) ? $old[0]->skip : array();
- foreach ($token as $object) {
- $object->skip = $oldskip;
- $object->skip[$injector] = true;
- }
- }
-
- return $r;
-
- }
-
- /**
- * Inserts a token before the current token. Cursor now points to
- * this token. You must reprocess after this.
- * @param HTMLPurifier_Token $token
- */
- private function insertBefore($token)
- {
- // NB not $this->zipper->insertBefore(), due to positioning
- // differences
- $splice = $this->zipper->splice($this->token, 0, array($token));
-
- return $splice[1];
- }
-
- /**
- * Removes current token. Cursor now points to new token occupying previously
- * occupied space. You must reprocess after this.
- */
- private function remove()
- {
- return $this->zipper->delete();
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Token.php b/library/HTMLPurifier/Token.php
deleted file mode 100644
index 85b85e072..000000000
--- a/library/HTMLPurifier/Token.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/**
- * Abstract base token class that all others inherit from.
- */
-abstract class HTMLPurifier_Token
-{
- /**
- * Line number node was on in source document. Null if unknown.
- * @type int
- */
- public $line;
-
- /**
- * Column of line node was on in source document. Null if unknown.
- * @type int
- */
- public $col;
-
- /**
- * Lookup array of processing that this token is exempt from.
- * Currently, valid values are "ValidateAttributes" and
- * "MakeWellFormed_TagClosedError"
- * @type array
- */
- public $armor = array();
-
- /**
- * Used during MakeWellFormed.
- * @type
- */
- public $skip;
-
- /**
- * @type
- */
- public $rewind;
-
- /**
- * @type
- */
- public $carryover;
-
- /**
- * @param string $n
- * @return null|string
- */
- public function __get($n)
- {
- if ($n === 'type') {
- trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
- switch (get_class($this)) {
- case 'HTMLPurifier_Token_Start':
- return 'start';
- case 'HTMLPurifier_Token_Empty':
- return 'empty';
- case 'HTMLPurifier_Token_End':
- return 'end';
- case 'HTMLPurifier_Token_Text':
- return 'text';
- case 'HTMLPurifier_Token_Comment':
- return 'comment';
- default:
- return null;
- }
- }
- }
-
- /**
- * Sets the position of the token in the source document.
- * @param int $l
- * @param int $c
- */
- public function position($l = null, $c = null)
- {
- $this->line = $l;
- $this->col = $c;
- }
-
- /**
- * Convenience function for DirectLex settings line/col position.
- * @param int $l
- * @param int $c
- */
- public function rawPosition($l, $c)
- {
- if ($c === -1) {
- $l++;
- }
- $this->line = $l;
- $this->col = $c;
- }
-
- /**
- * Converts a token into its corresponding node.
- */
- abstract public function toNode();
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URI.php b/library/HTMLPurifier/URI.php
deleted file mode 100644
index a5e7ae298..000000000
--- a/library/HTMLPurifier/URI.php
+++ /dev/null
@@ -1,314 +0,0 @@
-<?php
-
-/**
- * HTML Purifier's internal representation of a URI.
- * @note
- * Internal data-structures are completely escaped. If the data needs
- * to be used in a non-URI context (which is very unlikely), be sure
- * to decode it first. The URI may not necessarily be well-formed until
- * validate() is called.
- */
-class HTMLPurifier_URI
-{
- /**
- * @type string
- */
- public $scheme;
-
- /**
- * @type string
- */
- public $userinfo;
-
- /**
- * @type string
- */
- public $host;
-
- /**
- * @type int
- */
- public $port;
-
- /**
- * @type string
- */
- public $path;
-
- /**
- * @type string
- */
- public $query;
-
- /**
- * @type string
- */
- public $fragment;
-
- /**
- * @param string $scheme
- * @param string $userinfo
- * @param string $host
- * @param int $port
- * @param string $path
- * @param string $query
- * @param string $fragment
- * @note Automatically normalizes scheme and port
- */
- public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
- {
- $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
- $this->userinfo = $userinfo;
- $this->host = $host;
- $this->port = is_null($port) ? $port : (int)$port;
- $this->path = $path;
- $this->query = $query;
- $this->fragment = $fragment;
- }
-
- /**
- * Retrieves a scheme object corresponding to the URI's scheme/default
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
- */
- public function getSchemeObj($config, $context)
- {
- $registry = HTMLPurifier_URISchemeRegistry::instance();
- if ($this->scheme !== null) {
- $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
- if (!$scheme_obj) {
- return false;
- } // invalid scheme, clean it out
- } else {
- // no scheme: retrieve the default one
- $def = $config->getDefinition('URI');
- $scheme_obj = $def->getDefaultScheme($config, $context);
- if (!$scheme_obj) {
- // something funky happened to the default scheme object
- trigger_error(
- 'Default scheme object "' . $def->defaultScheme . '" was not readable',
- E_USER_WARNING
- );
- return false;
- }
- }
- return $scheme_obj;
- }
-
- /**
- * Generic validation method applicable for all schemes. May modify
- * this URI in order to get it into a compliant form.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool True if validation/filtering succeeds, false if failure
- */
- public function validate($config, $context)
- {
- // ABNF definitions from RFC 3986
- $chars_sub_delims = '!$&\'()*+,;=';
- $chars_gen_delims = ':/?#[]@';
- $chars_pchar = $chars_sub_delims . ':@';
-
- // validate host
- if (!is_null($this->host)) {
- $host_def = new HTMLPurifier_AttrDef_URI_Host();
- $this->host = $host_def->validate($this->host, $config, $context);
- if ($this->host === false) {
- $this->host = null;
- }
- }
-
- // validate scheme
- // NOTE: It's not appropriate to check whether or not this
- // scheme is in our registry, since a URIFilter may convert a
- // URI that we don't allow into one we do. So instead, we just
- // check if the scheme can be dropped because there is no host
- // and it is our default scheme.
- if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
- // support for relative paths is pretty abysmal when the
- // scheme is present, so axe it when possible
- $def = $config->getDefinition('URI');
- if ($def->defaultScheme === $this->scheme) {
- $this->scheme = null;
- }
- }
-
- // validate username
- if (!is_null($this->userinfo)) {
- $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
- $this->userinfo = $encoder->encode($this->userinfo);
- }
-
- // validate port
- if (!is_null($this->port)) {
- if ($this->port < 1 || $this->port > 65535) {
- $this->port = null;
- }
- }
-
- // validate path
- $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
- if (!is_null($this->host)) { // this catches $this->host === ''
- // path-abempty (hier and relative)
- // http://www.example.com/my/path
- // //www.example.com/my/path (looks odd, but works, and
- // recognized by most browsers)
- // (this set is valid or invalid on a scheme by scheme
- // basis, so we'll deal with it later)
- // file:///my/path
- // ///my/path
- $this->path = $segments_encoder->encode($this->path);
- } elseif ($this->path !== '') {
- if ($this->path[0] === '/') {
- // path-absolute (hier and relative)
- // http:/my/path
- // /my/path
- if (strlen($this->path) >= 2 && $this->path[1] === '/') {
- // This could happen if both the host gets stripped
- // out
- // http://my/path
- // //my/path
- $this->path = '';
- } else {
- $this->path = $segments_encoder->encode($this->path);
- }
- } elseif (!is_null($this->scheme)) {
- // path-rootless (hier)
- // http:my/path
- // Short circuit evaluation means we don't need to check nz
- $this->path = $segments_encoder->encode($this->path);
- } else {
- // path-noscheme (relative)
- // my/path
- // (once again, not checking nz)
- $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
- $c = strpos($this->path, '/');
- if ($c !== false) {
- $this->path =
- $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
- $segments_encoder->encode(substr($this->path, $c));
- } else {
- $this->path = $segment_nc_encoder->encode($this->path);
- }
- }
- } else {
- // path-empty (hier and relative)
- $this->path = ''; // just to be safe
- }
-
- // qf = query and fragment
- $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
-
- if (!is_null($this->query)) {
- $this->query = $qf_encoder->encode($this->query);
- }
-
- if (!is_null($this->fragment)) {
- $this->fragment = $qf_encoder->encode($this->fragment);
- }
- return true;
- }
-
- /**
- * Convert URI back to string
- * @return string URI appropriate for output
- */
- public function toString()
- {
- // reconstruct authority
- $authority = null;
- // there is a rendering difference between a null authority
- // (http:foo-bar) and an empty string authority
- // (http:///foo-bar).
- if (!is_null($this->host)) {
- $authority = '';
- if (!is_null($this->userinfo)) {
- $authority .= $this->userinfo . '@';
- }
- $authority .= $this->host;
- if (!is_null($this->port)) {
- $authority .= ':' . $this->port;
- }
- }
-
- // Reconstruct the result
- // One might wonder about parsing quirks from browsers after
- // this reconstruction. Unfortunately, parsing behavior depends
- // on what *scheme* was employed (file:///foo is handled *very*
- // differently than http:///foo), so unfortunately we have to
- // defer to the schemes to do the right thing.
- $result = '';
- if (!is_null($this->scheme)) {
- $result .= $this->scheme . ':';
- }
- if (!is_null($authority)) {
- $result .= '//' . $authority;
- }
- $result .= $this->path;
- if (!is_null($this->query)) {
- $result .= '?' . $this->query;
- }
- if (!is_null($this->fragment)) {
- $result .= '#' . $this->fragment;
- }
-
- return $result;
- }
-
- /**
- * Returns true if this URL might be considered a 'local' URL given
- * the current context. This is true when the host is null, or
- * when it matches the host supplied to the configuration.
- *
- * Note that this does not do any scheme checking, so it is mostly
- * only appropriate for metadata that doesn't care about protocol
- * security. isBenign is probably what you actually want.
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function isLocal($config, $context)
- {
- if ($this->host === null) {
- return true;
- }
- $uri_def = $config->getDefinition('URI');
- if ($uri_def->host === $this->host) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns true if this URL should be considered a 'benign' URL,
- * that is:
- *
- * - It is a local URL (isLocal), and
- * - It has a equal or better level of security
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function isBenign($config, $context)
- {
- if (!$this->isLocal($config, $context)) {
- return false;
- }
-
- $scheme_obj = $this->getSchemeObj($config, $context);
- if (!$scheme_obj) {
- return false;
- } // conservative approach
-
- $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
- if ($current_scheme_obj->secure) {
- if (!$scheme_obj->secure) {
- return false;
- }
- }
- return true;
- }
-}
-
-// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URIScheme/data.php b/library/HTMLPurifier/URIScheme/data.php
deleted file mode 100644
index 6ebca4984..000000000
--- a/library/HTMLPurifier/URIScheme/data.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-
-/**
- * Implements data: URI for base64 encoded images supported by GD.
- */
-class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
-{
- /**
- * @type bool
- */
- public $browsable = true;
-
- /**
- * @type array
- */
- public $allowed_types = array(
- // you better write validation code for other types if you
- // decide to allow them
- 'image/jpeg' => true,
- 'image/gif' => true,
- 'image/png' => true,
- );
- // this is actually irrelevant since we only write out the path
- // component
- /**
- * @type bool
- */
- public $may_omit_host = true;
-
- /**
- * @param HTMLPurifier_URI $uri
- * @param HTMLPurifier_Config $config
- * @param HTMLPurifier_Context $context
- * @return bool
- */
- public function doValidate(&$uri, $config, $context)
- {
- $result = explode(',', $uri->path, 2);
- $is_base64 = false;
- $charset = null;
- $content_type = null;
- if (count($result) == 2) {
- list($metadata, $data) = $result;
- // do some legwork on the metadata
- $metas = explode(';', $metadata);
- while (!empty($metas)) {
- $cur = array_shift($metas);
- if ($cur == 'base64') {
- $is_base64 = true;
- break;
- }
- if (substr($cur, 0, 8) == 'charset=') {
- // doesn't match if there are arbitrary spaces, but
- // whatever dude
- if ($charset !== null) {
- continue;
- } // garbage
- $charset = substr($cur, 8); // not used
- } else {
- if ($content_type !== null) {
- continue;
- } // garbage
- $content_type = $cur;
- }
- }
- } else {
- $data = $result[0];
- }
- if ($content_type !== null && empty($this->allowed_types[$content_type])) {
- return false;
- }
- if ($charset !== null) {
- // error; we don't allow plaintext stuff
- $charset = null;
- }
- $data = rawurldecode($data);
- if ($is_base64) {
- $raw_data = base64_decode($data);
- } else {
- $raw_data = $data;
- }
- // XXX probably want to refactor this into a general mechanism
- // for filtering arbitrary content types
- $file = tempnam("/tmp", "");
- file_put_contents($file, $raw_data);
- if (function_exists('exif_imagetype')) {
- $image_code = exif_imagetype($file);
- unlink($file);
- } elseif (function_exists('getimagesize')) {
- set_error_handler(array($this, 'muteErrorHandler'));
- $info = getimagesize($file);
- restore_error_handler();
- unlink($file);
- if ($info == false) {
- return false;
- }
- $image_code = $info[2];
- } else {
- trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
- }
- $real_content_type = image_type_to_mime_type($image_code);
- if ($real_content_type != $content_type) {
- // we're nice guys; if the content type is something else we
- // support, change it over
- if (empty($this->allowed_types[$real_content_type])) {
- return false;
- }
- $content_type = $real_content_type;
- }
- // ok, it's kosher, rewrite what we need
- $uri->userinfo = null;
- $uri->host = null;
- $uri->port = null;
- $uri->fragment = null;
- $uri->query = null;
- $uri->path = "$content_type;base64," . base64_encode($raw_data);
- return true;
- }
-
- /**
- * @param int $errno
- * @param string $errstr
- */
- public function muteErrorHandler($errno, $errstr)
- {
- }
-}
diff --git a/library/bootstrap/css/bootstrap-grid.css b/library/bootstrap/css/bootstrap-grid.css
new file mode 100644
index 000000000..ab8ae240d
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.css
@@ -0,0 +1,2321 @@
+@-ms-viewport {
+ width: device-width;
+}
+
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 576px) {
+ .container {
+ width: 540px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 720px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1140px;
+ max-width: 100%;
+ }
+}
+
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+.row {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -15px;
+ margin-left: -15px;
+}
+
+@media (min-width: 576px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .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, .col-sm,
+.col-sm-auto, .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, .col-md,
+.col-md-auto, .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, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
+ position: relative;
+ width: 100%;
+ min-height: 1px;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+.col {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+}
+
+.col-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+}
+
+.col-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+}
+
+.col-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+}
+
+.col-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+}
+
+.col-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+}
+
+.col-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+}
+
+.col-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+}
+
+.col-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+}
+
+.col-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+}
+
+.col-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+}
+
+.col-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+}
+
+.col-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+}
+
+.col-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+}
+
+.pull-0 {
+ right: auto;
+}
+
+.pull-1 {
+ right: 8.333333%;
+}
+
+.pull-2 {
+ right: 16.666667%;
+}
+
+.pull-3 {
+ right: 25%;
+}
+
+.pull-4 {
+ right: 33.333333%;
+}
+
+.pull-5 {
+ right: 41.666667%;
+}
+
+.pull-6 {
+ right: 50%;
+}
+
+.pull-7 {
+ right: 58.333333%;
+}
+
+.pull-8 {
+ right: 66.666667%;
+}
+
+.pull-9 {
+ right: 75%;
+}
+
+.pull-10 {
+ right: 83.333333%;
+}
+
+.pull-11 {
+ right: 91.666667%;
+}
+
+.pull-12 {
+ right: 100%;
+}
+
+.push-0 {
+ left: auto;
+}
+
+.push-1 {
+ left: 8.333333%;
+}
+
+.push-2 {
+ left: 16.666667%;
+}
+
+.push-3 {
+ left: 25%;
+}
+
+.push-4 {
+ left: 33.333333%;
+}
+
+.push-5 {
+ left: 41.666667%;
+}
+
+.push-6 {
+ left: 50%;
+}
+
+.push-7 {
+ left: 58.333333%;
+}
+
+.push-8 {
+ left: 66.666667%;
+}
+
+.push-9 {
+ left: 75%;
+}
+
+.push-10 {
+ left: 83.333333%;
+}
+
+.push-11 {
+ left: 91.666667%;
+}
+
+.push-12 {
+ left: 100%;
+}
+
+.offset-1 {
+ margin-left: 8.333333%;
+}
+
+.offset-2 {
+ margin-left: 16.666667%;
+}
+
+.offset-3 {
+ margin-left: 25%;
+}
+
+.offset-4 {
+ margin-left: 33.333333%;
+}
+
+.offset-5 {
+ margin-left: 41.666667%;
+}
+
+.offset-6 {
+ margin-left: 50%;
+}
+
+.offset-7 {
+ margin-left: 58.333333%;
+}
+
+.offset-8 {
+ margin-left: 66.666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.333333%;
+}
+
+.offset-11 {
+ margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+ .col-sm {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-sm-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-sm-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-sm-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-sm-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-sm-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-sm-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-sm-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-sm-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-sm-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-sm-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-sm-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-sm-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .pull-sm-0 {
+ right: auto;
+ }
+ .pull-sm-1 {
+ right: 8.333333%;
+ }
+ .pull-sm-2 {
+ right: 16.666667%;
+ }
+ .pull-sm-3 {
+ right: 25%;
+ }
+ .pull-sm-4 {
+ right: 33.333333%;
+ }
+ .pull-sm-5 {
+ right: 41.666667%;
+ }
+ .pull-sm-6 {
+ right: 50%;
+ }
+ .pull-sm-7 {
+ right: 58.333333%;
+ }
+ .pull-sm-8 {
+ right: 66.666667%;
+ }
+ .pull-sm-9 {
+ right: 75%;
+ }
+ .pull-sm-10 {
+ right: 83.333333%;
+ }
+ .pull-sm-11 {
+ right: 91.666667%;
+ }
+ .pull-sm-12 {
+ right: 100%;
+ }
+ .push-sm-0 {
+ left: auto;
+ }
+ .push-sm-1 {
+ left: 8.333333%;
+ }
+ .push-sm-2 {
+ left: 16.666667%;
+ }
+ .push-sm-3 {
+ left: 25%;
+ }
+ .push-sm-4 {
+ left: 33.333333%;
+ }
+ .push-sm-5 {
+ left: 41.666667%;
+ }
+ .push-sm-6 {
+ left: 50%;
+ }
+ .push-sm-7 {
+ left: 58.333333%;
+ }
+ .push-sm-8 {
+ left: 66.666667%;
+ }
+ .push-sm-9 {
+ left: 75%;
+ }
+ .push-sm-10 {
+ left: 83.333333%;
+ }
+ .push-sm-11 {
+ left: 91.666667%;
+ }
+ .push-sm-12 {
+ left: 100%;
+ }
+ .offset-sm-0 {
+ margin-left: 0%;
+ }
+ .offset-sm-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-sm-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-sm-3 {
+ margin-left: 25%;
+ }
+ .offset-sm-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-sm-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-sm-6 {
+ margin-left: 50%;
+ }
+ .offset-sm-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-sm-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-sm-9 {
+ margin-left: 75%;
+ }
+ .offset-sm-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-sm-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 768px) {
+ .col-md {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-md-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-md-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-md-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-md-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-md-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-md-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-md-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-md-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-md-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-md-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-md-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-md-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .pull-md-0 {
+ right: auto;
+ }
+ .pull-md-1 {
+ right: 8.333333%;
+ }
+ .pull-md-2 {
+ right: 16.666667%;
+ }
+ .pull-md-3 {
+ right: 25%;
+ }
+ .pull-md-4 {
+ right: 33.333333%;
+ }
+ .pull-md-5 {
+ right: 41.666667%;
+ }
+ .pull-md-6 {
+ right: 50%;
+ }
+ .pull-md-7 {
+ right: 58.333333%;
+ }
+ .pull-md-8 {
+ right: 66.666667%;
+ }
+ .pull-md-9 {
+ right: 75%;
+ }
+ .pull-md-10 {
+ right: 83.333333%;
+ }
+ .pull-md-11 {
+ right: 91.666667%;
+ }
+ .pull-md-12 {
+ right: 100%;
+ }
+ .push-md-0 {
+ left: auto;
+ }
+ .push-md-1 {
+ left: 8.333333%;
+ }
+ .push-md-2 {
+ left: 16.666667%;
+ }
+ .push-md-3 {
+ left: 25%;
+ }
+ .push-md-4 {
+ left: 33.333333%;
+ }
+ .push-md-5 {
+ left: 41.666667%;
+ }
+ .push-md-6 {
+ left: 50%;
+ }
+ .push-md-7 {
+ left: 58.333333%;
+ }
+ .push-md-8 {
+ left: 66.666667%;
+ }
+ .push-md-9 {
+ left: 75%;
+ }
+ .push-md-10 {
+ left: 83.333333%;
+ }
+ .push-md-11 {
+ left: 91.666667%;
+ }
+ .push-md-12 {
+ left: 100%;
+ }
+ .offset-md-0 {
+ margin-left: 0%;
+ }
+ .offset-md-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-md-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-md-3 {
+ margin-left: 25%;
+ }
+ .offset-md-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-md-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-md-6 {
+ margin-left: 50%;
+ }
+ .offset-md-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-md-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-md-9 {
+ margin-left: 75%;
+ }
+ .offset-md-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-md-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 992px) {
+ .col-lg {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-lg-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-lg-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-lg-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-lg-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-lg-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-lg-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-lg-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-lg-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-lg-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-lg-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-lg-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-lg-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .pull-lg-0 {
+ right: auto;
+ }
+ .pull-lg-1 {
+ right: 8.333333%;
+ }
+ .pull-lg-2 {
+ right: 16.666667%;
+ }
+ .pull-lg-3 {
+ right: 25%;
+ }
+ .pull-lg-4 {
+ right: 33.333333%;
+ }
+ .pull-lg-5 {
+ right: 41.666667%;
+ }
+ .pull-lg-6 {
+ right: 50%;
+ }
+ .pull-lg-7 {
+ right: 58.333333%;
+ }
+ .pull-lg-8 {
+ right: 66.666667%;
+ }
+ .pull-lg-9 {
+ right: 75%;
+ }
+ .pull-lg-10 {
+ right: 83.333333%;
+ }
+ .pull-lg-11 {
+ right: 91.666667%;
+ }
+ .pull-lg-12 {
+ right: 100%;
+ }
+ .push-lg-0 {
+ left: auto;
+ }
+ .push-lg-1 {
+ left: 8.333333%;
+ }
+ .push-lg-2 {
+ left: 16.666667%;
+ }
+ .push-lg-3 {
+ left: 25%;
+ }
+ .push-lg-4 {
+ left: 33.333333%;
+ }
+ .push-lg-5 {
+ left: 41.666667%;
+ }
+ .push-lg-6 {
+ left: 50%;
+ }
+ .push-lg-7 {
+ left: 58.333333%;
+ }
+ .push-lg-8 {
+ left: 66.666667%;
+ }
+ .push-lg-9 {
+ left: 75%;
+ }
+ .push-lg-10 {
+ left: 83.333333%;
+ }
+ .push-lg-11 {
+ left: 91.666667%;
+ }
+ .push-lg-12 {
+ left: 100%;
+ }
+ .offset-lg-0 {
+ margin-left: 0%;
+ }
+ .offset-lg-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-lg-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-lg-3 {
+ margin-left: 25%;
+ }
+ .offset-lg-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-lg-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-lg-6 {
+ margin-left: 50%;
+ }
+ .offset-lg-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-lg-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-xl {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xl-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xl-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xl-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xl-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xl-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xl-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xl-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xl-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .pull-xl-0 {
+ right: auto;
+ }
+ .pull-xl-1 {
+ right: 8.333333%;
+ }
+ .pull-xl-2 {
+ right: 16.666667%;
+ }
+ .pull-xl-3 {
+ right: 25%;
+ }
+ .pull-xl-4 {
+ right: 33.333333%;
+ }
+ .pull-xl-5 {
+ right: 41.666667%;
+ }
+ .pull-xl-6 {
+ right: 50%;
+ }
+ .pull-xl-7 {
+ right: 58.333333%;
+ }
+ .pull-xl-8 {
+ right: 66.666667%;
+ }
+ .pull-xl-9 {
+ right: 75%;
+ }
+ .pull-xl-10 {
+ right: 83.333333%;
+ }
+ .pull-xl-11 {
+ right: 91.666667%;
+ }
+ .pull-xl-12 {
+ right: 100%;
+ }
+ .push-xl-0 {
+ left: auto;
+ }
+ .push-xl-1 {
+ left: 8.333333%;
+ }
+ .push-xl-2 {
+ left: 16.666667%;
+ }
+ .push-xl-3 {
+ left: 25%;
+ }
+ .push-xl-4 {
+ left: 33.333333%;
+ }
+ .push-xl-5 {
+ left: 41.666667%;
+ }
+ .push-xl-6 {
+ left: 50%;
+ }
+ .push-xl-7 {
+ left: 58.333333%;
+ }
+ .push-xl-8 {
+ left: 66.666667%;
+ }
+ .push-xl-9 {
+ left: 75%;
+ }
+ .push-xl-10 {
+ left: 83.333333%;
+ }
+ .push-xl-11 {
+ left: 91.666667%;
+ }
+ .push-xl-12 {
+ left: 100%;
+ }
+ .offset-xl-0 {
+ margin-left: 0%;
+ }
+ .offset-xl-1 {
+ margin-left: 8.333333%;
+ }
+ .offset-xl-2 {
+ margin-left: 16.666667%;
+ }
+ .offset-xl-3 {
+ margin-left: 25%;
+ }
+ .offset-xl-4 {
+ margin-left: 33.333333%;
+ }
+ .offset-xl-5 {
+ margin-left: 41.666667%;
+ }
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.css.map b/library/bootstrap/css/bootstrap-grid.css.map
new file mode 100644
index 000000000..c658ac647
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE;EAAgB,oBAAmB;CCRpC;;ADWD;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,8BAA6B;CAC9B;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AEjBC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDmBF;;AG6BG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CD0BF;;AGsBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDiCF;;AGeG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDwCF;;AGQG;EFnDF;ICiBI,aE8KK;IF7KL,gBAAe;GDflB;CD+CF;;AGCG;EFnDF;ICiBI,aE+KK;IF9KL,gBAAe;GDflB;CDsDF;;AGNG;EFnDF;ICiBI,aEgLK;IF/KL,gBAAe;GDflB;CD6DF;;AGbG;EFnDF;ICiBI,cEiLM;IFhLN,gBAAe;GDflB;CDoEF;;AC3DC;ECZA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDO/B;;AEqCC;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CDuEF;;AGlCG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CD8EF;;AGzCG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CDqFF;;AGhDG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CD4FF;;ACpFC;ECYA,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EAKX,oBAA4B;EAC5B,mBAA4B;CDjB/B;;AE2BC;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CDgGF;;AGrEG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CDuGF;;AG5EG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CD8GF;;AGnFG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CDqHF;;ACjHC;EACE,gBAAe;EACf,eAAc;CAOf;;AATD;;EAMI,iBAAgB;EAChB,gBAAe;CAChB;;AIlCH;;;;;;EACE,mBAAkB;EAClB,YAAW;EACX,gBAAe;EHsBb,oBAA4B;EAC5B,mBAA4B;CGpB/B;;AF2CC;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CLyKF;;AG9HG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CLqLF;;AG1IG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CLiMF;;AGtJG;EEjDF;;;;;;IHyBI,oBAA4B;IAC5B,mBAA4B;GGpB/B;CL6MF;;AK3LK;EACE,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,gBAAe;CAChB;;AACD;EACE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,YAAW;CACZ;;AAGC;EH2BN,oBAAsC;EAAtC,4BAAsC;MAAtC,wBAAsC;UAAtC,oBAAsC;EAKtC,qBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CG9BhC;;AAFD;EH2BN,oBAAsC;EAAtC,uBAAsC;MAAtC,mBAAsC;UAAtC,eAAsC;EAKtC,gBAAuC;CG9BhC;;AAKC;EHqCR,YAAuD;CGnC9C;;AAFD;EHqCR,iBAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,WAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,WAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,WAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,kBAAiD;CGnCxC;;AAFD;EHqCR,YAAiD;CGnCxC;;AAFD;EHiCR,WAAsD;CG/B7C;;AAFD;EHiCR,gBAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,UAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,UAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,UAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,iBAAgD;CG/BvC;;AAFD;EHiCR,WAAgD;CG/BvC;;AAOD;EHoBR,uBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,iBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,iBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,iBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AAFD;EHoBR,wBAAyC;CGlBhC;;AFJP;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GG9BhC;EAKC;IHqCR,YAAuD;GGnC9C;EAFD;IHqCR,iBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,YAAiD;GGnCxC;EAFD;IHiCR,WAAsD;GG/B7C;EAFD;IHiCR,gBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,WAAgD;GG/BvC;EAOD;IHoBR,gBAAyC;GGlBhC;EAFD;IHoBR,uBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;CLuiBV;;AG3iBG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GG9BhC;EAKC;IHqCR,YAAuD;GGnC9C;EAFD;IHqCR,iBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,YAAiD;GGnCxC;EAFD;IHiCR,WAAsD;GG/B7C;EAFD;IHiCR,gBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,WAAgD;GG/BvC;EAOD;IHoBR,gBAAyC;GGlBhC;EAFD;IHoBR,uBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;CLqtBV;;AGztBG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GG9BhC;EAKC;IHqCR,YAAuD;GGnC9C;EAFD;IHqCR,iBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,YAAiD;GGnCxC;EAFD;IHiCR,WAAsD;GG/B7C;EAFD;IHiCR,gBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,WAAgD;GG/BvC;EAOD;IHoBR,gBAAyC;GGlBhC;EAFD;IHoBR,uBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;CLm4BV;;AGv4BG;EEzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IH2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GG9BhC;EAFD;IH2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GG9BhC;EAKC;IHqCR,YAAuD;GGnC9C;EAFD;IHqCR,iBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,WAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,kBAAiD;GGnCxC;EAFD;IHqCR,YAAiD;GGnCxC;EAFD;IHiCR,WAAsD;GG/B7C;EAFD;IHiCR,gBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,UAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,iBAAgD;GG/BvC;EAFD;IHiCR,WAAgD;GG/BvC;EAOD;IHoBR,gBAAyC;GGlBhC;EAFD;IHoBR,uBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,iBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;EAFD;IHoBR,wBAAyC;GGlBhC;CLijCV;;AMrmCG;EAAwB,6BAAS;EAAT,kBAAS;MAAT,mBAAS;UAAT,UAAS;CAAK;;AACtC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AACrC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AAErC;EAAgC,0CAA8B;EAA9B,yCAA8B;EAA9B,uCAA8B;MAA9B,mCAA8B;UAA9B,+BAA8B;CAAK;;AACnE;EAAgC,wCAAiC;EAAjC,yCAAiC;EAAjC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,0CAAsC;EAAtC,0CAAsC;EAAtC,+CAAsC;MAAtC,2CAAsC;UAAtC,uCAAsC;CAAK;;AAC3E;EAAgC,wCAAyC;EAAzC,0CAAyC;EAAzC,kDAAyC;MAAzC,8CAAyC;UAAzC,0CAAyC;CAAK;;AAE9E;EAA8B,mCAA0B;MAA1B,+BAA0B;UAA1B,2BAA0B;CAAK;;AAC7D;EAA8B,qCAA4B;MAA5B,iCAA4B;UAA5B,6BAA4B;CAAK;;AAC/D;EAA8B,2CAAkC;MAAlC,uCAAkC;UAAlC,mCAAkC;CAAK;;AAErE;EAAoC,mCAAsC;EAAtC,+CAAsC;MAAtC,gCAAsC;UAAtC,uCAAsC;CAAK;;AAC/E;EAAoC,iCAAoC;EAApC,6CAAoC;MAApC,8BAAoC;UAApC,qCAAoC;CAAK;;AAC7E;EAAoC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AAC3E;EAAoC,qCAAyC;EAAzC,kDAAyC;MAAzC,kCAAyC;UAAzC,0CAAyC;CAAK;;AAClF;EAAoC,iDAAwC;MAAxC,qCAAwC;UAAxC,yCAAwC;CAAK;;AAEjF;EAAiC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AACxE;EAAiC,kCAAgC;EAAhC,yCAAgC;MAAhC,+BAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,qCAA8B;EAA9B,uCAA8B;MAA9B,kCAA8B;UAA9B,+BAA8B;CAAK;;AACpE;EAAiC,uCAAgC;EAAhC,yCAAgC;MAAhC,oCAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,sCAA+B;EAA/B,wCAA+B;MAA/B,mCAA+B;UAA/B,gCAA+B;CAAK;;AAErE;EAAkC,6CAAoC;MAApC,qCAAoC;UAApC,qCAAoC;CAAK;;AAC3E;EAAkC,2CAAkC;MAAlC,mCAAkC;UAAlC,mCAAkC;CAAK;;AACzE;EAAkC,yCAAgC;MAAhC,sCAAgC;UAAhC,iCAAgC;CAAK;;AACvE;EAAkC,gDAAuC;MAAvC,uCAAuC;UAAvC,wCAAuC;CAAK;;AAC9E;EAAkC,+CAAsC;MAAtC,0CAAsC;UAAtC,uCAAsC;CAAK;;AAC7E;EAAkC,0CAAiC;MAAjC,uCAAiC;UAAjC,kCAAiC;CAAK;;AAExE;EAAgC,oCAA2B;MAA3B,qCAA2B;cAA3B,oCAA2B;UAA3B,4BAA2B;CAAK;;AAChE;EAAgC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,wCAA+B;MAA/B,oCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,sCAA6B;MAA7B,uCAA6B;cAA7B,sCAA6B;UAA7B,8BAA6B;CAAK;;AAClE;EAAgC,wCAA+B;MAA/B,yCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,uCAA8B;MAA9B,wCAA8B;cAA9B,uCAA8B;UAA9B,+BAA8B;CAAK;;AHWnE;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CNmyCtE;;AGxxCG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CNs4CtE;;AG33CG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CNy+CtE;;AG99CG;EGhDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;CN4kDtE","file":"bootstrap-grid.css","sourcesContent":[null,"@-ms-viewport {\n width: device-width;\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */",null,null,null,null,null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css b/library/bootstrap/css/bootstrap-grid.min.css
new file mode 100644
index 000000000..d17ef327f
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.min.css
@@ -0,0 +1 @@
+@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css.map b/library/bootstrap/css/bootstrap-grid.min.css.map
new file mode 100644
index 000000000..2210b2a68
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-grid.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE,cAAgB,MAAA,aAGlB,KACE,mBAAA,WAAA,WAAA,WACA,mBAAA,UAGF,ECNA,QADA,SDUE,mBAAA,QAAA,WAAA,QEhBA,WCAA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,0BFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,0BFnDF,WCiBI,MAAA,OACA,UAAA,MDNJ,iBCZA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,0BFvCF,iBCNI,cAAA,KACA,aAAA,MDeJ,KCYA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KAKI,aAAA,MACA,YAAA,MCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,0BF7BF,KCkBI,aAAA,MACA,YAAA,ODbJ,YACE,aAAA,EACA,YAAA,EAFF,iBDgIF,0BC1HM,cAAA,EACA,aAAA,EGjCJ,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJgKF,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aInKI,SAAA,SACA,MAAA,KACA,WAAA,IFsBE,cAAA,KACA,aAAA,KCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJ8KA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aEzJI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJ0LA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aErKI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJsMA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aEjLI,cAAA,KACA,aAAA,MCuBF,0BCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OJkNA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aE7LI,cAAA,KACA,aAAA,MEFA,KACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,UACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,QFqCR,MAAA,KErCQ,QFqCR,MAAA,UErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,SFqCR,MAAA,WErCQ,SFqCR,MAAA,WErCQ,SFqCR,MAAA,KErCQ,QFiCR,KAAA,KEjCQ,QFiCR,KAAA,UEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,SFiCR,KAAA,WEjCQ,SFiCR,KAAA,WEjCQ,SFiCR,KAAA,KExBQ,UFoBR,YAAA,UEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,WFoBR,YAAA,WEpBQ,WFoBR,YAAA,WCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YGtEE,aAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,SAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,UAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,aAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,kBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,qBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,WAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,aAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,mBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,uBAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,qBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,wBAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,yBAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,wBAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,mBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,iBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,oBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,sBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,qBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,qBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,mBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,sBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,uBAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,sBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,uBAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,iBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,kBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,gBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,mBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,qBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,oBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,kBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,yBEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBFWhC,0BEhDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA"} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.css b/library/bootstrap/css/bootstrap-reboot.css
new file mode 100644
index 000000000..6509cf5b2
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.css
@@ -0,0 +1,334 @@
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: transparent;
+}
+
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+body {
+ margin: 0;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ font-size: 1rem;
+ font-weight: normal;
+ line-height: 1.5;
+ color: #292b2c;
+ background-color: #fff;
+}
+
+[tabindex="-1"]:focus {
+ outline: none !important;
+}
+
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem;
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+dfn {
+ font-style: italic;
+}
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+small {
+ font-size: 80%;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -.25em;
+}
+
+sup {
+ top: -.5em;
+}
+
+a {
+ color: #0275d8;
+ text-decoration: none;
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects;
+}
+
+a:hover {
+ color: #014c8c;
+ text-decoration: underline;
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
+}
+
+pre,
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
+}
+
+figure {
+ margin: 0 0 1rem;
+}
+
+img {
+ vertical-align: middle;
+ border-style: none;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+caption {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+ color: #636c72;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ text-align: left;
+}
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem;
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 0;
+}
+
+input[type="radio"]:disabled,
+input[type="checkbox"]:disabled {
+ cursor: not-allowed;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical;
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
+}
+
+progress {
+ vertical-align: baseline;
+}
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
+}
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
+}
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.css.map b/library/bootstrap/css/bootstrap-reboot.css.map
new file mode 100644
index 000000000..04f3a70f7
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/_reboot.scss","bootstrap-reboot.css","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,wBAAuB;EACvB,kBAAiB;EACjB,+BAA8B;EAC9B,2BAA0B;EAC1B,8BAA6B;EAC7B,yCAA0C;CAC3C;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AAIC;EAAgB,oBAAmB;CCpBpC;;AD6BD;EACE,UAAS;EACT,mHEqM4H;EFpM5H,gBEwMmB;EFvMnB,oBE4MyB;EF3MzB,iBE+MoB;EF9MpB,eEqDiC;EFpDjC,uBEwCW;CFvCZ;;ACzBD;EDiCE,yBAAwB;CACzB;;AAQD;EACE,gCAAuB;UAAvB,wBAAuB;EACvB,UAAS;EACT,kBAAiB;CAClB;;AAWD;EACE,cAAa;EACb,qBAAoB;CACrB;;AAMD;EACE,cAAa;EACb,oBAAmB;CACpB;;AASD;;EAEE,2BAA0B;EAC1B,kCAAiC;EACjC,aAAY;EACZ,iBAAgB;CACjB;;AAED;EACE,oBAAmB;EACnB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;;EAGE,cAAa;EACb,oBAAmB;CACpB;;AAED;;;;EAIE,iBAAgB;CACjB;;AAED;EACE,kBEuHqB;CFtHtB;;AAED;EACE,qBAAoB;EACpB,eAAc;CACf;;AAED;EACE,iBAAgB;CACjB;;AAED;EACE,mBAAkB;CACnB;;AAED;;EAEE,oBAAmB;CACpB;;AAED;EACE,eAAc;CACf;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,eAAc;EACd,yBAAwB;CACzB;;AAED;EAAM,eAAc;CAAK;;AACzB;EAAM,WAAU;CAAK;;AAOrB;EACE,eEpFc;EFqFd,sBEf0B;EFgB1B,8BAA6B;EAC7B,sCAAqC;CAMtC;;AGtLG;EHmLA,eEnB4C;EFoB5C,2BEnB6B;CCjKR;;AH8LzB;EACE,eAAc;EACd,sBAAqB;CAUtB;;AG/LG;EHwLA,eAAc;EACd,sBAAqB;CGtLpB;;AHgLL;EAUI,WAAU;CACX;;AAQH;;;;EAIE,kCAAiC;EACjC,eAAc;CACf;;AAED;EAEE,cAAa;EAEb,oBAAmB;EAEnB,eAAc;CACf;;AAOD;EAEE,iBAAgB;CACjB;;AAOD;EACE,uBAAsB;EACtB,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AAaD;;;;;;;;;EASE,+BAA0B;MAA1B,2BAA0B;CAC3B;;AAOD;EACE,0BAAyB;CAC1B;;AAED;EACE,qBEoBoC;EFnBpC,wBEmBoC;EFlBpC,eE5LiC;EF6LjC,iBAAgB;EAChB,qBAAoB;CACrB;;AAED;EAEE,iBAAgB;CACjB;;AAOD;EAEE,sBAAqB;EACrB,qBAAoB;CACrB;;AAMD;EACE,oBAAmB;EACnB,2CAA0C;CAC3C;;AAED;;;;;EAKE,UAAS;EACT,qBAAoB;EACpB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;EAEE,kBAAiB;CAClB;;AAED;;EAEE,qBAAoB;CACrB;;AAKD;;;;EAIE,2BAA0B;CAC3B;;AAGD;;;;EAIE,WAAU;EACV,mBAAkB;CACnB;;AAED;;EAEE,+BAAsB;UAAtB,uBAAsB;EACtB,WAAU;CAQX;;AAXD;;EASI,oBE4DwC;CF3DzC;;AAIH;;;;EASE,4BAA2B;CAC5B;;AAED;EACE,eAAc;EAEd,iBAAgB;CACjB;;AAED;EAME,aAAY;EAEZ,WAAU;EACV,UAAS;EACT,UAAS;CACV;;AAID;EACE,eAAc;EACd,YAAW;EACX,gBAAe;EACf,WAAU;EACV,qBAAoB;EACpB,kBAAiB;EACjB,qBAAoB;EACpB,eAAc;EACd,oBAAmB;CACpB;;AAED;EACE,yBAAwB;CACzB;;ACtID;;ED2IE,aAAY;CACb;;ACvID;ED8IE,qBAAoB;EACpB,yBAAwB;CACzB;;AC3ID;;EDmJE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,cAAa;CACd;;ACxJD;ED6JE,yBAAwB;CACzB","file":"bootstrap-reboot.css","sourcesContent":[null,"html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"radio\"]:disabled,\ninput[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */",null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css b/library/bootstrap/css/bootstrap-reboot.min.css
new file mode 100644
index 000000000..c39472e73
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.min.css
@@ -0,0 +1 @@
+html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css.map b/library/bootstrap/css/bootstrap-reboot.min.css.map
new file mode 100644
index 000000000..a99e82ef6
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-reboot.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA,KACE,mBAAA,WAAA,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,ECjBA,QADA,SDqBE,mBAAA,QAAA,WAAA,QAKA,cAAgB,MAAA,aASlB,KACE,OAAA,EACA,YAAA,aAAA,CAAA,SAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KExBF,sBFiCE,QAAA,YASF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC5CF,0BDsDA,YAEE,gBAAA,UACA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QClDF,GDqDA,GCtDA,GDyDE,WAAA,EACA,cAAA,KAGF,MCrDA,MACA,MAFA,MD0DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,ECtDA,ODwDE,YAAA,OAGF,MACE,UAAA,IAQF,IC3DA,ID6DE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QGhLE,QHmLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGrLE,oCAAA,oCHwLA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC7DJ,KACA,IDqEA,ICpEA,KDwEE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OC/EF,cD6FA,EC/FA,KACA,OAEA,MACA,MACA,OACA,QACA,SDiGE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC3GF,OD8GA,MC5GA,SADA,OAEA,SDgHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OC9GA,MDgHE,SAAA,QAGF,OC9GA,ODgHE,eAAA,KC1GF,aACA,cD+GA,OCjHA,mBDqHE,mBAAA,OC9GF,gCACA,+BACA,gCDgHA,yBAIE,QAAA,EACA,aAAA,KC/GF,qBDkHA,kBAEE,mBAAA,WAAA,WAAA,WACA,QAAA,EC9GF,8BD2GA,2BASI,OAAA,YAKJ,iBCnHA,2BACA,kBAFA,iBD6HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SErIF,yCDMA,yCDqIE,OAAA,KEtIF,cF8IE,eAAA,KACA,mBAAA,KE1IF,4CDMA,yCD6IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KEvJF,SF6JE,QAAA"} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.css b/library/bootstrap/css/bootstrap-theme.css
deleted file mode 100644
index 31d888266..000000000
--- a/library/bootstrap/css/bootstrap-theme.css
+++ /dev/null
@@ -1,587 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
- 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-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.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-default.disabled,
-.btn-primary.disabled,
-.btn-success.disabled,
-.btn-info.disabled,
-.btn-warning.disabled,
-.btn-danger.disabled,
-.btn-default[disabled],
-.btn-primary[disabled],
-.btn-success[disabled],
-.btn-info[disabled],
-.btn-warning[disabled],
-.btn-danger[disabled],
-fieldset[disabled] .btn-default,
-fieldset[disabled] .btn-primary,
-fieldset[disabled] .btn-success,
-fieldset[disabled] .btn-info,
-fieldset[disabled] .btn-warning,
-fieldset[disabled] .btn-danger {
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.btn-default .badge,
-.btn-primary .badge,
-.btn-success .badge,
-.btn-info .badge,
-.btn-warning .badge,
-.btn-danger .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:hover,
-.btn-default:focus {
- 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],
-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: #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:hover,
-.btn-primary:focus {
- 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],
-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: #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:hover,
-.btn-success:focus {
- 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],
-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: #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:hover,
-.btn-info:focus {
- 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],
-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: #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:hover,
-.btn-warning:focus {
- 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],
-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: #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:hover,
-.btn-danger:focus {
- 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],
-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: #c12e2a;
- background-image: none;
-}
-.thumbnail,
-.img-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:hover,
-.dropdown-menu > li > a:focus {
- 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:hover,
-.dropdown-menu > .active > a:focus {
- 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 > .open > a,
-.navbar-default .navbar-nav > .active > 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 > .open > a,
-.navbar-inverse .navbar-nav > .active > 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-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- border-radius: 0;
-}
-@media (max-width: 767px) {
- .navbar .navbar-nav .open .dropdown-menu > .active > a,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
- .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
- 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:hover,
-.list-group-item.active:focus {
- 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:hover .badge,
-.list-group-item.active:focus .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);
-}
-/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/library/bootstrap/css/bootstrap-theme.css.map b/library/bootstrap/css/bootstrap-theme.css.map
deleted file mode 100644
index d876f60fb..000000000
--- a/library/bootstrap/css/bootstrap-theme.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.min.css b/library/bootstrap/css/bootstrap-theme.min.css
deleted file mode 100644
index 5e3940195..000000000
--- a/library/bootstrap/css/bootstrap-theme.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 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)}
-/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-theme.min.css.map b/library/bootstrap/css/bootstrap-theme.min.css.map
deleted file mode 100644
index 94813e900..000000000
--- a/library/bootstrap/css/bootstrap-theme.min.css.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css b/library/bootstrap/css/bootstrap.css
index 6167622ce..a579723ea 100644
--- a/library/bootstrap/css/bootstrap.css
+++ b/library/bootstrap/css/bootstrap.css
@@ -1,200 +1,22 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 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;
- -webkit-text-size-adjust: 100%;
- -ms-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 {
- margin: .67em 0;
- font-size: 2em;
-}
-mark {
- color: #000;
- background: #ff0;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sup {
- top: -.5em;
-}
-sub {
- bottom: -.25em;
-}
-img {
- border: 0;
-}
-svg:not(:root) {
- overflow: hidden;
-}
-figure {
- margin: 1em 40px;
-}
-hr {
- height: 0;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-pre {
- overflow: auto;
-}
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
- margin: 0;
- font: inherit;
- color: inherit;
-}
-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 {
- padding: 0;
- border: 0;
-}
-input {
- line-height: normal;
-}
-input[type="checkbox"],
-input[type="radio"] {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- 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-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-fieldset {
- padding: .35em .625em .75em;
- margin: 0 2px;
- border: 1px solid #c0c0c0;
-}
-legend {
- padding: 0;
- border: 0;
-}
-textarea {
- overflow: auto;
-}
-optgroup {
- font-weight: bold;
-}
-table {
- border-spacing: 0;
- border-collapse: collapse;
-}
-td,
-th {
- padding: 0;
-}
-/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
@media print {
*,
- *:before,
- *:after {
- color: #000 !important;
+ *::before,
+ *::after,
+ p::first-letter,
+ div::first-letter,
+ blockquote::first-letter,
+ li::first-letter,
+ p::first-line,
+ div::first-line,
+ blockquote::first-line,
+ li::first-line {
text-shadow: none !important;
- background: transparent !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
@@ -202,20 +24,15 @@ th {
a:visited {
text-decoration: underline;
}
- a[href]:after {
- content: " (" attr(href) ")";
- }
- abbr[title]:after {
+ abbr[title]::after {
content: " (" attr(title) ")";
}
- a[href^="#"]:after,
- a[href^="javascript:"]:after {
- content: "";
+ pre {
+ white-space: pre-wrap !important;
}
pre,
blockquote {
border: 1px solid #999;
-
page-break-inside: avoid;
}
thead {
@@ -225,9 +42,6 @@ th {
img {
page-break-inside: avoid;
}
- img {
- max-width: 100% !important;
- }
p,
h2,
h3 {
@@ -241,11 +55,7 @@ th {
.navbar {
display: none;
}
- .btn > .caret,
- .dropup > .btn > .caret {
- border-top-color: #000 !important;
- }
- .label {
+ .badge {
border: 1px solid #000;
}
.table {
@@ -260,2663 +70,2420 @@ 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');
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ -ms-overflow-style: scrollbar;
+ -webkit-tap-highlight-color: transparent;
}
-.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: "\002a";
-}
-.glyphicon-plus:before {
- content: "\002b";
-}
-.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";
+*,
+*::before,
+*::after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
}
-.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";
+
+@-ms-viewport {
+ width: device-width;
}
-.glyphicon-bitcoin:before {
- content: "\e227";
+
+body {
+ margin: 0;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ font-size: 1rem;
+ font-weight: normal;
+ line-height: 1.5;
+ color: #292b2c;
+ background-color: #fff;
}
-.glyphicon-btc:before {
- content: "\e227";
+
+[tabindex="-1"]:focus {
+ outline: none !important;
}
-.glyphicon-xbt:before {
- content: "\e227";
+
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible;
}
-.glyphicon-yen:before {
- content: "\00a5";
+
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem;
}
-.glyphicon-jpy:before {
- content: "\00a5";
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem;
}
-.glyphicon-ruble:before {
- content: "\20bd";
+
+abbr[title],
+abbr[data-original-title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
}
-.glyphicon-rub:before {
- content: "\20bd";
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
}
-.glyphicon-scale:before {
- content: "\e230";
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
}
-.glyphicon-ice-lolly:before {
- content: "\e231";
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
}
-.glyphicon-ice-lolly-tasted:before {
- content: "\e232";
+
+dt {
+ font-weight: bold;
}
-.glyphicon-education:before {
- content: "\e233";
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0;
}
-.glyphicon-option-horizontal:before {
- content: "\e234";
+
+blockquote {
+ margin: 0 0 1rem;
}
-.glyphicon-option-vertical:before {
- content: "\e235";
+
+dfn {
+ font-style: italic;
}
-.glyphicon-menu-hamburger:before {
- content: "\e236";
+
+b,
+strong {
+ font-weight: bolder;
}
-.glyphicon-modal-window:before {
- content: "\e237";
+
+small {
+ font-size: 80%;
}
-.glyphicon-oil:before {
- content: "\e238";
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
}
-.glyphicon-grain:before {
- content: "\e239";
+
+sub {
+ bottom: -.25em;
}
-.glyphicon-sunglasses:before {
- content: "\e240";
+
+sup {
+ top: -.5em;
}
-.glyphicon-text-size:before {
- content: "\e241";
+
+a {
+ color: #0275d8;
+ text-decoration: none;
+ background-color: transparent;
+ -webkit-text-decoration-skip: objects;
}
-.glyphicon-text-color:before {
- content: "\e242";
+
+a:hover {
+ color: #014c8c;
+ text-decoration: underline;
}
-.glyphicon-text-background:before {
- content: "\e243";
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
}
-.glyphicon-object-align-top:before {
- content: "\e244";
+
+a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none;
}
-.glyphicon-object-align-bottom:before {
- content: "\e245";
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0;
}
-.glyphicon-object-align-horizontal:before {
- content: "\e246";
+
+pre,
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
}
-.glyphicon-object-align-left:before {
- content: "\e247";
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto;
}
-.glyphicon-object-align-vertical:before {
- content: "\e248";
+
+figure {
+ margin: 0 0 1rem;
}
-.glyphicon-object-align-right:before {
- content: "\e249";
+
+img {
+ vertical-align: middle;
+ border-style: none;
}
-.glyphicon-triangle-right:before {
- content: "\e250";
+
+svg:not(:root) {
+ overflow: hidden;
}
-.glyphicon-triangle-left:before {
- content: "\e251";
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+ -ms-touch-action: manipulation;
+ touch-action: manipulation;
}
-.glyphicon-triangle-bottom:before {
- content: "\e252";
+
+table {
+ border-collapse: collapse;
}
-.glyphicon-triangle-top:before {
- content: "\e253";
+
+caption {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+ color: #636c72;
+ text-align: left;
+ caption-side: bottom;
}
-.glyphicon-console:before {
- content: "\e254";
+
+th {
+ text-align: left;
}
-.glyphicon-superscript:before {
- content: "\e255";
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem;
}
-.glyphicon-subscript:before {
- content: "\e256";
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
}
-.glyphicon-menu-left:before {
- content: "\e257";
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
}
-.glyphicon-menu-right:before {
- content: "\e258";
+
+button,
+input {
+ overflow: visible;
}
-.glyphicon-menu-down:before {
- content: "\e259";
+
+button,
+select {
+ text-transform: none;
}
-.glyphicon-menu-up:before {
- content: "\e260";
+
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
}
-* {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
}
-*:before,
-*:after {
+
+input[type="radio"],
+input[type="checkbox"] {
-webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
box-sizing: border-box;
+ padding: 0;
}
-html {
- font-size: 10px;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+input[type="radio"]:disabled,
+input[type="checkbox"]:disabled {
+ cursor: not-allowed;
}
-body {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 1.42857143;
- color: #333;
- background-color: #fff;
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ -webkit-appearance: listbox;
}
-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: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+ overflow: auto;
+ resize: vertical;
}
-figure {
+
+fieldset {
+ min-width: 0;
+ padding: 0;
margin: 0;
+ border: 0;
}
-img {
- vertical-align: middle;
-}
-.img-responsive,
-.thumbnail > img,
-.thumbnail a > img,
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
+
+legend {
display: block;
+ width: 100%;
max-width: 100%;
- height: auto;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal;
}
-.img-rounded {
- border-radius: 6px;
+
+progress {
+ vertical-align: baseline;
}
-.img-thumbnail {
- display: inline-block;
- max-width: 100%;
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
height: auto;
- 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;
}
-.img-circle {
- border-radius: 50%;
+
+[type="search"] {
+ outline-offset: -2px;
+ -webkit-appearance: none;
}
-hr {
- margin-top: 20px;
- margin-bottom: 20px;
- border: 0;
- border-top: 1px solid #eee;
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- border: 0;
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button;
}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- clip: auto;
+
+output {
+ display: inline-block;
}
-[role="button"] {
- cursor: pointer;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
+
+summary {
+ display: list-item;
+}
+
+template {
+ display: none;
+}
+
+[hidden] {
+ display: none !important;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ margin-bottom: 0.5rem;
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: 2.5rem;
}
-h1,
-.h1 {
- font-size: 36px;
+
+h2, .h2 {
+ font-size: 2rem;
}
-h2,
-.h2 {
- font-size: 30px;
+
+h3, .h3 {
+ font-size: 1.75rem;
}
-h3,
-.h3 {
- font-size: 24px;
+
+h4, .h4 {
+ font-size: 1.5rem;
}
-h4,
-.h4 {
- font-size: 18px;
+
+h5, .h5 {
+ font-size: 1.25rem;
}
-h5,
-.h5 {
- font-size: 14px;
+
+h6, .h6 {
+ font-size: 1rem;
}
-h6,
-.h6 {
- font-size: 12px;
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300;
}
-p {
- margin: 0 0 10px;
+
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.1;
}
-.lead {
- margin-bottom: 20px;
- font-size: 16px;
+
+.display-2 {
+ font-size: 5.5rem;
font-weight: 300;
- line-height: 1.4;
+ line-height: 1.1;
}
-@media (min-width: 768px) {
- .lead {
- font-size: 21px;
- }
+
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.1;
+}
+
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.1;
}
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
small,
.small {
- font-size: 85%;
+ font-size: 80%;
+ font-weight: normal;
}
+
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: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 {
+ padding: 0.2em;
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;
- margin-left: -5px;
list-style: none;
}
-.list-inline > li {
+
+.list-inline-item {
display: inline-block;
- padding-right: 5px;
- padding-left: 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: 768px) {
- .dl-horizontal dt {
- float: left;
- width: 160px;
- overflow: hidden;
- clear: left;
- text-align: right;
- 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;
+
+.list-inline-item:not(:last-child) {
+ margin-right: 5px;
}
+
.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 {
+ padding: 0.5rem 1rem;
+ margin-bottom: 1rem;
+ font-size: 1.25rem;
+ border-left: 0.25rem solid #eceeef;
}
-blockquote footer,
-blockquote small,
-blockquote .small {
+
+.blockquote-footer {
display: block;
font-size: 80%;
- line-height: 1.42857143;
- color: #777;
+ color: #636c72;
}
-blockquote footer:before,
-blockquote small:before,
-blockquote .small:before {
- content: '\2014 \00A0';
+
+.blockquote-footer::before {
+ content: "\2014 \00A0";
}
-.blockquote-reverse,
-blockquote.pull-right {
- padding-right: 15px;
+
+.blockquote-reverse {
+ padding-right: 1rem;
padding-left: 0;
text-align: right;
- border-right: 5px solid #eee;
+ border-right: 0.25rem solid #eceeef;
border-left: 0;
}
-.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';
+
+.blockquote-reverse .blockquote-footer::before {
+ content: "";
}
-address {
- margin-bottom: 20px;
- font-style: normal;
- line-height: 1.42857143;
+
+.blockquote-reverse .blockquote-footer::after {
+ content: "\00A0 \2014";
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto;
+}
+
+.img-thumbnail {
+ padding: 0.25rem;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 0.25rem;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ max-width: 100%;
+ height: auto;
}
+
+.figure {
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: 0.5rem;
+ line-height: 1;
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #636c72;
+}
+
code,
kbd,
pre,
samp {
- font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
+
code {
- padding: 2px 4px;
+ padding: 0.2rem 0.4rem;
font-size: 90%;
- color: #c7254e;
- background-color: #f9f2f4;
- border-radius: 4px;
+ color: #bd4147;
+ background-color: #f7f7f9;
+ border-radius: 0.25rem;
+}
+
+a > code {
+ padding: 0;
+ color: inherit;
+ background-color: inherit;
}
+
kbd {
- padding: 2px 4px;
+ padding: 0.2rem 0.4rem;
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);
+ background-color: #292b2c;
+ border-radius: 0.2rem;
}
+
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;
- color: #333;
- word-break: break-all;
- word-wrap: break-word;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border-radius: 4px;
+ margin-top: 0;
+ margin-bottom: 1rem;
+ font-size: 90%;
+ color: #292b2c;
}
+
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;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
+
@media (min-width: 768px) {
.container {
- width: 750px;
+ padding-right: 15px;
+ padding-left: 15px;
}
}
+
@media (min-width: 992px) {
.container {
- width: 970px;
+ padding-right: 15px;
+ padding-left: 15px;
}
}
+
@media (min-width: 1200px) {
.container {
- width: 1170px;
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 576px) {
+ .container {
+ width: 540px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ width: 720px;
+ max-width: 100%;
+ }
+}
+
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ max-width: 100%;
}
}
+
+@media (min-width: 1200px) {
+ .container {
+ width: 1140px;
+ max-width: 100%;
+ }
+}
+
.container-fluid {
- padding-right: 15px;
- padding-left: 15px;
margin-right: auto;
margin-left: auto;
+ padding-right: 15px;
+ padding-left: 15px;
+}
+
+@media (min-width: 576px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
+
.row {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
margin-right: -15px;
margin-left: -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 {
+
+@media (min-width: 576px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 992px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-right: -15px;
+ margin-left: -15px;
+ }
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+}
+
+.no-gutters > .col,
+.no-gutters > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+}
+
+.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+.col-auto, .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, .col-sm,
+.col-sm-auto, .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, .col-md,
+.col-md-auto, .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, .col-lg,
+.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+.col-xl-auto {
position: relative;
+ width: 100%;
min-height: 1px;
padding-right: 15px;
padding-left: 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%;
+
+@media (min-width: 576px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-11 {
- width: 91.66666667%;
+
+@media (min-width: 768px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-10 {
- width: 83.33333333%;
+
+@media (min-width: 992px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-9 {
- width: 75%;
+
+@media (min-width: 1200px) {
+ .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
+ .col-auto, .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, .col-sm,
+ .col-sm-auto, .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, .col-md,
+ .col-md-auto, .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, .col-lg,
+ .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
+ .col-xl-auto {
+ padding-right: 15px;
+ padding-left: 15px;
+ }
}
-.col-xs-8 {
- width: 66.66666667%;
+
+.col {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
}
-.col-xs-7 {
- width: 58.33333333%;
+
+.col-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
-.col-xs-6 {
- width: 50%;
+
+.col-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
-.col-xs-5 {
- width: 41.66666667%;
+
+.col-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
-.col-xs-4 {
- width: 33.33333333%;
+
+.col-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
-.col-xs-3 {
- width: 25%;
+
+.col-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
-.col-xs-2 {
- width: 16.66666667%;
+
+.col-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
-.col-xs-1 {
- width: 8.33333333%;
+
+.col-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
-.col-xs-pull-12 {
- right: 100%;
+
+.col-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
-.col-xs-pull-11 {
- right: 91.66666667%;
+
+.col-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
-.col-xs-pull-10 {
- right: 83.33333333%;
+
+.col-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
-.col-xs-pull-9 {
- right: 75%;
+
+.col-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
-.col-xs-pull-8 {
- right: 66.66666667%;
+
+.col-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
-.col-xs-pull-7 {
- right: 58.33333333%;
+
+.col-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
-.col-xs-pull-6 {
- right: 50%;
+
+.pull-0 {
+ right: auto;
}
-.col-xs-pull-5 {
- right: 41.66666667%;
+
+.pull-1 {
+ right: 8.333333%;
}
-.col-xs-pull-4 {
- right: 33.33333333%;
+
+.pull-2 {
+ right: 16.666667%;
}
-.col-xs-pull-3 {
+
+.pull-3 {
right: 25%;
}
-.col-xs-pull-2 {
- right: 16.66666667%;
+
+.pull-4 {
+ right: 33.333333%;
}
-.col-xs-pull-1 {
- right: 8.33333333%;
+
+.pull-5 {
+ right: 41.666667%;
}
-.col-xs-pull-0 {
- right: auto;
+
+.pull-6 {
+ right: 50%;
}
-.col-xs-push-12 {
- left: 100%;
+
+.pull-7 {
+ right: 58.333333%;
}
-.col-xs-push-11 {
- left: 91.66666667%;
+
+.pull-8 {
+ right: 66.666667%;
}
-.col-xs-push-10 {
- left: 83.33333333%;
+
+.pull-9 {
+ right: 75%;
}
-.col-xs-push-9 {
- left: 75%;
+
+.pull-10 {
+ right: 83.333333%;
}
-.col-xs-push-8 {
- left: 66.66666667%;
+
+.pull-11 {
+ right: 91.666667%;
}
-.col-xs-push-7 {
- left: 58.33333333%;
+
+.pull-12 {
+ right: 100%;
}
-.col-xs-push-6 {
- left: 50%;
+
+.push-0 {
+ left: auto;
}
-.col-xs-push-5 {
- left: 41.66666667%;
+
+.push-1 {
+ left: 8.333333%;
}
-.col-xs-push-4 {
- left: 33.33333333%;
+
+.push-2 {
+ left: 16.666667%;
}
-.col-xs-push-3 {
+
+.push-3 {
left: 25%;
}
-.col-xs-push-2 {
- left: 16.66666667%;
-}
-.col-xs-push-1 {
- left: 8.33333333%;
+
+.push-4 {
+ left: 33.333333%;
}
-.col-xs-push-0 {
- left: auto;
+
+.push-5 {
+ left: 41.666667%;
}
-.col-xs-offset-12 {
- margin-left: 100%;
+
+.push-6 {
+ left: 50%;
}
-.col-xs-offset-11 {
- margin-left: 91.66666667%;
+
+.push-7 {
+ left: 58.333333%;
}
-.col-xs-offset-10 {
- margin-left: 83.33333333%;
+
+.push-8 {
+ left: 66.666667%;
}
-.col-xs-offset-9 {
- margin-left: 75%;
+
+.push-9 {
+ left: 75%;
}
-.col-xs-offset-8 {
- margin-left: 66.66666667%;
+
+.push-10 {
+ left: 83.333333%;
}
-.col-xs-offset-7 {
- margin-left: 58.33333333%;
+
+.push-11 {
+ left: 91.666667%;
}
-.col-xs-offset-6 {
- margin-left: 50%;
+
+.push-12 {
+ left: 100%;
}
-.col-xs-offset-5 {
- margin-left: 41.66666667%;
+
+.offset-1 {
+ margin-left: 8.333333%;
}
-.col-xs-offset-4 {
- margin-left: 33.33333333%;
+
+.offset-2 {
+ margin-left: 16.666667%;
}
-.col-xs-offset-3 {
+
+.offset-3 {
margin-left: 25%;
}
-.col-xs-offset-2 {
- margin-left: 16.66666667%;
+
+.offset-4 {
+ margin-left: 33.333333%;
}
-.col-xs-offset-1 {
- margin-left: 8.33333333%;
+
+.offset-5 {
+ margin-left: 41.666667%;
}
-.col-xs-offset-0 {
- margin-left: 0;
+
+.offset-6 {
+ margin-left: 50%;
}
-@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%;
+
+.offset-7 {
+ margin-left: 58.333333%;
+}
+
+.offset-8 {
+ margin-left: 66.666667%;
+}
+
+.offset-9 {
+ margin-left: 75%;
+}
+
+.offset-10 {
+ margin-left: 83.333333%;
+}
+
+.offset-11 {
+ margin-left: 91.666667%;
+}
+
+@media (min-width: 576px) {
+ .col-sm {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-sm-11 {
- width: 91.66666667%;
+ .col-sm-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
- .col-sm-10 {
- width: 83.33333333%;
+ .col-sm-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
- .col-sm-9 {
- width: 75%;
+ .col-sm-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
- .col-sm-8 {
- width: 66.66666667%;
+ .col-sm-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
- .col-sm-7 {
- width: 58.33333333%;
+ .col-sm-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-sm-6 {
- width: 50%;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
- .col-sm-5 {
- width: 41.66666667%;
+ .col-sm-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
- .col-sm-4 {
- width: 33.33333333%;
+ .col-sm-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
- .col-sm-3 {
- width: 25%;
+ .col-sm-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
- .col-sm-2 {
- width: 16.66666667%;
+ .col-sm-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
- .col-sm-1 {
- width: 8.33333333%;
+ .col-sm-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
- .col-sm-pull-12 {
- right: 100%;
+ .col-sm-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .col-sm-pull-11 {
- right: 91.66666667%;
+ .pull-sm-0 {
+ right: auto;
}
- .col-sm-pull-10 {
- right: 83.33333333%;
+ .pull-sm-1 {
+ right: 8.333333%;
}
- .col-sm-pull-9 {
- right: 75%;
+ .pull-sm-2 {
+ right: 16.666667%;
+ }
+ .pull-sm-3 {
+ right: 25%;
}
- .col-sm-pull-8 {
- right: 66.66666667%;
+ .pull-sm-4 {
+ right: 33.333333%;
}
- .col-sm-pull-7 {
- right: 58.33333333%;
+ .pull-sm-5 {
+ right: 41.666667%;
}
- .col-sm-pull-6 {
+ .pull-sm-6 {
right: 50%;
}
- .col-sm-pull-5 {
- right: 41.66666667%;
+ .pull-sm-7 {
+ right: 58.333333%;
}
- .col-sm-pull-4 {
- right: 33.33333333%;
+ .pull-sm-8 {
+ right: 66.666667%;
}
- .col-sm-pull-3 {
- right: 25%;
+ .pull-sm-9 {
+ right: 75%;
}
- .col-sm-pull-2 {
- right: 16.66666667%;
+ .pull-sm-10 {
+ right: 83.333333%;
}
- .col-sm-pull-1 {
- right: 8.33333333%;
+ .pull-sm-11 {
+ right: 91.666667%;
}
- .col-sm-pull-0 {
- right: auto;
+ .pull-sm-12 {
+ right: 100%;
}
- .col-sm-push-12 {
- left: 100%;
+ .push-sm-0 {
+ left: auto;
}
- .col-sm-push-11 {
- left: 91.66666667%;
+ .push-sm-1 {
+ left: 8.333333%;
}
- .col-sm-push-10 {
- left: 83.33333333%;
+ .push-sm-2 {
+ left: 16.666667%;
}
- .col-sm-push-9 {
- left: 75%;
+ .push-sm-3 {
+ left: 25%;
}
- .col-sm-push-8 {
- left: 66.66666667%;
+ .push-sm-4 {
+ left: 33.333333%;
}
- .col-sm-push-7 {
- left: 58.33333333%;
+ .push-sm-5 {
+ left: 41.666667%;
}
- .col-sm-push-6 {
+ .push-sm-6 {
left: 50%;
}
- .col-sm-push-5 {
- left: 41.66666667%;
+ .push-sm-7 {
+ left: 58.333333%;
}
- .col-sm-push-4 {
- left: 33.33333333%;
+ .push-sm-8 {
+ left: 66.666667%;
}
- .col-sm-push-3 {
- left: 25%;
+ .push-sm-9 {
+ left: 75%;
}
- .col-sm-push-2 {
- left: 16.66666667%;
+ .push-sm-10 {
+ left: 83.333333%;
}
- .col-sm-push-1 {
- left: 8.33333333%;
+ .push-sm-11 {
+ left: 91.666667%;
}
- .col-sm-push-0 {
- left: auto;
+ .push-sm-12 {
+ left: 100%;
}
- .col-sm-offset-12 {
- margin-left: 100%;
+ .offset-sm-0 {
+ margin-left: 0%;
}
- .col-sm-offset-11 {
- margin-left: 91.66666667%;
+ .offset-sm-1 {
+ margin-left: 8.333333%;
}
- .col-sm-offset-10 {
- margin-left: 83.33333333%;
+ .offset-sm-2 {
+ margin-left: 16.666667%;
}
- .col-sm-offset-9 {
- margin-left: 75%;
+ .offset-sm-3 {
+ margin-left: 25%;
}
- .col-sm-offset-8 {
- margin-left: 66.66666667%;
+ .offset-sm-4 {
+ margin-left: 33.333333%;
}
- .col-sm-offset-7 {
- margin-left: 58.33333333%;
+ .offset-sm-5 {
+ margin-left: 41.666667%;
}
- .col-sm-offset-6 {
+ .offset-sm-6 {
margin-left: 50%;
}
- .col-sm-offset-5 {
- margin-left: 41.66666667%;
+ .offset-sm-7 {
+ margin-left: 58.333333%;
}
- .col-sm-offset-4 {
- margin-left: 33.33333333%;
- }
- .col-sm-offset-3 {
- margin-left: 25%;
+ .offset-sm-8 {
+ margin-left: 66.666667%;
}
- .col-sm-offset-2 {
- margin-left: 16.66666667%;
+ .offset-sm-9 {
+ margin-left: 75%;
}
- .col-sm-offset-1 {
- margin-left: 8.33333333%;
+ .offset-sm-10 {
+ margin-left: 83.333333%;
}
- .col-sm-offset-0 {
- margin-left: 0;
+ .offset-sm-11 {
+ margin-left: 91.666667%;
}
}
-@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;
+
+@media (min-width: 768px) {
+ .col-md {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-md-12 {
- width: 100%;
+ .col-md-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
- .col-md-11 {
- width: 91.66666667%;
+ .col-md-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
- .col-md-10 {
- width: 83.33333333%;
+ .col-md-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
- .col-md-9 {
- width: 75%;
+ .col-md-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
- .col-md-8 {
- width: 66.66666667%;
+ .col-md-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-md-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-md-7 {
- width: 58.33333333%;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
- .col-md-6 {
- width: 50%;
+ .col-md-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
- .col-md-5 {
- width: 41.66666667%;
+ .col-md-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
- .col-md-4 {
- width: 33.33333333%;
+ .col-md-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
- .col-md-3 {
- width: 25%;
+ .col-md-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
- .col-md-2 {
- width: 16.66666667%;
+ .col-md-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .col-md-1 {
- width: 8.33333333%;
+ .pull-md-0 {
+ right: auto;
}
- .col-md-pull-12 {
- right: 100%;
+ .pull-md-1 {
+ right: 8.333333%;
}
- .col-md-pull-11 {
- right: 91.66666667%;
+ .pull-md-2 {
+ right: 16.666667%;
}
- .col-md-pull-10 {
- right: 83.33333333%;
+ .pull-md-3 {
+ right: 25%;
}
- .col-md-pull-9 {
+ .pull-md-4 {
+ right: 33.333333%;
+ }
+ .pull-md-5 {
+ right: 41.666667%;
+ }
+ .pull-md-6 {
+ right: 50%;
+ }
+ .pull-md-7 {
+ right: 58.333333%;
+ }
+ .pull-md-8 {
+ right: 66.666667%;
+ }
+ .pull-md-9 {
right: 75%;
}
- .col-md-pull-8 {
- right: 66.66666667%;
+ .pull-md-10 {
+ right: 83.333333%;
}
- .col-md-pull-7 {
- right: 58.33333333%;
+ .pull-md-11 {
+ right: 91.666667%;
}
- .col-md-pull-6 {
- right: 50%;
+ .pull-md-12 {
+ right: 100%;
}
- .col-md-pull-5 {
- right: 41.66666667%;
+ .push-md-0 {
+ left: auto;
}
- .col-md-pull-4 {
- right: 33.33333333%;
+ .push-md-1 {
+ left: 8.333333%;
}
- .col-md-pull-3 {
- right: 25%;
+ .push-md-2 {
+ left: 16.666667%;
}
- .col-md-pull-2 {
- right: 16.66666667%;
+ .push-md-3 {
+ left: 25%;
}
- .col-md-pull-1 {
- right: 8.33333333%;
+ .push-md-4 {
+ left: 33.333333%;
}
- .col-md-pull-0 {
- right: auto;
+ .push-md-5 {
+ left: 41.666667%;
}
- .col-md-push-12 {
- left: 100%;
+ .push-md-6 {
+ left: 50%;
}
- .col-md-push-11 {
- left: 91.66666667%;
+ .push-md-7 {
+ left: 58.333333%;
}
- .col-md-push-10 {
- left: 83.33333333%;
+ .push-md-8 {
+ left: 66.666667%;
}
- .col-md-push-9 {
+ .push-md-9 {
left: 75%;
}
- .col-md-push-8 {
- left: 66.66666667%;
+ .push-md-10 {
+ left: 83.333333%;
}
- .col-md-push-7 {
- left: 58.33333333%;
+ .push-md-11 {
+ left: 91.666667%;
}
- .col-md-push-6 {
- left: 50%;
+ .push-md-12 {
+ left: 100%;
}
- .col-md-push-5 {
- left: 41.66666667%;
+ .offset-md-0 {
+ margin-left: 0%;
}
- .col-md-push-4 {
- left: 33.33333333%;
+ .offset-md-1 {
+ margin-left: 8.333333%;
}
- .col-md-push-3 {
- left: 25%;
+ .offset-md-2 {
+ margin-left: 16.666667%;
}
- .col-md-push-2 {
- left: 16.66666667%;
+ .offset-md-3 {
+ margin-left: 25%;
}
- .col-md-push-1 {
- left: 8.33333333%;
+ .offset-md-4 {
+ margin-left: 33.333333%;
}
- .col-md-push-0 {
- left: auto;
+ .offset-md-5 {
+ margin-left: 41.666667%;
}
- .col-md-offset-12 {
- margin-left: 100%;
+ .offset-md-6 {
+ margin-left: 50%;
}
- .col-md-offset-11 {
- margin-left: 91.66666667%;
+ .offset-md-7 {
+ margin-left: 58.333333%;
}
- .col-md-offset-10 {
- margin-left: 83.33333333%;
+ .offset-md-8 {
+ margin-left: 66.666667%;
}
- .col-md-offset-9 {
+ .offset-md-9 {
margin-left: 75%;
}
- .col-md-offset-8 {
- margin-left: 66.66666667%;
+ .offset-md-10 {
+ margin-left: 83.333333%;
}
- .col-md-offset-7 {
- margin-left: 58.33333333%;
+ .offset-md-11 {
+ margin-left: 91.666667%;
}
- .col-md-offset-6 {
- margin-left: 50%;
+}
+
+@media (min-width: 992px) {
+ .col-lg {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
}
- .col-md-offset-5 {
- margin-left: 41.66666667%;
+ .col-lg-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
- .col-md-offset-4 {
- margin-left: 33.33333333%;
+ .col-lg-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
- .col-md-offset-3 {
- margin-left: 25%;
+ .col-lg-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
- .col-md-offset-2 {
- margin-left: 16.66666667%;
+ .col-lg-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
- .col-md-offset-1 {
- margin-left: 8.33333333%;
+ .col-lg-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
- .col-md-offset-0 {
- margin-left: 0;
+ .col-lg-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
-}
-@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-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
- .col-lg-12 {
- width: 100%;
+ .col-lg-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
- .col-lg-11 {
- width: 91.66666667%;
+ .col-lg-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-lg-10 {
- width: 83.33333333%;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
- .col-lg-9 {
- width: 75%;
+ .col-lg-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
- .col-lg-8 {
- width: 66.66666667%;
+ .col-lg-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .col-lg-7 {
- width: 58.33333333%;
+ .pull-lg-0 {
+ right: auto;
}
- .col-lg-6 {
- width: 50%;
+ .pull-lg-1 {
+ right: 8.333333%;
}
- .col-lg-5 {
- width: 41.66666667%;
+ .pull-lg-2 {
+ right: 16.666667%;
}
- .col-lg-4 {
- width: 33.33333333%;
+ .pull-lg-3 {
+ right: 25%;
}
- .col-lg-3 {
- width: 25%;
+ .pull-lg-4 {
+ right: 33.333333%;
}
- .col-lg-2 {
- width: 16.66666667%;
+ .pull-lg-5 {
+ right: 41.666667%;
}
- .col-lg-1 {
- width: 8.33333333%;
+ .pull-lg-6 {
+ right: 50%;
+ }
+ .pull-lg-7 {
+ right: 58.333333%;
}
- .col-lg-pull-12 {
+ .pull-lg-8 {
+ right: 66.666667%;
+ }
+ .pull-lg-9 {
+ right: 75%;
+ }
+ .pull-lg-10 {
+ right: 83.333333%;
+ }
+ .pull-lg-11 {
+ right: 91.666667%;
+ }
+ .pull-lg-12 {
right: 100%;
}
- .col-lg-pull-11 {
- right: 91.66666667%;
+ .push-lg-0 {
+ left: auto;
}
- .col-lg-pull-10 {
- right: 83.33333333%;
+ .push-lg-1 {
+ left: 8.333333%;
}
- .col-lg-pull-9 {
- right: 75%;
+ .push-lg-2 {
+ left: 16.666667%;
}
- .col-lg-pull-8 {
- right: 66.66666667%;
+ .push-lg-3 {
+ left: 25%;
}
- .col-lg-pull-7 {
- right: 58.33333333%;
+ .push-lg-4 {
+ left: 33.333333%;
}
- .col-lg-pull-6 {
- right: 50%;
+ .push-lg-5 {
+ left: 41.666667%;
}
- .col-lg-pull-5 {
- right: 41.66666667%;
+ .push-lg-6 {
+ left: 50%;
}
- .col-lg-pull-4 {
- right: 33.33333333%;
+ .push-lg-7 {
+ left: 58.333333%;
}
- .col-lg-pull-3 {
- right: 25%;
+ .push-lg-8 {
+ left: 66.666667%;
}
- .col-lg-pull-2 {
- right: 16.66666667%;
+ .push-lg-9 {
+ left: 75%;
}
- .col-lg-pull-1 {
- right: 8.33333333%;
+ .push-lg-10 {
+ left: 83.333333%;
}
- .col-lg-pull-0 {
- right: auto;
+ .push-lg-11 {
+ left: 91.666667%;
}
- .col-lg-push-12 {
+ .push-lg-12 {
left: 100%;
}
- .col-lg-push-11 {
- left: 91.66666667%;
+ .offset-lg-0 {
+ margin-left: 0%;
}
- .col-lg-push-10 {
- left: 83.33333333%;
+ .offset-lg-1 {
+ margin-left: 8.333333%;
}
- .col-lg-push-9 {
- left: 75%;
+ .offset-lg-2 {
+ margin-left: 16.666667%;
}
- .col-lg-push-8 {
- left: 66.66666667%;
+ .offset-lg-3 {
+ margin-left: 25%;
}
- .col-lg-push-7 {
- left: 58.33333333%;
+ .offset-lg-4 {
+ margin-left: 33.333333%;
}
- .col-lg-push-6 {
- left: 50%;
+ .offset-lg-5 {
+ margin-left: 41.666667%;
}
- .col-lg-push-5 {
- left: 41.66666667%;
+ .offset-lg-6 {
+ margin-left: 50%;
}
- .col-lg-push-4 {
- left: 33.33333333%;
+ .offset-lg-7 {
+ margin-left: 58.333333%;
}
- .col-lg-push-3 {
- left: 25%;
+ .offset-lg-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-lg-9 {
+ margin-left: 75%;
+ }
+ .offset-lg-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-lg-11 {
+ margin-left: 91.666667%;
+ }
+}
+
+@media (min-width: 1200px) {
+ .col-xl {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ width: auto;
+ }
+ .col-xl-1 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
+ }
+ .col-xl-2 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
+ }
+ .col-xl-3 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
+ }
+ .col-xl-4 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
+ }
+ .col-xl-5 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
+ }
+ .col-xl-6 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
+ }
+ .col-xl-7 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
+ }
+ .col-xl-8 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
+ }
+ .col-xl-9 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
+ }
+ .col-xl-10 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
+ }
+ .col-xl-11 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
+ }
+ .col-xl-12 {
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
+ }
+ .pull-xl-0 {
+ right: auto;
+ }
+ .pull-xl-1 {
+ right: 8.333333%;
+ }
+ .pull-xl-2 {
+ right: 16.666667%;
+ }
+ .pull-xl-3 {
+ right: 25%;
}
- .col-lg-push-2 {
- left: 16.66666667%;
+ .pull-xl-4 {
+ right: 33.333333%;
}
- .col-lg-push-1 {
- left: 8.33333333%;
+ .pull-xl-5 {
+ right: 41.666667%;
}
- .col-lg-push-0 {
+ .pull-xl-6 {
+ right: 50%;
+ }
+ .pull-xl-7 {
+ right: 58.333333%;
+ }
+ .pull-xl-8 {
+ right: 66.666667%;
+ }
+ .pull-xl-9 {
+ right: 75%;
+ }
+ .pull-xl-10 {
+ right: 83.333333%;
+ }
+ .pull-xl-11 {
+ right: 91.666667%;
+ }
+ .pull-xl-12 {
+ right: 100%;
+ }
+ .push-xl-0 {
left: auto;
}
- .col-lg-offset-12 {
- margin-left: 100%;
+ .push-xl-1 {
+ left: 8.333333%;
}
- .col-lg-offset-11 {
- margin-left: 91.66666667%;
+ .push-xl-2 {
+ left: 16.666667%;
}
- .col-lg-offset-10 {
- margin-left: 83.33333333%;
+ .push-xl-3 {
+ left: 25%;
}
- .col-lg-offset-9 {
- margin-left: 75%;
+ .push-xl-4 {
+ left: 33.333333%;
}
- .col-lg-offset-8 {
- margin-left: 66.66666667%;
+ .push-xl-5 {
+ left: 41.666667%;
}
- .col-lg-offset-7 {
- margin-left: 58.33333333%;
+ .push-xl-6 {
+ left: 50%;
}
- .col-lg-offset-6 {
- margin-left: 50%;
+ .push-xl-7 {
+ left: 58.333333%;
+ }
+ .push-xl-8 {
+ left: 66.666667%;
+ }
+ .push-xl-9 {
+ left: 75%;
+ }
+ .push-xl-10 {
+ left: 83.333333%;
+ }
+ .push-xl-11 {
+ left: 91.666667%;
+ }
+ .push-xl-12 {
+ left: 100%;
+ }
+ .offset-xl-0 {
+ margin-left: 0%;
}
- .col-lg-offset-5 {
- margin-left: 41.66666667%;
+ .offset-xl-1 {
+ margin-left: 8.333333%;
}
- .col-lg-offset-4 {
- margin-left: 33.33333333%;
+ .offset-xl-2 {
+ margin-left: 16.666667%;
}
- .col-lg-offset-3 {
+ .offset-xl-3 {
margin-left: 25%;
}
- .col-lg-offset-2 {
- margin-left: 16.66666667%;
+ .offset-xl-4 {
+ margin-left: 33.333333%;
}
- .col-lg-offset-1 {
- margin-left: 8.33333333%;
+ .offset-xl-5 {
+ margin-left: 41.666667%;
}
- .col-lg-offset-0 {
- margin-left: 0;
+ .offset-xl-6 {
+ margin-left: 50%;
+ }
+ .offset-xl-7 {
+ margin-left: 58.333333%;
+ }
+ .offset-xl-8 {
+ margin-left: 66.666667%;
+ }
+ .offset-xl-9 {
+ margin-left: 75%;
+ }
+ .offset-xl-10 {
+ margin-left: 83.333333%;
+ }
+ .offset-xl-11 {
+ margin-left: 91.666667%;
}
}
-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;
+ margin-bottom: 1rem;
+ background-color: transparent;
+}
+
+.table th,
+.table td {
+ padding: 0.75rem;
vertical-align: top;
- border-top: 1px solid #ddd;
+ border-top: 1px solid #eceeef;
}
-.table > thead > tr > th {
+
+.table thead 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;
+ border-bottom: 2px solid #eceeef;
}
-.table > tbody + tbody {
- border-top: 2px solid #ddd;
+
+.table tbody + tbody {
+ border-top: 2px solid #eceeef;
}
+
.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-sm th,
+.table-sm td {
+ padding: 0.3rem;
}
+
.table-bordered {
- border: 1px solid #ddd;
+ border: 1px solid #eceeef;
}
-.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 th,
+.table-bordered td {
+ border: 1px solid #eceeef;
}
-.table-bordered > thead > tr > th,
-.table-bordered > thead > tr > td {
+
+.table-bordered thead th,
+.table-bordered thead td {
border-bottom-width: 2px;
}
-.table-striped > tbody > tr:nth-of-type(odd) {
- background-color: #f9f9f9;
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(0, 0, 0, 0.05);
}
-.table-hover > tbody > tr:hover {
- background-color: #f5f5f5;
+
+.table-hover tbody tr:hover {
+ background-color: rgba(0, 0, 0, 0.075);
}
-table col[class*="col-"] {
- position: static;
- display: table-column;
- float: none;
+
+.table-active,
+.table-active > th,
+.table-active > td {
+ background-color: rgba(0, 0, 0, 0.075);
}
-table td[class*="col-"],
-table th[class*="col-"] {
- position: static;
- display: table-cell;
- float: none;
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075);
}
-.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 {
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-success,
+.table-success > th,
+.table-success > td {
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 {
+
+.table-hover .table-success:hover {
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 {
+
+.table-hover .table-success:hover > td,
+.table-hover .table-success:hover > th {
+ background-color: #d0e9c6;
+}
+
+.table-info,
+.table-info > th,
+.table-info > td {
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 {
+
+.table-hover .table-info:hover {
+ background-color: #c4e3f3;
+}
+
+.table-hover .table-info:hover > td,
+.table-hover .table-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 {
+
+.table-warning,
+.table-warning > th,
+.table-warning > td {
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 {
+
+.table-hover .table-warning:hover {
+ background-color: #faf2cc;
+}
+
+.table-hover .table-warning:hover > td,
+.table-hover .table-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 {
+
+.table-danger,
+.table-danger > th,
+.table-danger > td {
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 {
+
+.table-hover .table-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 > 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 {
- 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;
+
+.table-hover .table-danger:hover > td,
+.table-hover .table-danger:hover > th {
+ background-color: #ebcccc;
}
-label {
- display: inline-block;
- max-width: 100%;
- margin-bottom: 5px;
- font-weight: bold;
+
+.thead-inverse th {
+ color: #fff;
+ background-color: #292b2c;
}
-input[type="search"] {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+
+.thead-default th {
+ color: #464a4c;
+ background-color: #eceeef;
}
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- line-height: normal;
+
+.table-inverse {
+ color: #fff;
+ background-color: #292b2c;
}
-input[type="file"] {
- display: block;
+
+.table-inverse th,
+.table-inverse td,
+.table-inverse thead th {
+ border-color: #3b3e40;
}
-input[type="range"] {
- display: block;
- width: 100%;
+
+.table-inverse.table-bordered {
+ border: 0;
}
-select[multiple],
-select[size] {
- height: auto;
+
+.table-inverse.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, 0.05);
}
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+
+.table-inverse.table-hover tbody tr:hover {
+ background-color: rgba(255, 255, 255, 0.075);
}
-output {
- display: block;
- padding-top: 7px;
- font-size: 14px;
- line-height: 1.42857143;
- color: #555;
+
+@media (max-width: 991px) {
+ .table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ }
+ .table-responsive.table-bordered {
+ border: 0;
+ }
}
+
.form-control {
display: block;
width: 100%;
- height: 34px;
- padding: 6px 12px;
- font-size: 14px;
- line-height: 1.42857143;
- color: #555;
+ padding: 0.5rem 1rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ color: #464a4c;
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, -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;
+ -webkit-background-clip: padding-box;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+ -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, -webkit-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;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0;
}
+
.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);
+ color: #464a4c;
+ background-color: #fff;
+ border-color: #5cb3fd;
+ outline: none;
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #636c72;
+ opacity: 1;
}
+
.form-control::-moz-placeholder {
- color: #999;
+ color: #636c72;
opacity: 1;
}
+
.form-control:-ms-input-placeholder {
- color: #999;
-}
-.form-control::-webkit-input-placeholder {
- color: #999;
+ color: #636c72;
+ opacity: 1;
}
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
+
+.form-control::placeholder {
+ color: #636c72;
+ opacity: 1;
}
-.form-control[disabled],
-.form-control[readonly],
-fieldset[disabled] .form-control {
- background-color: #eee;
+
+.form-control:disabled, .form-control[readonly] {
+ background-color: #eceeef;
opacity: 1;
}
-.form-control[disabled],
-fieldset[disabled] .form-control {
+
+.form-control:disabled {
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;
- }
+
+select.form-control:not([size]):not([multiple]) {
+ height: calc(2.25rem + 2px);
}
-.form-group {
- margin-bottom: 15px;
+
+select.form-control:focus::-ms-value {
+ color: #464a4c;
+ background-color: #fff;
}
-.radio,
-.checkbox {
- position: relative;
+
+.form-control-file,
+.form-control-range {
display: block;
- margin-top: 10px;
- margin-bottom: 10px;
}
-.radio label,
-.checkbox label {
- min-height: 20px;
- padding-left: 20px;
+
+.col-form-label {
+ padding-top: calc(0.5rem - 1px * 2);
+ padding-bottom: calc(0.5rem - 1px * 2);
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-top: 4px \9;
- margin-left: -20px;
+
+.col-form-label-lg {
+ padding-top: calc(0.5rem - 1px * 2);
+ padding-bottom: calc(0.5rem - 1px * 2);
+ font-size: 1.25rem;
}
-.radio + .radio,
-.checkbox + .checkbox {
- margin-top: -5px;
+
+.col-form-label-sm {
+ padding-top: calc(0.25rem - 1px * 2);
+ padding-bottom: calc(0.25rem - 1px * 2);
+ font-size: 0.875rem;
}
-.radio-inline,
-.checkbox-inline {
- position: relative;
- display: inline-block;
- padding-left: 20px;
+
+.col-form-legend {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
margin-bottom: 0;
- font-weight: normal;
- vertical-align: middle;
- 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;
+ font-size: 1rem;
}
+
.form-control-static {
- min-height: 34px;
- padding-top: 7px;
- padding-bottom: 7px;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
margin-bottom: 0;
+ line-height: 1.25;
+ border: solid transparent;
+ border-width: 1px 0;
}
-.form-control-static.input-lg,
-.form-control-static.input-sm {
+
+.form-control-static.form-control-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, .form-control-static.form-control-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 {
padding-right: 0;
padding-left: 0;
}
-.input-sm {
- height: 30px;
- padding: 5px 10px;
- font-size: 12px;
+
+.form-control-sm, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.2rem;
}
-select.input-sm {
- height: 30px;
- line-height: 30px;
-}
-textarea.input-sm,
-select[multiple].input-sm {
- height: auto;
+
+select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),
+.input-group-sm > select.input-group-addon:not([size]):not([multiple]),
+.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(1.8125rem + 2px);
}
-.form-group-sm .form-control {
- height: 30px;
- padding: 5px 10px;
- font-size: 12px;
+
+.form-control-lg, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.3rem;
}
-.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;
+
+select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
+.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
+.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
+ height: calc(2.875rem + 2px);
}
-.form-group-sm .form-control-static {
- height: 30px;
- min-height: 32px;
- padding: 6px 10px;
- font-size: 12px;
- line-height: 1.5;
+
+.form-group {
+ margin-bottom: 1rem;
}
-.input-lg {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
+
+.form-text {
+ display: block;
+ margin-top: 0.25rem;
}
-select.input-lg {
- height: 46px;
- line-height: 46px;
+
+.form-check {
+ position: relative;
+ display: block;
+ margin-bottom: 0.5rem;
}
-textarea.input-lg,
-select[multiple].input-lg {
- height: auto;
+
+.form-check.disabled .form-check-label {
+ color: #636c72;
+ cursor: not-allowed;
}
-.form-group-lg .form-control {
- height: 46px;
- padding: 10px 16px;
- font-size: 18px;
- line-height: 1.3333333;
- border-radius: 6px;
+
+.form-check-label {
+ padding-left: 1.25rem;
+ margin-bottom: 0;
}
-.form-group-lg select.form-control {
- height: 46px;
- line-height: 46px;
+
+.form-check-input {
+ position: absolute;
+ margin-top: 0.25rem;
+ margin-left: -1.25rem;
}
-.form-group-lg textarea.form-control,
-.form-group-lg select[multiple].form-control {
- height: auto;
+
+.form-check-input:only-child {
+ position: static;
}
-.form-group-lg .form-control-static {
- height: 46px;
- min-height: 38px;
- padding: 11px 16px;
- font-size: 18px;
- line-height: 1.3333333;
+
+.form-check-inline {
+ display: inline-block;
}
-.has-feedback {
- position: relative;
+
+.form-check-inline .form-check-label {
+ vertical-align: middle;
}
-.has-feedback .form-control {
- padding-right: 42.5px;
+
+.form-check-inline + .form-check-inline {
+ margin-left: 0.75rem;
}
+
.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;
+ margin-top: 0.25rem;
}
-.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;
+
+.form-control-success,
+.form-control-warning,
+.form-control-danger {
+ padding-right: 3rem;
+ background-repeat: no-repeat;
+ background-position: center right 0.5625rem;
+ -webkit-background-size: 1.125rem 1.125rem;
+ background-size: 1.125rem 1.125rem;
}
-.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-feedback,
+.has-success .form-control-label,
+.has-success .col-form-label,
+.has-success .form-check-label,
+.has-success .custom-control {
+ color: #5cb85c;
}
-.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 .form-control,
+.has-success .custom-select,
+.has-success .custom-file-control {
+ border-color: #5cb85c;
}
+
.has-success .input-group-addon {
- color: #3c763d;
- background-color: #dff0d8;
- border-color: #3c763d;
-}
-.has-success .form-control-feedback {
- color: #3c763d;
+ color: #5cb85c;
+ background-color: #eaf6ea;
+ border-color: #5cb85c;
}
-.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-success .form-control-success {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
}
-.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-feedback,
+.has-warning .form-control-label,
+.has-warning .col-form-label,
+.has-warning .form-check-label,
+.has-warning .custom-control {
+ color: #f0ad4e;
}
-.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 .form-control,
+.has-warning .custom-select,
+.has-warning .custom-file-control {
+ border-color: #f0ad4e;
}
+
.has-warning .input-group-addon {
- color: #8a6d3b;
- background-color: #fcf8e3;
- border-color: #8a6d3b;
-}
-.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;
+ color: #f0ad4e;
+ background-color: white;
+ border-color: #f0ad4e;
}
-.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-warning .form-control-warning {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E");
}
-.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-danger .form-control-feedback,
+.has-danger .form-control-label,
+.has-danger .col-form-label,
+.has-danger .form-check-label,
+.has-danger .custom-control {
+ color: #d9534f;
}
-.has-error .input-group-addon {
- color: #a94442;
- background-color: #f2dede;
- border-color: #a94442;
+
+.has-danger .form-control,
+.has-danger .custom-select,
+.has-danger .custom-file-control {
+ border-color: #d9534f;
}
-.has-error .form-control-feedback {
- color: #a94442;
+
+.has-danger .input-group-addon {
+ color: #d9534f;
+ background-color: #fdf7f7;
+ border-color: #d9534f;
}
-.has-feedback label ~ .form-control-feedback {
- top: 25px;
+
+.has-danger .form-control-danger {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
}
-.has-feedback label.sr-only ~ .form-control-feedback {
- top: 0;
+
+.form-inline {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
-.help-block {
- display: block;
- margin-top: 5px;
- margin-bottom: 10px;
- color: #737373;
+
+.form-inline .form-check {
+ width: 100%;
}
-@media (min-width: 768px) {
+
+@media (min-width: 576px) {
+ .form-inline label {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
.form-inline .form-group {
- display: inline-block;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
margin-bottom: 0;
- vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
@@ -2927,596 +2494,587 @@ select[multiple].input-lg {
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 {
+ .form-inline .form-control-label {
margin-bottom: 0;
vertical-align: middle;
}
- .form-inline .radio,
- .form-inline .checkbox {
- display: inline-block;
+ .form-inline .form-check {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ width: auto;
margin-top: 0;
margin-bottom: 0;
- vertical-align: middle;
}
- .form-inline .radio label,
- .form-inline .checkbox label {
+ .form-inline .form-check-label {
padding-left: 0;
}
- .form-inline .radio input[type="radio"],
- .form-inline .checkbox input[type="checkbox"] {
+ .form-inline .form-check-input {
position: relative;
+ margin-top: 0;
+ margin-right: 0.25rem;
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 {
- padding-top: 7px;
- margin-top: 0;
- margin-bottom: 0;
-}
-.form-horizontal .radio,
-.form-horizontal .checkbox {
- 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-inline .custom-control {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ padding-left: 0;
}
-}
-.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;
+ .form-inline .custom-control-indicator {
+ position: static;
+ display: inline-block;
+ margin-right: 0.25rem;
+ vertical-align: text-bottom;
}
-}
-@media (min-width: 768px) {
- .form-horizontal .form-group-sm .control-label {
- padding-top: 6px;
- font-size: 12px;
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
}
}
+
.btn {
display: inline-block;
- padding: 6px 12px;
- margin-bottom: 0;
- font-size: 14px;
font-weight: normal;
- line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
- -ms-touch-action: manipulation;
- touch-action: manipulation;
- cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
- background-image: none;
border: 1px solid transparent;
- border-radius: 4px;
-}
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+ padding: 0.5rem 1rem;
+ font-size: 1rem;
+ line-height: 1.25;
+ border-radius: 0.25rem;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
}
-.btn:hover,
-.btn:focus,
-.btn.focus {
- color: #333;
+
+.btn:focus, .btn:hover {
text-decoration: none;
}
-.btn:active,
-.btn.active {
- background-image: none;
+
+.btn:focus, .btn.focus {
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);
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
}
-.btn.disabled,
-.btn[disabled],
-fieldset[disabled] .btn {
+
+.btn.disabled, .btn:disabled {
cursor: not-allowed;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- box-shadow: none;
opacity: .65;
}
+
+.btn:active, .btn.active {
+ background-image: none;
+}
+
a.btn.disabled,
fieldset[disabled] a.btn {
pointer-events: none;
}
-.btn-default {
- color: #333;
- background-color: #fff;
- border-color: #ccc;
+
+.btn-primary {
+ color: #fff;
+ background-color: #0275d8;
+ border-color: #0275d8;
}
-.btn-default:focus,
-.btn-default.focus {
- color: #333;
- background-color: #e6e6e6;
- border-color: #8c8c8c;
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #025aa5;
+ border-color: #01549b;
}
-.btn-default:hover {
- color: #333;
- background-color: #e6e6e6;
- border-color: #adadad;
+
+.btn-primary:focus, .btn-primary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
}
-.btn-default:active,
-.btn-default.active,
-.open > .dropdown-toggle.btn-default {
- color: #333;
+
+.btn-primary.disabled, .btn-primary:disabled {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.btn-primary:active, .btn-primary.active,
+.show > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #025aa5;
+ background-image: none;
+ border-color: #01549b;
+}
+
+.btn-secondary {
+ color: #292b2c;
+ background-color: #fff;
+ border-color: #ccc;
+}
+
+.btn-secondary:hover {
+ color: #292b2c;
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-secondary:focus, .btn-secondary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
}
-.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-secondary.disabled, .btn-secondary:disabled {
background-color: #fff;
border-color: #ccc;
}
-.btn-default .badge {
- color: #fff;
- background-color: #333;
+
+.btn-secondary:active, .btn-secondary.active,
+.show > .btn-secondary.dropdown-toggle {
+ color: #292b2c;
+ background-color: #e6e6e6;
+ background-image: none;
+ border-color: #adadad;
}
-.btn-primary {
+
+.btn-info {
color: #fff;
- background-color: #337ab7;
- border-color: #2e6da4;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-primary:focus,
-.btn-primary.focus {
+
+.btn-info:hover {
color: #fff;
- background-color: #286090;
- border-color: #122b40;
+ background-color: #31b0d5;
+ border-color: #2aabd2;
}
-.btn-primary:hover {
- color: #fff;
- background-color: #286090;
- border-color: #204d74;
+
+.btn-info:focus, .btn-info.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+ box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
}
-.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-info.disabled, .btn-info:disabled {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-primary:active,
-.btn-primary.active,
-.open > .dropdown-toggle.btn-primary {
+
+.btn-info:active, .btn-info.active,
+.show > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
background-image: none;
+ border-color: #2aabd2;
}
-.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 {
- background-color: #337ab7;
- border-color: #2e6da4;
-}
-.btn-primary .badge {
- color: #337ab7;
- background-color: #fff;
-}
+
.btn-success {
color: #fff;
background-color: #5cb85c;
- border-color: #4cae4c;
+ border-color: #5cb85c;
}
-.btn-success:focus,
-.btn-success.focus {
+
+.btn-success:hover {
color: #fff;
background-color: #449d44;
- border-color: #255625;
+ border-color: #419641;
}
-.btn-success:hover {
+
+.btn-success:focus, .btn-success.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+ box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+}
+
+.btn-success.disabled, .btn-success:disabled {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
+}
+
+.btn-success:active, .btn-success.active,
+.show > .btn-success.dropdown-toggle {
color: #fff;
background-color: #449d44;
- border-color: #398439;
+ background-image: none;
+ border-color: #419641;
}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
+
+.btn-warning {
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 {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-warning:hover {
color: #fff;
- background-color: #398439;
- border-color: #255625;
+ background-color: #ec971f;
+ border-color: #eb9316;
}
-.btn-success:active,
-.btn-success.active,
-.open > .dropdown-toggle.btn-success {
- background-image: none;
+
+.btn-warning:focus, .btn-warning.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
}
-.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 {
- background-color: #5cb85c;
- border-color: #4cae4c;
+
+.btn-warning.disabled, .btn-warning:disabled {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.btn-success .badge {
- color: #5cb85c;
- background-color: #fff;
+
+.btn-warning:active, .btn-warning.active,
+.show > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ background-image: none;
+ border-color: #eb9316;
}
-.btn-info {
+
+.btn-danger {
color: #fff;
- background-color: #5bc0de;
- border-color: #46b8da;
+ background-color: #d9534f;
+ border-color: #d9534f;
}
-.btn-info:focus,
-.btn-info.focus {
+
+.btn-danger:hover {
color: #fff;
- background-color: #31b0d5;
- border-color: #1b6d85;
+ background-color: #c9302c;
+ border-color: #c12e2a;
}
-.btn-info:hover {
+
+.btn-danger:focus, .btn-danger.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+}
+
+.btn-danger.disabled, .btn-danger:disabled {
+ background-color: #d9534f;
+ border-color: #d9534f;
+}
+
+.btn-danger:active, .btn-danger.active,
+.show > .btn-danger.dropdown-toggle {
color: #fff;
- background-color: #31b0d5;
- border-color: #269abc;
+ background-color: #c9302c;
+ background-image: none;
+ border-color: #c12e2a;
+}
+
+.btn-outline-primary {
+ color: #0275d8;
+ background-color: transparent;
+ background-image: none;
+ border-color: #0275d8;
}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
+
+.btn-outline-primary:hover {
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 {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.btn-outline-primary:focus, .btn-outline-primary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+}
+
+.btn-outline-primary.disabled, .btn-outline-primary:disabled {
+ color: #0275d8;
+ background-color: transparent;
+}
+
+.btn-outline-primary:active, .btn-outline-primary.active,
+.show > .btn-outline-primary.dropdown-toggle {
color: #fff;
- background-color: #269abc;
- border-color: #1b6d85;
+ background-color: #0275d8;
+ border-color: #0275d8;
}
-.btn-info:active,
-.btn-info.active,
-.open > .dropdown-toggle.btn-info {
+
+.btn-outline-secondary {
+ color: #ccc;
+ background-color: transparent;
background-image: none;
+ border-color: #ccc;
}
-.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 {
- background-color: #5bc0de;
- border-color: #46b8da;
+
+.btn-outline-secondary:hover {
+ color: #292b2c;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-outline-secondary:focus, .btn-outline-secondary.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+}
+
+.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
+ color: #ccc;
+ background-color: transparent;
}
-.btn-info .badge {
+
+.btn-outline-secondary:active, .btn-outline-secondary.active,
+.show > .btn-outline-secondary.dropdown-toggle {
+ color: #292b2c;
+ background-color: #ccc;
+ border-color: #ccc;
+}
+
+.btn-outline-info {
color: #5bc0de;
- background-color: #fff;
+ background-color: transparent;
+ background-image: none;
+ border-color: #5bc0de;
}
-.btn-warning {
+
+.btn-outline-info:hover {
color: #fff;
- background-color: #f0ad4e;
- border-color: #eea236;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-warning:focus,
-.btn-warning.focus {
- color: #fff;
- background-color: #ec971f;
- border-color: #985f0d;
+
+.btn-outline-info:focus, .btn-outline-info.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+ box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
}
-.btn-warning:hover {
- color: #fff;
- background-color: #ec971f;
- border-color: #d58512;
+
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #5bc0de;
+ background-color: transparent;
}
-.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 {
+
+.btn-outline-info:active, .btn-outline-info.active,
+.show > .btn-outline-info.dropdown-toggle {
color: #fff;
- background-color: #d58512;
- border-color: #985f0d;
+ background-color: #5bc0de;
+ border-color: #5bc0de;
}
-.btn-warning:active,
-.btn-warning.active,
-.open > .dropdown-toggle.btn-warning {
+
+.btn-outline-success {
+ color: #5cb85c;
+ background-color: transparent;
background-image: none;
+ border-color: #5cb85c;
}
-.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 {
- background-color: #f0ad4e;
- border-color: #eea236;
+
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.btn-warning .badge {
- color: #f0ad4e;
- background-color: #fff;
+
+.btn-outline-success:focus, .btn-outline-success.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+ box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
}
-.btn-danger {
- color: #fff;
- background-color: #d9534f;
- border-color: #d43f3a;
+
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #5cb85c;
+ background-color: transparent;
}
-.btn-danger:focus,
-.btn-danger.focus {
+
+.btn-outline-success:active, .btn-outline-success.active,
+.show > .btn-outline-success.dropdown-toggle {
color: #fff;
- background-color: #c9302c;
- border-color: #761c19;
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.btn-danger:hover {
- color: #fff;
- background-color: #c9302c;
- border-color: #ac2925;
+
+.btn-outline-warning {
+ color: #f0ad4e;
+ background-color: transparent;
+ background-image: none;
+ border-color: #f0ad4e;
}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
+
+.btn-outline-warning:hover {
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 {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
+}
+
+.btn-outline-warning:focus, .btn-outline-warning.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+}
+
+.btn-outline-warning.disabled, .btn-outline-warning:disabled {
+ color: #f0ad4e;
+ background-color: transparent;
+}
+
+.btn-outline-warning:active, .btn-outline-warning.active,
+.show > .btn-outline-warning.dropdown-toggle {
color: #fff;
- background-color: #ac2925;
- border-color: #761c19;
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.btn-danger:active,
-.btn-danger.active,
-.open > .dropdown-toggle.btn-danger {
+
+.btn-outline-danger {
+ color: #d9534f;
+ background-color: transparent;
background-image: none;
+ border-color: #d9534f;
}
-.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-outline-danger:hover {
+ color: #fff;
background-color: #d9534f;
- border-color: #d43f3a;
+ border-color: #d9534f;
+}
+
+.btn-outline-danger:focus, .btn-outline-danger.focus {
+ -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
}
-.btn-danger .badge {
+
+.btn-outline-danger.disabled, .btn-outline-danger:disabled {
color: #d9534f;
- background-color: #fff;
+ background-color: transparent;
+}
+
+.btn-outline-danger:active, .btn-outline-danger.active,
+.show > .btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d9534f;
}
+
.btn-link {
font-weight: normal;
- color: #337ab7;
+ color: #0275d8;
border-radius: 0;
}
-.btn-link,
-.btn-link:active,
-.btn-link.active,
-.btn-link[disabled],
-fieldset[disabled] .btn-link {
+
+.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {
background-color: transparent;
- -webkit-box-shadow: none;
- box-shadow: none;
}
-.btn-link,
-.btn-link:hover,
-.btn-link:focus,
-.btn-link:active {
+
+.btn-link, .btn-link:focus, .btn-link:active {
+ border-color: transparent;
+}
+
+.btn-link:hover {
border-color: transparent;
}
-.btn-link:hover,
-.btn-link:focus {
- color: #23527c;
+
+.btn-link:focus, .btn-link:hover {
+ color: #014c8c;
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;
+
+.btn-link:disabled {
+ color: #636c72;
+}
+
+.btn-link:disabled:focus, .btn-link:disabled:hover {
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;
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.3rem;
}
-.btn-xs,
-.btn-group-xs > .btn {
- padding: 1px 5px;
- font-size: 12px;
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
line-height: 1.5;
- border-radius: 3px;
+ border-radius: 0.2rem;
}
+
.btn-block {
display: block;
width: 100%;
}
+
.btn-block + .btn-block {
- margin-top: 5px;
+ margin-top: 0.5rem;
}
+
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;
+ -webkit-transition: opacity 0.15s linear;
+ -o-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
}
-.fade.in {
+
+.fade.show {
opacity: 1;
}
+
.collapse {
display: none;
}
-.collapse.in {
+
+.collapse.show {
display: block;
}
-tr.collapse.in {
+
+tr.collapse.show {
display: table-row;
}
-tbody.collapse.in {
+
+tbody.collapse.show {
display: table-row-group;
}
+
.collapsing {
position: relative;
height: 0;
overflow: hidden;
- -webkit-transition-timing-function: ease;
- -o-transition-timing-function: ease;
- transition-timing-function: ease;
- -webkit-transition-duration: .35s;
- -o-transition-duration: .35s;
- transition-duration: .35s;
- -webkit-transition-property: height, visibility;
- -o-transition-property: height, visibility;
- transition-property: height, visibility;
-}
-.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;
+ -webkit-transition: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
}
+
.dropup,
.dropdown {
position: relative;
}
-.dropdown-toggle:focus {
- outline: 0;
+
+.dropdown-toggle::after {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 0.3em;
+ vertical-align: middle;
+ content: "";
+ border-top: 0.3em solid;
+ border-right: 0.3em solid transparent;
+ border-left: 0.3em solid transparent;
}
+
+.dropup .dropdown-toggle::after {
+ border-top: 0;
+ border-bottom: 0.3em solid;
+}
+
.dropdown-menu {
position: absolute;
top: 100%;
@@ -3524,89 +3082,85 @@ tbody.collapse.in {
z-index: 1000;
display: none;
float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- font-size: 14px;
+ min-width: 10rem;
+ padding: 0.5rem 0;
+ margin: 0.125rem 0 0;
+ font-size: 1rem;
+ color: #292b2c;
text-align: left;
list-style: none;
background-color: #fff;
-webkit-background-clip: padding-box;
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;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.dropdown-menu .divider {
- height: 1px;
- margin: 9px 0;
+
+.dropdown-divider {
+ height: 0;
+ margin: 0.5rem 0;
overflow: hidden;
- background-color: #e5e5e5;
+ border-top: 1px solid #eceeef;
}
-.dropdown-menu > li > a {
+
+.dropdown-item {
display: block;
- padding: 3px 20px;
+ width: 100%;
+ padding: 3px 1.5rem;
clear: both;
font-weight: normal;
- line-height: 1.42857143;
- color: #333;
+ color: #292b2c;
+ text-align: inherit;
white-space: nowrap;
+ background: none;
+ border: 0;
}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
- color: #262626;
+
+.dropdown-item:focus, .dropdown-item:hover {
+ color: #1d1e1f;
text-decoration: none;
- background-color: #f5f5f5;
+ background-color: #f7f7f9;
}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
+
+.dropdown-item.active, .dropdown-item:active {
color: #fff;
text-decoration: none;
- background-color: #337ab7;
- outline: 0;
-}
-.dropdown-menu > .disabled > a,
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- color: #777;
+ background-color: #0275d8;
}
-.dropdown-menu > .disabled > a:hover,
-.dropdown-menu > .disabled > a:focus {
- text-decoration: none;
+
+.dropdown-item.disabled, .dropdown-item:disabled {
+ color: #636c72;
cursor: not-allowed;
background-color: transparent;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
-.open > .dropdown-menu {
+
+.show > .dropdown-menu {
display: block;
}
-.open > a {
+
+.show > 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;
+ padding: 0.5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: 0.875rem;
+ color: #636c72;
white-space: nowrap;
}
+
.dropdown-backdrop {
position: fixed;
top: 0;
@@ -3615,144 +3169,161 @@ tbody.collapse.in {
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 {
+
+.dropup .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;
- }
+ margin-bottom: 0.125rem;
}
+
.btn-group,
.btn-group-vertical {
position: relative;
- display: inline-block;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
vertical-align: middle;
}
+
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
- float: left;
+ -webkit-box-flex: 0;
+ -webkit-flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ margin-bottom: 0;
}
+
.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover,
-.btn-group > .btn:focus,
+.btn-group-vertical > .btn:hover {
+ z-index: 2;
+}
+
+.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
.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 {
+.btn-group .btn-group + .btn-group,
+.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-left: -1px;
}
+
.btn-toolbar {
- margin-left: -5px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
-.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;
+ width: auto;
}
+
.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 + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
}
-.btn .caret {
+
+.btn + .dropdown-toggle-split::after {
margin-left: 0;
}
-.btn-lg .caret {
- border-width: 5px 5px 0;
- border-bottom-width: 0;
+
+.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {
+ padding-right: 0.375rem;
+ padding-left: 0.375rem;
}
-.dropup .btn-lg .caret {
- border-width: 0 5px 5px;
+
+.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {
+ padding-right: 0.75rem;
+ padding-left: 0.75rem;
}
-.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 {
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-align: start;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
}
-.btn-group-vertical > .btn-group > .btn {
- float: none;
+
+.btn-group-vertical .btn,
+.btn-group-vertical .btn-group {
+ width: 100%;
}
+
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
@@ -3760,1091 +3331,1467 @@ tbody.collapse.in {
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="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="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-right: 0;
- padding-left: 0;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ width: 100%;
}
+
.input-group .form-control {
position: relative;
z-index: 2;
- float: left;
- width: 100%;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ width: 1%;
margin-bottom: 0;
}
-.input-group .form-control:focus {
+
+.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {
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;
-}
-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;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
+
.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;
+ padding: 0.5rem 1rem;
+ margin-bottom: 0;
+ font-size: 1rem;
font-weight: normal;
- line-height: 1;
- color: #555;
+ line-height: 1.25;
+ color: #464a4c;
text-align: center;
- background-color: #eee;
- border: 1px solid #ccc;
- border-radius: 4px;
+ background-color: #eceeef;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.input-group-addon.input-sm {
- padding: 5px 10px;
- font-size: 12px;
- border-radius: 3px;
+
+.input-group-addon.form-control-sm,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+ border-radius: 0.2rem;
}
-.input-group-addon.input-lg {
- padding: 10px 16px;
- font-size: 18px;
- border-radius: 6px;
+
+.input-group-addon.form-control-lg,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 0.5rem 1rem;
+ font-size: 1.25rem;
+ border-radius: 0.3rem;
}
+
.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 {
+
+.input-group .form-control:not(:last-child),
+.input-group-addon:not(:last-child),
+.input-group-btn:not(:last-child) > .btn,
+.input-group-btn:not(:last-child) > .btn-group > .btn,
+.input-group-btn:not(:last-child) > .dropdown-toggle,
+.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
-.input-group-addon:first-child {
+
+.input-group-addon:not(:last-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 {
+
+.input-group .form-control:not(:first-child),
+.input-group-addon:not(:first-child),
+.input-group-btn:not(:first-child) > .btn,
+.input-group-btn:not(:first-child) > .btn-group > .btn,
+.input-group-btn:not(:first-child) > .dropdown-toggle,
+.input-group-btn:not(:last-child) > .btn:not(:first-child),
+.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
-.input-group-addon:last-child {
+
+.form-control + .input-group-addon:not(:first-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 > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {
+ z-index: 3;
}
-.input-group-btn:first-child > .btn,
-.input-group-btn:first-child > .btn-group {
+
+.input-group-btn:not(:last-child) > .btn,
+.input-group-btn:not(:last-child) > .btn-group {
margin-right: -1px;
}
-.input-group-btn:last-child > .btn,
-.input-group-btn:last-child > .btn-group {
+
+.input-group-btn:not(:first-child) > .btn,
+.input-group-btn:not(:first-child) > .btn-group {
z-index: 2;
margin-left: -1px;
}
-.nav {
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
+
+.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,
+.input-group-btn:not(:first-child) > .btn-group:focus,
+.input-group-btn:not(:first-child) > .btn-group:active,
+.input-group-btn:not(:first-child) > .btn-group:hover {
+ z-index: 3;
}
-.nav > li {
+
+.custom-control {
position: relative;
- display: block;
+ display: -webkit-inline-box;
+ display: -webkit-inline-flex;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ min-height: 1.5rem;
+ padding-left: 1.5rem;
+ margin-right: 1rem;
}
-.nav > li > a {
- position: relative;
- display: block;
- padding: 10px 15px;
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
}
-.nav > li > a:hover,
-.nav > li > a:focus {
- text-decoration: none;
- background-color: #eee;
+
+.custom-control-input:checked ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #0275d8;
+}
+
+.custom-control-input:focus ~ .custom-control-indicator {
+ -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
}
-.nav > li.disabled > a {
- color: #777;
+
+.custom-control-input:active ~ .custom-control-indicator {
+ color: #fff;
+ background-color: #8fcafe;
}
-.nav > li.disabled > a:hover,
-.nav > li.disabled > a:focus {
- color: #777;
- text-decoration: none;
+
+.custom-control-input:disabled ~ .custom-control-indicator {
cursor: not-allowed;
- background-color: transparent;
-}
-.nav .open > a,
-.nav .open > a:hover,
-.nav .open > a:focus {
- background-color: #eee;
- border-color: #337ab7;
+ background-color: #eceeef;
}
-.nav .nav-divider {
- height: 1px;
- margin: 9px 0;
- overflow: hidden;
- background-color: #e5e5e5;
+
+.custom-control-input:disabled ~ .custom-control-description {
+ color: #636c72;
+ cursor: not-allowed;
}
-.nav > li > a > img {
- max-width: none;
+
+.custom-control-indicator {
+ position: absolute;
+ top: 0.25rem;
+ left: 0;
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: #ddd;
+ background-repeat: no-repeat;
+ background-position: center center;
+ -webkit-background-size: 50% 50%;
+ background-size: 50% 50%;
}
-.nav-tabs {
- border-bottom: 1px solid #ddd;
+
+.custom-checkbox .custom-control-indicator {
+ border-radius: 0.25rem;
}
-.nav-tabs > li {
- float: left;
- margin-bottom: -1px;
+
+.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
}
-.nav-tabs > li > a {
- margin-right: 2px;
- line-height: 1.42857143;
- border: 1px solid transparent;
- border-radius: 4px 4px 0 0;
+
+.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {
+ background-color: #0275d8;
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
}
-.nav-tabs > li > a:hover {
- border-color: #eee #eee #ddd;
+
+.custom-radio .custom-control-indicator {
+ border-radius: 50%;
}
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
- color: #555;
- cursor: default;
- background-color: #fff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
+
+.custom-radio .custom-control-input:checked ~ .custom-control-indicator {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");
}
-.nav-tabs.nav-justified {
- width: 100%;
- border-bottom: 0;
+
+.custom-controls-stacked {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
}
-.nav-tabs.nav-justified > li {
- float: none;
+
+.custom-controls-stacked .custom-control {
+ margin-bottom: 0.25rem;
}
-.nav-tabs.nav-justified > li > a {
- margin-bottom: 5px;
- text-align: center;
+
+.custom-controls-stacked .custom-control + .custom-control {
+ margin-left: 0;
}
-.nav-tabs.nav-justified > .dropdown .dropdown-menu {
- top: auto;
- left: auto;
+
+.custom-select {
+ display: inline-block;
+ max-width: 100%;
+ height: calc(2.25rem + 2px);
+ padding: 0.375rem 1.75rem 0.375rem 0.75rem;
+ line-height: 1.25;
+ color: #464a4c;
+ vertical-align: middle;
+ background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
+ -webkit-background-size: 8px 10px;
+ background-size: 8px 10px;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
}
-@media (min-width: 768px) {
- .nav-tabs.nav-justified > li {
- display: table-cell;
- width: 1%;
- }
- .nav-tabs.nav-justified > li > a {
- margin-bottom: 0;
- }
+
+.custom-select:focus {
+ border-color: #5cb3fd;
+ outline: none;
}
-.nav-tabs.nav-justified > li > a {
- margin-right: 0;
- border-radius: 4px;
+
+.custom-select:focus::-ms-value {
+ color: #464a4c;
+ background-color: #fff;
}
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
- border: 1px solid #ddd;
+
+.custom-select:disabled {
+ color: #636c72;
+ cursor: not-allowed;
+ background-color: #eceeef;
}
-@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;
- }
+
+.custom-select::-ms-expand {
+ opacity: 0;
}
-.nav-pills > li {
- float: left;
+
+.custom-select-sm {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+ font-size: 75%;
}
-.nav-pills > li > a {
- border-radius: 4px;
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ max-width: 100%;
+ height: 2.5rem;
+ margin-bottom: 0;
}
-.nav-pills > li + li {
- margin-left: 2px;
+
+.custom-file-input {
+ min-width: 14rem;
+ max-width: 100%;
+ height: 2.5rem;
+ margin: 0;
+ opacity: 0;
}
-.nav-pills > li.active > a,
-.nav-pills > li.active > a:hover,
-.nav-pills > li.active > a:focus {
- color: #fff;
- background-color: #337ab7;
+
+.custom-file-control {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 5;
+ height: 2.5rem;
+ padding: 0.5rem 1rem;
+ line-height: 1.5;
+ color: #464a4c;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0.25rem;
}
-.nav-stacked > li {
- float: none;
+
+.custom-file-control:lang(en):empty::after {
+ content: "Choose file...";
}
-.nav-stacked > li + li {
- margin-top: 2px;
- margin-left: 0;
+
+.custom-file-control::before {
+ position: absolute;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ z-index: 6;
+ display: block;
+ height: 2.5rem;
+ padding: 0.5rem 1rem;
+ line-height: 1.5;
+ color: #464a4c;
+ background-color: #eceeef;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0 0.25rem 0.25rem 0;
}
-.nav-justified {
- width: 100%;
+
+.custom-file-control:lang(en)::before {
+ content: "Browse";
}
-.nav-justified > li {
- float: none;
+
+.nav {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
}
-.nav-justified > li > a {
- margin-bottom: 5px;
- text-align: center;
+
+.nav-link {
+ display: block;
+ padding: 0.5rem 1rem;
}
-.nav-justified > .dropdown .dropdown-menu {
- top: auto;
- left: auto;
+
+.nav-link:focus, .nav-link:hover {
+ text-decoration: none;
}
-@media (min-width: 768px) {
- .nav-justified > li {
- display: table-cell;
- width: 1%;
- }
- .nav-justified > li > a {
- margin-bottom: 0;
- }
+
+.nav-link.disabled {
+ color: #636c72;
+ cursor: not-allowed;
}
-.nav-tabs-justified {
- border-bottom: 0;
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
}
-.nav-tabs-justified > li > a {
- margin-right: 0;
- border-radius: 4px;
+
+.nav-tabs .nav-item {
+ margin-bottom: -1px;
}
-.nav-tabs-justified > .active > a,
-.nav-tabs-justified > .active > a:hover,
-.nav-tabs-justified > .active > a:focus {
- border: 1px solid #ddd;
+
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
-@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;
- }
+
+.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
+ border-color: #eceeef #eceeef #ddd;
}
-.tab-content > .tab-pane {
- display: none;
+
+.nav-tabs .nav-link.disabled {
+ color: #636c72;
+ background-color: transparent;
+ border-color: transparent;
}
-.tab-content > .active {
- display: block;
+
+.nav-tabs .nav-link.active,
+.nav-tabs .nav-item.show .nav-link {
+ color: #464a4c;
+ background-color: #fff;
+ border-color: #ddd #ddd #fff;
}
+
.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;
- }
+
+.nav-pills .nav-link {
+ border-radius: 0.25rem;
}
-@media (min-width: 768px) {
- .navbar-header {
- float: left;
- }
+
+.nav-pills .nav-link.active,
+.nav-pills .nav-item.show .nav-link {
+ color: #fff;
+ background-color: #0275d8;
}
-.navbar-collapse {
- padding-right: 15px;
- padding-left: 15px;
- overflow-x: visible;
- -webkit-overflow-scrolling: touch;
- 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);
+
+.nav-fill .nav-item {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ text-align: center;
}
-.navbar-collapse.in {
- overflow-y: auto;
+
+.nav-justified .nav-item {
+ -webkit-flex-basis: 0;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ -webkit-flex-grow: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ text-align: center;
}
-@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-top .navbar-collapse,
- .navbar-static-top .navbar-collapse,
- .navbar-fixed-bottom .navbar-collapse {
- padding-right: 0;
- padding-left: 0;
- }
+
+.tab-content > .tab-pane {
+ display: none;
}
-.navbar-fixed-top .navbar-collapse,
-.navbar-fixed-bottom .navbar-collapse {
- max-height: 340px;
+
+.tab-content > .active {
+ display: block;
}
-@media (max-device-width: 480px) and (orientation: landscape) {
- .navbar-fixed-top .navbar-collapse,
- .navbar-fixed-bottom .navbar-collapse {
- max-height: 200px;
- }
+
+.navbar {
+ position: relative;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ padding: 0.5rem 1rem;
}
-.container > .navbar-header,
-.container-fluid > .navbar-header,
-.container > .navbar-collapse,
-.container-fluid > .navbar-collapse {
- margin-right: -15px;
- margin-left: -15px;
+
+.navbar > .container,
+.navbar > .container-fluid {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
}
-@media (min-width: 768px) {
- .container > .navbar-header,
- .container-fluid > .navbar-header,
- .container > .navbar-collapse,
- .container-fluid > .navbar-collapse {
+
+@media (max-width: 575px) {
+ .navbar > .container,
+ .navbar > .container-fluid {
+ width: 100%;
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-brand {
+ display: inline-block;
+ -webkit-align-self: flex-start;
+ -ms-flex-item-align: start;
+ align-self: flex-start;
+ padding-top: 0.3125rem;
+ padding-bottom: 0.3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap;
}
-.navbar-fixed-top {
- top: 0;
- border-width: 0 0 1px;
+
+.navbar-brand:focus, .navbar-brand:hover {
+ text-decoration: none;
}
-.navbar-fixed-bottom {
- bottom: 0;
+
+.navbar-nav {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
margin-bottom: 0;
- border-width: 1px 0 0;
-}
-.navbar-brand {
- float: left;
- height: 50px;
- padding: 15px 15px;
- font-size: 18px;
- line-height: 20px;
+ list-style: none;
}
-.navbar-brand:hover,
-.navbar-brand:focus {
- text-decoration: none;
+
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0;
}
-.navbar-brand > img {
- display: block;
+
+.navbar-text {
+ display: inline-block;
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
}
-@media (min-width: 768px) {
- .navbar > .container .navbar-brand,
- .navbar > .container-fluid .navbar-brand {
- margin-left: -15px;
- }
+
+.navbar-collapse {
+ -webkit-flex-basis: 100%;
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
}
-.navbar-toggle {
- position: relative;
- float: right;
- padding: 9px 10px;
- margin-top: 8px;
- margin-right: 15px;
- margin-bottom: 8px;
- background-color: transparent;
- background-image: none;
+
+.navbar-toggler {
+ -webkit-align-self: flex-start;
+ -ms-flex-item-align: start;
+ align-self: flex-start;
+ padding: 0.25rem 0.75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background: transparent;
border: 1px solid transparent;
- border-radius: 4px;
+ border-radius: 0.25rem;
}
-.navbar-toggle:focus {
- outline: 0;
+
+.navbar-toggler:focus, .navbar-toggler:hover {
+ text-decoration: none;
}
-.navbar-toggle .icon-bar {
- display: block;
- width: 22px;
- height: 2px;
- border-radius: 1px;
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ -webkit-background-size: 100% 100%;
+ background-size: 100% 100%;
}
-.navbar-toggle .icon-bar + .icon-bar {
- margin-top: 4px;
+
+@media (max-width: 575px) {
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
}
-@media (min-width: 768px) {
- .navbar-toggle {
+
+@media (min-width: 576px) {
+ .navbar-expand-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-sm .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-sm > .container,
+ .navbar-expand-sm > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ }
+ .navbar-expand-sm .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-sm .navbar-toggler {
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 {
+ .navbar-expand-md .navbar-nav .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;
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
}
}
+
@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-expand-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-md .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-md > .container,
+ .navbar-expand-md > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ }
+ .navbar-expand-md .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-md .navbar-toggler {
+ display: none;
}
}
-.navbar-form {
- padding: 10px 15px;
- margin-top: 8px;
- margin-right: -15px;
- margin-bottom: 8px;
- 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);
-}
-@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;
+
+@media (max-width: 991px) {
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
}
- .navbar-form .radio label,
- .navbar-form .checkbox label {
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ padding-right: 0;
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 (min-width: 992px) {
+ .navbar-expand-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-lg .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-lg > .container,
+ .navbar-expand-lg > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ }
+ .navbar-expand-lg .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-lg .navbar-toggler {
+ display: none;
}
}
-@media (max-width: 767px) {
- .navbar-form .form-group {
- margin-bottom: 5px;
+
+@media (max-width: 1199px) {
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
}
- .navbar-form .form-group:last-child {
- margin-bottom: 0;
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ padding-right: 0;
+ padding-left: 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;
+
+@media (min-width: 1200px) {
+ .navbar-expand-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ }
+ .navbar-expand-xl .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ }
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ .navbar-expand-xl > .container,
+ .navbar-expand-xl > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ }
+ .navbar-expand-xl .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .navbar-expand-xl .navbar-toggler {
+ display: none;
}
}
-.navbar-nav > li > .dropdown-menu {
- margin-top: 0;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
+
+.navbar-expand {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ -webkit-justify-content: flex-start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
-.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-expand .navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
}
-.navbar-btn {
- margin-top: 8px;
- margin-bottom: 8px;
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
}
-.navbar-btn.btn-sm {
- margin-top: 10px;
- margin-bottom: 10px;
+
+.navbar-expand .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
-.navbar-btn.btn-xs {
- margin-top: 14px;
- margin-bottom: 14px;
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
}
-.navbar-text {
- margin-top: 15px;
- margin-bottom: 15px;
+
+.navbar-expand > .container,
+.navbar-expand > .container-fluid {
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
-@media (min-width: 768px) {
- .navbar-text {
- float: left;
- margin-right: 15px;
- margin-left: 15px;
- }
+
+.navbar-expand .navbar-collapse {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
}
-@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-expand .navbar-toggler {
+ display: none;
}
-.navbar-default {
- background-color: #f8f8f8;
- border-color: #e7e7e7;
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, 0.9);
}
-.navbar-default .navbar-brand {
- color: #777;
+
+.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, 0.9);
}
-.navbar-default .navbar-brand:hover,
-.navbar-default .navbar-brand:focus {
- color: #5e5e5e;
- background-color: transparent;
+
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, 0.5);
}
-.navbar-default .navbar-text {
- color: #777;
+
+.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, 0.7);
}
-.navbar-default .navbar-nav > li > a {
- color: #777;
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, 0.3);
}
-.navbar-default .navbar-nav > li > a:hover,
-.navbar-default .navbar-nav > li > a:focus {
- color: #333;
- background-color: transparent;
+
+.navbar-light .navbar-nav .open > .nav-link,
+.navbar-light .navbar-nav .active > .nav-link,
+.navbar-light .navbar-nav .nav-link.open,
+.navbar-light .navbar-nav .nav-link.active {
+ color: rgba(0, 0, 0, 0.9);
}
-.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-light .navbar-toggler {
+ color: rgba(0, 0, 0, 0.5);
+ border-color: rgba(0, 0, 0, 0.1);
}
-.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-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
}
-.navbar-default .navbar-toggle {
- border-color: #ddd;
+
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, 0.5);
}
-.navbar-default .navbar-toggle:hover,
-.navbar-default .navbar-toggle:focus {
- background-color: #ddd;
+
+.navbar-inverse .navbar-brand {
+ color: white;
}
-.navbar-default .navbar-toggle .icon-bar {
- background-color: #888;
+
+.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {
+ color: white;
}
-.navbar-default .navbar-collapse,
-.navbar-default .navbar-form {
- border-color: #e7e7e7;
+
+.navbar-inverse .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, 0.5);
}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .open > a:hover,
-.navbar-default .navbar-nav > .open > a:focus {
- color: #555;
- background-color: #e7e7e7;
+
+.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, 0.75);
}
-@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-inverse .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, 0.25);
+}
+
+.navbar-inverse .navbar-nav .open > .nav-link,
+.navbar-inverse .navbar-nav .active > .nav-link,
+.navbar-inverse .navbar-nav .nav-link.open,
+.navbar-inverse .navbar-nav .nav-link.active {
+ color: white;
+}
+
+.navbar-inverse .navbar-toggler {
+ color: rgba(255, 255, 255, 0.5);
+ border-color: rgba(255, 255, 255, 0.1);
}
-.navbar-default .navbar-link {
- color: #777;
+
+.navbar-inverse .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
}
-.navbar-default .navbar-link:hover {
- color: #333;
+
+.navbar-inverse .navbar-text {
+ color: rgba(255, 255, 255, 0.5);
}
-.navbar-default .btn-link {
- color: #777;
+
+.card {
+ position: relative;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.125);
+ border-radius: 0.25rem;
}
-.navbar-default .btn-link:hover,
-.navbar-default .btn-link:focus {
- color: #333;
+
+.card-block {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
+ padding: 1.25rem;
}
-.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;
+
+.card-title {
+ margin-bottom: 0.75rem;
}
-.navbar-inverse {
- background-color: #222;
- border-color: #080808;
+
+.card-subtitle {
+ margin-top: -0.375rem;
+ margin-bottom: 0;
}
-.navbar-inverse .navbar-brand {
- color: #9d9d9d;
+
+.card-text:last-child {
+ margin-bottom: 0;
}
-.navbar-inverse .navbar-brand:hover,
-.navbar-inverse .navbar-brand:focus {
- color: #fff;
+
+.card-link:hover {
+ text-decoration: none;
+}
+
+.card-link + .card-link {
+ margin-left: 1.25rem;
+}
+
+.card > .list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+
+.card > .list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.card-header {
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: #f7f7f9;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-header:first-child {
+ border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;
+}
+
+.card-footer {
+ padding: 0.75rem 1.25rem;
+ background-color: #f7f7f9;
+ border-top: 1px solid rgba(0, 0, 0, 0.125);
+}
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);
+}
+
+.card-header-tabs {
+ margin-right: -0.625rem;
+ margin-bottom: -0.75rem;
+ margin-left: -0.625rem;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -0.625rem;
+ margin-left: -0.625rem;
+}
+
+.card-primary {
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.card-primary .card-header,
+.card-primary .card-footer {
background-color: transparent;
}
-.navbar-inverse .navbar-text {
- color: #9d9d9d;
+
+.card-success {
+ background-color: #5cb85c;
+ border-color: #5cb85c;
}
-.navbar-inverse .navbar-nav > li > a {
- color: #9d9d9d;
+
+.card-success .card-header,
+.card-success .card-footer {
+ background-color: transparent;
}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
- color: #fff;
+
+.card-info {
+ background-color: #5bc0de;
+ border-color: #5bc0de;
+}
+
+.card-info .card-header,
+.card-info .card-footer {
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;
+
+.card-warning {
+ background-color: #f0ad4e;
+ border-color: #f0ad4e;
}
-.navbar-inverse .navbar-nav > .disabled > a,
-.navbar-inverse .navbar-nav > .disabled > a:hover,
-.navbar-inverse .navbar-nav > .disabled > a:focus {
- color: #444;
+
+.card-warning .card-header,
+.card-warning .card-footer {
background-color: transparent;
}
-.navbar-inverse .navbar-toggle {
- border-color: #333;
+
+.card-danger {
+ background-color: #d9534f;
+ border-color: #d9534f;
}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
- background-color: #333;
+
+.card-danger .card-header,
+.card-danger .card-footer {
+ background-color: transparent;
}
-.navbar-inverse .navbar-toggle .icon-bar {
- background-color: #fff;
+
+.card-outline-primary {
+ background-color: transparent;
+ border-color: #0275d8;
}
-.navbar-inverse .navbar-collapse,
-.navbar-inverse .navbar-form {
- border-color: #101010;
+
+.card-outline-secondary {
+ background-color: transparent;
+ border-color: #ccc;
}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
+
+.card-outline-info {
+ background-color: transparent;
+ border-color: #5bc0de;
+}
+
+.card-outline-success {
+ background-color: transparent;
+ border-color: #5cb85c;
+}
+
+.card-outline-warning {
+ background-color: transparent;
+ border-color: #f0ad4e;
+}
+
+.card-outline-danger {
+ background-color: transparent;
+ border-color: #d9534f;
+}
+
+.card-inverse {
+ color: rgba(255, 255, 255, 0.65);
+}
+
+.card-inverse .card-header,
+.card-inverse .card-footer {
+ background-color: transparent;
+ border-color: rgba(255, 255, 255, 0.2);
+}
+
+.card-inverse .card-header,
+.card-inverse .card-footer,
+.card-inverse .card-title,
+.card-inverse .card-blockquote {
color: #fff;
- background-color: #080808;
}
-@media (max-width: 767px) {
- .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
- border-color: #080808;
+
+.card-inverse .card-link,
+.card-inverse .card-text,
+.card-inverse .card-subtitle,
+.card-inverse .card-blockquote .blockquote-footer {
+ color: rgba(255, 255, 255, 0.65);
+}
+
+.card-inverse .card-link:focus, .card-inverse .card-link:hover {
+ color: #fff;
+}
+
+.card-blockquote {
+ padding: 0;
+ margin-bottom: 0;
+ border-left: 0;
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem;
+}
+
+.card-img {
+ width: 100%;
+ border-radius: calc(0.25rem - 1px);
+}
+
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(0.25rem - 1px);
+ border-top-right-radius: calc(0.25rem - 1px);
+}
+
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(0.25rem - 1px);
+ border-bottom-left-radius: calc(0.25rem - 1px);
+}
+
+@media (min-width: 576px) {
+ .card-deck {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
- background-color: #080808;
+ .card-deck .card {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 0;
+ -ms-flex: 1 0 0px;
+ flex: 1 0 0%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-left: 15px;
}
- .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
- color: #9d9d9d;
+}
+
+@media (min-width: 576px) {
+ .card-group {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -webkit-flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ }
+ .card-group .card {
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 0;
+ -ms-flex: 1 0 0px;
+ flex: 1 0 0%;
+ }
+ .card-group .card + .card {
+ margin-left: 0;
+ border-left: 0;
}
- .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;
+ .card-group .card:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
}
- .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;
+ .card-group .card:first-child .card-img-top {
+ border-top-right-radius: 0;
}
- .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;
+ .card-group .card:first-child .card-img-bottom {
+ border-bottom-right-radius: 0;
+ }
+ .card-group .card:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ }
+ .card-group .card:last-child .card-img-top {
+ border-top-left-radius: 0;
+ }
+ .card-group .card:last-child .card-img-bottom {
+ border-bottom-left-radius: 0;
+ }
+ .card-group .card:not(:first-child):not(:last-child) {
+ border-radius: 0;
+ }
+ .card-group .card:not(:first-child):not(:last-child) .card-img-top,
+ .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {
+ border-radius: 0;
}
}
-.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;
+
+@media (min-width: 576px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ }
+ .card-columns .card {
+ display: inline-block;
+ width: 100%;
+ margin-bottom: 0.75rem;
+ }
}
+
.breadcrumb {
- padding: 8px 15px;
- margin-bottom: 20px;
+ padding: 0.75rem 1rem;
+ margin-bottom: 1rem;
list-style: none;
- background-color: #f5f5f5;
- border-radius: 4px;
+ background-color: #eceeef;
+ border-radius: 0.25rem;
}
-.breadcrumb > li {
+
+.breadcrumb::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.breadcrumb-item {
+ float: left;
+}
+
+.breadcrumb-item + .breadcrumb-item::before {
display: inline-block;
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+ color: #636c72;
+ content: "/";
}
-.breadcrumb > li + li:before {
- padding: 0 5px;
- color: #ccc;
- content: "/\00a0";
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: underline;
}
-.breadcrumb > .active {
- color: #777;
+
+.breadcrumb-item + .breadcrumb-item:hover::before {
+ text-decoration: none;
+}
+
+.breadcrumb-item.active {
+ color: #636c72;
}
+
.pagination {
- display: inline-block;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
padding-left: 0;
- margin: 20px 0;
- border-radius: 4px;
+ list-style: none;
+ border-radius: 0.25rem;
}
-.pagination > li {
- display: inline;
+
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
}
-.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;
+
+.page-item:last-child .page-link {
+ border-top-right-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem;
}
-.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 > li > a:hover,
-.pagination > li > span:hover,
-.pagination > li > a:focus,
-.pagination > li > span:focus {
+
+.page-item.active .page-link {
z-index: 2;
- 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: 3;
color: #fff;
- cursor: default;
- background-color: #337ab7;
- border-color: #337ab7;
-}
-.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: #0275d8;
+ border-color: #0275d8;
+}
+
+.page-item.disabled .page-link {
+ color: #636c72;
+ pointer-events: none;
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;
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: 0.5rem 0.75rem;
+ margin-left: -1px;
+ line-height: 1.25;
+ color: #0275d8;
background-color: #fff;
border: 1px solid #ddd;
- border-radius: 15px;
}
-.pager li > a:hover,
-.pager li > a:focus {
+
+.page-link:focus, .page-link:hover {
+ color: #014c8c;
text-decoration: none;
- background-color: #eee;
+ background-color: #eceeef;
+ border-color: #ddd;
}
-.pager .next > a,
-.pager .next > span {
- float: right;
+
+.pagination-lg .page-link {
+ padding: 0.75rem 1.5rem;
+ font-size: 1.25rem;
}
-.pager .previous > a,
-.pager .previous > span {
- float: left;
+
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 0.3rem;
+ border-bottom-left-radius: 0.3rem;
}
-.pager .disabled > a,
-.pager .disabled > a:hover,
-.pager .disabled > a:focus,
-.pager .disabled > span {
- color: #777;
- cursor: not-allowed;
- background-color: #fff;
+
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 0.3rem;
+ border-bottom-right-radius: 0.3rem;
+}
+
+.pagination-sm .page-link {
+ padding: 0.25rem 0.5rem;
+ font-size: 0.875rem;
+}
+
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: 0.2rem;
+ border-bottom-left-radius: 0.2rem;
+}
+
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: 0.2rem;
+ border-bottom-right-radius: 0.2rem;
}
-.label {
- display: inline;
- padding: .2em .6em .3em;
+
+.badge {
+ display: inline-block;
+ padding: 0.25em 0.4em;
font-size: 75%;
font-weight: bold;
line-height: 1;
@@ -4852,951 +4799,449 @@ fieldset[disabled] .navbar-inverse .btn-link:focus {
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;
+ border-radius: 0.25rem;
}
-.label:empty {
+
+.badge:empty {
display: none;
}
-.btn .label {
+
+.btn .badge {
position: relative;
top: -1px;
}
-.label-default {
- background-color: #777;
+
+a.badge:focus, a.badge:hover {
+ color: #fff;
+ text-decoration: none;
+}
+
+.badge-pill {
+ padding-right: 0.6em;
+ padding-left: 0.6em;
+ border-radius: 10rem;
+}
+
+.badge-default {
+ background-color: #636c72;
}
-.label-default[href]:hover,
-.label-default[href]:focus {
- background-color: #5e5e5e;
+
+.badge-default[href]:focus, .badge-default[href]:hover {
+ background-color: #4b5257;
}
-.label-primary {
- background-color: #337ab7;
+
+.badge-primary {
+ background-color: #0275d8;
}
-.label-primary[href]:hover,
-.label-primary[href]:focus {
- background-color: #286090;
+
+.badge-primary[href]:focus, .badge-primary[href]:hover {
+ background-color: #025aa5;
}
-.label-success {
+
+.badge-success {
background-color: #5cb85c;
}
-.label-success[href]:hover,
-.label-success[href]:focus {
+
+.badge-success[href]:focus, .badge-success[href]:hover {
background-color: #449d44;
}
-.label-info {
+
+.badge-info {
background-color: #5bc0de;
}
-.label-info[href]:hover,
-.label-info[href]:focus {
+
+.badge-info[href]:focus, .badge-info[href]:hover {
background-color: #31b0d5;
}
-.label-warning {
+
+.badge-warning {
background-color: #f0ad4e;
}
-.label-warning[href]:hover,
-.label-warning[href]:focus {
+
+.badge-warning[href]:focus, .badge-warning[href]:hover {
background-color: #ec971f;
}
-.label-danger {
+
+.badge-danger {
background-color: #d9534f;
}
-.label-danger[href]:hover,
-.label-danger[href]:focus {
+
+.badge-danger[href]:focus, .badge-danger[href]:hover {
background-color: #c9302c;
}
-.badge {
- display: inline-block;
- min-width: 10px;
- padding: 3px 7px;
- font-size: 12px;
- font-weight: bold;
- 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-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 {
- padding-right: 15px;
- padding-left: 15px;
- border-radius: 6px;
-}
-.jumbotron .container {
- max-width: 100%;
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #eceeef;
+ border-radius: 0.3rem;
}
-@media screen and (min-width: 768px) {
+
+@media (min-width: 576px) {
.jumbotron {
- padding-top: 48px;
- padding-bottom: 48px;
- }
- .container .jumbotron,
- .container-fluid .jumbotron {
- padding-right: 60px;
- padding-left: 60px;
+ padding: 4rem 2rem;
}
- .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-right: auto;
- margin-left: auto;
}
-a.thumbnail:hover,
-a.thumbnail:focus,
-a.thumbnail.active {
- border-color: #337ab7;
+
+.jumbotron-hr {
+ border-top-color: #d0d5d8;
}
-.thumbnail .caption {
- padding: 9px;
- color: #333;
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0;
}
+
.alert {
- padding: 15px;
- margin-bottom: 20px;
+ padding: 0.75rem 1.25rem;
+ margin-bottom: 1rem;
border: 1px solid transparent;
- border-radius: 4px;
+ border-radius: 0.25rem;
}
-.alert h4 {
- margin-top: 0;
+
+.alert-heading {
color: inherit;
}
-.alert .alert-link {
+
+.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;
+ top: -0.75rem;
+ right: -1.25rem;
+ padding: 0.75rem 1.25rem;
color: inherit;
}
+
.alert-success {
color: #3c763d;
background-color: #dff0d8;
- border-color: #d6e9c6;
+ border-color: #d0e9c6;
}
+
.alert-success hr {
- border-top-color: #c9e2b3;
+ border-top-color: #c1e2b3;
}
+
.alert-success .alert-link {
color: #2b542c;
}
+
.alert-info {
color: #31708f;
background-color: #d9edf7;
- border-color: #bce8f1;
+ border-color: #bcdff1;
}
+
.alert-info hr {
- border-top-color: #a6e1ec;
+ border-top-color: #a6d5ec;
}
+
.alert-info .alert-link {
color: #245269;
}
+
.alert-warning {
color: #8a6d3b;
background-color: #fcf8e3;
- border-color: #faebcc;
+ border-color: #faf2cc;
}
+
.alert-warning hr {
- border-top-color: #f7e1b5;
+ border-top-color: #f7ecb5;
}
+
.alert-warning .alert-link {
color: #66512c;
}
+
.alert-danger {
color: #a94442;
background-color: #f2dede;
- border-color: #ebccd1;
+ border-color: #ebcccc;
}
+
.alert-danger hr {
- border-top-color: #e4b9c0;
+ border-top-color: #e4b9b9;
}
+
.alert-danger .alert-link {
color: #843534;
}
+
@-webkit-keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
@-o-keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
@keyframes progress-bar-stripes {
from {
- background-position: 40px 0;
+ background-position: 1rem 0;
}
to {
background-position: 0 0;
}
}
+
.progress {
- height: 20px;
- margin-bottom: 20px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
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);
+ font-size: 0.75rem;
+ line-height: 1rem;
+ text-align: center;
+ background-color: #eceeef;
+ border-radius: 0.25rem;
}
+
.progress-bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- line-height: 20px;
+ height: 1rem;
+ line-height: 1rem;
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-striped .progress-bar,
-.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);
- -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, .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);
+ background-color: #0275d8;
}
-.progress-bar-danger {
- background-color: #d9534f;
+
+.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: 1rem 1rem;
+ background-size: 1rem 1rem;
}
-.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);
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ -o-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite;
}
+
.media {
- margin-top: 15px;
-}
-.media:first-child {
- margin-top: 0;
-}
-.media,
-.media-body {
- overflow: hidden;
- zoom: 1;
-}
-.media-body {
- width: 10000px;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: start;
+ -webkit-align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
}
-.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;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1;
+ -ms-flex: 1;
+ flex: 1 1 0%;
}
-.media-bottom {
- vertical-align: bottom;
+
+.list-group {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
}
-.media-heading {
- margin-top: 0;
- margin-bottom: 5px;
+
+.list-group-item-action {
+ width: 100%;
+ color: #464a4c;
+ text-align: inherit;
}
-.media-list {
- padding-left: 0;
- list-style: none;
+
+.list-group-item-action:focus, .list-group-item-action:hover {
+ color: #464a4c;
+ text-decoration: none;
+ background-color: #f7f7f9;
}
-.list-group {
- padding-left: 0;
- margin-bottom: 20px;
+
+.list-group-item-action:active {
+ color: #292b2c;
+ background-color: #eceeef;
}
+
.list-group-item {
position: relative;
display: block;
- padding: 10px 15px;
+ padding: 0.75rem 1.25rem;
margin-bottom: -1px;
background-color: #fff;
- border: 1px solid #ddd;
+ border: 1px solid rgba(0, 0, 0, 0.125);
}
+
.list-group-item:first-child {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
}
+
.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 {
- color: #555;
- text-decoration: none;
- background-color: #f5f5f5;
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
}
-button.list-group-item {
- width: 100%;
- text-align: left;
+
+.list-group-item:focus, .list-group-item:hover {
+ text-decoration: none;
}
-.list-group-item.disabled,
-.list-group-item.disabled:hover,
-.list-group-item.disabled:focus {
- color: #777;
+
+.list-group-item.disabled, .list-group-item:disabled {
+ color: #636c72;
cursor: not-allowed;
- background-color: #eee;
-}
-.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;
+ background-color: #fff;
}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
+
+.list-group-item.active {
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;
+ background-color: #0275d8;
+ border-color: #0275d8;
+}
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0;
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0;
}
-.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-flush:last-child .list-group-item:last-child {
+ border-bottom: 0;
}
+
.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 {
+
+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,
-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 {
+button.list-group-item-success.active {
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 {
+
+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,
-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 {
+button.list-group-item-info.active {
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 {
+
+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,
-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 {
+button.list-group-item-warning.active {
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 {
+
+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,
-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 {
+button.list-group-item-danger.active {
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 > 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-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 > .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-right: 15px;
- padding-left: 15px;
-}
-.panel > .table:first-child,
-.panel > .table-responsive:first-child > .table:first-child {
- border-top-left-radius: 3px;
- border-top-right-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-right-radius: 3px;
- border-bottom-left-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 {
- 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 > .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;
+ width: 100%;
padding: 0;
overflow: hidden;
}
+
+.embed-responsive::before {
+ display: block;
+ content: "";
+}
+
.embed-responsive .embed-responsive-item,
.embed-responsive iframe,
.embed-responsive embed,
@@ -5810,62 +5255,50 @@ button.list-group-item-danger.active:focus {
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);
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%;
}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, .15);
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
}
-.well-lg {
- padding: 24px;
- border-radius: 6px;
+
+.embed-responsive-4by3::before {
+ padding-top: 75%;
}
-.well-sm {
- padding: 9px;
- border-radius: 3px;
+
+.embed-responsive-1by1::before {
+ padding-top: 100%;
}
+
.close {
float: right;
- font-size: 21px;
+ font-size: 1.5rem;
font-weight: bold;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
- filter: alpha(opacity=20);
- opacity: .2;
+ opacity: .5;
}
-.close:hover,
-.close:focus {
+
+.close:focus, .close:hover {
color: #000;
text-decoration: none;
- cursor: pointer;
- filter: alpha(opacity=50);
- opacity: .5;
+ opacity: .75;
}
+
button.close {
- -webkit-appearance: none;
padding: 0;
- cursor: pointer;
background: transparent;
border: 0;
+ -webkit-appearance: none;
}
+
.modal-open {
overflow: hidden;
}
+
.modal {
position: fixed;
top: 0;
@@ -5875,45 +5308,56 @@ button.close {
z-index: 1050;
display: none;
overflow: hidden;
- -webkit-overflow-scrolling: touch;
outline: 0;
}
+
.modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform .3s ease-out;
- -o-transition: -o-transform .3s ease-out;
- transition: transform .3s ease-out;
+ -webkit-transition: -webkit-transform 0.3s ease-out;
+ transition: -webkit-transform 0.3s ease-out;
+ -o-transition: -o-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;
-webkit-transform: translate(0, -25%);
- -ms-transform: translate(0, -25%);
-o-transform: translate(0, -25%);
transform: translate(0, -25%);
}
-.modal.in .modal-dialog {
+
+.modal.show .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;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -webkit-flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, .2);
- border-radius: 6px;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
outline: 0;
- -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
- box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
+
.modal-backdrop {
position: fixed;
top: 0;
@@ -5923,44 +5367,71 @@ button.close {
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-backdrop.show {
+ opacity: 0.5;
}
+
.modal-header {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
padding: 15px;
- border-bottom: 1px solid #e5e5e5;
-}
-.modal-header .close {
- margin-top: -2px;
+ border-bottom: 1px solid #eceeef;
}
+
.modal-title {
- margin: 0;
- line-height: 1.42857143;
+ margin-bottom: 0;
+ line-height: 1.5;
}
+
.modal-body {
position: relative;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
padding: 15px;
}
+
.modal-footer {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: end;
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
padding: 15px;
- text-align: right;
- border-top: 1px solid #e5e5e5;
-}
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
+ border-top: 1px solid #eceeef;
}
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
+
+.modal-footer > :not(:first-child) {
+ margin-left: .25rem;
}
-.modal-footer .btn-block + .btn-block {
- margin-left: 0;
+
+.modal-footer > :not(:last-child) {
+ margin-right: .25rem;
}
+
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
@@ -5968,33 +5439,31 @@ button.close {
height: 50px;
overflow: scroll;
}
-@media (min-width: 768px) {
+
+@media (min-width: 576px) {
.modal-dialog {
- width: 600px;
+ max-width: 500px;
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;
+ max-width: 300px;
}
}
+
@media (min-width: 992px) {
.modal-lg {
- width: 900px;
+ max-width: 800px;
}
}
+
.tooltip {
position: absolute;
z-index: 1070;
display: block;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 12px;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-style: normal;
font-weight: normal;
- line-height: 1.42857143;
+ line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
@@ -6003,117 +5472,102 @@ button.close {
letter-spacing: normal;
word-break: normal;
word-spacing: normal;
- word-wrap: normal;
white-space: normal;
- filter: alpha(opacity=0);
- opacity: 0;
-
line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
+ opacity: 0;
}
-.tooltip.in {
- filter: alpha(opacity=90);
- opacity: .9;
+
+.tooltip.show {
+ opacity: 0.9;
}
-.tooltip.top {
+
+.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {
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-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 {
+
+.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {
bottom: 0;
left: 50%;
margin-left: -5px;
+ content: "";
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.tooltip-right, .tooltip.bs-tether-element-attached-left {
+ padding: 0 5px;
+ margin-left: 3px;
}
-.tooltip.right .tooltip-arrow {
+
+.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {
top: 50%;
left: 0;
margin-top: -5px;
+ content: "";
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.tooltip-bottom, .tooltip.bs-tether-element-attached-top {
+ padding: 5px 0;
+ margin-top: 3px;
}
-.tooltip.bottom .tooltip-arrow {
+
+.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {
top: 0;
left: 50%;
margin-left: -5px;
+ content: "";
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.tooltip-left, .tooltip.bs-tether-element-attached-right {
+ padding: 0 5px;
+ margin-left: -3px;
}
-.tooltip.bottom-right .tooltip-arrow {
- top: 0;
- left: 5px;
+
+.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {
+ top: 50%;
+ right: 0;
margin-top: -5px;
- border-width: 0 5px 5px;
- border-bottom-color: #000;
+ content: "";
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 3px 8px;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: 0.25rem;
+}
+
+.tooltip-inner::before {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
}
+
.popover {
position: absolute;
top: 0;
left: 0;
z-index: 1060;
- display: none;
+ display: block;
max-width: 276px;
padding: 1px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
+ font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-style: normal;
font-weight: normal;
- line-height: 1.42857143;
+ line-height: 1.5;
text-align: left;
text-align: start;
text-decoration: none;
@@ -6122,44 +5576,134 @@ button.close {
letter-spacing: normal;
word-break: normal;
word-spacing: normal;
- word-wrap: normal;
white-space: normal;
+ line-break: auto;
+ font-size: 0.875rem;
+ word-wrap: break-word;
background-color: #fff;
-webkit-background-clip: padding-box;
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);
-
- line-break: auto;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 0.3rem;
}
-.popover.top {
+
+.popover.popover-top, .popover.bs-tether-element-attached-bottom {
margin-top: -10px;
}
-.popover.right {
+
+.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {
+ left: 50%;
+ border-bottom-width: 0;
+}
+
+.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {
+ bottom: -11px;
+ margin-left: -11px;
+ border-top-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {
+ bottom: -10px;
+ margin-left: -10px;
+ border-top-color: #fff;
+}
+
+.popover.popover-right, .popover.bs-tether-element-attached-left {
margin-left: 10px;
}
-.popover.bottom {
+
+.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {
+ top: 50%;
+ border-left-width: 0;
+}
+
+.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {
+ left: -10px;
+ margin-top: -10px;
+ border-right-color: #fff;
+}
+
+.popover.popover-bottom, .popover.bs-tether-element-attached-top {
margin-top: 10px;
}
-.popover.left {
+
+.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {
+ left: 50%;
+ border-top-width: 0;
+}
+
+.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {
+ top: -11px;
+ margin-left: -11px;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {
+ top: -10px;
margin-left: -10px;
+ border-bottom-color: #f7f7f7;
}
+
+.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 20px;
+ margin-left: -10px;
+ content: "";
+ border-bottom: 1px solid #f7f7f7;
+}
+
+.popover.popover-left, .popover.bs-tether-element-attached-right {
+ margin-left: -10px;
+}
+
+.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {
+ top: 50%;
+ border-right-width: 0;
+}
+
+.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {
+ right: -11px;
+ margin-top: -11px;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+
+.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {
+ right: -10px;
+ margin-top: -10px;
+ border-left-color: #fff;
+}
+
.popover-title {
padding: 8px 14px;
- margin: 0;
- font-size: 14px;
+ margin-bottom: 0;
+ font-size: 1rem;
+ color: inherit;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
- border-radius: 5px 5px 0 0;
+ border-top-left-radius: calc(0.3rem - 1px);
+ border-top-right-radius: calc(0.3rem - 1px);
}
+
+.popover-title:empty {
+ display: none;
+}
+
.popover-content {
padding: 9px 14px;
+ color: #292b2c;
}
-.popover > .arrow,
-.popover > .arrow:after {
+
+.popover::before,
+.popover::after {
position: absolute;
display: block;
width: 0;
@@ -6167,255 +5711,228 @@ button.close {
border-color: transparent;
border-style: solid;
}
-.popover > .arrow {
+
+.popover::before {
+ content: "";
border-width: 11px;
}
-.popover > .arrow:after {
+
+.popover::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;
-}
+
.carousel {
position: relative;
}
+
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
-.carousel-inner > .item {
+
+.carousel-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;
+ width: 100%;
}
-.carousel-inner > .item > img,
-.carousel-inner > .item > a > img {
- line-height: 1;
+
+@media (-webkit-transform-3d) {
+ .carousel-item {
+ -webkit-transition: -webkit-transform 0.6s ease-in-out;
+ transition: -webkit-transform 0.6s ease-in-out;
+ -o-transition: -o-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-transform 0.6s ease-in-out;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-perspective: 1000px;
+ perspective: 1000px;
+ }
}
-@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: transform .6s ease-in-out;
+@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) {
+ .carousel-item {
+ -webkit-transition: -webkit-transform 0.6s ease-in-out;
+ transition: -webkit-transform 0.6s ease-in-out;
+ -o-transition: -o-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out, -o-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 {
- left: 0;
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+}
+
+.carousel-item-next,
+.carousel-item-prev {
+ position: absolute;
+ top: 0;
+}
+
+@media (-webkit-transform-3d) {
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+ .carousel-item-next,
+ .active.carousel-item-right {
-webkit-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0);
}
- .carousel-inner > .item.prev,
- .carousel-inner > .item.active.left {
- left: 0;
+ .carousel-item-prev,
+ .active.carousel-item-left {
-webkit-transform: translate3d(-100%, 0, 0);
transform: translate3d(-100%, 0, 0);
}
- .carousel-inner > .item.next.left,
- .carousel-inner > .item.prev.right,
- .carousel-inner > .item.active {
- left: 0;
+}
+
+@supports ((-webkit-transform: translate3d(0, 0, 0)) or (transform: translate3d(0, 0, 0))) {
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
+ .carousel-item-next,
+ .active.carousel-item-right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+ .carousel-item-prev,
+ .active.carousel-item-left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 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 {
+
+.carousel-control-prev,
+.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
- left: 0;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
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;
+ opacity: 0.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:hover,
-.carousel-control:focus {
+
+.carousel-control-prev:focus, .carousel-control-prev:hover,
+.carousel-control-next:focus,
+.carousel-control-next:hover {
color: #fff;
text-decoration: none;
- filter: alpha(opacity=90);
outline: 0;
opacity: .9;
}
-.carousel-control .icon-prev,
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-left,
-.carousel-control .glyphicon-chevron-right {
- position: absolute;
- top: 50%;
- z-index: 5;
- display: inline-block;
- margin-top: -10px;
-}
-.carousel-control .icon-prev,
-.carousel-control .glyphicon-chevron-left {
- left: 50%;
- margin-left: -10px;
+
+.carousel-control-prev {
+ left: 0;
}
-.carousel-control .icon-next,
-.carousel-control .glyphicon-chevron-right {
- right: 50%;
- margin-right: -10px;
+
+.carousel-control-next {
+ right: 0;
}
-.carousel-control .icon-prev,
-.carousel-control .icon-next {
+
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
width: 20px;
height: 20px;
- font-family: serif;
- line-height: 1;
+ background: transparent no-repeat center center;
+ -webkit-background-size: 100% 100%;
+ background-size: 100% 100%;
}
-.carousel-control .icon-prev:before {
- content: '\2039';
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E");
}
-.carousel-control .icon-next:before {
- content: '\203a';
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E");
}
+
.carousel-indicators {
position: absolute;
+ right: 0;
bottom: 10px;
- left: 50%;
+ left: 0;
z-index: 15;
- width: 60%;
+ display: -webkit-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -webkit-justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
padding-left: 0;
- margin-left: -30%;
- text-align: center;
+ margin-right: 15%;
+ margin-left: 15%;
list-style: none;
}
+
.carousel-indicators li {
+ position: relative;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 0 auto;
+ -ms-flex: 1 0 auto;
+ flex: 1 0 auto;
+ max-width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ background-color: rgba(255, 255, 255, 0.5);
+}
+
+.carousel-indicators li::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
display: inline-block;
- width: 10px;
+ width: 100%;
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;
+ content: "";
}
+
+.carousel-indicators li::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+}
+
.carousel-indicators .active {
- width: 12px;
- height: 12px;
- margin: 0;
background-color: #fff;
}
+
.carousel-caption {
position: absolute;
right: 15%;
@@ -6426,332 +5943,3223 @@ button.close {
padding-bottom: 20px;
color: #fff;
text-align: center;
- text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
}
-.carousel-caption .btn {
- text-shadow: none;
+
+.align-baseline {
+ vertical-align: baseline !important;
}
-@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: -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;
- }
-}
-.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-header:before,
-.modal-header:after,
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- content: " ";
-}
-.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-header:after,
-.modal-footer:after {
- clear: both;
+
+.align-top {
+ vertical-align: top !important;
}
-.center-block {
- display: block;
- margin-right: auto;
- margin-left: auto;
+
+.align-middle {
+ vertical-align: middle !important;
}
-.pull-right {
- float: right !important;
+
+.align-bottom {
+ vertical-align: bottom !important;
}
-.pull-left {
- float: left !important;
+
+.align-text-bottom {
+ vertical-align: text-bottom !important;
}
-.hide {
- display: none !important;
+
+.align-text-top {
+ vertical-align: text-top !important;
}
-.show {
- display: block !important;
+
+.bg-faded {
+ background-color: #f7f7f7;
}
-.invisible {
- visibility: hidden;
+
+.bg-primary {
+ background-color: #0275d8 !important;
}
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
+
+a.bg-primary:focus, a.bg-primary:hover {
+ background-color: #025aa5 !important;
}
-.hidden {
- display: none !important;
+
+.bg-success {
+ background-color: #5cb85c !important;
}
-.affix {
- position: fixed;
+
+a.bg-success:focus, a.bg-success:hover {
+ background-color: #449d44 !important;
}
-@-ms-viewport {
- width: device-width;
+
+.bg-info {
+ background-color: #5bc0de !important;
}
-.visible-xs,
-.visible-sm,
-.visible-md,
-.visible-lg {
- display: none !important;
+
+a.bg-info:focus, a.bg-info:hover {
+ background-color: #31b0d5 !important;
+}
+
+.bg-warning {
+ background-color: #f0ad4e !important;
+}
+
+a.bg-warning:focus, a.bg-warning:hover {
+ background-color: #ec971f !important;
+}
+
+.bg-danger {
+ background-color: #d9534f !important;
+}
+
+a.bg-danger:focus, a.bg-danger:hover {
+ background-color: #c9302c !important;
+}
+
+.bg-inverse {
+ background-color: #292b2c !important;
+}
+
+a.bg-inverse:focus, a.bg-inverse:hover {
+ background-color: #101112 !important;
+}
+
+.border-0 {
+ border: 0 !important;
+}
+
+.border-top-0 {
+ border-top: 0 !important;
+}
+
+.border-right-0 {
+ border-right: 0 !important;
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !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 {
+
+.border-left-0 {
+ border-left: 0 !important;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-top {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+
+.rounded-right {
+ border-top-right-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem;
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.rounded-left {
+ border-top-left-radius: 0.25rem;
+ border-bottom-left-radius: 0.25rem;
+}
+
+.rounded-circle {
+ border-radius: 50%;
+}
+
+.rounded-0 {
+ border-radius: 0;
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: "";
+}
+
+.d-none {
display: none !important;
}
-@media (max-width: 767px) {
- .visible-xs {
+
+.d-inline {
+ display: inline !important;
+}
+
+.d-inline-block {
+ display: inline-block !important;
+}
+
+.d-block {
+ display: block !important;
+}
+
+.d-table {
+ display: table !important;
+}
+
+.d-table-cell {
+ display: table-cell !important;
+}
+
+.d-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+}
+
+.d-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+}
+
+@media (min-width: 576px) {
+ .d-sm-none {
+ display: none !important;
+ }
+ .d-sm-inline {
+ display: inline !important;
+ }
+ .d-sm-inline-block {
+ display: inline-block !important;
+ }
+ .d-sm-block {
display: block !important;
}
- table.visible-xs {
+ .d-sm-table {
display: table !important;
}
- tr.visible-xs {
- display: table-row !important;
- }
- th.visible-xs,
- td.visible-xs {
+ .d-sm-table-cell {
display: table-cell !important;
}
-}
-@media (max-width: 767px) {
- .visible-xs-block {
- display: block !important;
+ .d-sm-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-sm-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (max-width: 767px) {
- .visible-xs-inline {
+
+@media (min-width: 768px) {
+ .d-md-none {
+ display: none !important;
+ }
+ .d-md-inline {
display: inline !important;
}
-}
-@media (max-width: 767px) {
- .visible-xs-inline-block {
+ .d-md-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm {
+ .d-md-block {
display: block !important;
}
- table.visible-sm {
+ .d-md-table {
display: table !important;
}
- tr.visible-sm {
- display: table-row !important;
- }
- th.visible-sm,
- td.visible-sm {
+ .d-md-table-cell {
display: table-cell !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-block {
- display: block !important;
+ .d-md-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-md-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-inline {
+
+@media (min-width: 992px) {
+ .d-lg-none {
+ display: none !important;
+ }
+ .d-lg-inline {
display: inline !important;
}
-}
-@media (min-width: 768px) and (max-width: 991px) {
- .visible-sm-inline-block {
+ .d-lg-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md {
+ .d-lg-block {
display: block !important;
}
- table.visible-md {
+ .d-lg-table {
display: table !important;
}
- tr.visible-md {
- display: table-row !important;
- }
- th.visible-md,
- td.visible-md {
+ .d-lg-table-cell {
display: table-cell !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-block {
- display: block !important;
+ .d-lg-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-lg-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
}
}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-inline {
+
+@media (min-width: 1200px) {
+ .d-xl-none {
+ display: none !important;
+ }
+ .d-xl-inline {
display: inline !important;
}
-}
-@media (min-width: 992px) and (max-width: 1199px) {
- .visible-md-inline-block {
+ .d-xl-inline-block {
display: inline-block !important;
}
-}
-@media (min-width: 1200px) {
- .visible-lg {
+ .d-xl-block {
display: block !important;
}
- table.visible-lg {
+ .d-xl-table {
display: table !important;
}
- tr.visible-lg {
- display: table-row !important;
- }
- th.visible-lg,
- td.visible-lg {
+ .d-xl-table-cell {
display: table-cell !important;
}
+ .d-xl-flex {
+ display: -webkit-box !important;
+ display: -webkit-flex !important;
+ display: -ms-flexbox !important;
+ display: flex !important;
+ }
+ .d-xl-inline-flex {
+ display: -webkit-inline-box !important;
+ display: -webkit-inline-flex !important;
+ display: -ms-inline-flexbox !important;
+ display: inline-flex !important;
+ }
}
-@media (min-width: 1200px) {
- .visible-lg-block {
+
+.d-print-block {
+ display: none !important;
+}
+
+@media print {
+ .d-print-block {
display: block !important;
}
}
-@media (min-width: 1200px) {
- .visible-lg-inline {
+
+.d-print-inline {
+ display: none !important;
+}
+
+@media print {
+ .d-print-inline {
display: inline !important;
}
}
-@media (min-width: 1200px) {
- .visible-lg-inline-block {
+
+.d-print-inline-block {
+ display: none !important;
+}
+
+@media print {
+ .d-print-inline-block {
display: inline-block !important;
}
}
-@media (max-width: 767px) {
- .hidden-xs {
+
+@media print {
+ .d-print-none {
display: none !important;
}
}
-@media (min-width: 768px) and (max-width: 991px) {
- .hidden-sm {
- display: none !important;
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+}
+
+.flex-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+}
+
+.flex-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+}
+
+.flex-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+}
+
+.justify-content-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+}
+
+.align-content-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+}
+
+.align-content-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+}
+
+.align-content-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+}
+
+.align-content-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+}
+
+.align-content-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+}
+
+.align-content-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+}
+
+.align-self-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+}
+
+.align-self-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+}
+
+.align-self-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+}
+
+.align-self-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+}
+
+.align-self-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+}
+
+.align-self-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+}
+
+@media (min-width: 576px) {
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-sm-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-sm-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-sm-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-sm-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-sm-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-sm-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-sm-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-sm-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-sm-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-sm-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-sm-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-sm-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-sm-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-sm-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-sm-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-sm-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-sm-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
-@media (min-width: 992px) and (max-width: 1199px) {
- .hidden-md {
- display: none !important;
+
+@media (min-width: 768px) {
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-md-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-md-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-md-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-md-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-md-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-md-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-md-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-md-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-md-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-md-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-md-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-md-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-md-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-md-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-md-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-md-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-md-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-lg-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-lg-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-lg-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-lg-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-lg-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-lg-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-lg-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-lg-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-lg-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-lg-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-lg-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-lg-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-lg-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-lg-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-lg-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-lg-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-lg-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
+
@media (min-width: 1200px) {
- .hidden-lg {
- display: none !important;
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+ }
+ .order-xl-last {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+ }
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ }
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
+ }
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ -webkit-flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
+ }
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
+ }
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ -webkit-flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
+ }
+ .flex-xl-wrap {
+ -webkit-flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
+ }
+ .flex-xl-nowrap {
+ -webkit-flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
+ }
+ .flex-xl-wrap-reverse {
+ -webkit-flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
+ }
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ -webkit-justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
+ }
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ -webkit-justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
+ }
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ -webkit-justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
+ }
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ -webkit-justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
+ }
+ .justify-content-xl-around {
+ -webkit-justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
+ }
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ -webkit-align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
+ }
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ -webkit-align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
+ }
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ -webkit-align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
+ }
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ -webkit-align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
+ }
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ -webkit-align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
+ }
+ .align-content-xl-start {
+ -webkit-align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
+ }
+ .align-content-xl-end {
+ -webkit-align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
+ }
+ .align-content-xl-center {
+ -webkit-align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
+ }
+ .align-content-xl-between {
+ -webkit-align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
+ }
+ .align-content-xl-around {
+ -webkit-align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
+ }
+ .align-content-xl-stretch {
+ -webkit-align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
+ }
+ .align-self-xl-auto {
+ -webkit-align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ -ms-grid-row-align: auto !important;
+ align-self: auto !important;
+ }
+ .align-self-xl-start {
+ -webkit-align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
+ }
+ .align-self-xl-end {
+ -webkit-align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
+ }
+ .align-self-xl-center {
+ -webkit-align-self: center !important;
+ -ms-flex-item-align: center !important;
+ -ms-grid-row-align: center !important;
+ align-self: center !important;
+ }
+ .align-self-xl-baseline {
+ -webkit-align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
+ }
+ .align-self-xl-stretch {
+ -webkit-align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ -ms-grid-row-align: stretch !important;
+ align-self: stretch !important;
}
}
-.visible-print {
- display: none !important;
+
+.float-left {
+ float: left !important;
}
-@media print {
- .visible-print {
- display: block !important;
+
+.float-right {
+ float: right !important;
+}
+
+.float-none {
+ float: none !important;
+}
+
+@media (min-width: 576px) {
+ .float-sm-left {
+ float: left !important;
}
- table.visible-print {
- display: table !important;
+ .float-sm-right {
+ float: right !important;
}
- tr.visible-print {
- display: table-row !important;
+ .float-sm-none {
+ float: none !important;
}
- th.visible-print,
- td.visible-print {
- display: table-cell !important;
+}
+
+@media (min-width: 768px) {
+ .float-md-left {
+ float: left !important;
+ }
+ .float-md-right {
+ float: right !important;
+ }
+ .float-md-none {
+ float: none !important;
}
}
-.visible-print-block {
- display: none !important;
+
+@media (min-width: 992px) {
+ .float-lg-left {
+ float: left !important;
+ }
+ .float-lg-right {
+ float: right !important;
+ }
+ .float-lg-none {
+ float: none !important;
+ }
}
-@media print {
- .visible-print-block {
- display: block !important;
+
+@media (min-width: 1200px) {
+ .float-xl-left {
+ float: left !important;
+ }
+ .float-xl-right {
+ float: right !important;
+ }
+ .float-xl-none {
+ float: none !important;
}
}
-.visible-print-inline {
- display: none !important;
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030;
}
-@media print {
- .visible-print-inline {
- display: inline !important;
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030;
+}
+
+.sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ -webkit-clip-path: inset(50%);
+ clip-path: inset(50%);
+ border: 0;
+}
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+ -webkit-clip-path: none;
+ clip-path: none;
+}
+
+.w-25 {
+ width: 25% !important;
+}
+
+.w-50 {
+ width: 50% !important;
+}
+
+.w-75 {
+ width: 75% !important;
+}
+
+.w-100 {
+ width: 100% !important;
+}
+
+.h-25 {
+ height: 25% !important;
+}
+
+.h-50 {
+ height: 50% !important;
+}
+
+.h-75 {
+ height: 75% !important;
+}
+
+.h-100 {
+ height: 100% !important;
+}
+
+.mw-100 {
+ max-width: 100% !important;
+}
+
+.mh-100 {
+ max-height: 100% !important;
+}
+
+.m-0 {
+ margin: 0 !important;
+}
+
+.mt-0 {
+ margin-top: 0 !important;
+}
+
+.mr-0 {
+ margin-right: 0 !important;
+}
+
+.mb-0 {
+ margin-bottom: 0 !important;
+}
+
+.ml-0 {
+ margin-left: 0 !important;
+}
+
+.mx-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+}
+
+.my-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.m-1 {
+ margin: 0.25rem !important;
+}
+
+.mt-1 {
+ margin-top: 0.25rem !important;
+}
+
+.mr-1 {
+ margin-right: 0.25rem !important;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem !important;
+}
+
+.ml-1 {
+ margin-left: 0.25rem !important;
+}
+
+.mx-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+}
+
+.my-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+}
+
+.m-2 {
+ margin: 0.5rem !important;
+}
+
+.mt-2 {
+ margin-top: 0.5rem !important;
+}
+
+.mr-2 {
+ margin-right: 0.5rem !important;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem !important;
+}
+
+.ml-2 {
+ margin-left: 0.5rem !important;
+}
+
+.mx-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+}
+
+.my-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+}
+
+.m-3 {
+ margin: 1rem !important;
+}
+
+.mt-3 {
+ margin-top: 1rem !important;
+}
+
+.mr-3 {
+ margin-right: 1rem !important;
+}
+
+.mb-3 {
+ margin-bottom: 1rem !important;
+}
+
+.ml-3 {
+ margin-left: 1rem !important;
+}
+
+.mx-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+}
+
+.my-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+}
+
+.m-4 {
+ margin: 1.5rem !important;
+}
+
+.mt-4 {
+ margin-top: 1.5rem !important;
+}
+
+.mr-4 {
+ margin-right: 1.5rem !important;
+}
+
+.mb-4 {
+ margin-bottom: 1.5rem !important;
+}
+
+.ml-4 {
+ margin-left: 1.5rem !important;
+}
+
+.mx-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+}
+
+.my-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+}
+
+.m-5 {
+ margin: 3rem !important;
+}
+
+.mt-5 {
+ margin-top: 3rem !important;
+}
+
+.mr-5 {
+ margin-right: 3rem !important;
+}
+
+.mb-5 {
+ margin-bottom: 3rem !important;
+}
+
+.ml-5 {
+ margin-left: 3rem !important;
+}
+
+.mx-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+}
+
+.my-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+}
+
+.p-0 {
+ padding: 0 !important;
+}
+
+.pt-0 {
+ padding-top: 0 !important;
+}
+
+.pr-0 {
+ padding-right: 0 !important;
+}
+
+.pb-0 {
+ padding-bottom: 0 !important;
+}
+
+.pl-0 {
+ padding-left: 0 !important;
+}
+
+.px-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+}
+
+.py-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+}
+
+.p-1 {
+ padding: 0.25rem !important;
+}
+
+.pt-1 {
+ padding-top: 0.25rem !important;
+}
+
+.pr-1 {
+ padding-right: 0.25rem !important;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem !important;
+}
+
+.pl-1 {
+ padding-left: 0.25rem !important;
+}
+
+.px-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+}
+
+.py-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+}
+
+.p-2 {
+ padding: 0.5rem !important;
+}
+
+.pt-2 {
+ padding-top: 0.5rem !important;
+}
+
+.pr-2 {
+ padding-right: 0.5rem !important;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem !important;
+}
+
+.pl-2 {
+ padding-left: 0.5rem !important;
+}
+
+.px-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+}
+
+.py-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+}
+
+.p-3 {
+ padding: 1rem !important;
+}
+
+.pt-3 {
+ padding-top: 1rem !important;
+}
+
+.pr-3 {
+ padding-right: 1rem !important;
+}
+
+.pb-3 {
+ padding-bottom: 1rem !important;
+}
+
+.pl-3 {
+ padding-left: 1rem !important;
+}
+
+.px-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+}
+
+.py-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+}
+
+.p-4 {
+ padding: 1.5rem !important;
+}
+
+.pt-4 {
+ padding-top: 1.5rem !important;
+}
+
+.pr-4 {
+ padding-right: 1.5rem !important;
+}
+
+.pb-4 {
+ padding-bottom: 1.5rem !important;
+}
+
+.pl-4 {
+ padding-left: 1.5rem !important;
+}
+
+.px-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+}
+
+.py-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+}
+
+.p-5 {
+ padding: 3rem !important;
+}
+
+.pt-5 {
+ padding-top: 3rem !important;
+}
+
+.pr-5 {
+ padding-right: 3rem !important;
+}
+
+.pb-5 {
+ padding-bottom: 3rem !important;
+}
+
+.pl-5 {
+ padding-left: 3rem !important;
+}
+
+.px-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+}
+
+.py-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+}
+
+.m-auto {
+ margin: auto !important;
+}
+
+.mt-auto {
+ margin-top: auto !important;
+}
+
+.mr-auto {
+ margin-right: auto !important;
+}
+
+.mb-auto {
+ margin-bottom: auto !important;
+}
+
+.ml-auto {
+ margin-left: auto !important;
+}
+
+.mx-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+}
+
+.my-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+}
+
+@media (min-width: 576px) {
+ .m-sm-0 {
+ margin: 0 !important;
+ }
+ .mt-sm-0 {
+ margin-top: 0 !important;
+ }
+ .mr-sm-0 {
+ margin-right: 0 !important;
+ }
+ .mb-sm-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-sm-0 {
+ margin-left: 0 !important;
+ }
+ .mx-sm-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-sm-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-sm-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-sm-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-sm-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-sm-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-sm-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-sm-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-sm-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-sm-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-sm-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-sm-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-sm-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-sm-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-sm-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-sm-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-sm-3 {
+ margin: 1rem !important;
+ }
+ .mt-sm-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-sm-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-sm-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-sm-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-sm-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-sm-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-sm-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-sm-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-sm-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-sm-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-sm-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-sm-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-sm-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-sm-5 {
+ margin: 3rem !important;
+ }
+ .mt-sm-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-sm-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-sm-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-sm-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-sm-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-sm-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-sm-0 {
+ padding: 0 !important;
+ }
+ .pt-sm-0 {
+ padding-top: 0 !important;
+ }
+ .pr-sm-0 {
+ padding-right: 0 !important;
+ }
+ .pb-sm-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-sm-0 {
+ padding-left: 0 !important;
+ }
+ .px-sm-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-sm-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-sm-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-sm-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-sm-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-sm-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-sm-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-sm-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-sm-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-sm-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-sm-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-sm-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-sm-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-sm-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-sm-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-sm-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-sm-3 {
+ padding: 1rem !important;
+ }
+ .pt-sm-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-sm-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-sm-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-sm-3 {
+ padding-left: 1rem !important;
+ }
+ .px-sm-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-sm-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-sm-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-sm-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-sm-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-sm-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-sm-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-sm-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-sm-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-sm-5 {
+ padding: 3rem !important;
+ }
+ .pt-sm-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-sm-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-sm-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-sm-5 {
+ padding-left: 3rem !important;
+ }
+ .px-sm-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-sm-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-sm-auto {
+ margin: auto !important;
+ }
+ .mt-sm-auto {
+ margin-top: auto !important;
+ }
+ .mr-sm-auto {
+ margin-right: auto !important;
+ }
+ .mb-sm-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-sm-auto {
+ margin-left: auto !important;
+ }
+ .mx-sm-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-sm-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
}
-.visible-print-inline-block {
- display: none !important;
+
+@media (min-width: 768px) {
+ .m-md-0 {
+ margin: 0 !important;
+ }
+ .mt-md-0 {
+ margin-top: 0 !important;
+ }
+ .mr-md-0 {
+ margin-right: 0 !important;
+ }
+ .mb-md-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-md-0 {
+ margin-left: 0 !important;
+ }
+ .mx-md-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-md-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-md-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-md-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-md-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-md-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-md-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-md-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-md-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-md-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-md-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-md-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-md-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-md-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-md-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-md-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-md-3 {
+ margin: 1rem !important;
+ }
+ .mt-md-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-md-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-md-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-md-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-md-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-md-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-md-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-md-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-md-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-md-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-md-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-md-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-md-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-md-5 {
+ margin: 3rem !important;
+ }
+ .mt-md-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-md-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-md-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-md-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-md-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-md-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-md-0 {
+ padding: 0 !important;
+ }
+ .pt-md-0 {
+ padding-top: 0 !important;
+ }
+ .pr-md-0 {
+ padding-right: 0 !important;
+ }
+ .pb-md-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-md-0 {
+ padding-left: 0 !important;
+ }
+ .px-md-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-md-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-md-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-md-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-md-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-md-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-md-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-md-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-md-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-md-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-md-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-md-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-md-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-md-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-md-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-md-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-md-3 {
+ padding: 1rem !important;
+ }
+ .pt-md-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-md-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-md-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-md-3 {
+ padding-left: 1rem !important;
+ }
+ .px-md-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-md-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-md-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-md-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-md-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-md-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-md-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-md-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-md-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-md-5 {
+ padding: 3rem !important;
+ }
+ .pt-md-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-md-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-md-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-md-5 {
+ padding-left: 3rem !important;
+ }
+ .px-md-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-md-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-md-auto {
+ margin: auto !important;
+ }
+ .mt-md-auto {
+ margin-top: auto !important;
+ }
+ .mr-md-auto {
+ margin-right: auto !important;
+ }
+ .mb-md-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-md-auto {
+ margin-left: auto !important;
+ }
+ .mx-md-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-md-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
}
-@media print {
- .visible-print-inline-block {
- display: inline-block !important;
+
+@media (min-width: 992px) {
+ .m-lg-0 {
+ margin: 0 !important;
+ }
+ .mt-lg-0 {
+ margin-top: 0 !important;
+ }
+ .mr-lg-0 {
+ margin-right: 0 !important;
+ }
+ .mb-lg-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-lg-0 {
+ margin-left: 0 !important;
+ }
+ .mx-lg-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-lg-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-lg-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-lg-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-lg-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-lg-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-lg-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-lg-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-lg-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-lg-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-lg-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-lg-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-lg-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-lg-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-lg-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-lg-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-lg-3 {
+ margin: 1rem !important;
+ }
+ .mt-lg-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-lg-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-lg-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-lg-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-lg-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-lg-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-lg-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-lg-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-lg-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-lg-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-lg-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-lg-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-lg-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-lg-5 {
+ margin: 3rem !important;
+ }
+ .mt-lg-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-lg-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-lg-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-lg-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-lg-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-lg-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-lg-0 {
+ padding: 0 !important;
+ }
+ .pt-lg-0 {
+ padding-top: 0 !important;
+ }
+ .pr-lg-0 {
+ padding-right: 0 !important;
+ }
+ .pb-lg-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-lg-0 {
+ padding-left: 0 !important;
+ }
+ .px-lg-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-lg-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-lg-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-lg-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-lg-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-lg-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-lg-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-lg-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-lg-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-lg-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-lg-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-lg-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-lg-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-lg-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-lg-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-lg-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-lg-3 {
+ padding: 1rem !important;
+ }
+ .pt-lg-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-lg-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-lg-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-lg-3 {
+ padding-left: 1rem !important;
+ }
+ .px-lg-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-lg-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-lg-4 {
+ padding: 1.5rem !important;
+ }
+ .pt-lg-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-lg-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-lg-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-lg-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-lg-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-lg-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-lg-5 {
+ padding: 3rem !important;
+ }
+ .pt-lg-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-lg-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-lg-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-lg-5 {
+ padding-left: 3rem !important;
+ }
+ .px-lg-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-lg-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-lg-auto {
+ margin: auto !important;
+ }
+ .mt-lg-auto {
+ margin-top: auto !important;
+ }
+ .mr-lg-auto {
+ margin-right: auto !important;
+ }
+ .mb-lg-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-lg-auto {
+ margin-left: auto !important;
+ }
+ .mx-lg-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-lg-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
}
-@media print {
- .hidden-print {
- display: none !important;
+
+@media (min-width: 1200px) {
+ .m-xl-0 {
+ margin: 0 !important;
+ }
+ .mt-xl-0 {
+ margin-top: 0 !important;
+ }
+ .mr-xl-0 {
+ margin-right: 0 !important;
+ }
+ .mb-xl-0 {
+ margin-bottom: 0 !important;
+ }
+ .ml-xl-0 {
+ margin-left: 0 !important;
+ }
+ .mx-xl-0 {
+ margin-right: 0 !important;
+ margin-left: 0 !important;
+ }
+ .my-xl-0 {
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ }
+ .m-xl-1 {
+ margin: 0.25rem !important;
+ }
+ .mt-xl-1 {
+ margin-top: 0.25rem !important;
+ }
+ .mr-xl-1 {
+ margin-right: 0.25rem !important;
+ }
+ .mb-xl-1 {
+ margin-bottom: 0.25rem !important;
+ }
+ .ml-xl-1 {
+ margin-left: 0.25rem !important;
+ }
+ .mx-xl-1 {
+ margin-right: 0.25rem !important;
+ margin-left: 0.25rem !important;
+ }
+ .my-xl-1 {
+ margin-top: 0.25rem !important;
+ margin-bottom: 0.25rem !important;
+ }
+ .m-xl-2 {
+ margin: 0.5rem !important;
+ }
+ .mt-xl-2 {
+ margin-top: 0.5rem !important;
+ }
+ .mr-xl-2 {
+ margin-right: 0.5rem !important;
+ }
+ .mb-xl-2 {
+ margin-bottom: 0.5rem !important;
+ }
+ .ml-xl-2 {
+ margin-left: 0.5rem !important;
+ }
+ .mx-xl-2 {
+ margin-right: 0.5rem !important;
+ margin-left: 0.5rem !important;
+ }
+ .my-xl-2 {
+ margin-top: 0.5rem !important;
+ margin-bottom: 0.5rem !important;
+ }
+ .m-xl-3 {
+ margin: 1rem !important;
+ }
+ .mt-xl-3 {
+ margin-top: 1rem !important;
+ }
+ .mr-xl-3 {
+ margin-right: 1rem !important;
+ }
+ .mb-xl-3 {
+ margin-bottom: 1rem !important;
+ }
+ .ml-xl-3 {
+ margin-left: 1rem !important;
+ }
+ .mx-xl-3 {
+ margin-right: 1rem !important;
+ margin-left: 1rem !important;
+ }
+ .my-xl-3 {
+ margin-top: 1rem !important;
+ margin-bottom: 1rem !important;
+ }
+ .m-xl-4 {
+ margin: 1.5rem !important;
+ }
+ .mt-xl-4 {
+ margin-top: 1.5rem !important;
+ }
+ .mr-xl-4 {
+ margin-right: 1.5rem !important;
+ }
+ .mb-xl-4 {
+ margin-bottom: 1.5rem !important;
+ }
+ .ml-xl-4 {
+ margin-left: 1.5rem !important;
+ }
+ .mx-xl-4 {
+ margin-right: 1.5rem !important;
+ margin-left: 1.5rem !important;
+ }
+ .my-xl-4 {
+ margin-top: 1.5rem !important;
+ margin-bottom: 1.5rem !important;
+ }
+ .m-xl-5 {
+ margin: 3rem !important;
+ }
+ .mt-xl-5 {
+ margin-top: 3rem !important;
+ }
+ .mr-xl-5 {
+ margin-right: 3rem !important;
+ }
+ .mb-xl-5 {
+ margin-bottom: 3rem !important;
+ }
+ .ml-xl-5 {
+ margin-left: 3rem !important;
+ }
+ .mx-xl-5 {
+ margin-right: 3rem !important;
+ margin-left: 3rem !important;
+ }
+ .my-xl-5 {
+ margin-top: 3rem !important;
+ margin-bottom: 3rem !important;
+ }
+ .p-xl-0 {
+ padding: 0 !important;
+ }
+ .pt-xl-0 {
+ padding-top: 0 !important;
+ }
+ .pr-xl-0 {
+ padding-right: 0 !important;
+ }
+ .pb-xl-0 {
+ padding-bottom: 0 !important;
+ }
+ .pl-xl-0 {
+ padding-left: 0 !important;
+ }
+ .px-xl-0 {
+ padding-right: 0 !important;
+ padding-left: 0 !important;
+ }
+ .py-xl-0 {
+ padding-top: 0 !important;
+ padding-bottom: 0 !important;
+ }
+ .p-xl-1 {
+ padding: 0.25rem !important;
+ }
+ .pt-xl-1 {
+ padding-top: 0.25rem !important;
+ }
+ .pr-xl-1 {
+ padding-right: 0.25rem !important;
+ }
+ .pb-xl-1 {
+ padding-bottom: 0.25rem !important;
+ }
+ .pl-xl-1 {
+ padding-left: 0.25rem !important;
+ }
+ .px-xl-1 {
+ padding-right: 0.25rem !important;
+ padding-left: 0.25rem !important;
+ }
+ .py-xl-1 {
+ padding-top: 0.25rem !important;
+ padding-bottom: 0.25rem !important;
+ }
+ .p-xl-2 {
+ padding: 0.5rem !important;
+ }
+ .pt-xl-2 {
+ padding-top: 0.5rem !important;
+ }
+ .pr-xl-2 {
+ padding-right: 0.5rem !important;
+ }
+ .pb-xl-2 {
+ padding-bottom: 0.5rem !important;
+ }
+ .pl-xl-2 {
+ padding-left: 0.5rem !important;
+ }
+ .px-xl-2 {
+ padding-right: 0.5rem !important;
+ padding-left: 0.5rem !important;
+ }
+ .py-xl-2 {
+ padding-top: 0.5rem !important;
+ padding-bottom: 0.5rem !important;
+ }
+ .p-xl-3 {
+ padding: 1rem !important;
+ }
+ .pt-xl-3 {
+ padding-top: 1rem !important;
+ }
+ .pr-xl-3 {
+ padding-right: 1rem !important;
+ }
+ .pb-xl-3 {
+ padding-bottom: 1rem !important;
+ }
+ .pl-xl-3 {
+ padding-left: 1rem !important;
+ }
+ .px-xl-3 {
+ padding-right: 1rem !important;
+ padding-left: 1rem !important;
+ }
+ .py-xl-3 {
+ padding-top: 1rem !important;
+ padding-bottom: 1rem !important;
+ }
+ .p-xl-4 {
+ padding: 1.5rem !important;
}
+ .pt-xl-4 {
+ padding-top: 1.5rem !important;
+ }
+ .pr-xl-4 {
+ padding-right: 1.5rem !important;
+ }
+ .pb-xl-4 {
+ padding-bottom: 1.5rem !important;
+ }
+ .pl-xl-4 {
+ padding-left: 1.5rem !important;
+ }
+ .px-xl-4 {
+ padding-right: 1.5rem !important;
+ padding-left: 1.5rem !important;
+ }
+ .py-xl-4 {
+ padding-top: 1.5rem !important;
+ padding-bottom: 1.5rem !important;
+ }
+ .p-xl-5 {
+ padding: 3rem !important;
+ }
+ .pt-xl-5 {
+ padding-top: 3rem !important;
+ }
+ .pr-xl-5 {
+ padding-right: 3rem !important;
+ }
+ .pb-xl-5 {
+ padding-bottom: 3rem !important;
+ }
+ .pl-xl-5 {
+ padding-left: 3rem !important;
+ }
+ .px-xl-5 {
+ padding-right: 3rem !important;
+ padding-left: 3rem !important;
+ }
+ .py-xl-5 {
+ padding-top: 3rem !important;
+ padding-bottom: 3rem !important;
+ }
+ .m-xl-auto {
+ margin: auto !important;
+ }
+ .mt-xl-auto {
+ margin-top: auto !important;
+ }
+ .mr-xl-auto {
+ margin-right: auto !important;
+ }
+ .mb-xl-auto {
+ margin-bottom: auto !important;
+ }
+ .ml-xl-auto {
+ margin-left: auto !important;
+ }
+ .mx-xl-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my-xl-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+}
+
+.text-justify {
+ text-align: justify !important;
+}
+
+.text-nowrap {
+ white-space: nowrap !important;
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.text-left {
+ text-align: left !important;
+}
+
+.text-right {
+ text-align: right !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+@media (min-width: 576px) {
+ .text-sm-left {
+ text-align: left !important;
+ }
+ .text-sm-right {
+ text-align: right !important;
+ }
+ .text-sm-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 768px) {
+ .text-md-left {
+ text-align: left !important;
+ }
+ .text-md-right {
+ text-align: right !important;
+ }
+ .text-md-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 992px) {
+ .text-lg-left {
+ text-align: left !important;
+ }
+ .text-lg-right {
+ text-align: right !important;
+ }
+ .text-lg-center {
+ text-align: center !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .text-xl-left {
+ text-align: left !important;
+ }
+ .text-xl-right {
+ text-align: right !important;
+ }
+ .text-xl-center {
+ text-align: center !important;
+ }
+}
+
+.text-lowercase {
+ text-transform: lowercase !important;
+}
+
+.text-uppercase {
+ text-transform: uppercase !important;
+}
+
+.text-capitalize {
+ text-transform: capitalize !important;
+}
+
+.font-weight-normal {
+ font-weight: normal;
+}
+
+.font-weight-bold {
+ font-weight: bold;
+}
+
+.font-italic {
+ font-style: italic;
+}
+
+.text-white {
+ color: #fff !important;
+}
+
+.text-muted {
+ color: #636c72 !important;
+}
+
+a.text-muted:focus, a.text-muted:hover {
+ color: #4b5257 !important;
+}
+
+.text-primary {
+ color: #0275d8 !important;
+}
+
+a.text-primary:focus, a.text-primary:hover {
+ color: #025aa5 !important;
+}
+
+.text-success {
+ color: #5cb85c !important;
+}
+
+a.text-success:focus, a.text-success:hover {
+ color: #449d44 !important;
+}
+
+.text-info {
+ color: #5bc0de !important;
+}
+
+a.text-info:focus, a.text-info:hover {
+ color: #31b0d5 !important;
+}
+
+.text-warning {
+ color: #f0ad4e !important;
+}
+
+a.text-warning:focus, a.text-warning:hover {
+ color: #ec971f !important;
+}
+
+.text-danger {
+ color: #d9534f !important;
+}
+
+a.text-danger:focus, a.text-danger:hover {
+ color: #c9302c !important;
+}
+
+.text-gray-dark {
+ color: #292b2c !important;
+}
+
+a.text-gray-dark:focus, a.text-gray-dark:hover {
+ color: #101112 !important;
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
}
-/*# sourceMappingURL=bootstrap.css.map */
+/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css.map b/library/bootstrap/css/bootstrap.css.map
index f010c82d1..4aa01bc4e 100644
--- a/library/bootstrap/css/bootstrap.css.map
+++ b/library/bootstrap/css/bootstrap.css.map
@@ -1 +1 @@
-{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,iBAAA;CH8O9C;AG7OmC;EAAW,iBAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EEnDA,2CAAA;EACA,qBAAA;CNokCD;AIvgCD;EACE,UAAA;CJygCD;AIngCD;EACE,uBAAA;CJqgCD;AIjgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CP+kCD;AIrgCD;EACE,mBAAA;CJugCD;AIjgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CP+lCD;AIjgCD;EACE,mBAAA;CJmgCD;AI7/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJ+/BD;AIv/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJy/BD;AIj/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJm/BH;AIx+BD;EACE,gBAAA;CJ0+BD;AQjoCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR6oCD;AQlpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRmqCH;AQ/pCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRoqCD;AQxqCD;;;;;;;;;;;;EAQI,eAAA;CR8qCH;AQ3qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRgrCD;AQprCD;;;;;;;;;;;;EAQI,eAAA;CR0rCH;AQtrCD;;EAAU,gBAAA;CR0rCT;AQzrCD;;EAAU,gBAAA;CR6rCT;AQ5rCD;;EAAU,gBAAA;CRgsCT;AQ/rCD;;EAAU,gBAAA;CRmsCT;AQlsCD;;EAAU,gBAAA;CRssCT;AQrsCD;;EAAU,gBAAA;CRysCT;AQnsCD;EACE,iBAAA;CRqsCD;AQlsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRosCD;AQ/rCD;EAwOA;IA1OI,gBAAA;GRqsCD;CACF;AQ7rCD;;EAEE,eAAA;CR+rCD;AQ5rCD;;EAEE,0BAAA;EACA,cAAA;CR8rCD;AQ1rCD;EAAuB,iBAAA;CR6rCtB;AQ5rCD;EAAuB,kBAAA;CR+rCtB;AQ9rCD;EAAuB,mBAAA;CRisCtB;AQhsCD;EAAuB,oBAAA;CRmsCtB;AQlsCD;EAAuB,oBAAA;CRqsCtB;AQlsCD;EAAuB,0BAAA;CRqsCtB;AQpsCD;EAAuB,0BAAA;CRusCtB;AQtsCD;EAAuB,2BAAA;CRysCtB;AQtsCD;EACE,eAAA;CRwsCD;AQtsCD;ECrGE,eAAA;CT8yCD;AS7yCC;;EAEE,eAAA;CT+yCH;AQ1sCD;ECxGE,eAAA;CTqzCD;ASpzCC;;EAEE,eAAA;CTszCH;AQ9sCD;EC3GE,eAAA;CT4zCD;AS3zCC;;EAEE,eAAA;CT6zCH;AQltCD;EC9GE,eAAA;CTm0CD;ASl0CC;;EAEE,eAAA;CTo0CH;AQttCD;ECjHE,eAAA;CT00CD;ASz0CC;;EAEE,eAAA;CT20CH;AQttCD;EAGE,YAAA;EE3HA,0BAAA;CVk1CD;AUj1CC;;EAEE,0BAAA;CVm1CH;AQxtCD;EE9HE,0BAAA;CVy1CD;AUx1CC;;EAEE,0BAAA;CV01CH;AQ5tCD;EEjIE,0BAAA;CVg2CD;AU/1CC;;EAEE,0BAAA;CVi2CH;AQhuCD;EEpIE,0BAAA;CVu2CD;AUt2CC;;EAEE,0BAAA;CVw2CH;AQpuCD;EEvIE,0BAAA;CV82CD;AU72CC;;EAEE,0BAAA;CV+2CH;AQnuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRquCD;AQ7tCD;;EAEE,cAAA;EACA,oBAAA;CR+tCD;AQluCD;;;;EAMI,iBAAA;CRkuCH;AQ3tCD;EACE,gBAAA;EACA,iBAAA;CR6tCD;AQztCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR4tCD;AQ9tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR4tCH;AQvtCD;EACE,cAAA;EACA,oBAAA;CRytCD;AQvtCD;;EAEE,wBAAA;CRytCD;AQvtCD;EACE,kBAAA;CRytCD;AQvtCD;EACE,eAAA;CRytCD;AQhsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXq6CC;EQ7nCH;IAhFM,mBAAA;GRgtCH;CACF;AQvsCD;;EAGE,aAAA;EACA,kCAAA;CRwsCD;AQtsCD;EACE,eAAA;EA9IqB,0BAAA;CRu1CtB;AQpsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRssCD;AQjsCG;;;EACE,iBAAA;CRqsCL;AQ/sCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRisCH;AQ/rCG;;;EACE,uBAAA;CRmsCL;AQ3rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR6rCD;AQvrCG;;;;;;EAAW,YAAA;CR+rCd;AQ9rCG;;;;;;EACE,uBAAA;CRqsCL;AQ/rCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRisCD;AYv+CD;;;;EAIE,+DAAA;CZy+CD;AYr+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZu+CD;AYn+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZq+CD;AY3+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZq+CH;AYh+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZk+CD;AY7+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZi+CH;AY59CD;EACE,kBAAA;EACA,mBAAA;CZ89CD;AaxhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd8hDD;AaxhDC;EAqEF;IAvEI,aAAA;Gb8hDD;CACF;Aa1hDC;EAkEF;IApEI,aAAA;GbgiDD;CACF;Aa5hDD;EA+DA;IAjEI,cAAA;GbkiDD;CACF;AazhDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdmjDD;AathDD;ECvBE,mBAAA;EACA,oBAAA;CdgjDD;AehjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfgjDL;AehiDG;EACE,YAAA;CfkiDL;Ae3hDC;EACE,YAAA;Cf6hDH;Ae9hDC;EACE,oBAAA;CfgiDH;AejiDC;EACE,oBAAA;CfmiDH;AepiDC;EACE,WAAA;CfsiDH;AeviDC;EACE,oBAAA;CfyiDH;Ae1iDC;EACE,oBAAA;Cf4iDH;Ae7iDC;EACE,WAAA;Cf+iDH;AehjDC;EACE,oBAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,WAAA;CfwjDH;AezjDC;EACE,oBAAA;Cf2jDH;Ae5jDC;EACE,mBAAA;Cf8jDH;AehjDC;EACE,YAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,oBAAA;CfwjDH;AezjDC;EACE,WAAA;Cf2jDH;Ae5jDC;EACE,oBAAA;Cf8jDH;Ae/jDC;EACE,oBAAA;CfikDH;AelkDC;EACE,WAAA;CfokDH;AerkDC;EACE,oBAAA;CfukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBqrED;AgBxrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBqrEP;AgBnsED;EAoBI,uBAAA;EACA,8BAAA;ChBkrEH;AgBvsED;;;;;;EA8BQ,cAAA;ChBirEP;AgB/sED;EAoCI,2BAAA;ChB8qEH;AgBltED;EAyCI,uBAAA;ChB4qEH;AgBrqED;;;;;;EAOQ,aAAA;ChBsqEP;AgB3pED;EACE,uBAAA;ChB6pED;AgB9pED;;;;;;EAQQ,uBAAA;ChB8pEP;AgBtqED;;EAeM,yBAAA;ChB2pEL;AgBjpED;EAEI,0BAAA;ChBkpEH;AgBzoED;EAEI,0BAAA;ChB0oEH;AgBjoED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBmoED;AgB9nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBioEL;AiB7wEC;;;;;;;;;;;;EAOI,0BAAA;CjBoxEL;AiB9wEC;;;;;EAMI,0BAAA;CjB+wEL;AiBlyEC;;;;;;;;;;;;EAOI,0BAAA;CjByyEL;AiBnyEC;;;;;EAMI,0BAAA;CjBoyEL;AiBvzEC;;;;;;;;;;;;EAOI,0BAAA;CjB8zEL;AiBxzEC;;;;;EAMI,0BAAA;CjByzEL;AiB50EC;;;;;;;;;;;;EAOI,0BAAA;CjBm1EL;AiB70EC;;;;;EAMI,0BAAA;CjB80EL;AiBj2EC;;;;;;;;;;;;EAOI,0BAAA;CjBw2EL;AiBl2EC;;;;;EAMI,0BAAA;CjBm2EL;AgBjtED;EACE,iBAAA;EACA,kBAAA;ChBmtED;AgBtpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBotED;EgB7pEH;IAnDM,iBAAA;GhBmtEH;EgBhqEH;;;;;;IA1CY,oBAAA;GhBktET;EgBxqEH;IAlCM,UAAA;GhB6sEH;EgB3qEH;;;;;;IAzBY,eAAA;GhB4sET;EgBnrEH;;;;;;IArBY,gBAAA;GhBgtET;EgB3rEH;;;;IARY,iBAAA;GhBysET;CACF;AkBn6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBk6ED;AkB/5ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBi6ED;AkB95ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBg6ED;AkBr5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL43ET;AkBr5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBu5ED;AkBp5ED;EACE,eAAA;ClBs5ED;AkBl5ED;EACE,eAAA;EACA,YAAA;ClBo5ED;AkBh5ED;;EAEE,aAAA;ClBk5ED;AkB94ED;;;EZrEE,2CAAA;EACA,qBAAA;CNw9ED;AkB74ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClB+4ED;AkBr3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CLwzET;AmBh8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CLy7ET;AKx5EC;EACE,YAAA;EACA,WAAA;CL05EH;AKx5EC;EAA0B,YAAA;CL25E3B;AK15EC;EAAgC,YAAA;CL65EjC;AkBj4EC;EACE,UAAA;EACA,8BAAA;ClBm4EH;AkB33EC;;;EAGE,0BAAA;EACA,WAAA;ClB63EH;AkB13EC;;EAEE,oBAAA;ClB43EH;AkBx3EC;EACE,aAAA;ClB03EH;AkB92ED;EACE,yBAAA;ClBg3ED;AkBx0ED;EAtBI;;;;IACE,kBAAA;GlBo2EH;EkBj2EC;;;;;;;;IAEE,kBAAA;GlBy2EH;EkBt2EC;;;;;;;;IAEE,kBAAA;GlB82EH;CACF;AkBp2ED;EACE,oBAAA;ClBs2ED;AkB91ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBg2ED;AkBr2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2EH;AkB91ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBg2ED;AkB71ED;;EAEE,iBAAA;ClB+1ED;AkB31ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB61ED;AkB31ED;;EAEE,cAAA;EACA,kBAAA;ClB61ED;AkBp1EC;;;;;;EAGE,oBAAA;ClBy1EH;AkBn1EC;;;;EAEE,oBAAA;ClBu1EH;AkBj1EC;;;;EAGI,oBAAA;ClBo1EL;AkBz0ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClBy0ED;AkBv0EC;;EAEE,gBAAA;EACA,iBAAA;ClBy0EH;AkB5zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBkkFD;AmBhkFC;EACE,aAAA;EACA,kBAAA;CnBkkFH;AmB/jFC;;EAEE,aAAA;CnBikFH;AkBx0ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClBy0EH;AkB/0ED;EASI,aAAA;EACA,kBAAA;ClBy0EH;AkBn1ED;;EAcI,aAAA;ClBy0EH;AkBv1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClBy0EH;AkBr0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBumFD;AmBrmFC;EACE,aAAA;EACA,kBAAA;CnBumFH;AmBpmFC;;EAEE,aAAA;CnBsmFH;AkBj1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBk1EH;AkBx1ED;EASI,aAAA;EACA,kBAAA;ClBk1EH;AkB51ED;;EAcI,aAAA;ClBk1EH;AkBh2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBk1EH;AkBz0ED;EAEE,mBAAA;ClB00ED;AkB50ED;EAMI,sBAAA;ClBy0EH;AkBr0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBn0ED;;;;;;;;;;EC1ZI,eAAA;CnByuFH;AkB/0ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0rFT;AmBxuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+rFT;AkBz1ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwuFH;AkB91ED;ECtYI,eAAA;CnBuuFH;AkB91ED;;;;;;;;;;EC7ZI,eAAA;CnBuwFH;AkB12ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwtFT;AmBtwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6tFT;AkBp3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBswFH;AkBz3ED;ECzYI,eAAA;CnBqwFH;AkBz3ED;;;;;;;;;;EChaI,eAAA;CnBqyFH;AkBr4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLsvFT;AmBpyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2vFT;AkB/4ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBoyFH;AkBp5ED;EC5YI,eAAA;CnBmyFH;AkBh5EC;EACE,UAAA;ClBk5EH;AkBh5EC;EACE,OAAA;ClBk5EH;AkBx4ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB04ED;AkBvzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBy3EH;EkBrvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBu3EH;EkB1vEH;IAxHM,sBAAA;GlBq3EH;EkB7vEH;IApHM,sBAAA;IACA,uBAAA;GlBo3EH;EkBjwEH;;;IA9GQ,YAAA;GlBo3EL;EkBtwEH;IAxGM,YAAA;GlBi3EH;EkBzwEH;IApGM,iBAAA;IACA,uBAAA;GlBg3EH;EkB7wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB62EH;EkBpxEH;;IAtFQ,gBAAA;GlB82EL;EkBxxEH;;IAjFM,mBAAA;IACA,eAAA;GlB62EH;EkB7xEH;IA3EM,OAAA;GlB22EH;CACF;AkBj2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClB81EH;AkBz2ED;;EAiBI,iBAAA;ClB41EH;AkB72ED;EJthBE,mBAAA;EACA,oBAAA;Cds4FD;AkB10EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlBw1EH;CACF;AkBx3ED;EAwCI,YAAA;ClBm1EH;AkBr0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB60EL;CACF;AkBn0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB20EL;CACF;AoBp6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL+tFT;AoBv6FG;;;;;;EdnBF,2CAAA;EACA,qBAAA;CNk8FD;AoB16FC;;;EAGE,YAAA;EACA,sBAAA;CpB46FH;AoBz6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLi5FT;AoBz6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL05FT;AoBz6FG;;EAEE,qBAAA;CpB26FL;AoBl6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBg+FD;AqB99FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBs+FT;AqBn+FC;;;EAGE,uBAAA;CrBq+FH;AqBh+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrBw+FT;AoBv9FD;ECZI,YAAA;EACA,uBAAA;CrBs+FH;AoBx9FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrByhGD;AqBvhGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB+hGT;AqB5hGC;;;EAGE,uBAAA;CrB8hGH;AqBzhGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBiiGT;AoB7gGD;ECfI,eAAA;EACA,uBAAA;CrB+hGH;AoB7gGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBklGD;AqBhlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBwlGT;AqBrlGC;;;EAGE,uBAAA;CrBulGH;AqBllGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB0lGT;AoBlkGD;ECnBI,eAAA;EACA,uBAAA;CrBwlGH;AoBlkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB2oGD;AqBzoGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBipGT;AqB9oGC;;;EAGE,uBAAA;CrBgpGH;AqB3oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBmpGT;AoBvnGD;ECvBI,eAAA;EACA,uBAAA;CrBipGH;AoBvnGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBosGD;AqBlsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB0sGT;AqBvsGC;;;EAGE,uBAAA;CrBysGH;AqBpsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB4sGT;AoB5qGD;EC3BI,eAAA;EACA,uBAAA;CrB0sGH;AoB5qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB6vGD;AqB3vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBmwGT;AqBhwGC;;;EAGE,uBAAA;CrBkwGH;AqB7vGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBqwGT;AoBjuGD;EC/BI,eAAA;EACA,uBAAA;CrBmwGH;AoB5tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpB8tGD;AoB5tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLkwGT;AoB7tGC;;;;EAIE,0BAAA;CpB+tGH;AoB7tGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpB+tGH;AoB3tGG;;;;EAEE,eAAA;EACA,sBAAA;CpB+tGL;AoBttGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBkyGD;AoBztGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrByyGD;AoB5tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBgzGD;AoB3tGD;EACE,eAAA;EACA,YAAA;CpB6tGD;AoBztGD;EACE,gBAAA;CpB2tGD;AoBptGC;;;EACE,YAAA;CpBwtGH;AuBl3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLisGT;AuBr3GC;EACE,WAAA;CvBu3GH;AuBn3GD;EACE,cAAA;CvBq3GD;AuBn3GC;EAAY,eAAA;CvBs3Gb;AuBr3GC;EAAY,mBAAA;CvBw3Gb;AuBv3GC;EAAY,yBAAA;CvB03Gb;AuBv3GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL2sGT;AwBr5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxBu5GD;AwBn5GD;;EAEE,mBAAA;CxBq5GD;AwBj5GD;EACE,WAAA;CxBm5GD;AwB/4GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBk5GD;AwB74GC;EACE,SAAA;EACA,WAAA;CxB+4GH;AwBx6GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBo8GD;AwB96GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB84GH;AwBx4GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB04GH;AwBp4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBs4GH;AwB73GC;;;EAGE,eAAA;CxB+3GH;AwB33GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxB63GH;AwBx3GD;EAGI,eAAA;CxBw3GH;AwB33GD;EAQI,WAAA;CxBs3GH;AwB92GD;EACE,WAAA;EACA,SAAA;CxBg3GD;AwBx2GD;EACE,QAAA;EACA,YAAA;CxB02GD;AwBt2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBw2GD;AwBp2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBs2GD;AwBl2GD;EACE,SAAA;EACA,WAAA;CxBo2GD;AwB51GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB41GH;AwBn2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB41GH;AwBv0GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB05GC;EwBv1GD;IA1DA,QAAA;IACA,YAAA;GxBo5GC;CACF;A2BpiHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3BsiHD;A2B1iHD;;EAMI,mBAAA;EACA,YAAA;C3BwiHH;A2BtiHG;;;;;;;;EAIE,WAAA;C3B4iHL;A2BtiHD;;;;EAKI,kBAAA;C3BuiHH;A2BliHD;EACE,kBAAA;C3BoiHD;A2BriHD;;;EAOI,YAAA;C3BmiHH;A2B1iHD;;;EAYI,iBAAA;C3BmiHH;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B7hHD;EACE,eAAA;C3B+hHD;A2B9hHC;EClDA,8BAAA;EACG,2BAAA;C5BmlHJ;A2B7hHD;;EC/CE,6BAAA;EACG,0BAAA;C5BglHJ;A2B5hHD;EACE,YAAA;C3B8hHD;A2B5hHD;EACE,iBAAA;C3B8hHD;A2B5hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BmmHJ;A2B3hHD;ECjEE,6BAAA;EACG,0BAAA;C5B+lHJ;A2B1hHD;;EAEE,WAAA;C3B4hHD;A2B3gHD;EACE,kBAAA;EACA,mBAAA;C3B6gHD;A2B3gHD;EACE,mBAAA;EACA,oBAAA;C3B6gHD;A2BxgHD;EtB/CE,yDAAA;EACQ,iDAAA;CL0jHT;A2BxgHC;EtBnDA,yBAAA;EACQ,iBAAA;CL8jHT;A2BrgHD;EACE,eAAA;C3BugHD;A2BpgHD;EACE,wBAAA;EACA,uBAAA;C3BsgHD;A2BngHD;EACE,wBAAA;C3BqgHD;A2B9/GD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3B+/GH;A2BtgHD;EAcM,YAAA;C3B2/GL;A2BzgHD;;;;EAsBI,iBAAA;EACA,eAAA;C3By/GH;A2Bp/GC;EACE,iBAAA;C3Bs/GH;A2Bp/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B4pHF;A2Bt/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BkqHF;A2Bv/GD;EACE,iBAAA;C3By/GD;A2Bv/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B0qHF;A2Bt/GD;EC7LE,2BAAA;EACC,0BAAA;C5BsrHF;A2Bl/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bo/GD;A2Bx/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bq/GH;A2B9/GD;EAYI,YAAA;C3Bq/GH;A2BjgHD;EAgBI,WAAA;C3Bo/GH;A2Bn+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bo+GL;A6B9sHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BgtHD;A6B7sHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7B+sHH;A6BxtHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7BusHH;A6BrsHG;EACE,WAAA;C7BusHL;A6B7rHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwqHD;AmBtqHC;;;EACE,aAAA;EACA,kBAAA;CnB0qHH;AmBvqHC;;;;;;EAEE,aAAA;CnB6qHH;A6B/sHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+rHD;AmB7rHC;;;EACE,aAAA;EACA,kBAAA;CnBisHH;AmB9rHC;;;;;;EAEE,aAAA;CnBosHH;A6B7tHD;;;EAGE,oBAAA;C7B+tHD;A6B7tHC;;;EACE,iBAAA;C7BiuHH;A6B7tHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7B+tHD;A6B1tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B4tHD;A6BztHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6BztHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6B/uHD;;EA0BI,cAAA;C7BytHH;A6BptHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bi0HJ;A6BrtHD;EACE,gBAAA;C7ButHD;A6BrtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5Bs0HJ;A6BttHD;EACE,eAAA;C7BwtHD;A6BntHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BmtHD;A6BxtHD;EAUI,mBAAA;C7BitHH;A6B3tHD;EAYM,kBAAA;C7BktHL;A6B/sHG;;;EAGE,WAAA;C7BitHL;A6B5sHC;;EAGI,mBAAA;C7B6sHL;A6B1sHC;;EAGI,WAAA;EACA,kBAAA;C7B2sHL;A8B12HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B42HD;A8B/2HD;EAOI,mBAAA;EACA,eAAA;C9B22HH;A8Bn3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B22HL;A8B12HK;;EAEE,sBAAA;EACA,0BAAA;C9B42HP;A8Bv2HG;EACE,eAAA;C9By2HL;A8Bv2HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By2HP;A8Bl2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo2HL;A8B74HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm5HD;A8Bn5HD;EA0DI,gBAAA;C9B41HH;A8Bn1HD;EACE,8BAAA;C9Bq1HD;A8Bt1HD;EAGI,YAAA;EAEA,oBAAA;C9Bq1HH;A8B11HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo1HL;A8Bn1HK;EACE,mCAAA;C9Bq1HP;A8B/0HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bi1HP;A8B50HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6vHD;A8Bh1HC;EAwDE,YAAA;C9B2xHH;A8Bn1HC;EA0DI,mBAAA;EACA,mBAAA;C9B4xHL;A8Bv1HC;EAgEE,UAAA;EACA,WAAA;C9B0xHH;A8B9wHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9ByxHH;E8BztHH;IA9DQ,iBAAA;G9B0xHL;CACF;A8Bp2HC;EAuFE,gBAAA;EACA,mBAAA;C9BgxHH;A8Bx2HC;;;EA8FE,uBAAA;C9B+wHH;A8BjwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9B8wHH;E8B3uHH;;;IA9BM,0BAAA;G9B8wHH;CACF;A8B/2HD;EAEI,YAAA;C9Bg3HH;A8Bl3HD;EAMM,mBAAA;C9B+2HL;A8Br3HD;EASM,iBAAA;C9B+2HL;A8B12HK;;;EAGE,YAAA;EACA,0BAAA;C9B42HP;A8Bp2HD;EAEI,YAAA;C9Bq2HH;A8Bv2HD;EAIM,gBAAA;EACA,eAAA;C9Bs2HL;A8B11HD;EACE,YAAA;C9B41HD;A8B71HD;EAII,YAAA;C9B41HH;A8Bh2HD;EAMM,mBAAA;EACA,mBAAA;C9B61HL;A8Bp2HD;EAYI,UAAA;EACA,WAAA;C9B21HH;A8B/0HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B01HH;E8B1xHH;IA9DQ,iBAAA;G9B21HL;CACF;A8Bn1HD;EACE,iBAAA;C9Bq1HD;A8Bt1HD;EAKI,gBAAA;EACA,mBAAA;C9Bo1HH;A8B11HD;;;EAYI,uBAAA;C9Bm1HH;A8Br0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bk1HH;E8B/yHH;;;IA9BM,0BAAA;G9Bk1HH;CACF;A8Bz0HD;EAEI,cAAA;C9B00HH;A8B50HD;EAKI,eAAA;C9B00HH;A8Bj0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8iIF;A+BxiID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0iID;A+BliID;EA8nBA;IAhoBI,mBAAA;G/BwiID;CACF;A+BzhID;EAgnBA;IAlnBI,YAAA;G/B+hID;CACF;A+BjhID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkhID;A+BhhIC;EACE,iBAAA;C/BkhIH;A+Bt/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkhID;E+BhhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkhIH;E+B/gIC;IACE,oBAAA;G/BihIH;E+B5gIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8gIH;CACF;A+B1gID;;EAGI,kBAAA;C/B2gIH;A+BtgIC;EAmjBF;;IArjBM,kBAAA;G/B6gIH;CACF;A+BpgID;;;;EAII,oBAAA;EACA,mBAAA;C/BsgIH;A+BhgIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B0gIH;CACF;A+B9/HD;EACE,cAAA;EACA,sBAAA;C/BggID;A+B3/HD;EA8gBA;IAhhBI,iBAAA;G/BigID;CACF;A+B7/HD;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+/HD;A+Bz/HD;EAggBA;;IAlgBI,iBAAA;G/BggID;CACF;A+B9/HD;EACE,OAAA;EACA,sBAAA;C/BggID;A+B9/HD;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BggID;A+B1/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4/HD;A+B1/HC;;EAEE,sBAAA;C/B4/HH;A+BrgID;EAaI,eAAA;C/B2/HH;A+Bl/HD;EALI;;IAEE,mBAAA;G/B0/HH;CACF;A+Bh/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bm/HD;A+B/+HC;EACE,WAAA;C/Bi/HH;A+B//HD;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B++HH;A+BrgID;EAyBI,gBAAA;C/B++HH;A+Bz+HD;EAqbA;IAvbI,cAAA;G/B++HD;CACF;A+Bt+HD;EACE,oBAAA;C/Bw+HD;A+Bz+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/Bw+HH;A+B58HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/Bs+HH;E+B3kHH;;IAxZQ,2BAAA;G/Bu+HL;E+B/kHH;IArZQ,kBAAA;G/Bu+HL;E+Bt+HK;;IAEE,uBAAA;G/Bw+HP;CACF;A+Bt9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bq+HD;E+B5lHH;IAtYM,YAAA;G/Bq+HH;E+B/lHH;IApYQ,kBAAA;IACA,qBAAA;G/Bs+HL;CACF;A+B39HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4vID;AkBtuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBwyHH;EkBpqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBsyHH;EkBzqHH;IAxHM,sBAAA;GlBoyHH;EkB5qHH;IApHM,sBAAA;IACA,uBAAA;GlBmyHH;EkBhrHH;;;IA9GQ,YAAA;GlBmyHL;EkBrrHH;IAxGM,YAAA;GlBgyHH;EkBxrHH;IApGM,iBAAA;IACA,uBAAA;GlB+xHH;EkB5rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB4xHH;EkBnsHH;;IAtFQ,gBAAA;GlB6xHL;EkBvsHH;;IAjFM,mBAAA;IACA,eAAA;GlB4xHH;EkB5sHH;IA3EM,OAAA;GlB0xHH;CACF;A+BpgIC;EAmWF;IAzWM,mBAAA;G/B8gIH;E+B5gIG;IACE,iBAAA;G/B8gIL;CACF;A+B7/HD;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmwIP;CACF;A+BngID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B00IF;A+BngID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By0IF;A+B//HD;EChVE,gBAAA;EACA,mBAAA;ChCk1ID;A+BhgIC;ECnVA,iBAAA;EACA,oBAAA;ChCs1ID;A+BjgIC;ECtVA,iBAAA;EACA,oBAAA;ChC01ID;A+B3/HD;EChWE,iBAAA;EACA,oBAAA;ChC81ID;A+Bv/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+/HD;CACF;A+Bl+HD;EAhBE;IExWA,uBAAA;GjC81IC;E+Br/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/Bu/HD;E+Bz/HD;IAKI,gBAAA;G/Bu/HH;CACF;A+B9+HD;EACE,0BAAA;EACA,sBAAA;C/Bg/HD;A+Bl/HD;EAKI,YAAA;C/Bg/HH;A+B/+HG;;EAEE,eAAA;EACA,8BAAA;C/Bi/HL;A+B1/HD;EAcI,YAAA;C/B++HH;A+B7/HD;EAmBM,YAAA;C/B6+HL;A+B3+HK;;EAEE,YAAA;EACA,8BAAA;C/B6+HP;A+Bz+HK;;;EAGE,YAAA;EACA,0BAAA;C/B2+HP;A+Bv+HK;;;EAGE,YAAA;EACA,8BAAA;C/By+HP;A+BjhID;EA8CI,mBAAA;C/Bs+HH;A+Br+HG;;EAEE,uBAAA;C/Bu+HL;A+BxhID;EAoDM,uBAAA;C/Bu+HL;A+B3hID;;EA0DI,sBAAA;C/Bq+HH;A+B99HK;;;EAGE,0BAAA;EACA,YAAA;C/Bg+HP;A+B/7HC;EAoKF;IA7LU,YAAA;G/B49HP;E+B39HO;;IAEE,YAAA;IACA,8BAAA;G/B69HT;E+Bz9HO;;;IAGE,YAAA;IACA,0BAAA;G/B29HT;E+Bv9HO;;;IAGE,YAAA;IACA,8BAAA;G/By9HT;CACF;A+B3jID;EA8GI,YAAA;C/Bg9HH;A+B/8HG;EACE,YAAA;C/Bi9HL;A+BjkID;EAqHI,YAAA;C/B+8HH;A+B98HG;;EAEE,YAAA;C/Bg9HL;A+B58HK;;;;EAEE,YAAA;C/Bg9HP;A+Bx8HD;EACE,uBAAA;EACA,sBAAA;C/B08HD;A+B58HD;EAKI,eAAA;C/B08HH;A+Bz8HG;;EAEE,YAAA;EACA,8BAAA;C/B28HL;A+Bp9HD;EAcI,eAAA;C/By8HH;A+Bv9HD;EAmBM,eAAA;C/Bu8HL;A+Br8HK;;EAEE,YAAA;EACA,8BAAA;C/Bu8HP;A+Bn8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bq8HP;A+Bj8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bm8HP;A+B3+HD;EA+CI,mBAAA;C/B+7HH;A+B97HG;;EAEE,uBAAA;C/Bg8HL;A+Bl/HD;EAqDM,uBAAA;C/Bg8HL;A+Br/HD;;EA2DI,sBAAA;C/B87HH;A+Bx7HK;;;EAGE,0BAAA;EACA,YAAA;C/B07HP;A+Bn5HC;EAwBF;IAvDU,sBAAA;G/Bs7HP;E+B/3HH;IApDU,0BAAA;G/Bs7HP;E+Bl4HH;IAjDU,eAAA;G/Bs7HP;E+Br7HO;;IAEE,YAAA;IACA,8BAAA;G/Bu7HT;E+Bn7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bq7HT;E+Bj7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bm7HT;CACF;A+B3hID;EA+GI,eAAA;C/B+6HH;A+B96HG;EACE,YAAA;C/Bg7HL;A+BjiID;EAsHI,eAAA;C/B86HH;A+B76HG;;EAEE,YAAA;C/B+6HL;A+B36HK;;;;EAEE,YAAA;C/B+6HP;AkCzjJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2jJD;AkChkJD;EAQI,sBAAA;ClC2jJH;AkCnkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC2jJL;AkCxkJD;EAkBI,eAAA;ClCyjJH;AmC7kJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+kJD;AmCnlJD;EAOI,gBAAA;CnC+kJH;AmCtlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCglJL;AmC9kJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2lJJ;AmC7kJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwmJJ;AmCxkJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC4kJL;AmCtkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2kJL;AmCloJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnCwkJL;AmC/jJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8oJL;AoC5oJG;;ERKF,+BAAA;EACG,4BAAA;C5B2oJJ;AoC3oJG;;ERTF,gCAAA;EACG,6BAAA;C5BwpJJ;AmC1kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8pJL;AoC5pJG;;ERKF,+BAAA;EACG,4BAAA;C5B2pJJ;AoC3pJG;;ERTF,gCAAA;EACG,6BAAA;C5BwqJJ;AqC3qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6qJD;AqCjrJD;EAOI,gBAAA;CrC6qJH;AqCprJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrC8qJL;AqC5rJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6qJL;AqCjsJD;;EA2BM,aAAA;CrC0qJL;AqCrsJD;;EAkCM,YAAA;CrCuqJL;AqCzsJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCoqJL;AsCltJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCotJD;AsChtJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCktJL;AsC7sJC;EACE,cAAA;CtC+sJH;AsC3sJC;EACE,mBAAA;EACA,UAAA;CtC6sJH;AsCtsJD;ECtCE,0BAAA;CvC+uJD;AuC5uJG;;EAEE,0BAAA;CvC8uJL;AsCzsJD;EC1CE,0BAAA;CvCsvJD;AuCnvJG;;EAEE,0BAAA;CvCqvJL;AsC5sJD;EC9CE,0BAAA;CvC6vJD;AuC1vJG;;EAEE,0BAAA;CvC4vJL;AsC/sJD;EClDE,0BAAA;CvCowJD;AuCjwJG;;EAEE,0BAAA;CvCmwJL;AsCltJD;ECtDE,0BAAA;CvC2wJD;AuCxwJG;;EAEE,0BAAA;CvC0wJL;AsCrtJD;EC1DE,0BAAA;CvCkxJD;AuC/wJG;;EAEE,0BAAA;CvCixJL;AwCnxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCqxJD;AwClxJC;EACE,cAAA;CxCoxJH;AwChxJC;EACE,mBAAA;EACA,UAAA;CxCkxJH;AwC/wJC;;EAEE,OAAA;EACA,iBAAA;CxCixJH;AwC5wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxC8wJL;AwCzwJC;;EAEE,eAAA;EACA,uBAAA;CxC2wJH;AwCxwJC;EACE,aAAA;CxC0wJH;AwCvwJC;EACE,kBAAA;CxCywJH;AwCtwJC;EACE,iBAAA;CxCwwJH;AyCl0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo0JD;AyCz0JD;;EASI,eAAA;CzCo0JH;AyC70JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm0JH;AyCl1JD;EAmBI,0BAAA;CzCk0JH;AyC/zJC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCi0JH;AyC31JD;EA8BI,gBAAA;CzCg0JH;AyC9yJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCg0JD;EyC9zJC;;IAEE,mBAAA;IACA,oBAAA;GzCg0JH;EyCvzJH;;IAJM,gBAAA;GzC+zJH;CACF;A0C52JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL8rJT;A0Cx3JD;;EAaI,kBAAA;EACA,mBAAA;C1C+2JH;A0C32JC;;;EAGE,sBAAA;C1C62JH;A0Cl4JD;EA0BI,aAAA;EACA,eAAA;C1C22JH;A2Cp4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cs4JD;A2C14JD;EAQI,cAAA;EAEA,eAAA;C3Co4JH;A2C94JD;EAeI,kBAAA;C3Ck4JH;A2Cj5JD;;EAqBI,iBAAA;C3Cg4JH;A2Cr5JD;EAyBI,gBAAA;C3C+3JH;A2Cv3JD;;EAEE,oBAAA;C3Cy3JD;A2C33JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cy3JH;A2Cj3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C26JD;A2Ct3JD;EClDI,0BAAA;C5C26JH;A2Cz3JD;EC/CI,eAAA;C5C26JH;A2Cx3JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cs7JD;A2C73JD;ECtDI,0BAAA;C5Cs7JH;A2Ch4JD;ECnDI,eAAA;C5Cs7JH;A2C/3JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Ci8JD;A2Cp4JD;EC1DI,0BAAA;C5Ci8JH;A2Cv4JD;ECvDI,eAAA;C5Ci8JH;A2Ct4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C48JD;A2C34JD;EC9DI,0BAAA;C5C48JH;A2C94JD;EC3DI,eAAA;C5C48JH;A6C98JD;EACE;IAAQ,4BAAA;G7Ci9JP;E6Ch9JD;IAAQ,yBAAA;G7Cm9JP;CACF;A6Ch9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6Cx9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6C98JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL26JT;A6C78JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL+zJT;A6C18JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C88JD;A6Cv8JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLu/JT;A6Cp8JD;EErEE,0BAAA;C/C4gKD;A+CzgKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C49JH;A6Cx8JD;EEzEE,0BAAA;C/CohKD;A+CjhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co+JH;A6C58JD;EE7EE,0BAAA;C/C4hKD;A+CzhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C4+JH;A6Ch9JD;EEjFE,0BAAA;C/CoiKD;A+CjiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co/JH;AgD5iKD;EAEE,iBAAA;ChD6iKD;AgD3iKC;EACE,cAAA;ChD6iKH;AgDziKD;;EAEE,QAAA;EACA,iBAAA;ChD2iKD;AgDxiKD;EACE,eAAA;ChD0iKD;AgDviKD;EACE,eAAA;ChDyiKD;AgDtiKC;EACE,gBAAA;ChDwiKH;AgDpiKD;;EAEE,mBAAA;ChDsiKD;AgDniKD;;EAEE,oBAAA;ChDqiKD;AgDliKD;;;EAGE,oBAAA;EACA,oBAAA;ChDoiKD;AgDjiKD;EACE,uBAAA;ChDmiKD;AgDhiKD;EACE,uBAAA;ChDkiKD;AgD9hKD;EACE,cAAA;EACA,mBAAA;ChDgiKD;AgD1hKD;EACE,gBAAA;EACA,iBAAA;ChD4hKD;AiDnlKD;EAEE,oBAAA;EACA,gBAAA;CjDolKD;AiD5kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjD6kKD;AiD1kKC;ErB3BA,6BAAA;EACC,4BAAA;C5BwmKF;AiD3kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BqmKF;AiDpkKD;;EAEE,YAAA;CjDskKD;AiDxkKD;;EAKI,YAAA;CjDukKH;AiDnkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjDukKH;AiDnkKD;EACE,YAAA;EACA,iBAAA;CjDqkKD;AiDhkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDkkKH;AiDvkKC;;;EASI,eAAA;CjDmkKL;AiD5kKC;;;EAYI,eAAA;CjDqkKL;AiDhkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDkkKH;AiDxkKC;;;;;;;;;EAYI,eAAA;CjDukKL;AiDnlKC;;;EAeI,eAAA;CjDykKL;AkD3qKC;EACE,eAAA;EACA,0BAAA;ClD6qKH;AkD3qKG;;EAEE,eAAA;ClD6qKL;AkD/qKG;;EAKI,eAAA;ClD8qKP;AkD3qKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+qKP;AkD7qKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDkrKP;AkDxsKC;EACE,eAAA;EACA,0BAAA;ClD0sKH;AkDxsKG;;EAEE,eAAA;ClD0sKL;AkD5sKG;;EAKI,eAAA;ClD2sKP;AkDxsKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4sKP;AkD1sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+sKP;AkDruKC;EACE,eAAA;EACA,0BAAA;ClDuuKH;AkDruKG;;EAEE,eAAA;ClDuuKL;AkDzuKG;;EAKI,eAAA;ClDwuKP;AkDruKK;;;;EAEE,eAAA;EACA,0BAAA;ClDyuKP;AkDvuKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4uKP;AkDlwKC;EACE,eAAA;EACA,0BAAA;ClDowKH;AkDlwKG;;EAEE,eAAA;ClDowKL;AkDtwKG;;EAKI,eAAA;ClDqwKP;AkDlwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDswKP;AkDpwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDywKP;AiDxqKD;EACE,cAAA;EACA,mBAAA;CjD0qKD;AiDxqKD;EACE,iBAAA;EACA,iBAAA;CjD0qKD;AmDpyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL6uKT;AmDnyKD;EACE,cAAA;CnDqyKD;AmDhyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5BuzKF;AmDtyKD;EAMI,eAAA;CnDmyKH;AmD9xKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDgyKD;AmDpyKD;;;;;EAWI,eAAA;CnDgyKH;AmD3xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bs0KF;AmDrxKD;;EAGI,iBAAA;CnDsxKH;AmDzxKD;;EAMM,oBAAA;EACA,iBAAA;CnDuxKL;AmDnxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B61KF;AmDjxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B21KF;AmD1yKD;EvB1DE,2BAAA;EACC,0BAAA;C5Bu2KF;AmD7wKD;EAEI,oBAAA;CnD8wKH;AmD3wKD;EACE,oBAAA;CnD6wKD;AmDrwKD;;;EAII,iBAAA;CnDswKH;AmD1wKD;;;EAOM,mBAAA;EACA,oBAAA;CnDwwKL;AmDhxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B63KF;AmDrxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDwwKP;AmD5xKD;;;;;;;;EAwBU,4BAAA;CnD8wKT;AmDtyKD;;;;;;;;EA4BU,6BAAA;CnDoxKT;AmDhzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bq5KF;AmDrzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDkxKP;AmD5zKD;;;;;;;;EA8CU,+BAAA;CnDwxKT;AmDt0KD;;;;;;;;EAkDU,gCAAA;CnD8xKT;AmDh1KD;;;;EA2DI,2BAAA;CnD2xKH;AmDt1KD;;EA+DI,cAAA;CnD2xKH;AmD11KD;;EAmEI,UAAA;CnD2xKH;AmD91KD;;;;;;;;;;;;EA0EU,eAAA;CnDkyKT;AmD52KD;;;;;;;;;;;;EA8EU,gBAAA;CnD4yKT;AmD13KD;;;;;;;;EAuFU,iBAAA;CnD6yKT;AmDp4KD;;;;;;;;EAgGU,iBAAA;CnD8yKT;AmD94KD;EAsGI,UAAA;EACA,iBAAA;CnD2yKH;AmDjyKD;EACE,oBAAA;CnDmyKD;AmDpyKD;EAKI,iBAAA;EACA,mBAAA;CnDkyKH;AmDxyKD;EASM,gBAAA;CnDkyKL;AmD3yKD;EAcI,iBAAA;CnDgyKH;AmD9yKD;;EAkBM,2BAAA;CnDgyKL;AmDlzKD;EAuBI,cAAA;CnD8xKH;AmDrzKD;EAyBM,8BAAA;CnD+xKL;AmDxxKD;EC1PE,mBAAA;CpDqhLD;AoDnhLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDqhLH;AoDxhLC;EAMI,uBAAA;CpDqhLL;AoD3hLC;EASI,eAAA;EACA,0BAAA;CpDqhLL;AoDlhLC;EAEI,0BAAA;CpDmhLL;AmDvyKD;EC7PE,sBAAA;CpDuiLD;AoDriLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpDuiLH;AoD1iLC;EAMI,0BAAA;CpDuiLL;AoD7iLC;EASI,eAAA;EACA,uBAAA;CpDuiLL;AoDpiLC;EAEI,6BAAA;CpDqiLL;AmDtzKD;EChQE,sBAAA;CpDyjLD;AoDvjLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDyjLH;AoD5jLC;EAMI,0BAAA;CpDyjLL;AoD/jLC;EASI,eAAA;EACA,0BAAA;CpDyjLL;AoDtjLC;EAEI,6BAAA;CpDujLL;AmDr0KD;ECnQE,sBAAA;CpD2kLD;AoDzkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2kLH;AoD9kLC;EAMI,0BAAA;CpD2kLL;AoDjlLC;EASI,eAAA;EACA,0BAAA;CpD2kLL;AoDxkLC;EAEI,6BAAA;CpDykLL;AmDp1KD;ECtQE,sBAAA;CpD6lLD;AoD3lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6lLH;AoDhmLC;EAMI,0BAAA;CpD6lLL;AoDnmLC;EASI,eAAA;EACA,0BAAA;CpD6lLL;AoD1lLC;EAEI,6BAAA;CpD2lLL;AmDn2KD;ECzQE,sBAAA;CpD+mLD;AoD7mLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD+mLH;AoDlnLC;EAMI,0BAAA;CpD+mLL;AoDrnLC;EASI,eAAA;EACA,0BAAA;CpD+mLL;AoD5mLC;EAEI,6BAAA;CpD6mLL;AqD7nLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD+nLD;AqDpoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD+nLH;AqD1nLD;EACE,uBAAA;CrD4nLD;AqDxnLD;EACE,oBAAA;CrD0nLD;AsDrpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLgmLT;AsD/pLD;EASI,mBAAA;EACA,kCAAA;CtDypLH;AsDppLD;EACE,cAAA;EACA,mBAAA;CtDspLD;AsDppLD;EACE,aAAA;EACA,mBAAA;CtDspLD;AuD5qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBqrLD;AuD7qLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB6rLD;AuDzqLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD2qLH;AwDhsLD;EACE,iBAAA;CxDksLD;AwD9rLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD6rLD;AwD1rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL6gLT;AwDhsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLwlLT;AwDpsLD;EACE,mBAAA;EACA,iBAAA;CxDssLD;AwDlsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDosLD;AwDhsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDksLD;AwD9rLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDgsLD;AwD9rLC;ElCrEA,WAAA;EAGA,yBAAA;CtBowLD;AwDjsLC;ElCtEA,aAAA;EAGA,0BAAA;CtBwwLD;AwDhsLD;EACE,cAAA;EACA,iCAAA;CxDksLD;AwD9rLD;EACE,iBAAA;CxDgsLD;AwD5rLD;EACE,UAAA;EACA,wBAAA;CxD8rLD;AwDzrLD;EACE,mBAAA;EACA,cAAA;CxD2rLD;AwDvrLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDyrLD;AwD5rLD;EAQI,iBAAA;EACA,iBAAA;CxDurLH;AwDhsLD;EAaI,kBAAA;CxDsrLH;AwDnsLD;EAiBI,eAAA;CxDqrLH;AwDhrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDkrLD;AwDhqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD+qLD;EwD7qLD;InDvEA,kDAAA;IACQ,0CAAA;GLuvLP;EwD5qLD;IAAY,aAAA;GxD+qLX;CACF;AwD1qLD;EAFE;IAAY,aAAA;GxDgrLX;CACF;AyD/zLD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBs1LD;AyD30LC;EnCdA,aAAA;EAGA,0BAAA;CtB01LD;AyD90LC;EAAW,iBAAA;EAAmB,eAAA;CzDk1L/B;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,gBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,kBAAA;EAAmB,eAAA;CzD21L/B;AyDv1LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzDy1LD;AyDr1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDu1LD;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;A2Dl7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLk5LT;A2D77LC;EAAY,kBAAA;C3Dg8Lb;A2D/7LC;EAAY,kBAAA;C3Dk8Lb;A2Dj8LC;EAAY,iBAAA;C3Do8Lb;A2Dn8LC;EAAY,mBAAA;C3Ds8Lb;A2Dn8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dq8LD;A2Dl8LD;EACE,kBAAA;C3Do8LD;A2D57LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D87LH;A2D37LD;EACE,mBAAA;C3D67LD;A2D37LD;EACE,mBAAA;EACA,YAAA;C3D67LD;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D47LL;A2Dz7LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D47LL;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D47LL;A2Dx7LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D07LH;A2Dz7LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D27LL;A4DpjMD;EACE,mBAAA;C5DsjMD;A4DnjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DqjMD;A4DxjMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLy4LT;A4D/jMD;;EAcM,eAAA;C5DqjML;A4D3hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL86LP;E4DzjMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D4jML;E4D1jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D6jML;E4D3jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D8jML;CACF;A4DpmMD;;;EA6CI,eAAA;C5D4jMH;A4DzmMD;EAiDI,QAAA;C5D2jMH;A4D5mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D0jMH;A4DlnMD;EA4DI,WAAA;C5DyjMH;A4DrnMD;EA+DI,YAAA;C5DyjMH;A4DxnMD;;EAmEI,QAAA;C5DyjMH;A4D5nMD;EAuEI,YAAA;C5DwjMH;A4D/nMD;EA0EI,WAAA;C5DwjMH;A4DhjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DmjMD;A4D9iMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CopMH;A4DljMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C6pMH;A4DpjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB4qMD;A4DtlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DqjMH;A4DhmMD;;EA+CI,UAAA;EACA,mBAAA;C5DqjMH;A4DrmMD;;EAoDI,WAAA;EACA,oBAAA;C5DqjMH;A4D1mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DqjMH;A4DhjMG;EACE,iBAAA;C5DkjML;A4D9iMG;EACE,iBAAA;C5DgjML;A4DtiMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DwiMD;A4DjjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D8hMH;A4D7jMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5D8hMH;A4DvhMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5DyhMD;A4DxhMC;EACE,kBAAA;C5D0hMH;A4Dj/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DmhMH;E4D3hMD;;IAYI,mBAAA;G5DmhMH;E4D/hMD;;IAgBI,oBAAA;G5DmhMH;E4D9gMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DghMD;E4D5gMD;IACE,aAAA;G5D8gMD;CACF;A6D7wMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7D6yMH;A6D3yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D4zMH;AiCp0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D+0MD;AiCt0MD;EACE,wBAAA;CjCw0MD;AiCt0MD;EACE,uBAAA;CjCw0MD;AiCh0MD;EACE,yBAAA;CjCk0MD;AiCh0MD;EACE,0BAAA;CjCk0MD;AiCh0MD;EACE,mBAAA;CjCk0MD;AiCh0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D41MD;AiC9zMD;EACE,yBAAA;CjCg0MD;AiCzzMD;EACE,gBAAA;CjC2zMD;AgE51MD;EACE,oBAAA;ChE81MD;AgEx1MD;;;;ECdE,yBAAA;CjE42MD;AgEv1MD;;;;;;;;;;;;EAYE,yBAAA;ChEy1MD;AgEl1MD;EA6IA;IC7LE,0BAAA;GjEs4MC;EiEr4MD;IAAU,0BAAA;GjEw4MT;EiEv4MD;IAAU,8BAAA;GjE04MT;EiEz4MD;;IACU,+BAAA;GjE44MT;CACF;AgE51MD;EAwIA;IA1II,0BAAA;GhEk2MD;CACF;AgE51MD;EAmIA;IArII,2BAAA;GhEk2MD;CACF;AgE51MD;EA8HA;IAhII,iCAAA;GhEk2MD;CACF;AgE31MD;EAwHA;IC7LE,0BAAA;GjEo6MC;EiEn6MD;IAAU,0BAAA;GjEs6MT;EiEr6MD;IAAU,8BAAA;GjEw6MT;EiEv6MD;;IACU,+BAAA;GjE06MT;CACF;AgEr2MD;EAmHA;IArHI,0BAAA;GhE22MD;CACF;AgEr2MD;EA8GA;IAhHI,2BAAA;GhE22MD;CACF;AgEr2MD;EAyGA;IA3GI,iCAAA;GhE22MD;CACF;AgEp2MD;EAmGA;IC7LE,0BAAA;GjEk8MC;EiEj8MD;IAAU,0BAAA;GjEo8MT;EiEn8MD;IAAU,8BAAA;GjEs8MT;EiEr8MD;;IACU,+BAAA;GjEw8MT;CACF;AgE92MD;EA8FA;IAhGI,0BAAA;GhEo3MD;CACF;AgE92MD;EAyFA;IA3FI,2BAAA;GhEo3MD;CACF;AgE92MD;EAoFA;IAtFI,iCAAA;GhEo3MD;CACF;AgE72MD;EA8EA;IC7LE,0BAAA;GjEg+MC;EiE/9MD;IAAU,0BAAA;GjEk+MT;EiEj+MD;IAAU,8BAAA;GjEo+MT;EiEn+MD;;IACU,+BAAA;GjEs+MT;CACF;AgEv3MD;EAyEA;IA3EI,0BAAA;GhE63MD;CACF;AgEv3MD;EAoEA;IAtEI,2BAAA;GhE63MD;CACF;AgEv3MD;EA+DA;IAjEI,iCAAA;GhE63MD;CACF;AgEt3MD;EAyDA;ICrLE,yBAAA;GjEs/MC;CACF;AgEt3MD;EAoDA;ICrLE,yBAAA;GjE2/MC;CACF;AgEt3MD;EA+CA;ICrLE,yBAAA;GjEggNC;CACF;AgEt3MD;EA0CA;ICrLE,yBAAA;GjEqgNC;CACF;AgEn3MD;ECnJE,yBAAA;CjEygND;AgEh3MD;EA4BA;IC7LE,0BAAA;GjEqhNC;EiEphND;IAAU,0BAAA;GjEuhNT;EiEthND;IAAU,8BAAA;GjEyhNT;EiExhND;;IACU,+BAAA;GjE2hNT;CACF;AgE93MD;EACE,yBAAA;ChEg4MD;AgE33MD;EAqBA;IAvBI,0BAAA;GhEi4MD;CACF;AgE/3MD;EACE,yBAAA;ChEi4MD;AgE53MD;EAcA;IAhBI,2BAAA;GhEk4MD;CACF;AgEh4MD;EACE,yBAAA;ChEk4MD;AgE73MD;EAOA;IATI,iCAAA;GhEm4MD;CACF;AgE53MD;EACA;ICrLE,yBAAA;GjEojNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n 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');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.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 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.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 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .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 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .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 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .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 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 9.3, iOS doesn't support `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","bootstrap.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_transforms.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"AAAA;;;;;GAKG;ACMD;EACE;;;;;;;;;;;IAcE,6BAA4B;IAE5B,oCAA2B;YAA3B,4BAA2B;GAC5B;EAED;;IAEE,2BAA0B;GAC3B;EAOD;IACE,8BAA6B;GAC9B;EAaD;IACE,iCAAgC;GACjC;EACD;;IAEE,uBAAgC;IAChC,yBAAwB;GACzB;EAOD;IACE,4BAA2B;GAC5B;EAED;;IAEE,yBAAwB;GACzB;EAED;;;IAGE,WAAU;IACV,UAAS;GACV;EAED;;IAEE,wBAAuB;GACxB;EAKD;IACE,cAAa;GACd;EACD;IACE,uBAAgC;GACjC;EAED;IACE,qCAAoC;GAMrC;EAPD;;IAKI,kCAAiC;GAClC;EAEH;;IAGI,kCAAiC;GAClC;CC3CN;;AClDD;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,wBAAuB;EACvB,kBAAiB;EACjB,+BAA8B;EAC9B,2BAA0B;EAC1B,8BAA6B;EAC7B,yCAA0C;CAC3C;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AAIC;EAAgB,oBAAmB;CDoDpC;;AC3CD;EACE,UAAS;EACT,mHCqM4H;EDpM5H,gBCwMmB;EDvMnB,oBC4MyB;ED3MzB,iBC+MoB;ED9MpB,eCqDiC;EDpDjC,uBCwCW;CDvCZ;;AD+CD;ECvCE,yBAAwB;CACzB;;AAQD;EACE,gCAAuB;UAAvB,wBAAuB;EACvB,UAAS;EACT,kBAAiB;CAClB;;AAWD;EACE,cAAa;EACb,qBAAoB;CACrB;;AAMD;EACE,cAAa;EACb,oBAAmB;CACpB;;AASD;;EAEE,2BAA0B;EAC1B,kCAAiC;EACjC,aAAY;EACZ,iBAAgB;CACjB;;AAED;EACE,oBAAmB;EACnB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;;EAGE,cAAa;EACb,oBAAmB;CACpB;;AAED;;;;EAIE,iBAAgB;CACjB;;AAED;EACE,kBCuHqB;CDtHtB;;AAED;EACE,qBAAoB;EACpB,eAAc;CACf;;AAED;EACE,iBAAgB;CACjB;;AAED;EACE,mBAAkB;CACnB;;AAED;;EAEE,oBAAmB;CACpB;;AAED;EACE,eAAc;CACf;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,eAAc;EACd,yBAAwB;CACzB;;AAED;EAAM,eAAc;CAAK;;AACzB;EAAM,WAAU;CAAK;;AAOrB;EACE,eCpFc;EDqFd,sBCf0B;EDgB1B,8BAA6B;EAC7B,sCAAqC;CAMtC;;AEtLG;EFmLA,eCnB4C;EDoB5C,2BCnB6B;CCjKR;;AF8LzB;EACE,eAAc;EACd,sBAAqB;CAUtB;;AE/LG;EFwLA,eAAc;EACd,sBAAqB;CEtLpB;;AFgLL;EAUI,WAAU;CACX;;AAQH;;;;EAIE,kCAAiC;EACjC,eAAc;CACf;;AAED;EAEE,cAAa;EAEb,oBAAmB;EAEnB,eAAc;CACf;;AAOD;EAEE,iBAAgB;CACjB;;AAOD;EACE,uBAAsB;EACtB,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AAaD;;;;;;;;;EASE,+BAA0B;MAA1B,2BAA0B;CAC3B;;AAOD;EACE,0BAAyB;CAC1B;;AAED;EACE,qBCoBoC;EDnBpC,wBCmBoC;EDlBpC,eC5LiC;ED6LjC,iBAAgB;EAChB,qBAAoB;CACrB;;AAED;EAEE,iBAAgB;CACjB;;AAOD;EAEE,sBAAqB;EACrB,qBAAoB;CACrB;;AAMD;EACE,oBAAmB;EACnB,2CAA0C;CAC3C;;AAED;;;;;EAKE,UAAS;EACT,qBAAoB;EACpB,mBAAkB;EAClB,qBAAoB;CACrB;;AAED;;EAEE,kBAAiB;CAClB;;AAED;;EAEE,qBAAoB;CACrB;;AAKD;;;;EAIE,2BAA0B;CAC3B;;AAGD;;;;EAIE,WAAU;EACV,mBAAkB;CACnB;;AAED;;EAEE,+BAAsB;UAAtB,uBAAsB;EACtB,WAAU;CAQX;;AAXD;;EASI,oBC4DwC;CD3DzC;;AAIH;;;;EASE,4BAA2B;CAC5B;;AAED;EACE,eAAc;EAEd,iBAAgB;CACjB;;AAED;EAME,aAAY;EAEZ,WAAU;EACV,UAAS;EACT,UAAS;CACV;;AAID;EACE,eAAc;EACd,YAAW;EACX,gBAAe;EACf,WAAU;EACV,qBAAoB;EACpB,kBAAiB;EACjB,qBAAoB;EACpB,eAAc;EACd,oBAAmB;CACpB;;AAED;EACE,yBAAwB;CACzB;;AD9DD;;ECmEE,aAAY;CACb;;AD/DD;ECsEE,qBAAoB;EACpB,yBAAwB;CACzB;;ADnED;;EC2EE,yBAAwB;CACzB;;AAOD;EACE,cAAa;EACb,2BAA0B;CAC3B;;AAMD;EACE,sBAAqB;CACtB;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,cAAa;CACd;;ADhFD;ECqFE,yBAAwB;CACzB;;AG/dD;;EAEE,sBFsQoC;EErQpC,qBFsQ8B;EErQ9B,iBFsQ0B;EErQ1B,iBFsQ0B;EErQ1B,eFsQ8B;CErQ/B;;AAED;EAAU,kBFwPW;CExPiB;;AACtC;EAAU,gBFwPS;CExPmB;;AACtC;EAAU,mBFwPY;CExPgB;;AACtC;EAAU,kBFwPW;CExPiB;;AACtC;EAAU,mBFwPY;CExPgB;;AACtC;EAAU,gBFwPS;CExPmB;;AAEtC;EACE,mBFwQwB;EEvQxB,iBFwQoB;CEvQrB;;AAGD;EACE,gBFuPkB;EEtPlB,iBF2PuB;EE1PvB,iBFkP0B;CEjP3B;;AACD;EACE,kBFmPoB;EElPpB,iBFuPuB;EEtPvB,iBF6O0B;CE5O3B;;AACD;EACE,kBF+OoB;EE9OpB,iBFmPuB;EElPvB,iBFwO0B;CEvO3B;;AACD;EACE,kBF2OoB;EE1OpB,iBF+OuB;EE9OvB,iBFmO0B;CElO3B;;AAOD;EACE,iBAAgB;EAChB,oBAAmB;EACnB,UAAS;EACT,yCFuCW;CEtCZ;;AAOD;;EAEE,eF8NmB;EE7NnB,oBF4LyB;CE3L1B;;AAED;;EAEE,eFoOiB;EEnOjB,0BFmlBsC;CEllBvC;;AAOD;EC7EE,gBAAe;EACf,iBAAgB;CD8EjB;;AAGD;EClFE,gBAAe;EACf,iBAAgB;CDmFjB;;AACD;EACE,sBAAqB;CAKtB;;AAND;EAII,kBFsNqB;CErNtB;;AASH;EACE,eAAc;EACd,0BAAyB;CAC1B;;AAGD;EACE,qBF8BW;EE7BX,oBF6BW;EE5BX,mBFqLgD;EEpLhD,mCFJiC;CEKlC;;AAED;EACE,eAAc;EACd,eAAc;EACd,eFXiC;CEgBlC;;AARD;EAMI,uBAAsB;CACvB;;AAIH;EACE,oBFYW;EEXX,gBAAe;EACf,kBAAiB;EACjB,oCFtBiC;EEuBjC,eAAc;CACf;;AAED;EAEI,YAAW;CACZ;;AAHH;EAKI,uBAAsB;CACvB;;AEtIH;ECIE,gBAAe;EAGf,aAAY;CDLb;;AAID;EACE,iBJ40BkC;EI30BlC,uBJ+EW;EI9EX,uBJ60BgC;EMz1B9B,uBNgO2B;EO/NzB,yCP21B2C;EO31B3C,oCP21B2C;EO31B3C,iCP21B2C;EKr1B/C,gBAAe;EAGf,aAAY;CDSb;;AAMD;EAEE,sBAAqB;CACtB;;AAED;EACE,sBAA4B;EAC5B,eAAc;CACf;;AAED;EACE,eJ6zB4B;EI5zB5B,eJmEiC;CIlElC;;AIzCD;;;;EAIE,kFRkP2F;CQjP5F;;AAGD;EACE,uBR24BiC;EQ14BjC,eRy4B+B;EQx4B/B,eR24BmC;EQ14BnC,0BRiGiC;EM1G/B,uBNgO2B;CQ9M9B;;AALC;EACE,WAAU;EACV,eAAc;EACd,0BAAyB;CAC1B;;AAIH;EACE,uBR23BiC;EQ13BjC,eRy3B+B;EQx3B/B,YRkEW;EQjEX,0BR6EiC;EMtG/B,sBNkO0B;CQ/L7B;;AAdD;EASI,WAAU;EACV,gBAAe;EACf,kBR4NmB;CQ1NpB;;AAIH;EACE,eAAc;EACd,cAAa;EACb,oBAAmB;EACnB,eRs2B+B;EQr2B/B,eR2DiC;CQjDlC;;AAfD;EASI,WAAU;EACV,mBAAkB;EAClB,eAAc;EACd,8BAA6B;EAC7B,iBAAgB;CACjB;;AAIH;EACE,kBRi2BiC;EQh2BjC,mBAAkB;CACnB;;AC1DC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXmnBF;;AankBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CX0nBF;;Aa1kBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXioBF;;AajlBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXwoBF;;AaxlBG;EFnDF;ICiBI,aV8KK;IU7KL,gBAAe;GDflB;CX+oBF;;Aa/lBG;EFnDF;ICiBI,aV+KK;IU9KL,gBAAe;GDflB;CXspBF;;AatmBG;EFnDF;ICiBI,aVgLK;IU/KL,gBAAe;GDflB;CX6pBF;;Aa7mBG;EFnDF;ICiBI,cViLM;IUhLN,gBAAe;GDflB;CXoqBF;;AW3pBC;ECZA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDO/B;;AEqCC;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CXuqBF;;AaloBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CX8qBF;;AazoBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CXqrBF;;AahpBG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDO/B;CX4rBF;;AWprBC;ECYA,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EAKX,oBAA4B;EAC5B,mBAA4B;CDjB/B;;AE2BC;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CXgsBF;;AarqBG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CXusBF;;Aa5qBG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CX8sBF;;AanrBG;EF7BF;ICkBI,oBAA4B;IAC5B,mBAA4B;GDjB/B;CXqtBF;;AWjtBC;EACE,gBAAe;EACf,eAAc;CAOf;;AATD;;EAMI,iBAAgB;EAChB,gBAAe;CAChB;;AGlCH;;;;;;EACE,mBAAkB;EAClB,YAAW;EACX,gBAAe;EFsBb,oBAA4B;EAC5B,mBAA4B;CEpB/B;;AD2CC;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdywBF;;Aa9tBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdqxBF;;Aa1uBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;CdiyBF;;AatvBG;ECjDF;;;;;;IFyBI,oBAA4B;IAC5B,mBAA4B;GEpB/B;Cd6yBF;;Ac3xBK;EACE,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,gBAAe;CAChB;;AACD;EACE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,YAAW;CACZ;;AAGC;EF2BN,oBAAsC;EAAtC,4BAAsC;MAAtC,wBAAsC;UAAtC,oBAAsC;EAKtC,qBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,sBAAsC;MAAtC,kBAAsC;UAAtC,cAAsC;EAKtC,eAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,6BAAsC;MAAtC,yBAAsC;UAAtC,qBAAsC;EAKtC,sBAAuC;CE9BhC;;AAFD;EF2BN,oBAAsC;EAAtC,uBAAsC;MAAtC,mBAAsC;UAAtC,eAAsC;EAKtC,gBAAuC;CE9BhC;;AAKC;EFqCR,YAAuD;CEnC9C;;AAFD;EFqCR,iBAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,WAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,WAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,WAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,kBAAiD;CEnCxC;;AAFD;EFqCR,YAAiD;CEnCxC;;AAFD;EFiCR,WAAsD;CE/B7C;;AAFD;EFiCR,gBAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,UAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,UAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,UAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,iBAAgD;CE/BvC;;AAFD;EFiCR,WAAgD;CE/BvC;;AAOD;EFoBR,uBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,iBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,iBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,iBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;AAFD;EFoBR,wBAAyC;CElBhC;;ADJP;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GE9BhC;EAKC;IFqCR,YAAuD;GEnC9C;EAFD;IFqCR,iBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,YAAiD;GEnCxC;EAFD;IFiCR,WAAsD;GE/B7C;EAFD;IFiCR,gBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,WAAgD;GE/BvC;EAOD;IFoBR,gBAAyC;GElBhC;EAFD;IFoBR,uBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;CduoCV;;Aa3oCG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GE9BhC;EAKC;IFqCR,YAAuD;GEnC9C;EAFD;IFqCR,iBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,YAAiD;GEnCxC;EAFD;IFiCR,WAAsD;GE/B7C;EAFD;IFiCR,gBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,WAAgD;GE/BvC;EAOD;IFoBR,gBAAyC;GElBhC;EAFD;IFoBR,uBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;CdqzCV;;AazzCG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GE9BhC;EAKC;IFqCR,YAAuD;GEnC9C;EAFD;IFqCR,iBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,YAAiD;GEnCxC;EAFD;IFiCR,WAAsD;GE/B7C;EAFD;IFiCR,gBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,WAAgD;GE/BvC;EAOD;IFoBR,gBAAyC;GElBhC;EAFD;IFoBR,uBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;Cdm+CV;;Aav+CG;ECzBE;IACE,sBAAa;QAAb,2BAAa;YAAb,cAAa;IACb,oBAAY;IAAZ,qBAAY;QAAZ,qBAAY;YAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,YAAW;GACZ;EAGC;IF2BN,oBAAsC;IAAtC,4BAAsC;QAAtC,wBAAsC;YAAtC,oBAAsC;IAKtC,qBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,sBAAsC;QAAtC,kBAAsC;YAAtC,cAAsC;IAKtC,eAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,6BAAsC;QAAtC,yBAAsC;YAAtC,qBAAsC;IAKtC,sBAAuC;GE9BhC;EAFD;IF2BN,oBAAsC;IAAtC,uBAAsC;QAAtC,mBAAsC;YAAtC,eAAsC;IAKtC,gBAAuC;GE9BhC;EAKC;IFqCR,YAAuD;GEnC9C;EAFD;IFqCR,iBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,WAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,kBAAiD;GEnCxC;EAFD;IFqCR,YAAiD;GEnCxC;EAFD;IFiCR,WAAsD;GE/B7C;EAFD;IFiCR,gBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,UAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,iBAAgD;GE/BvC;EAFD;IFiCR,WAAgD;GE/BvC;EAOD;IFoBR,gBAAyC;GElBhC;EAFD;IFoBR,uBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,iBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;EAFD;IFoBR,wBAAyC;GElBhC;CdipDV;;AezsDD;EACE,YAAW;EACX,gBAAe;EACf,oBbqIW;EapIX,8BbqTyC;CahS1C;;AAzBD;;EAQI,iBb8SkC;Ea7SlC,oBAAmB;EACnB,8Bb+F+B;Ca9FhC;;AAXH;EAcI,uBAAsB;EACtB,iCb0F+B;CazFhC;;AAhBH;EAmBI,8BbsF+B;CarFhC;;AApBH;EAuBI,uBbmES;CalEV;;AAQH;;EAGI,gBboRiC;CanRlC;;AAQH;EACE,0Bb4DiC;Ca/ClC;;AAdD;;EAKI,0BbwD+B;CavDhC;;AANH;;EAWM,yBAA8C;CAC/C;;AASL;EAEI,sCbwBS;CavBV;;AAQH;EAGM,uCbYO;CCpFY;;AaNvB;;;EAII,uCdsFO;CcrFR;;AAKH;EAKM,uCAJsC;CbLrB;;AaIvB;;EASQ,uCARoC;CASrC;;AApBP;;;EAII,0Bd2oBkC;Cc1oBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0Bd+oBkC;Cc9oBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0BdmpBkC;CclpBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;AApBP;;;EAII,0BdwpBkC;CcvpBnC;;AAKH;EAKM,0BAJsC;CbLrB;;AaIvB;;EASQ,0BARoC;CASrC;;ADiFT;EAEI,YbdS;EaeT,0BbH+B;CaIhC;;AAGH;EAEI,ebR+B;EaS/B,0BbP+B;CaQhC;;AAGH;EACE,Yb3BW;Ea4BX,0BbhBiC;CayClC;;AA3BD;;;EAOI,sBb6MqD;Ca5MtD;;AARH;EAWI,UAAS;CACV;;AAZH;EAgBM,4Cb1CO;Ca2CR;;AAjBL;EAuBQ,6CbjDK;CCnFY;;AU0DrB;EEuFJ;IAEI,eAAc;IACd,YAAW;IACX,iBAAgB;IAChB,6CAA4C;GAO/C;EAZD;IASM,UAAS;GACV;CfqtDJ;;AiBr3DD;EACE,eAAc;EACd,YAAW;EAGX,qBfyU8B;EexU9B,gBf8OmB;Ee7OnB,kBfyU8B;EexU9B,ef6FiC;Ee5FjC,uBf+EW;Ee7EX,uBAAsB;EACtB,qCAA4B;UAA5B,6BAA4B;EAC5B,sCf4EW;EevET,uBf4M2B;EO/NzB,yFP6ZqF;EO7ZrF,iFP6ZqF;EO7ZrF,4EP6ZqF;EO7ZrF,yEP6ZqF;EO7ZrF,+GP6ZqF;CelW1F;;AA1DD;EA6BI,8BAA6B;EAC7B,UAAS;CACV;;ACUD;EACE,ehB2D+B;EgB1D/B,uBhB6CS;EgB5CT,sBhBsWyD;EgBrWzD,cAAa;CAEd;;AD/CH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAsCI,efgE+B;Ee9D/B,WAAU;CACX;;AAzCH;EAkDI,0BfqD+B;EenD/B,WAAU;CACX;;AArDH;EAwDI,oBfqXwC;CepXzC;;AAGH;EAGI,4BAAwD;CACzD;;AAJH;EAYI,ef6B+B;Ee5B/B,uBfeS;CedV;;AAIH;;EAEE,eAAc;CACf;;AASD;EACE,oCAA2E;EAC3E,uCAA8E;EAC9E,iBAAgB;CACjB;;AAED;EACE,oCAA8E;EAC9E,uCAAiF;EACjF,mBfkJsB;CejJvB;;AAED;EACE,qCAA8E;EAC9E,wCAAiF;EACjF,oBf6IsB;Ce5IvB;;AASD;EACE,oBf2N+B;Ee1N/B,uBf0N+B;EezN/B,iBAAgB;EAChB,gBf6HmB;Ce5HpB;;AAQD;EACE,oBf8M+B;Ee7M/B,uBf6M+B;Ee5M/B,iBAAgB;EAChB,kBf4M8B;Ee3M9B,0BAAyB;EACzB,oBAAuC;CAOxC;;AAbD;;;;;EAUI,iBAAgB;EAChB,gBAAe;CAChB;;AAYH;;;EACE,wBfyL+B;EexL/B,oBf4FsB;Ee3FtB,iBfyL6B;EMtV3B,sBNkO0B;CenE7B;;AAED;;;EAGI,8BAA2D;CAC5D;;AAGH;;;EACE,qBf+K8B;Ee9K9B,mBf6EsB;Ee5EtB,iBf+K6B;EM1V3B,sBNiO0B;CepD7B;;AAED;;;EAGI,6BAA2D;CAC5D;;AASH;EACE,oBf6OmC;Ce5OpC;;AAED;EACE,eAAc;EACd,oBf8N+B;Ce7NhC;;AAOD;EACE,mBAAkB;EAClB,eAAc;EACd,sBfsN+B;Ce9MhC;;AAXD;EAOM,efzG6B;Ee0G7B,oBf6NsC;Ce5NvC;;AAIL;EACE,sBf4MiC;Ee3MjC,iBAAgB;CACjB;;AAED;EACE,mBAAkB;EAClB,oBfuMgC;EetMhC,sBfqMiC;CehMlC;;AARD;EAMI,iBAAgB;CACjB;;AAIH;EACE,sBAAqB;CAStB;;AAVD;EAII,uBAAsB;CACvB;;AALH;EAQI,qBfyL+B;CexLhC;;AAQH;EACE,oBfuK+B;CetKhC;;AAED;;;EAGE,oBAAyC;EACzC,6BAA4B;EAC5B,4CAAqD;EACrD,2CAAwD;UAAxD,mCAAwD;CACzD;;AChQC;;;;;EAKE,ehBuFY;CgBtFb;;AAGD;;;EAGE,sBhBgFY;CgB3Eb;;AAGD;EACE,ehBuEY;EgBtEZ,0BAAsC;EACtC,sBhBqEY;CgBpEb;;AD2OH;EAII,0QfzMuI;Ce0MxI;;ACxQD;;;;;EAKE,ehBqFY;CgBpFb;;AAGD;;;EAGE,sBhB8EY;CgBzEb;;AAGD;EACE,ehBqEY;EgBpEZ,wBAAsC;EACtC,sBhBmEY;CgBlEb;;ADmPH;EAII,mVfjNuI;CekNxI;;AChRD;;;;;EAKE,ehBoFY;CgBnFb;;AAGD;;;EAGE,sBhB6EY;CgBxEb;;AAGD;EACE,ehBoEY;EgBnEZ,0BAAsC;EACtC,sBhBkEY;CgBjEb;;AD2PH;EAII,oTfzNuI;Ce0NxI;;AAaH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;EACnB,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CAuFpB;;AA1FD;EASI,YAAW;CACZ;;AJ9PC;EIoPJ;IAeM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,iBAAgB;GACjB;EAnBL;IAuBM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,oBAAc;IAAd,uBAAc;QAAd,mBAAc;YAAd,eAAc;IACd,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,iBAAgB;GACjB;EA5BL;IAgCM,sBAAqB;IACrB,YAAW;IACX,uBAAsB;GACvB;EAnCL;IAuCM,sBAAqB;GACtB;EAxCL;IA2CM,YAAW;GACZ;EA5CL;IA+CM,iBAAgB;IAChB,uBAAsB;GACvB;EAjDL;IAsDM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,YAAW;IACX,cAAa;IACb,iBAAgB;GACjB;EA5DL;IA8DM,gBAAe;GAChB;EA/DL;IAiEM,mBAAkB;IAClB,cAAa;IACb,sBf2D4B;Ie1D5B,eAAc;GACf;EArEL;IAyEM,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,yBAAuB;IAAvB,gCAAuB;QAAvB,sBAAuB;YAAvB,wBAAuB;IACvB,gBAAe;GAChB;EA7EL;IA+EM,iBAAgB;IAChB,sBAAqB;IACrB,sBf6C4B;Ie5C5B,4BAA2B;GAC5B;EAnFL;IAuFM,OAAM;GACP;CjBo0DJ;;AmBlsED;EACE,sBAAqB;EACrB,oBjBuPyB;EiBtPzB,mBAAkB;EAClB,oBAAmB;EACnB,uBAAsB;EACtB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,8BAAiD;ECqEjD,qBlBkQ8B;EkBjQ9B,gBlBuKmB;EkBtKnB,kBlBkQ8B;EMlV5B,uBNgO2B;EO/NzB,yCPiY8C;EOjY9C,oCPiY8C;EOjY9C,iCPiY8C;CiB9VnD;;AhBlBG;EgBHA,sBAAqB;ChBMpB;;AgBnBL;EAiBI,WAAU;EACV,sDjB4EY;UiB5EZ,8CjB4EY;CiB3Eb;;AAnBH;EAwBI,oBjBqZwC;EiBpZxC,aAAY;CAEb;;AA3BH;EA+BI,uBAAsB;CAEvB;;AAIH;;EAEE,qBAAoB;CACrB;;AAOD;EC5CE,YlBqFW;EkBpFX,0BlB0Fc;EkBzFd,sBlByFc;CiB7Cf;;AhB5CG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlB0EU;UkB1EV,6ClB0EU;CkBxEb;;AAGD;EAEE,0BlBmEY;EkBlEZ,sBlBkEY;CkBjEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADWH;EC/CE,elBiGiC;EkBhGjC,uBlBoFW;EkBnFX,mBlBgWmC;CiBjTpC;;AhB/CG;EiBKA,elB0F+B;EkBzF/B,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,uDlBiV+B;UkBjV/B,+ClBiV+B;CkB/UlC;;AAGD;EAEE,uBlB6DS;EkB5DT,mBlByUiC;CkBxUlC;;AAED;;EAGE,elBkE+B;EkBjE/B,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADcH;EClDE,YlBqFW;EkBpFX,0BlB2Fc;EkB1Fd,sBlB0Fc;CiBxCf;;AhBlDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlB2EU;UkB3EV,8ClB2EU;CkBzEb;;AAGD;EAEE,0BlBoEY;EkBnEZ,sBlBmEY;CkBlEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADiBH;ECrDE,YlBqFW;EkBpFX,0BlByFc;EkBxFd,sBlBwFc;CiBnCf;;AhBrDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlByEU;UkBzEV,6ClByEU;CkBvEb;;AAGD;EAEE,0BlBkEY;EkBjEZ,sBlBiEY;CkBhEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADoBH;ECxDE,YlBqFW;EkBpFX,0BlBuFc;EkBtFd,sBlBsFc;CiB9Bf;;AhBxDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlBuEU;UkBvEV,8ClBuEU;CkBrEb;;AAGD;EAEE,0BlBgEY;EkB/DZ,sBlB+DY;CkB9Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADuBH;EC3DE,YlBqFW;EkBpFX,0BlBsFc;EkBrFd,sBlBqFc;CiB1Bf;;AhB3DG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlBsEU;UkBtEV,6ClBsEU;CkBpEb;;AAGD;EAEE,0BlB+DY;EkB9DZ,sBlB8DY;CkB7Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;AD4BH;ECxBE,elBmDc;EkBlDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBgDc;CiBzBf;;AhBhEG;EiB4CA,YlBuCS;EkBtCT,0BlB4CY;EkB3CZ,sBlB2CY;CCzFS;;AiBiDvB;EAEE,qDlBsCY;UkBtCZ,6ClBsCY;CkBrCb;;AAED;EAEE,elBiCY;EkBhCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlByBY;EkBxBZ,sBlBwBY;CkBvBb;;ADDH;EC3BE,YlB0TmC;EkBzTnC,8BAA6B;EAC7B,uBAAsB;EACtB,mBlBuTmC;CiB7RpC;;AhBnEG;EiB4CA,elBmD+B;EkBlD/B,uBlBmTiC;EkBlTjC,mBlBkTiC;CChWZ;;AiBiDvB;EAEE,uDlB6SiC;UkB7SjC,+ClB6SiC;CkB5SlC;;AAED;EAEE,YlBwSiC;EkBvSjC,8BAA6B;CAC9B;;AAED;;EAGE,elBgC+B;EkB/B/B,uBlBgSiC;EkB/RjC,mBlB+RiC;CkB9RlC;;ADEH;EC9BE,elBoDc;EkBnDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBiDc;CiBpBf;;AhBtEG;EiB4CA,YlBuCS;EkBtCT,0BlB6CY;EkB5CZ,sBlB4CY;CC1FS;;AiBiDvB;EAEE,sDlBuCY;UkBvCZ,8ClBuCY;CkBtCb;;AAED;EAEE,elBkCY;EkBjCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlB0BY;EkBzBZ,sBlByBY;CkBxBb;;ADKH;ECjCE,elBkDc;EkBjDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB+Cc;CiBff;;AhBzEG;EiB4CA,YlBuCS;EkBtCT,0BlB2CY;EkB1CZ,sBlB0CY;CCxFS;;AiBiDvB;EAEE,qDlBqCY;UkBrCZ,6ClBqCY;CkBpCb;;AAED;EAEE,elBgCY;EkB/BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBwBY;EkBvBZ,sBlBuBY;CkBtBb;;ADQH;ECpCE,elBgDc;EkB/Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB6Cc;CiBVf;;AhB5EG;EiB4CA,YlBuCS;EkBtCT,0BlByCY;EkBxCZ,sBlBwCY;CCtFS;;AiBiDvB;EAEE,sDlBmCY;UkBnCZ,8ClBmCY;CkBlCb;;AAED;EAEE,elB8BY;EkB7BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBsBY;EkBrBZ,sBlBqBY;CkBpBb;;ADWH;ECvCE,elB+Cc;EkB9Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB4Cc;CiBNf;;AhB/EG;EiB4CA,YlBuCS;EkBtCT,0BlBwCY;EkBvCZ,sBlBuCY;CCrFS;;AiBiDvB;EAEE,qDlBkCY;UkBlCZ,6ClBkCY;CkBjCb;;AAED;EAEE,elB6BY;EkB5BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBqBY;EkBpBZ,sBlBoBY;CkBnBb;;ADqBH;EACE,oBjB4JyB;EiB3JzB,ejBAc;EiBCd,iBAAgB;CA6BjB;;AAhCD;EASI,8BAA6B;CAE9B;;AAXH;EAeI,0BAAyB;CAC1B;;AhBvGC;EgByGA,0BAAyB;ChBzGJ;;AAWrB;EgBiGA,ejBoD4C;EiBnD5C,2BjBoD6B;EiBnD7B,8BAA6B;ChBhG5B;;AgByEL;EA0BI,ejBhB+B;CiBqBhC;;AhB3GC;EgByGE,sBAAqB;ChBtGtB;;AgBgHL;ECvDE,qBlB0Q8B;EkBzQ9B,mBlBwKsB;EkBvKtB,iBlB2I0B;EM3NxB,sBNiO0B;CiB1F7B;;AAED;EC3DE,wBlBsQ+B;EkBrQ/B,oBlByKsB;EkBxKtB,iBlB4I0B;EM5NxB,sBNkO0B;CiBvF7B;;AAOD;EACE,eAAc;EACd,YAAW;CACZ;;AAGD;EACE,mBjBkOoC;CiBjOrC;;AAGD;;;EAII,YAAW;CACZ;;AEtKH;EACE,WAAU;EZIN,yCPyOsC;EOzOtC,oCPyOsC;EOzOtC,iCPyOsC;CmBvO3C;;AAPD;EAKI,WAAU;CACX;;AAGH;EACE,cAAa;CAId;;AALD;EAGI,eAAc;CACf;;AAGH;EAEI,mBAAkB;CACnB;;AAGH;EAEI,yBAAwB;CACzB;;AAGH;EACE,mBAAkB;EAClB,UAAS;EACT,iBAAgB;EZ1BZ,sCP0OmC;EO1OnC,iCP0OmC;EO1OnC,8BP0OmC;CmB9MxC;;AChCD;;EAEE,mBAAkB;CACnB;;AAED;EAGI,sBAAqB;EACrB,SAAQ;EACR,UAAS;EACT,mBpB+NyB;EoB9NzB,uBAAsB;EACtB,YAAW;EACX,wBAA8B;EAC9B,sCAA4C;EAC5C,qCAA2C;CAC5C;;AAGH;EAGM,cAAa;EACb,2BAAiC;CAClC;;AAKL;EACE,mBAAkB;EAClB,UAAS;EACT,QAAO;EACP,cpB6gB8B;EoB5gB9B,cAAa;EACb,YAAW;EACX,iBpB6eoC;EoB5epC,kBAA8B;EAC9B,qBAAgC;EAChC,gBpBiNmB;EoBhNnB,epBgEiC;EoB/DjC,iBAAgB;EAChB,iBAAgB;EAChB,uBpBiDW;EoBhDX,qCAA4B;UAA5B,6BAA4B;EAC5B,sCpBgDW;EM3FT,uBNgO2B;CoBlL9B;;AAGD;EChDE,UAAS;EACT,iBAAuB;EACvB,iBAAgB;EAChB,8BrBqGiC;CoBtDlC;;AAKD;EACE,eAAc;EACd,YAAW;EACX,oBpBseqC;EoBrerC,YAAW;EACX,oBpB8LyB;EoB7LzB,epBwCiC;EoBvCjC,oBAAmB;EACnB,oBAAmB;EACnB,iBAAgB;EAChB,UAAS;CAyBV;;AnBzEG;EmBmDA,epBodmD;EoBndnD,sBAAqB;EACrB,0BpBmC+B;CCrF9B;;AmBmCL;EAoBI,YpBcS;EoBbT,sBAAqB;EACrB,0BpBkBY;CoBjBb;;AAvBH;EA2BI,epBqB+B;EoBpB/B,oBpB2VwC;EoB1VxC,8BAA6B;CAK9B;;AAIH;EAGI,eAAc;CACf;;AAJH;EAQI,WAAU;CACX;;AAOH;EACE,SAAQ;EACR,WAAU;CACX;;AAED;EACE,YAAW;EACX,QAAO;CACR;;AAGD;EACE,eAAc;EACd,uBpBsaqC;EoBrarC,iBAAgB;EAChB,oBpB2HsB;EoB1HtB,epBtBiC;EoBuBjC,oBAAmB;CACpB;;AAGD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,apBka6B;CoBja9B;;AAMD;EAGI,UAAS;EACT,aAAY;EACZ,wBpB4XoC;CoB3XrC;;AEvJH;;EAEE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,uBAAsB;CA0BvB;;AA9BD;;EAOI,mBAAkB;EAClB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iBAAgB;CAYjB;;AArBH;;EAcM,WAAU;CrBNS;;AqBRzB;;;;EAmBM,WAAU;CACX;;AApBL;;;;;;;;EA4BI,kBtBmMc;CsBlMf;;AAIH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CAK5B;;AARD;EAMI,YAAW;CACZ;;AAGH;EACE,iBAAgB;CACjB;;AAGD;EACE,eAAc;CAKf;;AAND;EhBlCI,2BgBsC8B;EhBrC9B,8BgBqC8B;CAC/B;;AAGH;;EhB5BI,0BgB8B2B;EhB7B3B,6BgB6B2B;CAC9B;;AAGD;EACE,YAAW;CACZ;;AACD;EACE,iBAAgB;CACjB;;AACD;;EhBtDI,2BgByD8B;EhBxD9B,8BgBwD8B;CAC/B;;AAEH;EhB9CI,0BgB+C2B;EhB9C3B,6BgB8C2B;CAC9B;;AAGD;;EAEE,WAAU;CACX;;AAeD;EACE,uBAAyC;EACzC,sBAAwC;CAKzC;;AAPD;EAKI,eAAc;CACf;;AAGH;EACE,wBAA4C;EAC5C,uBAA2C;CAC5C;;AAED;EACE,uBAA4C;EAC5C,sBAA2C;CAC5C;;AAmBD;EACE,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;CAcxB;;AAlBD;;EAQI,YAAW;CACZ;;AATH;;;;EAeI,iBtB2Ec;EsB1Ed,eAAc;CACf;;AAGH;EAEI,iBAAgB;CACjB;;AAHH;EhBpII,8BgByI+B;EhBxI/B,6BgBwI+B;CAChC;;AANH;EhBlJI,0BgB0J4B;EhBzJ5B,2BgByJ4B;CAC7B;;AAEH;EACE,iBAAgB;CACjB;;AACD;;EhBlJI,8BgBqJ+B;EhBpJ/B,6BgBoJ+B;CAChC;;AAEH;EhBtKI,0BgBuK0B;EhBtK1B,2BgBsK0B;CAC7B;;AxB+wFD;;;;EwB3vFM,mBAAkB;EAClB,uBAAmB;EACnB,qBAAoB;CACrB;;ACrML;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,YAAW;CAkBZ;;AArBD;EAQI,mBAAkB;EAClB,WAAU;EACV,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EAGd,UAAS;EACT,iBAAgB;CAMjB;;AApBH;EAkBM,WAAU;CtBmCX;;AsB9BL;;;EAIE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CAKpB;;AAVD;;;EjBvBI,iBiB+BwB;CACzB;;AAGH;;EAEE,oBAAmB;EACnB,uBAAsB;CACvB;;AAwBD;EACE,qBvBgR8B;EuB/Q9B,iBAAgB;EAChB,gBvBoLmB;EuBnLnB,oBvBwLyB;EuBvLzB,kBvB8Q8B;EuB7Q9B,evBkCiC;EuBjCjC,mBAAkB;EAClB,0BvBkCiC;EuBjCjC,sCvBmBW;EM3FT,uBNgO2B;CuBjI9B;;AAhCD;;;EAcI,wBvBuQ6B;EuBtQ7B,oBvB0KoB;EMxPpB,sBNkO0B;CuBlJ3B;;AAjBH;;;EAoBI,qBvBqQ4B;EuBpQ5B,mBvBmKoB;EMvPpB,sBNiO0B;CuB3I3B;;AAvBH;;EA6BI,cAAa;CACd;;AASH;;;;;;;EjBzFI,2BiBgG4B;EjB/F5B,8BiB+F4B;CAC/B;;AACD;EACE,gBAAe;CAChB;;AACD;;;;;;;EjBvFI,0BiB8F2B;EjB7F3B,6BiB6F2B;CAC9B;;AACD;EACE,eAAc;CACf;;AAMD;EACE,mBAAkB;EAGlB,aAAY;EACZ,oBAAmB;CAmCpB;;AAxCD;EAUI,mBAAkB;CAUnB;;AApBH;EAaM,kBvB8EY;CuB7Eb;;AAdL;EAkBM,WAAU;CtBhGX;;AsB8EL;;EA0BM,mBvBiEY;CuBhEb;;AA3BL;;EAgCM,WAAU;EACV,kBvB0DY;CuBrDb;;AAtCL;;;;EAoCQ,WAAU;CtBlHb;;AuB9CL;EACE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,mBAAsC;EACtC,qBxBsa8B;EwBra9B,mBxBsa4B;CwBra7B;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,WAAU;CA8BX;;AAjCD;EAMI,YxBqES;EwBpET,0BxB0EY;CwBxEb;;AATH;EAaI,sDxBoEY;UwBpEZ,8CxBoEY;CwBnEb;;AAdH;EAiBI,YxB0DS;EwBzDT,0BxBoaqE;CwBlatE;;AApBH;EAwBM,oBxBwYsC;EwBvYtC,0BxBiE6B;CwBhE9B;;AA1BL;EA6BM,exB4D6B;EwB3D7B,oBxBkYsC;CwBjYvC;;AAQL;EACE,mBAAkB;EAClB,aAA+D;EAC/D,QAAO;EACP,eAAc;EACd,YxB0XwC;EwBzXxC,axByXwC;EwBxXxC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBuXwC;EwBtXxC,6BAA4B;EAC5B,mCAAkC;EAClC,iCxBqX2C;UwBrX3C,yBxBqX2C;CwBnX5C;;AAMD;ElB1EI,uBNgO2B;CwBnJ5B;;AAHH;EAMI,2NxBfuI;CwBgBxI;;AAPH;EAUI,0BxBYY;EwBXZ,wKxBpBuI;CwBsBxI;;AAOH;EAEI,mBxBgXqB;CwB/WtB;;AAHH;EAMI,qKxBnCuI;CwBoCxI;;AASH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;CASvB;;AAXD;EAKI,uBxBgU4B;CwB3T7B;;AAVH;EAQM,eAAc;CACf;;AAWL;EACE,sBAAqB;EACrB,gBAAe;EAEf,4BAAwD;EACxD,2CxB4UuC;EwB3UvC,kBxB0M8B;EwBzM9B,exBlCiC;EwBmCjC,uBAAsB;EACtB,oNAAsG;EACtG,kCxB+UoC;UwB/UpC,0BxB+UoC;EwB9UpC,sCxBlDW;EM3FT,uBNgO2B;EwBjF7B,yBAAgB;KAAhB,sBAAgB;UAAhB,iBAAgB;CA4BjB;;AAzCD;EAgBI,sBxBgV2D;EwB/U3D,cAAa;CAYd;;AA7BH;EA0BM,exBrD6B;EwBsD7B,uBxBnEO;CwBoER;;AA5BL;EAgCI,exB1D+B;EwB2D/B,oBxB4QwC;EwB3QxC,0BxB3D+B;CwB4DhC;;AAnCH;EAuCI,WAAU;CACX;;AAGH;EACE,sBxBsSwC;EwBrSxC,yBxBqSwC;EwBpSxC,exBqT+B;CwB/ShC;;AAOD;EACE,mBAAkB;EAClB,sBAAqB;EACrB,gBAAe;EACf,exBsSmC;EwBrSnC,iBAAgB;CACjB;;AAED;EACE,iBxBkSkC;EwBjSlC,gBAAe;EACf,exB+RmC;EwB9RnC,UAAS;EACT,WAAU;CAKX;;AAED;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,QAAO;EACP,WAAU;EACV,exBgRmC;EwB/QnC,qBxBoR8B;EwBnR9B,iBxBoR6B;EwBnR7B,exBnHiC;EwBoHjC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBnIW;EwBoIX,sCxBnIW;EM3FT,uBNgO2B;CwB6B9B;;AA5CD;EAmBM,0BxBoRkB;CwBnRnB;;AApBL;EAwBI,mBAAkB;EAClB,UxBZc;EwBad,YxBbc;EwBcd,axBdc;EwBed,WAAU;EACV,eAAc;EACd,exBwPiC;EwBvPjC,qBxB4P4B;EwB3P5B,iBxB4P2B;EwB3P3B,exB3I+B;EwB4I/B,0BxB1I+B;EwB2I/B,sCxBzJS;EM3FT,mCkBqPgF;CACjF;;AArCH;EAyCM,kBxBiQU;CwBhQX;;AC1PL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CACjB;;AAED;EACE,eAAc;EACd,qBzB6iBkC;CyBliBnC;;AxBJG;EwBJA,sBAAqB;CxBOpB;;AwBZL;EAUI,ezBqF+B;EyBpF/B,oBzB2ZwC;CyB1ZzC;;AAQH;EACE,8BzB+hBgD;CyB7fjD;;AAnCD;EAII,oBzB6Lc;CyB5Lf;;AALH;EAQI,8BAAgD;EnB/BhD,gCN0N2B;EMzN3B,iCNyN2B;CyB/K5B;;AApBH;EAYM,mCzBohB4C;CCxiB7C;;AwBQL;EAgBM,ezB2D6B;EyB1D7B,8BAA6B;EAC7B,0BAAyB;CAC1B;;AAnBL;;EAwBI,ezBkD+B;EyBjD/B,uBzBoCS;EyBnCT,6BzBmCS;CyBlCV;;AA3BH;EA+BI,iBzBkKc;EMxNd,0BmBwD4B;EnBvD5B,2BmBuD4B;CAC7B;;AAQH;EnBvEI,uBNgO2B;CyBtJ5B;;AAHH;;EAOI,YzBYS;EyBXT,0BzBiBY;CyBhBb;;AAQH;EAEI,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,mBAAkB;CACnB;;AAGH;EAEI,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,mBAAkB;CACnB;;AAQH;EAEI,cAAa;CACd;;AAHH;EAKI,eAAc;CACf;;ACrGH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;EAC9B,qB1BsHW;C0BtGZ;;AArBD;;EAWI,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;CAO/B;;AfgCC;EepDJ;;IAgBM,YAAW;IACX,gBAAe;IACf,eAAc;GAEjB;C5Bq1GF;;A4B70GD;EACE,sBAAqB;EACrB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB1BwiB+E;E0BviB/E,0B1BuiB+E;E0BtiB/E,mB1B0FW;E0BzFX,mB1BwMsB;E0BvMtB,qBAAoB;EACpB,oBAAmB;CAKpB;;AzBpCG;EyBkCA,sBAAqB;CzB/BpB;;AyBwCL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CAMjB;;AAXD;EAQI,iBAAgB;EAChB,gBAAe;CAChB;;AAQH;EACE,sBAAqB;EACrB,oB1BwemC;E0BvenC,uB1BuemC;C0BtepC;;AAWD;EACE,yBAAgB;MAAhB,8BAAgB;UAAhB,iBAAgB;CACjB;;AAGD;EACE,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,yB1BifyC;E0BhfzC,mB1BiJsB;E0BhJtB,eAAc;EACd,wBAAuB;EACvB,8BAAuC;EpBzGrC,uBNgO2B;C0BjH9B;;AzB7FG;EyB2FA,sBAAqB;CzBxFpB;;AyB8FL;EACE,sBAAqB;EACrB,aAAY;EACZ,cAAa;EACb,uBAAsB;EACtB,YAAW;EACX,oCAAmC;EACnC,mCAA0B;UAA1B,2BAA0B;CAC3B;;Af1DG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B+yGR;;Aa54GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA4B9B;EAhDD;IAuBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAMpB;EA7BL;IA0BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA5BP;;IAkCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;GACpB;EApCL;IAwCM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EAzCL;IA6CM,cAAa;GACd;C5ByyGR;;Aa15GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5Bs1GR;;Aan7GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA4B9B;EAhDD;IAuBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAMpB;EA7BL;IA0BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA5BP;;IAkCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;GACpB;EApCL;IAwCM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EAzCL;IA6CM,cAAa;GACd;C5Bg1GR;;Aaj8GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B63GR;;Aa19GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA4B9B;EAhDD;IAuBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAMpB;EA7BL;IA0BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA5BP;;IAkCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;GACpB;EApCL;IAwCM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EAzCL;IA6CM,cAAa;GACd;C5Bu3GR;;Aax+GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5Bo6GR;;AajgHG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;IACnB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA4B9B;EAhDD;IAuBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAMpB;EA7BL;IA0BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA5BP;;IAkCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,0BAAmB;IAAnB,4BAAmB;QAAnB,uBAAmB;YAAnB,oBAAmB;GACpB;EApCL;IAwCM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EAzCL;IA6CM,cAAa;GACd;C5B85GR;;A4Bj9GD;EAsBQ,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;EACnB,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CA4B9B;;AArDL;EASY,iBAAgB;EAChB,YAAW;CACZ;;AAXX;;EAgBU,iBAAgB;EAChB,gBAAe;CAChB;;AAlBT;EA4BU,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;CAMpB;;AAlCT;EA+BY,qBAAoB;EACpB,oBAAmB;CACpB;;AAjCX;;EAuCU,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CACpB;;AAzCT;EA6CU,gCAAwB;EAAxB,iCAAwB;EAAxB,gCAAwB;EAAxB,yBAAwB;CACzB;;AA9CT;EAkDU,cAAa;CACd;;AAYT;EAEI,0B1BrGS;C0B0GV;;AAPH;EAKM,0B1BxGO;CCtER;;AyByKL;EAWM,0B1B9GO;C0BuHR;;AApBL;EAcQ,0B1BjHK;CCtER;;AyByKL;EAkBQ,0B1BrHK;C0BsHN;;AAnBP;;;;EA0BM,0B1B7HO;C0B8HR;;AA3BL;EA+BI,0B1BlIS;E0BmIT,iC1BnIS;C0BoIV;;AAjCH;EAoCI,sQ1BoYyR;C0BnY1R;;AArCH;EAwCI,0B1B3IS;C0B4IV;;AAIH;EAEI,a1BnJS;C0BwJV;;AAPH;EAKM,a1BtJO;CCrER;;AyBsNL;EAWM,gC1B5JO;C0BqKR;;AApBL;EAcQ,iC1B/JK;CCrER;;AyBsNL;EAkBQ,iC1BnKK;C0BoKN;;AAnBP;;;;EA0BM,a1B3KO;C0B4KR;;AA3BL;EA+BI,gC1BhLS;E0BiLT,uC1BjLS;C0BkLV;;AAjCH;EAoCI,4Q1BgV6R;C0B/U9R;;AArCH;EAwCI,gC1BzLS;C0B0LV;;ACpRH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB3BsFW;E2BrFX,uC3BsFW;EM3FT,uBNgO2B;C2BzN9B;;AAED;EAGE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iB3BspBgC;C2BrpBjC;;AAED;EACE,uB3BmpB+B;C2BlpBhC;;AAED;EACE,sBAAgC;EAChC,iBAAgB;CACjB;;AAED;EACE,iBAAgB;CACjB;;A1BpBG;E0BwBA,sBAAqB;C1BxBA;;A0BsBzB;EAMI,qB3BgoB8B;C2B/nB/B;;AAGH;ErBjCI,gCN0N2B;EMzN3B,iCNyN2B;C2BrL1B;;AAJL;ErBnBI,oCN4M2B;EM3M3B,mCN2M2B;C2B/K1B;;AASL;EACE,yB3BwmBgC;E2BvmBhC,iBAAgB;EAChB,0B3B6CiC;E2B5CjC,8C3B6BW;C2BxBZ;;AATD;ErB1DI,2DqBiE8E;CAC/E;;AAGH;EACE,yB3B6lBgC;E2B5lBhC,0B3BmCiC;E2BlCjC,2C3BmBW;C2BdZ;;AARD;ErBrEI,2DNwqB2E;C2B5lB5E;;AAQH;EACE,wBAAkC;EAClC,wB3B8kB+B;E2B7kB/B,uBAAiC;EACjC,iBAAgB;CACjB;;AAED;EACE,wBAAkC;EAClC,uBAAiC;CAClC;;AAOD;ECtGE,0B5BiGc;E4BhGd,sB5BgGc;C2BOf;;ACrGC;;EAEE,8BAA6B;CAC9B;;ADmGH;ECzGE,0B5BgGc;E4B/Fd,sB5B+Fc;C2BWf;;ACxGC;;EAEE,8BAA6B;CAC9B;;ADsGH;EC5GE,0B5BkGc;E4BjGd,sB5BiGc;C2BYf;;AC3GC;;EAEE,8BAA6B;CAC9B;;ADyGH;EC/GE,0B5B8Fc;E4B7Fd,sB5B6Fc;C2BmBf;;AC9GC;;EAEE,8BAA6B;CAC9B;;AD4GH;EClHE,0B5B6Fc;E4B5Fd,sB5B4Fc;C2BuBf;;ACjHC;;EAEE,8BAA6B;CAC9B;;ADiHH;EC7GE,8BAA6B;EAC7B,sB5BsFc;C2BwBf;;AACD;EChHE,8BAA6B;EAC7B,mB5B6VmC;C2B5OpC;;AACD;ECnHE,8BAA6B;EAC7B,sB5BuFc;C2B6Bf;;AACD;ECtHE,8BAA6B;EAC7B,sB5BqFc;C2BkCf;;AACD;ECzHE,8BAA6B;EAC7B,sB5BmFc;C2BuCf;;AACD;EC5HE,8BAA6B;EAC7B,sB5BkFc;C2B2Cf;;AAMD;EC3HE,iCAA4B;CD6H7B;;AC3HC;;EAEE,8BAA6B;EAC7B,uCAAkC;CACnC;;AACD;;;;EAIE,YAAW;CACZ;;AACD;;;;EAIE,iCAA4B;CAC7B;;AACD;EAEI,Y5BmDO;CCrER;;A0BgIL;EACE,WAAU;EACV,iBAAgB;EAChB,eAAc;CACf;;AAGD;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,iB3B4gBgC;C2B3gBjC;;AAED;EACE,YAAW;ErBtKT,mCNwqB2E;C2BhgB9E;;AAGD;EACE,YAAW;ErBtKT,4CNkqB2E;EMjqB3E,6CNiqB2E;C2B1f9E;;AAED;EACE,YAAW;ErB7JT,gDNopB2E;EMnpB3E,+CNmpB2E;C2Brf9E;;AhB/HG;EgBqIF;IACE,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,oB3BofqD;I2BnfrD,mB3BmfqD;G2B1etD;EAbD;IAOI,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,oBAAW;IAAX,oBAAW;QAAX,kBAAW;YAAX,aAAW;IACX,6BAAsB;IAAtB,8BAAsB;IAAtB,+BAAsB;QAAtB,2BAAsB;YAAtB,uBAAsB;IACtB,mB3B6emD;I2B5enD,kB3B4emD;G2B3epD;C7B8uHJ;;Aa/3HG;EgB2JF;IACE,qBAAa;IAAb,sBAAa;IAAb,qBAAa;IAAb,cAAa;IACb,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GA2CpB;EA7CD;IAKI,oBAAW;IAAX,oBAAW;QAAX,kBAAW;YAAX,aAAW;GAuCZ;EA5CH;IAQM,eAAc;IACd,eAAc;GACf;EAVL;IrBlME,2BqBiNoC;IrBhNpC,8BqBgNoC;GAQ/B;EAvBP;IAkBU,2BAA0B;GAC3B;EAnBT;IAqBU,8BAA6B;GAC9B;EAtBT;IrBpLE,0BqB6MmC;IrB5MnC,6BqB4MmC;GAQ9B;EAjCP;IA4BU,0BAAyB;GAC1B;EA7BT;IA+BU,6BAA4B;GAC7B;EAhCT;IAoCQ,iBAAgB;GAMjB;EA1CP;;IAwCU,iBAAgB;GACjB;C7BouHV;;Aax6HG;EgBiNF;IACE,wB3B4ayB;O2B5azB,qB3B4ayB;Y2B5azB,gB3B4ayB;I2B3azB,4B3B4a+B;O2B5a/B,yB3B4a+B;Y2B5a/B,oB3B4a+B;G2BrahC;EATD;IAKI,sBAAqB;IACrB,YAAW;IACX,uB3BwZ2B;G2BvZ5B;C7B2tHJ;;A+B5+HD;EACE,sB7B22BkC;E6B12BlC,oBAAmB;EACnB,iBAAgB;EAChB,0B7ByGiC;EMzG/B,uBNgO2B;C6B7N9B;;ACNC;EACE,eAAc;EACd,YAAW;EACX,YAAW;CACZ;;ADIH;EACE,YAAW;CA2BZ;;AA5BD;EAKI,sBAAqB;EACrB,sB7B81BiC;E6B71BjC,qB7B61BiC;E6B51BjC,e7B2F+B;E6B1F/B,aAAiC;CAClC;;AAVH;EAmBI,2BAA0B;CAC3B;;AApBH;EAsBI,sBAAqB;CACtB;;AAvBH;EA0BI,e7ByE+B;C6BxEhC;;AEpCH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EAEb,gBAAe;EACf,iBAAgB;EzBAd,uBNgO2B;C+B9N9B;;AAED;EAGM,eAAc;EzBoBhB,gCNqM2B;EMpM3B,mCNoM2B;C+BvN1B;;AALL;EzBSI,iCNmN2B;EMlN3B,oCNkN2B;C+BlN1B;;AAVL;EAcI,WAAU;EACV,Y/BuES;E+BtET,0B/B4EY;E+B3EZ,sB/B2EY;C+B1Eb;;AAlBH;EAqBI,e/B+E+B;E+B9E/B,qBAAoB;EACpB,oB/BoZwC;E+BnZxC,uB/B8DS;E+B7DT,mB/BqmBuC;C+BpmBxC;;AAGH;EACE,mBAAkB;EAClB,eAAc;EACd,wB/BukB0C;E+BtkB1C,kBAAiB;EACjB,kB/B2kBwC;E+B1kBxC,e/ByDc;E+BxDd,uB/BkDW;E+BjDX,uB/B6kByC;C+BrkB1C;;A9B/BG;E8B0BA,e/B2H4C;E+B1H5C,sBAAqB;EACrB,0B/B2D+B;E+B1D/B,mB/B2kBuC;CCrmBtC;;A+BtBH;EACE,wBhC+mBwC;EgC9mBxC,mBhCsPoB;CgCrPrB;;AAIG;E1BqBF,+BNsM0B;EMrM1B,kCNqM0B;CgCzNvB;;AAGD;E1BEF,gCNoN0B;EMnN1B,mCNmN0B;CgCpNvB;;AAdL;EACE,wBhC6mBuC;EgC5mBvC,oBhCuPoB;CgCtPrB;;AAIG;E1BqBF,+BNuM0B;EMtM1B,kCNsM0B;CgC1NvB;;AAGD;E1BEF,gCNqN0B;EMpN1B,mCNoN0B;CgCrNvB;;ACZP;EACE,sBAAqB;EACrB,sBjCwuBgC;EiCvuBhC,ejCquB+B;EiCpuB/B,kBjCuPqB;EiCtPrB,eAAc;EACd,YjCmFW;EiClFX,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;E3BVtB,uBNgO2B;CiC/M9B;;AAhBD;EAcI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AhCLG;EgCWA,YjC6DS;EiC5DT,sBAAqB;ChCTpB;;AgCkBL;EACE,qBjCssBgC;EiCrsBhC,oBjCqsBgC;EM9uB9B,qBNivB+B;CiCtsBlC;;AAMD;EClDE,0BlCyGiC;CiCrDlC;;AhCjCG;EiCfE,0BAAqC;CjCkBtC;;AgCgCL;ECtDE,0BlCiGc;CiCzCf;;AhCrCG;EiCfE,0BAAqC;CjCkBtC;;AgCoCL;EC1DE,0BlCgGc;CiCpCf;;AhCzCG;EiCfE,0BAAqC;CjCkBtC;;AgCwCL;EC9DE,0BlCkGc;CiClCf;;AhC7CG;EiCfE,0BAAqC;CjCkBtC;;AgC4CL;EClEE,0BlC8Fc;CiC1Bf;;AhCjDG;EiCfE,0BAAqC;CjCkBtC;;AgCgDL;ECtEE,0BlC6Fc;CiCrBf;;AhCrDG;EiCfE,0BAAqC;CjCkBtC;;AkCzBL;EACE,mBAAoD;EACpD,oBnCyoBmC;EmCxoBnC,0BnC0GiC;EMzG/B,sBNiO0B;CmC5N7B;;AxB+CG;EwBxDJ;IAOI,mBnCooBiC;GmCloBpC;CrCwrIA;;AqCtrID;EACE,0BAA4C;CAC7C;;AAED;EACE,iBAAgB;EAChB,gBAAe;E7Bbb,iB6BcsB;CACzB;;ACfD;EACE,yBpCsxBmC;EoCrxBnC,oBpCuxBgC;EoCtxBhC,8BAA6C;E9BH3C,uBNgO2B;CoC3N9B;;AAGD;EAEE,eAAc;CACf;;AAGD;EACE,kBpC6OqB;CoC5OtB;;AAOD;EAGI,mBAAkB;EAClB,cpC6vBgC;EoC5vBhC,gBpC2vBiC;EoC1vBjC,yBpC0vBiC;EoCzvBjC,eAAc;CACf;;AAQH;ECxCE,erCgpBsC;EqC/oBtC,0BrCgpBsC;EqC/oBtC,sBrCgpB4D;CoCxmB7D;;ACtCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADkCH;EC3CE,erCopBsC;EqCnpBtC,0BrCopBsC;EqCnpBtC,sBrCopByD;CoCzmB1D;;ACzCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADqCH;EC9CE,erCwpBsC;EqCvpBtC,0BrCwpBsC;EqCvpBtC,sBrCypB4D;CoC3mB7D;;AC5CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADwCH;ECjDE,erC6pBsC;EqC5pBtC,0BrC6pBsC;EqC5pBtC,sBrC6pB2D;CoC5mB5D;;AC/CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ACZH;EACE;IAAO,4BAAuC;GxC8xI7C;EwC7xID;IAAK,yBAAwB;GxCgyI5B;CACF;;AwCnyID;EACE;IAAO,4BAAuC;GxC8xI7C;EwC7xID;IAAK,yBAAwB;GxCgyI5B;CACF;;AwCnyID;EACE;IAAO,4BAAuC;GxC8xI7C;EwC7xID;IAAK,yBAAwB;GxCgyI5B;CACF;;AwC9xID;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,iBAAgB;EAChB,mBtC8yBoC;EsC7yBpC,kBtC4yBkC;EsC3yBlC,mBAAkB;EAClB,0BtCkGiC;EMzG/B,uBNgO2B;CsCvN9B;;AAED;EACE,atCqyBkC;EsCpyBlC,kBtCoyBkC;EsCnyBlC,YtC4EW;EsC3EX,0BtCiFc;CsChFf;;AAED;ECaE,8MAA6I;EAA7I,yMAA6I;EAA7I,sMAA6I;EDX7I,mCtC6xBkC;UsC7xBlC,2BtC6xBkC;CsC5xBnC;;AAED;EACE,2DtCgyBgD;OsChyBhD,sDtCgyBgD;UsChyBhD,mDtCgyBgD;CsC/xBjD;;AE7BD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;CACxB;;AAED;EACE,oBAAO;EAAP,gBAAO;MAAP,YAAO;UAAP,aAAO;CACR;;ACHD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EAGtB,gBAAe;EACf,iBAAgB;CACjB;;AAQD;EACE,YAAW;EACX,ezCsFiC;EyCrFjC,oBAAmB;CAapB;;AxCbG;EwCIA,ezCiF+B;EyChF/B,sBAAqB;EACrB,0BzCkF+B;CCrF9B;;AwCNL;EAaI,ezC0E+B;EyCzE/B,0BzC4E+B;CyC3EhC;;AAQH;EACE,mBAAkB;EAClB,eAAc;EACd,yBzCyxBsC;EyCvxBtC,oBzCmLgB;EyClLhB,uBzC8CW;EyC7CX,uCzC8CW;CyCjBZ;;AApCD;EnChCI,gCN0N2B;EMzN3B,iCNyN2B;CyC/K5B;;AAXH;EAcI,iBAAgB;EnChChB,oCN4M2B;EM3M3B,mCN2M2B;CyC1K5B;;AxCpCC;EwCuCA,sBAAqB;CxCpCpB;;AwCiBL;EAwBI,ezC0C+B;EyCzC/B,oBzCgXwC;EyC/WxC,uBzC0BS;CyCzBV;;AA3BH;EA+BI,WAAU;EACV,YzCoBS;EyCnBT,0BzCyBY;EyCxBZ,sBzCwBY;CyCvBb;;AASH;EAEI,gBAAe;EACf,eAAc;EACd,iBAAgB;CACjB;;AALH;EASM,cAAa;CACd;;AAVL;EAeM,iBAAgB;CACjB;;ACnGH;EACE,e1C+oBoC;E0C9oBpC,0B1C+oBoC;C0C9oBrC;;AAGD;;EAEE,e1CwoBoC;C0C5nBrC;;AzCDC;;;EyCRE,e1CqoBkC;E0CpoBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1C+nBkC;E0C9nBlC,sB1C8nBkC;C0C7nBnC;;AAnBH;EACE,e1CmpBoC;E0ClpBpC,0B1CmpBoC;C0ClpBrC;;AAGD;;EAEE,e1C4oBoC;C0ChoBrC;;AzCDC;;;EyCRE,e1CyoBkC;E0CxoBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1CmoBkC;E0CloBlC,sB1CkoBkC;C0CjoBnC;;AAnBH;EACE,e1CupBoC;E0CtpBpC,0B1CupBoC;C0CtpBrC;;AAGD;;EAEE,e1CgpBoC;C0CpoBrC;;AzCDC;;;EyCRE,e1C6oBkC;E0C5oBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1CuoBkC;E0CtoBlC,sB1CsoBkC;C0CroBnC;;AAnBH;EACE,e1C4pBoC;E0C3pBpC,0B1C4pBoC;C0C3pBrC;;AAGD;;EAEE,e1CqpBoC;C0CzoBrC;;AzCDC;;;EyCRE,e1CkpBkC;E0CjpBlC,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B1C4oBkC;E0C3oBlC,sB1C2oBkC;C0C1oBnC;;ACpBL;EACE,mBAAkB;EAClB,eAAc;EACd,YAAW;EACX,WAAU;EACV,iBAAgB;CAoBjB;;AAzBD;EAQI,eAAc;EACd,YAAW;CACZ;;AAVH;;;;;EAiBI,mBAAkB;EAClB,OAAM;EACN,UAAS;EACT,QAAO;EACP,YAAW;EACX,aAAY;EACZ,UAAS;CACV;;AAGH;EAEI,wBAA+B;CAChC;;AAGH;EAEI,oBAA+B;CAChC;;AAGH;EAEI,iBAA8B;CAC/B;;AAGH;EAEI,kBAA8B;CAC/B;;AClDH;EACE,aAAY;EACZ,kB5C24BiD;E4C14BjD,kB5C6PqB;E4C5PrB,eAAc;EACd,Y5C0FW;E4CzFX,0B5CwFW;E4CvFX,YAAW;CAOZ;;A3CQG;E2CZA,Y5CqFS;E4CpFT,sBAAqB;EACrB,aAAY;C3CaX;;A2CHL;EACE,WAAU;EACV,wBAAuB;EACvB,UAAS;EACT,yBAAwB;CACzB;;ACpBD;EACE,iBAAgB;CACjB;;AAGD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c7CkiB8B;E6CjiB9B,cAAa;EACb,iBAAgB;EAGhB,WAAU;CAWX;;AAtBD;EtCPM,oDP+wB8C;EO/wB9C,4CP+wB8C;EO/wB9C,0CP+wB8C;EO/wB9C,oCP+wB8C;EO/wB9C,iGP+wB8C;E6CrvBhD,sCAA6B;OAA7B,iCAA6B;UAA7B,8BAA6B;CAC9B;;AApBH;EAqByB,mCAA0B;OAA1B,8BAA0B;UAA1B,2BAA0B;CAAI;;AAEvD;EACE,mBAAkB;EAClB,iBAAgB;CACjB;;AAGD;EACE,mBAAkB;EAClB,YAAW;EACX,a7CitBgC;C6ChtBjC;;AAGD;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB7C0CW;E6CzCX,qCAA4B;UAA5B,6BAA4B;EAC5B,qC7CyCW;EM3FT,sBNiO0B;E6C3K5B,WAAU;CACX;;AAGD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c7C+e8B;E6C9e9B,uB7C0BW;C6CrBZ;;AAZD;EAUW,WAAU;CAAK;;AAV1B;EAWW,a7CgsBqB;C6ChsBe;;AAK/C;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;EAC9B,c7C4rBgC;E6C3rBhC,iC7C0BiC;C6CzBlC;;AAGD;EACE,iBAAgB;EAChB,iB7C0KoB;C6CzKrB;;AAID;EACE,mBAAkB;EAGlB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,c7CwpBgC;C6CvpBjC;;AAGD;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,sBAAyB;EAAzB,kCAAyB;MAAzB,mBAAyB;UAAzB,0BAAyB;EACzB,c7CgpBgC;E6C/oBhC,8B7CCiC;C6CIlC;;AAVD;EAQyB,oBAAmB;CAAK;;AARjD;EASwB,qBAAoB;CAAK;;AAIjD;EACE,mBAAkB;EAClB,aAAY;EACZ,YAAW;EACX,aAAY;EACZ,iBAAgB;CACjB;;AlClEG;EkCuEF;IACE,iB7CipB+B;I6ChpB/B,kBAAyC;GAC1C;EAMD;IAAY,iB7C0oBqB;G6C1oBG;C/CiiJrC;;AajnJG;EkCoFF;IAAY,iB7CooBqB;G6CpoBG;C/CmiJrC;;AgD9qJD;EACE,mBAAkB;EAClB,c9CmjB8B;E8CljB9B,eAAc;ECFd,mH/CoP4H;E+ClP5H,mBAAkB;EAClB,oB/C0PyB;E+CzPzB,iB/C6PoB;E+C5PpB,iBAAgB;EAChB,kBAAiB;EACjB,sBAAqB;EACrB,kBAAiB;EACjB,qBAAoB;EACpB,uBAAsB;EACtB,mBAAkB;EAClB,qBAAoB;EACpB,oBAAmB;EACnB,iBAAgB;EDRhB,oB9CoPsB;E8ClPtB,sBAAqB;EACrB,WAAU;CA4DX;;AAtED;EAYW,a9CmrBqB;C8CnrBQ;;AAZxC;EAgBI,eAA+B;EAC/B,iB9CirB6B;C8CvqB9B;;AA3BH;EAoBM,UAAS;EACT,UAAS;EACT,kB9C8qB2B;E8C7qB3B,YAAW;EACX,wBAAyD;EACzD,uB9CqEO;C8CpER;;AA1BL;EA8BI,e9CsqB6B;E8CrqB7B,iB9CmqB6B;C8CzpB9B;;AAzCH;EAkCM,SAAQ;EACR,QAAO;EACP,iB9CgqB2B;E8C/pB3B,YAAW;EACX,4BAA8E;EAC9E,yB9CuDO;C8CtDR;;AAxCL;EA4CI,eAA+B;EAC/B,gB9CqpB6B;C8C3oB9B;;AAvDH;EAgDM,OAAM;EACN,UAAS;EACT,kB9CkpB2B;E8CjpB3B,YAAW;EACX,wB9CgpB2B;E8C/oB3B,0B9CyCO;C8CxCR;;AAtDL;EA0DI,e9C0oB6B;E8CzoB7B,kB9CuoB6B;C8C7nB9B;;AArEH;EA8DM,SAAQ;EACR,SAAQ;EACR,iB9CooB2B;E8CnoB3B,YAAW;EACX,4B9CkoB2B;E8CjoB3B,wB9C2BO;C8C1BR;;AAKL;EACE,iB9CknBiC;E8CjnBjC,iB9CsnB+B;E8CrnB/B,Y9CiBW;E8ChBX,mBAAkB;EAClB,uB9CgBW;EM3FT,uBNgO2B;C8C3I9B;;AAfD;EASI,mBAAkB;EAClB,SAAQ;EACR,UAAS;EACT,0BAAyB;EACzB,oBAAmB;CACpB;;AExFH;EACE,mBAAkB;EAClB,OAAM;EACN,QAAO;EACP,chDijB8B;EgDhjB9B,eAAc;EACd,iBhDusByC;EgDtsBzC,ahDosBuC;E+CzsBvC,mH/CoP4H;E+ClP5H,mBAAkB;EAClB,oB/C0PyB;E+CzPzB,iB/C6PoB;E+C5PpB,iBAAgB;EAChB,kBAAiB;EACjB,sBAAqB;EACrB,kBAAiB;EACjB,qBAAoB;EACpB,uBAAsB;EACtB,mBAAkB;EAClB,qBAAoB;EACpB,oBAAmB;EACnB,iBAAgB;ECLhB,oBhDiPsB;EgD/OtB,sBAAqB;EACrB,uBhDgFW;EgD/EX,qCAA4B;UAA5B,6BAA4B;EAC5B,qChD+EW;EM3FT,sBNiO0B;CgDvG7B;;AA9HD;EAyBI,kBhDksBsC;CgD/qBvC;;AA5CH;EA6BM,UAAS;EACT,uBAAsB;CACvB;;AA/BL;EAkCM,chD4rB4D;EgD3rB5D,mBhD2rB4D;EgD1rB5D,sChD2rBmE;CgD1rBpE;;AArCL;EAwCM,cAAwC;EACxC,mBhDkrBoC;EgDjrBpC,uBhDoDO;CgDnDR;;AA3CL;EAgDI,kBhD2qBsC;CgDxpBvC;;AAnEH;EAoDM,SAAQ;EACR,qBAAoB;CACrB;;AAtDL;EAyDM,YhDqqB4D;EgDpqB5D,kBhDoqB4D;EgDnqB5D,wChDoqBmE;CgDnqBpE;;AA5DL;EA+DM,YAAsC;EACtC,kBAA4C;EAC5C,yBhD6BO;CgD5BR;;AAlEL;EAuEI,iBhDopBsC;CgDrnBvC;;AAtGH;EA2EM,UAAS;EACT,oBAAmB;CACpB;;AA7EL;EAgFM,WhD8oB4D;EgD7oB5D,mBhD6oB4D;EgD5oB5D,yChD6oBmE;CgD5oBpE;;AAnFL;EAsFM,WAAqC;EACrC,mBhDooBoC;EgDnoBpC,6BhD0nBuD;CgDznBxD;;AAzFL;EA6FM,mBAAkB;EAClB,OAAM;EACN,UAAS;EACT,eAAc;EACd,YAAW;EACX,mBAAkB;EAClB,YAAW;EACX,iChD8mBuD;CgD7mBxD;;AArGL;EA0GI,mBhDinBsC;CgD9lBvC;;AA7HH;EA8GM,SAAQ;EACR,sBAAqB;CACtB;;AAhHL;EAmHM,ahD2mB4D;EgD1mB5D,kBhD0mB4D;EgDzmB5D,uChD0mBmE;CgDzmBpE;;AAtHL;EAyHM,aAAuC;EACvC,kBAA4C;EAC5C,wBhD7BO;CgD8BR;;AAML;EACE,kBhDilBwC;EgDhlBxC,iBAAgB;EAChB,gBhDqHmB;EgDpHnB,ehD0I8B;EgDzI9B,0BhD2kB2D;EgD1kB3D,iCAAwE;E1C9HtE,2C0C+HyE;E1C9HzE,4C0C8HyE;CAM5E;;AAbD;EAWI,cAAa;CACd;;AAGH;EACE,kBhDskBwC;EgDrkBxC,ehDzCiC;CgD0ClC;;AAOD;;EAEE,mBAAkB;EAClB,eAAc;EACd,SAAQ;EACR,UAAS;EACT,0BAAyB;EACzB,oBAAmB;CACpB;;AAED;EACE,YAAW;EACX,mBhDujBgE;CgDtjBjE;;AACD;EACE,YAAW;EACX,mBhDgjBwC;CgD/iBzC;;AC3KD;EACE,mBAAkB;CACnB;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,iBAAgB;CACjB;;AAED;EACE,mBAAkB;EAClB,cAAa;EACb,YAAW;CAOZ;;ACnBC;EDSF;I1CNM,uDPm4BmD;IOn4BnD,+CPm4BmD;IOn4BnD,6CPm4BmD;IOn4BnD,uCPm4BmD;IOn4BnD,0GPm4BmD;IiDt3BrD,oCAA2B;YAA3B,4BAA2B;IAC3B,4BAAmB;YAAnB,oBAAmB;GAEtB;CnD27JA;;AoDv8J0C;EDE3C;I1CNM,uDPm4BmD;IOn4BnD,+CPm4BmD;IOn4BnD,6CPm4BmD;IOn4BnD,uCPm4BmD;IOn4BnD,0GPm4BmD;IiDt3BrD,oCAA2B;YAA3B,4BAA2B;IAC3B,4BAAmB;YAAnB,oBAAmB;GAEtB;CnDm8JA;;AmDj8JD;;;EAGE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;CACd;;AAED;;EAEE,mBAAkB;EAClB,OAAM;CACP;;AC/BC;EDmCA;;IAEE,wCAA+B;YAA/B,gCAA+B;GAChC;EAED;;IAEE,2CAAkC;YAAlC,mCAAkC;GACnC;EAED;;IAEE,4CAAmC;YAAnC,oCAAmC;GACpC;CnDi8JF;;AoD1+J0C;ED4BzC;;IAEE,wCAA+B;YAA/B,gCAA+B;GAChC;EAED;;IAEE,2CAAkC;YAAlC,mCAAkC;GACnC;EAED;;IAEE,4CAAmC;YAAnC,oCAAmC;GACpC;CnDg9JF;;AmDx8JD;;EAEE,mBAAkB;EAClB,OAAM;EACN,UAAS;EAET,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,WjDqzB+C;EiDpzB/C,YjD0BW;EiDzBX,mBAAkB;EAClB,ajDmzB8C;CiDxyB/C;;AhD3DG;;;EgDsDA,YjDkBS;EiDjBT,sBAAqB;EACrB,WAAU;EACV,YAAW;ChDtDV;;AgDyDL;EACE,QAAO;CACR;;AACD;EACE,SAAQ;CACT;;AAGD;;EAEE,sBAAqB;EACrB,YjDsyBgD;EiDryBhD,ajDqyBgD;EiDpyBhD,gDAA+C;EAC/C,mCAA0B;UAA1B,2BAA0B;CAC3B;;AACD;EACE,8MjD9ByI;CiD+B1I;;AACD;EACE,gNjDjCyI;CiDkC1I;;AAQD;EACE,mBAAkB;EAClB,SAAQ;EACR,aAAY;EACZ,QAAO;EACP,YAAW;EACX,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,gBAAe;EAEf,kBjD+vB+C;EiD9vB/C,iBjD8vB+C;EiD7vB/C,iBAAgB;CAoCjB;;AAhDD;EAeI,mBAAkB;EAClB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,gBjD2vB8C;EiD1vB9C,YjD2vB6C;EiD1vB7C,kBjD2vB6C;EiD1vB7C,iBjD0vB6C;EiDzvB7C,oBAAmB;EACnB,2CjDvCS;CiD4DV;;AA3CH;EA0BM,mBAAkB;EAClB,WAAU;EACV,QAAO;EACP,sBAAqB;EACrB,YAAW;EACX,aAAY;EACZ,YAAW;CACZ;;AAjCL;EAmCM,mBAAkB;EAClB,cAAa;EACb,QAAO;EACP,sBAAqB;EACrB,YAAW;EACX,aAAY;EACZ,YAAW;CACZ;;AA1CL;EA8CI,uBjD/DS;CiDgEV;;AAQH;EACE,mBAAkB;EAClB,WAA6C;EAC7C,aAAY;EACZ,UAA4C;EAC5C,YAAW;EACX,kBAAiB;EACjB,qBAAoB;EACpB,YjDhFW;EiDiFX,mBAAkB;CACnB;;AEhLD;EAAqB,oCAAmC;CAAK;;AAC7D;EAAqB,+BAA8B;CAAK;;AACxD;EAAqB,kCAAiC;CAAK;;AAC3D;EAAqB,kCAAiC;CAAK;;AAC3D;EAAqB,uCAAsC;CAAK;;AAChE;EAAqB,oCAAmC;CAAK;;ACD7D;EACE,0BAAsC;CACvC;;ACHC;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AoDtBH;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AoDtBH;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AoDtBH;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AoDtBH;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AoDtBH;EACE,qCAAmC;CACpC;;ApDiBC;EoDdE,qCAAgD;CpDiBjD;;AqDrBL;EAAmB,qBAAoB;CAAK;;AAC5C;EAAmB,yBAAwB;CAAK;;AAChD;EAAmB,2BAA0B;CAAK;;AAClD;EAAmB,4BAA2B;CAAK;;AACnD;EAAmB,0BAAyB;CAAK;;AAMjD;EhDVI,uBNgO2B;CsDpN9B;;AACD;EhDPI,gCN0N2B;EMzN3B,iCNyN2B;CsDjN9B;;AACD;EhDHI,iCNmN2B;EMlN3B,oCNkN2B;CsD9M9B;;AACD;EhDCI,oCN4M2B;EM3M3B,mCN2M2B;CsD3M9B;;AACD;EhDKI,gCNqM2B;EMpM3B,mCNoM2B;CsDxM9B;;AAED;EACE,mBAAkB;CACnB;;AAED;EACE,iBAAgB;CACjB;;AxBnCC;EACE,eAAc;EACd,YAAW;EACX,YAAW;CACZ;;AyBGC;EAA2B,yBAAwB;CAAK;;AACxD;EAA2B,2BAA0B;CAAK;;AAC1D;EAA2B,iCAAgC;CAAK;;AAChE;EAA2B,0BAAyB;CAAK;;AACzD;EAA2B,0BAAyB;CAAK;;AACzD;EAA2B,+BAA8B;CAAK;;AAC9D;EAA2B,gCAAwB;EAAxB,iCAAwB;EAAxB,gCAAwB;EAAxB,yBAAwB;CAAK;;AACxD;EAA2B,uCAA+B;EAA/B,wCAA+B;EAA/B,uCAA+B;EAA/B,gCAA+B;CAAK;;A5CyC/D;E4ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CzDiyKlE;;AaxvKG;E4ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CzD4zKlE;;AanxKG;E4ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CzDu1KlE;;Aa9yKG;E4ChDA;IAA2B,yBAAwB;GAAK;EACxD;IAA2B,2BAA0B;GAAK;EAC1D;IAA2B,iCAAgC;GAAK;EAChE;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,0BAAyB;GAAK;EACzD;IAA2B,+BAA8B;GAAK;EAC9D;IAA2B,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GAAK;EACxD;IAA2B,uCAA+B;IAA/B,wCAA+B;IAA/B,uCAA+B;IAA/B,gCAA+B;GAAK;CzDk3KlE;;AyDz2KD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,0BAAyB;GAE5B;CzD62KA;;AyD32KD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,2BAA0B;GAE7B;CzD+2KA;;AyD72KD;EACE,yBAAwB;CAKzB;;AAHC;EAHF;IAII,iCAAgC;GAEnC;CzDi3KA;;AyD92KC;EADF;IAEI,yBAAwB;GAE3B;CzDi3KA;;A0D75KG;EAAwB,6BAAS;EAAT,kBAAS;MAAT,mBAAS;UAAT,UAAS;CAAK;;AACtC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AACrC;EAAwB,6BAAQ;EAAR,iBAAQ;MAAR,kBAAQ;UAAR,SAAQ;CAAK;;AAErC;EAAgC,0CAA8B;EAA9B,yCAA8B;EAA9B,uCAA8B;MAA9B,mCAA8B;UAA9B,+BAA8B;CAAK;;AACnE;EAAgC,wCAAiC;EAAjC,yCAAiC;EAAjC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,0CAAsC;EAAtC,0CAAsC;EAAtC,+CAAsC;MAAtC,2CAAsC;UAAtC,uCAAsC;CAAK;;AAC3E;EAAgC,wCAAyC;EAAzC,0CAAyC;EAAzC,kDAAyC;MAAzC,8CAAyC;UAAzC,0CAAyC;CAAK;;AAE9E;EAA8B,mCAA0B;MAA1B,+BAA0B;UAA1B,2BAA0B;CAAK;;AAC7D;EAA8B,qCAA4B;MAA5B,iCAA4B;UAA5B,6BAA4B;CAAK;;AAC/D;EAA8B,2CAAkC;MAAlC,uCAAkC;UAAlC,mCAAkC;CAAK;;AAErE;EAAoC,mCAAsC;EAAtC,+CAAsC;MAAtC,gCAAsC;UAAtC,uCAAsC;CAAK;;AAC/E;EAAoC,iCAAoC;EAApC,6CAAoC;MAApC,8BAAoC;UAApC,qCAAoC;CAAK;;AAC7E;EAAoC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AAC3E;EAAoC,qCAAyC;EAAzC,kDAAyC;MAAzC,kCAAyC;UAAzC,0CAAyC;CAAK;;AAClF;EAAoC,iDAAwC;MAAxC,qCAAwC;UAAxC,yCAAwC;CAAK;;AAEjF;EAAiC,oCAAkC;EAAlC,2CAAkC;MAAlC,iCAAkC;UAAlC,mCAAkC;CAAK;;AACxE;EAAiC,kCAAgC;EAAhC,yCAAgC;MAAhC,+BAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,qCAA8B;EAA9B,uCAA8B;MAA9B,kCAA8B;UAA9B,+BAA8B;CAAK;;AACpE;EAAiC,uCAAgC;EAAhC,yCAAgC;MAAhC,oCAAgC;UAAhC,iCAAgC;CAAK;;AACtE;EAAiC,sCAA+B;EAA/B,wCAA+B;MAA/B,mCAA+B;UAA/B,gCAA+B;CAAK;;AAErE;EAAkC,6CAAoC;MAApC,qCAAoC;UAApC,qCAAoC;CAAK;;AAC3E;EAAkC,2CAAkC;MAAlC,mCAAkC;UAAlC,mCAAkC;CAAK;;AACzE;EAAkC,yCAAgC;MAAhC,sCAAgC;UAAhC,iCAAgC;CAAK;;AACvE;EAAkC,gDAAuC;MAAvC,uCAAuC;UAAvC,wCAAuC;CAAK;;AAC9E;EAAkC,+CAAsC;MAAtC,0CAAsC;UAAtC,uCAAsC;CAAK;;AAC7E;EAAkC,0CAAiC;MAAjC,uCAAiC;UAAjC,kCAAiC;CAAK;;AAExE;EAAgC,oCAA2B;MAA3B,qCAA2B;cAA3B,oCAA2B;UAA3B,4BAA2B;CAAK;;AAChE;EAAgC,0CAAiC;MAAjC,sCAAiC;UAAjC,kCAAiC;CAAK;;AACtE;EAAgC,wCAA+B;MAA/B,oCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,sCAA6B;MAA7B,uCAA6B;cAA7B,sCAA6B;UAA7B,8BAA6B;CAAK;;AAClE;EAAgC,wCAA+B;MAA/B,yCAA+B;UAA/B,gCAA+B;CAAK;;AACpE;EAAgC,uCAA8B;MAA9B,wCAA8B;cAA9B,uCAA8B;UAA9B,+BAA8B;CAAK;;A7CWnE;E6ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;C1D2lLtE;;AahlLG;E6ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;C1D8rLtE;;AanrLG;E6ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;C1DiyLtE;;AatxLG;E6ChDA;IAAwB,6BAAS;IAAT,kBAAS;QAAT,mBAAS;YAAT,UAAS;GAAK;EACtC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EACrC;IAAwB,6BAAQ;IAAR,iBAAQ;QAAR,kBAAQ;YAAR,SAAQ;GAAK;EAErC;IAAgC,0CAA8B;IAA9B,yCAA8B;IAA9B,uCAA8B;QAA9B,mCAA8B;YAA9B,+BAA8B;GAAK;EACnE;IAAgC,wCAAiC;IAAjC,yCAAiC;IAAjC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,0CAAsC;IAAtC,0CAAsC;IAAtC,+CAAsC;QAAtC,2CAAsC;YAAtC,uCAAsC;GAAK;EAC3E;IAAgC,wCAAyC;IAAzC,0CAAyC;IAAzC,kDAAyC;QAAzC,8CAAyC;YAAzC,0CAAyC;GAAK;EAE9E;IAA8B,mCAA0B;QAA1B,+BAA0B;YAA1B,2BAA0B;GAAK;EAC7D;IAA8B,qCAA4B;QAA5B,iCAA4B;YAA5B,6BAA4B;GAAK;EAC/D;IAA8B,2CAAkC;QAAlC,uCAAkC;YAAlC,mCAAkC;GAAK;EAErE;IAAoC,mCAAsC;IAAtC,+CAAsC;QAAtC,gCAAsC;YAAtC,uCAAsC;GAAK;EAC/E;IAAoC,iCAAoC;IAApC,6CAAoC;QAApC,8BAAoC;YAApC,qCAAoC;GAAK;EAC7E;IAAoC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EAC3E;IAAoC,qCAAyC;IAAzC,kDAAyC;QAAzC,kCAAyC;YAAzC,0CAAyC;GAAK;EAClF;IAAoC,iDAAwC;QAAxC,qCAAwC;YAAxC,yCAAwC;GAAK;EAEjF;IAAiC,oCAAkC;IAAlC,2CAAkC;QAAlC,iCAAkC;YAAlC,mCAAkC;GAAK;EACxE;IAAiC,kCAAgC;IAAhC,yCAAgC;QAAhC,+BAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,qCAA8B;IAA9B,uCAA8B;QAA9B,kCAA8B;YAA9B,+BAA8B;GAAK;EACpE;IAAiC,uCAAgC;IAAhC,yCAAgC;QAAhC,oCAAgC;YAAhC,iCAAgC;GAAK;EACtE;IAAiC,sCAA+B;IAA/B,wCAA+B;QAA/B,mCAA+B;YAA/B,gCAA+B;GAAK;EAErE;IAAkC,6CAAoC;QAApC,qCAAoC;YAApC,qCAAoC;GAAK;EAC3E;IAAkC,2CAAkC;QAAlC,mCAAkC;YAAlC,mCAAkC;GAAK;EACzE;IAAkC,yCAAgC;QAAhC,sCAAgC;YAAhC,iCAAgC;GAAK;EACvE;IAAkC,gDAAuC;QAAvC,uCAAuC;YAAvC,wCAAuC;GAAK;EAC9E;IAAkC,+CAAsC;QAAtC,0CAAsC;YAAtC,uCAAsC;GAAK;EAC7E;IAAkC,0CAAiC;QAAjC,uCAAiC;YAAjC,kCAAiC;GAAK;EAExE;IAAgC,oCAA2B;QAA3B,qCAA2B;gBAA3B,oCAA2B;YAA3B,4BAA2B;GAAK;EAChE;IAAgC,0CAAiC;QAAjC,sCAAiC;YAAjC,kCAAiC;GAAK;EACtE;IAAgC,wCAA+B;QAA/B,oCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,sCAA6B;QAA7B,uCAA6B;gBAA7B,sCAA6B;YAA7B,8BAA6B;GAAK;EAClE;IAAgC,wCAA+B;QAA/B,yCAA+B;YAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA8B;QAA9B,wCAA8B;gBAA9B,uCAA8B;YAA9B,+BAA8B;GAAK;C1Do4LtE;;A2D76LG;ECHF,uBAAsB;CDG2B;;AAC/C;ECDF,wBAAuB;CDC2B;;AAChD;ECCF,uBAAsB;CDD2B;;A9CkD/C;E8CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C3Dm8LlD;;Aaj5LG;E8CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C3D+8LlD;;Aa75LG;E8CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C3D29LlD;;Aaz6LG;E8CpDA;ICHF,uBAAsB;GDG2B;EAC/C;ICDF,wBAAuB;GDC2B;EAChD;ICCF,uBAAsB;GDD2B;C3Du+LlD;;A6D3+LD;EACE,gBAAe;EACf,OAAM;EACN,SAAQ;EACR,QAAO;EACP,c3D2iB8B;C2D1iB/B;;AAED;EACE,gBAAe;EACf,SAAQ;EACR,UAAS;EACT,QAAO;EACP,c3DmiB8B;C2DliB/B;;AAED;EACE,yBAAgB;EAAhB,iBAAgB;EAChB,OAAM;EACN,c3D4hB8B;C2D3hB/B;;AClBD;ECEE,mBAAkB;EAClB,WAAU;EACV,YAAW;EACX,WAAU;EACV,iBAAgB;EAChB,uBAAmB;EACnB,oBAAmB;EACnB,8BAAqB;UAArB,sBAAqB;EACrB,UAAS;CDRV;;ACkBC;EAEE,iBAAgB;EAChB,YAAW;EACX,aAAY;EACZ,kBAAiB;EACjB,WAAU;EACV,oBAAmB;EACnB,wBAAe;UAAf,gBAAe;CAChB;;AC7BC;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,sBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,uBAA4B;CAAI;;AAAvD;EAAuB,wBAA4B;CAAI;;AAI3D;EAAU,2BAA0B;CAAK;;AACzC;EAAU,4BAA2B;CAAK;;ACAlC;EAAiC,qBAAmC;CAAI;;AACxE;EAAiC,yBAAuC;CAAI;;AAC5E;EAAiC,2BAAyC;CAAI;;AAC9E;EAAiC,4BAA0C;CAAI;;AAC/E;EAAiC,0BAAwC;CAAI;;AAC7E;EACE,2BAAwC;EACxC,0BAAuC;CACxC;;AACD;EACE,yBAAuC;EACvC,4BAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,0BAAmC;CAAI;;AACxE;EAAiC,8BAAuC;CAAI;;AAC5E;EAAiC,gCAAyC;CAAI;;AAC9E;EAAiC,iCAA0C;CAAI;;AAC/E;EAAiC,+BAAwC;CAAI;;AAC7E;EACE,gCAAwC;EACxC,+BAAuC;CACxC;;AACD;EACE,8BAAuC;EACvC,iCAA0C;CAC3C;;AAZD;EAAiC,wBAAmC;CAAI;;AACxE;EAAiC,4BAAuC;CAAI;;AAC5E;EAAiC,8BAAyC;CAAI;;AAC9E;EAAiC,+BAA0C;CAAI;;AAC/E;EAAiC,6BAAwC;CAAI;;AAC7E;EACE,8BAAwC;EACxC,6BAAuC;CACxC;;AACD;EACE,4BAAuC;EACvC,+BAA0C;CAC3C;;AAZD;EAAiC,0BAAmC;CAAI;;AACxE;EAAiC,8BAAuC;CAAI;;AAC5E;EAAiC,gCAAyC;CAAI;;AAC9E;EAAiC,iCAA0C;CAAI;;AAC/E;EAAiC,+BAAwC;CAAI;;AAC7E;EACE,gCAAwC;EACxC,+BAAuC;CACxC;;AACD;EACE,8BAAuC;EACvC,iCAA0C;CAC3C;;AAZD;EAAiC,wBAAmC;CAAI;;AACxE;EAAiC,4BAAuC;CAAI;;AAC5E;EAAiC,8BAAyC;CAAI;;AAC9E;EAAiC,+BAA0C;CAAI;;AAC/E;EAAiC,6BAAwC;CAAI;;AAC7E;EACE,8BAAwC;EACxC,6BAAuC;CACxC;;AACD;EACE,4BAAuC;EACvC,+BAA0C;CAC3C;;AAZD;EAAiC,sBAAmC;CAAI;;AACxE;EAAiC,0BAAuC;CAAI;;AAC5E;EAAiC,4BAAyC;CAAI;;AAC9E;EAAiC,6BAA0C;CAAI;;AAC/E;EAAiC,2BAAwC;CAAI;;AAC7E;EACE,4BAAwC;EACxC,2BAAuC;CACxC;;AACD;EACE,0BAAuC;EACvC,6BAA0C;CAC3C;;AAZD;EAAiC,4BAAmC;CAAI;;AACxE;EAAiC,gCAAuC;CAAI;;AAC5E;EAAiC,kCAAyC;CAAI;;AAC9E;EAAiC,mCAA0C;CAAI;;AAC/E;EAAiC,iCAAwC;CAAI;;AAC7E;EACE,kCAAwC;EACxC,iCAAuC;CACxC;;AACD;EACE,gCAAuC;EACvC,mCAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,yBAAmC;CAAI;;AACxE;EAAiC,6BAAuC;CAAI;;AAC5E;EAAiC,+BAAyC;CAAI;;AAC9E;EAAiC,gCAA0C;CAAI;;AAC/E;EAAiC,8BAAwC;CAAI;;AAC7E;EACE,+BAAwC;EACxC,8BAAuC;CACxC;;AACD;EACE,6BAAuC;EACvC,gCAA0C;CAC3C;;AAZD;EAAiC,2BAAmC;CAAI;;AACxE;EAAiC,+BAAuC;CAAI;;AAC5E;EAAiC,iCAAyC;CAAI;;AAC9E;EAAiC,kCAA0C;CAAI;;AAC/E;EAAiC,gCAAwC;CAAI;;AAC7E;EACE,iCAAwC;EACxC,gCAAuC;CACxC;;AACD;EACE,+BAAuC;EACvC,kCAA0C;CAC3C;;AAZD;EAAiC,yBAAmC;CAAI;;AACxE;EAAiC,6BAAuC;CAAI;;AAC5E;EAAiC,+BAAyC;CAAI;;AAC9E;EAAiC,gCAA0C;CAAI;;AAC/E;EAAiC,8BAAwC;CAAI;;AAC7E;EACE,+BAAwC;EACxC,8BAAuC;CACxC;;AACD;EACE,6BAAuC;EACvC,gCAA0C;CAC3C;;AAKL;EAAoB,wBAA8B;CAAK;;AACvD;EAAoB,4BAA8B;CAAK;;AACvD;EAAoB,8BAA8B;CAAK;;AACvD;EAAoB,+BAA8B;CAAK;;AACvD;EAAoB,6BAA8B;CAAK;;AACvD;EACE,8BAA6B;EAC7B,6BAA6B;CAC9B;;AACD;EACE,4BAA8B;EAC9B,+BAA8B;CAC/B;;ApDkBD;EoD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;CjE+sNJ;;Aa7rNG;EoD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;CjE6/NJ;;Aa3+NG;EoD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;CjE2yOJ;;AazxOG;EoD/CI;IAAiC,qBAAmC;GAAI;EACxE;IAAiC,yBAAuC;GAAI;EAC5E;IAAiC,2BAAyC;GAAI;EAC9E;IAAiC,4BAA0C;GAAI;EAC/E;IAAiC,0BAAwC;GAAI;EAC7E;IACE,2BAAwC;IACxC,0BAAuC;GACxC;EACD;IACE,yBAAuC;IACvC,4BAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,0BAAmC;GAAI;EACxE;IAAiC,8BAAuC;GAAI;EAC5E;IAAiC,gCAAyC;GAAI;EAC9E;IAAiC,iCAA0C;GAAI;EAC/E;IAAiC,+BAAwC;GAAI;EAC7E;IACE,gCAAwC;IACxC,+BAAuC;GACxC;EACD;IACE,8BAAuC;IACvC,iCAA0C;GAC3C;EAZD;IAAiC,wBAAmC;GAAI;EACxE;IAAiC,4BAAuC;GAAI;EAC5E;IAAiC,8BAAyC;GAAI;EAC9E;IAAiC,+BAA0C;GAAI;EAC/E;IAAiC,6BAAwC;GAAI;EAC7E;IACE,8BAAwC;IACxC,6BAAuC;GACxC;EACD;IACE,4BAAuC;IACvC,+BAA0C;GAC3C;EAZD;IAAiC,sBAAmC;GAAI;EACxE;IAAiC,0BAAuC;GAAI;EAC5E;IAAiC,4BAAyC;GAAI;EAC9E;IAAiC,6BAA0C;GAAI;EAC/E;IAAiC,2BAAwC;GAAI;EAC7E;IACE,4BAAwC;IACxC,2BAAuC;GACxC;EACD;IACE,0BAAuC;IACvC,6BAA0C;GAC3C;EAZD;IAAiC,4BAAmC;GAAI;EACxE;IAAiC,gCAAuC;GAAI;EAC5E;IAAiC,kCAAyC;GAAI;EAC9E;IAAiC,mCAA0C;GAAI;EAC/E;IAAiC,iCAAwC;GAAI;EAC7E;IACE,kCAAwC;IACxC,iCAAuC;GACxC;EACD;IACE,gCAAuC;IACvC,mCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAZD;IAAiC,2BAAmC;GAAI;EACxE;IAAiC,+BAAuC;GAAI;EAC5E;IAAiC,iCAAyC;GAAI;EAC9E;IAAiC,kCAA0C;GAAI;EAC/E;IAAiC,gCAAwC;GAAI;EAC7E;IACE,iCAAwC;IACxC,gCAAuC;GACxC;EACD;IACE,+BAAuC;IACvC,kCAA0C;GAC3C;EAZD;IAAiC,yBAAmC;GAAI;EACxE;IAAiC,6BAAuC;GAAI;EAC5E;IAAiC,+BAAyC;GAAI;EAC9E;IAAiC,gCAA0C;GAAI;EAC/E;IAAiC,8BAAwC;GAAI;EAC7E;IACE,+BAAwC;IACxC,8BAAuC;GACxC;EACD;IACE,6BAAuC;IACvC,gCAA0C;GAC3C;EAKL;IAAoB,wBAA8B;GAAK;EACvD;IAAoB,4BAA8B;GAAK;EACvD;IAAoB,8BAA8B;GAAK;EACvD;IAAoB,+BAA8B;GAAK;EACvD;IAAoB,6BAA8B;GAAK;EACvD;IACE,8BAA6B;IAC7B,6BAA6B;GAC9B;EACD;IACE,4BAA8B;IAC9B,+BAA8B;GAC/B;CjEylPJ;;AkEznPD;EAAiB,+BAA8B;CAAK;;AACpD;EAAiB,+BAA8B;CAAK;;AACpD;ECJE,iBAAgB;EAChB,wBAAuB;EACvB,oBAAmB;CDEsB;;AAQvC;EAAwB,4BAA2B;CAAK;;AACxD;EAAwB,6BAA4B;CAAK;;AACzD;EAAwB,8BAA6B;CAAK;;ArDsC1D;EqDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;ClEmpP7D;;Aa7mPG;EqDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;ClE+pP7D;;AaznPG;EqDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;ClE2qP7D;;AaroPG;EqDxCA;IAAwB,4BAA2B;GAAK;EACxD;IAAwB,6BAA4B;GAAK;EACzD;IAAwB,8BAA6B;GAAK;ClEurP7D;;AkEjrPD;EAAmB,qCAAoC;CAAK;;AAC5D;EAAmB,qCAAoC;CAAK;;AAC5D;EAAmB,sCAAqC;CAAK;;AAI7D;EAAsB,oBhEiOK;CgEjO+B;;AAC1D;EAAsB,kBhEiOC;CgEjOiC;;AACxD;EAAsB,mBAAkB;CAAK;;AAI7C;EACE,uBAAsB;CACvB;;AEnCC;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;AiEtBH;EACE,0BAAwB;CACzB;;AjEiBC;EiEdE,0BAAqC;CjEiBtC;;A+DiCL;EGxDE,YAAW;EACX,mBAAkB;EAClB,kBAAiB;EACjB,8BAA6B;EAC7B,UAAS;CHsDV;;AIxDD;ECDE,+BAAkC;CDGnC;;AAED;ECLE,8BAAkC;CDOnC","file":"bootstrap.css","sourcesContent":[null,null,"/*!\n * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after,\n p::first-letter,\n div::first-letter,\n blockquote::first-letter,\n li::first-letter,\n p::first-line,\n div::first-line,\n blockquote::first-line,\n li::first-line {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"radio\"]:disabled,\ninput[type=\"checkbox\"]:disabled {\n cursor: not-allowed;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n padding: 0.5rem 1rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n border-left: 0.25rem solid #eceeef;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #636c72;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.blockquote-reverse {\n padding-right: 1rem;\n padding-left: 0;\n text-align: right;\n border-right: 0.25rem solid #eceeef;\n border-left: 0;\n}\n\n.blockquote-reverse .blockquote-footer::before {\n content: \"\";\n}\n\n.blockquote-reverse .blockquote-footer::after {\n content: \"\\00A0 \\2014\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #636c72;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f7f7f9;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #292b2c;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #292b2c;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #eceeef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #eceeef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #eceeef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #eceeef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #eceeef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #dff0d8;\n}\n\n.table-hover .table-success:hover {\n background-color: #d0e9c6;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #d0e9c6;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #d9edf7;\n}\n\n.table-hover .table-info:hover {\n background-color: #c4e3f3;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #c4e3f3;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #fcf8e3;\n}\n\n.table-hover .table-warning:hover {\n background-color: #faf2cc;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #faf2cc;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f2dede;\n}\n\n.table-hover .table-danger:hover {\n background-color: #ebcccc;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #ebcccc;\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #292b2c;\n}\n\n.thead-default th {\n color: #464a4c;\n background-color: #eceeef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #292b2c;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #3b3e40;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #464a4c;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #464a4c;\n background-color: #fff;\n border-color: #5cb3fd;\n outline: none;\n}\n\n.form-control::placeholder {\n color: #636c72;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #eceeef;\n opacity: 1;\n}\n\n.form-control:disabled {\n cursor: not-allowed;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-static {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,\n.input-group-sm > .form-control-static.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,\n.input-group-lg > .form-control-static.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-static.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.875rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #636c72;\n cursor: not-allowed;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.form-control-feedback {\n margin-top: 0.25rem;\n}\n\n.form-control-success,\n.form-control-warning,\n.form-control-danger {\n padding-right: 3rem;\n background-repeat: no-repeat;\n background-position: center right 0.5625rem;\n background-size: 1.125rem 1.125rem;\n}\n\n.has-success .form-control-feedback,\n.has-success .form-control-label,\n.has-success .col-form-label,\n.has-success .form-check-label,\n.has-success .custom-control {\n color: #5cb85c;\n}\n\n.has-success .form-control,\n.has-success .custom-select,\n.has-success .custom-file-control {\n border-color: #5cb85c;\n}\n\n.has-success .input-group-addon {\n color: #5cb85c;\n background-color: #eaf6ea;\n border-color: #5cb85c;\n}\n\n.has-success .form-control-success {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E\");\n}\n\n.has-warning .form-control-feedback,\n.has-warning .form-control-label,\n.has-warning .col-form-label,\n.has-warning .form-check-label,\n.has-warning .custom-control {\n color: #f0ad4e;\n}\n\n.has-warning .form-control,\n.has-warning .custom-select,\n.has-warning .custom-file-control {\n border-color: #f0ad4e;\n}\n\n.has-warning .input-group-addon {\n color: #f0ad4e;\n background-color: white;\n border-color: #f0ad4e;\n}\n\n.has-warning .form-control-warning {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E\");\n}\n\n.has-danger .form-control-feedback,\n.has-danger .form-control-label,\n.has-danger .col-form-label,\n.has-danger .form-check-label,\n.has-danger .custom-control {\n color: #d9534f;\n}\n\n.has-danger .form-control,\n.has-danger .custom-select,\n.has-danger .custom-file-control {\n border-color: #d9534f;\n}\n\n.has-danger .input-group-addon {\n color: #d9534f;\n background-color: #fdf7f7;\n border-color: #d9534f;\n}\n\n.has-danger .form-control-danger {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E\");\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n cursor: not-allowed;\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #025aa5;\n border-color: #01549b;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #025aa5;\n background-image: none;\n border-color: #01549b;\n}\n\n.btn-secondary {\n color: #292b2c;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:hover {\n color: #292b2c;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #2aabd2;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #2aabd2;\n}\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #419641;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #419641;\n}\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #eb9316;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #eb9316;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #c12e2a;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #c12e2a;\n}\n\n.btn-outline-primary {\n color: #0275d8;\n background-color: transparent;\n background-image: none;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #0275d8;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-secondary {\n color: #ccc;\n background-color: transparent;\n background-image: none;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:hover {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #ccc;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-info {\n color: #5bc0de;\n background-color: transparent;\n background-image: none;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #5bc0de;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-success {\n color: #5cb85c;\n background-color: transparent;\n background-image: none;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #5cb85c;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-warning {\n color: #f0ad4e;\n background-color: transparent;\n background-image: none;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f0ad4e;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-danger {\n color: #d9534f;\n background-color: transparent;\n background-image: none;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #d9534f;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-link {\n font-weight: normal;\n color: #0275d8;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #014c8c;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #636c72;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.3em;\n vertical-align: middle;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #292b2c;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #eceeef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 3px 1.5rem;\n clear: both;\n font-weight: normal;\n color: #292b2c;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #1d1e1f;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0275d8;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #636c72;\n cursor: not-allowed;\n background-color: transparent;\n}\n\n.show > .dropdown-menu {\n display: block;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #636c72;\n white-space: nowrap;\n}\n\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 0.125rem;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: flex;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #464a4c;\n text-align: center;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #0275d8;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #8fcafe;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n cursor: not-allowed;\n background-color: #eceeef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #636c72;\n cursor: not-allowed;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #0275d8;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #464a4c;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #5cb3fd;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #636c72;\n cursor: not-allowed;\n background-color: #eceeef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n pointer-events: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #636c72;\n cursor: not-allowed;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #eceeef #eceeef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #636c72;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #464a4c;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .nav-item.show .nav-link {\n color: #fff;\n background-color: #0275d8;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n}\n\n@media (max-width: 575px) {\n .navbar > .container,\n .navbar > .container-fluid {\n width: 100%;\n margin-right: 0;\n margin-left: 0;\n }\n}\n\n.navbar-brand {\n display: inline-block;\n align-self: flex-start;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n}\n\n.navbar-toggler {\n align-self: flex-start;\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n align-items: center;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n align-items: center;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n align-items: center;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n align-items: center;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: flex-start;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n align-items: center;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .open > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.open,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-inverse .navbar-brand {\n color: white;\n}\n\n.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {\n color: white;\n}\n\n.navbar-inverse .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-inverse .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse .navbar-nav .open > .nav-link,\n.navbar-inverse .navbar-nav .active > .nav-link,\n.navbar-inverse .navbar-nav .nav-link.open,\n.navbar-inverse .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-inverse .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-inverse .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-inverse .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-block {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: #f7f7f9;\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #f7f7f9;\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-primary {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.card-primary .card-header,\n.card-primary .card-footer {\n background-color: transparent;\n}\n\n.card-success {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.card-success .card-header,\n.card-success .card-footer {\n background-color: transparent;\n}\n\n.card-info {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.card-info .card-header,\n.card-info .card-footer {\n background-color: transparent;\n}\n\n.card-warning {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.card-warning .card-header,\n.card-warning .card-footer {\n background-color: transparent;\n}\n\n.card-danger {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.card-danger .card-header,\n.card-danger .card-footer {\n background-color: transparent;\n}\n\n.card-outline-primary {\n background-color: transparent;\n border-color: #0275d8;\n}\n\n.card-outline-secondary {\n background-color: transparent;\n border-color: #ccc;\n}\n\n.card-outline-info {\n background-color: transparent;\n border-color: #5bc0de;\n}\n\n.card-outline-success {\n background-color: transparent;\n border-color: #5cb85c;\n}\n\n.card-outline-warning {\n background-color: transparent;\n border-color: #f0ad4e;\n}\n\n.card-outline-danger {\n background-color: transparent;\n border-color: #d9534f;\n}\n\n.card-inverse {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer {\n background-color: transparent;\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer,\n.card-inverse .card-title,\n.card-inverse .card-blockquote {\n color: #fff;\n}\n\n.card-inverse .card-link,\n.card-inverse .card-text,\n.card-inverse .card-subtitle,\n.card-inverse .card-blockquote .blockquote-footer {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-link:focus, .card-inverse .card-link:hover {\n color: #fff;\n}\n\n.card-blockquote {\n padding: 0;\n margin-bottom: 0;\n border-left: 0;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group .card {\n flex: 1 0 0;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n margin-bottom: 0.75rem;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #636c72;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #636c72;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.page-item.disabled .page-link {\n color: #636c72;\n pointer-events: none;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #0275d8;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #014c8c;\n text-decoration: none;\n background-color: #eceeef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\na.badge:focus, a.badge:hover {\n color: #fff;\n text-decoration: none;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-default {\n background-color: #636c72;\n}\n\n.badge-default[href]:focus, .badge-default[href]:hover {\n background-color: #4b5257;\n}\n\n.badge-primary {\n background-color: #0275d8;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n background-color: #025aa5;\n}\n\n.badge-success {\n background-color: #5cb85c;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n background-color: #449d44;\n}\n\n.badge-info {\n background-color: #5bc0de;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n background-color: #31b0d5;\n}\n\n.badge-warning {\n background-color: #f0ad4e;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n background-color: #ec971f;\n}\n\n.badge-danger {\n background-color: #d9534f;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n background-color: #c9302c;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #eceeef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-hr {\n border-top-color: #d0d5d8;\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d0e9c6;\n}\n\n.alert-success hr {\n border-top-color: #c1e2b3;\n}\n\n.alert-success .alert-link {\n color: #2b542c;\n}\n\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bcdff1;\n}\n\n.alert-info hr {\n border-top-color: #a6d5ec;\n}\n\n.alert-info .alert-link {\n color: #245269;\n}\n\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faf2cc;\n}\n\n.alert-warning hr {\n border-top-color: #f7ecb5;\n}\n\n.alert-warning .alert-link {\n color: #66512c;\n}\n\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebcccc;\n}\n\n.alert-danger hr {\n border-top-color: #e4b9b9;\n}\n\n.alert-danger .alert-link {\n color: #843534;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #0275d8;\n}\n\n.progress-bar-striped {\n 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);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #464a4c;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #464a4c;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.list-group-item-action:active {\n color: #292b2c;\n background-color: #eceeef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #636c72;\n cursor: not-allowed;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #3c763d;\n background-color: #d0e9c6;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #31708f;\n background-color: #c4e3f3;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #a94442;\n background-color: #ebcccc;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #eceeef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #eceeef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {\n padding: 5px 0;\n margin-top: -3px;\n}\n\n.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {\n padding: 0 5px;\n margin-left: 3px;\n}\n\n.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {\n top: 50%;\n left: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {\n padding: 5px 0;\n margin-top: 3px;\n}\n\n.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {\n top: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {\n padding: 0 5px;\n margin-left: -3px;\n}\n\n.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {\n top: 50%;\n right: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.tooltip-inner::before {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover.popover-top, .popover.bs-tether-element-attached-bottom {\n margin-top: -10px;\n}\n\n.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {\n left: 50%;\n border-bottom-width: 0;\n}\n\n.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {\n bottom: -11px;\n margin-left: -11px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {\n bottom: -10px;\n margin-left: -10px;\n border-top-color: #fff;\n}\n\n.popover.popover-right, .popover.bs-tether-element-attached-left {\n margin-left: 10px;\n}\n\n.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {\n top: 50%;\n border-left-width: 0;\n}\n\n.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {\n left: -11px;\n margin-top: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {\n left: -10px;\n margin-top: -10px;\n border-right-color: #fff;\n}\n\n.popover.popover-bottom, .popover.bs-tether-element-attached-top {\n margin-top: 10px;\n}\n\n.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {\n left: 50%;\n border-top-width: 0;\n}\n\n.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {\n top: -11px;\n margin-left: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {\n top: -10px;\n margin-left: -10px;\n border-bottom-color: #f7f7f7;\n}\n\n.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.popover-left, .popover.bs-tether-element-attached-right {\n margin-left: -10px;\n}\n\n.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {\n top: 50%;\n border-right-width: 0;\n}\n\n.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {\n right: -11px;\n margin-top: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {\n right: -10px;\n margin-top: -10px;\n border-left-color: #fff;\n}\n\n.popover-title {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-title:empty {\n display: none;\n}\n\n.popover-content {\n padding: 9px 14px;\n color: #292b2c;\n}\n\n.popover::before,\n.popover::after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover::after {\n content: \"\";\n border-width: 10px;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n width: 100%;\n}\n\n@media (-webkit-transform-3d) {\n .carousel-item {\n transition: transform 0.6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000px;\n }\n}\n\n@supports (transform: translate3d(0, 0, 0)) {\n .carousel-item {\n transition: transform 0.6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000px;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: flex;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n@media (-webkit-transform-3d) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n }\n .carousel-item-next,\n .active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n }\n .carousel-item-prev,\n .active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n@supports (transform: translate3d(0, 0, 0)) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n }\n .carousel-item-next,\n .active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n }\n .carousel-item-prev,\n .active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 1 0 auto;\n max-width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-faded {\n background-color: #f7f7f7;\n}\n\n.bg-primary {\n background-color: #0275d8 !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #025aa5 !important;\n}\n\n.bg-success {\n background-color: #5cb85c !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #449d44 !important;\n}\n\n.bg-info {\n background-color: #5bc0de !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #31b0d5 !important;\n}\n\n.bg-warning {\n background-color: #f0ad4e !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #ec971f !important;\n}\n\n.bg-danger {\n background-color: #d9534f !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #c9302c !important;\n}\n\n.bg-inverse {\n background-color: #292b2c !important;\n}\n\na.bg-inverse:focus, a.bg-inverse:hover {\n background-color: #101112 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.rounded {\n border-radius: 0.25rem;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-muted {\n color: #636c72 !important;\n}\n\na.text-muted:focus, a.text-muted:hover {\n color: #4b5257 !important;\n}\n\n.text-primary {\n color: #0275d8 !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #025aa5 !important;\n}\n\n.text-success {\n color: #5cb85c !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #449d44 !important;\n}\n\n.text-info {\n color: #5bc0de !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #31b0d5 !important;\n}\n\n.text-warning {\n color: #f0ad4e !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #ec971f !important;\n}\n\n.text-danger {\n color: #d9534f !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #c9302c !important;\n}\n\n.text-gray-dark {\n color: #292b2c !important;\n}\n\na.text-gray-dark:focus, a.text-gray-dark:hover {\n color: #101112 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css b/library/bootstrap/css/bootstrap.min.css
index ed3905e0e..64a3d9e14 100644
--- a/library/bootstrap/css/bootstrap.min.css
+++ b/library/bootstrap/css/bootstrap.min.css
@@ -1,6 +1,6 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 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;-webkit-text-size-adjust:100%;-ms-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:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}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{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;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-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{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 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{display:inline-block;max-width:100%;height:auto;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}.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;margin-left:-5px;list-style:none}.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;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[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 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}.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}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 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}.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}input[type=checkbox],input[type=radio]{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=checkbox]: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,-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,.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}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-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.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],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.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+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}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}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.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;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.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);-webkit-box-shadow:none;box-shadow:none;opacity:.65}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.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.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.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;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.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.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;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.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.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;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.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.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;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.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.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;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.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.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-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.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;-webkit-background-clip:padding-box;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;-webkit-overflow-scrolling:touch;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)}.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-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}}.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-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@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}.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-top:8px;margin-right:15px;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-top:8px;margin-right:-15px;margin-bottom:8px;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)}@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-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-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-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-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-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-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: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>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>.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}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.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}.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{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.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-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.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;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.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-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;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;filter:alpha(opacity=0);opacity:0;line-break:auto}.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-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{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}.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-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;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;background-color:#fff;-webkit-background-clip:padding-box;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);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.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}.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{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}.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: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{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,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;filter:alpha(opacity=90);outline:0;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}}
-/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
+ */@media print{*,::after,::before,blockquote::first-letter,blockquote::first-line,div::first-letter,div::first-line,li::first-letter,li::first-line,p::first-letter,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{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}}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#636c72}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#292b2c;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#292b2c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.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-lg-auto,.col-md,.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-md-auto,.col-sm,.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-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{-webkit-box-flex:0;-webkit-flex:0 0 8.333333%;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-webkit-flex:0 0 16.666667%;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-webkit-flex:0 0 33.333333%;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-webkit-flex:0 0 41.666667%;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-webkit-flex:0 0 58.333333%;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-webkit-flex:0 0 66.666667%;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-webkit-flex:0 0 83.333333%;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-webkit-flex:0 0 91.666667%;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#3b3e40}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem 1rem;font-size:1rem;line-height:1.25;color:#464a4c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-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;-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;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#464a4c;background-color:#fff;border-color:#5cb3fd;outline:0}.form-control::-webkit-input-placeholder{color:#636c72;opacity:1}.form-control::-moz-placeholder{color:#636c72;opacity:1}.form-control:-ms-input-placeholder{color:#636c72;opacity:1}.form-control::placeholder{color:#636c72;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#464a4c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.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,.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-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#636c72;cursor:not-allowed}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:3rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.125rem 1.125rem;background-size:1.125rem 1.125rem}.has-success .col-form-label,.has-success .custom-control,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .custom-file-control,.has-success .custom-select,.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;background-color:#eaf6ea;border-color:#5cb85c}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .col-form-label,.has-warning .custom-control,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .custom-file-control,.has-warning .custom-select,.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;background-color:#fff;border-color:#f0ad4e}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .col-form-label,.has-danger .custom-control,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .custom-file-control,.has-danger .custom-select,.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;background-color:#fdf7f7;border-color:#d9534f}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;line-height:1.25;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#fff;border-color:#ccc}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-color:transparent;background-image:none;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-color:transparent;background-image:none;border-color:#ccc}.btn-outline-secondary:hover{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-color:transparent;background-image:none;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-color:transparent;background-image:none;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-color:transparent;background-image:none;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-color:transparent;background-image:none;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}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.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#292b2c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eceeef}.dropdown-item{display:block;width:100%;padding:3px 1.5rem;clear:both;font-weight:400;color:#292b2c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1d1e1f;text-decoration:none;background-color:#f7f7f9}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0275d8}.dropdown-item.disabled,.dropdown-item:disabled{color:#636c72;cursor:not-allowed;background-color:transparent}.show>.dropdown-menu{display:block}.show>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#636c72;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.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-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.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+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.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-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}.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}[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:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.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{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#464a4c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-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:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0275d8}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8;box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#8fcafe}.custom-control-input:disabled~.custom-control-indicator{cursor:not-allowed;background-color:#eceeef}.custom-control-input:disabled~.custom-control-description{color:#636c72;cursor:not-allowed}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0275d8;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#464a4c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#5cb3fd;outline:0}.custom-select:focus::-ms-value{color:#464a4c;background-color:#fff}.custom-select:disabled{color:#636c72;cursor:not-allowed;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#636c72;cursor:not-allowed}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled{color:#636c72;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#464a4c;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-item.show .nav-link,.nav-pills .nav-link.active{color:#fff;background-color:#0275d8}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:575px){.navbar>.container,.navbar>.container-fluid{width:100%;margin-right:0;margin-left:0}}.navbar-brand{display:inline-block;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-toggler{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .open>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff}.navbar-inverse .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-inverse .navbar-nav .nav-link:focus,.navbar-inverse .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-inverse .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-inverse .navbar-nav .active>.nav-link,.navbar-inverse .navbar-nav .nav-link.active,.navbar-inverse .navbar-nav .nav-link.open,.navbar-inverse .navbar-nav .open>.nav-link{color:#fff}.navbar-inverse .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-inverse .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-inverse .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-block{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f7f7f9;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f7f7f9;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-inverse{color:rgba(255,255,255,.65)}.card-inverse .card-footer,.card-inverse .card-header{background-color:transparent;border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%;margin-bottom:.75rem}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#636c72;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#636c72}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link{color:#636c72;pointer-events:none;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#0275d8;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;text-decoration:none;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-default{background-color:#636c72}.badge-default[href]:focus,.badge-default[href]:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success{background-color:#5cb85c}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d0e9c6}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faf2cc}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebcccc}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#eceeef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#0275d8}.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);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1 0%}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#464a4c;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#464a4c;text-decoration:none;background-color:#f7f7f9}.list-group-item-action:active{color:#292b2c;background-color:#eceeef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#636c72;cursor:not-allowed;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.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: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,button.list-group-item-success.active{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: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,button.list-group-item-info.active{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: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,button.list-group-item-warning.active{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: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,button.list-group-item-danger.active{color:#fff;background-color:#a94442;border-color:#a94442}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.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-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-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;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;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}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #eceeef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #eceeef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#f7f7f7}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-title:empty{display:none}.popover-content{padding:9px 14px;color:#292b2c}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;width:100%}@media (-webkit-transform-3d){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-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}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;-o-transition:-o-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-item-next,.carousel-item-prev,.carousel-item.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}@media (-webkit-transform-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@supports ((-webkit-transform:translate3d(0,0,0)) or (transform:translate3d(0,0,0))){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;max-width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{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}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f7}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#292b2c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#101112!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded{border-radius:.25rem}.rounded-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-right{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#636c72!important}a.text-muted:focus,a.text-muted:hover{color:#4b5257!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#292b2c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#101112!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css.map b/library/bootstrap/css/bootstrap.min.css.map
index 6c7fa40b9..27684094b 100644
--- a/library/bootstrap/css/bootstrap.min.css.map
+++ b/library/bootstrap/css/bootstrap.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKjkCC,MAAA,QACA,gBAAA,UF6DF,QACE,QAAA,IAAA,KAAA,yBHygCD,eAAA,KGlgCC,OHqgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BM/kCC,0BLklCF,gBKnlCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHugCD,OAAA,KGhgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KN+lCD,cAAA,IGjgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHmgCD,WAAA,IAAA,IAAA,YG5/BC,YACA,cAAA,IAEA,GH+/BD,WAAA,KGv/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EHy/BD,OAAA,KGj/BC,SAAA,OF0/BA,KAAM,cEx/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHm/BH,OAAA,KGx+BC,OAAQ,EACR,SAAA,QH0+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMlpCE,IACA,IACA,IACA,INwoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOlpCC,YAAa,IN2pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMppCE,YAAa,INwqCb,YAAa,EACb,MAAO,KAGT,IMxqCE,IAJF,IN2qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM5qCA,WN8qCA,UACA,UANA,SM5qCI,UN8qCJ,SM3qCA,UN6qCA,SAQE,UAAW,IAGb,IMprCE,IAJF,INurCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMvrCA,WNyrCA,UACA,UANA,SMxrCI,UN0rCJ,SMtrCA,UNwrCA,SMxrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPssCC,UAAA,KCSD,EMzsCE,OAAA,EAAA,EAAA,KAEA,MPosCD,cAAA,KO/rCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPssCH,yBO7rCC,MNssCE,UAAW,MMjsCf,OAAA,MAEE,UAAA,IAKF,MP0rCC,KO1rCsB,QAAA,KP6rCtB,iBAAA,QO5rCsB,WP+rCtB,WAAA,KO9rCsB,YPisCtB,WAAA,MOhsCsB,aPmsCtB,WAAA,OOlsCsB,cPqsCtB,WAAA,QOlsCsB,aPqsCtB,YAAA,OOpsCsB,gBPusCtB,eAAA,UOtsCsB,gBPysCtB,eAAA,UOrsCC,iBPwsCD,eAAA,WQ3yCC,YR8yCD,MAAA,KCSD,cOpzCI,MAAA,QAHF,qBDwGF,qBP6sCC,MAAA,QCSD,cO3zCI,MAAA,QAHF,qBD2GF,qBPitCC,MAAA,QCSD,WOl0CI,MAAA,QAHF,kBD8GF,kBPqtCC,MAAA,QCSD,cOz0CI,MAAA,QAHF,qBDiHF,qBPytCC,MAAA,QCSD,aOh1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR01CA,MAAO,KQx1CL,iBAAA,QAHF,mBF8HF,mBP2tCC,iBAAA,QCSD,YQ/1CI,iBAAA,QAHF,mBFiIF,mBP+tCC,iBAAA,QCSD,SQt2CI,iBAAA,QAHF,gBFoIF,gBPmuCC,iBAAA,QCSD,YQ72CI,iBAAA,QAHF,mBFuIF,mBPuuCC,iBAAA,QCSD,WQp3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPsuCD,aO7tCC,eAAgB,INsuChB,OAAQ,KAAK,EAAE,KMpuCf,cAAA,IAAA,MAAA,KAFF,GPkuCC,GCSC,WAAY,EACZ,cAAe,KM9tCf,MP0tCD,MO3tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPkuCD,aO9tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP6tCH,gBOvtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNguCE,WAAY,EM9tCZ,cAAA,KAGA,GADF,GP0tCC,YAAA,WOttCC,GPytCD,YAAA,IOnnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVq6CC,MAAA,KO7nCC,WAAY,MAhFV,cAAA,SPgtCH,YAAA,OOtsCD,kBNgtCE,YAAa,OM1sCjB,0BPssCC,YOrsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPssCD,QAAA,KAAA,KOjsCG,OAAA,EAAA,EAAA,KN0sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMptCzB,yBP+sCC,wBO/sCD,yBNytCE,cAAe,EMnsCb,kBAFA,kBACA,iBPksCH,QAAA,MO/rCG,UAAA,INwsCF,YAAa,WACb,MAAO,KMhsCT,yBP2rCC,yBO3rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP6rCD,aAAA,EOvrCG,WAAA,MNgsCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMhsCX,kCNksCJ,kCMnsCe,iCACX,oCNmsCJ,oCDLC,mCCUC,QAAS,GMjsCX,iCNmsCA,iCMzsCM,gCAOJ,mCNmsCF,mCDLC,kCO7rCC,QAAA,cPksCD,QWv+CC,cAAe,KVg/Cf,WAAY,OACZ,YAAa,WU7+Cb,KXy+CD,IWr+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXu+CD,UAAA,IWn+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV4+CA,MU5+CA,KXq+CD,iBAAA,KW3+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV6+CF,QU7+CE,EXq+CH,UAAA,KWh+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXk+CD,UAAA,WW7+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXi+CH,MAAA,QW59CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb8hDD,cAAA,KYxhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZ+hDH,yBY1hDC,WAkEE,MAAO,OZ69CV,yBY5hDC,WA+DE,MAAO,OZk+CV,0BYzhDC,WCvBA,MAAA,QAGA,iBbmjDD,cAAA,KYthDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdgjDL,SAAA,SchiDG,WAAA,IACE,cAAA,KdkiDL,aAAA,Kc1hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud6hDH,MAAA,Kc7hDG,WdgiDH,MAAA,KchiDG,WdmiDH,MAAA,acniDG,WdsiDH,MAAA,actiDG,UdyiDH,MAAA,IcziDG,Ud4iDH,MAAA,ac5iDG,Ud+iDH,MAAA,ac/iDG,UdkjDH,MAAA,IcljDG,UdqjDH,MAAA,acrjDG,UdwjDH,MAAA,acxjDG,Ud2jDH,MAAA,Ic3jDG,Ud8jDH,MAAA,ac/iDG,UdkjDH,MAAA,YcljDG,gBdqjDH,MAAA,KcrjDG,gBdwjDH,MAAA,acxjDG,gBd2jDH,MAAA,ac3jDG,ed8jDH,MAAA,Ic9jDG,edikDH,MAAA,acjkDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,kBdklED,YAAA,KcllEC,kBdqlED,YAAA,acrlEC,kBdwlED,YAAA,acxlEC,iBd2lED,YAAA,Ic3lEC,iBd8lED,YAAA,ac9lEC,iBdimED,YAAA,acjmEC,iBdomED,YAAA,IcpmEC,iBdumED,YAAA,acvmEC,iBd0mED,YAAA,ac1mEC,iBd6mED,YAAA,Ic7mEC,iBdgnED,YAAA,achnEC,iBdmnED,YAAA,YetrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,QfyrED,YAAA,IevrEC,eAAgB,IAChB,MAAA,KfyrED,WAAA,KelrEC,GACA,WAAA,KfsrED,OexrEC,MAAO,KdmsEP,UAAW,KACX,cAAe,KcvrET,mBd0rER,mBczrEQ,mBAHA,mBACA,mBd0rER,mBDHC,QAAA,IensEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdktEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcrtEA,wCdstEA,wCclrEI,2CANI,2CforEP,WAAA,EezqEG,mBf4qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,Kc/pEpB,6BdkqEA,6BcjqEE,6BAZM,6BfsqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc1qEpB,4Bd6qEA,4Bc7qEA,4BAQQ,4Bf8pEP,4BCMD,4Bc7pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfopEC,oBAAA,IevoEG,yCf0oEH,iBAAA,QehoEC,4BACA,iBAAA,QfooED,uBe9nEG,SAAA,OdyoEF,QAAS,acxoEL,MAAA,KAEA,sBfioEL,sBgB7wEC,SAAA,OfwxEA,QAAS,WACT,MAAO,KAST,0BerxEE,0Bf+wEF,0BAGA,0BexxEM,0BAMJ,0BfgxEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBlyEC,sCAAA,oCfyyEF,sCetxEM,sCf2xEJ,iBAAkB,QASpB,2Be1yEE,2BfoyEF,2BAGA,2Be7yEM,2BAMJ,2BfqyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBvzEC,uCAAA,qCf8zEF,uCe3yEM,uCfgzEJ,iBAAkB,QASpB,wBe/zEE,wBfyzEF,wBAGA,wBel0EM,wBAMJ,wBf0zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB50EC,oCAAA,kCfm1EF,oCeh0EM,oCfq0EJ,iBAAkB,QASpB,2Bep1EE,2Bf80EF,2BAGA,2Bev1EM,2BAMJ,2Bf+0EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBj2EC,uCAAA,qCfw2EF,uCer1EM,uCf01EJ,iBAAkB,QASpB,0Bez2EE,0Bfm2EF,0BAGA,0Be52EM,0BAMJ,0Bfo2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCehtEC,sCADF,oCdwtEA,sCe12EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfotED,cAAA,Ke7pEC,WAAY,OAnDV,mBAAA,yBfmtEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec5qEjB,qCd+qEA,qCcjtEI,qCARM,qCfktET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcvrEV,0Dd0rEA,0Dc1rEA,0DAzBU,0Df4sET,0DCMD,0DAME,YAAa,Ec/rEf,yDdksEA,yDclsEA,yDArBU,yDfgtET,yDCMD,yDAME,aAAc,EDLjB,yDe1sEW,yDEzNV,yDjBk6EC,yDiBj6ED,cAAA,GAMA,SjBk6ED,UAAA,EiB/5EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBi6ED,YAAA,QiB95EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBg6ED,QAAA,aiBr5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ63EJ,mBiBr5EC,mBAAoB,WhBg6EjB,gBAAiB,WgB95EpB,WAAA,WjBy5ED,qBiBv5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBs5ED,YAAA,OiBj5EC,iBACA,QAAA,MAIF,kBhB25EE,QAAS,MgBz5ET,MAAA,KAIF,iBAAA,ahB05EE,OAAQ,KI99ER,uBY2EF,2BjB64EC,wBiB54EC,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjB+4ED,YAAA,IiBr3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJwzET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBh8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJy7ET,aAAA,QIx5EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ25E3B,QAAA,EI15EiC,oCJ65EjC,MAAA,KiBh4EG,yCACA,MAAA,KAQF,0BhBs4EA,iBAAkB,YAClB,OAAQ,EgBn4EN,wBjB63EH,wBiB13EC,iChBq4EA,iBAAkB,KgBn4EhB,QAAA,EAIF,wBACE,iCjB03EH,OAAA,YiB72EC,sBjBg3ED,OAAA,KiB91EG,mBhB02EF,mBAAoB,KAEtB,qDgB32EM,8BjBo2EH,8BiBj2EC,wCAAA,+BhB62EA,YAAa,KgB32EX,iCjBy2EH,iCiBt2EC,2CAAA,kChB02EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBh3EX,iCjB82EH,iCACF,2CiBp2EC,kChBu2EA,0BACA,0BACA,oCACA,2BgBz2EA,YAAA,MhBi3EF,YgBv2EE,cAAA,KAGA,UADA,OjBi2ED,SAAA,SiBr2EC,QAAS,MhBg3ET,WAAY,KgBx2EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBi2EH,aAAA,KiB91EC,cAAe,EhBy2Ef,YAAa,IACb,OAAQ,QgBp2ER,+BjBg2ED,sCiBl2EC,yBACA,gCAIA,SAAU,ShBw2EV,WAAY,MgBt2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB61ED,cAAA,EiB31EC,YAAa,IhBs2Eb,eAAgB,OgBp2EhB,OAAA,QAUA,kCjBo1ED,4BCWC,WAAY,EACZ,YAAa,KgBv1Eb,wCAAA,qCjBm1ED,8BCOD,+BgBh2EI,2BhB+1EJ,4BAME,OAAQ,YDNT,0BiBv1EG,uBAMF,oCAAA,iChB61EA,OAAQ,YDNT,yBiBp1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjBy0ED,WAAA,KiBv0EC,YAAA,IhBk1EA,eAAgB,IgBh1Ed,cAAA,EjB00EH,8BiB5zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBkkFD,QAAA,IAAA,KkBhkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB0kFA,OAAQ,KiBxkFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBy0EH,QAAA,IAAA,KiB/0EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChB81EE,OAAQ,KgBh1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBy0EH,WAAA,KiBr0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBumFD,QAAA,KAAA,KkBrmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjB+mFA,OAAQ,KiB7mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBk1EH,QAAA,KAAA,KiBx1EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBu2EE,OAAQ,KgBz1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBk1EH,WAAA,KiBz0EC,QAAS,KAAK,KAEd,UAAA,KjB00ED,YAAA,UiBt0EG,cjBy0EH,SAAA,SiBp0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBu0ED,OAAA,KiBr0EC,YAAa,KhBg1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBv0EC,uCADA,iCAGA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KDLd,oDiBv0EC,uCADA,iCAKA,MAAO,KhB80EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBruFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ2rFD,2BkBxuFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJgsFD,iCiBz1EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlByuFH,gCiB91EC,MAAO,QCtYL,iBAAA,QlBuuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBnwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJytFD,2BkBtwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8tFD,iCiBp3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuwFH,gCiBz3EC,MAAO,QCzYL,iBAAA,QlBqwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBjyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJuvFD,yBkBpyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ4vFD,+BiB/4EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBqyFH,8BiBp5EC,MAAO,QC5YL,iBAAA,QlBmyFH,aAAA,QiB/4EG,kCjBk5EH,MAAA,QiB/4EG,2CjBk5EH,IAAA,KiBv4EC,mDACA,IAAA,EAEA,YjB04ED,QAAA,MiBvzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjBy3EH,yBiBrvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBw3EH,2BiB1vEC,QAAS,aAxHP,MAAA,KjBq3EH,eAAA,OiBj3EG,kCACA,QAAA,aAmHJ,0BhB4wEE,QAAS,aACT,eAAgB,OgBr3Ed,wCjB82EH,6CiBtwED,2CjBywEC,MAAA,KiB72EG,wCACA,MAAA,KAmGJ,4BhBwxEE,cAAe,EgBp3Eb,eAAA,OAGA,uBADA,oBjB82EH,QAAA,aiBpxEC,WAAY,EhB+xEZ,cAAe,EgBr3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB6xEC,sCiBx2EG,SAAA,SjB22EH,YAAA,EiBh2ED,kDhB42EE,IAAK,GgBl2EL,2BjB+1EH,kCiBh2EG,wBAEA,+BAXF,YAAa,IhBo3Eb,WAAY,EgBn2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjBw1EH,gCACF,YAAA,IiBx3EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjB80EL,yBACF,+CiBn0EC,YAAA,KAEE,UAAW,MjBs0EZ,yBACF,+CmBp6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJ+tFT,YAAA,KmBv6FG,iBAAA,KlBm7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IkB96Ff,kBdzBA,kBACA,WLk8FD,kBCOD,kBADA,WAME,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBh7FhB,WnBy6FD,WmB56FG,WlBw7FF,MAAO,KkBn7FL,gBAAA,Kf6BM,YADR,YJk5FD,iBAAA,KmBz6FC,QAAA,ElBq7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBh+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ05FT,OAAA,kBmBz6FG,mBAAA,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjCM,sCnBktGN,sCmB5sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpB8vGD,YoB3vGC,MAAA,KnBuwGA,iBAAkB,QmBrwGhB,aAAA,QpB+vGH,kBoB7vGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB8vGH,kBoB3vGC,MAAA,KnBuwGA,iBAAkB,QAClB,aAAc,QmBnwGR,mBADJ,mBpB8vGH,kCoB3vGG,MAAA,KnBuwGF,iBAAkB,QAClB,aAAc,QmBnwGN,yBnBywGV,yBAHA,yBmBvwGM,yBnBywGN,yBAHA,yBDFC,wCoBrwGK,wCnBywGN,wCmBpwGE,MAAA,KnB4wGA,iBAAkB,QAClB,aAAc,QmBrwGZ,mBpB6vGH,mBoB7vGG,kCnB0wGF,iBAAkB,KmBtwGV,2BnB2wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBruGA,qCCrCM,qCnB2wGN,qCmBrwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnB+tGD,UmB5tGC,YAAA,IlBwuGA,MAAO,QACP,cAAe,EAEjB,UGzwGE,iBemCE,iBflCM,oBJkwGT,6BmB7tGC,iBAAA,YlByuGA,mBAAoB,KACZ,WAAY,KkBtuGlB,UAEF,iBAAA,gBnB6tGD,gBmB3tGG,aAAA,YnBiuGH,gBmB/tGG,gBAIA,MAAA,QlBuuGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBhuGK,0BAUN,mCATM,mClB2uGJ,MAAO,KmB1yGP,gBAAA,KAGA,mBADA,QpBmyGD,QAAA,KAAA,KmBztGC,UAAW,KlBquGX,YAAa,UmBjzGb,cAAA,IAGA,mBADA,QpB0yGD,QAAA,IAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,ImBxzGb,cAAA,IAGA,mBADA,QpBizGD,QAAA,IAAA,ImB3tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB2tGD,MAAA,KCYD,sBACE,WAAY,IqBz3GZ,6BADF,4BtBk3GC,6BI7rGC,MAAA,KAEQ,MJisGT,QAAA,EsBr3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtBu3GH,WAAA,QAAA,KAAA,OsBl3GC,StBq3GD,QAAA,EsBn3Ga,UtBs3Gb,QAAA,KsBr3Ga,atBw3Gb,QAAA,MsBv3Ga,etB03Gb,QAAA,UsBt3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ2sGT,oBAAA,KuBr5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvBu5GD,WAAA,IAAA,OuBn5GC,WAAY,IAAI,QtBk6GhB,aAAc,IAAI,MAAM,YsBh6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBo5GC,SAAA,SuB94GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtB+5GA,OsB/5GA,IAAA,MAAA,KvBk5GD,OAAA,IAAA,MAAA,gBuB74GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBo8GD,OAAA,IuB96GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvB84GH,YAAA,IuBx4GC,YAAA,WtBw5GA,MAAO,KsBt5GL,YAAA,OvB44GH,0BuB14GG,0BAMF,MAAA,QtBo5GA,gBAAiB,KACjB,iBAAkB,QsBj5GhB,yBAEA,+BADA,+BvBu4GH,MAAA,KuB73GC,gBAAA,KtB64GA,iBAAkB,QAClB,QAAS,EDZV,2BuB33GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvB63GH,OAAA,YuBx3GC,iBAAkB,YAGhB,iBAAA,KvBw3GH,OAAA,0DuBn3GG,qBvBs3GH,QAAA,MuB72GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvBw2GD,UAAA,KuBp2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBs2GD,MAAA,EuBl2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB42GE,MAAO,EsBx2GL,KAAA,KAEA,eACA,sCvB41GH,QAAA,GuBn2GC,WAAY,EtBm3GZ,cAAe,IAAI,OsBx2GjB,cAAA,IAAA,QAEA,uBvB41GH,8CuBv0GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB25GC,yBuBv1GD,6BA1DA,MAAA,EACA,KAAA,KvBq5GD,kC0BpiHG,MAAO,KzBojHP,KAAM,GyBhjHR,W1BsiHD,oB0B1iHC,SAAU,SzB0jHV,QAAS,ayBpjHP,eAAA,OAGA,yB1BsiHH,gBCgBC,SAAU,SACV,MAAO,KyB7iHT,gC1BsiHC,gCCYD,+BAFA,+ByBhjHA,uBANM,uBzBujHN,sBAFA,sBAQE,QAAS,EyBljHP,qB1BuiHH,2B0BliHD,2BACE,iC1BoiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B1iHD,wBAAA,0BzB2jHE,MAAO,KDZR,kB0B/hHD,wBACE,0B1BiiHD,YAAA,I0B5hHC,yE1B+hHD,cAAA,E2BhlHC,4BACG,YAAA,EDsDL,mEzB6iHE,wBAAyB,E0B5lHzB,2BAAA,E3BilHD,6C0B5hHD,8CACE,uBAAA,E1B8hHD,0BAAA,E0B3hHC,sB1B8hHD,MAAA,KCgBD,8D0B/mHE,cAAA,E3BomHD,mE0B3hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB0iHE,uBAAwB,EyBxiHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1BugHD,WAAA,K0BngHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BqgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB1gHlB,yBACA,+BACA,oC1B+/GH,QAAA,M0BtgHC,MAAO,KAcH,MAAA,K1B2/GL,UAAA,KCgBD,oCACE,MAAO,KyBpgHL,8BACA,oC1By/GH,oC0Bp/GC,0CACE,WAAA,K1Bs/GH,YAAA,E2B/pHC,4DACC,cAAA,EAQA,sD3B4pHF,uBAAA,I0Bt/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BkqHF,uBAAA,E0Bv/GC,wBAAyB,EACzB,2BAAA,I1By/GD,0BAAA,ICgBD,uE0BtrHE,cAAA,E3B2qHD,4E0Bt/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bo/GD,QAAA,M0Bx/GC,MAAO,KzBwgHP,aAAc,MyBjgHZ,gBAAA,SAEA,0B1Bq/GH,gC0B9/GC,QAAS,WAYP,MAAA,K1Bq/GH,MAAA,G0Bj/GG,qC1Bo/GH,MAAA,KCgBD,+CACE,KAAM,KyB7+GF,gDAFA,6C1Bs+GL,2D0Br+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BitHD,a4B7sHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BgtHH,0B4BxtHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5BusHH,QAAA,E4BrsHG,MAAA,KACE,MAAA,K5BusHL,cAAA,ECgBD,iCACE,QAAS,EiBnrHT,8BACA,mCACA,sCACA,OAAA,KlBwqHD,QAAA,KAAA,KkBtqHC,UAAA,KjBsrHA,YAAa,UACb,cAAe,IiBrrHb,oClB0qHH,yCkBvqHC,4CjBurHA,OAAQ,KACR,YAAa,KDTd,8C4B/sHD,mDAAA,sD3B0tHA,sCACA,2CiBzrHI,8CjB8rHF,OAAQ,KiB1sHR,8BACA,mCACA,sCACA,OAAA,KlB+rHD,QAAA,IAAA,KkB7rHC,UAAA,KjB6sHA,YAAa,IACb,cAAe,IiB5sHb,oClBisHH,yCkB9rHC,4CjB8sHA,OAAQ,KACR,YAAa,KDTd,8C4B7tHD,mDAAA,sD3BwuHA,sCACA,2CiBhtHI,8CjBqtHF,OAAQ,K2BzuHR,2B5B6tHD,mB4B7tHC,iB3B8uHA,QAAS,W2BzuHX,8D5B6tHC,sD4B7tHD,oDAEE,cAAA,EAEA,mB5B+tHD,iB4B1tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B4tHD,WAAA,O4BztHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B4tHH,4B4BztHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B4tHH,4B4B/uHC,QAAS,KAAK,K3B+vHd,UAAW,K2BruHT,cAAA,IAKJ,wCAAA,qC3BquHE,WAAY,EAEd,uCACA,+BACA,kC0B70HE,6CACG,8CC4GL,6D5BqtHC,wE4BptHC,wBAAA,E5ButHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BhuHA,+D5BstHC,oDCWD,iC0Bl1HE,4CACG,6CCiHH,uBAAA,E5BwtHD,0BAAA,E4BltHC,8BAGA,YAAA,E5BotHD,iB4BxtHC,SAAU,SAUR,UAAA,E5BitHH,YAAA,O4B/sHK,sB5BktHL,SAAA,SCgBD,2BACE,YAAa,K2BxtHb,6BAAA,4B5B4sHD,4B4BzsHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B4sHL,iC6B12HD,uCACE,QAAA,EACA,YAAA,K7B62HD,K6B/2HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B42HL,U6B12HK,SAAA,S5B03HJ,QAAS,M4Bx3HH,QAAA,KAAA,KAMJ,gB7Bu2HH,gB6Bt2HK,gBAAA,K7By2HL,iBAAA,KCgBD,mB4Br3HQ,MAAA,KAGA,yBADA,yB7B02HP,MAAA,K6Bl2HG,gBAAA,K5Bk3HF,OAAQ,YACR,iBAAkB,Y4B/2Hd,aAzCN,mB7B64HC,mBwBh5HC,iBAAA,KACA,aAAA,QAEA,kBxBm5HD,OAAA,I6Bn5HC,OAAQ,IAAI,EA0DV,SAAA,O7B41HH,iBAAA,Q6Bl1HC,c7Bq1HD,UAAA,K6Bn1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bo1HL,aAAA,I6Bn1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bq1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B51HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bi1HP,OAAA,Q6B50HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B2xHH,cAAA,E6BzxHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B0xHH,yB6BztHD,2BA9DM,QAAA,W7B0xHL,MAAA,G6Bn2HD,6BAuFE,cAAA,GAvFF,6B5Bw3HA,aAAc,EACd,cAAe,IDZhB,kC6BtuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7B+wHH,yB6B3uHD,6B5B2vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6B92HD,wC7B+2HD,wC6B72HG,oBAAA,MAIE,c7B+2HL,MAAA,K6B52HK,gB7B+2HL,cAAA,ICgBD,iBACE,YAAa,I4Bv3HP,uBAQR,6B7Bo2HC,6B6Bl2HG,MAAA,K7Bq2HH,iBAAA,Q6Bn2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B41HD,YAAA,E6Bz1HG,e7B41HH,MAAA,K6B11HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B21HH,yB6B1xHD,kBA9DM,QAAA,W7B21HL,MAAA,G6Bl1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B02HE,aAAc,EACd,cAAe,IDZhB,8B6B1yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bm1HH,yB6B/yHD,yB5B+zHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6Bx0HD,oC7By0HD,oC6Bv0HG,oBAAA,MAGA,uB7B00HH,QAAA,K6B/zHC,qBF3OA,QAAA,M3B+iID,yB8BxiIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B0iID,SAAA,S8BliIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9ByiIH,yB8BzhIC,QAgnBE,cAAe,K9B86GlB,yB8BjhIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BkhID,2BAAA,M8BhhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BkhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8Bz7GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BkhID,MAAA,K8BhhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BkhIH,QAAA,gB8B/gIC,OAAA,eACE,eAAA,E9BihIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8B/gIK,mC9B8gIH,oC8BzgIC,cAAe,E7B4hIf,aAAc,G6Bj+GlB,sCAnjBE,mC7ByhIA,WAAY,MDdX,4D8BngID,sC9BogID,mCCkBG,WAAY,O6B3gId,kCANE,gC9BsgIH,4B8BvgIG,0BAuiBF,aAAc,M7Bm/Gd,YAAa,MAEf,yBDZC,kC8B3gIK,gC9B0gIH,4B8B3gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BkgIH,yB8B7/HC,mB7B+gIE,cAAe,G6B1gIjB,qBADA,kB9BggID,SAAA,M8Bz/HC,MAAO,EAggBP,KAAM,E7B4gHN,QAAS,KDdR,yB8B7/HD,qB9B8/HD,kB8B7/HC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BigID,qB8B1/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B4/HD,OAAA,K8B1/HC,QAAA,KAAA,K7B4gIA,UAAW,K6B1gIT,YAAA,KAIA,oBAbJ,oB9BwgIC,gBAAA,K8Bv/HG,kB7B0gIF,QAAS,MDdR,yBACF,iC8Bh/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bm/HD,iBAAA,Y8B/+HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bi/HH,cAAA,I8B5+HG,qBACA,QAAA,EAEA,yB9B++HH,QAAA,M8BrgIC,MAAO,KAyBL,OAAA,I9B++HH,cAAA,I8BpjHD,mCAvbI,WAAA,I9Bg/HH,yB8Bt+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9By+HH,iB8B58HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9Bs+HH,iBAAA,Y8B3kHC,OAAQ,E7B8lHR,mBAAoB,K6Bt/HhB,WAAA,KAGA,kDAqZN,sC9BklHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6Bv/HQ,YAAA,KAmBR,4C9Bs9HD,4C8BvlHG,iBAAkB,M9B4lHnB,yB8B5lHD,YAtYI,MAAA,K9Bq+HH,OAAA,E8Bn+HK,eACA,MAAA,K9Bu+HP,iB8B39HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B4vID,WAAA,IAAA,MAAA,YiBtuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjBwyHH,yBiBpqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBuyHH,2BiBzqHC,QAAS,aAxHP,MAAA,KjBoyHH,eAAA,OiBhyHG,kCACA,QAAA,aAmHJ,0BhBmsHE,QAAS,aACT,eAAgB,OgB5yHd,wCjB6xHH,6CiBrrHD,2CjBwrHC,MAAA,KiB5xHG,wCACA,MAAA,KAmGJ,4BhB+sHE,cAAe,EgB3yHb,eAAA,OAGA,uBADA,oBjB6xHH,QAAA,aiBnsHC,WAAY,EhBstHZ,cAAe,EgB5yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB4sHC,sCiBvxHG,SAAA,SjB0xHH,YAAA,E8BngID,kDAmWE,IAAK,GAvWH,yBACE,yB9B8gIL,cAAA,I8B5/HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJmwIP,YAAA,EACF,OAAA,E8BngIG,mBAAoB,KACtB,WAAA,M9BugID,8B8BngIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3By0IF,uBAAA,I8B//HC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9B+/HD,aACF,MAAA,K8Bl+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9Bu/HH,aAAA,M8B7+HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bg/HH,aAAA,QCmBD,8B6BhgIM,MAAA,KARN,oC9B0/HC,oC8B5+HG,MAAA,Q9B++HH,iBAAA,Y8B1+HK,6B9B6+HL,MAAA,KCmBD,iC6B5/HQ,MAAA,KAKF,uC9By+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bz/HZ,sCAIF,4C9Bu+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bv/HZ,wCAxCR,8C9BihIC,8C8Bn+HG,MAAA,K9Bs+HH,iBAAA,YCmBD,+B6Bt/HM,aAAA,KAGA,qCApDN,qC9B2hIC,iBAAA,KCmBD,yC6Bp/HI,iBAAA,KAOE,iCAAA,6B7Bk/HJ,aAAc,Q6B9+HR,oCAiCN,0C9B+7HD,0C8B3xHC,MAAO,KA7LC,iBAAA,QACA,yB7B8+HR,sD6B5+HU,MAAA,KAKF,4D9By9HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bz+HV,2DAIF,iE9Bu9HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bv+HV,6D9B09HX,mEADE,mE8B1jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bi9HL,MAAA,K8B58HG,mC9B+8HH,MAAA,KCmBD,0B6B/9HM,MAAA,KAIA,gCAAA,gC7Bg+HJ,MAAO,K6Bt9HT,0CARQ,0CASN,mD9Bu8HD,mD8Bt8HC,MAAA,KAFF,gBAKI,iBAAA,K9B08HH,aAAA,QCmBD,8B6B19HM,MAAA,QARN,oC9Bo9HC,oC8Bt8HG,MAAA,K9By8HH,iBAAA,Y8Bp8HK,6B9Bu8HL,MAAA,QCmBD,iC6Bt9HQ,MAAA,QAKF,uC9Bm8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bn9HZ,sCAIF,4C9Bi8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bj9HZ,wCAxCR,8C9B2+HC,8C8B57HG,MAAA,K9B+7HH,iBAAA,YCmBD,+B6B/8HM,aAAA,KAGA,qCArDN,qC9Bq/HC,iBAAA,KCmBD,yC6B78HI,iBAAA,KAME,iCAAA,6B7B48HJ,aAAc,Q6Bx8HR,oCAuCN,0C9Bm5HD,0C8B33HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9Bs7HP,aAAA,Q8Bn7HO,0D9Bs7HP,iBAAA,QCmBD,sD6Bt8HU,MAAA,QAKF,4D9Bm7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bn8HV,2DAIF,iE9Bi7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bj8HV,6D9Bo7HX,mEADE,mE8B1hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bg7HL,MAAA,Q8B36HG,mC9B86HH,MAAA,KCmBD,0B6B97HM,MAAA,QAIA,gCAAA,gC7B+7HJ,MAAO,KgCvkJT,0CH0oBQ,0CGzoBN,mDjCwjJD,mDiCvjJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC2jJD,cAAA,KiChkJC,WAAY,KAQV,iBAAA,QjC2jJH,cAAA,IiCxjJK,eACA,QAAA,ajC4jJL,yBiCxkJC,QAAS,EAAE,IAkBT,MAAA,KjCyjJH,QAAA,SkC5kJC,oBACA,MAAA,KAEA,YlC+kJD,QAAA,akCnlJC,aAAc,EAOZ,OAAA,KAAA,ElC+kJH,cAAA,ICmBD,eiC/lJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCglJL,MAAA,QkC9kJG,gBAAA,KjCimJF,iBAAkB,KiC9lJZ,OAAA,IAAA,MAAA,KPVH,6B3B2lJJ,gCkC7kJG,YAAA,EjCgmJF,uBAAwB,I0BvnJxB,0BAAA,I3BymJD,4BkCxkJG,+BjC2lJF,wBAAyB,IACzB,2BAA4B,IiCxlJxB,uBAFA,uBAGA,0BAFA,0BlC8kJL,QAAA,EkCtkJG,MAAA,QjCylJF,iBAAkB,KAClB,aAAc,KAEhB,sBiCvlJM,4BAFA,4BjC0lJN,yBiCvlJM,+BAFA,+BAGA,QAAA,ElC2kJL,MAAA,KkCloJC,OAAQ,QjCqpJR,iBAAkB,QAClB,aAAc,QiCnlJV,wBAEA,8BADA,8BjColJN,2BiCtlJM,iCjCulJN,iCDZC,MAAA,KkC/jJC,OAAQ,YjCklJR,iBAAkB,KkC7pJd,aAAA,KAEA,oBnC8oJL,uBmC5oJG,QAAA,KAAA,KlC+pJF,UAAW,K0B1pJX,YAAA,U3B4oJD,gCmC3oJG,mClC8pJF,uBAAwB,I0BvqJxB,0BAAA,I3BypJD,+BkC1kJD,kCjC6lJE,wBAAyB,IkC7qJrB,2BAAA,IAEA,oBnC8pJL,uBmC5pJG,QAAA,IAAA,KlC+qJF,UAAW,K0B1qJX,YAAA,I3B4pJD,gCmC3pJG,mClC8qJF,uBAAwB,I0BvrJxB,0BAAA,I3ByqJD,+BoC3qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpC6qJD,aAAA,EoCjrJC,OAAQ,KAAK,EAOX,WAAA,OpC6qJH,WAAA,KCmBD,UmC7rJM,QAAA,OAEA,YACA,eACA,QAAA,apC8qJL,QAAA,IAAA,KoC5rJC,iBAAkB,KnC+sJlB,OAAQ,IAAI,MAAM,KmC5rJd,cAAA,KAnBN,kBpCisJC,kBCmBC,gBAAiB,KmCzrJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnC6tJE,MAAO,KmClrJH,mBAEA,yBADA,yBpCqqJL,sBqCltJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCotJD,WAAA,OqChtJG,YAAA,OpCmuJF,eAAgB,SoCjuJZ,cAAA,MrCotJL,cqCltJK,cAKJ,MAAA,KACE,gBAAA,KrC+sJH,OAAA,QqC1sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StC+uJD,IAAA,KCmBD,eqC7vJM,iBAAA,KALJ,2BD0CF,2BrC4sJC,iBAAA,QCmBD,eqCpwJM,iBAAA,QALJ,2BD8CF,2BrC+sJC,iBAAA,QCmBD,eqC3wJM,iBAAA,QALJ,2BDkDF,2BrCktJC,iBAAA,QCmBD,YqClxJM,iBAAA,QALJ,wBDsDF,wBrCqtJC,iBAAA,QCmBD,eqCzxJM,iBAAA,QALJ,2BD0DF,2BrCwtJC,iBAAA,QCmBD,cqChyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCqxJD,YAAA,OuClxJC,eAAA,OACE,iBAAA,KvCoxJH,cAAA,KuC/wJG,aACA,QAAA,KAGF,YtCkyJA,SAAU,SsChyJR,IAAA,KAMA,0BvC4wJH,eCmBC,IAAK,EsC7xJD,QAAA,IAAA,IvCgxJL,cuC9wJK,cAKJ,MAAA,KtC4xJA,gBAAiB,KsC1xJf,OAAA,QvC4wJH,+BuCxwJC,4BACE,MAAA,QvC0wJH,iBAAA,KuCtwJG,wBvCywJH,MAAA,MuCrwJG,+BvCwwJH,aAAA,IwCj0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCo0JD,eAAA,KwCz0JC,cAAe,KvC41Jf,MAAO,QuCn1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCo0JH,awCl1JC,cAAe,KAmBb,UAAA,KxCk0JH,YAAA,ICmBD,cuCh1JI,iBAAA,QAEA,sBxCi0JH,4BwC31JC,cAAe,KA8Bb,aAAA,KxCg0JH,cAAA,IwC7yJD,sBAfI,UAAA,KxCi0JD,oCwC9zJC,WvCi1JA,YAAa,KuC/0JX,eAAA,KxCi0JH,sBwCvzJD,4BvC00JE,cAAe,KuC90Jb,aAAA,KC5CJ,ezC42JD,cyC32JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJ8rJT,cAAA,IyCx3JC,mBAAoB,OAAO,IAAI,YxC24J1B,cAAe,OAAO,IAAI,YwC93J7B,WAAA,OAAA,IAAA,YAKF,iBzC22JD,eCmBC,aAAc,KACd,YAAa,KwCv3JX,mBA1BJ,kBzCk4JC,kByCv2JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cs4JD,QAAA,K0C14JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Ck4JH,MAAA,QCmBD,mByC/4JI,YAAA,IArBJ,SAyBI,U1C+3JH,cAAA,ECmBD,WyCx4JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1Cy3JH,SAAA,S0Cj3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C46JD,e0Ct3JC,MAAO,QClDL,iBAAA,Q3C26JH,aAAA,Q2Cx6JG,kB3C26JH,iBAAA,Q2Cn7JC,2BACA,MAAA,Q3Cu7JD,Y0C73JC,MAAO,QCtDL,iBAAA,Q3Cs7JH,aAAA,Q2Cn7JG,e3Cs7JH,iBAAA,Q2C97JC,wBACA,MAAA,Q3Ck8JD,e0Cp4JC,MAAO,QC1DL,iBAAA,Q3Ci8JH,aAAA,Q2C97JG,kB3Ci8JH,iBAAA,Q2Cz8JC,2BACA,MAAA,Q3C68JD,c0C34JC,MAAO,QC9DL,iBAAA,Q3C48JH,aAAA,Q2Cz8JG,iB3C48JH,iBAAA,Q4C78JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cm9JP,oBAAA,KAAA,E4C/8JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cq9JP,oBAAA,KAAA,E4Cv9JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cq9JP,oBAAA,KAAA,E4C78JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ26JT,iBAAA,Q4C78JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJ+zJT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C18JC,mBAAoB,MAAM,IAAI,K3Cq+JzB,cAAe,MAAM,IAAI,K4Cp+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5C88JD,iBAAA,oK4Cv8JC,iBAAiB,iK3Cm+JjB,wBAAyB,KAAK,KG/gK9B,gBAAA,KAAA,KJy/JD,qBIv/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C4gKD,UAAA,qBAAA,GAAA,OAAA,S6Cz9JG,sBACA,iBAAA,Q7C69JH,wC4Cx8JC,iBAAkB,yKEzElB,iBAAA,oK9CohKD,iBAAA,iK6Cj+JG,mBACA,iBAAA,Q7Cq+JH,qC4C58JC,iBAAkB,yKE7ElB,iBAAA,oK9C4hKD,iBAAA,iK6Cz+JG,sBACA,iBAAA,Q7C6+JH,wC4Ch9JC,iBAAkB,yKEjFlB,iBAAA,oK9CoiKD,iBAAA,iK6Cj/JG,qBACA,iBAAA,Q7Cq/JH,uC+C5iKC,iBAAkB,yKAElB,iBAAA,oK/C6iKD,iBAAA,iK+C1iKG,O/C6iKH,WAAA,KC4BD,mB8CnkKE,WAAA,E/C4iKD,O+CxiKD,YACE,SAAA,O/C0iKD,KAAA,E+CtiKC,Y/CyiKD,MAAA,Q+CriKG,c/CwiKH,QAAA,MC4BD,4B8C9jKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9C+jKE,cAAe,K8CxjKjB,YAHE,Y/CoiKD,a+ChiKC,QAAA,W/CmiKD,eAAA,I+C/hKC,c/CkiKD,eAAA,O+C7hKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhD6kKD,QAAA,KAAA,KgD1kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BsmKD,4BgDpkKC,cAAe,E/CgmKf,2BAA4B,I+C9lK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CgmKA,MAAO,K+C5lKL,wBAFA,wBhDykKH,6BgDxkKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C4lKA,MAAO,KACP,WAAY,K+CzlKV,0BhDmkKH,gCgDlkKG,gCALF,MAAA,K/CmmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD5kKC,yDAAA,yD/CymKA,MAAO,QDxBR,gDgDhkKC,sDAAA,sD/C6lKA,MAAO,K+CzlKL,wBAEA,8BADA,8BhDmkKH,QAAA,EgDxkKC,MAAA,K/ComKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+CzmKE,8DAYI,6D/C4lKN,uD+CxmKE,8D/C2mKF,6DAKE,MAAO,QDxBR,8CiD1qKG,oDADF,oDAEE,MAAA,QAEA,yBhDusKF,MAAO,QgDrsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDwsKJ,MAAO,QDtBR,gCiDhrKO,gCAGF,qCAFE,qChD2sKN,MAAO,QACP,iBAAkB,QAEpB,iCgDvsKQ,uCAFA,uChD0sKR,sCDtBC,4CiDnrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDouKF,MAAO,QgDluKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDquKJ,MAAO,QDtBR,6BiD7sKO,6BAGF,kCAFE,kChDwuKN,MAAO,QACP,iBAAkB,QAEpB,8BgDpuKQ,oCAFA,oChDuuKR,mCDtBC,yCiDhtKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDiwKF,MAAO,QgD/vKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDkwKJ,MAAO,QDtBR,gCiD1uKO,gCAGF,qCAFE,qChDqwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDjwKQ,uCAFA,uChDowKR,sCDtBC,4CiD7uKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhD8xKF,MAAO,QgD5xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhD+xKJ,MAAO,QDtBR,+BiDvwKO,+BAGF,oCAFE,oChDkyKN,MAAO,QACP,iBAAkB,QAEpB,gCgD9xKQ,sCAFA,sChDiyKR,qCDtBC,2CiD1wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJ6uKT,OAAA,IAAA,MAAA,YkDnyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDqyKD,WAAA,EAAA,IAAA,IAAA,gBkD/xKC,YACA,QAAA,KvBnBC,e3BuzKF,QAAA,KAAA,KkDtyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDmyKH,wBAAA,IkD7xKC,0CACA,MAAA,QAEA,alDgyKD,WAAA,EkDpyKC,cAAe,EjDg0Kf,UAAW,KACX,MAAO,QDtBR,oBkD1xKC,sBjDkzKF,eiDxzKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3Bs0KF,iBAAA,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiD94KA,gEjDg5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD35KA,+CjDy5KA,+CiDl0KU,+CjDq0KV,iEiD55KA,iEjD05KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDn0KU,8CjDq0KV,8CiDr6KA,8CjDo6KA,gEDtBC,gECwBD,gEiDh0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDmyKD,OAAA,EkD/xKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDkyKL,cAAA,IkD7xKG,2BlDgyKH,WAAA,IC4BD,4BiDxzKM,cAAA,EAKF,wDAvBJ,wDlDqzKC,WAAA,IAAA,MAAA,KkD5xKK,2BlD+xKL,WAAA,EmDlhLC,uDnDqhLD,cAAA,IAAA,MAAA,KmDlhLG,eACA,aAAA,KnDshLH,8BmDxhLC,MAAA,KAMI,iBAAA,QnDqhLL,aAAA,KmDlhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDmhLL,iBAAA,KmDpiLC,yDnDuiLD,oBAAA,KmDpiLG,eACA,aAAA,QnDwiLH,8BmD1iLC,MAAA,KAMI,iBAAA,QnDuiLL,aAAA,QmDpiLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDqiLL,iBAAA,KmDtjLC,yDnDyjLD,oBAAA,QmDtjLG,eACA,aAAA,QnD0jLH,8BmD5jLC,MAAA,QAMI,iBAAA,QnDyjLL,aAAA,QmDtjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDujLL,iBAAA,QmDxkLC,yDnD2kLD,oBAAA,QmDxkLG,YACA,aAAA,QnD4kLH,2BmD9kLC,MAAA,QAMI,iBAAA,QnD2kLL,aAAA,QmDxkLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnDykLL,iBAAA,QmD1lLC,sDnD6lLD,oBAAA,QmD1lLG,eACA,aAAA,QnD8lLH,8BmDhmLC,MAAA,QAMI,iBAAA,QnD6lLL,aAAA,QmD1lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD2lLL,iBAAA,QmD5mLC,yDnD+mLD,oBAAA,QmD5mLG,cACA,aAAA,QnDgnLH,6BmDlnLC,MAAA,QAMI,iBAAA,QnD+mLL,aAAA,QmD5mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnD6mLL,iBAAA,QoD5nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpD+nLD,QAAA,MoDpoLC,OAAQ,EnDgqLR,QAAS,EACT,SAAU,OAEZ,yCmDtpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpD+nLH,KAAA,EoD1nLC,MAAO,KACP,OAAA,KpD4nLD,OAAA,EoDvnLC,wBpD0nLD,eAAA,OqDppLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJgmLT,OAAA,IAAA,MAAA,QqD/pLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBqrLD,MAAA,KsD7qLC,YAAA,EAAA,IAAA,EAAA,KrDysLA,OAAQ,kBqDvsLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrB6rLD,gBAAA,KsDzqLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD2qLH,QAAA,EuDhsLC,OAAQ,QACR,WAAA,IvDksLD,OAAA,EuD7rLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvD6rLD,QAAA,KuD1rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJ6gLT,kBAAA,kBuDhsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJwlLT,kBAAA,euDpsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDqsLD,cuDhsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD4tLA,OsD5tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDksLD,cAAA,IuD9rLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDgsLD,OAAA,EuD9rLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDgsLD,cAAA,IAAA,MAAA,QuD3rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD0rLD,cuD5rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDsrLH,YAAA,IuDlrLG,mCvDqrLH,YAAA,KuD/qLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDkrLD,IAAA,QuDhqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDgrLD,yBuD7qLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evD+qLX,WAAA,EAAA,IAAA,KAAA,euDzqLD,UAFA,MAAA,OvDirLD,yBwD/zLC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBs1LD,YAAA,OwD30LC,OAAA,iBnCdA,QAAA,ErB61LD,WAAA,KwD90LY,YAAmB,OAAA,kBxDk1L/B,QAAA,GwDj1LY,aAAmB,QAAA,IAAA,ExDq1L/B,WAAA,KwDp1LY,eAAmB,QAAA,EAAA,IxDw1L/B,YAAA,IwDv1LY,gBAAmB,QAAA,IAAA,ExD21L/B,WAAA,IwDt1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxDy1LD,QAAA,IAAA,IwDr1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exDu1LD,SAAA,SwDn1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDq1LH,OAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDq1LH,MAAA,IwDn1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDq1LH,OAAA,EwDn1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDq1LH,IAAA,IwDn1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDq1LH,IAAA,IwDn1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDq1LH,IAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDq1LH,IAAA,EwDn1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDq1LH,IAAA,E0Dl7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJk5LT,OAAA,IAAA,MAAA,e0D77LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dg8Lb,WAAA,EAAA,IAAA,KAAA,e0D/7La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dq8LD,QAAA,IAAA,K0Dl8LC,OAAQ,EACR,UAAA,K1Do8LD,iBAAA,Q0D57LC,cAAA,IAAA,MAAA,QzDy9LA,cAAe,IAAI,IAAI,EAAE,EyDt9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1D87LH,SAAA,S0D37LC,QAAS,MACT,MAAA,E1D67LD,OAAA,E0D37LC,aAAc,YACd,aAAA,M1D87LD,gB0Dz7LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D27LH,OAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1D67LL,0B0Dz7LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D27LH,IAAA,I0D17LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1D67LL,4B0Dz7LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D27LH,IAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1D67LL,6B0Dx7LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D07LH,IAAA,I0Dz7LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D47LL,2B2DpjMC,MAAO,IACP,OAAA,M3DsjMD,QAAA,I2DnjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DqjMD,SAAA,S2DljMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ04LN,sB2D/jMC,SAAU,S1D4lMV,QAAS,K0D9kML,mBAAA,IAAA,YAAA,K3DqjML,cAAA,IAAA,YAAA,K2D3hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJ86LP,cAAA,aAAA,IAAA,Y2DzjMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D4jML,YAAA,OI58LD,mCHs+LA,2BGr+LQ,KAAA,EuD5GF,kBAAA,sB3D6jML,UAAA,sBC2BD,kCADA,2BG5+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DomMD,gC2DpmMC,iC1D+nME,KAAM,E0DllMN,kBAAA,mB3D4jMH,UAAA,oBAGA,wB2D5mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D0jMH,KAAA,E2DtjMG,sB3DyjMH,sB2DrnMC,SAAU,SA+DR,IAAA,E3DyjMH,MAAA,KC0BD,sB0D/kMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3DwjMH,KAAA,E2D/iMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DmjMD,UAAA,K2D9iMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CqpMH,uB2DljMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7C6pMH,KAAA,K2DpjMC,iBAAA,sE1DglMA,iBAAiB,iE0D9kMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DslMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0D7kMN,QAAA,EACA,QAAA,G3DwjMH,0C2DhmMD,2CA2CI,6BADA,6B1DklMF,SAAU,S0D7kMR,IAAA,IACA,QAAA,E3DqjMH,QAAA,a2DrmMC,WAAY,MAqDV,0CADA,6B3DsjMH,KAAA,I2D1mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DmjMH,MAAA,K2D9iMG,OAAA,KACE,YAAA,M3DgjML,YAAA,E2DriMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3DwiMD,KAAA,I2DjjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3D8hMH,OAAA,I2D7jMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3D8hMH,cAAA,K2DthMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3DyhMD,KAAA,I2DxhMC,QAAA,GACE,YAAA,K3D0hMH,eAAA,K2Dj/LC,MAAO,KAhCP,WAAA,O1D8iMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D3iMM,YAAA,KAEA,oCACA,0C3DmhMH,2C2D3hMD,6BAAA,6BAYI,MAAA,K3DmhMH,OAAA,K2D/hMD,WAAA,M1D2jME,UAAW,KDxBZ,0C2D9gMD,6BACE,YAAA,MAEA,2C3DghMD,6B2D5gMD,aAAA,M3D+gMC,kBACF,MAAA,I4D7wMC,KAAA,I3DyyME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DpzME,oBAAA,qBAAA,oBAAA,qB3D2zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2D/zMI,a3Dq0MJ,cDvBC,kB4D7yMG,mB3DqzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6D/0MC,oB5Dk2MF,W+B51MA,uBhCo0MC,qB4D5zMG,cChBF,aACA,kB5D+1MF,W+Br1ME,MAAO,KhCy0MR,cgCt0MC,QAAS,MACT,aAAA,KhCw0MD,YAAA,KgC/zMC,YhCk0MD,MAAA,gBgC/zMC,WhCk0MD,MAAA,egC/zMC,MhCk0MD,QAAA,e8Dz1MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCg0MD,MAAA,YgCzzMC,YAAa,KACb,iBAAA,YhC2zMD,OAAA,E+D31MC,Q/D81MD,QAAA,eC4BD,OACE,SAAU,M+Dn4MV,chE42MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dp5MT,kBhEs4MC,mBgEr4MD,yBhEi4MD,kB+Dl1MD,mBA6IA,yB9D4tMA,kBACA,mB8Dj3ME,yB9D62MF,kBACA,mBACA,yB+Dv5MY,QAAA,eACV,yBAAU,YhE04MT,QAAA,gBC4BD,iB+Dp6MU,QAAA,gBhE64MX,c+D51MG,QAAS,oB/Dg2MV,c+Dl2MC,c/Dm2MH,QAAA,sB+D91MG,yB/Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n 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');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.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 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.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 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .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 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .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 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .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 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n 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');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.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 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.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 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .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 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .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 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .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 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 9.3, iOS doesn't support `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","dist/css/bootstrap.css","../../scss/_reboot.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_transforms.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"AAAA;;;;;ACWE,aACE,ECHF,QADA,SAIA,yBAIA,uBALA,kBAIA,gBAFA,iBAIA,eAPA,gBAIA,cDYI,YAAA,eAEA,mBAAA,eAAA,WAAA,eAGF,ECRF,UDUI,gBAAA,UAQF,mBACE,QAAA,KAAA,YAAA,IAcF,IACE,YAAA,mBCxBJ,WD0BE,IAEE,OAAA,IAAA,MAAA,KACA,kBAAA,MAQF,MACE,QAAA,mBC9BJ,IDiCE,GAEE,kBAAA,MC/BJ,GACA,GDiCE,EAGE,QAAA,EACA,OAAA,EAGF,GCnCF,GDqCI,iBAAA,MAMF,QACE,QAAA,KAEF,OACE,OAAA,IAAA,MAAA,KAGF,OACE,gBAAA,mBADF,UCrCF,UD0CM,iBAAA,eCtCN,mBDyCE,mBAGI,OAAA,IAAA,MAAA,gBE5FR,KACE,mBAAA,WAAA,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,EDwDA,QADA,SCpDE,mBAAA,QAAA,WAAA,QAKA,cAAgB,MAAA,aASlB,KACE,OAAA,EACA,YAAA,aAAA,CAAA,SAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KCgDF,sBDvCE,QAAA,YASF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KD6BF,0BCnBA,YAEE,gBAAA,UACA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QDuBF,GCpBA,GDmBA,GChBE,WAAA,EACA,cAAA,KAGF,MDoBA,MACA,MAFA,MCfE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,EDmBA,OCjBE,YAAA,OAGF,MACE,UAAA,IAQF,IDcA,ICZE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QEhLE,QFmLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KErLE,oCAAA,oCFwLA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EDYJ,KACA,ICJA,IDKA,KCDE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,ODNF,cCoBA,EDtBA,KACA,OAEA,MACA,MACA,OACA,QACA,SCwBE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBDlCF,OCqCA,MDnCA,SADA,OAEA,SCuCE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,ODrCA,MCuCE,SAAA,QAGF,ODrCA,OCuCE,eAAA,KDjCF,aACA,cCsCA,ODxCA,mBC4CE,mBAAA,ODrCF,gCACA,+BACA,gCCuCA,yBAIE,QAAA,EACA,aAAA,KDtCF,qBCyCA,kBAEE,mBAAA,WAAA,WAAA,WACA,QAAA,EDrCF,8BCkCA,2BASI,OAAA,YAKJ,iBD1CA,2BACA,kBAFA,iBCoDE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SC7DF,yCFOA,yCC4DE,OAAA,KC9DF,cDsEE,eAAA,KACA,mBAAA,KClEF,4CFOA,yCCoEE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KC/EF,SDqFE,QAAA,eD1EF,IAAK,IAAK,IAAK,IAAK,IAAK,IIpZzB,GAAA,GAAA,GAAA,GAAA,GAAA,GAEE,cAAA,MACA,YAAA,QACA,YAAA,IACA,YAAA,IACA,MAAA,QAGF,IAAA,GAAU,UAAA,OACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,QACV,IAAA,GAAU,UAAA,OACV,IAAA,GAAU,UAAA,QACV,IAAA,GAAU,UAAA,KAEV,MACE,UAAA,QACA,YAAA,IAIF,WACE,UAAA,KACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAEF,WACE,UAAA,OACA,YAAA,IACA,YAAA,IAQF,GACE,WAAA,KACA,cAAA,KACA,OAAA,EACA,WAAA,IAAA,MAAA,eJqaF,OI7ZA,MAEE,UAAA,IACA,YAAA,IJgaF,MI7ZA,KAEE,QAAA,KACA,iBAAA,QAQF,eC7EE,aAAA,EACA,WAAA,KDiFF,aClFE,aAAA,EACA,WAAA,KDoFF,kBACE,QAAA,aADF,mCAII,aAAA,IAUJ,YACE,UAAA,IACA,eAAA,UAIF,YACE,QAAA,MAAA,KACA,cAAA,KACA,UAAA,QACA,YAAA,OAAA,MAAA,QAGF,mBACE,QAAA,MACA,UAAA,IACA,MAAA,QAHF,2BAMI,QAAA,cAKJ,oBACE,cAAA,KACA,aAAA,EACA,WAAA,MACA,aAAA,OAAA,MAAA,QACA,YAAA,EAGF,+CAEI,QAAA,GAFJ,8CAKI,QAAA,cErIJ,WCIE,UAAA,KAGA,OAAA,KDDF,eACE,QAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,KEZE,cAAA,OCCE,mBAAA,IAAA,IAAA,YAAA,cAAA,IAAA,IAAA,YAAA,WAAA,IAAA,IAAA,YFMJ,UAAA,KAGA,OAAA,KDeF,QAEE,QAAA,aAGF,YACE,cAAA,MACA,YAAA,EAGF,gBACE,UAAA,IACA,MAAA,QIxCF,KV+jBA,IACA,IACA,KU7jBE,YAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UAIF,KACE,QAAA,MAAA,MACA,UAAA,IACA,MAAA,QACA,iBAAA,QFTE,cAAA,OEaF,OACE,QAAA,EACA,MAAA,QACA,iBAAA,QAKJ,IACE,QAAA,MAAA,MACA,UAAA,IACA,MAAA,KACA,iBAAA,QFzBE,cAAA,MEqBJ,QASI,QAAA,EACA,UAAA,KACA,YAAA,IAMJ,IACE,QAAA,MACA,WAAA,EACA,cAAA,KACA,UAAA,IACA,MAAA,QALF,SASI,QAAA,EACA,UAAA,QACA,MAAA,QACA,iBAAA,YACA,cAAA,EAKJ,gBACE,WAAA,MACA,WAAA,OCzDA,WCAA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,0BFnDF,WCMI,cAAA,KACA,aAAA,MC4CF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,yBFnDF,WCiBI,MAAA,MACA,UAAA,MCiCF,0BFnDF,WCiBI,MAAA,OACA,UAAA,MDNJ,iBCZA,aAAA,KACA,YAAA,KAKI,cAAA,KACA,aAAA,KC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,yBFvCF,iBCNI,cAAA,KACA,aAAA,MC4CF,0BFvCF,iBCNI,cAAA,KACA,aAAA,MDeJ,KCYA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KAKI,aAAA,MACA,YAAA,MCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,yBF7BF,KCkBI,aAAA,MACA,YAAA,OCUF,0BF7BF,KCkBI,aAAA,MACA,YAAA,ODbJ,YACE,aAAA,EACA,YAAA,EAFF,iBXsuBF,0BWhuBM,cAAA,EACA,aAAA,EGjCJ,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdswBF,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aczwBI,SAAA,SACA,MAAA,KACA,WAAA,IFsBE,cAAA,KACA,aAAA,KCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdoxBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aY/vBI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdgyBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aY3wBI,cAAA,KACA,aAAA,MCuBF,yBCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,Od4yBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aYvxBI,cAAA,KACA,aAAA,MCuBF,0BCjDF,KAAA,OAAA,QAAA,QAAA,QAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OAAA,OdwzBA,UAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aAFkJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACnG,aAEqJ,QAAvI,UAAmG,WAAY,WAAY,WAAhH,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UACtG,aYnyBI,cAAA,KACA,aAAA,MEFA,KACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,UACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,OF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,QF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,QFqCR,MAAA,KErCQ,QFqCR,MAAA,UErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,WErCQ,QFqCR,MAAA,IErCQ,SFqCR,MAAA,WErCQ,SFqCR,MAAA,WErCQ,SFqCR,MAAA,KErCQ,QFiCR,KAAA,KEjCQ,QFiCR,KAAA,UEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,WEjCQ,QFiCR,KAAA,IEjCQ,SFiCR,KAAA,WEjCQ,SFiCR,KAAA,WEjCQ,SFiCR,KAAA,KExBQ,UFoBR,YAAA,UEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,WEpBQ,UFoBR,YAAA,IEpBQ,WFoBR,YAAA,WEpBQ,WFoBR,YAAA,WCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YCtBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,UAAA,SAAA,EAAA,EAAA,UAAA,KAAA,EAAA,EAAA,UAKA,UAAA,UEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,UF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,IAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,IAKA,UAAA,IEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,WAAA,SAAA,EAAA,EAAA,WAAA,KAAA,EAAA,EAAA,WAKA,UAAA,WEhCM,WF2BN,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAKA,UAAA,KEzBQ,WFqCR,MAAA,KErCQ,WFqCR,MAAA,UErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,WErCQ,WFqCR,MAAA,IErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,WErCQ,YFqCR,MAAA,KErCQ,WFiCR,KAAA,KEjCQ,WFiCR,KAAA,UEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,WEjCQ,WFiCR,KAAA,IEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,WEjCQ,YFiCR,KAAA,KExBQ,aFoBR,YAAA,EEpBQ,aFoBR,YAAA,UEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,WEpBQ,aFoBR,YAAA,IEpBQ,cFoBR,YAAA,WEpBQ,cFoBR,YAAA,YG1EF,OACE,MAAA,KACA,UAAA,KACA,cAAA,KACA,iBAAA,Yfw7DF,Ue57DA,UAQI,QAAA,OACA,eAAA,IACA,WAAA,IAAA,MAAA,QAVJ,gBAcI,eAAA,OACA,cAAA,IAAA,MAAA,QAfJ,mBAmBI,WAAA,IAAA,MAAA,QAnBJ,cAuBI,iBAAA,Kfy7DJ,aeh7DA,aAGI,QAAA,MASJ,gBACE,OAAA,IAAA,MAAA,Qf46DF,mBe76DA,mBAKI,OAAA,IAAA,MAAA,Qf66DJ,yBel7DA,yBAWM,oBAAA,IAUN,yCAEI,iBAAA,gBASJ,4BAGM,iBAAA,iBC9EJ,chB2+DF,iBADA,iBgBt+DM,iBAAA,iBAMJ,iCAKM,iBAAA,iBALN,oChB0+DF,oCgBj+DU,iBAAA,iBAnBR,ehB0/DF,kBADA,kBgBr/DM,iBAAA,QAMJ,kCAKM,iBAAA,QALN,qChBy/DF,qCgBh/DU,iBAAA,QAnBR,YhBygEF,eADA,egBpgEM,iBAAA,QAMJ,+BAKM,iBAAA,QALN,kChBwgEF,kCgB//DU,iBAAA,QAnBR,ehBwhEF,kBADA,kBgBnhEM,iBAAA,QAMJ,kCAKM,iBAAA,QALN,qChBuhEF,qCgB9gEU,iBAAA,QAnBR,chBuiEF,iBADA,iBgBliEM,iBAAA,QAMJ,iCAKM,iBAAA,QALN,oChBsiEF,oCgB7hEU,iBAAA,QDkFV,kBAEI,MAAA,KACA,iBAAA,QAIJ,kBAEI,MAAA,QACA,iBAAA,QAIJ,eACE,MAAA,KACA,iBAAA,Qf+8DF,kBej9DA,kBfk9DA,wBe38DI,aAAA,QAPJ,8BAWI,OAAA,EAXJ,uDAgBM,iBAAA,sBAhBN,0CAuBQ,iBAAA,uBF1EJ,yBEuFJ,kBAEI,QAAA,MACA,MAAA,KACA,WAAA,KACA,mBAAA,yBALJ,iCASM,OAAA,GE/JN,cACE,QAAA,MACA,MAAA,KAGA,QAAA,MAAA,KACA,UAAA,KACA,YAAA,KACA,MAAA,QACA,iBAAA,KAEA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,gBAKE,cAAA,ORnBE,mBAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KAAA,cAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,KAAA,WAAA,aAAA,YAAA,IAAA,CAAA,WAAA,YAAA,IAAA,CAAA,mBAAA,YAAA,KQCN,0BA6BI,iBAAA,YACA,OAAA,ECWF,oBACE,MAAA,QACA,iBAAA,KACA,aAAA,QACA,QAAA,ED7CJ,yCAsCI,MAAA,QAEA,QAAA,EAxCJ,gCAsCI,MAAA,QAEA,QAAA,EAxCJ,oCAsCI,MAAA,QAEA,QAAA,EAxCJ,2BAsCI,MAAA,QAEA,QAAA,EAxCJ,uBAAA,wBAkDI,iBAAA,QAEA,QAAA,EApDJ,uBAwDI,OAAA,YAIJ,gDAGI,OAAA,oBAHJ,qCAYI,MAAA,QACA,iBAAA,KAKJ,mBjBylEA,oBiBvlEE,QAAA,MAUF,gBACE,YAAA,sBACA,eAAA,sBACA,cAAA,EAGF,mBACE,YAAA,sBACA,eAAA,sBACA,UAAA,QAGF,mBACE,YAAA,uBACA,eAAA,uBACA,UAAA,QAUF,iBACE,YAAA,MACA,eAAA,MACA,cAAA,EACA,UAAA,KASF,qBACE,YAAA,MACA,eAAA,MACA,cAAA,EACA,YAAA,KACA,OAAA,MAAA,YACA,aAAA,IAAA,EjBykE6D,qCiB/kE/D,qCjB+kEqG,kDACrG,uDACA,0DiBjlEA,kDjB8kEA,uDACA,0DiBrkEI,cAAA,EACA,aAAA,EAaJ,iBAAA,8BjB+jEA,mCACA,sCiB/jEE,QAAA,OAAA,MACA,UAAA,QACA,YAAA,IT7JE,cAAA,MRmuEJ,wEiBlkEA,gEjBikEA,qEiBjkEA,mDAGI,OAAA,sBAIJ,iBAAA,8BjBgkEA,mCACA,sCiBhkEE,QAAA,MAAA,KACA,UAAA,QACA,YAAA,IT3KE,cAAA,MRkvEJ,wEiBnkEA,gEjBkkEA,qEiBlkEA,mDAGI,OAAA,qBAUJ,YACE,cAAA,KAGF,WACE,QAAA,MACA,WAAA,OAQF,YACE,SAAA,SACA,QAAA,MACA,cAAA,MAHF,uCAOM,MAAA,QACA,OAAA,YAKN,kBACE,aAAA,QACA,cAAA,EAGF,kBACE,SAAA,SACA,WAAA,OACA,YAAA,SAHF,6BAMI,SAAA,OAKJ,mBACE,QAAA,aADF,qCAII,eAAA,OAJJ,sCAQI,YAAA,OASJ,uBACE,WAAA,OjBkjEF,qBiB/iEA,sBjB8iEA,sBiB3iEE,cAAA,KACA,kBAAA,UACA,oBAAA,OAAA,MAAA,SACA,wBAAA,SAAA,SAAA,gBAAA,SAAA,SjBmjEF,6BAEA,6BADA,+BkBnzEE,oClBizEF,iCkB5yEI,MAAA,QlBqzEJ,kCADA,4BkBhzEE,2BAGE,aAAA,QAQF,gCACE,MAAA,QACA,iBAAA,QACA,aAAA,QD4OJ,mCAII,iBAAA,wPjBmkEJ,6BAEA,6BADA,+BkB30EE,oClBy0EF,iCkBp0EI,MAAA,QlB60EJ,kCADA,4BkBx0EE,2BAGE,aAAA,QAQF,gCACE,MAAA,QACA,iBAAA,KACA,aAAA,QDoPJ,mCAII,iBAAA,iUjBmlEJ,4BAEA,4BADA,8BkBn2EE,mClBi2EF,gCkB51EI,MAAA,QlBq2EJ,iCADA,2BkBh2EE,0BAGE,aAAA,QAQF,+BACE,MAAA,QACA,iBAAA,QACA,aAAA,QD4PJ,iCAII,iBAAA,kSAcJ,aACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAHF,yBASI,MAAA,KJ7PA,yBIoPJ,mBAeM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,cAAA,EAlBN,yBAuBM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,cAAA,EA3BN,2BAgCM,QAAA,aACA,MAAA,KACA,eAAA,OAlCN,kCAuCM,QAAA,aAvCN,0BA2CM,MAAA,KA3CN,iCA+CM,cAAA,EACA,eAAA,OAhDN,yBAsDM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,MAAA,KACA,WAAA,EACA,cAAA,EA3DN,+BA8DM,aAAA,EA9DN,+BAiEM,SAAA,SACA,WAAA,EACA,aAAA,OACA,YAAA,EApEN,6BAyEM,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,aAAA,EA5EN,uCA+EM,SAAA,OACA,QAAA,aACA,aAAA,OACA,eAAA,YAlFN,kDAuFM,IAAA,GE7XN,KACE,QAAA,aACA,YAAA,IACA,WAAA,OACA,YAAA,OACA,eAAA,OACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,OAAA,IAAA,MAAA,YCqEA,QAAA,MAAA,KACA,UAAA,KACA,YAAA,KZhFE,cAAA,OCCE,mBAAA,IAAA,IAAA,YAAA,cAAA,IAAA,IAAA,YAAA,WAAA,IAAA,IAAA,YNiBF,WAAA,WgBHA,gBAAA,KAbJ,WAAA,WAiBI,QAAA,EACA,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAlBJ,cAAA,cAwBI,OAAA,YACA,QAAA,IAzBJ,YAAA,YA+BI,iBAAA,KAMJ,enBu/EA,yBmBr/EE,eAAA,KAQF,aC5CE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpBwhFF,mCoBrhFI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDaJ,eC/CE,MAAA,QACA,iBAAA,KACA,aAAA,KjBAE,qBiBKA,MAAA,QACA,iBAAA,QACA,aAAA,QAEF,qBAAA,qBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,qBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,qBAKJ,wBAAA,wBAEE,iBAAA,KACA,aAAA,KAGF,sBAAA,sBpBsjFF,qCoBnjFI,MAAA,QACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDgBJ,UClDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,gBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,gBAAA,gBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAKJ,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAGF,iBAAA,iBpBolFF,gCoBjlFI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDmBJ,aCrDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpBknFF,mCoB/mFI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDsBJ,aCxDE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,mBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,mBAAA,mBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAKJ,sBAAA,sBAEE,iBAAA,QACA,aAAA,QAGF,oBAAA,oBpBgpFF,mCoB7oFI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QDyBJ,YC3DE,MAAA,KACA,iBAAA,QACA,aAAA,QjBAE,kBiBKA,MAAA,KACA,iBAAA,QACA,aAAA,QAEF,kBAAA,kBAMI,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAKJ,qBAAA,qBAEE,iBAAA,QACA,aAAA,QAGF,mBAAA,mBpB8qFF,kCoB3qFI,MAAA,KACA,iBAAA,QACA,iBAAA,KACA,aAAA,QD8BJ,qBCxBE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpB2qFF,2CoBxqFI,MAAA,KACA,iBAAA,QACA,aAAA,QDAJ,uBC3BE,MAAA,KACA,iBAAA,YACA,iBAAA,KACA,aAAA,KjBzCE,6BiB4CA,MAAA,QACA,iBAAA,KACA,aAAA,KAGF,6BAAA,6BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,qBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,qBAGF,gCAAA,gCAEE,MAAA,KACA,iBAAA,YAGF,8BAAA,8BpBysFF,6CoBtsFI,MAAA,QACA,iBAAA,KACA,aAAA,KDGJ,kBC9BE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,wBiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,wBAAA,wBAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAGF,2BAAA,2BAEE,MAAA,QACA,iBAAA,YAGF,yBAAA,yBpBuuFF,wCoBpuFI,MAAA,KACA,iBAAA,QACA,aAAA,QDMJ,qBCjCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpBqwFF,2CoBlwFI,MAAA,KACA,iBAAA,QACA,aAAA,QDSJ,qBCpCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,2BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,2BAAA,2BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,oBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,oBAGF,8BAAA,8BAEE,MAAA,QACA,iBAAA,YAGF,4BAAA,4BpBmyFF,2CoBhyFI,MAAA,KACA,iBAAA,QACA,aAAA,QDYJ,oBCvCE,MAAA,QACA,iBAAA,YACA,iBAAA,KACA,aAAA,QjBzCE,0BiB4CA,MAAA,KACA,iBAAA,QACA,aAAA,QAGF,0BAAA,0BAEE,mBAAA,EAAA,EAAA,EAAA,IAAA,mBAAA,WAAA,EAAA,EAAA,EAAA,IAAA,mBAGF,6BAAA,6BAEE,MAAA,QACA,iBAAA,YAGF,2BAAA,2BpBi0FF,0CoB9zFI,MAAA,KACA,iBAAA,QACA,aAAA,QDsBJ,UACE,YAAA,IACA,MAAA,QACA,cAAA,EAHF,UAAA,iBAAA,iBAAA,mBASI,iBAAA,YATJ,UAAA,iBAAA,gBAeI,aAAA,YhBtGA,gBgByGA,aAAA,YhB9FA,gBAAA,gBgBiGA,MAAA,QACA,gBAAA,UACA,iBAAA,YAvBJ,mBA0BI,MAAA,QhBtGA,yBAAA,yBgByGE,gBAAA,KAUN,mBAAA,QCvDE,QAAA,MAAA,KACA,UAAA,QACA,YAAA,IZhFE,cAAA,MWyIJ,mBAAA,QC3DE,QAAA,OAAA,MACA,UAAA,QACA,YAAA,IZhFE,cAAA,MWkJJ,WACE,QAAA,MACA,MAAA,KAIF,sBACE,WAAA,MnB0yFF,6BADA,4BmBryFA,6BAII,MAAA,KErKJ,MACE,QAAA,EZII,mBAAA,QAAA,KAAA,OAAA,cAAA,QAAA,KAAA,OAAA,WAAA,QAAA,KAAA,OYLN,WAKI,QAAA,EAIJ,UACE,QAAA,KADF,eAGI,QAAA,MAIJ,iBAEI,QAAA,UAIJ,oBAEI,QAAA,gBAIJ,YACE,SAAA,SACA,OAAA,EACA,SAAA,OZ1BI,mBAAA,OAAA,KAAA,KAAA,cAAA,OAAA,KAAA,KAAA,WAAA,OAAA,KAAA,KT2+FN,UsB/+FA,QAEE,SAAA,SAGF,wBAGI,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,KACA,eAAA,OACA,QAAA,GACA,WAAA,KAAA,MACA,aAAA,KAAA,MAAA,YACA,YAAA,KAAA,MAAA,YAIJ,gCAGM,WAAA,EACA,cAAA,KAAA,MAMN,eACE,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,MAAA,EACA,OAAA,QAAA,EAAA,EACA,UAAA,KACA,MAAA,QACA,WAAA,KACA,WAAA,KACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,gBd3CE,cAAA,OciDJ,kBChDE,OAAA,EACA,OAAA,MAAA,EACA,SAAA,OACA,WAAA,IAAA,MAAA,QDoDF,eACE,QAAA,MACA,MAAA,KACA,QAAA,IAAA,OACA,MAAA,KACA,YAAA,IACA,MAAA,QACA,WAAA,QACA,YAAA,OACA,WAAA,IACA,OAAA,EnBhDE,qBAAA,qBmBmDA,MAAA,QACA,gBAAA,KACA,iBAAA,QAfJ,sBAAA,sBAoBI,MAAA,KACA,gBAAA,KACA,iBAAA,QAtBJ,wBAAA,wBA2BI,MAAA,QACA,OAAA,YACA,iBAAA,YASJ,qBAGI,QAAA,MAHJ,QAQI,QAAA,EAQJ,qBACE,MAAA,EACA,KAAA,KAGF,oBACE,MAAA,KACA,KAAA,EAIF,iBACE,QAAA,MACA,QAAA,MAAA,OACA,cAAA,EACA,UAAA,QACA,MAAA,QACA,YAAA,OAIF,mBACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,IAOF,uBAGI,IAAA,KACA,OAAA,KACA,cAAA,QEtJJ,WxBwmGA,oBwBtmGE,SAAA,SACA,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,eAAA,OxB8mGF,yBwBlnGA,gBAOI,SAAA,SACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,cAAA,ExBmnGJ,+BwB5nGA,sBAcM,QAAA,ExBqnGN,gCADA,gCADA,+BwBjoGA,uBAAA,uBAAA,sBAmBM,QAAA,EAnBN,qBxBwoGA,2BACA,2BACA,iCACA,8BACA,oCACA,oCACA,0CwBlnGI,YAAA,KAKJ,aACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAHF,0BAMI,MAAA,KAIJ,yEACE,cAAA,EAIF,4BACE,YAAA,EADF,mEhBlCI,wBAAA,EACA,2BAAA,EgByCJ,6CxB0nGA,8CQtpGI,uBAAA,EACA,0BAAA,EgBiCJ,sBACE,MAAA,KAEF,8DACE,cAAA,EAEF,mExB4nGA,oEQlrGI,wBAAA,EACA,2BAAA,EgB2DJ,oEhB9CI,uBAAA,EACA,0BAAA,EgBkDJ,mCxB4nGA,iCwB1nGE,QAAA,EAgBF,4BACE,cAAA,OACA,aAAA,OAFF,mCAKI,YAAA,EAIJ,0CAAA,+BACE,cAAA,QACA,aAAA,QAGF,0CAAA,+BACE,cAAA,OACA,aAAA,OAoBF,oBACE,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,kBAAA,MAAA,oBAAA,WAAA,eAAA,MAAA,YAAA,WACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OAJF,yBxBknGA,+BwB1mGI,MAAA,KARJ,8BxBunGA,oCACA,oCACA,0CwB1mGI,WAAA,KACA,YAAA,EAIJ,4DAEI,cAAA,EAFJ,sDhBpII,2BAAA,EACA,0BAAA,EgBmIJ,sDhBlJI,uBAAA,EACA,wBAAA,EgB4JJ,uEACE,cAAA,EAEF,4ExB+mGA,6EQjwGI,2BAAA,EACA,0BAAA,EgBuJJ,6EhBtKI,uBAAA,EACA,wBAAA,ERyxGJ,gDEnWA,6CFqWA,2DADA,wDwB/lGM,SAAA,SACA,KAAA,cACA,eAAA,KCpMN,aACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,MAAA,KAHF,2BAQI,SAAA,SACA,QAAA,EACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KAGA,MAAA,GACA,cAAA,EAdJ,kCAAA,iCAAA,iCAkBM,QAAA,EzBgzGN,2ByB3yGA,mBzB0yGA,iByBtyGE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OzBmzGF,8DyBxzGA,sDzBuzGA,oDQ90GI,cAAA,EiBmCJ,mBzBizGA,iByB/yGE,YAAA,OACA,eAAA,OAyBF,mBACE,QAAA,MAAA,KACA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,KACA,MAAA,QACA,WAAA,OACA,iBAAA,QACA,OAAA,IAAA,MAAA,gBjBxEE,cAAA,OiB+DJ,mCzBwyGA,mCACA,wDyB3xGI,QAAA,OAAA,MACA,UAAA,QjB9EA,cAAA,MiB+DJ,mCzBgzGA,mCACA,wDyB7xGI,QAAA,MAAA,KACA,UAAA,QjBpFA,cAAA,MRu3GJ,wCyBxzGA,qCA6BI,WAAA,EAUJ,4CzBsxGA,oCAKA,oEADA,+EAHA,uCACA,kDACA,mDQl3GI,wBAAA,EACA,2BAAA,EiBiGJ,oCACE,aAAA,EAEF,6CzByxGA,qCACA,wCACA,mDACA,oDAEA,oEADA,yDQp3GI,uBAAA,EACA,0BAAA,EiB+FJ,mDACE,YAAA,EAOF,iBACE,SAAA,SAGA,UAAA,EACA,YAAA,OALF,sBAUI,SAAA,SAVJ,2BAaM,YAAA,KAbN,6BAAA,4BAAA,4BAkBM,QAAA,EAlBN,uCzByyGA,6CyB/wGM,aAAA,KA1BN,wCzB8yGA,8CyB9wGM,QAAA,EACA,YAAA,KzBoxGN,qDADA,oDAEA,oDyBtzGA,+CAAA,8CAAA,8CAoCQ,QAAA,EChKR,gBACE,SAAA,SACA,QAAA,mBAAA,QAAA,oBAAA,QAAA,mBAAA,QAAA,YACA,WAAA,OACA,aAAA,OACA,aAAA,KAGF,sBACE,SAAA,SACA,QAAA,GACA,QAAA,EAHF,wDAMI,MAAA,KACA,iBAAA,QAPJ,sDAaI,mBAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,QAAA,WAAA,EAAA,EAAA,EAAA,IAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,QAbJ,uDAiBI,MAAA,KACA,iBAAA,QAlBJ,yDAwBM,OAAA,YACA,iBAAA,QAzBN,2DA6BM,MAAA,QACA,OAAA,YASN,0BACE,SAAA,SACA,IAAA,OACA,KAAA,EACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,iBAAA,KACA,kBAAA,UACA,oBAAA,OAAA,OACA,wBAAA,IAAA,IAAA,gBAAA,IAAA,IAQF,2ClB1EI,cAAA,OkB0EJ,yEAMI,iBAAA,yMANJ,+EAUI,iBAAA,QACA,iBAAA,sJASJ,wCAEI,cAAA,IAFJ,sEAMI,iBAAA,mJAUJ,yBACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OAFF,yCAKI,cAAA,OALJ,yDAQM,YAAA,EAYN,eACE,QAAA,aACA,UAAA,KAEA,OAAA,oBACA,QAAA,QAAA,QAAA,QAAA,OACA,YAAA,KACA,MAAA,QACA,eAAA,OACA,WAAA,KAAA,oKAAA,UAAA,MAAA,OAAA,OACA,wBAAA,IAAA,KAAA,gBAAA,IAAA,KACA,OAAA,IAAA,MAAA,gBlB7IE,cAAA,OkB+IF,mBAAA,KAAA,gBAAA,KAAA,WAAA,KAbF,qBAgBI,aAAA,QACA,QAAA,EAjBJ,gCA0BM,MAAA,QACA,iBAAA,KA3BN,wBAgCI,MAAA,QACA,OAAA,YACA,iBAAA,QAlCJ,2BAuCI,QAAA,EAIJ,kBACE,YAAA,QACA,eAAA,QACA,UAAA,IAaF,aACE,SAAA,SACA,QAAA,aACA,UAAA,KACA,OAAA,OACA,cAAA,EAGF,mBACE,UAAA,MACA,UAAA,KACA,OAAA,OACA,OAAA,EACA,QAAA,EAOF,qBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,EACA,OAAA,OACA,QAAA,MAAA,KACA,YAAA,IACA,MAAA,QACA,eAAA,KACA,oBAAA,KAAA,iBAAA,KAAA,gBAAA,KAAA,YAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,gBlB9NE,cAAA,OkBiNJ,2CAmBM,QAAA,iBAnBN,6BAwBI,SAAA,SACA,IAAA,KACA,MAAA,KACA,OAAA,KACA,QAAA,EACA,QAAA,MACA,OAAA,OACA,QAAA,MAAA,KACA,YAAA,IACA,MAAA,QACA,iBAAA,QACA,OAAA,IAAA,MAAA,gBlBpPA,cAAA,EAAA,OAAA,OAAA,EkBiNJ,sCAyCM,QAAA,SCzPN,KACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,aAAA,EACA,cAAA,EACA,WAAA,KAGF,UACE,QAAA,MACA,QAAA,MAAA,KxBOE,gBAAA,gBwBJA,gBAAA,KALJ,mBAUI,MAAA,QACA,OAAA,YASJ,UACE,cAAA,IAAA,MAAA,KADF,oBAII,cAAA,KAJJ,oBAQI,OAAA,IAAA,MAAA,YnB/BA,uBAAA,OACA,wBAAA,OmBsBJ,0BAAA,0BAYM,aAAA,QAAA,QAAA,KAZN,6BAgBM,MAAA,QACA,iBAAA,YACA,aAAA,Y3BgpHN,mC2BlqHA,2BAwBI,MAAA,QACA,iBAAA,KACA,aAAA,KAAA,KAAA,KA1BJ,yBA+BI,WAAA,KnBtDA,uBAAA,EACA,wBAAA,EmBgEJ,qBnBvEI,cAAA,ORgtHJ,oC2BzoHA,4BAOI,MAAA,KACA,iBAAA,QASJ,oBAEI,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,WAAA,OAIJ,yBAEI,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,WAAA,OASJ,uBAEI,QAAA,KAFJ,qBAKI,QAAA,MCpGJ,QACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cACA,QAAA,MAAA,KALF,mB5BovHA,yB4BzuHI,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,KAAA,cAAA,KAAA,UAAA,KACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cfuCA,yBepDJ,mB5BowHE,yB4BpvHI,MAAA,KACA,aAAA,EACA,YAAA,GAUN,cACE,QAAA,aACA,mBAAA,WAAA,oBAAA,MAAA,WAAA,WACA,YAAA,SACA,eAAA,SACA,aAAA,KACA,UAAA,QACA,YAAA,QACA,YAAA,OzB/BE,oBAAA,oByBkCA,gBAAA,KASJ,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,aAAA,EACA,cAAA,EACA,WAAA,KALF,sBAQI,cAAA,EACA,aAAA,EASJ,aACE,QAAA,aACA,YAAA,MACA,eAAA,MAYF,iBACE,mBAAA,KAAA,wBAAA,KAAA,WAAA,KAIF,gBACE,mBAAA,WAAA,oBAAA,MAAA,WAAA,WACA,QAAA,OAAA,OACA,UAAA,QACA,YAAA,EACA,WAAA,IACA,OAAA,IAAA,MAAA,YpBzGE,cAAA,OLkBA,sBAAA,sByB2FA,gBAAA,KAMJ,qBACE,QAAA,aACA,MAAA,MACA,OAAA,MACA,eAAA,OACA,QAAA,GACA,WAAA,UAAA,OAAA,OACA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KfzDE,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5BsuHF,mC4B3tHQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WApBJ,8BAuBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAvBN,wCA0BQ,cAAA,MACA,aAAA,MA3BR,6B5B2wHF,mC4BzuHQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAnCN,mCAwCM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAxCN,kCA6CM,QAAA,MfhHN,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5BqyHF,mC4B1xHQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WApBJ,8BAuBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAvBN,wCA0BQ,cAAA,MACA,aAAA,MA3BR,6B5B00HF,mC4BxyHQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAnCN,mCAwCM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAxCN,kCA6CM,QAAA,MfhHN,yBemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5Bo2HF,mC4Bz1HQ,cAAA,EACA,aAAA,Gf5FN,yBegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WApBJ,8BAuBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAvBN,wCA0BQ,cAAA,MACA,aAAA,MA3BR,6B5By4HF,mC4Bv2HQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAnCN,mCAwCM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAxCN,kCA6CM,QAAA,MfhHN,0BemEA,6CAIQ,SAAA,OACA,MAAA,KALR,6B5Bm6HF,mC4Bx5HQ,cAAA,EACA,aAAA,Gf5FN,0BegFA,kBAiBI,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WApBJ,8BAuBM,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IAvBN,wCA0BQ,cAAA,MACA,aAAA,MA3BR,6B5Bw8HF,mC4Bt6HQ,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAnCN,mCAwCM,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAxCN,kCA6CM,QAAA,MAlDV,eAsBQ,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IACA,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,MAAA,wBAAA,WAAA,cAAA,MAAA,gBAAA,WAzBR,0CASY,SAAA,OACA,MAAA,KAVZ,0B5B0/HA,gC4B1+HU,cAAA,EACA,aAAA,EAjBV,2BA4BU,mBAAA,WAAA,sBAAA,OAAA,uBAAA,IAAA,mBAAA,IAAA,eAAA,IA5BV,qCA+BY,cAAA,MACA,aAAA,MAhCZ,0B5B6gIA,gC4Bt+HU,kBAAA,OAAA,cAAA,OAAA,UAAA,OACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OAxCV,gCA6CU,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eA7CV,+BAkDU,QAAA,KAaV,4BAEI,MAAA,eAFJ,kCAAA,kCAKM,MAAA,eALN,oCAWM,MAAA,eAXN,0CAAA,0CAcQ,MAAA,eAdR,6CAkBQ,MAAA,e5Bs+HR,4CAEA,2CADA,yC4Bz/HA,0CA0BM,MAAA,eA1BN,8BA+BI,MAAA,eACA,aAAA,eAhCJ,mCAoCI,iBAAA,oPApCJ,2BAwCI,MAAA,eAKJ,8BAEI,MAAA,KAFJ,oCAAA,oCAKM,MAAA,KALN,sCAWM,MAAA,qBAXN,4CAAA,4CAcQ,MAAA,sBAdR,+CAkBQ,MAAA,sB5Bi+HR,8CAEA,6CADA,2C4Bp/HA,4CA0BM,MAAA,KA1BN,gCA+BI,MAAA,qBACA,aAAA,qBAhCJ,qCAoCI,iBAAA,0PApCJ,6BAwCI,MAAA,qBCnRJ,MACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBrBLE,cAAA,OqBSJ,YAGE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,QAAA,QAGF,YACE,cAAA,OAGF,eACE,WAAA,SACA,cAAA,EAGF,sBACE,cAAA,E1BnBE,iB0BwBA,gBAAA,KAFJ,sBAMI,YAAA,QAIJ,2DrBjCI,uBAAA,OACA,wBAAA,OqBgCJ,yDrBnBI,2BAAA,OACA,0BAAA,OqBqCJ,aACE,QAAA,OAAA,QACA,cAAA,EACA,iBAAA,QACA,cAAA,IAAA,MAAA,iBAJF,yBrB1DI,cAAA,mBAAA,mBAAA,EAAA,EqBqEJ,aACE,QAAA,OAAA,QACA,iBAAA,QACA,WAAA,IAAA,MAAA,iBAHF,wBrBrEI,cAAA,EAAA,EAAA,mBAAA,mBqBoFJ,kBACE,aAAA,SACA,cAAA,QACA,YAAA,SACA,cAAA,EAGF,mBACE,aAAA,SACA,YAAA,SAQF,cCtGE,iBAAA,QACA,aAAA,Q9B+0IF,2B8B70IE,2BAEE,iBAAA,YDoGJ,cCzGE,iBAAA,QACA,aAAA,Q9By1IF,2B8Bv1IE,2BAEE,iBAAA,YDuGJ,WC5GE,iBAAA,QACA,aAAA,Q9Bm2IF,wB8Bj2IE,wBAEE,iBAAA,YD0GJ,cC/GE,iBAAA,QACA,aAAA,Q9B62IF,2B8B32IE,2BAEE,iBAAA,YD6GJ,aClHE,iBAAA,QACA,aAAA,Q9Bu3IF,0B8Br3IE,0BAEE,iBAAA,YDkHJ,sBC7GE,iBAAA,YACA,aAAA,QD+GF,wBChHE,iBAAA,YACA,aAAA,KDkHF,mBCnHE,iBAAA,YACA,aAAA,QDqHF,sBCtHE,iBAAA,YACA,aAAA,QDwHF,sBCzHE,iBAAA,YACA,aAAA,QD2HF,qBC5HE,iBAAA,YACA,aAAA,QDmIF,cC3HE,MAAA,sB9B44IF,2B8B14IE,2BAEE,iBAAA,YACA,aAAA,qB9B+4IJ,+BAFA,2B8B34IE,2B9B44IF,0B8Bx4II,MAAA,K9Bg5IJ,kD8B94IE,yB9B64IF,6BADA,yB8Bx4II,MAAA,sBAEF,+BAAA,+BAEI,MAAA,KD8GN,iBACE,QAAA,EACA,cAAA,EACA,YAAA,EAIF,kBACE,SAAA,SACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,QAGF,UACE,MAAA,KrBtKE,cAAA,mBqB2KJ,cACE,MAAA,KrBtKE,uBAAA,mBACA,wBAAA,mBqByKJ,iBACE,MAAA,KrB7JE,2BAAA,mBACA,0BAAA,mBK+BA,yBgBqIF,WACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KACA,aAAA,MACA,YAAA,MAJF,iBAOI,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,aAAA,KACA,YAAA,MhBhJF,yBgB2JF,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,WAAA,sBAAA,OAAA,kBAAA,IAAA,KAAA,cAAA,IAAA,KAAA,UAAA,IAAA,KAFF,kBAKI,iBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,SAAA,EAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GALJ,wBAQM,YAAA,EACA,YAAA,EATN,8BrBlME,wBAAA,EACA,2BAAA,EqBiMF,4CAkBU,wBAAA,EAlBV,+CAqBU,2BAAA,EArBV,6BrBpLE,uBAAA,EACA,0BAAA,EqBmLF,2CA4BU,uBAAA,EA5BV,8CA+BU,0BAAA,EA/BV,qDAoCQ,cAAA,E7BizIR,sE6Br1IA,mEAwCU,cAAA,GhBnMR,yBgBiNF,cACE,qBAAA,EAAA,kBAAA,EAAA,aAAA,EACA,mBAAA,QAAA,gBAAA,QAAA,WAAA,QAFF,oBAKI,QAAA,aACA,MAAA,KACA,cAAA,QEhRN,YACE,QAAA,OAAA,KACA,cAAA,KACA,WAAA,KACA,iBAAA,QvBAE,cAAA,OwBHF,mBACE,QAAA,MACA,MAAA,KACA,QAAA,GDKJ,iBACE,MAAA,KADF,0CAKI,QAAA,aACA,cAAA,MACA,aAAA,MACA,MAAA,QACA,QAAA,IATJ,gDAmBI,gBAAA,UAnBJ,gDAsBI,gBAAA,KAtBJ,wBA0BI,MAAA,QEnCJ,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KAEA,aAAA,EACA,WAAA,KzBAE,cAAA,OyBIJ,kCAGM,YAAA,EzBoBF,uBAAA,OACA,0BAAA,OyBxBJ,iCzBSI,wBAAA,OACA,2BAAA,OyBVJ,6BAcI,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAjBJ,+BAqBI,MAAA,QACA,eAAA,KACA,OAAA,YACA,iBAAA,KACA,aAAA,KAIJ,WACE,SAAA,SACA,QAAA,MACA,QAAA,MAAA,OACA,YAAA,KACA,YAAA,KACA,MAAA,QACA,iBAAA,KACA,OAAA,IAAA,MAAA,K9BvBE,iBAAA,iB8B0BA,MAAA,QACA,gBAAA,KACA,iBAAA,QACA,aAAA,KChDF,0BACE,QAAA,OAAA,OACA,UAAA,QAKE,iD1BqBF,uBAAA,MACA,0BAAA,M0BjBE,gD1BEF,wBAAA,MACA,2BAAA,M0BfF,0BACE,QAAA,OAAA,MACA,UAAA,QAKE,iD1BqBF,uBAAA,MACA,0BAAA,M0BjBE,gD1BEF,wBAAA,MACA,2BAAA,M2BbJ,OACE,QAAA,aACA,QAAA,MAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OACA,YAAA,OACA,eAAA,S3BVE,cAAA,O2BCJ,aAcI,QAAA,KAKJ,YACE,SAAA,SACA,IAAA,KhCJE,cAAA,cgCWA,MAAA,KACA,gBAAA,KASJ,YACE,cAAA,KACA,aAAA,K3BzCE,cAAA,M2BiDJ,eClDE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDkDN,eCtDE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDsDN,eC1DE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QD0DN,YC9DE,iBAAA,QjCmBE,wBAAA,wBiCfE,iBAAA,QD8DN,eClEE,iBAAA,QjCmBE,2BAAA,2BiCfE,iBAAA,QDkEN,cCtEE,iBAAA,QjCmBE,0BAAA,0BiCfE,iBAAA,QCPN,WACE,QAAA,KAAA,KACA,cAAA,KACA,iBAAA,Q7BCE,cAAA,MKoDA,yBwBxDJ,WAOI,QAAA,KAAA,MAIJ,cACE,iBAAA,QAGF,iBACE,cAAA,EACA,aAAA,E7BbE,cAAA,E8BAJ,OACE,QAAA,OAAA,QACA,cAAA,KACA,OAAA,IAAA,MAAA,Y9BHE,cAAA,O8BQJ,eAEE,MAAA,QAIF,YACE,YAAA,IAQF,0BAGI,SAAA,SACA,IAAA,QACA,MAAA,SACA,QAAA,OAAA,QACA,MAAA,QASJ,eCxCE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,kBACE,iBAAA,QAEF,2BACE,MAAA,QDmCJ,YC3CE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,eACE,iBAAA,QAEF,wBACE,MAAA,QDsCJ,eC9CE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,kBACE,iBAAA,QAEF,2BACE,MAAA,QDyCJ,cCjDE,MAAA,QACA,iBAAA,QACA,aAAA,QAEA,iBACE,iBAAA,QAEF,0BACE,MAAA,QCXJ,wCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAFP,mCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAFP,gCACE,KAAO,oBAAA,KAAA,EACP,GAAK,oBAAA,EAAA,GAGP,UACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,SAAA,OACA,UAAA,OACA,YAAA,KACA,WAAA,OACA,iBAAA,QhCPE,cAAA,OgCWJ,cACE,OAAA,KACA,YAAA,KACA,MAAA,KACA,iBAAA,QAGF,sBCaE,iBAAA,yKAAA,iBAAA,oKAAA,iBAAA,iKDXA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KAGF,uBACE,kBAAA,qBAAA,GAAA,OAAA,SAAA,aAAA,qBAAA,GAAA,OAAA,SAAA,UAAA,qBAAA,GAAA,OAAA,SE5BF,OACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,MAAA,oBAAA,WAAA,eAAA,MAAA,YAAA,WAGF,YACE,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,KAAA,EAAA,EAAA,GCFF,YACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OAGA,aAAA,EACA,cAAA,EASF,wBACE,MAAA,KACA,MAAA,QACA,WAAA,QxCAE,8BAAA,8BwCIA,MAAA,QACA,gBAAA,KACA,iBAAA,QATJ,+BAaI,MAAA,QACA,iBAAA,QASJ,iBACE,SAAA,SACA,QAAA,MACA,QAAA,OAAA,QAEA,cAAA,KACA,iBAAA,KACA,OAAA,IAAA,MAAA,iBAPF,6BnChCI,uBAAA,OACA,wBAAA,OmC+BJ,4BAcI,cAAA,EnChCA,2BAAA,OACA,0BAAA,OLHA,uBAAA,uBwCuCA,gBAAA,KAnBJ,0BAAA,0BAwBI,MAAA,QACA,OAAA,YACA,iBAAA,KA1BJ,wBA+BI,QAAA,EACA,MAAA,KACA,iBAAA,QACA,aAAA,QAUJ,mCAEI,aAAA,EACA,YAAA,EACA,cAAA,EAJJ,2DASM,WAAA,EATN,yDAeM,cAAA,EClGJ,yBACE,MAAA,QACA,iBAAA,QAIF,0B5C4gKF,+B4C1gKI,MAAA,QzCWA,gCAAA,gCHogKJ,qCACA,qC4C7gKM,MAAA,QACA,iBAAA,QANJ,iC5CwhKF,sC4C9gKM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,sBACE,MAAA,QACA,iBAAA,QAIF,uB5CoiKF,4B4CliKI,MAAA,QzCWA,6BAAA,6BH4hKJ,kCACA,kC4CriKM,MAAA,QACA,iBAAA,QANJ,8B5CgjKF,mC4CtiKM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,yBACE,MAAA,QACA,iBAAA,QAIF,0B5C4jKF,+B4C1jKI,MAAA,QzCWA,gCAAA,gCHojKJ,qCACA,qC4C7jKM,MAAA,QACA,iBAAA,QANJ,iC5CwkKF,sC4C9jKM,MAAA,KACA,iBAAA,QACA,aAAA,QAlBJ,wBACE,MAAA,QACA,iBAAA,QAIF,yB5ColKF,8B4CllKI,MAAA,QzCWA,+BAAA,+BH4kKJ,oCACA,oC4CrlKM,MAAA,QACA,iBAAA,QANJ,gC5CgmKF,qC4CtlKM,MAAA,KACA,iBAAA,QACA,aAAA,QCnBN,kBACE,SAAA,SACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,SAAA,OALF,0BAQI,QAAA,MACA,QAAA,GATJ,yC7C4nKA,wBADA,yBAEA,yBACA,wB6C7mKI,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,KACA,OAAA,KACA,OAAA,EAIJ,gCAEI,YAAA,WAIJ,gCAEI,YAAA,OAIJ,+BAEI,YAAA,IAIJ,+BAEI,YAAA,KCjDJ,OACE,MAAA,MACA,UAAA,OACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,YAAA,EAAA,IAAA,EAAA,KACA,QAAA,G3CeE,aAAA,a2CZA,MAAA,KACA,gBAAA,KACA,QAAA,IAUJ,aACE,QAAA,EACA,WAAA,IACA,OAAA,EACA,mBAAA,KCnBF,YACE,SAAA,OAIF,OACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,SAAA,OAGA,QAAA,EAXF,0BtCPM,mBAAA,kBAAA,IAAA,SAAA,WAAA,kBAAA,IAAA,SAAA,cAAA,aAAA,IAAA,SAAA,WAAA,UAAA,IAAA,SAAA,WAAA,UAAA,IAAA,QAAA,CAAA,kBAAA,IAAA,QAAA,CAAA,aAAA,IAAA,SsC0BF,kBAAA,kBAAA,aAAA,kBAAA,UAAA,kBAnBJ,0BAqByB,kBAAA,eAAA,aAAA,eAAA,UAAA,eAEzB,mBACE,WAAA,OACA,WAAA,KAIF,cACE,SAAA,SACA,MAAA,KACA,OAAA,KAIF,eACE,SAAA,SACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,mBAAA,SAAA,sBAAA,OAAA,uBAAA,OAAA,mBAAA,OAAA,eAAA,OACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,evClDE,cAAA,MuCsDF,QAAA,EAIF,gBACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KACA,iBAAA,KAPF,qBAUW,QAAA,EAVX,qBAWW,QAAA,GAKX,cACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,QAAA,wBAAA,cAAA,cAAA,QAAA,gBAAA,cACA,QAAA,KACA,cAAA,IAAA,MAAA,QAIF,aACE,cAAA,EACA,YAAA,IAKF,YACE,SAAA,SAGA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,QAAA,KAIF,cACE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,IAAA,wBAAA,SAAA,cAAA,IAAA,gBAAA,SACA,QAAA,KACA,WAAA,IAAA,MAAA,QALF,iCAQyB,YAAA,OARzB,gCASwB,aAAA,OAIxB,yBACE,SAAA,SACA,IAAA,QACA,MAAA,KACA,OAAA,KACA,SAAA,OlCjEE,yBkCuEF,cACE,UAAA,MACA,OAAA,KAAA,KAOF,UAAY,UAAA,OlChFV,yBkCoFF,UAAY,UAAA,OC3Id,SACE,SAAA,SACA,QAAA,KACA,QAAA,MCFA,YAAA,aAAA,CAAA,SAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KDRA,UAAA,QAEA,UAAA,WACA,QAAA,EAVF,cAYW,QAAA,GAZX,2CAAA,qBAgBI,QAAA,IAAA,EACA,WAAA,KAjBJ,kEAAA,4CAoBM,OAAA,EACA,KAAA,IACA,YAAA,KACA,QAAA,GACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAzBN,yCAAA,uBA8BI,QAAA,EAAA,IACA,YAAA,IA/BJ,gEAAA,8CAkCM,IAAA,IACA,KAAA,EACA,WAAA,KACA,QAAA,GACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAvCN,wCAAA,wBA4CI,QAAA,IAAA,EACA,WAAA,IA7CJ,+DAAA,+CAgDM,IAAA,EACA,KAAA,IACA,YAAA,KACA,QAAA,GACA,aAAA,EAAA,IAAA,IACA,oBAAA,KArDN,0CAAA,sBA0DI,QAAA,EAAA,IACA,YAAA,KA3DJ,iEAAA,6CA8DM,IAAA,IACA,MAAA,EACA,WAAA,KACA,QAAA,GACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAMN,eACE,UAAA,MACA,QAAA,IAAA,IACA,MAAA,KACA,WAAA,OACA,iBAAA,KxC3EE,cAAA,OwCsEJ,uBASI,SAAA,SACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MEvFJ,SACE,SAAA,SACA,IAAA,EACA,KAAA,EACA,QAAA,KACA,QAAA,MACA,UAAA,MACA,QAAA,IDLA,YAAA,aAAA,CAAA,SAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WAEA,WAAA,OACA,YAAA,IACA,YAAA,IACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,OACA,WAAA,OACA,aAAA,OACA,YAAA,OACA,WAAA,KCLA,UAAA,QAEA,UAAA,WACA,iBAAA,KACA,wBAAA,YAAA,gBAAA,YACA,OAAA,IAAA,MAAA,e1CZE,cAAA,M0CJJ,2CAAA,qBAyBI,WAAA,MAzBJ,kDAAA,mDAAA,4BAAA,6BA6BM,KAAA,IACA,oBAAA,EA9BN,mDAAA,6BAkCM,OAAA,MACA,YAAA,MACA,iBAAA,gBApCN,kDAAA,4BAwCM,OAAA,MACA,YAAA,MACA,iBAAA,KA1CN,yCAAA,uBAgDI,YAAA,KAhDJ,gDAAA,iDAAA,8BAAA,+BAoDM,IAAA,IACA,kBAAA,EArDN,iDAAA,+BAyDM,KAAA,MACA,WAAA,MACA,mBAAA,gBA3DN,gDAAA,8BA+DM,KAAA,MACA,WAAA,MACA,mBAAA,KAjEN,wCAAA,wBAuEI,WAAA,KAvEJ,+CAAA,gDAAA,+BAAA,gCA2EM,KAAA,IACA,iBAAA,EA5EN,gDAAA,gCAgFM,IAAA,MACA,YAAA,MACA,oBAAA,gBAlFN,+CAAA,+BAsFM,IAAA,MACA,YAAA,MACA,oBAAA,QAxFN,+DAAA,+CA6FM,SAAA,SACA,IAAA,EACA,KAAA,IACA,QAAA,MACA,MAAA,KACA,YAAA,MACA,QAAA,GACA,cAAA,IAAA,MAAA,QApGN,0CAAA,sBA0GI,YAAA,MA1GJ,iDAAA,kDAAA,6BAAA,8BA8GM,IAAA,IACA,mBAAA,EA/GN,kDAAA,8BAmHM,MAAA,MACA,WAAA,MACA,kBAAA,gBArHN,iDAAA,6BAyHM,MAAA,MACA,WAAA,MACA,kBAAA,KAON,eACE,QAAA,IAAA,KACA,cAAA,EACA,UAAA,KACA,MAAA,QACA,iBAAA,QACA,cAAA,IAAA,MAAA,Q1C9HE,uBAAA,kBACA,wBAAA,kB0CuHJ,qBAWI,QAAA,KAIJ,iBACE,QAAA,IAAA,KACA,MAAA,QlDs7KF,gBkD96KA,iBAEE,SAAA,SACA,QAAA,MACA,MAAA,EACA,OAAA,EACA,aAAA,YACA,aAAA,MAGF,iBACE,QAAA,GACA,aAAA,KAEF,gBACE,QAAA,GACA,aAAA,KC1KF,UACE,SAAA,SAGF,gBACE,SAAA,SACA,MAAA,KACA,SAAA,OAGF,eACE,SAAA,SACA,QAAA,KACA,MAAA,KCZA,8BDSF,e1CNM,mBAAA,kBAAA,IAAA,YAAA,WAAA,kBAAA,IAAA,YAAA,cAAA,aAAA,IAAA,YAAA,WAAA,UAAA,IAAA,YAAA,WAAA,UAAA,IAAA,WAAA,CAAA,kBAAA,IAAA,WAAA,CAAA,aAAA,IAAA,Y0CaF,4BAAA,OAAA,oBAAA,OACA,oBAAA,OAAA,YAAA,QCVuC,qFDE3C,e1CNM,mBAAA,kBAAA,IAAA,YAAA,WAAA,kBAAA,IAAA,YAAA,cAAA,aAAA,IAAA,YAAA,WAAA,UAAA,IAAA,YAAA,WAAA,UAAA,IAAA,WAAA,CAAA,kBAAA,IAAA,WAAA,CAAA,aAAA,IAAA,Y0CaF,4BAAA,OAAA,oBAAA,OACA,oBAAA,OAAA,YAAA,QnDsnLJ,oBACA,oBmDnnLA,sBAGE,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KAGF,oBnDqnLA,oBmDnnLE,SAAA,SACA,IAAA,EC9BA,8BDmCA,uCnDonLA,wCmDlnLE,kBAAA,mBAAA,UAAA,mBnDunLF,4BmDpnLA,oBAEE,kBAAA,sBAAA,UAAA,sBnDunLF,2BmDpnLA,oBAEE,kBAAA,uBAAA,UAAA,wBCxCuC,qFD4BzC,uCnDsoLA,wCmDpoLE,kBAAA,mBAAA,UAAA,mBnDyoLF,4BmDtoLA,oBAEE,kBAAA,sBAAA,UAAA,sBnDyoLF,2BmDtoLA,oBAEE,kBAAA,uBAAA,UAAA,wBnD2oLJ,uBmDloLA,uBAEE,SAAA,SACA,IAAA,EACA,OAAA,EAEA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,kBAAA,OAAA,oBAAA,OAAA,eAAA,OAAA,YAAA,OACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,MAAA,IACA,MAAA,KACA,WAAA,OACA,QAAA,GnD6oLF,6BACA,6BG9rLI,6BAAA,6BgDsDA,MAAA,KACA,gBAAA,KACA,QAAA,EACA,QAAA,GAGJ,uBACE,KAAA,EAEF,uBACE,MAAA,EnD8oLF,4BmD1oLA,4BAEE,QAAA,aACA,MAAA,KACA,OAAA,KACA,WAAA,YAAA,UAAA,OAAA,OACA,wBAAA,KAAA,KAAA,gBAAA,KAAA,KAEF,4BACE,iBAAA,4LAEF,4BACE,iBAAA,8LASF,qBACE,SAAA,SACA,MAAA,EACA,OAAA,KACA,KAAA,EACA,QAAA,GACA,QAAA,YAAA,QAAA,aAAA,QAAA,YAAA,QAAA,KACA,iBAAA,OAAA,wBAAA,OAAA,cAAA,OAAA,gBAAA,OACA,aAAA,EAEA,aAAA,IACA,YAAA,IACA,WAAA,KAZF,wBAeI,SAAA,SACA,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,UAAA,KACA,OAAA,IACA,aAAA,IACA,YAAA,IACA,YAAA,OACA,iBAAA,qBAtBJ,gCA0BM,SAAA,SACA,IAAA,MACA,KAAA,EACA,QAAA,aACA,MAAA,KACA,OAAA,KACA,QAAA,GAhCN,+BAmCM,SAAA,SACA,OAAA,MACA,KAAA,EACA,QAAA,aACA,MAAA,KACA,OAAA,KACA,QAAA,GAzCN,6BA8CI,iBAAA,KASJ,kBACE,SAAA,SACA,MAAA,IACA,OAAA,KACA,KAAA,IACA,QAAA,GACA,YAAA,KACA,eAAA,KACA,MAAA,KACA,WAAA,OE/KF,gBAAqB,eAAA,mBACrB,WAAqB,eAAA,cACrB,cAAqB,eAAA,iBACrB,cAAqB,eAAA,iBACrB,mBAAqB,eAAA,sBACrB,gBAAqB,eAAA,mBCDrB,UACE,iBAAA,QCFA,YACE,iBAAA,kBpDkBA,mBAAA,mBoDdE,iBAAA,kBALJ,YACE,iBAAA,kBpDkBA,mBAAA,mBoDdE,iBAAA,kBALJ,SACE,iBAAA,kBpDkBA,gBAAA,gBoDdE,iBAAA,kBALJ,YACE,iBAAA,kBpDkBA,mBAAA,mBoDdE,iBAAA,kBALJ,WACE,iBAAA,kBpDkBA,kBAAA,kBoDdE,iBAAA,kBALJ,YACE,iBAAA,kBpDkBA,mBAAA,mBoDdE,iBAAA,kBCJN,UAAmB,OAAA,YACnB,cAAmB,WAAA,YACnB,gBAAmB,aAAA,YACnB,iBAAmB,cAAA,YACnB,eAAmB,YAAA,YAMnB,ShDVI,cAAA,OgDaJ,ahDPI,uBAAA,OACA,wBAAA,OgDSJ,ehDHI,wBAAA,OACA,2BAAA,OgDKJ,gBhDCI,2BAAA,OACA,0BAAA,OgDCJ,chDKI,uBAAA,OACA,0BAAA,OgDFJ,gBACE,cAAA,IAGF,WACE,cAAA,ExBlCA,iBACE,QAAA,MACA,MAAA,KACA,QAAA,GyBIA,QAA2B,QAAA,eAC3B,UAA2B,QAAA,iBAC3B,gBAA2B,QAAA,uBAC3B,SAA2B,QAAA,gBAC3B,SAA2B,QAAA,gBAC3B,cAA2B,QAAA,qBAC3B,QAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,eAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,sB5CyC3B,yB4ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB5CyC3B,yB4ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB5CyC3B,yB4ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uB5CyC3B,0B4ChDA,WAA2B,QAAA,eAC3B,aAA2B,QAAA,iBAC3B,mBAA2B,QAAA,uBAC3B,YAA2B,QAAA,gBAC3B,YAA2B,QAAA,gBAC3B,iBAA2B,QAAA,qBAC3B,WAA2B,QAAA,sBAAA,QAAA,uBAAA,QAAA,sBAAA,QAAA,eAC3B,kBAA2B,QAAA,6BAAA,QAAA,8BAAA,QAAA,6BAAA,QAAA,uBAS/B,eACE,QAAA,eAEA,aAHF,eAII,QAAA,iBAIJ,gBACE,QAAA,eAEA,aAHF,gBAII,QAAA,kBAIJ,sBACE,QAAA,eAEA,aAHF,sBAII,QAAA,wBAKF,aADF,cAEI,QAAA,gBC1CA,aAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,SAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,UAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,aAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,kBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,qBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,WAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,aAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,mBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,uBAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,qBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,wBAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,yBAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,wBAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,mBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,iBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,oBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,sBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,qBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,qBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,mBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,sBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,uBAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,sBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,uBAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,iBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,kBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,gBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,mBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,qBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,oBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,kB7CWhC,yB6ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB7CWhC,yB6ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB7CWhC,yB6ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mB7CWhC,0B6ChDA,gBAAwB,0BAAA,EAAA,cAAA,GAAA,eAAA,GAAA,MAAA,GACxB,eAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EACxB,YAAwB,0BAAA,EAAA,cAAA,EAAA,eAAA,EAAA,MAAA,EAExB,aAAgC,mBAAA,qBAAA,sBAAA,iBAAA,uBAAA,cAAA,mBAAA,cAAA,eAAA,cAChC,gBAAgC,mBAAA,mBAAA,sBAAA,iBAAA,uBAAA,iBAAA,mBAAA,iBAAA,eAAA,iBAChC,qBAAgC,mBAAA,qBAAA,sBAAA,kBAAA,uBAAA,sBAAA,mBAAA,sBAAA,eAAA,sBAChC,wBAAgC,mBAAA,mBAAA,sBAAA,kBAAA,uBAAA,yBAAA,mBAAA,yBAAA,eAAA,yBAEhC,cAA8B,kBAAA,eAAA,cAAA,eAAA,UAAA,eAC9B,gBAA8B,kBAAA,iBAAA,cAAA,iBAAA,UAAA,iBAC9B,sBAA8B,kBAAA,uBAAA,cAAA,uBAAA,UAAA,uBAE9B,0BAAoC,iBAAA,gBAAA,wBAAA,qBAAA,cAAA,gBAAA,gBAAA,qBACpC,wBAAoC,iBAAA,cAAA,wBAAA,mBAAA,cAAA,cAAA,gBAAA,mBACpC,2BAAoC,iBAAA,iBAAA,wBAAA,iBAAA,cAAA,iBAAA,gBAAA,iBACpC,4BAAoC,iBAAA,kBAAA,wBAAA,wBAAA,cAAA,kBAAA,gBAAA,wBACpC,2BAAoC,wBAAA,uBAAA,cAAA,qBAAA,gBAAA,uBAEpC,sBAAiC,kBAAA,gBAAA,oBAAA,qBAAA,eAAA,gBAAA,YAAA,qBACjC,oBAAiC,kBAAA,cAAA,oBAAA,mBAAA,eAAA,cAAA,YAAA,mBACjC,uBAAiC,kBAAA,iBAAA,oBAAA,iBAAA,eAAA,iBAAA,YAAA,iBACjC,yBAAiC,kBAAA,mBAAA,oBAAA,mBAAA,eAAA,mBAAA,YAAA,mBACjC,wBAAiC,kBAAA,kBAAA,oBAAA,kBAAA,eAAA,kBAAA,YAAA,kBAEjC,wBAAkC,sBAAA,qBAAA,mBAAA,gBAAA,cAAA,qBAClC,sBAAkC,sBAAA,mBAAA,mBAAA,cAAA,cAAA,mBAClC,yBAAkC,sBAAA,iBAAA,mBAAA,iBAAA,cAAA,iBAClC,0BAAkC,sBAAA,wBAAA,mBAAA,kBAAA,cAAA,wBAClC,yBAAkC,sBAAA,uBAAA,mBAAA,qBAAA,cAAA,uBAClC,0BAAkC,sBAAA,kBAAA,mBAAA,kBAAA,cAAA,kBAElC,oBAAgC,mBAAA,eAAA,oBAAA,eAAA,mBAAA,eAAA,WAAA,eAChC,qBAAgC,mBAAA,qBAAA,oBAAA,gBAAA,WAAA,qBAChC,mBAAgC,mBAAA,mBAAA,oBAAA,cAAA,WAAA,mBAChC,sBAAgC,mBAAA,iBAAA,oBAAA,iBAAA,mBAAA,iBAAA,WAAA,iBAChC,wBAAgC,mBAAA,mBAAA,oBAAA,mBAAA,WAAA,mBAChC,uBAAgC,mBAAA,kBAAA,oBAAA,kBAAA,mBAAA,kBAAA,WAAA,mBCzChC,YCHF,MAAA,eDIE,aCDF,MAAA,gBDEE,YCCF,MAAA,e/CiDE,yB8CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB/CiDE,yB8CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB/CiDE,yB8CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gB/CiDE,0B8CpDA,eCHF,MAAA,eDIE,gBCDF,MAAA,gBDEE,eCCF,MAAA,gBCLF,WACE,SAAA,MACA,IAAA,EACA,MAAA,EACA,KAAA,EACA,QAAA,KAGF,cACE,SAAA,MACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,KAGF,YACE,SAAA,eAAA,SAAA,OACA,IAAA,EACA,QAAA,KCjBF,SCEE,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EACA,SAAA,OACA,KAAA,cACA,YAAA,OACA,kBAAA,WAAA,UAAA,WACA,OAAA,EAUA,0BAAA,yBAEE,SAAA,OACA,MAAA,KACA,OAAA,KACA,SAAA,QACA,KAAA,KACA,YAAA,OACA,kBAAA,KAAA,UAAA,KC5BA,MAAuB,MAAA,cAAvB,MAAuB,MAAA,cAAvB,MAAuB,MAAA,cAAvB,OAAuB,MAAA,eAAvB,MAAuB,OAAA,cAAvB,MAAuB,OAAA,cAAvB,MAAuB,OAAA,cAAvB,OAAuB,OAAA,eAI3B,QAAU,UAAA,eACV,QAAU,WAAA,eCAF,KAAiC,OAAA,YACjC,MAAiC,WAAA,YACjC,MAAiC,aAAA,YACjC,MAAiC,cAAA,YACjC,MAAiC,YAAA,YACjC,MACE,aAAA,YACA,YAAA,YAEF,MACE,WAAA,YACA,cAAA,YAXF,KAAiC,OAAA,iBACjC,MAAiC,WAAA,iBACjC,MAAiC,aAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,YAAA,iBACjC,MACE,aAAA,iBACA,YAAA,iBAEF,MACE,WAAA,iBACA,cAAA,iBAXF,KAAiC,OAAA,gBACjC,MAAiC,WAAA,gBACjC,MAAiC,aAAA,gBACjC,MAAiC,cAAA,gBACjC,MAAiC,YAAA,gBACjC,MACE,aAAA,gBACA,YAAA,gBAEF,MACE,WAAA,gBACA,cAAA,gBAXF,KAAiC,OAAA,eACjC,MAAiC,WAAA,eACjC,MAAiC,aAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,YAAA,eACjC,MACE,aAAA,eACA,YAAA,eAEF,MACE,WAAA,eACA,cAAA,eAXF,KAAiC,OAAA,iBACjC,MAAiC,WAAA,iBACjC,MAAiC,aAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,YAAA,iBACjC,MACE,aAAA,iBACA,YAAA,iBAEF,MACE,WAAA,iBACA,cAAA,iBAXF,KAAiC,OAAA,eACjC,MAAiC,WAAA,eACjC,MAAiC,aAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,YAAA,eACjC,MACE,aAAA,eACA,YAAA,eAEF,MACE,WAAA,eACA,cAAA,eAXF,KAAiC,QAAA,YACjC,MAAiC,YAAA,YACjC,MAAiC,cAAA,YACjC,MAAiC,eAAA,YACjC,MAAiC,aAAA,YACjC,MACE,cAAA,YACA,aAAA,YAEF,MACE,YAAA,YACA,eAAA,YAXF,KAAiC,QAAA,iBACjC,MAAiC,YAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,eAAA,iBACjC,MAAiC,aAAA,iBACjC,MACE,cAAA,iBACA,aAAA,iBAEF,MACE,YAAA,iBACA,eAAA,iBAXF,KAAiC,QAAA,gBACjC,MAAiC,YAAA,gBACjC,MAAiC,cAAA,gBACjC,MAAiC,eAAA,gBACjC,MAAiC,aAAA,gBACjC,MACE,cAAA,gBACA,aAAA,gBAEF,MACE,YAAA,gBACA,eAAA,gBAXF,KAAiC,QAAA,eACjC,MAAiC,YAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,eAAA,eACjC,MAAiC,aAAA,eACjC,MACE,cAAA,eACA,aAAA,eAEF,MACE,YAAA,eACA,eAAA,eAXF,KAAiC,QAAA,iBACjC,MAAiC,YAAA,iBACjC,MAAiC,cAAA,iBACjC,MAAiC,eAAA,iBACjC,MAAiC,aAAA,iBACjC,MACE,cAAA,iBACA,aAAA,iBAEF,MACE,YAAA,iBACA,eAAA,iBAXF,KAAiC,QAAA,eACjC,MAAiC,YAAA,eACjC,MAAiC,cAAA,eACjC,MAAiC,eAAA,eACjC,MAAiC,aAAA,eACjC,MACE,cAAA,eACA,aAAA,eAEF,MACE,YAAA,eACA,eAAA,eAMN,QAAoB,OAAA,eACpB,SAAoB,WAAA,eACpB,SAAoB,aAAA,eACpB,SAAoB,cAAA,eACpB,SAAoB,YAAA,eACpB,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,epDmBF,yBoD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBpDmBF,yBoD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBpDmBF,yBoD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBpDmBF,0BoD/CI,QAAiC,OAAA,YACjC,SAAiC,WAAA,YACjC,SAAiC,aAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,YAAA,YACjC,SACE,aAAA,YACA,YAAA,YAEF,SACE,WAAA,YACA,cAAA,YAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,gBACjC,SAAiC,WAAA,gBACjC,SAAiC,aAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,YAAA,gBACjC,SACE,aAAA,gBACA,YAAA,gBAEF,SACE,WAAA,gBACA,cAAA,gBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,OAAA,iBACjC,SAAiC,WAAA,iBACjC,SAAiC,aAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,YAAA,iBACjC,SACE,aAAA,iBACA,YAAA,iBAEF,SACE,WAAA,iBACA,cAAA,iBAXF,QAAiC,OAAA,eACjC,SAAiC,WAAA,eACjC,SAAiC,aAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,YAAA,eACjC,SACE,aAAA,eACA,YAAA,eAEF,SACE,WAAA,eACA,cAAA,eAXF,QAAiC,QAAA,YACjC,SAAiC,YAAA,YACjC,SAAiC,cAAA,YACjC,SAAiC,eAAA,YACjC,SAAiC,aAAA,YACjC,SACE,cAAA,YACA,aAAA,YAEF,SACE,YAAA,YACA,eAAA,YAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,gBACjC,SAAiC,YAAA,gBACjC,SAAiC,cAAA,gBACjC,SAAiC,eAAA,gBACjC,SAAiC,aAAA,gBACjC,SACE,cAAA,gBACA,aAAA,gBAEF,SACE,YAAA,gBACA,eAAA,gBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAXF,QAAiC,QAAA,iBACjC,SAAiC,YAAA,iBACjC,SAAiC,cAAA,iBACjC,SAAiC,eAAA,iBACjC,SAAiC,aAAA,iBACjC,SACE,cAAA,iBACA,aAAA,iBAEF,SACE,YAAA,iBACA,eAAA,iBAXF,QAAiC,QAAA,eACjC,SAAiC,YAAA,eACjC,SAAiC,cAAA,eACjC,SAAiC,eAAA,eACjC,SAAiC,aAAA,eACjC,SACE,cAAA,eACA,aAAA,eAEF,SACE,YAAA,eACA,eAAA,eAMN,WAAoB,OAAA,eACpB,YAAoB,WAAA,eACpB,YAAoB,aAAA,eACpB,YAAoB,cAAA,eACpB,YAAoB,YAAA,eACpB,YACE,aAAA,eACA,YAAA,eAEF,YACE,WAAA,eACA,cAAA,gBC/BN,cAAiB,WAAA,kBACjB,aAAiB,YAAA,iBACjB,eCJE,SAAA,OACA,cAAA,SACA,YAAA,ODUE,WAAwB,WAAA,eACxB,YAAwB,WAAA,gBACxB,aAAwB,WAAA,iBrDsCxB,yBqDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBrDsCxB,yBqDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBrDsCxB,yBqDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBrDsCxB,0BqDxCA,cAAwB,WAAA,eACxB,eAAwB,WAAA,gBACxB,gBAAwB,WAAA,kBAM5B,gBAAmB,eAAA,oBACnB,gBAAmB,eAAA,oBACnB,iBAAmB,eAAA,qBAInB,oBAAsB,YAAA,IACtB,kBAAsB,YAAA,IACtB,aAAsB,WAAA,OAItB,YACE,MAAA,eElCA,YACE,MAAA,kBjEkBA,mBAAA,mBiEdE,MAAA,kBALJ,cACE,MAAA,kBjEkBA,qBAAA,qBiEdE,MAAA,kBALJ,cACE,MAAA,kBjEkBA,qBAAA,qBiEdE,MAAA,kBALJ,WACE,MAAA,kBjEkBA,kBAAA,kBiEdE,MAAA,kBALJ,cACE,MAAA,kBjEkBA,qBAAA,qBiEdE,MAAA,kBALJ,aACE,MAAA,kBjEkBA,oBAAA,oBiEdE,MAAA,kBALJ,gBACE,MAAA,kBjEkBA,uBAAA,uBiEdE,MAAA,kBFkDN,WGxDE,KAAA,CAAA,CAAA,EAAA,EACA,MAAA,YACA,YAAA,KACA,iBAAA,YACA,OAAA,ECFF,SCDE,WAAA,kBDKF,WCLE,WAAA"} \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.eot b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index b93a4953f..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.svg b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index 94fb5490a..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="400" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
-<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
-<glyph unicode="&#x2000;" horiz-adv-x="650" />
-<glyph unicode="&#x2001;" horiz-adv-x="1300" />
-<glyph unicode="&#x2002;" horiz-adv-x="650" />
-<glyph unicode="&#x2003;" horiz-adv-x="1300" />
-<glyph unicode="&#x2004;" horiz-adv-x="433" />
-<glyph unicode="&#x2005;" horiz-adv-x="325" />
-<glyph unicode="&#x2006;" horiz-adv-x="216" />
-<glyph unicode="&#x2007;" horiz-adv-x="216" />
-<glyph unicode="&#x2008;" horiz-adv-x="162" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="325" />
-<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
-<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
-<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
-<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
-<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
-<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
-<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
-<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
-<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
-<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
-<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
-<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
-<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
-<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
-<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
-<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
-<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
-<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
-<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
-<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
-<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
-<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
-<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
-<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
-<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
-<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
-<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
-<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
-<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
-<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
-<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
-<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
-<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
-<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
-<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
-<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
-<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
-<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
-<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
-<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
-<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
-<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
-<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
-<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
-<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
-<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
-<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
-<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
-<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
-<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
-<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
-<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
-<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
-<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
-<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
-<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
-<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
-<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
-<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
-<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
-<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
-<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
-<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
-<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
-<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
-<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
-<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
-<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
-<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
-<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
-<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
-<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
-<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
-<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
-<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
-<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
-<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
-<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
-<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
-<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
-<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
-<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
-<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
-<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
-<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
-<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
-<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
-<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
-<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
-<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
-<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
-<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
-<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
-<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
-<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
-<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
-<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
-<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
-<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
-<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
-<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
-<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
-<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
-<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
-<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
-<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
-<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
-<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
-<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
-<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
-<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
-<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
-<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
-<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
-<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
-<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
-<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
-<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
-<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
-<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
-<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
-<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
-<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
-<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
-<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
-<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
-<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
-<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
-<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
-<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
-<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
-<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
-<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
-<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
-<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
-<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
-<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
-<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
-<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
-<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
-<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
-<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
-<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
-<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
-<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
-<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
-<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
-<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
-<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
-<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
-<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
-<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
-<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
-<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
-<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
-<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
-<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
-<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
-<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
-<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
-<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
-<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
-<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
-<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
-<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
-<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
-<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
-<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
-<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
-</font>
-</defs></svg> \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.ttf b/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 1413fc609..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 9e612858f..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/library/bootstrap/fonts/glyphicons-halflings-regular.woff2
deleted file mode 100644
index 64539b54c..000000000
--- a/library/bootstrap/fonts/glyphicons-halflings-regular.woff2
+++ /dev/null
Binary files differ
diff --git a/library/bootstrap/js/bootstrap.js b/library/bootstrap/js/bootstrap.js
index 8a2e99a53..5f2db5c86 100644
--- a/library/bootstrap/js/bootstrap.js
+++ b/library/bootstrap/js/bootstrap.js
@@ -1,2377 +1,3572 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under the MIT license
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
if (typeof jQuery === 'undefined') {
- throw new Error('Bootstrap\'s JavaScript requires jQuery')
+ throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
}
+function ($) {
- 'use strict';
var version = $.fn.jquery.split(' ')[0].split('.')
- if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) {
+ throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')
}
}(jQuery);
-/* ========================================================================
- * Bootstrap: transition.js v3.3.7
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
+
++function () {
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ * --------------------------------------------------------------------------
+ */
+var Util = function ($) {
-+function ($) {
- 'use strict';
+ /**
+ * ------------------------------------------------------------------------
+ * Private TransitionEnd Helpers
+ * ------------------------------------------------------------------------
+ */
+
+ var transition = false;
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
- // ============================================================
+ var MAX_UID = 1000000;
- function transitionEnd() {
- var el = document.createElement('bootstrap')
+ var TransitionEndEvent = {
+ WebkitTransition: 'webkitTransitionEnd',
+ MozTransition: 'transitionend',
+ OTransition: 'oTransitionEnd otransitionend',
+ transition: 'transitionend'
+ };
- var transEndEventNames = {
- WebkitTransition : 'webkitTransitionEnd',
- MozTransition : 'transitionend',
- OTransition : 'oTransitionEnd otransitionend',
- transition : 'transitionend'
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
+ function toType(obj) {
+ return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
+ }
+
+ function isElement(obj) {
+ return (obj[0] || obj).nodeType;
+ }
+
+ function getSpecialTransitionEndEvent() {
+ return {
+ bindType: transition.end,
+ delegateType: transition.end,
+ handle: function handle(event) {
+ if ($(event.target).is(this)) {
+ return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
+ }
+ return undefined;
+ }
+ };
+ }
+
+ function transitionEndTest() {
+ if (window.QUnit) {
+ return false;
}
- for (var name in transEndEventNames) {
+ var el = document.createElement('bootstrap');
+
+ for (var name in TransitionEndEvent) {
if (el.style[name] !== undefined) {
- return { end: transEndEventNames[name] }
+ return {
+ end: TransitionEndEvent[name]
+ };
}
}
- return false // explicit for ie8 ( ._.)
+ return false;
}
- // http://blog.alexmaccaw.com/css-transitions
- $.fn.emulateTransitionEnd = function (duration) {
- var called = false
- var $el = this
- $(this).one('bsTransitionEnd', function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration)
- return this
+ function transitionEndEmulator(duration) {
+ var _this = this;
+
+ var called = false;
+
+ $(this).one(Util.TRANSITION_END, function () {
+ called = true;
+ });
+
+ setTimeout(function () {
+ if (!called) {
+ Util.triggerTransitionEnd(_this);
+ }
+ }, duration);
+
+ return this;
}
- $(function () {
- $.support.transition = transitionEnd()
+ function setTransitionEndSupport() {
+ transition = transitionEndTest();
- if (!$.support.transition) return
+ $.fn.emulateTransitionEnd = transitionEndEmulator;
- $.event.special.bsTransitionEnd = {
- bindType: $.support.transition.end,
- delegateType: $.support.transition.end,
- handle: function (e) {
- if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+ if (Util.supportsTransitionEnd()) {
+ $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
+ }
+ }
+
+ /**
+ * --------------------------------------------------------------------------
+ * Public Util Api
+ * --------------------------------------------------------------------------
+ */
+
+ var Util = {
+
+ TRANSITION_END: 'bsTransitionEnd',
+
+ getUID: function getUID(prefix) {
+ do {
+ // eslint-disable-next-line no-bitwise
+ prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
+ } while (document.getElementById(prefix));
+ return prefix;
+ },
+ getSelectorFromElement: function getSelectorFromElement(element) {
+ var selector = element.getAttribute('data-target');
+ if (!selector || selector === '#') {
+ selector = element.getAttribute('href') || '';
+ }
+
+ try {
+ var $selector = $(selector);
+ return $selector.length > 0 ? selector : null;
+ } catch (error) {
+ return null;
+ }
+ },
+ reflow: function reflow(element) {
+ return element.offsetHeight;
+ },
+ triggerTransitionEnd: function triggerTransitionEnd(element) {
+ $(element).trigger(transition.end);
+ },
+ supportsTransitionEnd: function supportsTransitionEnd() {
+ return Boolean(transition);
+ },
+ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
+ for (var property in configTypes) {
+ if (configTypes.hasOwnProperty(property)) {
+ var expectedTypes = configTypes[property];
+ var value = config[property];
+ var valueType = value && isElement(value) ? 'element' : toType(value);
+
+ if (!new RegExp(expectedTypes).test(valueType)) {
+ throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
+ }
+ }
}
}
- })
+ };
+ setTransitionEndSupport();
+
+ return Util;
}(jQuery);
-/* ========================================================================
- * Bootstrap: alert.js v3.3.7
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ * --------------------------------------------------------------------------
+ */
+var Alert = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'alert';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.alert';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+
+ var Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+ };
+
+ var Event = {
+ CLOSE: 'close' + EVENT_KEY,
+ CLOSED: 'closed' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Alert = function () {
+ function Alert(element) {
+ _classCallCheck(this, Alert);
+
+ this._element = element;
+ }
-+function ($) {
- 'use strict';
+ // getters
- // ALERT CLASS DEFINITION
- // ======================
+ // public
- var dismiss = '[data-dismiss="alert"]'
- var Alert = function (el) {
- $(el).on('click', dismiss, this.close)
- }
+ Alert.prototype.close = function close(element) {
+ element = element || this._element;
- Alert.VERSION = '3.3.7'
+ var rootElement = this._getRootElement(element);
+ var customEvent = this._triggerCloseEvent(rootElement);
- Alert.TRANSITION_DURATION = 150
+ if (customEvent.isDefaultPrevented()) {
+ return;
+ }
- Alert.prototype.close = function (e) {
- var $this = $(this)
- var selector = $this.attr('data-target')
+ this._removeElement(rootElement);
+ };
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
+ Alert.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ };
- var $parent = $(selector === '#' ? [] : selector)
+ // private
- if (e) e.preventDefault()
+ Alert.prototype._getRootElement = function _getRootElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ var parent = false;
- if (!$parent.length) {
- $parent = $this.closest('.alert')
- }
+ if (selector) {
+ parent = $(selector)[0];
+ }
- $parent.trigger(e = $.Event('close.bs.alert'))
+ if (!parent) {
+ parent = $(element).closest('.' + ClassName.ALERT)[0];
+ }
- if (e.isDefaultPrevented()) return
+ return parent;
+ };
- $parent.removeClass('in')
+ Alert.prototype._triggerCloseEvent = function _triggerCloseEvent(element) {
+ var closeEvent = $.Event(Event.CLOSE);
- function removeElement() {
- // detach from parent, fire event then clean up data
- $parent.detach().trigger('closed.bs.alert').remove()
- }
+ $(element).trigger(closeEvent);
+ return closeEvent;
+ };
- $.support.transition && $parent.hasClass('fade') ?
- $parent
- .one('bsTransitionEnd', removeElement)
- .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
- removeElement()
- }
+ Alert.prototype._removeElement = function _removeElement(element) {
+ var _this2 = this;
+ $(element).removeClass(ClassName.SHOW);
- // ALERT PLUGIN DEFINITION
- // =======================
+ if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
+ this._destroyElement(element);
+ return;
+ }
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.alert')
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this2._destroyElement(element, event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ };
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
+ Alert.prototype._destroyElement = function _destroyElement(element) {
+ $(element).detach().trigger(Event.CLOSED).remove();
+ };
- var old = $.fn.alert
+ // static
- $.fn.alert = Plugin
- $.fn.alert.Constructor = Alert
+ Alert._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $element = $(this);
+ var data = $element.data(DATA_KEY);
+ if (!data) {
+ data = new Alert(this);
+ $element.data(DATA_KEY, data);
+ }
- // ALERT NO CONFLICT
- // =================
+ if (config === 'close') {
+ data[config](this);
+ }
+ });
+ };
- $.fn.alert.noConflict = function () {
- $.fn.alert = old
- return this
- }
+ Alert._handleDismiss = function _handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault();
+ }
+ alertInstance.close(this);
+ };
+ };
- // ALERT DATA-API
- // ==============
+ _createClass(Alert, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Alert;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+ $.fn[NAME] = Alert._jQueryInterface;
+ $.fn[NAME].Constructor = Alert;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Alert._jQueryInterface;
+ };
+ return Alert;
}(jQuery);
-/* ========================================================================
- * Bootstrap: button.js v3.3.7
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ * --------------------------------------------------------------------------
+ */
+var Button = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'button';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.button';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+
+ var ClassName = {
+ ACTIVE: 'active',
+ BUTTON: 'btn',
+ FOCUS: 'focus'
+ };
+
+ var Selector = {
+ DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
+ DATA_TOGGLE: '[data-toggle="buttons"]',
+ INPUT: 'input',
+ ACTIVE: '.active',
+ BUTTON: '.btn'
+ };
+
+ var Event = {
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Button = function () {
+ function Button(element) {
+ _classCallCheck(this, Button);
+
+ this._element = element;
+ }
-+function ($) {
- 'use strict';
+ // getters
- // BUTTON PUBLIC CLASS DEFINITION
- // ==============================
+ // public
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Button.DEFAULTS, options)
- this.isLoading = false
- }
+ Button.prototype.toggle = function toggle() {
+ var triggerChangeEvent = true;
+ var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
- Button.VERSION = '3.3.7'
+ if (rootElement) {
+ var input = $(this._element).find(Selector.INPUT)[0];
- Button.DEFAULTS = {
- loadingText: 'loading...'
- }
+ if (input) {
+ if (input.type === 'radio') {
+ if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) {
+ triggerChangeEvent = false;
+ } else {
+ var activeElement = $(rootElement).find(Selector.ACTIVE)[0];
- Button.prototype.setState = function (state) {
- var d = 'disabled'
- var $el = this.$element
- var val = $el.is('input') ? 'val' : 'html'
- var data = $el.data()
+ if (activeElement) {
+ $(activeElement).removeClass(ClassName.ACTIVE);
+ }
+ }
+ }
- state += 'Text'
+ if (triggerChangeEvent) {
+ input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
+ $(input).trigger('change');
+ }
- if (data.resetText == null) $el.data('resetText', $el[val]())
+ input.focus();
+ }
+ }
- // push to event loop to allow forms to submit
- setTimeout($.proxy(function () {
- $el[val](data[state] == null ? this.options[state] : data[state])
+ this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
- if (state == 'loadingText') {
- this.isLoading = true
- $el.addClass(d).attr(d, d).prop(d, true)
- } else if (this.isLoading) {
- this.isLoading = false
- $el.removeClass(d).removeAttr(d).prop(d, false)
+ if (triggerChangeEvent) {
+ $(this._element).toggleClass(ClassName.ACTIVE);
}
- }, this), 0)
- }
+ };
- Button.prototype.toggle = function () {
- var changed = true
- var $parent = this.$element.closest('[data-toggle="buttons"]')
-
- if ($parent.length) {
- var $input = this.$element.find('input')
- if ($input.prop('type') == 'radio') {
- if ($input.prop('checked')) changed = false
- $parent.find('.active').removeClass('active')
- this.$element.addClass('active')
- } else if ($input.prop('type') == 'checkbox') {
- if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
- this.$element.toggleClass('active')
- }
- $input.prop('checked', this.$element.hasClass('active'))
- if (changed) $input.trigger('change')
- } else {
- this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
- this.$element.toggleClass('active')
- }
- }
+ Button.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ this._element = null;
+ };
+
+ // static
+
+ Button._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ if (!data) {
+ data = new Button(this);
+ $(this).data(DATA_KEY, data);
+ }
- // BUTTON PLUGIN DEFINITION
- // ========================
+ if (config === 'toggle') {
+ data[config]();
+ }
+ });
+ };
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.button')
- var options = typeof option == 'object' && option
+ _createClass(Button, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
+ return Button;
+ }();
- if (option == 'toggle') data.toggle()
- else if (option) data.setState(option)
- })
- }
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- var old = $.fn.button
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ event.preventDefault();
- $.fn.button = Plugin
- $.fn.button.Constructor = Button
+ var button = event.target;
+ if (!$(button).hasClass(ClassName.BUTTON)) {
+ button = $(button).closest(Selector.BUTTON);
+ }
- // BUTTON NO CONFLICT
- // ==================
+ Button._jQueryInterface.call($(button), 'toggle');
+ }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
+ var button = $(event.target).closest(Selector.BUTTON)[0];
+ $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Button._jQueryInterface;
+ $.fn[NAME].Constructor = Button;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Button._jQueryInterface;
+ };
+
+ return Button;
+}(jQuery);
- $.fn.button.noConflict = function () {
- $.fn.button = old
- return this
- }
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): carousel.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+var Carousel = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'carousel';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.carousel';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 600;
+ var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
+ var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
+
+ var Default = {
+ interval: 5000,
+ keyboard: true,
+ slide: false,
+ pause: 'hover',
+ wrap: true
+ };
+
+ var DefaultType = {
+ interval: '(number|boolean)',
+ keyboard: 'boolean',
+ slide: '(boolean|string)',
+ pause: '(string|boolean)',
+ wrap: 'boolean'
+ };
+
+ var Direction = {
+ NEXT: 'next',
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
+ };
+
+ var Event = {
+ SLIDE: 'slide' + EVENT_KEY,
+ SLID: 'slid' + EVENT_KEY,
+ KEYDOWN: 'keydown' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY,
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ CAROUSEL: 'carousel',
+ ACTIVE: 'active',
+ SLIDE: 'slide',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
+ ITEM: 'carousel-item'
+ };
+
+ var Selector = {
+ ACTIVE: '.active',
+ ACTIVE_ITEM: '.active.carousel-item',
+ ITEM: '.carousel-item',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
+ INDICATORS: '.carousel-indicators',
+ DATA_SLIDE: '[data-slide], [data-slide-to]',
+ DATA_RIDE: '[data-ride="carousel"]'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Carousel = function () {
+ function Carousel(element, config) {
+ _classCallCheck(this, Carousel);
+
+ this._items = null;
+ this._interval = null;
+ this._activeElement = null;
+
+ this._isPaused = false;
+ this._isSliding = false;
+
+ this._config = this._getConfig(config);
+ this._element = $(element)[0];
+ this._indicatorsElement = $(this._element).find(Selector.INDICATORS)[0];
+
+ this._addEventListeners();
+ }
+
+ // getters
- // BUTTON DATA-API
- // ===============
+ // public
- $(document)
- .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- var $btn = $(e.target).closest('.btn')
- Plugin.call($btn, 'toggle')
- if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
- // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
- e.preventDefault()
- // The target component still receive the focus
- if ($btn.is('input,button')) $btn.trigger('focus')
- else $btn.find('input:visible,button:visible').first().trigger('focus')
+ Carousel.prototype.next = function next() {
+ if (!this._isSliding) {
+ this._slide(Direction.NEXT);
}
- })
- .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
- })
+ };
-}(jQuery);
+ Carousel.prototype.nextWhenVisible = function nextWhenVisible() {
+ // Don't call next when the page isn't visible
+ if (!document.hidden) {
+ this.next();
+ }
+ };
-/* ========================================================================
- * Bootstrap: carousel.js v3.3.7
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ Carousel.prototype.prev = function prev() {
+ if (!this._isSliding) {
+ this._slide(Direction.PREV);
+ }
+ };
+ Carousel.prototype.pause = function pause(event) {
+ if (!event) {
+ this._isPaused = true;
+ }
-+function ($) {
- 'use strict';
-
- // CAROUSEL CLASS DEFINITION
- // =========================
-
- var Carousel = function (element, options) {
- this.$element = $(element)
- this.$indicators = this.$element.find('.carousel-indicators')
- this.options = options
- this.paused = null
- this.sliding = null
- this.interval = null
- this.$active = null
- this.$items = null
-
- this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
-
- this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
- .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
- .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
- }
+ if ($(this._element).find(Selector.NEXT_PREV)[0] && Util.supportsTransitionEnd()) {
+ Util.triggerTransitionEnd(this._element);
+ this.cycle(true);
+ }
- Carousel.VERSION = '3.3.7'
+ clearInterval(this._interval);
+ this._interval = null;
+ };
- Carousel.TRANSITION_DURATION = 600
+ Carousel.prototype.cycle = function cycle(event) {
+ if (!event) {
+ this._isPaused = false;
+ }
- Carousel.DEFAULTS = {
- interval: 5000,
- pause: 'hover',
- wrap: true,
- keyboard: true
- }
+ if (this._interval) {
+ clearInterval(this._interval);
+ this._interval = null;
+ }
- Carousel.prototype.keydown = function (e) {
- if (/input|textarea/i.test(e.target.tagName)) return
- switch (e.which) {
- case 37: this.prev(); break
- case 39: this.next(); break
- default: return
- }
+ if (this._config.interval && !this._isPaused) {
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
+ }
+ };
- e.preventDefault()
- }
+ Carousel.prototype.to = function to(index) {
+ var _this3 = this;
- Carousel.prototype.cycle = function (e) {
- e || (this.paused = false)
+ this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
- this.interval && clearInterval(this.interval)
+ var activeIndex = this._getItemIndex(this._activeElement);
- this.options.interval
- && !this.paused
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+ if (index > this._items.length - 1 || index < 0) {
+ return;
+ }
- return this
- }
+ if (this._isSliding) {
+ $(this._element).one(Event.SLID, function () {
+ return _this3.to(index);
+ });
+ return;
+ }
- Carousel.prototype.getItemIndex = function (item) {
- this.$items = item.parent().children('.item')
- return this.$items.index(item || this.$active)
- }
+ if (activeIndex === index) {
+ this.pause();
+ this.cycle();
+ return;
+ }
- Carousel.prototype.getItemForDirection = function (direction, active) {
- var activeIndex = this.getItemIndex(active)
- var willWrap = (direction == 'prev' && activeIndex === 0)
- || (direction == 'next' && activeIndex == (this.$items.length - 1))
- if (willWrap && !this.options.wrap) return active
- var delta = direction == 'prev' ? -1 : 1
- var itemIndex = (activeIndex + delta) % this.$items.length
- return this.$items.eq(itemIndex)
- }
+ var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
- Carousel.prototype.to = function (pos) {
- var that = this
- var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+ this._slide(direction, this._items[index]);
+ };
- if (pos > (this.$items.length - 1) || pos < 0) return
+ Carousel.prototype.dispose = function dispose() {
+ $(this._element).off(EVENT_KEY);
+ $.removeData(this._element, DATA_KEY);
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
- if (activeIndex == pos) return this.pause().cycle()
+ this._items = null;
+ this._config = null;
+ this._element = null;
+ this._interval = null;
+ this._isPaused = null;
+ this._isSliding = null;
+ this._activeElement = null;
+ this._indicatorsElement = null;
+ };
- return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
- }
+ // private
- Carousel.prototype.pause = function (e) {
- e || (this.paused = true)
+ Carousel.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- if (this.$element.find('.next, .prev').length && $.support.transition) {
- this.$element.trigger($.support.transition.end)
- this.cycle(true)
- }
+ Carousel.prototype._addEventListeners = function _addEventListeners() {
+ var _this4 = this;
- this.interval = clearInterval(this.interval)
+ if (this._config.keyboard) {
+ $(this._element).on(Event.KEYDOWN, function (event) {
+ return _this4._keydown(event);
+ });
+ }
- return this
- }
+ if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
+ $(this._element).on(Event.MOUSEENTER, function (event) {
+ return _this4.pause(event);
+ }).on(Event.MOUSELEAVE, function (event) {
+ return _this4.cycle(event);
+ });
+ }
+ };
- Carousel.prototype.next = function () {
- if (this.sliding) return
- return this.slide('next')
- }
+ Carousel.prototype._keydown = function _keydown(event) {
+ if (/input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
- Carousel.prototype.prev = function () {
- if (this.sliding) return
- return this.slide('prev')
- }
+ switch (event.which) {
+ case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
+ this.prev();
+ break;
+ case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
+ this.next();
+ break;
+ default:
+ return;
+ }
+ };
+
+ Carousel.prototype._getItemIndex = function _getItemIndex(element) {
+ this._items = $.makeArray($(element).parent().find(Selector.ITEM));
+ return this._items.indexOf(element);
+ };
+
+ Carousel.prototype._getItemByDirection = function _getItemByDirection(direction, activeElement) {
+ var isNextDirection = direction === Direction.NEXT;
+ var isPrevDirection = direction === Direction.PREV;
+ var activeIndex = this._getItemIndex(activeElement);
+ var lastItemIndex = this._items.length - 1;
+ var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
+
+ if (isGoingToWrap && !this._config.wrap) {
+ return activeElement;
+ }
- Carousel.prototype.slide = function (type, next) {
- var $active = this.$element.find('.item.active')
- var $next = next || this.getItemForDirection(type, $active)
- var isCycling = this.interval
- var direction = type == 'next' ? 'left' : 'right'
- var that = this
+ var delta = direction === Direction.PREV ? -1 : 1;
+ var itemIndex = (activeIndex + delta) % this._items.length;
- if ($next.hasClass('active')) return (this.sliding = false)
+ return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
+ };
- var relatedTarget = $next[0]
- var slideEvent = $.Event('slide.bs.carousel', {
- relatedTarget: relatedTarget,
- direction: direction
- })
- this.$element.trigger(slideEvent)
- if (slideEvent.isDefaultPrevented()) return
+ Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
+ var targetIndex = this._getItemIndex(relatedTarget);
+ var fromIndex = this._getItemIndex($(this._element).find(Selector.ACTIVE_ITEM)[0]);
+ var slideEvent = $.Event(Event.SLIDE, {
+ relatedTarget: relatedTarget,
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
+ });
- this.sliding = true
+ $(this._element).trigger(slideEvent);
- isCycling && this.pause()
+ return slideEvent;
+ };
- if (this.$indicators.length) {
- this.$indicators.find('.active').removeClass('active')
- var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
- $nextIndicator && $nextIndicator.addClass('active')
- }
+ Carousel.prototype._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
+ if (this._indicatorsElement) {
+ $(this._indicatorsElement).find(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
- var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
- if ($.support.transition && this.$element.hasClass('slide')) {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- $active
- .one('bsTransitionEnd', function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () {
- that.$element.trigger(slidEvent)
- }, 0)
- })
- .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
- } else {
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger(slidEvent)
- }
+ var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
- isCycling && this.cycle()
+ if (nextIndicator) {
+ $(nextIndicator).addClass(ClassName.ACTIVE);
+ }
+ }
+ };
- return this
- }
+ Carousel.prototype._slide = function _slide(direction, element) {
+ var _this5 = this;
+ var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
+ var activeElementIndex = this._getItemIndex(activeElement);
+ var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
+ var nextElementIndex = this._getItemIndex(nextElement);
+ var isCycling = Boolean(this._interval);
- // CAROUSEL PLUGIN DEFINITION
- // ==========================
+ var directionalClassName = void 0;
+ var orderClassName = void 0;
+ var eventDirectionName = void 0;
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.carousel')
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
- var action = typeof option == 'string' ? option : options.slide
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT;
+ orderClassName = ClassName.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName.RIGHT;
+ orderClassName = ClassName.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
- if (typeof option == 'number') data.to(option)
- else if (action) data[action]()
- else if (options.interval) data.pause().cycle()
- })
- }
+ if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
+ this._isSliding = false;
+ return;
+ }
- var old = $.fn.carousel
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
+ if (slideEvent.isDefaultPrevented()) {
+ return;
+ }
- $.fn.carousel = Plugin
- $.fn.carousel.Constructor = Carousel
+ if (!activeElement || !nextElement) {
+ // some weirdness is happening, so we bail
+ return;
+ }
+ this._isSliding = true;
- // CAROUSEL NO CONFLICT
- // ====================
+ if (isCycling) {
+ this.pause();
+ }
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old
- return this
- }
+ this._setActiveIndicatorElement(nextElement);
+ var slidEvent = $.Event(Event.SLID, {
+ relatedTarget: nextElement,
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
+ });
- // CAROUSEL DATA-API
- // =================
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
- var clickHandler = function (e) {
- var href
- var $this = $(this)
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
- if (!$target.hasClass('carousel')) return
- var options = $.extend({}, $target.data(), $this.data())
- var slideIndex = $this.attr('data-slide-to')
- if (slideIndex) options.interval = false
+ $(nextElement).addClass(orderClassName);
- Plugin.call($target, options)
+ Util.reflow(nextElement);
- if (slideIndex) {
- $target.data('bs.carousel').to(slideIndex)
- }
+ $(activeElement).addClass(directionalClassName);
+ $(nextElement).addClass(directionalClassName);
- e.preventDefault()
- }
+ $(activeElement).one(Util.TRANSITION_END, function () {
+ $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE);
- $(document)
- .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
- .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+ $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName);
- $(window).on('load', function () {
- $('[data-ride="carousel"]').each(function () {
- var $carousel = $(this)
- Plugin.call($carousel, $carousel.data())
- })
- })
+ _this5._isSliding = false;
-}(jQuery);
+ setTimeout(function () {
+ return $(_this5._element).trigger(slidEvent);
+ }, 0);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ $(activeElement).removeClass(ClassName.ACTIVE);
+ $(nextElement).addClass(ClassName.ACTIVE);
-/* ========================================================================
- * Bootstrap: collapse.js v3.3.7
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ this._isSliding = false;
+ $(this._element).trigger(slidEvent);
+ }
-/* jshint latedef: false */
+ if (isCycling) {
+ this.cycle();
+ }
+ };
-+function ($) {
- 'use strict';
-
- // COLLAPSE PUBLIC CLASS DEFINITION
- // ================================
-
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Collapse.DEFAULTS, options)
- this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
- '[data-toggle="collapse"][data-target="#' + element.id + '"]')
- this.transitioning = null
-
- if (this.options.parent) {
- this.$parent = this.getParent()
- } else {
- this.addAriaAndCollapsedClass(this.$element, this.$trigger)
- }
+ // static
- if (this.options.toggle) this.toggle()
- }
+ Carousel._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = $.extend({}, Default, $(this).data());
- Collapse.VERSION = '3.3.7'
+ if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {
+ $.extend(_config, config);
+ }
- Collapse.TRANSITION_DURATION = 350
+ var action = typeof config === 'string' ? config : _config.slide;
- Collapse.DEFAULTS = {
- toggle: true
- }
+ if (!data) {
+ data = new Carousel(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- Collapse.prototype.dimension = function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
- }
+ if (typeof config === 'number') {
+ data.to(config);
+ } else if (typeof action === 'string') {
+ if (data[action] === undefined) {
+ throw new Error('No method named "' + action + '"');
+ }
+ data[action]();
+ } else if (_config.interval) {
+ data.pause();
+ data.cycle();
+ }
+ });
+ };
+
+ Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
+ var selector = Util.getSelectorFromElement(this);
- Collapse.prototype.show = function () {
- if (this.transitioning || this.$element.hasClass('in')) return
+ if (!selector) {
+ return;
+ }
- var activesData
- var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+ var target = $(selector)[0];
- if (actives && actives.length) {
- activesData = actives.data('bs.collapse')
- if (activesData && activesData.transitioning) return
- }
+ if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
+ return;
+ }
- var startEvent = $.Event('show.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
+ var config = $.extend({}, $(target).data(), $(this).data());
+ var slideIndex = this.getAttribute('data-slide-to');
- if (actives && actives.length) {
- Plugin.call(actives, 'hide')
- activesData || actives.data('bs.collapse', null)
- }
+ if (slideIndex) {
+ config.interval = false;
+ }
- var dimension = this.dimension()
+ Carousel._jQueryInterface.call($(target), config);
- this.$element
- .removeClass('collapse')
- .addClass('collapsing')[dimension](0)
- .attr('aria-expanded', true)
+ if (slideIndex) {
+ $(target).data(DATA_KEY).to(slideIndex);
+ }
- this.$trigger
- .removeClass('collapsed')
- .attr('aria-expanded', true)
+ event.preventDefault();
+ };
- this.transitioning = 1
+ _createClass(Carousel, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
+
+ return Carousel;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
+
+ $(window).on(Event.LOAD_DATA_API, function () {
+ $(Selector.DATA_RIDE).each(function () {
+ var $carousel = $(this);
+ Carousel._jQueryInterface.call($carousel, $carousel.data());
+ });
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Carousel._jQueryInterface;
+ $.fn[NAME].Constructor = Carousel;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Carousel._jQueryInterface;
+ };
+
+ return Carousel;
+}(jQuery);
- var complete = function () {
- this.$element
- .removeClass('collapsing')
- .addClass('collapse in')[dimension]('')
- this.transitioning = 0
- this.$element
- .trigger('shown.bs.collapse')
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): collapse.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Collapse = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'collapse';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.collapse';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 600;
+
+ var Default = {
+ toggle: true,
+ parent: ''
+ };
+
+ var DefaultType = {
+ toggle: 'boolean',
+ parent: 'string'
+ };
+
+ var Event = {
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ SHOW: 'show',
+ COLLAPSE: 'collapse',
+ COLLAPSING: 'collapsing',
+ COLLAPSED: 'collapsed'
+ };
+
+ var Dimension = {
+ WIDTH: 'width',
+ HEIGHT: 'height'
+ };
+
+ var Selector = {
+ ACTIVES: '.card > .show, .card > .collapsing',
+ DATA_TOGGLE: '[data-toggle="collapse"]',
+ DATA_CHILDREN: 'data-children'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Collapse = function () {
+ function Collapse(element, config) {
+ _classCallCheck(this, Collapse);
+
+ this._isTransitioning = false;
+ this._element = element;
+ this._config = this._getConfig(config);
+ this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
+ this._parent = this._config.parent ? this._getParent() : null;
+
+ if (!this._config.parent) {
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
+ }
+
+ this._selectorActives = Selector.ACTIVES;
+ if (this._parent) {
+ var childrenSelector = this._parent.hasAttribute(Selector.DATA_CHILDREN) ? this._parent.getAttribute(Selector.DATA_CHILDREN) : null;
+ if (childrenSelector !== null) {
+ this._selectorActives = childrenSelector + ' > .show, ' + childrenSelector + ' > .collapsing';
+ }
+ }
+
+ if (this._config.toggle) {
+ this.toggle();
+ }
}
- if (!$.support.transition) return complete.call(this)
+ // getters
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+ // public
- this.$element
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
- }
+ Collapse.prototype.toggle = function toggle() {
+ if ($(this._element).hasClass(ClassName.SHOW)) {
+ this.hide();
+ } else {
+ this.show();
+ }
+ };
- Collapse.prototype.hide = function () {
- if (this.transitioning || !this.$element.hasClass('in')) return
+ Collapse.prototype.show = function show() {
+ var _this6 = this;
- var startEvent = $.Event('hide.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
+ if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
- var dimension = this.dimension()
+ var actives = void 0;
+ var activesData = void 0;
- this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+ if (this._parent) {
+ actives = $.makeArray($(this._parent).find(this._selectorActives));
+ if (!actives.length) {
+ actives = null;
+ }
+ }
- this.$element
- .addClass('collapsing')
- .removeClass('collapse in')
- .attr('aria-expanded', false)
+ if (actives) {
+ activesData = $(actives).data(DATA_KEY);
+ if (activesData && activesData._isTransitioning) {
+ return;
+ }
+ }
- this.$trigger
- .addClass('collapsed')
- .attr('aria-expanded', false)
+ var startEvent = $.Event(Event.SHOW);
+ $(this._element).trigger(startEvent);
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
- this.transitioning = 1
+ if (actives) {
+ Collapse._jQueryInterface.call($(actives), 'hide');
+ if (!activesData) {
+ $(actives).data(DATA_KEY, null);
+ }
+ }
- var complete = function () {
- this.transitioning = 0
- this.$element
- .removeClass('collapsing')
- .addClass('collapse')
- .trigger('hidden.bs.collapse')
- }
+ var dimension = this._getDimension();
- if (!$.support.transition) return complete.call(this)
+ $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
- this.$element
- [dimension](0)
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
- }
+ this._element.style[dimension] = 0;
+ this._element.setAttribute('aria-expanded', true);
- Collapse.prototype.toggle = function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
+ if (this._triggerArray.length) {
+ $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
+ }
- Collapse.prototype.getParent = function () {
- return $(this.options.parent)
- .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
- .each($.proxy(function (i, element) {
- var $element = $(element)
- this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
- }, this))
- .end()
- }
+ this.setTransitioning(true);
- Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
- var isOpen = $element.hasClass('in')
+ var complete = function complete() {
+ $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
- $element.attr('aria-expanded', isOpen)
- $trigger
- .toggleClass('collapsed', !isOpen)
- .attr('aria-expanded', isOpen)
- }
+ _this6._element.style[dimension] = '';
- function getTargetFromTrigger($trigger) {
- var href
- var target = $trigger.attr('data-target')
- || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+ _this6.setTransitioning(false);
- return $(target)
- }
+ $(_this6._element).trigger(Event.SHOWN);
+ };
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
- // COLLAPSE PLUGIN DEFINITION
- // ==========================
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
+ var scrollSize = 'scroll' + capitalizedDimension;
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.collapse')
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
- if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ this._element.style[dimension] = this._element[scrollSize] + 'px';
+ };
- var old = $.fn.collapse
+ Collapse.prototype.hide = function hide() {
+ var _this7 = this;
- $.fn.collapse = Plugin
- $.fn.collapse.Constructor = Collapse
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
+ return;
+ }
+ var startEvent = $.Event(Event.HIDE);
+ $(this._element).trigger(startEvent);
+ if (startEvent.isDefaultPrevented()) {
+ return;
+ }
- // COLLAPSE NO CONFLICT
- // ====================
+ var dimension = this._getDimension();
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old
- return this
- }
+ this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + 'px';
+ Util.reflow(this._element);
- // COLLAPSE DATA-API
- // =================
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
- $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
- var $this = $(this)
+ this._element.setAttribute('aria-expanded', false);
- if (!$this.attr('data-target')) e.preventDefault()
+ if (this._triggerArray.length) {
+ $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
+ }
- var $target = getTargetFromTrigger($this)
- var data = $target.data('bs.collapse')
- var option = data ? 'toggle' : $this.data()
+ this.setTransitioning(true);
- Plugin.call($target, option)
- })
+ var complete = function complete() {
+ _this7.setTransitioning(false);
+ $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
+ };
-}(jQuery);
+ this._element.style[dimension] = '';
-/* ========================================================================
- * Bootstrap: dropdown.js v3.3.7
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (!Util.supportsTransitionEnd()) {
+ complete();
+ return;
+ }
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ };
-+function ($) {
- 'use strict';
+ Collapse.prototype.setTransitioning = function setTransitioning(isTransitioning) {
+ this._isTransitioning = isTransitioning;
+ };
- // DROPDOWN CLASS DEFINITION
- // =========================
+ Collapse.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
- var backdrop = '.dropdown-backdrop'
- var toggle = '[data-toggle="dropdown"]'
- var Dropdown = function (element) {
- $(element).on('click.bs.dropdown', this.toggle)
- }
+ this._config = null;
+ this._parent = null;
+ this._element = null;
+ this._triggerArray = null;
+ this._isTransitioning = null;
+ };
- Dropdown.VERSION = '3.3.7'
+ // private
- function getParent($this) {
- var selector = $this.attr('data-target')
+ Collapse.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ config.toggle = Boolean(config.toggle); // coerce string values
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
+ Collapse.prototype._getDimension = function _getDimension() {
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
+ };
- var $parent = selector && $(selector)
+ Collapse.prototype._getParent = function _getParent() {
+ var _this8 = this;
- return $parent && $parent.length ? $parent : $this.parent()
- }
+ var parent = $(this._config.parent)[0];
+ var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
- function clearMenus(e) {
- if (e && e.which === 3) return
- $(backdrop).remove()
- $(toggle).each(function () {
- var $this = $(this)
- var $parent = getParent($this)
- var relatedTarget = { relatedTarget: this }
+ $(parent).find(selector).each(function (i, element) {
+ _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ });
- if (!$parent.hasClass('open')) return
+ return parent;
+ };
- if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+ Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
+ if (element) {
+ var isOpen = $(element).hasClass(ClassName.SHOW);
+ element.setAttribute('aria-expanded', isOpen);
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+ if (triggerArray.length) {
+ $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
+ }
+ }
+ };
- if (e.isDefaultPrevented()) return
+ // static
- $this.attr('aria-expanded', 'false')
- $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
- })
- }
+ Collapse._getTargetFromElement = function _getTargetFromElement(element) {
+ var selector = Util.getSelectorFromElement(element);
+ return selector ? $(selector)[0] : null;
+ };
- Dropdown.prototype.toggle = function (e) {
- var $this = $(this)
+ Collapse._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY);
+ var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
- if ($this.is('.disabled, :disabled')) return
+ if (!data && _config.toggle && /show|hide/.test(config)) {
+ _config.toggle = false;
+ }
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
+ if (!data) {
+ data = new Collapse(this, _config);
+ $this.data(DATA_KEY, data);
+ }
- clearMenus()
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- if (!isActive) {
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
- // if mobile we use a backdrop because click events don't delegate
- $(document.createElement('div'))
- .addClass('dropdown-backdrop')
- .insertAfter($(this))
- .on('click', clearMenus)
+ _createClass(Collapse, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
}
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- var relatedTarget = { relatedTarget: this }
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
- if (e.isDefaultPrevented()) return
+ return Collapse;
+ }();
- $this
- .trigger('focus')
- .attr('aria-expanded', 'true')
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- $parent
- .toggleClass('open')
- .trigger($.Event('shown.bs.dropdown', relatedTarget))
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ if (!/input|textarea/i.test(event.target.tagName)) {
+ event.preventDefault();
}
- return false
- }
+ var target = Collapse._getTargetFromElement(this);
+ var data = $(target).data(DATA_KEY);
+ var config = data ? 'toggle' : $(this).data();
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+ Collapse._jQueryInterface.call($(target), config);
+ });
- var $this = $(this)
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- e.preventDefault()
- e.stopPropagation()
+ $.fn[NAME] = Collapse._jQueryInterface;
+ $.fn[NAME].Constructor = Collapse;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Collapse._jQueryInterface;
+ };
- if ($this.is('.disabled, :disabled')) return
+ return Collapse;
+}(jQuery);
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): dropdown.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- if (!isActive && e.which != 27 || isActive && e.which == 27) {
- if (e.which == 27) $parent.find(toggle).trigger('focus')
- return $this.trigger('click')
+var Dropdown = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'dropdown';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.dropdown';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+ var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
+ var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
+ var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
+ var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
+ var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + '|' + ARROW_DOWN_KEYCODE + '|' + ESCAPE_KEYCODE + '|' + SPACE_KEYCODE);
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY,
+ KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ BACKDROP: 'dropdown-backdrop',
+ DISABLED: 'disabled',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ BACKDROP: '.dropdown-backdrop',
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
+ FORM_CHILD: '.dropdown form',
+ ROLE_MENU: '[role="menu"]',
+ ROLE_LISTBOX: '[role="listbox"]',
+ NAVBAR_NAV: '.navbar-nav',
+ VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Dropdown = function () {
+ function Dropdown(element) {
+ _classCallCheck(this, Dropdown);
+
+ this._element = element;
+
+ this._addEventListeners();
}
- var desc = ' li:not(.disabled):visible a'
- var $items = $parent.find('.dropdown-menu' + desc)
+ // getters
+
+ // public
- if (!$items.length) return
+ Dropdown.prototype.toggle = function toggle() {
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return false;
+ }
- var index = $items.index(e.target)
+ var parent = Dropdown._getParentFromElement(this);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
- if (e.which == 38 && index > 0) index-- // up
- if (e.which == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
+ Dropdown._clearMenus();
- $items.eq(index).trigger('focus')
- }
+ if (isActive) {
+ return false;
+ }
+ var relatedTarget = {
+ relatedTarget: this
+ };
+ var showEvent = $.Event(Event.SHOW, relatedTarget);
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
+ $(parent).trigger(showEvent);
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.dropdown')
+ if (showEvent.isDefaultPrevented()) {
+ return false;
+ }
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
+ // set the backdrop only if the dropdown menu will be opened
+ if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
- var old = $.fn.dropdown
+ // if mobile we use a backdrop because click events don't delegate
+ var dropdown = document.createElement('div');
+ dropdown.className = ClassName.BACKDROP;
+ $(dropdown).insertBefore(this);
+ $(dropdown).on('click', Dropdown._clearMenus);
+ }
- $.fn.dropdown = Plugin
- $.fn.dropdown.Constructor = Dropdown
+ this.focus();
+ this.setAttribute('aria-expanded', true);
+ $(parent).toggleClass(ClassName.SHOW);
+ $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
- // DROPDOWN NO CONFLICT
- // ====================
+ return false;
+ };
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old
- return this
- }
+ Dropdown.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ $(this._element).off(EVENT_KEY);
+ this._element = null;
+ };
+ // private
- // APPLY TO STANDARD DROPDOWN ELEMENTS
- // ===================================
+ Dropdown.prototype._addEventListeners = function _addEventListeners() {
+ $(this._element).on(Event.CLICK, this.toggle);
+ };
- $(document)
- .on('click.bs.dropdown.data-api', clearMenus)
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
- .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+ // static
-}(jQuery);
+ Dropdown._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
-/* ========================================================================
- * Bootstrap: modal.js v3.3.7
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ if (!data) {
+ data = new Dropdown(this);
+ $(this).data(DATA_KEY, data);
+ }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config].call(this);
+ }
+ });
+ };
-+function ($) {
- 'use strict';
-
- // MODAL CLASS DEFINITION
- // ======================
-
- var Modal = function (element, options) {
- this.options = options
- this.$body = $(document.body)
- this.$element = $(element)
- this.$dialog = this.$element.find('.modal-dialog')
- this.$backdrop = null
- this.isShown = null
- this.originalBodyPad = null
- this.scrollbarWidth = 0
- this.ignoreBackdropClick = false
-
- if (this.options.remote) {
- this.$element
- .find('.modal-content')
- .load(this.options.remote, $.proxy(function () {
- this.$element.trigger('loaded.bs.modal')
- }, this))
- }
- }
+ Dropdown._clearMenus = function _clearMenus(event) {
+ if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {
+ return;
+ }
- Modal.VERSION = '3.3.7'
+ var toggles = $.makeArray($(Selector.DATA_TOGGLE));
- Modal.TRANSITION_DURATION = 300
- Modal.BACKDROP_TRANSITION_DURATION = 150
+ for (var i = 0; i < toggles.length; i++) {
+ var parent = Dropdown._getParentFromElement(toggles[i]);
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
- Modal.DEFAULTS = {
- backdrop: true,
- keyboard: true,
- show: true
- }
+ if (!$(parent).hasClass(ClassName.SHOW)) {
+ continue;
+ }
- Modal.prototype.toggle = function (_relatedTarget) {
- return this.isShown ? this.hide() : this.show(_relatedTarget)
- }
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) {
+ continue;
+ }
- Modal.prototype.show = function (_relatedTarget) {
- var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+ var hideEvent = $.Event(Event.HIDE, relatedTarget);
+ $(parent).trigger(hideEvent);
+ if (hideEvent.isDefaultPrevented()) {
+ continue;
+ }
- this.$element.trigger(e)
+ // remove backdrop only if the dropdown menu will be hidden
+ var backdrop = $(parent).find(Selector.BACKDROP)[0];
+ if (backdrop) {
+ backdrop.parentNode.removeChild(backdrop);
+ }
- if (this.isShown || e.isDefaultPrevented()) return
+ toggles[i].setAttribute('aria-expanded', 'false');
- this.isShown = true
+ $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
+ }
+ };
- this.checkScrollbar()
- this.setScrollbar()
- this.$body.addClass('modal-open')
+ Dropdown._getParentFromElement = function _getParentFromElement(element) {
+ var parent = void 0;
+ var selector = Util.getSelectorFromElement(element);
- this.escape()
- this.resize()
+ if (selector) {
+ parent = $(selector)[0];
+ }
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+ return parent || element.parentNode;
+ };
- this.$dialog.on('mousedown.dismiss.bs.modal', function () {
- that.$element.one('mouseup.dismiss.bs.modal', function (e) {
- if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
- })
- })
+ Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
+ if (!REGEXP_KEYDOWN.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
+ return;
+ }
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
+ event.preventDefault();
+ event.stopPropagation();
- if (!that.$element.parent().length) {
- that.$element.appendTo(that.$body) // don't move modals dom position
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
+ return;
}
- that.$element
- .show()
- .scrollTop(0)
+ var parent = Dropdown._getParentFromElement(this);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
- that.adjustDialog()
+ if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {
- if (transition) {
- that.$element[0].offsetWidth // force reflow
+ if (event.which === ESCAPE_KEYCODE) {
+ var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
+ $(toggle).trigger('focus');
+ }
+
+ $(this).trigger('click');
+ return;
}
- that.$element.addClass('in')
+ var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
- that.enforceFocus()
+ if (!items.length) {
+ return;
+ }
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+ var index = items.indexOf(event.target);
- transition ?
- that.$dialog // wait for modal to slide in
- .one('bsTransitionEnd', function () {
- that.$element.trigger('focus').trigger(e)
- })
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- that.$element.trigger('focus').trigger(e)
- })
- }
+ if (event.which === ARROW_UP_KEYCODE && index > 0) {
+ // up
+ index--;
+ }
- Modal.prototype.hide = function (e) {
- if (e) e.preventDefault()
+ if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
+ // down
+ index++;
+ }
- e = $.Event('hide.bs.modal')
+ if (index < 0) {
+ index = 0;
+ }
- this.$element.trigger(e)
+ items[index].focus();
+ };
- if (!this.isShown || e.isDefaultPrevented()) return
+ _createClass(Dropdown, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Dropdown;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.FOCUSIN_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
+ e.stopPropagation();
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Dropdown._jQueryInterface;
+ $.fn[NAME].Constructor = Dropdown;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Dropdown._jQueryInterface;
+ };
+
+ return Dropdown;
+}(jQuery);
- this.isShown = false
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): modal.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- this.escape()
- this.resize()
+var Modal = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'modal';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.modal';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 300;
+ var BACKDROP_TRANSITION_DURATION = 150;
+ var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
+
+ var Default = {
+ backdrop: true,
+ keyboard: true,
+ focus: true,
+ show: true
+ };
+
+ var DefaultType = {
+ backdrop: '(boolean|string)',
+ keyboard: 'boolean',
+ focus: 'boolean',
+ show: 'boolean'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ RESIZE: 'resize' + EVENT_KEY,
+ CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
+ KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
+ MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
+ MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
+ BACKDROP: 'modal-backdrop',
+ OPEN: 'modal-open',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ DIALOG: '.modal-dialog',
+ DATA_TOGGLE: '[data-toggle="modal"]',
+ DATA_DISMISS: '[data-dismiss="modal"]',
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Modal = function () {
+ function Modal(element, config) {
+ _classCallCheck(this, Modal);
+
+ this._config = this._getConfig(config);
+ this._element = element;
+ this._dialog = $(element).find(Selector.DIALOG)[0];
+ this._backdrop = null;
+ this._isShown = false;
+ this._isBodyOverflowing = false;
+ this._ignoreBackdropClick = false;
+ this._originalBodyPadding = 0;
+ this._scrollbarWidth = 0;
+ }
- $(document).off('focusin.bs.modal')
+ // getters
- this.$element
- .removeClass('in')
- .off('click.dismiss.bs.modal')
- .off('mouseup.dismiss.bs.modal')
+ // public
- this.$dialog.off('mousedown.dismiss.bs.modal')
+ Modal.prototype.toggle = function toggle(relatedTarget) {
+ return this._isShown ? this.hide() : this.show(relatedTarget);
+ };
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one('bsTransitionEnd', $.proxy(this.hideModal, this))
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- this.hideModal()
- }
+ Modal.prototype.show = function show(relatedTarget) {
+ var _this9 = this;
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (document !== e.target &&
- this.$element[0] !== e.target &&
- !this.$element.has(e.target).length) {
- this.$element.trigger('focus')
- }
- }, this))
- }
+ if (this._isTransitioning) {
+ return;
+ }
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keydown.dismiss.bs.modal')
- }
- }
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
+ }
- Modal.prototype.resize = function () {
- if (this.isShown) {
- $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
- } else {
- $(window).off('resize.bs.modal')
- }
- }
+ var showEvent = $.Event(Event.SHOW, {
+ relatedTarget: relatedTarget
+ });
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.$body.removeClass('modal-open')
- that.resetAdjustments()
- that.resetScrollbar()
- that.$element.trigger('hidden.bs.modal')
- })
- }
+ $(this._element).trigger(showEvent);
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
+ if (this._isShown || showEvent.isDefaultPrevented()) {
+ return;
+ }
- Modal.prototype.backdrop = function (callback) {
- var that = this
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
+ this._isShown = true;
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
+ this._checkScrollbar();
+ this._setScrollbar();
- this.$backdrop = $(document.createElement('div'))
- .addClass('modal-backdrop ' + animate)
- .appendTo(this.$body)
+ $(document.body).addClass(ClassName.OPEN);
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
- if (this.ignoreBackdropClick) {
- this.ignoreBackdropClick = false
- return
- }
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus()
- : this.hide()
- }, this))
+ this._setEscapeEvent();
+ this._setResizeEvent();
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+ $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
+ return _this9.hide(event);
+ });
- this.$backdrop.addClass('in')
+ $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
+ $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this9._element)) {
+ _this9._ignoreBackdropClick = true;
+ }
+ });
+ });
- if (!callback) return
+ this._showBackdrop(function () {
+ return _this9._showElement(relatedTarget);
+ });
+ };
- doAnimate ?
- this.$backdrop
- .one('bsTransitionEnd', callback)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callback()
+ Modal.prototype.hide = function hide(event) {
+ var _this10 = this;
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
+ if (event) {
+ event.preventDefault();
+ }
- var callbackRemove = function () {
- that.removeBackdrop()
- callback && callback()
+ if (this._isTransitioning || !this._isShown) {
+ return;
}
- $.support.transition && this.$element.hasClass('fade') ?
- this.$backdrop
- .one('bsTransitionEnd', callbackRemove)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callbackRemove()
- } else if (callback) {
- callback()
- }
- }
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
- // these following methods are used to handle overflowing modals
+ if (transition) {
+ this._isTransitioning = true;
+ }
- Modal.prototype.handleUpdate = function () {
- this.adjustDialog()
- }
+ var hideEvent = $.Event(Event.HIDE);
- Modal.prototype.adjustDialog = function () {
- var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+ $(this._element).trigger(hideEvent);
- this.$element.css({
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
- paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
- })
- }
+ if (!this._isShown || hideEvent.isDefaultPrevented()) {
+ return;
+ }
- Modal.prototype.resetAdjustments = function () {
- this.$element.css({
- paddingLeft: '',
- paddingRight: ''
- })
- }
+ this._isShown = false;
- Modal.prototype.checkScrollbar = function () {
- var fullWindowWidth = window.innerWidth
- if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
- var documentElementRect = document.documentElement.getBoundingClientRect()
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
- }
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
- this.scrollbarWidth = this.measureScrollbar()
- }
+ this._setEscapeEvent();
+ this._setResizeEvent();
- Modal.prototype.setScrollbar = function () {
- var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
- this.originalBodyPad = document.body.style.paddingRight || ''
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
- }
+ $(document).off(Event.FOCUSIN);
- Modal.prototype.resetScrollbar = function () {
- this.$body.css('padding-right', this.originalBodyPad)
- }
+ $(this._element).removeClass(ClassName.SHOW);
- Modal.prototype.measureScrollbar = function () { // thx walsh
- var scrollDiv = document.createElement('div')
- scrollDiv.className = 'modal-scrollbar-measure'
- this.$body.append(scrollDiv)
- var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
- this.$body[0].removeChild(scrollDiv)
- return scrollbarWidth
- }
+ $(this._element).off(Event.CLICK_DISMISS);
+ $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
+ if (transition) {
- // MODAL PLUGIN DEFINITION
- // =======================
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this10._hideModal(event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ this._hideModal();
+ }
+ };
- function Plugin(option, _relatedTarget) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+ Modal.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option](_relatedTarget)
- else if (options.show) data.show(_relatedTarget)
- })
- }
+ $(window, document, this._element, this._backdrop).off(EVENT_KEY);
- var old = $.fn.modal
+ this._config = null;
+ this._element = null;
+ this._dialog = null;
+ this._backdrop = null;
+ this._isShown = null;
+ this._isBodyOverflowing = null;
+ this._ignoreBackdropClick = null;
+ this._originalBodyPadding = null;
+ this._scrollbarWidth = null;
+ };
- $.fn.modal = Plugin
- $.fn.modal.Constructor = Modal
+ Modal.prototype.handleUpdate = function handleUpdate() {
+ this._adjustDialog();
+ };
+ // private
- // MODAL NO CONFLICT
- // =================
+ Modal.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+ Util.typeCheckConfig(NAME, config, DefaultType);
+ return config;
+ };
- $.fn.modal.noConflict = function () {
- $.fn.modal = old
- return this
- }
+ Modal.prototype._showElement = function _showElement(relatedTarget) {
+ var _this11 = this;
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
- // MODAL DATA-API
- // ==============
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
+ // don't move modals dom position
+ document.body.appendChild(this._element);
+ }
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+ this._element.style.display = 'block';
+ this._element.removeAttribute('aria-hidden');
+ this._element.scrollTop = 0;
- if ($this.is('a')) e.preventDefault()
+ if (transition) {
+ Util.reflow(this._element);
+ }
- $target.one('show.bs.modal', function (showEvent) {
- if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
- $target.one('hidden.bs.modal', function () {
- $this.is(':visible') && $this.trigger('focus')
- })
- })
- Plugin.call($target, option, this)
- })
+ $(this._element).addClass(ClassName.SHOW);
-}(jQuery);
+ if (this._config.focus) {
+ this._enforceFocus();
+ }
-/* ========================================================================
- * Bootstrap: tooltip.js v3.3.7
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ var shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: relatedTarget
+ });
+ var transitionComplete = function transitionComplete() {
+ if (_this11._config.focus) {
+ _this11._element.focus();
+ }
+ _this11._isTransitioning = false;
+ $(_this11._element).trigger(shownEvent);
+ };
-+function ($) {
- 'use strict';
+ if (transition) {
+ $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ transitionComplete();
+ }
+ };
- // TOOLTIP PUBLIC CLASS DEFINITION
- // ===============================
+ Modal.prototype._enforceFocus = function _enforceFocus() {
+ var _this12 = this;
- var Tooltip = function (element, options) {
- this.type = null
- this.options = null
- this.enabled = null
- this.timeout = null
- this.hoverState = null
- this.$element = null
- this.inState = null
+ $(document).off(Event.FOCUSIN) // guard against infinite focus loop
+ .on(Event.FOCUSIN, function (event) {
+ if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) {
+ _this12._element.focus();
+ }
+ });
+ };
+
+ Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
+ var _this13 = this;
+
+ if (this._isShown && this._config.keyboard) {
+ $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
+ if (event.which === ESCAPE_KEYCODE) {
+ _this13.hide();
+ }
+ });
+ } else if (!this._isShown) {
+ $(this._element).off(Event.KEYDOWN_DISMISS);
+ }
+ };
- this.init('tooltip', element, options)
- }
+ Modal.prototype._setResizeEvent = function _setResizeEvent() {
+ var _this14 = this;
- Tooltip.VERSION = '3.3.7'
+ if (this._isShown) {
+ $(window).on(Event.RESIZE, function (event) {
+ return _this14.handleUpdate(event);
+ });
+ } else {
+ $(window).off(Event.RESIZE);
+ }
+ };
+
+ Modal.prototype._hideModal = function _hideModal() {
+ var _this15 = this;
+
+ this._element.style.display = 'none';
+ this._element.setAttribute('aria-hidden', true);
+ this._isTransitioning = false;
+ this._showBackdrop(function () {
+ $(document.body).removeClass(ClassName.OPEN);
+ _this15._resetAdjustments();
+ _this15._resetScrollbar();
+ $(_this15._element).trigger(Event.HIDDEN);
+ });
+ };
+
+ Modal.prototype._removeBackdrop = function _removeBackdrop() {
+ if (this._backdrop) {
+ $(this._backdrop).remove();
+ this._backdrop = null;
+ }
+ };
- Tooltip.TRANSITION_DURATION = 150
+ Modal.prototype._showBackdrop = function _showBackdrop(callback) {
+ var _this16 = this;
- Tooltip.DEFAULTS = {
- animation: true,
- placement: 'top',
- selector: false,
- template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- container: false,
- viewport: {
- selector: 'body',
- padding: 0
- }
- }
+ var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
- this.inState = { click: false, hover: false, focus: false }
+ if (this._isShown && this._config.backdrop) {
+ var doAnimate = Util.supportsTransitionEnd() && animate;
- if (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!')
- }
+ this._backdrop = document.createElement('div');
+ this._backdrop.className = ClassName.BACKDROP;
+
+ if (animate) {
+ $(this._backdrop).addClass(animate);
+ }
- var triggers = this.options.trigger.split(' ')
+ $(this._backdrop).appendTo(document.body);
+
+ $(this._element).on(Event.CLICK_DISMISS, function (event) {
+ if (_this16._ignoreBackdropClick) {
+ _this16._ignoreBackdropClick = false;
+ return;
+ }
+ if (event.target !== event.currentTarget) {
+ return;
+ }
+ if (_this16._config.backdrop === 'static') {
+ _this16._element.focus();
+ } else {
+ _this16.hide();
+ }
+ });
+
+ if (doAnimate) {
+ Util.reflow(this._backdrop);
+ }
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i]
+ $(this._backdrop).addClass(ClassName.SHOW);
- if (trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+ if (!callback) {
+ return;
+ }
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ if (!doAnimate) {
+ callback();
+ return;
+ }
+
+ $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else if (!this._isShown && this._backdrop) {
+ $(this._backdrop).removeClass(ClassName.SHOW);
+
+ var callbackRemove = function callbackRemove() {
+ _this16._removeBackdrop();
+ if (callback) {
+ callback();
+ }
+ };
+
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
+ } else {
+ callbackRemove();
+ }
+ } else if (callback) {
+ callback();
}
- }
+ };
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
+ // ----------------------------------------------------------------------
+ // the following methods are used to handle overflowing modals
+ // todo (fat): these should probably be refactored out of modal.js
+ // ----------------------------------------------------------------------
- Tooltip.prototype.getDefaults = function () {
- return Tooltip.DEFAULTS
- }
+ Modal.prototype._adjustDialog = function _adjustDialog() {
+ var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
- Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+ if (!this._isBodyOverflowing && isModalOverflowing) {
+ this._element.style.paddingLeft = this._scrollbarWidth + 'px';
+ }
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay,
- hide: options.delay
+ if (this._isBodyOverflowing && !isModalOverflowing) {
+ this._element.style.paddingRight = this._scrollbarWidth + 'px';
}
- }
+ };
- return options
- }
+ Modal.prototype._resetAdjustments = function _resetAdjustments() {
+ this._element.style.paddingLeft = '';
+ this._element.style.paddingRight = '';
+ };
- Tooltip.prototype.getDelegateOptions = function () {
- var options = {}
- var defaults = this.getDefaults()
+ Modal.prototype._checkScrollbar = function _checkScrollbar() {
+ this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;
+ this._scrollbarWidth = this._getScrollbarWidth();
+ };
- this._options && $.each(this._options, function (key, value) {
- if (defaults[key] != value) options[key] = value
- })
+ Modal.prototype._setScrollbar = function _setScrollbar() {
+ var bodyPadding = parseInt($(Selector.FIXED_CONTENT).css('padding-right') || 0, 10);
- return options
- }
+ this._originalBodyPadding = document.body.style.paddingRight || '';
- Tooltip.prototype.enter = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
+ if (this._isBodyOverflowing) {
+ document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
+ }
+ };
+
+ Modal.prototype._resetScrollbar = function _resetScrollbar() {
+ document.body.style.paddingRight = this._originalBodyPadding;
+ };
+
+ Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {
+ // thx d.walsh
+ var scrollDiv = document.createElement('div');
+ scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
+ document.body.appendChild(scrollDiv);
+ var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
+ document.body.removeChild(scrollDiv);
+ return scrollbarWidth;
+ };
+
+ // static
+
+ Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);
+
+ if (!data) {
+ data = new Modal(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config](relatedTarget);
+ } else if (_config.show) {
+ data.show(relatedTarget);
+ }
+ });
+ };
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
- }
+ _createClass(Modal, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- if (self.tip().hasClass('in') || self.hoverState == 'in') {
- self.hoverState = 'in'
- return
- }
+ return Modal;
+ }();
- clearTimeout(self.timeout)
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- self.hoverState = 'in'
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ var _this17 = this;
- if (!self.options.delay || !self.options.delay.show) return self.show()
+ var target = void 0;
+ var selector = Util.getSelectorFromElement(this);
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
+ if (selector) {
+ target = $(selector)[0];
+ }
+
+ var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
- Tooltip.prototype.isInStateTrue = function () {
- for (var key in this.inState) {
- if (this.inState[key]) return true
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
+ event.preventDefault();
}
- return false
- }
+ var $target = $(target).one(Event.SHOW, function (showEvent) {
+ if (showEvent.isDefaultPrevented()) {
+ // only register focus restorer if modal will actually get shown
+ return;
+ }
- Tooltip.prototype.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
+ $target.one(Event.HIDDEN, function () {
+ if ($(_this17).is(':visible')) {
+ _this17.focus();
+ }
+ });
+ });
+
+ Modal._jQueryInterface.call($(target), config, this);
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Modal._jQueryInterface;
+ $.fn[NAME].Constructor = Modal;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Modal._jQueryInterface;
+ };
+
+ return Modal;
+}(jQuery);
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): scrollspy.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+var ScrollSpy = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'scrollspy';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.scrollspy';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+
+ var Default = {
+ offset: 10,
+ method: 'auto',
+ target: ''
+ };
+
+ var DefaultType = {
+ offset: 'number',
+ method: 'string',
+ target: '(string|element)'
+ };
+
+ var Event = {
+ ACTIVATE: 'activate' + EVENT_KEY,
+ SCROLL: 'scroll' + EVENT_KEY,
+ LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ DROPDOWN_ITEM: 'dropdown-item',
+ DROPDOWN_MENU: 'dropdown-menu',
+ NAV_LINK: 'nav-link',
+ NAV: 'nav',
+ ACTIVE: 'active'
+ };
+
+ var Selector = {
+ DATA_SPY: '[data-spy="scroll"]',
+ ACTIVE: '.active',
+ LIST_ITEM: '.list-item',
+ LI: 'li',
+ LI_DROPDOWN: 'li.dropdown',
+ NAV_LINKS: '.nav-link',
+ DROPDOWN: '.dropdown',
+ DROPDOWN_ITEMS: '.dropdown-item',
+ DROPDOWN_TOGGLE: '.dropdown-toggle'
+ };
+
+ var OffsetMethod = {
+ OFFSET: 'offset',
+ POSITION: 'position'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var ScrollSpy = function () {
+ function ScrollSpy(element, config) {
+ var _this18 = this;
+
+ _classCallCheck(this, ScrollSpy);
+
+ this._element = element;
+ this._scrollElement = element.tagName === 'BODY' ? window : element;
+ this._config = this._getConfig(config);
+ this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS);
+ this._offsets = [];
+ this._targets = [];
+ this._activeTarget = null;
+ this._scrollHeight = 0;
+
+ $(this._scrollElement).on(Event.SCROLL, function (event) {
+ return _this18._process(event);
+ });
+
+ this.refresh();
+ this._process();
}
- if (self.isInStateTrue()) return
-
- clearTimeout(self.timeout)
+ // getters
- self.hoverState = 'out'
+ // public
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
+ ScrollSpy.prototype.refresh = function refresh() {
+ var _this19 = this;
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
+ var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
- Tooltip.prototype.show = function () {
- var e = $.Event('show.bs.' + this.type)
+ var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e)
+ var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
- var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
- if (e.isDefaultPrevented() || !inDom) return
- var that = this
+ this._offsets = [];
+ this._targets = [];
- var $tip = this.tip()
+ this._scrollHeight = this._getScrollHeight();
- var tipId = this.getUID(this.type)
+ var targets = $.makeArray($(this._selector));
- this.setContent()
- $tip.attr('id', tipId)
- this.$element.attr('aria-describedby', tipId)
+ targets.map(function (element) {
+ var target = void 0;
+ var targetSelector = Util.getSelectorFromElement(element);
- if (this.options.animation) $tip.addClass('fade')
+ if (targetSelector) {
+ target = $(targetSelector)[0];
+ }
- var placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
+ if (target) {
+ var targetBCR = target.getBoundingClientRect();
+ if (targetBCR.width || targetBCR.height) {
+ // todo (fat): remove sketch reliance on jQuery position/offset
+ return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
+ }
+ }
+ return null;
+ }).filter(function (item) {
+ return item;
+ }).sort(function (a, b) {
+ return a[0] - b[0];
+ }).forEach(function (item) {
+ _this19._offsets.push(item[0]);
+ _this19._targets.push(item[1]);
+ });
+ };
+
+ ScrollSpy.prototype.dispose = function dispose() {
+ $.removeData(this._element, DATA_KEY);
+ $(this._scrollElement).off(EVENT_KEY);
+
+ this._element = null;
+ this._scrollElement = null;
+ this._config = null;
+ this._selector = null;
+ this._offsets = null;
+ this._targets = null;
+ this._activeTarget = null;
+ this._scrollHeight = null;
+ };
+
+ // private
+
+ ScrollSpy.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, Default, config);
+
+ if (typeof config.target !== 'string') {
+ var id = $(config.target).attr('id');
+ if (!id) {
+ id = Util.getUID(NAME);
+ $(config.target).attr('id', id);
+ }
+ config.target = '#' + id;
+ }
- var autoToken = /\s?auto?\s?/i
- var autoPlace = autoToken.test(placement)
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+ Util.typeCheckConfig(NAME, config, DefaultType);
- $tip
- .detach()
- .css({ top: 0, left: 0, display: 'block' })
- .addClass(placement)
- .data('bs.' + this.type, this)
+ return config;
+ };
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
- this.$element.trigger('inserted.bs.' + this.type)
+ ScrollSpy.prototype._getScrollTop = function _getScrollTop() {
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
+ };
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
+ ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
+ };
- if (autoPlace) {
- var orgPlacement = placement
- var viewportDim = this.getPosition(this.$viewport)
+ ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
+ };
- placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
- placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
- placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
- placement
+ ScrollSpy.prototype._process = function _process() {
+ var scrollTop = this._getScrollTop() + this._config.offset;
+ var scrollHeight = this._getScrollHeight();
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
+ if (this._scrollHeight !== scrollHeight) {
+ this.refresh();
}
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
- this.applyPlacement(calculatedOffset, placement)
+ if (scrollTop >= maxScroll) {
+ var target = this._targets[this._targets.length - 1];
- var complete = function () {
- var prevHoverState = that.hoverState
- that.$element.trigger('shown.bs.' + that.type)
- that.hoverState = null
+ if (this._activeTarget !== target) {
+ this._activate(target);
+ }
+ return;
+ }
- if (prevHoverState == 'out') that.leave(that)
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
+ this._activeTarget = null;
+ this._clear();
+ return;
}
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
- }
- }
+ for (var i = this._offsets.length; i--;) {
+ var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]);
+
+ if (isActiveTarget) {
+ this._activate(this._targets[i]);
+ }
+ }
+ };
- Tooltip.prototype.applyPlacement = function (offset, placement) {
- var $tip = this.tip()
- var width = $tip[0].offsetWidth
- var height = $tip[0].offsetHeight
+ ScrollSpy.prototype._activate = function _activate(target) {
+ this._activeTarget = target;
- // manually read margins because getBoundingClientRect includes difference
- var marginTop = parseInt($tip.css('margin-top'), 10)
- var marginLeft = parseInt($tip.css('margin-left'), 10)
+ this._clear();
- // we must check for NaN for ie 8/9
- if (isNaN(marginTop)) marginTop = 0
- if (isNaN(marginLeft)) marginLeft = 0
+ var queries = this._selector.split(',');
+ queries = queries.map(function (selector) {
+ return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]');
+ });
- offset.top += marginTop
- offset.left += marginLeft
+ var $link = $(queries.join(','));
- // $.fn.offset doesn't round pixel values
- // so we use setOffset directly with our own function B-0
- $.offset.setOffset($tip[0], $.extend({
- using: function (props) {
- $tip.css({
- top: Math.round(props.top),
- left: Math.round(props.left)
- })
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
+ $link.addClass(ClassName.ACTIVE);
+ } else {
+ // todo (fat) this is kinda sus...
+ // recursively add actives to tested nav-links
+ $link.parents(Selector.LI).find('> ' + Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
}
- }, offset), 0)
- $tip.addClass('in')
+ $(this._scrollElement).trigger(Event.ACTIVATE, {
+ relatedTarget: target
+ });
+ };
- // check to see if placing tip in new offset caused the tip to resize itself
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
+ ScrollSpy.prototype._clear = function _clear() {
+ $(this._selector).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
+ };
- if (placement == 'top' && actualHeight != height) {
- offset.top = offset.top + height - actualHeight
- }
+ // static
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+ ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
- if (delta.left) offset.left += delta.left
- else offset.top += delta.top
+ if (!data) {
+ data = new ScrollSpy(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- var isVertical = /top|bottom/.test(placement)
- var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
- var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- $tip.offset(offset)
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
- }
+ _createClass(ScrollSpy, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }]);
- Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
- this.arrow()
- .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
- .css(isVertical ? 'top' : 'left', '')
- }
+ return ScrollSpy;
+ }();
- Tooltip.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
+ $(window).on(Event.LOAD_DATA_API, function () {
+ var scrollSpys = $.makeArray($(Selector.DATA_SPY));
- Tooltip.prototype.hide = function (callback) {
- var that = this
- var $tip = $(this.$tip)
- var e = $.Event('hide.bs.' + this.type)
+ for (var i = scrollSpys.length; i--;) {
+ var $spy = $(scrollSpys[i]);
+ ScrollSpy._jQueryInterface.call($spy, $spy.data());
+ }
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = ScrollSpy._jQueryInterface;
+ $.fn[NAME].Constructor = ScrollSpy;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return ScrollSpy._jQueryInterface;
+ };
+
+ return ScrollSpy;
+}(jQuery);
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
- that.$element
- .removeAttr('aria-describedby')
- .trigger('hidden.bs.' + that.type)
- }
- callback && callback()
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tab.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+var Tab = function ($) {
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ var NAME = 'tab';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.tab';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var DATA_API_KEY = '.data-api';
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
+ };
+
+ var ClassName = {
+ DROPDOWN_MENU: 'dropdown-menu',
+ ACTIVE: 'active',
+ DISABLED: 'disabled',
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ A: 'a',
+ LI: 'li',
+ DROPDOWN: '.dropdown',
+ LIST: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu), .list-group:not(.dropdown-menu)',
+ FADE_CHILD: '> .nav-item .fade, > .list-group-item .fade, > .fade',
+ ACTIVE: '.active',
+ ACTIVE_CHILD: '> .nav-item > .active, > .list-group-item > .active, > .active',
+ DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"]',
+ DROPDOWN_TOGGLE: '.dropdown-toggle',
+ DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Tab = function () {
+ function Tab(element) {
+ _classCallCheck(this, Tab);
+
+ this._element = element;
}
- this.$element.trigger(e)
+ // getters
- if (e.isDefaultPrevented()) return
+ // public
- $tip.removeClass('in')
+ Tab.prototype.show = function show() {
+ var _this20 = this;
- $.support.transition && $tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
+ return;
+ }
- this.hoverState = null
+ var target = void 0;
+ var previous = void 0;
+ var listElement = $(this._element).closest(Selector.LIST)[0];
+ var selector = Util.getSelectorFromElement(this._element);
- return this
- }
+ if (listElement) {
+ previous = $.makeArray($(listElement).find(Selector.ACTIVE));
+ previous = previous[previous.length - 1];
+ }
- Tooltip.prototype.fixTitle = function () {
- var $e = this.$element
- if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
- }
- }
+ var hideEvent = $.Event(Event.HIDE, {
+ relatedTarget: this._element
+ });
- Tooltip.prototype.hasContent = function () {
- return this.getTitle()
- }
+ var showEvent = $.Event(Event.SHOW, {
+ relatedTarget: previous
+ });
+
+ if (previous) {
+ $(previous).trigger(hideEvent);
+ }
- Tooltip.prototype.getPosition = function ($element) {
- $element = $element || this.$element
+ $(this._element).trigger(showEvent);
- var el = $element[0]
- var isBody = el.tagName == 'BODY'
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
+ return;
+ }
- var elRect = el.getBoundingClientRect()
- if (elRect.width == null) {
- // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
- elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
- }
- var isSvg = window.SVGElement && el instanceof window.SVGElement
- // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
- // See https://github.com/twbs/bootstrap/issues/20280
- var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
- var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
- var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
-
- return $.extend({}, elRect, scroll, outerDims, elOffset)
- }
+ if (selector) {
+ target = $(selector)[0];
+ }
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+ this._activate(this._element, listElement);
- }
+ var complete = function complete() {
+ var hiddenEvent = $.Event(Event.HIDDEN, {
+ relatedTarget: _this20._element
+ });
+
+ var shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: previous
+ });
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
- var delta = { top: 0, left: 0 }
- if (!this.$viewport) return delta
-
- var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
- var viewportDimensions = this.getPosition(this.$viewport)
-
- if (/right|left/.test(placement)) {
- var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
- var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
- if (topEdgeOffset < viewportDimensions.top) { // top overflow
- delta.top = viewportDimensions.top - topEdgeOffset
- } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
- delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
- }
- } else {
- var leftEdgeOffset = pos.left - viewportPadding
- var rightEdgeOffset = pos.left + viewportPadding + actualWidth
- if (leftEdgeOffset < viewportDimensions.left) { // left overflow
- delta.left = viewportDimensions.left - leftEdgeOffset
- } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
- delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+ $(previous).trigger(hiddenEvent);
+ $(_this20._element).trigger(shownEvent);
+ };
+
+ if (target) {
+ this._activate(target, target.parentNode, complete);
+ } else {
+ complete();
}
- }
+ };
- return delta
- }
+ Tab.prototype.dispose = function dispose() {
+ $.removeClass(this._element, DATA_KEY);
+ this._element = null;
+ };
- Tooltip.prototype.getTitle = function () {
- var title
- var $e = this.$element
- var o = this.options
+ // private
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+ Tab.prototype._activate = function _activate(element, container, callback) {
+ var _this21 = this;
- return title
- }
+ var active = $(container).find(Selector.ACTIVE_CHILD)[0];
+ var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
- Tooltip.prototype.getUID = function (prefix) {
- do prefix += ~~(Math.random() * 1000000)
- while (document.getElementById(prefix))
- return prefix
- }
+ var complete = function complete() {
+ return _this21._transitionComplete(element, active, isTransitioning, callback);
+ };
- Tooltip.prototype.tip = function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template)
- if (this.$tip.length != 1) {
- throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+ if (active && isTransitioning) {
+ $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ complete();
}
- }
- return this.$tip
- }
- Tooltip.prototype.arrow = function () {
- return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
- }
+ if (active) {
+ $(active).removeClass(ClassName.SHOW);
+ }
+ };
- Tooltip.prototype.enable = function () {
- this.enabled = true
- }
+ Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) {
+ if (active) {
+ $(active).removeClass(ClassName.ACTIVE);
+ if ($(active).hasClass('list-group-item')) {
+ $(active).find('a.nav-link').removeClass(ClassName.ACTIVE);
+ }
- Tooltip.prototype.disable = function () {
- this.enabled = false
- }
+ var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
- Tooltip.prototype.toggleEnabled = function () {
- this.enabled = !this.enabled
- }
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName.ACTIVE);
+ }
- Tooltip.prototype.toggle = function (e) {
- var self = this
- if (e) {
- self = $(e.currentTarget).data('bs.' + this.type)
- if (!self) {
- self = new this.constructor(e.currentTarget, this.getDelegateOptions())
- $(e.currentTarget).data('bs.' + this.type, self)
+ active.setAttribute('aria-expanded', false);
}
- }
-
- if (e) {
- self.inState.click = !self.inState.click
- if (self.isInStateTrue()) self.enter(self)
- else self.leave(self)
- } else {
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
- }
- Tooltip.prototype.destroy = function () {
- var that = this
- clearTimeout(this.timeout)
- this.hide(function () {
- that.$element.off('.' + that.type).removeData('bs.' + that.type)
- if (that.$tip) {
- that.$tip.detach()
- }
- that.$tip = null
- that.$arrow = null
- that.$viewport = null
- that.$element = null
- })
- }
+ $(element).addClass(ClassName.ACTIVE);
+ if ($(element.parentNode).hasClass('list-group-item')) {
+ $(element.parentNode).addClass(ClassName.ACTIVE);
+ }
+ element.setAttribute('aria-expanded', true);
+ if (isTransitioning) {
+ Util.reflow(element);
+ $(element).addClass(ClassName.SHOW);
+ } else {
+ $(element).removeClass(ClassName.FADE);
+ }
- // TOOLTIP PLUGIN DEFINITION
- // =========================
+ if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
+ var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
+ if (dropdownElement) {
+ $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
+ }
- if (!data && /destroy|hide/.test(option)) return
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ element.setAttribute('aria-expanded', true);
+ }
- var old = $.fn.tooltip
+ if (callback) {
+ callback();
+ }
+ };
- $.fn.tooltip = Plugin
- $.fn.tooltip.Constructor = Tooltip
+ // static
+ Tab._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var $this = $(this);
+ var data = $this.data(DATA_KEY);
- // TOOLTIP NO CONFLICT
- // ===================
+ if (!data) {
+ data = new Tab(this);
+ $this.data(DATA_KEY, data);
+ }
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
+ _createClass(Tab, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }]);
+
+ return Tab;
+ }();
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ Tab._jQueryInterface.call($(this), 'show');
+ });
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Tab._jQueryInterface;
+ $.fn[NAME].Constructor = Tab;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Tab._jQueryInterface;
+ };
+
+ return Tab;
}(jQuery);
-/* ========================================================================
- * Bootstrap: popover.js v3.3.7
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
+/* global Tether */
-+function ($) {
- 'use strict';
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): tooltip.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- // POPOVER PUBLIC CLASS DEFINITION
- // ===============================
+var Tooltip = function ($) {
- var Popover = function (element, options) {
- this.init('popover', element, options)
+ /**
+ * Check for Tether dependency
+ * Tether - http://tether.io/
+ */
+ if (typeof Tether === 'undefined') {
+ throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
}
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
- Popover.VERSION = '3.3.7'
+ var NAME = 'tooltip';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.tooltip';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var TRANSITION_DURATION = 150;
+ var CLASS_PREFIX = 'bs-tether';
+ var TETHER_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g');
- Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right',
- trigger: 'click',
- content: '',
- template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
- })
+ var Default = {
+ animation: true,
+ template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: '0 0',
+ constraints: [],
+ container: false
+ };
+
+ var DefaultType = {
+ animation: 'boolean',
+ template: 'string',
+ title: '(string|element|function)',
+ trigger: 'string',
+ delay: '(number|object)',
+ html: 'boolean',
+ selector: '(string|boolean)',
+ placement: '(string|function)',
+ offset: 'string',
+ constraints: 'array',
+ container: '(string|element|boolean)'
+ };
+
+ var AttachmentMap = {
+ TOP: 'bottom center',
+ RIGHT: 'middle left',
+ BOTTOM: 'top center',
+ LEFT: 'middle right'
+ };
+
+ var HoverState = {
+ SHOW: 'show',
+ OUT: 'out'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ INSERTED: 'inserted' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ FOCUSOUT: 'focusout' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
+ };
+
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ TOOLTIP: '.tooltip',
+ TOOLTIP_INNER: '.tooltip-inner'
+ };
+
+ var TetherClass = {
+ element: false,
+ enabled: false
+ };
+
+ var Trigger = {
+ HOVER: 'hover',
+ FOCUS: 'focus',
+ CLICK: 'click',
+ MANUAL: 'manual'
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Tooltip = function () {
+ function Tooltip(element, config) {
+ _classCallCheck(this, Tooltip);
+
+ // private
+ this._isEnabled = true;
+ this._timeout = 0;
+ this._hoverState = '';
+ this._activeTrigger = {};
+ this._tether = null;
+
+ // protected
+ this.element = element;
+ this.config = this._getConfig(config);
+ this.tip = null;
+
+ this._setListeners();
+ }
+ // getters
- // NOTE: POPOVER EXTENDS tooltip.js
- // ================================
+ // public
- Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+ Tooltip.prototype.enable = function enable() {
+ this._isEnabled = true;
+ };
- Popover.prototype.constructor = Popover
+ Tooltip.prototype.disable = function disable() {
+ this._isEnabled = false;
+ };
- Popover.prototype.getDefaults = function () {
- return Popover.DEFAULTS
- }
+ Tooltip.prototype.toggleEnabled = function toggleEnabled() {
+ this._isEnabled = !this._isEnabled;
+ };
- Popover.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
- var content = this.getContent()
+ Tooltip.prototype.toggle = function toggle(event) {
+ if (event) {
+ var dataKey = this.constructor.DATA_KEY;
+ var context = $(event.currentTarget).data(dataKey);
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
- $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
- ](content)
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
- $tip.removeClass('fade top bottom left right in')
+ context._activeTrigger.click = !context._activeTrigger.click;
- // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
- // this manually by checking the contents.
- if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
- }
+ if (context._isWithActiveTrigger()) {
+ context._enter(null, context);
+ } else {
+ context._leave(null, context);
+ }
+ } else {
- Popover.prototype.hasContent = function () {
- return this.getTitle() || this.getContent()
- }
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
+ this._leave(null, this);
+ return;
+ }
- Popover.prototype.getContent = function () {
- var $e = this.$element
- var o = this.options
+ this._enter(null, this);
+ }
+ };
- return $e.attr('data-content')
- || (typeof o.content == 'function' ?
- o.content.call($e[0]) :
- o.content)
- }
+ Tooltip.prototype.dispose = function dispose() {
+ clearTimeout(this._timeout);
- Popover.prototype.arrow = function () {
- return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
- }
+ this.cleanupTether();
+ $.removeData(this.element, this.constructor.DATA_KEY);
- // POPOVER PLUGIN DEFINITION
- // =========================
+ $(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.popover')
- var options = typeof option == 'object' && option
+ if (this.tip) {
+ $(this.tip).remove();
+ }
- if (!data && /destroy|hide/.test(option)) return
- if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ this._isEnabled = null;
+ this._timeout = null;
+ this._hoverState = null;
+ this._activeTrigger = null;
+ this._tether = null;
- var old = $.fn.popover
+ this.element = null;
+ this.config = null;
+ this.tip = null;
+ };
- $.fn.popover = Plugin
- $.fn.popover.Constructor = Popover
+ Tooltip.prototype.show = function show() {
+ var _this22 = this;
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
- // POPOVER NO CONFLICT
- // ===================
+ var showEvent = $.Event(this.constructor.Event.SHOW);
+ if (this.isWithContent() && this._isEnabled) {
+ $(this.element).trigger(showEvent);
- $.fn.popover.noConflict = function () {
- $.fn.popover = old
- return this
- }
+ var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
-}(jQuery);
+ if (showEvent.isDefaultPrevented() || !isInTheDom) {
+ return;
+ }
-/* ========================================================================
- * Bootstrap: scrollspy.js v3.3.7
- * http://getbootstrap.com/javascript/#scrollspy
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ var tip = this.getTipElement();
+ var tipId = Util.getUID(this.constructor.NAME);
+ tip.setAttribute('id', tipId);
+ this.element.setAttribute('aria-describedby', tipId);
-+function ($) {
- 'use strict';
-
- // SCROLLSPY CLASS DEFINITION
- // ==========================
-
- function ScrollSpy(element, options) {
- this.$body = $(document.body)
- this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
- this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
- this.selector = (this.options.target || '') + ' .nav li > a'
- this.offsets = []
- this.targets = []
- this.activeTarget = null
- this.scrollHeight = 0
-
- this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
- this.refresh()
- this.process()
- }
+ this.setContent();
- ScrollSpy.VERSION = '3.3.7'
+ if (this.config.animation) {
+ $(tip).addClass(ClassName.FADE);
+ }
- ScrollSpy.DEFAULTS = {
- offset: 10
- }
+ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
- ScrollSpy.prototype.getScrollHeight = function () {
- return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
- }
+ var attachment = this._getAttachment(placement);
- ScrollSpy.prototype.refresh = function () {
- var that = this
- var offsetMethod = 'offset'
- var offsetBase = 0
+ var container = this.config.container === false ? document.body : $(this.config.container);
- this.offsets = []
- this.targets = []
- this.scrollHeight = this.getScrollHeight()
+ $(tip).data(this.constructor.DATA_KEY, this);
- if (!$.isWindow(this.$scrollElement[0])) {
- offsetMethod = 'position'
- offsetBase = this.$scrollElement.scrollTop()
- }
+ if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {
+ $(tip).appendTo(container);
+ }
- this.$body
- .find(this.selector)
- .map(function () {
- var $el = $(this)
- var href = $el.data('target') || $el.attr('href')
- var $href = /^#./.test(href) && $(href)
-
- return ($href
- && $href.length
- && $href.is(':visible')
- && [[$href[offsetMethod]().top + offsetBase, href]]) || null
- })
- .sort(function (a, b) { return a[0] - b[0] })
- .each(function () {
- that.offsets.push(this[0])
- that.targets.push(this[1])
- })
- }
+ $(this.element).trigger(this.constructor.Event.INSERTED);
- ScrollSpy.prototype.process = function () {
- var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
- var scrollHeight = this.getScrollHeight()
- var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
- var offsets = this.offsets
- var targets = this.targets
- var activeTarget = this.activeTarget
- var i
-
- if (this.scrollHeight != scrollHeight) {
- this.refresh()
- }
+ this._tether = new Tether({
+ attachment: attachment,
+ element: tip,
+ target: this.element,
+ classes: TetherClass,
+ classPrefix: CLASS_PREFIX,
+ offset: this.config.offset,
+ constraints: this.config.constraints,
+ addTargetClasses: false
+ });
- if (scrollTop >= maxScroll) {
- return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
- }
+ Util.reflow(tip);
+ this._tether.position();
- if (activeTarget && scrollTop < offsets[0]) {
- this.activeTarget = null
- return this.clear()
- }
+ $(tip).addClass(ClassName.SHOW);
- for (i = offsets.length; i--;) {
- activeTarget != targets[i]
- && scrollTop >= offsets[i]
- && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
- && this.activate(targets[i])
- }
- }
+ var complete = function complete() {
+ var prevHoverState = _this22._hoverState;
+ _this22._hoverState = null;
- ScrollSpy.prototype.activate = function (target) {
- this.activeTarget = target
+ $(_this22.element).trigger(_this22.constructor.Event.SHOWN);
- this.clear()
+ if (prevHoverState === HoverState.OUT) {
+ _this22._leave(null, _this22);
+ }
+ };
- var selector = this.selector +
- '[data-target="' + target + '"],' +
- this.selector + '[href="' + target + '"]'
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
+ return;
+ }
- var active = $(selector)
- .parents('li')
- .addClass('active')
+ complete();
+ }
+ };
- if (active.parent('.dropdown-menu').length) {
- active = active
- .closest('li.dropdown')
- .addClass('active')
- }
+ Tooltip.prototype.hide = function hide(callback) {
+ var _this23 = this;
- active.trigger('activate.bs.scrollspy')
- }
+ var tip = this.getTipElement();
+ var hideEvent = $.Event(this.constructor.Event.HIDE);
+ var complete = function complete() {
+ if (_this23._hoverState !== HoverState.SHOW && tip.parentNode) {
+ tip.parentNode.removeChild(tip);
+ }
- ScrollSpy.prototype.clear = function () {
- $(this.selector)
- .parentsUntil(this.options.target, '.active')
- .removeClass('active')
- }
+ _this23._cleanTipClass();
+ _this23.element.removeAttribute('aria-describedby');
+ $(_this23.element).trigger(_this23.constructor.Event.HIDDEN);
+ _this23.cleanupTether();
+ if (callback) {
+ callback();
+ }
+ };
- // SCROLLSPY PLUGIN DEFINITION
- // ===========================
+ $(this.element).trigger(hideEvent);
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.scrollspy')
- var options = typeof option == 'object' && option
+ if (hideEvent.isDefaultPrevented()) {
+ return;
+ }
- if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ $(tip).removeClass(ClassName.SHOW);
- var old = $.fn.scrollspy
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
- $.fn.scrollspy = Plugin
- $.fn.scrollspy.Constructor = ScrollSpy
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
+ } else {
+ complete();
+ }
- // SCROLLSPY NO CONFLICT
- // =====================
+ this._hoverState = '';
+ };
- $.fn.scrollspy.noConflict = function () {
- $.fn.scrollspy = old
- return this
- }
+ // protected
+ Tooltip.prototype.isWithContent = function isWithContent() {
+ return Boolean(this.getTitle());
+ };
- // SCROLLSPY DATA-API
- // ==================
+ Tooltip.prototype.getTipElement = function getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0];
+ };
- $(window).on('load.bs.scrollspy.data-api', function () {
- $('[data-spy="scroll"]').each(function () {
- var $spy = $(this)
- Plugin.call($spy, $spy.data())
- })
- })
+ Tooltip.prototype.setContent = function setContent() {
+ var $tip = $(this.getTipElement());
-}(jQuery);
+ this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
-/* ========================================================================
- * Bootstrap: tab.js v3.3.7
- * http://getbootstrap.com/javascript/#tabs
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
+ this.cleanupTether();
+ };
-+function ($) {
- 'use strict';
+ Tooltip.prototype.setElementContent = function setElementContent($element, content) {
+ var html = this.config.html;
+ if ((typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object' && (content.nodeType || content.jquery)) {
+ // content is a DOM node or a jQuery
+ if (html) {
+ if (!$(content).parent().is($element)) {
+ $element.empty().append(content);
+ }
+ } else {
+ $element.text($(content).text());
+ }
+ } else {
+ $element[html ? 'html' : 'text'](content);
+ }
+ };
- // TAB CLASS DEFINITION
- // ====================
+ Tooltip.prototype.getTitle = function getTitle() {
+ var title = this.element.getAttribute('data-original-title');
- var Tab = function (element) {
- // jscs:disable requireDollarBeforejQueryAssignment
- this.element = $(element)
- // jscs:enable requireDollarBeforejQueryAssignment
- }
+ if (!title) {
+ title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
+ }
- Tab.VERSION = '3.3.7'
+ return title;
+ };
- Tab.TRANSITION_DURATION = 150
+ Tooltip.prototype.cleanupTether = function cleanupTether() {
+ if (this._tether) {
+ this._tether.destroy();
+ }
+ };
- Tab.prototype.show = function () {
- var $this = this.element
- var $ul = $this.closest('ul:not(.dropdown-menu)')
- var selector = $this.data('target')
+ // private
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
+ Tooltip.prototype._getAttachment = function _getAttachment(placement) {
+ return AttachmentMap[placement.toUpperCase()];
+ };
- if ($this.parent('li').hasClass('active')) return
-
- var $previous = $ul.find('.active:last a')
- var hideEvent = $.Event('hide.bs.tab', {
- relatedTarget: $this[0]
- })
- var showEvent = $.Event('show.bs.tab', {
- relatedTarget: $previous[0]
- })
-
- $previous.trigger(hideEvent)
- $this.trigger(showEvent)
-
- if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
-
- var $target = $(selector)
-
- this.activate($this.closest('li'), $ul)
- this.activate($target, $target.parent(), function () {
- $previous.trigger({
- type: 'hidden.bs.tab',
- relatedTarget: $this[0]
- })
- $this.trigger({
- type: 'shown.bs.tab',
- relatedTarget: $previous[0]
- })
- })
- }
+ Tooltip.prototype._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(TETHER_PREFIX_REGEX);
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ Tooltip.prototype._setListeners = function _setListeners() {
+ var _this24 = this;
+
+ var triggers = this.config.trigger.split(' ');
+
+ triggers.forEach(function (trigger) {
+ if (trigger === 'click') {
+ $(_this24.element).on(_this24.constructor.Event.CLICK, _this24.config.selector, function (event) {
+ return _this24.toggle(event);
+ });
+ } else if (trigger !== Trigger.MANUAL) {
+ var eventIn = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSEENTER : _this24.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSELEAVE : _this24.constructor.Event.FOCUSOUT;
+
+ $(_this24.element).on(eventIn, _this24.config.selector, function (event) {
+ return _this24._enter(event);
+ }).on(eventOut, _this24.config.selector, function (event) {
+ return _this24._leave(event);
+ });
+ }
- Tab.prototype.activate = function (element, container, callback) {
- var $active = container.find('> .active')
- var transition = callback
- && $.support.transition
- && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
-
- function next() {
- $active
- .removeClass('active')
- .find('> .dropdown-menu > .active')
- .removeClass('active')
- .end()
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', false)
-
- element
- .addClass('active')
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ $(_this24.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this24.hide();
+ });
+ });
- if (transition) {
- element[0].offsetWidth // reflow for transition
- element.addClass('in')
+ if (this.config.selector) {
+ this.config = $.extend({}, this.config, {
+ trigger: 'manual',
+ selector: ''
+ });
} else {
- element.removeClass('fade')
+ this._fixTitle();
}
+ };
- if (element.parent('.dropdown-menu').length) {
- element
- .closest('li.dropdown')
- .addClass('active')
- .end()
- .find('[data-toggle="tab"]')
- .attr('aria-expanded', true)
+ Tooltip.prototype._fixTitle = function _fixTitle() {
+ var titleType = _typeof(this.element.getAttribute('data-original-title'));
+ if (this.element.getAttribute('title') || titleType !== 'string') {
+ this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
+ this.element.setAttribute('title', '');
}
+ };
- callback && callback()
- }
+ Tooltip.prototype._enter = function _enter(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
- $active.length && transition ?
- $active
- .one('bsTransitionEnd', next)
- .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
- next()
+ context = context || $(event.currentTarget).data(dataKey);
- $active.removeClass('in')
- }
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+ if (event) {
+ context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
+ }
- // TAB PLUGIN DEFINITION
- // =====================
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
+ return;
+ }
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tab')
+ clearTimeout(context._timeout);
- if (!data) $this.data('bs.tab', (data = new Tab(this)))
- if (typeof option == 'string') data[option]()
- })
- }
+ context._hoverState = HoverState.SHOW;
- var old = $.fn.tab
+ if (!context.config.delay || !context.config.delay.show) {
+ context.show();
+ return;
+ }
- $.fn.tab = Plugin
- $.fn.tab.Constructor = Tab
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.SHOW) {
+ context.show();
+ }
+ }, context.config.delay.show);
+ };
+ Tooltip.prototype._leave = function _leave(event, context) {
+ var dataKey = this.constructor.DATA_KEY;
- // TAB NO CONFLICT
- // ===============
+ context = context || $(event.currentTarget).data(dataKey);
- $.fn.tab.noConflict = function () {
- $.fn.tab = old
- return this
- }
+ if (!context) {
+ context = new this.constructor(event.currentTarget, this._getDelegateConfig());
+ $(event.currentTarget).data(dataKey, context);
+ }
+ if (event) {
+ context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
+ }
- // TAB DATA-API
- // ============
+ if (context._isWithActiveTrigger()) {
+ return;
+ }
- var clickHandler = function (e) {
- e.preventDefault()
- Plugin.call($(this), 'show')
- }
+ clearTimeout(context._timeout);
- $(document)
- .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
- .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+ context._hoverState = HoverState.OUT;
-}(jQuery);
+ if (!context.config.delay || !context.config.delay.hide) {
+ context.hide();
+ return;
+ }
-/* ========================================================================
- * Bootstrap: affix.js v3.3.7
- * http://getbootstrap.com/javascript/#affix
- * ========================================================================
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
+ context._timeout = setTimeout(function () {
+ if (context._hoverState === HoverState.OUT) {
+ context.hide();
+ }
+ }, context.config.delay.hide);
+ };
+ Tooltip.prototype._isWithActiveTrigger = function _isWithActiveTrigger() {
+ for (var trigger in this._activeTrigger) {
+ if (this._activeTrigger[trigger]) {
+ return true;
+ }
+ }
-+function ($) {
- 'use strict';
+ return false;
+ };
- // AFFIX CLASS DEFINITION
- // ======================
+ Tooltip.prototype._getConfig = function _getConfig(config) {
+ config = $.extend({}, this.constructor.Default, $(this.element).data(), config);
- var Affix = function (element, options) {
- this.options = $.extend({}, Affix.DEFAULTS, options)
+ if (config.delay && typeof config.delay === 'number') {
+ config.delay = {
+ show: config.delay,
+ hide: config.delay
+ };
+ }
- this.$target = $(this.options.target)
- .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
- .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+ if (config.title && typeof config.title === 'number') {
+ config.title = config.title.toString();
+ }
- this.$element = $(element)
- this.affixed = null
- this.unpin = null
- this.pinnedOffset = null
+ if (config.content && typeof config.content === 'number') {
+ config.content = config.content.toString();
+ }
- this.checkPosition()
- }
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
- Affix.VERSION = '3.3.7'
+ return config;
+ };
- Affix.RESET = 'affix affix-top affix-bottom'
+ Tooltip.prototype._getDelegateConfig = function _getDelegateConfig() {
+ var config = {};
- Affix.DEFAULTS = {
- offset: 0,
- target: window
- }
+ if (this.config) {
+ for (var key in this.config) {
+ if (this.constructor.Default[key] !== this.config[key]) {
+ config[key] = this.config[key];
+ }
+ }
+ }
- Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
- var scrollTop = this.$target.scrollTop()
- var position = this.$element.offset()
- var targetHeight = this.$target.height()
+ return config;
+ };
- if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+ // static
- if (this.affixed == 'bottom') {
- if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
- return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
- }
+ Tooltip._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
- var initializing = this.affixed == null
- var colliderTop = initializing ? scrollTop : position.top
- var colliderHeight = initializing ? targetHeight : height
+ if (!data && /dispose|hide/.test(config)) {
+ return;
+ }
- if (offsetTop != null && scrollTop <= offsetTop) return 'top'
- if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+ if (!data) {
+ data = new Tooltip(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- return false
- }
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- Affix.prototype.getPinnedOffset = function () {
- if (this.pinnedOffset) return this.pinnedOffset
- this.$element.removeClass(Affix.RESET).addClass('affix')
- var scrollTop = this.$target.scrollTop()
- var position = this.$element.offset()
- return (this.pinnedOffset = position.top - scrollTop)
- }
+ _createClass(Tooltip, null, [{
+ key: 'VERSION',
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: 'NAME',
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: 'DATA_KEY',
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: 'Event',
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: 'EVENT_KEY',
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: 'DefaultType',
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
- Affix.prototype.checkPositionWithEventLoop = function () {
- setTimeout($.proxy(this.checkPosition, this), 1)
- }
+ return Tooltip;
+ }();
- Affix.prototype.checkPosition = function () {
- if (!this.$element.is(':visible')) return
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
- var height = this.$element.height()
- var offset = this.options.offset
- var offsetTop = offset.top
- var offsetBottom = offset.bottom
- var scrollHeight = Math.max($(document).height(), $(document.body).height())
+ $.fn[NAME] = Tooltip._jQueryInterface;
+ $.fn[NAME].Constructor = Tooltip;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Tooltip._jQueryInterface;
+ };
- if (typeof offset != 'object') offsetBottom = offsetTop = offset
- if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
- if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+ return Tooltip;
+}(jQuery);
- var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0-alpha.6): popover.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
- if (this.affixed != affix) {
- if (this.unpin != null) this.$element.css('top', '')
+var Popover = function ($) {
- var affixType = 'affix' + (affix ? '-' + affix : '')
- var e = $.Event(affixType + '.bs.affix')
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
- this.$element.trigger(e)
+ var NAME = 'popover';
+ var VERSION = '4.0.0-alpha.6';
+ var DATA_KEY = 'bs.popover';
+ var EVENT_KEY = '.' + DATA_KEY;
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
- if (e.isDefaultPrevented()) return
+ var Default = $.extend({}, Tooltip.Default, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover" role="tooltip">' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
+ });
+
+ var DefaultType = $.extend({}, Tooltip.DefaultType, {
+ content: '(string|element|function)'
+ });
+
+ var ClassName = {
+ FADE: 'fade',
+ SHOW: 'show'
+ };
+
+ var Selector = {
+ TITLE: '.popover-title',
+ CONTENT: '.popover-content'
+ };
+
+ var Event = {
+ HIDE: 'hide' + EVENT_KEY,
+ HIDDEN: 'hidden' + EVENT_KEY,
+ SHOW: 'show' + EVENT_KEY,
+ SHOWN: 'shown' + EVENT_KEY,
+ INSERTED: 'inserted' + EVENT_KEY,
+ CLICK: 'click' + EVENT_KEY,
+ FOCUSIN: 'focusin' + EVENT_KEY,
+ FOCUSOUT: 'focusout' + EVENT_KEY,
+ MOUSEENTER: 'mouseenter' + EVENT_KEY,
+ MOUSELEAVE: 'mouseleave' + EVENT_KEY
+ };
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ var Popover = function (_Tooltip) {
+ _inherits(Popover, _Tooltip);
+
+ function Popover() {
+ _classCallCheck(this, Popover);
+
+ return _possibleConstructorReturn(this, _Tooltip.apply(this, arguments));
+ }
- this.affixed = affix
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+ // overrides
- this.$element
- .removeClass(Affix.RESET)
- .addClass(affixType)
- .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
- }
+ Popover.prototype.isWithContent = function isWithContent() {
+ return this.getTitle() || this._getContent();
+ };
- if (affix == 'bottom') {
- this.$element.offset({
- top: scrollHeight - height - offsetBottom
- })
- }
- }
+ Popover.prototype.getTipElement = function getTipElement() {
+ return this.tip = this.tip || $(this.config.template)[0];
+ };
+ Popover.prototype.setContent = function setContent() {
+ var $tip = $(this.getTipElement());
- // AFFIX PLUGIN DEFINITION
- // =======================
+ // we use append for html objects to maintain js events
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
+ this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.affix')
- var options = typeof option == 'object' && option
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
- if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
+ this.cleanupTether();
+ };
- var old = $.fn.affix
+ // private
- $.fn.affix = Plugin
- $.fn.affix.Constructor = Affix
+ Popover.prototype._getContent = function _getContent() {
+ return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
+ };
+ // static
- // AFFIX NO CONFLICT
- // =================
+ Popover._jQueryInterface = function _jQueryInterface(config) {
+ return this.each(function () {
+ var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
- $.fn.affix.noConflict = function () {
- $.fn.affix = old
- return this
- }
+ if (!data && /destroy|hide/.test(config)) {
+ return;
+ }
+ if (!data) {
+ data = new Popover(this, _config);
+ $(this).data(DATA_KEY, data);
+ }
- // AFFIX DATA-API
- // ==============
+ if (typeof config === 'string') {
+ if (data[config] === undefined) {
+ throw new Error('No method named "' + config + '"');
+ }
+ data[config]();
+ }
+ });
+ };
- $(window).on('load', function () {
- $('[data-spy="affix"]').each(function () {
- var $spy = $(this)
- var data = $spy.data()
+ _createClass(Popover, null, [{
+ key: 'VERSION',
- data.offset = data.offset || {}
- if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
- if (data.offsetTop != null) data.offset.top = data.offsetTop
+ // getters
- Plugin.call($spy, data)
- })
- })
+ get: function get() {
+ return VERSION;
+ }
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: 'NAME',
+ get: function get() {
+ return NAME;
+ }
+ }, {
+ key: 'DATA_KEY',
+ get: function get() {
+ return DATA_KEY;
+ }
+ }, {
+ key: 'Event',
+ get: function get() {
+ return Event;
+ }
+ }, {
+ key: 'EVENT_KEY',
+ get: function get() {
+ return EVENT_KEY;
+ }
+ }, {
+ key: 'DefaultType',
+ get: function get() {
+ return DefaultType;
+ }
+ }]);
+ return Popover;
+ }(Tooltip);
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Popover._jQueryInterface;
+ $.fn[NAME].Constructor = Popover;
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
+ return Popover._jQueryInterface;
+ };
+
+ return Popover;
}(jQuery);
+
+}();
diff --git a/library/bootstrap/js/bootstrap.min.js b/library/bootstrap/js/bootstrap.min.js
index 9bcd2fcca..b1b3a0bce 100644
--- a/library/bootstrap/js/bootstrap.min.js
+++ b/library/bootstrap/js/bootstrap.min.js
@@ -1,7 +1,7 @@
/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under the MIT license
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/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&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.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<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',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-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.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:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),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[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){
-this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .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<c&&"top";if("bottom"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&"bottom":!(e+g<=a-d)&&"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?"top":null!=d&&i+j>=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
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");+function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:s.end,delegateType:s.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in a)if(void 0!==t.style[e])return{end:a[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(l.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||l.triggerTransitionEnd(n)},e),this}var s=!1,a={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||"");try{return t(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return function(){s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i())}(),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},c=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;if(t(e).removeClass(l.SHOW),!r.supportsTransitionEnd()||!t(e).hasClass(l.FADE))return void this._destroyElement(e);t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,c._handleDismiss(new c)),t.fn[e]=c._jQueryInterface,t.fn[e].Constructor=c,t.fn[e].noConflict=function(){return t.fn[e]=i,c._jQueryInterface},c}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=t(this._element).closest(s.DATA_TOGGLE)[0];if(n){var i=t(this._element).find(s.INPUT)[0];if(i){if("radio"===i.type)if(i.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var o=t(n).find(s.ACTIVE)[0];o&&t(o).removeClass(r.ACTIVE)}e&&(i.checked=!t(this._element).hasClass(r.ACTIVE),t(i).trigger("change")),i.focus()}}this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){t(t(e.target).closest(s.BUTTON)[0]).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface},l}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],c={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},h={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},_={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},p=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(_.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(_.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(_.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(d.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},c,n),r.typeCheckConfig(e,n,h),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"!==this._config.pause||"ontouchstart"in document.documentElement||t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)})},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(_.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=t===u.PREV?-1:1,a=(o+s)%this._items.length;return a===-1?this._items[this._items.length-1]:this._items[a]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(_.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(_.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(_.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),c=Boolean(this._interval),h=void 0,p=void 0,g=void 0;if(e===u.NEXT?(h=f.LEFT,p=f.NEXT,g=u.LEFT):(h=f.RIGHT,p=f.PREV,g=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))return void(this._isSliding=!1);if(!this._triggerSlideEvent(a,g).isDefaultPrevented()&&o&&a){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:g,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(p),r.reflow(a),t(o).addClass(h),t(a).addClass(h),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(h+" "+p).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+p+" "+h),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),c&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},c,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return c}}]),l}();t(document).on(d.CLICK_DATA_API,_.DATA_SLIDE,p._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(_.DATA_RIDE).each(function(){var e=t(this);p._jQueryInterface.call(e,e.data())})}),t.fn[e]=p._jQueryInterface,t.fn[e].Constructor=p,t.fn[e].noConflict=function(){return t.fn[e]=l,p._jQueryInterface},p}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},c={toggle:"boolean",parent:"string"},h={SHOW:"show."+s,SHOWN:"shown."+s,HIDE:"hide."+s,HIDDEN:"hidden."+s,CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]',DATA_CHILDREN:"data-children"},_=function(){function a(e,i){if(n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]')),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._selectorActives=f.ACTIVES,this._parent){var o=this._parent.hasAttribute(f.DATA_CHILDREN)?this._parent.getAttribute(f.DATA_CHILDREN):null;null!==o&&(this._selectorActives=o+" > .show, "+o+" > .collapsing")}this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(this._selectorActives)),n.length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._element.setAttribute("aria-expanded",!0),this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var c=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(h.SHOWN)};if(!r.supportsTransitionEnd())return void c();var d=l[0].toUpperCase()+l.slice(1),f="scroll"+d;t(this._element).one(r.TRANSITION_END,c).emulateTransitionEnd(600),this._element.style[l]=this._element[f]+"px"}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._element.setAttribute("aria-expanded",!1),this._triggerArray.length&&t(this._triggerArray).addClass(u.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var o=function(){e.setTransitioning(!1),t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).trigger(h.HIDDEN)};if(this._element.style[i]="",!r.supportsTransitionEnd())return void o();t(this._element).one(r.TRANSITION_END,o).emulateTransitionEnd(600)}}},a.prototype.setTransitioning=function(t){this._isTransitioning=t},a.prototype.dispose=function(){t.removeData(this._element,s),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},a.prototype._getConfig=function(n){return n=t.extend({},l,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,c),n},a.prototype._getDimension=function(){return t(this._element).hasClass(d.WIDTH)?d.WIDTH:d.HEIGHT},a.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(a._getTargetFromElement(n),[n])}),n},a.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(u.SHOW);e.setAttribute("aria-expanded",i),n.length&&t(n).toggleClass(u.COLLAPSED,!i).attr("aria-expanded",i)}},a._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},a._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(s),r=t.extend({},l,n.data(),"object"===(void 0===e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new a(this,r),n.data(s,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(h.CLICK_DATA_API,f.DATA_TOGGLE,function(e){/input|textarea/i.test(e.target.tagName)||e.preventDefault();var n=_._getTargetFromElement(this),i=t(n).data(s),o=i?"toggle":t(this).data();_._jQueryInterface.call(t(n),o)}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=a,_._jQueryInterface},_}(jQuery),function(t){var e="dropdown",i=".bs.dropdown",s=t.fn[e],a=new RegExp("38|40|27|32"),l={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,CLICK:"click"+i,CLICK_DATA_API:"click.bs.dropdown.data-api",FOCUSIN_DATA_API:"focusin.bs.dropdown.data-api",KEYDOWN_DATA_API:"keydown.bs.dropdown.data-api"},c={BACKDROP:"dropdown-backdrop",DISABLED:"disabled",SHOW:"show"},h={BACKDROP:".dropdown-backdrop",DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",ROLE_MENU:'[role="menu"]',ROLE_LISTBOX:'[role="listbox"]',NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:'[role="menu"] li:not(.disabled) a, [role="listbox"] li:not(.disabled) a'},u=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(c.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(c.SHOW);if(e._clearMenus(),i)return!1;var o={relatedTarget:this},r=t.Event(l.SHOW,o);if(t(n).trigger(r),r.isDefaultPrevented())return!1;if("ontouchstart"in document.documentElement&&!t(n).closest(h.NAVBAR_NAV).length){var s=document.createElement("div");s.className=c.BACKDROP,t(s).insertBefore(this),t(s).on("click",e._clearMenus)}return this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(c.SHOW),t(n).trigger(t.Event(l.SHOWN,o)),!1},e.prototype.dispose=function(){t.removeData(this._element,"bs.dropdown"),t(this._element).off(i),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(l.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.dropdown");if(i||(i=new e(this),t(this).data("bs.dropdown",i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||3!==n.which)for(var i=t.makeArray(t(h.DATA_TOGGLE)),o=0;o<i.length;o++){var r=e._getParentFromElement(i[o]),s={relatedTarget:i[o]};if(t(r).hasClass(c.SHOW)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"focusin"===n.type)&&t.contains(r,n.target))){var a=t.Event(l.HIDE,s);if(t(r).trigger(a),!a.isDefaultPrevented()){var u=t(r).find(h.BACKDROP)[0];u&&u.parentNode.removeChild(u),i[o].setAttribute("aria-expanded","false"),t(r).removeClass(c.SHOW).trigger(t.Event(l.HIDDEN,s))}}}},e._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},e._dataApiKeydownHandler=function(n){if(a.test(n.which)&&!/input|textarea/i.test(n.target.tagName)&&(n.preventDefault(),n.stopPropagation(),!this.disabled&&!t(this).hasClass(c.DISABLED))){var i=e._getParentFromElement(this),o=t(i).hasClass(c.SHOW);if(!o&&27!==n.which||o&&27===n.which){if(27===n.which){t(t(i).find(h.DATA_TOGGLE)[0]).trigger("focus")}return void t(this).trigger("click")}var r=t(i).find(h.VISIBLE_ITEMS).get();if(r.length){var s=r.indexOf(n.target);38===n.which&&s>0&&s--,40===n.which&&s<r.length-1&&s++,s<0&&(s=0),r[s].focus()}}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(l.KEYDOWN_DATA_API,h.DATA_TOGGLE,u._dataApiKeydownHandler).on(l.KEYDOWN_DATA_API,h.ROLE_MENU,u._dataApiKeydownHandler).on(l.KEYDOWN_DATA_API,h.ROLE_LISTBOX,u._dataApiKeydownHandler).on(l.CLICK_DATA_API+" "+l.FOCUSIN_DATA_API,u._clearMenus).on(l.CLICK_DATA_API,h.DATA_TOGGLE,u.prototype.toggle).on(l.CLICK_DATA_API,h.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=u._jQueryInterface,t.fn[e].Constructor=u,t.fn[e].noConflict=function(){return t.fn[e]=s,u._jQueryInterface},u}(jQuery),function(t){var e="modal",s=".bs.modal",a=t.fn[e],l={backdrop:!0,keyboard:!0,focus:!0,show:!0},c={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},h={HIDE:"hide.bs.modal",HIDDEN:"hidden.bs.modal",SHOW:"show.bs.modal",SHOWN:"shown.bs.modal",FOCUSIN:"focusin.bs.modal",RESIZE:"resize.bs.modal",CLICK_DISMISS:"click.dismiss.bs.modal",KEYDOWN_DISMISS:"keydown.dismiss.bs.modal",MOUSEUP_DISMISS:"mouseup.dismiss.bs.modal",MOUSEDOWN_DISMISS:"mousedown.dismiss.bs.modal",CLICK_DATA_API:"click.bs.modal.data-api"},u={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},d={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top"},f=function(){function a(e,i){n(this,a),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(d.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return a.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},a.prototype.show=function(e){var n=this;if(!this._isTransitioning){r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)&&(this._isTransitioning=!0);var i=t.Event(h.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(u.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(h.CLICK_DISMISS,d.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(h.MOUSEDOWN_DISMISS,function(){t(n._element).one(h.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},a.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);i&&(this._isTransitioning=!0);var o=t.Event(h.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(h.FOCUSIN),t(this._element).removeClass(u.SHOW),t(this._element).off(h.CLICK_DISMISS),t(this._dialog).off(h.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal())}},a.prototype.dispose=function(){t.removeData(this._element,"bs.modal"),t(window,document,this._element,this._backdrop).off(s),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._originalBodyPadding=null,this._scrollbarWidth=null},a.prototype.handleUpdate=function(){this._adjustDialog()},a.prototype._getConfig=function(n){return n=t.extend({},l,n),r.typeCheckConfig(e,n,c),n},a.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(u.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(h.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(300):s()},a.prototype._enforceFocus=function(){var e=this;t(document).off(h.FOCUSIN).on(h.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},a.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(h.KEYDOWN_DISMISS,function(t){27===t.which&&e.hide()}):this._isShown||t(this._element).off(h.KEYDOWN_DISMISS)},a.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(h.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(h.RESIZE)},a.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(u.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(h.HIDDEN)})},a.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},a.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(u.FADE)?u.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(h.CLICK_DISMISS,function(t){if(n._ignoreBackdropClick)return void(n._ignoreBackdropClick=!1);t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(u.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(u.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s()}else e&&e()},a.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},a.prototype._setScrollbar=function(){var e=parseInt(t(d.FIXED_CONTENT).css("padding-right")||0,10);this._originalBodyPadding=document.body.style.paddingRight||"",this._isBodyOverflowing&&(document.body.style.paddingRight=e+this._scrollbarWidth+"px")},a.prototype._resetScrollbar=function(){document.body.style.paddingRight=this._originalBodyPadding},a.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=u.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},a._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data("bs.modal"),r=t.extend({},a.Default,t(this).data(),"object"===(void 0===e?"undefined":i(e))&&e);if(o||(o=new a(this,r),t(this).data("bs.modal",o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(h.CLICK_DATA_API,d.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data("bs.modal")?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var a=t(i).one(h.SHOW,function(e){e.isDefaultPrevented()||a.one(h.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});f._jQueryInterface.call(t(i),s,this)}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=a,f._jQueryInterface},f}(jQuery),function(t){var e="scrollspy",s=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},c={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},h={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",NAV_LINK:"nav-link",NAV:"nav",ACTIVE:"active"},u={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",LIST_ITEM:".list-item",LI:"li",LI_DROPDOWN:"li.dropdown",NAV_LINKS:".nav-link",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d={OFFSET:"offset",POSITION:"position"},f=function(){function s(e,i){var o=this;n(this,s),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+u.NAV_LINKS+","+this._config.target+" "+u.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(c.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return s.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?d.POSITION:d.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===d.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n=void 0,s=r.getSelectorFromElement(e);if(s&&(n=t(s)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+o,s]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},s.prototype.dispose=function(){t.removeData(this._element,"bs.scrollspy"),t(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},s.prototype._getConfig=function(n){if(n=t.extend({},a,n),"string"!=typeof n.target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,l),n},s.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},s.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},s.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},s.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}},s.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(h.DROPDOWN_ITEM)?(i.closest(u.DROPDOWN).find(u.DROPDOWN_TOGGLE).addClass(h.ACTIVE),
+i.addClass(h.ACTIVE)):i.parents(u.LI).find("> "+u.NAV_LINKS).addClass(h.ACTIVE),t(this._scrollElement).trigger(c.ACTIVATE,{relatedTarget:e})},s.prototype._clear=function(){t(this._selector).filter(u.ACTIVE).removeClass(h.ACTIVE)},s._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.scrollspy"),o="object"===(void 0===e?"undefined":i(e))&&e;if(n||(n=new s(this,o),t(this).data("bs.scrollspy",n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(s,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return a}}]),s}();t(window).on(c.LOAD_DATA_API,function(){for(var e=t.makeArray(t(u.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);f._jQueryInterface.call(i,i.data())}}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=s,f._jQueryInterface},f}(jQuery),function(t){var e=t.fn.tab,i={HIDE:"hide.bs.tab",HIDDEN:"hidden.bs.tab",SHOW:"show.bs.tab",SHOWN:"shown.bs.tab",CLICK_DATA_API:"click.bs.tab.data-api"},s={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},a={A:"a",LI:"li",DROPDOWN:".dropdown",LIST:"ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu), .list-group:not(.dropdown-menu)",FADE_CHILD:"> .nav-item .fade, > .list-group-item .fade, > .fade",ACTIVE:".active",ACTIVE_CHILD:"> .nav-item > .active, > .list-group-item > .active, > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.LIST)[0],c=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var h=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(h),t(this._element).trigger(u),!u.isDefaultPrevented()&&!h.isDefaultPrevented()){c&&(n=t(c)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeClass(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE_CHILD)[0],c=i&&r.supportsTransitionEnd()&&(l&&t(l).hasClass(s.FADE)||Boolean(t(n).find(a.FADE_CHILD)[0])),h=function(){return o._transitionComplete(e,l,c,i)};l&&c?t(l).one(r.TRANSITION_END,h).emulateTransitionEnd(150):h(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE),t(n).hasClass("list-group-item")&&t(n).find("a.nav-link").removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),t(e.parentNode).hasClass("list-group-item")&&t(e.parentNode).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var c=t(e).closest(a.DROPDOWN)[0];c&&t(c).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface},l}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tether\\S+","g"),c={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},u={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},_={FADE:"fade",SHOW:"show"},p={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},g={element:!1,enabled:!1},m={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},E=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(_.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(_.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,c=this._getAttachment(l),h=this.config.container===!1?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(h),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:c,element:o,target:this.element,classes:g,classPrefix:"bs-tether",offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(_.SHOW);var u=function(){var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE))return void t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION);u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(_.SHOW),this._activeTrigger[m.CLICK]=!1,this._activeTrigger[m.FOCUS]=!1,this._activeTrigger[m.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(p.TOOLTIP_INNER),this.getTitle()),e.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},a.prototype._getAttachment=function(t){return u[t.toUpperCase()]},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==m.MANUAL){var i=n===m.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===m.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?m.FOCUS:m.HOVER]=!0),t(n.getTipElement()).hasClass(_.SHOW)||n._hoverState===d.SHOW?void(n._hoverState=d.SHOW):(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show)):void n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?m.FOCUS:m.HOVER]=!1),!n._isWithActiveTrigger()){if(clearTimeout(n._timeout),n._hoverState=d.OUT,!n.config.delay||!n.config.delay.hide)return void n.hide();n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide)}},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=a,E._jQueryInterface},E}(jQuery));!function(r){var a="popover",l=".bs.popover",c=r.fn[a],h=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),u=r.extend({},s.DefaultType,{content:"(string|element|function)"}),d={FADE:"fade",SHOW:"show"},f={TITLE:".popover-title",CONTENT:".popover-content"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},p=function(s){function c(){return n(this,c),t(this,s.apply(this,arguments))}return e(c,s),c.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},c.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},c.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(f.TITLE),this.getTitle()),this.setElementContent(t.find(f.CONTENT),this._getContent()),t.removeClass(d.FADE+" "+d.SHOW),this.cleanupTether()},c.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},c._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new c(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(c,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return h}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return u}}]),c}(s);r.fn[a]=p._jQueryInterface,r.fn[a].Constructor=p,r.fn[a].noConflict=function(){return r.fn[a]=c,p._jQueryInterface},p}(jQuery)}(); \ No newline at end of file
diff --git a/library/emoji.json b/library/emoji.json
deleted file mode 100644
index dc28c13a1..000000000
--- a/library/emoji.json
+++ /dev/null
@@ -1 +0,0 @@
-{"grinning":{"unicode":"1f600","unicode_alternates":"","name":"grinning face","shortname":":grinning:","category":"people","emoji_order":"1","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"grimacing":{"unicode":"1f62c","unicode_alternates":"","name":"grimacing face","shortname":":grimacing:","category":"people","emoji_order":"2","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","emotion","emotion","selfie","selfie"]},"grin":{"unicode":"1f601","unicode_alternates":"","name":"grinning face with smiling eyes","shortname":":grin:","category":"people","emoji_order":"3","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","emotion","good","good","selfie","selfie"]},"joy":{"unicode":"1f602","unicode_alternates":"","name":"face with tears of joy","shortname":":joy:","category":"people","emoji_order":"4","aliases":[],"aliases_ascii":[":')",":'-)"],"keywords":["happy","silly","smiley","cry","laugh","laugh","emotion","emotion","sarcastic","sarcastic"]},"smiley":{"unicode":"1f603","unicode_alternates":"","name":"smiling face with open mouth","shortname":":smiley:","category":"people","emoji_order":"5","aliases":[],"aliases_ascii":[":D",":-D","=D"],"keywords":["happy","smiley","emotion","emotion","good","good"]},"smile":{"unicode":"1f604","unicode_alternates":"","name":"smiling face with open mouth and smiling eyes","shortname":":smile:","category":"people","emoji_order":"6","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"sweat_smile":{"unicode":"1f605","unicode_alternates":"","name":"smiling face with open mouth and cold sweat","shortname":":sweat_smile:","category":"people","emoji_order":"7","aliases":[],"aliases_ascii":["':)","':-)","'=)","':D","':-D","'=D"],"keywords":["smiley","workout","sweat","emotion","emotion"]},"laughing":{"unicode":"1f606","unicode_alternates":"","name":"smiling face with open mouth and tightly-closed eyes","shortname":":laughing:","category":"people","emoji_order":"8","aliases":[":satisfied:"],"aliases_ascii":[">:)",">;)",">:-)",">=)"],"keywords":["happy","smiley","laugh","laugh","emotion","emotion"]},"innocent":{"unicode":"1f607","unicode_alternates":"","name":"smiling face with halo","shortname":":innocent:","category":"people","emoji_order":"9","aliases":[],"aliases_ascii":["O:-)","0:-3","0:3","0:-)","0:)","0;^)","O:)","O;-)","O=)","0;-)","O:-3","O:3"],"keywords":["smiley","emotion","emotion"]},"wink":{"unicode":"1f609","unicode_alternates":"","name":"winking face","shortname":":wink:","category":"people","emoji_order":"10","aliases":[],"aliases_ascii":[";)",";-)","*-)","*)",";-]",";]",";D",";^)"],"keywords":["silly","smiley","emotion","emotion"]},"blush":{"unicode":"1f60a","unicode_alternates":"","name":"smiling face with smiling eyes","shortname":":blush:","category":"people","emoji_order":"11","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion","good","good","beautiful","beautiful"]},"slight_smile":{"unicode":"1f642","unicode_alternates":"","name":"slightly smiling face","shortname":":slight_smile:","category":"people","emoji_order":"12","aliases":[":slightly_smiling_face:"],"aliases_ascii":[":)",":-)","=]","=)",":]"],"keywords":["happy","smiley"]},"upside_down":{"unicode":"1f643","unicode_alternates":"","name":"upside-down face","shortname":":upside_down:","category":"people","emoji_order":"13","aliases":[":upside_down_face:"],"aliases_ascii":[],"keywords":["silly","smiley","sarcastic","sarcastic"]},"relaxed":{"unicode":"263a","unicode_alternates":"263a-fe0f","name":"white smiling face","shortname":":relaxed:","category":"people","emoji_order":"14","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley"]},"yum":{"unicode":"1f60b","unicode_alternates":"","name":"face savouring delicious food","shortname":":yum:","category":"people","emoji_order":"15","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","emotion","sarcastic","sarcastic","good","good"]},"relieved":{"unicode":"1f60c","unicode_alternates":"","name":"relieved face","shortname":":relieved:","category":"people","emoji_order":"16","aliases":[],"aliases_ascii":[],"keywords":["smiley","emotion","emotion"]},"heart_eyes":{"unicode":"1f60d","unicode_alternates":"","name":"smiling face with heart-shaped eyes","shortname":":heart_eyes:","category":"people","emoji_order":"17","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","love","sex","heart eyes","emotion","emotion","beautiful","beautiful"]},"kissing_heart":{"unicode":"1f618","unicode_alternates":"","name":"face throwing a kiss","shortname":":kissing_heart:","category":"people","emoji_order":"18","aliases":[],"aliases_ascii":[":*",":-*","=*",":^*"],"keywords":["smiley","love","sexy"]},"kissing":{"unicode":"1f617","unicode_alternates":"","name":"kissing face","shortname":":kissing:","category":"people","emoji_order":"19","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_smiling_eyes":{"unicode":"1f619","unicode_alternates":"","name":"kissing face with smiling eyes","shortname":":kissing_smiling_eyes:","category":"people","emoji_order":"20","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_closed_eyes":{"unicode":"1f61a","unicode_alternates":"","name":"kissing face with closed eyes","shortname":":kissing_closed_eyes:","category":"people","emoji_order":"21","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"stuck_out_tongue_winking_eye":{"unicode":"1f61c","unicode_alternates":"","name":"face with stuck-out tongue and winking eye","shortname":":stuck_out_tongue_winking_eye:","category":"people","emoji_order":"22","aliases":[],"aliases_ascii":[">:P","X-P","x-p"],"keywords":["happy","smiley","emotion","emotion","parties","parties"]},"stuck_out_tongue_closed_eyes":{"unicode":"1f61d","unicode_alternates":"","name":"face with stuck-out tongue and tightly-closed eyes","shortname":":stuck_out_tongue_closed_eyes:","category":"people","emoji_order":"23","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","emotion"]},"stuck_out_tongue":{"unicode":"1f61b","unicode_alternates":"","name":"face with stuck-out tongue","shortname":":stuck_out_tongue:","category":"people","emoji_order":"24","aliases":[],"aliases_ascii":[":P",":-P","=P",":-p",":p","=p",":-\u00de",":\u00de",":\u00fe",":-\u00fe",":-b",":b","d:"],"keywords":["smiley","sex","emotion","emotion"]},"money_mouth":{"unicode":"1f911","unicode_alternates":"","name":"money-mouth face","shortname":":money_mouth:","category":"people","emoji_order":"25","aliases":[":money_mouth_face:"],"aliases_ascii":[],"keywords":["smiley","win","win","money","money","emotion","emotion","boys night","boys night"]},"nerd":{"unicode":"1f913","unicode_alternates":"","name":"nerd face","shortname":":nerd:","category":"people","emoji_order":"26","aliases":[":nerd_face:"],"aliases_ascii":[],"keywords":["smiley","glasses"]},"sunglasses":{"unicode":"1f60e","unicode_alternates":"","name":"smiling face with sunglasses","shortname":":sunglasses:","category":"people","emoji_order":"27","aliases":[],"aliases_ascii":["B-)","B)","8)","8-)","B-D","8-D"],"keywords":["silly","smiley","emojione","glasses","boys night","boys night"]},"hugging":{"unicode":"1f917","unicode_alternates":"","name":"hugging face","shortname":":hugging:","category":"people","emoji_order":"28","aliases":[":hugging_face:"],"aliases_ascii":[],"keywords":["smiley","hug","thank you"]},"smirk":{"unicode":"1f60f","unicode_alternates":"","name":"smirking face","shortname":":smirk:","category":"people","emoji_order":"29","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","sexy","sarcastic","sarcastic"]},"no_mouth":{"unicode":"1f636","unicode_alternates":"","name":"face without mouth","shortname":":no_mouth:","category":"people","emoji_order":"30","aliases":[],"aliases_ascii":[":-X",":X",":-#",":#","=X","=x",":x",":-x","=#"],"keywords":["mad","smiley","neutral","emotion","emotion"]},"neutral_face":{"unicode":"1f610","unicode_alternates":"","name":"neutral face","shortname":":neutral_face:","category":"people","emoji_order":"31","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","shrug","neutral","emotion","emotion"]},"expressionless":{"unicode":"1f611","unicode_alternates":"","name":"expressionless face","shortname":":expressionless:","category":"people","emoji_order":"32","aliases":[],"aliases_ascii":["-_-","-__-","-___-"],"keywords":["mad","smiley","neutral","emotion","emotion"]},"unamused":{"unicode":"1f612","unicode_alternates":"","name":"unamused face","shortname":":unamused:","category":"people","emoji_order":"33","aliases":[],"aliases_ascii":[],"keywords":["sad","mad","smiley","tired","emotion","emotion"]},"rolling_eyes":{"unicode":"1f644","unicode_alternates":"","name":"face with rolling eyes","shortname":":rolling_eyes:","category":"people","emoji_order":"34","aliases":[":face_with_rolling_eyes:"],"aliases_ascii":[],"keywords":["mad","smiley","rolling eyes","emotion","emotion","sarcastic","sarcastic"]},"thinking":{"unicode":"1f914","unicode_alternates":"","name":"thinking face","shortname":":thinking:","category":"people","emoji_order":"35","aliases":[":thinking_face:"],"aliases_ascii":[],"keywords":["smiley","thinking","boys night","boys night"]},"flushed":{"unicode":"1f633","unicode_alternates":"","name":"flushed face","shortname":":flushed:","category":"people","emoji_order":"36","aliases":[],"aliases_ascii":[":$","=$"],"keywords":["smiley","emotion","emotion","omg","omg"]},"disappointed":{"unicode":"1f61e","unicode_alternates":"","name":"disappointed face","shortname":":disappointed:","category":"people","emoji_order":"37","aliases":[],"aliases_ascii":[">:[",":-(",":(",":-[",":[","=("],"keywords":["sad","smiley","tired","emotion","emotion"]},"worried":{"unicode":"1f61f","unicode_alternates":"","name":"worried face","shortname":":worried:","category":"people","emoji_order":"38","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"angry":{"unicode":"1f620","unicode_alternates":"","name":"angry face","shortname":":angry:","category":"people","emoji_order":"39","aliases":[],"aliases_ascii":[">:(",">:-(",":@"],"keywords":["mad","smiley","emotion","emotion"]},"rage":{"unicode":"1f621","unicode_alternates":"","name":"pouting face","shortname":":rage:","category":"people","emoji_order":"40","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","emotion"]},"pensive":{"unicode":"1f614","unicode_alternates":"","name":"pensive face","shortname":":pensive:","category":"people","emoji_order":"41","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion","rip","rip"]},"confused":{"unicode":"1f615","unicode_alternates":"","name":"confused face","shortname":":confused:","category":"people","emoji_order":"42","aliases":[],"aliases_ascii":[">:\\",">:\/",":-\/",":-.",":\/",":\\","=\/","=\\",":L","=L"],"keywords":["smiley","surprised","emotion","emotion"]},"slight_frown":{"unicode":"1f641","unicode_alternates":"","name":"slightly frowning face","shortname":":slight_frown:","category":"people","emoji_order":"43","aliases":[":slightly_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"frowning2":{"unicode":"2639","unicode_alternates":"2639-fe0f","name":"white frowning face","shortname":":frowning2:","category":"people","emoji_order":"44","aliases":[":white_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion","emotion"]},"persevere":{"unicode":"1f623","unicode_alternates":"","name":"persevering face","shortname":":persevere:","category":"people","emoji_order":"45","aliases":[],"aliases_ascii":[">.<"],"keywords":["sad","smiley","angry","emotion","emotion"]},"confounded":{"unicode":"1f616","unicode_alternates":"","name":"confounded face","shortname":":confounded:","category":"people","emoji_order":"46","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","angry","emotion","emotion"]},"tired_face":{"unicode":"1f62b","unicode_alternates":"","name":"tired face","shortname":":tired_face:","category":"people","emoji_order":"47","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","emotion","emotion"]},"weary":{"unicode":"1f629","unicode_alternates":"","name":"weary face","shortname":":weary:","category":"people","emoji_order":"48","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","stressed","emotion","emotion"]},"triumph":{"unicode":"1f624","unicode_alternates":"","name":"face with look of triumph","shortname":":triumph:","category":"people","emoji_order":"49","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","emotion","steam","steam"]},"open_mouth":{"unicode":"1f62e","unicode_alternates":"","name":"face with open mouth","shortname":":open_mouth:","category":"people","emoji_order":"50","aliases":[],"aliases_ascii":[":-O",":O",":-o",":o","O_O",">:O"],"keywords":["smiley","surprised","wow","wow","emotion","emotion"]},"scream":{"unicode":"1f631","unicode_alternates":"","name":"face screaming in fear","shortname":":scream:","category":"people","emoji_order":"51","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow","emotion","emotion","omg","omg"]},"fearful":{"unicode":"1f628","unicode_alternates":"","name":"fearful face","shortname":":fearful:","category":"people","emoji_order":"52","aliases":[],"aliases_ascii":["D:"],"keywords":["smiley","surprised","emotion","emotion"]},"cold_sweat":{"unicode":"1f630","unicode_alternates":"","name":"face with open mouth and cold sweat","shortname":":cold_sweat:","category":"people","emoji_order":"53","aliases":[],"aliases_ascii":[],"keywords":["smiley","sweat","emotion","emotion"]},"hushed":{"unicode":"1f62f","unicode_alternates":"","name":"hushed face","shortname":":hushed:","category":"people","emoji_order":"54","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow"]},"frowning":{"unicode":"1f626","unicode_alternates":"","name":"frowning face with open mouth","shortname":":frowning:","category":"people","emoji_order":"55","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion","emotion"]},"anguished":{"unicode":"1f627","unicode_alternates":"","name":"anguished face","shortname":":anguished:","category":"people","emoji_order":"56","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion","emotion"]},"cry":{"unicode":"1f622","unicode_alternates":"","name":"crying face","shortname":":cry:","category":"people","emoji_order":"57","aliases":[],"aliases_ascii":[":'(",":'-(",";(",";-("],"keywords":["sad","smiley","cry","emotion","emotion","rip","rip","heartbreak","heartbreak"]},"disappointed_relieved":{"unicode":"1f625","unicode_alternates":"","name":"disappointed but relieved face","shortname":":disappointed_relieved:","category":"people","emoji_order":"58","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","stressed","sweat","cry","emotion","emotion"]},"sleepy":{"unicode":"1f62a","unicode_alternates":"","name":"sleepy face","shortname":":sleepy:","category":"people","emoji_order":"59","aliases":[],"aliases_ascii":[],"keywords":["smiley","sick","emotion","emotion"]},"sweat":{"unicode":"1f613","unicode_alternates":"","name":"face with cold sweat","shortname":":sweat:","category":"people","emoji_order":"60","aliases":[],"aliases_ascii":["':(","':-(","'=("],"keywords":["sad","smiley","stressed","sweat","emotion","emotion"]},"sob":{"unicode":"1f62d","unicode_alternates":"","name":"loudly crying face","shortname":":sob:","category":"people","emoji_order":"61","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","cry","emotion","emotion","heartbreak","heartbreak"]},"dizzy_face":{"unicode":"1f635","unicode_alternates":"","name":"dizzy face","shortname":":dizzy_face:","category":"people","emoji_order":"62","aliases":[],"aliases_ascii":["#-)","#)","%-)","%)","X)","X-)"],"keywords":["smiley","surprised","dead","wow","wow","emotion","emotion","omg","omg"]},"astonished":{"unicode":"1f632","unicode_alternates":"","name":"astonished face","shortname":":astonished:","category":"people","emoji_order":"63","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","wow","emotion","emotion","omg","omg"]},"zipper_mouth":{"unicode":"1f910","unicode_alternates":"","name":"zipper-mouth face","shortname":":zipper_mouth:","category":"people","emoji_order":"64","aliases":[":zipper_mouth_face:"],"aliases_ascii":[],"keywords":["mad","smiley"]},"mask":{"unicode":"1f637","unicode_alternates":"","name":"face with medical mask","shortname":":mask:","category":"people","emoji_order":"65","aliases":[],"aliases_ascii":[],"keywords":["smiley","dead","health","sick"]},"thermometer_face":{"unicode":"1f912","unicode_alternates":"","name":"face with thermometer","shortname":":thermometer_face:","category":"people","emoji_order":"66","aliases":[":face_with_thermometer:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion","emotion"]},"head_bandage":{"unicode":"1f915","unicode_alternates":"","name":"face with head-bandage","shortname":":head_bandage:","category":"people","emoji_order":"67","aliases":[":face_with_head_bandage:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion","emotion"]},"sleeping":{"unicode":"1f634","unicode_alternates":"","name":"sleeping face","shortname":":sleeping:","category":"people","emoji_order":"68","aliases":[],"aliases_ascii":[],"keywords":["smiley","tired","emotion","emotion","goodnight","goodnight"]},"zzz":{"unicode":"1f4a4","unicode_alternates":"","name":"sleeping symbol","shortname":":zzz:","category":"people","emoji_order":"69","aliases":[],"aliases_ascii":[],"keywords":["tired","goodnight","goodnight"]},"poop":{"unicode":"1f4a9","unicode_alternates":"","name":"pile of poo","shortname":":poop:","category":"people","emoji_order":"70","aliases":[":shit:",":hankey:",":poo:"],"aliases_ascii":[],"keywords":["bathroom","shit","sol","sol","diarrhea","diarrhea"]},"smiling_imp":{"unicode":"1f608","unicode_alternates":"","name":"smiling face with horns","shortname":":smiling_imp:","category":"people","emoji_order":"71","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","angry","monster","devil","devil","boys night","boys night"]},"imp":{"unicode":"1f47f","unicode_alternates":"","name":"imp","shortname":":imp:","category":"people","emoji_order":"72","aliases":[],"aliases_ascii":[],"keywords":["smiley","monster","devil","devil","wth","wth"]},"japanese_ogre":{"unicode":"1f479","unicode_alternates":"","name":"japanese ogre","shortname":":japanese_ogre:","category":"people","emoji_order":"73","aliases":[],"aliases_ascii":[],"keywords":["monster"]},"japanese_goblin":{"unicode":"1f47a","unicode_alternates":"","name":"japanese goblin","shortname":":japanese_goblin:","category":"people","emoji_order":"74","aliases":[],"aliases_ascii":[],"keywords":["angry","monster"]},"skull":{"unicode":"1f480","unicode_alternates":"","name":"skull","shortname":":skull:","category":"people","emoji_order":"75","aliases":[":skeleton:"],"aliases_ascii":[],"keywords":["dead","halloween","skull"]},"ghost":{"unicode":"1f47b","unicode_alternates":"","name":"ghost","shortname":":ghost:","category":"people","emoji_order":"76","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween","monster"]},"alien":{"unicode":"1f47d","unicode_alternates":"","name":"extraterrestrial alien","shortname":":alien:","category":"people","emoji_order":"77","aliases":[],"aliases_ascii":[],"keywords":["space","monster","alien","scientology","scientology"]},"robot":{"unicode":"1f916","unicode_alternates":"","name":"robot face","shortname":":robot:","category":"people","emoji_order":"78","aliases":[":robot_face:"],"aliases_ascii":[],"keywords":["monster","robot"]},"smiley_cat":{"unicode":"1f63a","unicode_alternates":"","name":"smiling cat face with open mouth","shortname":":smiley_cat:","category":"people","emoji_order":"79","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","cat","animal","animal"]},"smile_cat":{"unicode":"1f638","unicode_alternates":"","name":"grinning cat face with smiling eyes","shortname":":smile_cat:","category":"people","emoji_order":"80","aliases":[],"aliases_ascii":[],"keywords":["happy","cat","cat","animal","animal"]},"joy_cat":{"unicode":"1f639","unicode_alternates":"","name":"cat face with tears of joy","shortname":":joy_cat:","category":"people","emoji_order":"81","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","cry","laugh","laugh","cat","cat","animal","animal","sarcastic","sarcastic"]},"heart_eyes_cat":{"unicode":"1f63b","unicode_alternates":"","name":"smiling cat face with heart-shaped eyes","shortname":":heart_eyes_cat:","category":"people","emoji_order":"82","aliases":[],"aliases_ascii":[],"keywords":["heart eyes","cat","cat","animal","animal","beautiful","beautiful"]},"smirk_cat":{"unicode":"1f63c","unicode_alternates":"","name":"cat face with wry smile","shortname":":smirk_cat:","category":"people","emoji_order":"83","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"kissing_cat":{"unicode":"1f63d","unicode_alternates":"","name":"kissing cat face with closed eyes","shortname":":kissing_cat:","category":"people","emoji_order":"84","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"scream_cat":{"unicode":"1f640","unicode_alternates":"","name":"weary cat face","shortname":":scream_cat:","category":"people","emoji_order":"85","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"crying_cat_face":{"unicode":"1f63f","unicode_alternates":"","name":"crying cat face","shortname":":crying_cat_face:","category":"people","emoji_order":"86","aliases":[],"aliases_ascii":[],"keywords":["cry","cat","cat","animal","animal"]},"pouting_cat":{"unicode":"1f63e","unicode_alternates":"","name":"pouting cat face","shortname":":pouting_cat:","category":"people","emoji_order":"87","aliases":[],"aliases_ascii":[],"keywords":["cat","cat","animal","animal"]},"raised_hands":{"unicode":"1f64c","unicode_alternates":"","name":"person raising both hands in celebration","shortname":":raised_hands:","category":"people","emoji_order":"88","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity","perfect","perfect","good","good","parties","parties"]},"clap":{"unicode":"1f44f","unicode_alternates":"","name":"clapping hands sign","shortname":":clap:","category":"people","emoji_order":"89","aliases":[],"aliases_ascii":[],"keywords":["body","hands","win","win","diversity","diversity","good","good","beautiful","beautiful"]},"wave":{"unicode":"1f44b","unicode_alternates":"","name":"waving hand sign","shortname":":wave:","category":"people","emoji_order":"90","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"thumbsup":{"unicode":"1f44d","unicode_alternates":"","name":"thumbs up sign","shortname":":thumbsup:","category":"people","emoji_order":"91","aliases":[":+1:",":thumbup:"],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","diversity","diversity","perfect","perfect","good","good","beautiful","beautiful"]},"thumbsdown":{"unicode":"1f44e","unicode_alternates":"","name":"thumbs down sign","shortname":":thumbsdown:","category":"people","emoji_order":"92","aliases":[":-1:",":thumbdown:"],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"punch":{"unicode":"1f44a","unicode_alternates":"","name":"fisted hand sign","shortname":":punch:","category":"people","emoji_order":"93","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","diversity","boys night","boys night"]},"fist":{"unicode":"270a","unicode_alternates":"","name":"raised fist","shortname":":fist:","category":"people","emoji_order":"94","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","fist bump","diversity","diversity","condolence","condolence"]},"v":{"unicode":"270c","unicode_alternates":"270c-fe0f","name":"victory hand","shortname":":v:","category":"people","emoji_order":"95","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","thank you","peace","peace","diversity","diversity","girls night","girls night"]},"ok_hand":{"unicode":"1f44c","unicode_alternates":"","name":"ok hand sign","shortname":":ok_hand:","category":"people","emoji_order":"96","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","perfect","perfect","good","good","beautiful","beautiful"]},"raised_hand":{"unicode":"270b","unicode_alternates":"","name":"raised hand","shortname":":raised_hand:","category":"people","emoji_order":"97","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","girls night","girls night"]},"open_hands":{"unicode":"1f450","unicode_alternates":"","name":"open hands sign","shortname":":open_hands:","category":"people","emoji_order":"98","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity","condolence","condolence"]},"muscle":{"unicode":"1f4aa","unicode_alternates":"","name":"flexed biceps","shortname":":muscle:","category":"people","emoji_order":"99","aliases":[],"aliases_ascii":[],"keywords":["body","hands","workout","flex","win","win","diversity","diversity","feminist","feminist","boys night","boys night"]},"pray":{"unicode":"1f64f","unicode_alternates":"","name":"person with folded hands","shortname":":pray:","category":"people","emoji_order":"100","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","luck","thank you","pray","pray","diversity","diversity","scientology","scientology"]},"point_up":{"unicode":"261d","unicode_alternates":"261d-fe0f","name":"white up pointing index","shortname":":point_up:","category":"people","emoji_order":"101","aliases":[],"aliases_ascii":[],"keywords":["body","hands","emojione","diversity","diversity"]},"point_up_2":{"unicode":"1f446","unicode_alternates":"","name":"white up pointing backhand index","shortname":":point_up_2:","category":"people","emoji_order":"102","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"point_down":{"unicode":"1f447","unicode_alternates":"","name":"white down pointing backhand index","shortname":":point_down:","category":"people","emoji_order":"103","aliases":[],"aliases_ascii":[],"keywords":["body","hands","diversity","diversity"]},"point_left":{"unicode":"1f448","unicode_alternates":"","name":"white left pointing backhand index","shortname":":point_left:","category":"people","emoji_order":"104","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"point_right":{"unicode":"1f449","unicode_alternates":"","name":"white right pointing backhand index","shortname":":point_right:","category":"people","emoji_order":"105","aliases":[],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"middle_finger":{"unicode":"1f595","unicode_alternates":"","name":"reversed hand with middle finger extended","shortname":":middle_finger:","category":"people","emoji_order":"106","aliases":[":reversed_hand_with_middle_finger_extended:"],"aliases_ascii":[],"keywords":["body","hands","middle finger","diversity","diversity"]},"hand_splayed":{"unicode":"1f590","unicode_alternates":"1f590-fe0f","name":"raised hand with fingers splayed","shortname":":hand_splayed:","category":"people","emoji_order":"107","aliases":[":raised_hand_with_fingers_splayed:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"metal":{"unicode":"1f918","unicode_alternates":"","name":"sign of the horns","shortname":":metal:","category":"people","emoji_order":"108","aliases":[":sign_of_the_horns:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity","boys night","boys night","parties","parties"]},"vulcan":{"unicode":"1f596","unicode_alternates":"","name":"raised hand with part between middle and ring fingers","shortname":":vulcan:","category":"people","emoji_order":"109","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers:"],"aliases_ascii":[],"keywords":["body","hands","hi","diversity","diversity"]},"writing_hand":{"unicode":"270d","unicode_alternates":"270d-fe0f","name":"writing hand","shortname":":writing_hand:","category":"people","emoji_order":"110","aliases":[],"aliases_ascii":[],"keywords":["body","hands","write","diversity","diversity"]},"nail_care":{"unicode":"1f485","unicode_alternates":"","name":"nail polish","shortname":":nail_care:","category":"people","emoji_order":"111","aliases":[],"aliases_ascii":[],"keywords":["women","body","hands","nailpolish","diversity","diversity","girls night","girls night"]},"lips":{"unicode":"1f444","unicode_alternates":"","name":"mouth","shortname":":lips:","category":"people","emoji_order":"112","aliases":[],"aliases_ascii":[],"keywords":["women","body","sexy","lip"]},"tongue":{"unicode":"1f445","unicode_alternates":"","name":"tongue","shortname":":tongue:","category":"people","emoji_order":"113","aliases":[],"aliases_ascii":[],"keywords":["body","sexy","lip"]},"ear":{"unicode":"1f442","unicode_alternates":"","name":"ear","shortname":":ear:","category":"people","emoji_order":"114","aliases":[],"aliases_ascii":[],"keywords":["body","diversity","diversity"]},"nose":{"unicode":"1f443","unicode_alternates":"","name":"nose","shortname":":nose:","category":"people","emoji_order":"115","aliases":[],"aliases_ascii":[],"keywords":["body","diversity","diversity"]},"eye":{"unicode":"1f441","unicode_alternates":"1f441-fe0f","name":"eye","shortname":":eye:","category":"people","emoji_order":"116","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"eyes":{"unicode":"1f440","unicode_alternates":"","name":"eyes","shortname":":eyes:","category":"people","emoji_order":"117","aliases":[],"aliases_ascii":[],"keywords":["body","eyes"]},"bust_in_silhouette":{"unicode":"1f464","unicode_alternates":"","name":"bust in silhouette","shortname":":bust_in_silhouette:","category":"people","emoji_order":"118","aliases":[],"aliases_ascii":[],"keywords":["people"]},"busts_in_silhouette":{"unicode":"1f465","unicode_alternates":"","name":"busts in silhouette","shortname":":busts_in_silhouette:","category":"people","emoji_order":"119","aliases":[],"aliases_ascii":[],"keywords":["people"]},"speaking_head":{"unicode":"1f5e3","unicode_alternates":"1f5e3-fe0f","name":"speaking head in silhouette","shortname":":speaking_head:","category":"people","emoji_order":"120","aliases":[":speaking_head_in_silhouette:"],"aliases_ascii":[],"keywords":["people","talk"]},"baby":{"unicode":"1f476","unicode_alternates":"","name":"baby","shortname":":baby:","category":"people","emoji_order":"121","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity","diversity"]},"boy":{"unicode":"1f466","unicode_alternates":"","name":"boy","shortname":":boy:","category":"people","emoji_order":"122","aliases":[],"aliases_ascii":[],"keywords":["people","baby","diversity","diversity"]},"girl":{"unicode":"1f467","unicode_alternates":"","name":"girl","shortname":":girl:","category":"people","emoji_order":"123","aliases":[],"aliases_ascii":[],"keywords":["people","women","baby","diversity","diversity"]},"man":{"unicode":"1f468","unicode_alternates":"","name":"man","shortname":":man:","category":"people","emoji_order":"124","aliases":[],"aliases_ascii":[],"keywords":["people","men","sex","diversity","diversity","selfie","selfie","boys night","boys night"]},"woman":{"unicode":"1f469","unicode_alternates":"","name":"woman","shortname":":woman:","category":"people","emoji_order":"125","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","diversity","diversity","feminist","feminist","selfie","selfie","girls night","girls night"]},"person_with_blond_hair":{"unicode":"1f471","unicode_alternates":"","name":"person with blond hair","shortname":":person_with_blond_hair:","category":"people","emoji_order":"126","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity"]},"older_man":{"unicode":"1f474","unicode_alternates":"","name":"older man","shortname":":older_man:","category":"people","emoji_order":"127","aliases":[],"aliases_ascii":[],"keywords":["people","men","old people","diversity","diversity"]},"older_woman":{"unicode":"1f475","unicode_alternates":"","name":"older woman","shortname":":older_woman:","category":"people","emoji_order":"128","aliases":[":grandma:"],"aliases_ascii":[],"keywords":["people","old people","diversity","diversity"]},"man_with_gua_pi_mao":{"unicode":"1f472","unicode_alternates":"","name":"man with gua pi mao","shortname":":man_with_gua_pi_mao:","category":"people","emoji_order":"129","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity"]},"man_with_turban":{"unicode":"1f473","unicode_alternates":"","name":"man with turban","shortname":":man_with_turban:","category":"people","emoji_order":"130","aliases":[],"aliases_ascii":[],"keywords":["people","hat","diversity","diversity"]},"cop":{"unicode":"1f46e","unicode_alternates":"","name":"police officer","shortname":":cop:","category":"people","emoji_order":"131","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job","police","police","911","911"]},"construction_worker":{"unicode":"1f477","unicode_alternates":"","name":"construction worker","shortname":":construction_worker:","category":"people","emoji_order":"132","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job"]},"guardsman":{"unicode":"1f482","unicode_alternates":"","name":"guardsman","shortname":":guardsman:","category":"people","emoji_order":"133","aliases":[],"aliases_ascii":[],"keywords":["people","hat","men","diversity","diversity","job","job"]},"spy":{"unicode":"1f575","unicode_alternates":"1f575-fe0f","name":"sleuth or spy","shortname":":spy:","category":"people","emoji_order":"134","aliases":[":sleuth_or_spy:"],"aliases_ascii":[],"keywords":["people","hat","men","glasses","diversity","diversity","job","job"]},"santa":{"unicode":"1f385","unicode_alternates":"","name":"father christmas","shortname":":santa:","category":"people","emoji_order":"135","aliases":[],"aliases_ascii":[],"keywords":["people","hat","winter","holidays","christmas","diversity","diversity","santa","santa"]},"angel":{"unicode":"1f47c","unicode_alternates":"","name":"baby angel","shortname":":angel:","category":"people","emoji_order":"136","aliases":[],"aliases_ascii":[],"keywords":["people","diversity","diversity","omg","omg"]},"princess":{"unicode":"1f478","unicode_alternates":"","name":"princess","shortname":":princess:","category":"people","emoji_order":"137","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity","beautiful","beautiful","girls night","girls night"]},"bride_with_veil":{"unicode":"1f470","unicode_alternates":"","name":"bride with veil","shortname":":bride_with_veil:","category":"people","emoji_order":"138","aliases":[],"aliases_ascii":[],"keywords":["people","wedding","women","diversity","diversity"]},"walking":{"unicode":"1f6b6","unicode_alternates":"","name":"pedestrian","shortname":":walking:","category":"people","emoji_order":"139","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity"]},"runner":{"unicode":"1f3c3","unicode_alternates":"","name":"runner","shortname":":runner:","category":"people","emoji_order":"140","aliases":[],"aliases_ascii":[],"keywords":["people","men","diversity","diversity","boys night","boys night","run","run"]},"dancer":{"unicode":"1f483","unicode_alternates":"","name":"dancer","shortname":":dancer:","category":"people","emoji_order":"141","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","diversity","diversity","girls night","girls night","dance","dance"]},"dancers":{"unicode":"1f46f","unicode_alternates":"","name":"woman with bunny ears","shortname":":dancers:","category":"people","emoji_order":"142","aliases":[],"aliases_ascii":[],"keywords":["people","women","sexy","girls night","girls night","boys night","boys night","parties","parties","dance","dance"]},"couple":{"unicode":"1f46b","unicode_alternates":"","name":"man and woman holding hands","shortname":":couple:","category":"people","emoji_order":"143","aliases":[],"aliases_ascii":[],"keywords":["people","sex","creationism","creationism"]},"two_men_holding_hands":{"unicode":"1f46c","unicode_alternates":"","name":"two men holding hands","shortname":":two_men_holding_hands:","category":"people","emoji_order":"144","aliases":[],"aliases_ascii":[],"keywords":["people","gay","men","sex","lgbt","lgbt"]},"two_women_holding_hands":{"unicode":"1f46d","unicode_alternates":"","name":"two women holding hands","shortname":":two_women_holding_hands:","category":"people","emoji_order":"145","aliases":[],"aliases_ascii":[],"keywords":["people","women","sex","lgbt","lgbt","lesbian","lesbian","girls night","girls night"]},"bow":{"unicode":"1f647","unicode_alternates":"","name":"person bowing deeply","shortname":":bow:","category":"people","emoji_order":"146","aliases":[],"aliases_ascii":[],"keywords":["people","pray","pray","diversity","diversity"]},"information_desk_person":{"unicode":"1f481","unicode_alternates":"","name":"information desk person","shortname":":information_desk_person:","category":"people","emoji_order":"147","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"no_good":{"unicode":"1f645","unicode_alternates":"","name":"face with no good gesture","shortname":":no_good:","category":"people","emoji_order":"148","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity","girls night","girls night"]},"ok_woman":{"unicode":"1f646","unicode_alternates":"","name":"face with ok gesture","shortname":":ok_woman:","category":"people","emoji_order":"149","aliases":[],"aliases_ascii":["*\\0\/*","\\0\/","*\\O\/*","\\O\/"],"keywords":["people","women","diversity","diversity"]},"raising_hand":{"unicode":"1f64b","unicode_alternates":"","name":"happy person raising one hand","shortname":":raising_hand:","category":"people","emoji_order":"150","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"person_with_pouting_face":{"unicode":"1f64e","unicode_alternates":"","name":"person with pouting face","shortname":":person_with_pouting_face:","category":"people","emoji_order":"151","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"person_frowning":{"unicode":"1f64d","unicode_alternates":"","name":"person frowning","shortname":":person_frowning:","category":"people","emoji_order":"152","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"haircut":{"unicode":"1f487","unicode_alternates":"","name":"haircut","shortname":":haircut:","category":"people","emoji_order":"153","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"massage":{"unicode":"1f486","unicode_alternates":"","name":"face massage","shortname":":massage:","category":"people","emoji_order":"154","aliases":[],"aliases_ascii":[],"keywords":["people","women","diversity","diversity"]},"couple_with_heart":{"unicode":"1f491","unicode_alternates":"","name":"couple with heart","shortname":":couple_with_heart:","category":"people","emoji_order":"155","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"couple_ww":{"unicode":"1f469-2764-1f469","unicode_alternates":"1f469-200d-2764-fe0f-200d-1f469","name":"couple (woman,woman)","shortname":":couple_ww:","category":"people","emoji_order":"156","aliases":[":couple_with_heart_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt","lgbt"]},"couple_mm":{"unicode":"1f468-2764-1f468","unicode_alternates":"1f468-200d-2764-fe0f-200d-1f468","name":"couple (man,man)","shortname":":couple_mm:","category":"people","emoji_order":"157","aliases":[":couple_with_heart_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt","lgbt"]},"couplekiss":{"unicode":"1f48f","unicode_alternates":"","name":"kiss","shortname":":couplekiss:","category":"people","emoji_order":"158","aliases":[],"aliases_ascii":[],"keywords":["people","love","sex"]},"kiss_ww":{"unicode":"1f469-2764-1f48b-1f469","unicode_alternates":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","name":"kiss (woman,woman)","shortname":":kiss_ww:","category":"people","emoji_order":"159","aliases":[":couplekiss_ww:"],"aliases_ascii":[],"keywords":["people","women","love","sex","lgbt","lgbt","lesbian","lesbian"]},"kiss_mm":{"unicode":"1f468-2764-1f48b-1f468","unicode_alternates":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","name":"kiss (man,man)","shortname":":kiss_mm:","category":"people","emoji_order":"160","aliases":[":couplekiss_mm:"],"aliases_ascii":[],"keywords":["people","gay","men","love","sex","lgbt","lgbt"]},"family":{"unicode":"1f46a","unicode_alternates":"","name":"family","shortname":":family:","category":"people","emoji_order":"161","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwg":{"unicode":"1f468-1f469-1f467","unicode_alternates":"1f468-200d-1f469-200d-1f467","name":"family (man,woman,girl)","shortname":":family_mwg:","category":"people","emoji_order":"162","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgb":{"unicode":"1f468-1f469-1f467-1f466","unicode_alternates":"1f468-200d-1f469-200d-1f467-200d-1f466","name":"family (man,woman,girl,boy)","shortname":":family_mwgb:","category":"people","emoji_order":"163","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwbb":{"unicode":"1f468-1f469-1f466-1f466","unicode_alternates":"1f468-200d-1f469-200d-1f466-200d-1f466","name":"family (man,woman,boy,boy)","shortname":":family_mwbb:","category":"people","emoji_order":"164","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_mwgg":{"unicode":"1f468-1f469-1f467-1f467","unicode_alternates":"1f468-200d-1f469-200d-1f467-200d-1f467","name":"family (man,woman,girl,girl)","shortname":":family_mwgg:","category":"people","emoji_order":"165","aliases":[],"aliases_ascii":[],"keywords":["people","family","baby"]},"family_wwb":{"unicode":"1f469-1f469-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f466","name":"family (woman,woman,boy)","shortname":":family_wwb:","category":"people","emoji_order":"166","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwg":{"unicode":"1f469-1f469-1f467","unicode_alternates":"1f469-200d-1f469-200d-1f467","name":"family (woman,woman,girl)","shortname":":family_wwg:","category":"people","emoji_order":"167","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwgb":{"unicode":"1f469-1f469-1f467-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f467-200d-1f466","name":"family (woman,woman,girl,boy)","shortname":":family_wwgb:","category":"people","emoji_order":"168","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwbb":{"unicode":"1f469-1f469-1f466-1f466","unicode_alternates":"1f469-200d-1f469-200d-1f466-200d-1f466","name":"family (woman,woman,boy,boy)","shortname":":family_wwbb:","category":"people","emoji_order":"169","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_wwgg":{"unicode":"1f469-1f469-1f467-1f467","unicode_alternates":"1f469-200d-1f469-200d-1f467-200d-1f467","name":"family (woman,woman,girl,girl)","shortname":":family_wwgg:","category":"people","emoji_order":"170","aliases":[],"aliases_ascii":[],"keywords":["people","family","women","baby","lgbt","lgbt","lesbian","lesbian"]},"family_mmb":{"unicode":"1f468-1f468-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f466","name":"family (man,man,boy)","shortname":":family_mmb:","category":"people","emoji_order":"171","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmg":{"unicode":"1f468-1f468-1f467","unicode_alternates":"1f468-200d-1f468-200d-1f467","name":"family (man,man,girl)","shortname":":family_mmg:","category":"people","emoji_order":"172","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmgb":{"unicode":"1f468-1f468-1f467-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f467-200d-1f466","name":"family (man,man,girl,boy)","shortname":":family_mmgb:","category":"people","emoji_order":"173","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmbb":{"unicode":"1f468-1f468-1f466-1f466","unicode_alternates":"1f468-200d-1f468-200d-1f466-200d-1f466","name":"family (man,man,boy,boy)","shortname":":family_mmbb:","category":"people","emoji_order":"174","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"family_mmgg":{"unicode":"1f468-1f468-1f467-1f467","unicode_alternates":"1f468-200d-1f468-200d-1f467-200d-1f467","name":"family (man,man,girl,girl)","shortname":":family_mmgg:","category":"people","emoji_order":"175","aliases":[],"aliases_ascii":[],"keywords":["people","gay","family","men","baby","lgbt","lgbt"]},"womans_clothes":{"unicode":"1f45a","unicode_alternates":"","name":"womans clothes","shortname":":womans_clothes:","category":"people","emoji_order":"176","aliases":[],"aliases_ascii":[],"keywords":["women","fashion"]},"shirt":{"unicode":"1f455","unicode_alternates":"","name":"t-shirt","shortname":":shirt:","category":"people","emoji_order":"177","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"jeans":{"unicode":"1f456","unicode_alternates":"","name":"jeans","shortname":":jeans:","category":"people","emoji_order":"178","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"necktie":{"unicode":"1f454","unicode_alternates":"","name":"necktie","shortname":":necktie:","category":"people","emoji_order":"179","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"dress":{"unicode":"1f457","unicode_alternates":"","name":"dress","shortname":":dress:","category":"people","emoji_order":"180","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","girls night","girls night"]},"bikini":{"unicode":"1f459","unicode_alternates":"","name":"bikini","shortname":":bikini:","category":"people","emoji_order":"181","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","sexy","vacation","tropical","swim"]},"kimono":{"unicode":"1f458","unicode_alternates":"","name":"kimono","shortname":":kimono:","category":"people","emoji_order":"182","aliases":[],"aliases_ascii":[],"keywords":["fashion"]},"lipstick":{"unicode":"1f484","unicode_alternates":"","name":"lipstick","shortname":":lipstick:","category":"people","emoji_order":"183","aliases":[],"aliases_ascii":[],"keywords":["object","women","fashion","sexy","lip"]},"kiss":{"unicode":"1f48b","unicode_alternates":"","name":"kiss mark","shortname":":kiss:","category":"people","emoji_order":"184","aliases":[],"aliases_ascii":[],"keywords":["women","love","sexy","lip","beautiful","beautiful","girls night","girls night"]},"footprints":{"unicode":"1f463","unicode_alternates":"","name":"footprints","shortname":":footprints:","category":"people","emoji_order":"185","aliases":[],"aliases_ascii":[],"keywords":[]},"high_heel":{"unicode":"1f460","unicode_alternates":"","name":"high-heeled shoe","shortname":":high_heel:","category":"people","emoji_order":"186","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories","girls night","girls night"]},"sandal":{"unicode":"1f461","unicode_alternates":"","name":"womans sandal","shortname":":sandal:","category":"people","emoji_order":"187","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"boot":{"unicode":"1f462","unicode_alternates":"","name":"womans boots","shortname":":boot:","category":"people","emoji_order":"188","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","shoe","sexy","accessories"]},"mans_shoe":{"unicode":"1f45e","unicode_alternates":"","name":"mans shoe","shortname":":mans_shoe:","category":"people","emoji_order":"189","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories"]},"athletic_shoe":{"unicode":"1f45f","unicode_alternates":"","name":"athletic shoe","shortname":":athletic_shoe:","category":"people","emoji_order":"190","aliases":[],"aliases_ascii":[],"keywords":["fashion","shoe","accessories","boys night","boys night"]},"womans_hat":{"unicode":"1f452","unicode_alternates":"","name":"womans hat","shortname":":womans_hat:","category":"people","emoji_order":"191","aliases":[],"aliases_ascii":[],"keywords":["women","fashion","accessories"]},"tophat":{"unicode":"1f3a9","unicode_alternates":"","name":"top hat","shortname":":tophat:","category":"people","emoji_order":"192","aliases":[],"aliases_ascii":[],"keywords":["hat","fashion","accessories"]},"helmet_with_cross":{"unicode":"26d1","unicode_alternates":"26d1-fe0f","name":"helmet with white cross","shortname":":helmet_with_cross:","category":"people","emoji_order":"193","aliases":[":helmet_with_white_cross:"],"aliases_ascii":[],"keywords":["object","hat","accessories","job","job"]},"mortar_board":{"unicode":"1f393","unicode_alternates":"","name":"graduation cap","shortname":":mortar_board:","category":"people","emoji_order":"194","aliases":[],"aliases_ascii":[],"keywords":["hat","office","accessories"]},"crown":{"unicode":"1f451","unicode_alternates":"","name":"crown","shortname":":crown:","category":"people","emoji_order":"195","aliases":[],"aliases_ascii":[],"keywords":["object","gem","accessories"]},"school_satchel":{"unicode":"1f392","unicode_alternates":"","name":"school satchel","shortname":":school_satchel:","category":"people","emoji_order":"196","aliases":[],"aliases_ascii":[],"keywords":["bag","fashion","office","vacation","accessories"]},"pouch":{"unicode":"1f45d","unicode_alternates":"","name":"pouch","shortname":":pouch:","category":"people","emoji_order":"197","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories"]},"purse":{"unicode":"1f45b","unicode_alternates":"","name":"purse","shortname":":purse:","category":"people","emoji_order":"198","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","accessories","money","money"]},"handbag":{"unicode":"1f45c","unicode_alternates":"","name":"handbag","shortname":":handbag:","category":"people","emoji_order":"199","aliases":[],"aliases_ascii":[],"keywords":["bag","women","fashion","vacation","accessories"]},"briefcase":{"unicode":"1f4bc","unicode_alternates":"","name":"briefcase","shortname":":briefcase:","category":"people","emoji_order":"200","aliases":[],"aliases_ascii":[],"keywords":["bag","work","accessories","nutcase","nutcase","job","job"]},"eyeglasses":{"unicode":"1f453","unicode_alternates":"","name":"eyeglasses","shortname":":eyeglasses:","category":"people","emoji_order":"201","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"dark_sunglasses":{"unicode":"1f576","unicode_alternates":"1f576-fe0f","name":"dark sunglasses","shortname":":dark_sunglasses:","category":"people","emoji_order":"202","aliases":[],"aliases_ascii":[],"keywords":["fashion","glasses","accessories"]},"ring":{"unicode":"1f48d","unicode_alternates":"","name":"ring","shortname":":ring:","category":"people","emoji_order":"203","aliases":[],"aliases_ascii":[],"keywords":["wedding","object","fashion","gem","accessories"]},"closed_umbrella":{"unicode":"1f302","unicode_alternates":"","name":"closed umbrella","shortname":":closed_umbrella:","category":"people","emoji_order":"204","aliases":[],"aliases_ascii":[],"keywords":["object","sky","rain","accessories"]},"dog":{"unicode":"1f436","unicode_alternates":"","name":"dog face","shortname":":dog:","category":"nature","emoji_order":"205","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","pug","pug","animal","animal"]},"cat":{"unicode":"1f431","unicode_alternates":"","name":"cat face","shortname":":cat:","category":"nature","emoji_order":"206","aliases":[],"aliases_ascii":[],"keywords":["halloween","vagina","cat","cat","animal","animal"]},"mouse":{"unicode":"1f42d","unicode_alternates":"","name":"mouse face","shortname":":mouse:","category":"nature","emoji_order":"207","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"hamster":{"unicode":"1f439","unicode_alternates":"","name":"hamster face","shortname":":hamster:","category":"nature","emoji_order":"208","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rabbit":{"unicode":"1f430","unicode_alternates":"","name":"rabbit face","shortname":":rabbit:","category":"nature","emoji_order":"209","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"bear":{"unicode":"1f43b","unicode_alternates":"","name":"bear face","shortname":":bear:","category":"nature","emoji_order":"210","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"panda_face":{"unicode":"1f43c","unicode_alternates":"","name":"panda face","shortname":":panda_face:","category":"nature","emoji_order":"211","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"koala":{"unicode":"1f428","unicode_alternates":"","name":"koala","shortname":":koala:","category":"nature","emoji_order":"212","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"tiger":{"unicode":"1f42f","unicode_alternates":"","name":"tiger face","shortname":":tiger:","category":"nature","emoji_order":"213","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","cat","cat","animal","animal"]},"lion_face":{"unicode":"1f981","unicode_alternates":"","name":"lion face","shortname":":lion_face:","category":"nature","emoji_order":"214","aliases":[":lion:"],"aliases_ascii":[],"keywords":["wildlife","roar","cat","cat","animal","animal"]},"cow":{"unicode":"1f42e","unicode_alternates":"","name":"cow face","shortname":":cow:","category":"nature","emoji_order":"215","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"pig":{"unicode":"1f437","unicode_alternates":"","name":"pig face","shortname":":pig:","category":"nature","emoji_order":"216","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"pig_nose":{"unicode":"1f43d","unicode_alternates":"","name":"pig nose","shortname":":pig_nose:","category":"nature","emoji_order":"217","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"frog":{"unicode":"1f438","unicode_alternates":"","name":"frog face","shortname":":frog:","category":"nature","emoji_order":"218","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"octopus":{"unicode":"1f419","unicode_alternates":"","name":"octopus","shortname":":octopus:","category":"nature","emoji_order":"219","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"monkey_face":{"unicode":"1f435","unicode_alternates":"","name":"monkey face","shortname":":monkey_face:","category":"nature","emoji_order":"220","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"see_no_evil":{"unicode":"1f648","unicode_alternates":"","name":"see-no-evil monkey","shortname":":see_no_evil:","category":"nature","emoji_order":"221","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"hear_no_evil":{"unicode":"1f649","unicode_alternates":"","name":"hear-no-evil monkey","shortname":":hear_no_evil:","category":"nature","emoji_order":"222","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"speak_no_evil":{"unicode":"1f64a","unicode_alternates":"","name":"speak-no-evil monkey","shortname":":speak_no_evil:","category":"nature","emoji_order":"223","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"monkey":{"unicode":"1f412","unicode_alternates":"","name":"monkey","shortname":":monkey:","category":"nature","emoji_order":"224","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"chicken":{"unicode":"1f414","unicode_alternates":"","name":"chicken","shortname":":chicken:","category":"nature","emoji_order":"225","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"penguin":{"unicode":"1f427","unicode_alternates":"","name":"penguin","shortname":":penguin:","category":"nature","emoji_order":"226","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"bird":{"unicode":"1f426","unicode_alternates":"","name":"bird","shortname":":bird:","category":"nature","emoji_order":"227","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"baby_chick":{"unicode":"1f424","unicode_alternates":"","name":"baby chick","shortname":":baby_chick:","category":"nature","emoji_order":"228","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"hatching_chick":{"unicode":"1f423","unicode_alternates":"","name":"hatching chick","shortname":":hatching_chick:","category":"nature","emoji_order":"229","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"hatched_chick":{"unicode":"1f425","unicode_alternates":"","name":"front-facing baby chick","shortname":":hatched_chick:","category":"nature","emoji_order":"230","aliases":[],"aliases_ascii":[],"keywords":["animal","animal","chicken","chicken"]},"wolf":{"unicode":"1f43a","unicode_alternates":"","name":"wolf face","shortname":":wolf:","category":"nature","emoji_order":"231","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"boar":{"unicode":"1f417","unicode_alternates":"","name":"boar","shortname":":boar:","category":"nature","emoji_order":"232","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"horse":{"unicode":"1f434","unicode_alternates":"","name":"horse face","shortname":":horse:","category":"nature","emoji_order":"233","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"unicorn":{"unicode":"1f984","unicode_alternates":"","name":"unicorn face","shortname":":unicorn:","category":"nature","emoji_order":"234","aliases":[":unicorn_face:"],"aliases_ascii":[],"keywords":["animal","animal"]},"bee":{"unicode":"1f41d","unicode_alternates":"","name":"honeybee","shortname":":bee:","category":"nature","emoji_order":"235","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"bug":{"unicode":"1f41b","unicode_alternates":"","name":"bug","shortname":":bug:","category":"nature","emoji_order":"236","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"snail":{"unicode":"1f40c","unicode_alternates":"","name":"snail","shortname":":snail:","category":"nature","emoji_order":"237","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"beetle":{"unicode":"1f41e","unicode_alternates":"","name":"lady beetle","shortname":":beetle:","category":"nature","emoji_order":"238","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"ant":{"unicode":"1f41c","unicode_alternates":"","name":"ant","shortname":":ant:","category":"nature","emoji_order":"239","aliases":[],"aliases_ascii":[],"keywords":["insects","animal","animal"]},"spider":{"unicode":"1f577","unicode_alternates":"1f577-fe0f","name":"spider","shortname":":spider:","category":"nature","emoji_order":"240","aliases":[],"aliases_ascii":[],"keywords":["insects","halloween","animal","animal"]},"scorpion":{"unicode":"1f982","unicode_alternates":"","name":"scorpion","shortname":":scorpion:","category":"nature","emoji_order":"241","aliases":[],"aliases_ascii":[],"keywords":["insects","reptile","reptile","animal","animal"]},"crab":{"unicode":"1f980","unicode_alternates":"","name":"crab","shortname":":crab:","category":"nature","emoji_order":"242","aliases":[],"aliases_ascii":[],"keywords":["tropical","animal","animal"]},"snake":{"unicode":"1f40d","unicode_alternates":"","name":"snake","shortname":":snake:","category":"nature","emoji_order":"243","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal","creationism","creationism"]},"turtle":{"unicode":"1f422","unicode_alternates":"","name":"turtle","shortname":":turtle:","category":"nature","emoji_order":"244","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal"]},"tropical_fish":{"unicode":"1f420","unicode_alternates":"","name":"tropical fish","shortname":":tropical_fish:","category":"nature","emoji_order":"245","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"fish":{"unicode":"1f41f","unicode_alternates":"","name":"fish","shortname":":fish:","category":"nature","emoji_order":"246","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"blowfish":{"unicode":"1f421","unicode_alternates":"","name":"blowfish","shortname":":blowfish:","category":"nature","emoji_order":"247","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"dolphin":{"unicode":"1f42c","unicode_alternates":"","name":"dolphin","shortname":":dolphin:","category":"nature","emoji_order":"248","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","animal","animal"]},"whale":{"unicode":"1f433","unicode_alternates":"","name":"spouting whale","shortname":":whale:","category":"nature","emoji_order":"249","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","whales","animal","animal"]},"whale2":{"unicode":"1f40b","unicode_alternates":"","name":"whale","shortname":":whale2:","category":"nature","emoji_order":"250","aliases":[],"aliases_ascii":[],"keywords":["wildlife","tropical","whales","whales","animal","animal"]},"crocodile":{"unicode":"1f40a","unicode_alternates":"","name":"crocodile","shortname":":crocodile:","category":"nature","emoji_order":"251","aliases":[],"aliases_ascii":[],"keywords":["wildlife","reptile","reptile","animal","animal"]},"leopard":{"unicode":"1f406","unicode_alternates":"","name":"leopard","shortname":":leopard:","category":"nature","emoji_order":"252","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"tiger2":{"unicode":"1f405","unicode_alternates":"","name":"tiger","shortname":":tiger2:","category":"nature","emoji_order":"253","aliases":[],"aliases_ascii":[],"keywords":["wildlife","roar","animal","animal"]},"water_buffalo":{"unicode":"1f403","unicode_alternates":"","name":"water buffalo","shortname":":water_buffalo:","category":"nature","emoji_order":"254","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"ox":{"unicode":"1f402","unicode_alternates":"","name":"ox","shortname":":ox:","category":"nature","emoji_order":"255","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"cow2":{"unicode":"1f404","unicode_alternates":"","name":"cow","shortname":":cow2:","category":"nature","emoji_order":"256","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"dromedary_camel":{"unicode":"1f42a","unicode_alternates":"","name":"dromedary camel","shortname":":dromedary_camel:","category":"nature","emoji_order":"257","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"camel":{"unicode":"1f42b","unicode_alternates":"","name":"bactrian camel","shortname":":camel:","category":"nature","emoji_order":"258","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal","hump day","hump day"]},"elephant":{"unicode":"1f418","unicode_alternates":"","name":"elephant","shortname":":elephant:","category":"nature","emoji_order":"259","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"goat":{"unicode":"1f410","unicode_alternates":"","name":"goat","shortname":":goat:","category":"nature","emoji_order":"260","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"ram":{"unicode":"1f40f","unicode_alternates":"","name":"ram","shortname":":ram:","category":"nature","emoji_order":"261","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"sheep":{"unicode":"1f411","unicode_alternates":"","name":"sheep","shortname":":sheep:","category":"nature","emoji_order":"262","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"racehorse":{"unicode":"1f40e","unicode_alternates":"","name":"horse","shortname":":racehorse:","category":"nature","emoji_order":"263","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"pig2":{"unicode":"1f416","unicode_alternates":"","name":"pig","shortname":":pig2:","category":"nature","emoji_order":"264","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rat":{"unicode":"1f400","unicode_alternates":"","name":"rat","shortname":":rat:","category":"nature","emoji_order":"265","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"mouse2":{"unicode":"1f401","unicode_alternates":"","name":"mouse","shortname":":mouse2:","category":"nature","emoji_order":"266","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"rooster":{"unicode":"1f413","unicode_alternates":"","name":"rooster","shortname":":rooster:","category":"nature","emoji_order":"267","aliases":[],"aliases_ascii":[],"keywords":["animal","animal"]},"turkey":{"unicode":"1f983","unicode_alternates":"","name":"turkey","shortname":":turkey:","category":"nature","emoji_order":"268","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"dove":{"unicode":"1f54a","unicode_alternates":"1f54a-fe0f","name":"dove of peace","shortname":":dove:","category":"nature","emoji_order":"269","aliases":[":dove_of_peace:"],"aliases_ascii":[],"keywords":["animal","animal"]},"dog2":{"unicode":"1f415","unicode_alternates":"","name":"dog","shortname":":dog2:","category":"nature","emoji_order":"270","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","pug","pug","animal","animal"]},"poodle":{"unicode":"1f429","unicode_alternates":"","name":"poodle","shortname":":poodle:","category":"nature","emoji_order":"271","aliases":[],"aliases_ascii":[],"keywords":["dog","dog","animal","animal"]},"cat2":{"unicode":"1f408","unicode_alternates":"","name":"cat","shortname":":cat2:","category":"nature","emoji_order":"272","aliases":[],"aliases_ascii":[],"keywords":["halloween","cat","cat","animal","animal"]},"rabbit2":{"unicode":"1f407","unicode_alternates":"","name":"rabbit","shortname":":rabbit2:","category":"nature","emoji_order":"273","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"chipmunk":{"unicode":"1f43f","unicode_alternates":"1f43f-fe0f","name":"chipmunk","shortname":":chipmunk:","category":"nature","emoji_order":"274","aliases":[],"aliases_ascii":[],"keywords":["wildlife","animal","animal"]},"feet":{"unicode":"1f43e","unicode_alternates":"","name":"paw prints","shortname":":feet:","category":"nature","emoji_order":"275","aliases":[":paw_prints:"],"aliases_ascii":[],"keywords":["animal","animal"]},"dragon":{"unicode":"1f409","unicode_alternates":"","name":"dragon","shortname":":dragon:","category":"nature","emoji_order":"276","aliases":[],"aliases_ascii":[],"keywords":["roar","reptile","reptile","animal","animal"]},"dragon_face":{"unicode":"1f432","unicode_alternates":"","name":"dragon face","shortname":":dragon_face:","category":"nature","emoji_order":"277","aliases":[],"aliases_ascii":[],"keywords":["roar","monster","reptile","reptile","animal","animal"]},"cactus":{"unicode":"1f335","unicode_alternates":"","name":"cactus","shortname":":cactus:","category":"nature","emoji_order":"278","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees","trees"]},"christmas_tree":{"unicode":"1f384","unicode_alternates":"","name":"christmas tree","shortname":":christmas_tree:","category":"nature","emoji_order":"279","aliases":[],"aliases_ascii":[],"keywords":["plant","holidays","christmas","trees","trees"]},"evergreen_tree":{"unicode":"1f332","unicode_alternates":"","name":"evergreen tree","shortname":":evergreen_tree:","category":"nature","emoji_order":"280","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","holidays","christmas","camp","trees","trees"]},"deciduous_tree":{"unicode":"1f333","unicode_alternates":"","name":"deciduous tree","shortname":":deciduous_tree:","category":"nature","emoji_order":"281","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","camp","trees","trees"]},"palm_tree":{"unicode":"1f334","unicode_alternates":"","name":"palm tree","shortname":":palm_tree:","category":"nature","emoji_order":"282","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","tropical","trees","trees"]},"seedling":{"unicode":"1f331","unicode_alternates":"","name":"seedling","shortname":":seedling:","category":"nature","emoji_order":"283","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"herb":{"unicode":"1f33f","unicode_alternates":"","name":"herb","shortname":":herb:","category":"nature","emoji_order":"284","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"shamrock":{"unicode":"2618","unicode_alternates":"2618-fe0f","name":"shamrock","shortname":":shamrock:","category":"nature","emoji_order":"285","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf","leaf"]},"four_leaf_clover":{"unicode":"1f340","unicode_alternates":"","name":"four leaf clover","shortname":":four_leaf_clover:","category":"nature","emoji_order":"286","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","luck","leaf","leaf","sol","sol"]},"bamboo":{"unicode":"1f38d","unicode_alternates":"","name":"pine decoration","shortname":":bamboo:","category":"nature","emoji_order":"287","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"tanabata_tree":{"unicode":"1f38b","unicode_alternates":"","name":"tanabata tree","shortname":":tanabata_tree:","category":"nature","emoji_order":"288","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","trees","trees"]},"leaves":{"unicode":"1f343","unicode_alternates":"","name":"leaf fluttering in wind","shortname":":leaves:","category":"nature","emoji_order":"289","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"fallen_leaf":{"unicode":"1f342","unicode_alternates":"","name":"fallen leaf","shortname":":fallen_leaf:","category":"nature","emoji_order":"290","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"maple_leaf":{"unicode":"1f341","unicode_alternates":"","name":"maple leaf","shortname":":maple_leaf:","category":"nature","emoji_order":"291","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"ear_of_rice":{"unicode":"1f33e","unicode_alternates":"","name":"ear of rice","shortname":":ear_of_rice:","category":"nature","emoji_order":"292","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","leaf","leaf"]},"hibiscus":{"unicode":"1f33a","unicode_alternates":"","name":"hibiscus","shortname":":hibiscus:","category":"nature","emoji_order":"293","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"sunflower":{"unicode":"1f33b","unicode_alternates":"","name":"sunflower","shortname":":sunflower:","category":"nature","emoji_order":"294","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"rose":{"unicode":"1f339","unicode_alternates":"","name":"rose","shortname":":rose:","category":"nature","emoji_order":"295","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","rip","condolence","condolence","beautiful","beautiful"]},"tulip":{"unicode":"1f337","unicode_alternates":"","name":"tulip","shortname":":tulip:","category":"nature","emoji_order":"296","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","vagina","girls night","girls night"]},"blossom":{"unicode":"1f33c","unicode_alternates":"","name":"blossom","shortname":":blossom:","category":"nature","emoji_order":"297","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant"]},"cherry_blossom":{"unicode":"1f338","unicode_alternates":"","name":"cherry blossom","shortname":":cherry_blossom:","category":"nature","emoji_order":"298","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","tropical"]},"bouquet":{"unicode":"1f490","unicode_alternates":"","name":"bouquet","shortname":":bouquet:","category":"nature","emoji_order":"299","aliases":[],"aliases_ascii":[],"keywords":["nature","flower","plant","rip","rip","condolence","condolence"]},"mushroom":{"unicode":"1f344","unicode_alternates":"","name":"mushroom","shortname":":mushroom:","category":"nature","emoji_order":"300","aliases":[],"aliases_ascii":[],"keywords":["nature","plant","drugs","drugs"]},"chestnut":{"unicode":"1f330","unicode_alternates":"","name":"chestnut","shortname":":chestnut:","category":"nature","emoji_order":"301","aliases":[],"aliases_ascii":[],"keywords":["nature","plant"]},"jack_o_lantern":{"unicode":"1f383","unicode_alternates":"","name":"jack-o-lantern","shortname":":jack_o_lantern:","category":"nature","emoji_order":"302","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween"]},"shell":{"unicode":"1f41a","unicode_alternates":"","name":"spiral shell","shortname":":shell:","category":"nature","emoji_order":"303","aliases":[],"aliases_ascii":[],"keywords":[]},"spider_web":{"unicode":"1f578","unicode_alternates":"1f578-fe0f","name":"spider web","shortname":":spider_web:","category":"nature","emoji_order":"304","aliases":[],"aliases_ascii":[],"keywords":["halloween"]},"earth_americas":{"unicode":"1f30e","unicode_alternates":"","name":"earth globe americas","shortname":":earth_americas:","category":"nature","emoji_order":"305","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"earth_africa":{"unicode":"1f30d","unicode_alternates":"","name":"earth globe europe-africa","shortname":":earth_africa:","category":"nature","emoji_order":"306","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"earth_asia":{"unicode":"1f30f","unicode_alternates":"","name":"earth globe asia-australia","shortname":":earth_asia:","category":"nature","emoji_order":"307","aliases":[],"aliases_ascii":[],"keywords":["map","vacation","globe","globe"]},"full_moon":{"unicode":"1f315","unicode_alternates":"","name":"full moon symbol","shortname":":full_moon:","category":"nature","emoji_order":"308","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waning_gibbous_moon":{"unicode":"1f316","unicode_alternates":"","name":"waning gibbous moon symbol","shortname":":waning_gibbous_moon:","category":"nature","emoji_order":"309","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"last_quarter_moon":{"unicode":"1f317","unicode_alternates":"","name":"last quarter moon symbol","shortname":":last_quarter_moon:","category":"nature","emoji_order":"310","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waning_crescent_moon":{"unicode":"1f318","unicode_alternates":"","name":"waning crescent moon symbol","shortname":":waning_crescent_moon:","category":"nature","emoji_order":"311","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"new_moon":{"unicode":"1f311","unicode_alternates":"","name":"new moon symbol","shortname":":new_moon:","category":"nature","emoji_order":"312","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waxing_crescent_moon":{"unicode":"1f312","unicode_alternates":"","name":"waxing crescent moon symbol","shortname":":waxing_crescent_moon:","category":"nature","emoji_order":"313","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"first_quarter_moon":{"unicode":"1f313","unicode_alternates":"","name":"first quarter moon symbol","shortname":":first_quarter_moon:","category":"nature","emoji_order":"314","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"waxing_gibbous_moon":{"unicode":"1f314","unicode_alternates":"","name":"waxing gibbous moon symbol","shortname":":waxing_gibbous_moon:","category":"nature","emoji_order":"315","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"new_moon_with_face":{"unicode":"1f31a","unicode_alternates":"","name":"new moon with face","shortname":":new_moon_with_face:","category":"nature","emoji_order":"316","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"full_moon_with_face":{"unicode":"1f31d","unicode_alternates":"","name":"full moon with face","shortname":":full_moon_with_face:","category":"nature","emoji_order":"317","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"first_quarter_moon_with_face":{"unicode":"1f31b","unicode_alternates":"","name":"first quarter moon with face","shortname":":first_quarter_moon_with_face:","category":"nature","emoji_order":"318","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"last_quarter_moon_with_face":{"unicode":"1f31c","unicode_alternates":"","name":"last quarter moon with face","shortname":":last_quarter_moon_with_face:","category":"nature","emoji_order":"319","aliases":[],"aliases_ascii":[],"keywords":["space","sky","moon","moon"]},"sun_with_face":{"unicode":"1f31e","unicode_alternates":"","name":"sun with face","shortname":":sun_with_face:","category":"nature","emoji_order":"320","aliases":[],"aliases_ascii":[],"keywords":["sky","day","sun","hump day","hump day","morning","morning"]},"crescent_moon":{"unicode":"1f319","unicode_alternates":"","name":"crescent moon","shortname":":crescent_moon:","category":"nature","emoji_order":"321","aliases":[],"aliases_ascii":[],"keywords":["space","sky","goodnight","goodnight","moon","moon"]},"star":{"unicode":"2b50","unicode_alternates":"2b50-fe0f","name":"white medium star","shortname":":star:","category":"nature","emoji_order":"322","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"star2":{"unicode":"1f31f","unicode_alternates":"","name":"glowing star","shortname":":star2:","category":"nature","emoji_order":"323","aliases":[],"aliases_ascii":[],"keywords":["space","sky","star"]},"dizzy":{"unicode":"1f4ab","unicode_alternates":"","name":"dizzy symbol","shortname":":dizzy:","category":"nature","emoji_order":"324","aliases":[],"aliases_ascii":[],"keywords":["star","symbol"]},"sparkles":{"unicode":"2728","unicode_alternates":"","name":"sparkles","shortname":":sparkles:","category":"nature","emoji_order":"325","aliases":[],"aliases_ascii":[],"keywords":["star","girls night","girls night"]},"comet":{"unicode":"2604","unicode_alternates":"2604-fe0f","name":"comet","shortname":":comet:","category":"nature","emoji_order":"326","aliases":[],"aliases_ascii":[],"keywords":["space","sky"]},"sunny":{"unicode":"2600","unicode_alternates":"2600-fe0f","name":"black sun with rays","shortname":":sunny:","category":"nature","emoji_order":"327","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","day","sun","hot","hot","morning","morning"]},"white_sun_small_cloud":{"unicode":"1f324","unicode_alternates":"1f324-fe0f","name":"white sun with small cloud","shortname":":white_sun_small_cloud:","category":"nature","emoji_order":"328","aliases":[":white_sun_with_small_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"partly_sunny":{"unicode":"26c5","unicode_alternates":"26c5-fe0f","name":"sun behind cloud","shortname":":partly_sunny:","category":"nature","emoji_order":"329","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","sun"]},"white_sun_cloud":{"unicode":"1f325","unicode_alternates":"1f325-fe0f","name":"white sun behind cloud","shortname":":white_sun_cloud:","category":"nature","emoji_order":"330","aliases":[":white_sun_behind_cloud:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","sun"]},"white_sun_rain_cloud":{"unicode":"1f326","unicode_alternates":"1f326-fe0f","name":"white sun behind cloud with rain","shortname":":white_sun_rain_cloud:","category":"nature","emoji_order":"331","aliases":[":white_sun_behind_cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain","sun"]},"cloud":{"unicode":"2601","unicode_alternates":"2601-fe0f","name":"cloud","shortname":":cloud:","category":"nature","emoji_order":"332","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"cloud_rain":{"unicode":"1f327","unicode_alternates":"1f327-fe0f","name":"cloud with rain","shortname":":cloud_rain:","category":"nature","emoji_order":"333","aliases":[":cloud_with_rain:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","rain"]},"thunder_cloud_rain":{"unicode":"26c8","unicode_alternates":"26c8-fe0f","name":"thunder cloud and rain","shortname":":thunder_cloud_rain:","category":"nature","emoji_order":"334","aliases":[":thunder_cloud_and_rain:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"cloud_lightning":{"unicode":"1f329","unicode_alternates":"1f329-fe0f","name":"cloud with lightning","shortname":":cloud_lightning:","category":"nature","emoji_order":"335","aliases":[":cloud_with_lightning:"],"aliases_ascii":[],"keywords":["weather","sky","cloud","cold","rain"]},"zap":{"unicode":"26a1","unicode_alternates":"26a1-fe0f","name":"high voltage sign","shortname":":zap:","category":"nature","emoji_order":"336","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","diarrhea","diarrhea"]},"fire":{"unicode":"1f525","unicode_alternates":"","name":"fire","shortname":":fire:","category":"nature","emoji_order":"337","aliases":[":flame:"],"aliases_ascii":[],"keywords":["wth","wth","hot","hot"]},"boom":{"unicode":"1f4a5","unicode_alternates":"","name":"collision symbol","shortname":":boom:","category":"nature","emoji_order":"338","aliases":[],"aliases_ascii":[],"keywords":["symbol","blast","blast"]},"snowflake":{"unicode":"2744","unicode_alternates":"2744-fe0f","name":"snowflake","shortname":":snowflake:","category":"nature","emoji_order":"339","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","sky","holidays","cold","snow","snow"]},"cloud_snow":{"unicode":"1f328","unicode_alternates":"1f328-fe0f","name":"cloud with snow","shortname":":cloud_snow:","category":"nature","emoji_order":"340","aliases":[":cloud_with_snow:"],"aliases_ascii":[],"keywords":["weather","winter","sky","cloud","cold","snow","snow"]},"snowman2":{"unicode":"2603","unicode_alternates":"2603-fe0f","name":"snowman","shortname":":snowman2:","category":"nature","emoji_order":"341","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","christmas","cold","snow","snow"]},"snowman":{"unicode":"26c4","unicode_alternates":"26c4-fe0f","name":"snowman without snow","shortname":":snowman:","category":"nature","emoji_order":"342","aliases":[],"aliases_ascii":[],"keywords":["weather","winter","holidays","cold","snow","snow"]},"wind_blowing_face":{"unicode":"1f32c","unicode_alternates":"1f32c-fe0f","name":"wind blowing face","shortname":":wind_blowing_face:","category":"nature","emoji_order":"343","aliases":[],"aliases_ascii":[],"keywords":["weather","cold"]},"dash":{"unicode":"1f4a8","unicode_alternates":"","name":"dash symbol","shortname":":dash:","category":"nature","emoji_order":"344","aliases":[],"aliases_ascii":[],"keywords":["cloud","cold","smoking","smoking"]},"cloud_tornado":{"unicode":"1f32a","unicode_alternates":"1f32a-fe0f","name":"cloud with tornado","shortname":":cloud_tornado:","category":"nature","emoji_order":"345","aliases":[":cloud_with_tornado:"],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"fog":{"unicode":"1f32b","unicode_alternates":"1f32b-fe0f","name":"fog","shortname":":fog:","category":"nature","emoji_order":"346","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold"]},"umbrella2":{"unicode":"2602","unicode_alternates":"2602-fe0f","name":"umbrella","shortname":":umbrella2:","category":"nature","emoji_order":"347","aliases":[],"aliases_ascii":[],"keywords":["weather","object","sky","cold"]},"umbrella":{"unicode":"2614","unicode_alternates":"2614-fe0f","name":"umbrella with rain drops","shortname":":umbrella:","category":"nature","emoji_order":"348","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","cold","rain"]},"droplet":{"unicode":"1f4a7","unicode_alternates":"","name":"droplet","shortname":":droplet:","category":"nature","emoji_order":"349","aliases":[],"aliases_ascii":[],"keywords":["weather","sky","rain"]},"sweat_drops":{"unicode":"1f4a6","unicode_alternates":"","name":"splashing sweat symbol","shortname":":sweat_drops:","category":"nature","emoji_order":"350","aliases":[],"aliases_ascii":[],"keywords":["rain","stressed","sweat"]},"ocean":{"unicode":"1f30a","unicode_alternates":"","name":"water wave","shortname":":ocean:","category":"nature","emoji_order":"351","aliases":[],"aliases_ascii":[],"keywords":["weather","boat","tropical","swim"]},"green_apple":{"unicode":"1f34f","unicode_alternates":"","name":"green apple","shortname":":green_apple:","category":"food","emoji_order":"352","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"apple":{"unicode":"1f34e","unicode_alternates":"","name":"red apple","shortname":":apple:","category":"food","emoji_order":"353","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","creationism","creationism"]},"pear":{"unicode":"1f350","unicode_alternates":"","name":"pear","shortname":":pear:","category":"food","emoji_order":"354","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"tangerine":{"unicode":"1f34a","unicode_alternates":"","name":"tangerine","shortname":":tangerine:","category":"food","emoji_order":"355","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"lemon":{"unicode":"1f34b","unicode_alternates":"","name":"lemon","shortname":":lemon:","category":"food","emoji_order":"356","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"banana":{"unicode":"1f34c","unicode_alternates":"","name":"banana","shortname":":banana:","category":"food","emoji_order":"357","aliases":[],"aliases_ascii":[],"keywords":["fruit","penis","food"]},"watermelon":{"unicode":"1f349","unicode_alternates":"","name":"watermelon","shortname":":watermelon:","category":"food","emoji_order":"358","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"grapes":{"unicode":"1f347","unicode_alternates":"","name":"grapes","shortname":":grapes:","category":"food","emoji_order":"359","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"strawberry":{"unicode":"1f353","unicode_alternates":"","name":"strawberry","shortname":":strawberry:","category":"food","emoji_order":"360","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"melon":{"unicode":"1f348","unicode_alternates":"","name":"melon","shortname":":melon:","category":"food","emoji_order":"361","aliases":[],"aliases_ascii":[],"keywords":["fruit","boobs","food"]},"cherries":{"unicode":"1f352","unicode_alternates":"","name":"cherries","shortname":":cherries:","category":"food","emoji_order":"362","aliases":[],"aliases_ascii":[],"keywords":["fruit","food"]},"peach":{"unicode":"1f351","unicode_alternates":"","name":"peach","shortname":":peach:","category":"food","emoji_order":"363","aliases":[],"aliases_ascii":[],"keywords":["fruit","butt","food"]},"pineapple":{"unicode":"1f34d","unicode_alternates":"","name":"pineapple","shortname":":pineapple:","category":"food","emoji_order":"364","aliases":[],"aliases_ascii":[],"keywords":["fruit","food","tropical"]},"tomato":{"unicode":"1f345","unicode_alternates":"","name":"tomato","shortname":":tomato:","category":"food","emoji_order":"365","aliases":[],"aliases_ascii":[],"keywords":["fruit","vegetables","food"]},"eggplant":{"unicode":"1f346","unicode_alternates":"","name":"aubergine","shortname":":eggplant:","category":"food","emoji_order":"366","aliases":[],"aliases_ascii":[],"keywords":["vegetables","penis","food"]},"hot_pepper":{"unicode":"1f336","unicode_alternates":"1f336-fe0f","name":"hot pepper","shortname":":hot_pepper:","category":"food","emoji_order":"367","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"corn":{"unicode":"1f33d","unicode_alternates":"","name":"ear of maize","shortname":":corn:","category":"food","emoji_order":"368","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"sweet_potato":{"unicode":"1f360","unicode_alternates":"","name":"roasted sweet potato","shortname":":sweet_potato:","category":"food","emoji_order":"369","aliases":[],"aliases_ascii":[],"keywords":["vegetables","food"]},"honey_pot":{"unicode":"1f36f","unicode_alternates":"","name":"honey pot","shortname":":honey_pot:","category":"food","emoji_order":"370","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"bread":{"unicode":"1f35e","unicode_alternates":"","name":"bread","shortname":":bread:","category":"food","emoji_order":"371","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cheese":{"unicode":"1f9c0","unicode_alternates":"","name":"cheese wedge","shortname":":cheese:","category":"food","emoji_order":"372","aliases":[":cheese_wedge:"],"aliases_ascii":[],"keywords":["food"]},"poultry_leg":{"unicode":"1f357","unicode_alternates":"","name":"poultry leg","shortname":":poultry_leg:","category":"food","emoji_order":"373","aliases":[],"aliases_ascii":[],"keywords":["food","holidays"]},"meat_on_bone":{"unicode":"1f356","unicode_alternates":"","name":"meat on bone","shortname":":meat_on_bone:","category":"food","emoji_order":"374","aliases":[],"aliases_ascii":[],"keywords":["food"]},"fried_shrimp":{"unicode":"1f364","unicode_alternates":"","name":"fried shrimp","shortname":":fried_shrimp:","category":"food","emoji_order":"375","aliases":[],"aliases_ascii":[],"keywords":["food"]},"egg":{"unicode":"1f373","unicode_alternates":"","name":"cooking","shortname":":egg:","category":"food","emoji_order":"376","aliases":[],"aliases_ascii":[],"keywords":["food"]},"hamburger":{"unicode":"1f354","unicode_alternates":"","name":"hamburger","shortname":":hamburger:","category":"food","emoji_order":"377","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"fries":{"unicode":"1f35f","unicode_alternates":"","name":"french fries","shortname":":fries:","category":"food","emoji_order":"378","aliases":[],"aliases_ascii":[],"keywords":["america","food"]},"hotdog":{"unicode":"1f32d","unicode_alternates":"","name":"hot dog","shortname":":hotdog:","category":"food","emoji_order":"379","aliases":[":hot_dog:"],"aliases_ascii":[],"keywords":["america","food"]},"pizza":{"unicode":"1f355","unicode_alternates":"","name":"slice of pizza","shortname":":pizza:","category":"food","emoji_order":"380","aliases":[],"aliases_ascii":[],"keywords":["italian","food","boys night","boys night"]},"spaghetti":{"unicode":"1f35d","unicode_alternates":"","name":"spaghetti","shortname":":spaghetti:","category":"food","emoji_order":"381","aliases":[],"aliases_ascii":[],"keywords":["noodles","pasta","italian","food"]},"taco":{"unicode":"1f32e","unicode_alternates":"","name":"taco","shortname":":taco:","category":"food","emoji_order":"382","aliases":[],"aliases_ascii":[],"keywords":["food","mexican","vagina"]},"burrito":{"unicode":"1f32f","unicode_alternates":"","name":"burrito","shortname":":burrito:","category":"food","emoji_order":"383","aliases":[],"aliases_ascii":[],"keywords":["food","mexican"]},"ramen":{"unicode":"1f35c","unicode_alternates":"","name":"steaming bowl","shortname":":ramen:","category":"food","emoji_order":"384","aliases":[],"aliases_ascii":[],"keywords":["noodles","ramen","japan","food"]},"stew":{"unicode":"1f372","unicode_alternates":"","name":"pot of food","shortname":":stew:","category":"food","emoji_order":"385","aliases":[],"aliases_ascii":[],"keywords":["food","steam","steam"]},"fish_cake":{"unicode":"1f365","unicode_alternates":"","name":"fish cake with swirl design","shortname":":fish_cake:","category":"food","emoji_order":"386","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"sushi":{"unicode":"1f363","unicode_alternates":"","name":"sushi","shortname":":sushi:","category":"food","emoji_order":"387","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"bento":{"unicode":"1f371","unicode_alternates":"","name":"bento box","shortname":":bento:","category":"food","emoji_order":"388","aliases":[],"aliases_ascii":[],"keywords":["object","sushi","japan","food"]},"curry":{"unicode":"1f35b","unicode_alternates":"","name":"curry and rice","shortname":":curry:","category":"food","emoji_order":"389","aliases":[],"aliases_ascii":[],"keywords":["food"]},"rice_ball":{"unicode":"1f359","unicode_alternates":"","name":"rice ball","shortname":":rice_ball:","category":"food","emoji_order":"390","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"rice":{"unicode":"1f35a","unicode_alternates":"","name":"cooked rice","shortname":":rice:","category":"food","emoji_order":"391","aliases":[],"aliases_ascii":[],"keywords":["sushi","japan","food"]},"rice_cracker":{"unicode":"1f358","unicode_alternates":"","name":"rice cracker","shortname":":rice_cracker:","category":"food","emoji_order":"392","aliases":[],"aliases_ascii":[],"keywords":["sushi","food"]},"oden":{"unicode":"1f362","unicode_alternates":"","name":"oden","shortname":":oden:","category":"food","emoji_order":"393","aliases":[],"aliases_ascii":[],"keywords":["food"]},"dango":{"unicode":"1f361","unicode_alternates":"","name":"dango","shortname":":dango:","category":"food","emoji_order":"394","aliases":[],"aliases_ascii":[],"keywords":["food"]},"shaved_ice":{"unicode":"1f367","unicode_alternates":"","name":"shaved ice","shortname":":shaved_ice:","category":"food","emoji_order":"395","aliases":[],"aliases_ascii":[],"keywords":["food"]},"ice_cream":{"unicode":"1f368","unicode_alternates":"","name":"ice cream","shortname":":ice_cream:","category":"food","emoji_order":"396","aliases":[],"aliases_ascii":[],"keywords":["food"]},"icecream":{"unicode":"1f366","unicode_alternates":"","name":"soft ice cream","shortname":":icecream:","category":"food","emoji_order":"397","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cake":{"unicode":"1f370","unicode_alternates":"","name":"shortcake","shortname":":cake:","category":"food","emoji_order":"398","aliases":[],"aliases_ascii":[],"keywords":["food"]},"birthday":{"unicode":"1f382","unicode_alternates":"","name":"birthday cake","shortname":":birthday:","category":"food","emoji_order":"399","aliases":[],"aliases_ascii":[],"keywords":["birthday","food","parties","parties"]},"custard":{"unicode":"1f36e","unicode_alternates":"","name":"custard","shortname":":custard:","category":"food","emoji_order":"400","aliases":[":pudding:",":flan:"],"aliases_ascii":[],"keywords":["food"]},"candy":{"unicode":"1f36c","unicode_alternates":"","name":"candy","shortname":":candy:","category":"food","emoji_order":"401","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"lollipop":{"unicode":"1f36d","unicode_alternates":"","name":"lollipop","shortname":":lollipop:","category":"food","emoji_order":"402","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"chocolate_bar":{"unicode":"1f36b","unicode_alternates":"","name":"chocolate bar","shortname":":chocolate_bar:","category":"food","emoji_order":"403","aliases":[],"aliases_ascii":[],"keywords":["food","halloween"]},"popcorn":{"unicode":"1f37f","unicode_alternates":"","name":"popcorn","shortname":":popcorn:","category":"food","emoji_order":"404","aliases":[],"aliases_ascii":[],"keywords":["food","parties","parties"]},"doughnut":{"unicode":"1f369","unicode_alternates":"","name":"doughnut","shortname":":doughnut:","category":"food","emoji_order":"405","aliases":[],"aliases_ascii":[],"keywords":["food"]},"cookie":{"unicode":"1f36a","unicode_alternates":"","name":"cookie","shortname":":cookie:","category":"food","emoji_order":"406","aliases":[],"aliases_ascii":[],"keywords":["food","vagina"]},"beer":{"unicode":"1f37a","unicode_alternates":"","name":"beer mug","shortname":":beer:","category":"food","emoji_order":"407","aliases":[],"aliases_ascii":[],"keywords":["drink","beer","alcohol","parties","parties"]},"beers":{"unicode":"1f37b","unicode_alternates":"","name":"clinking beer mugs","shortname":":beers:","category":"food","emoji_order":"408","aliases":[],"aliases_ascii":[],"keywords":["drink","cheers","beer","alcohol","thank you","boys night","boys night","parties","parties"]},"wine_glass":{"unicode":"1f377","unicode_alternates":"","name":"wine glass","shortname":":wine_glass:","category":"food","emoji_order":"409","aliases":[],"aliases_ascii":[],"keywords":["drink","italian","alcohol","girls night","girls night","parties","parties"]},"cocktail":{"unicode":"1f378","unicode_alternates":"","name":"cocktail glass","shortname":":cocktail:","category":"food","emoji_order":"410","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","alcohol","girls night","girls night","parties","parties"]},"tropical_drink":{"unicode":"1f379","unicode_alternates":"","name":"tropical drink","shortname":":tropical_drink:","category":"food","emoji_order":"411","aliases":[],"aliases_ascii":[],"keywords":["drink","cocktail","tropical","alcohol"]},"champagne":{"unicode":"1f37e","unicode_alternates":"","name":"bottle with popping cork","shortname":":champagne:","category":"food","emoji_order":"412","aliases":[":bottle_with_popping_cork:"],"aliases_ascii":[],"keywords":["drink","cheers","alcohol","parties","parties"]},"sake":{"unicode":"1f376","unicode_alternates":"","name":"sake bottle and cup","shortname":":sake:","category":"food","emoji_order":"413","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","sake","alcohol","girls night","girls night"]},"tea":{"unicode":"1f375","unicode_alternates":"","name":"teacup without handle","shortname":":tea:","category":"food","emoji_order":"414","aliases":[],"aliases_ascii":[],"keywords":["drink","japan","caffeine","steam","steam","morning","morning"]},"coffee":{"unicode":"2615","unicode_alternates":"2615-fe0f","name":"hot beverage","shortname":":coffee:","category":"food","emoji_order":"415","aliases":[],"aliases_ascii":[],"keywords":["drink","caffeine","steam","steam","morning","morning"]},"baby_bottle":{"unicode":"1f37c","unicode_alternates":"","name":"baby bottle","shortname":":baby_bottle:","category":"food","emoji_order":"416","aliases":[],"aliases_ascii":[],"keywords":["drink","object","food","baby"]},"fork_and_knife":{"unicode":"1f374","unicode_alternates":"","name":"fork and knife","shortname":":fork_and_knife:","category":"food","emoji_order":"417","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","food"]},"fork_knife_plate":{"unicode":"1f37d","unicode_alternates":"1f37d-fe0f","name":"fork and knife with plate","shortname":":fork_knife_plate:","category":"food","emoji_order":"418","aliases":[":fork_and_knife_with_plate:"],"aliases_ascii":[],"keywords":["object","food"]},"soccer":{"unicode":"26bd","unicode_alternates":"26bd-fe0f","name":"soccer ball","shortname":":soccer:","category":"activity","emoji_order":"419","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","soccer","football"]},"basketball":{"unicode":"1f3c0","unicode_alternates":"","name":"basketball and hoop","shortname":":basketball:","category":"activity","emoji_order":"420","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","basketball"]},"football":{"unicode":"1f3c8","unicode_alternates":"","name":"american football","shortname":":football:","category":"activity","emoji_order":"421","aliases":[],"aliases_ascii":[],"keywords":["america","game","ball","sport","football"]},"baseball":{"unicode":"26be","unicode_alternates":"26be-fe0f","name":"baseball","shortname":":baseball:","category":"activity","emoji_order":"422","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","baseball"]},"tennis":{"unicode":"1f3be","unicode_alternates":"","name":"tennis racquet and ball","shortname":":tennis:","category":"activity","emoji_order":"423","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","tennis"]},"volleyball":{"unicode":"1f3d0","unicode_alternates":"","name":"volleyball","shortname":":volleyball:","category":"activity","emoji_order":"424","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","volleyball"]},"rugby_football":{"unicode":"1f3c9","unicode_alternates":"","name":"rugby football","shortname":":rugby_football:","category":"activity","emoji_order":"425","aliases":[],"aliases_ascii":[],"keywords":["game","sport","football"]},"8ball":{"unicode":"1f3b1","unicode_alternates":"","name":"billiards","shortname":":8ball:","category":"activity","emoji_order":"426","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","billiards","luck","boys night","boys night"]},"golf":{"unicode":"26f3","unicode_alternates":"26f3-fe0f","name":"flag in hole","shortname":":golf:","category":"activity","emoji_order":"427","aliases":[],"aliases_ascii":[],"keywords":["game","ball","vacation","sport","golf","golf"]},"golfer":{"unicode":"1f3cc","unicode_alternates":"1f3cc-fe0f","name":"golfer","shortname":":golfer:","category":"activity","emoji_order":"428","aliases":[],"aliases_ascii":[],"keywords":["men","game","ball","vacation","sport","golf","golf"]},"ping_pong":{"unicode":"1f3d3","unicode_alternates":"","name":"table tennis paddle and ball","shortname":":ping_pong:","category":"activity","emoji_order":"429","aliases":[":table_tennis:"],"aliases_ascii":[],"keywords":["game","ball","sport","ping pong"]},"badminton":{"unicode":"1f3f8","unicode_alternates":"","name":"badminton racquet","shortname":":badminton:","category":"activity","emoji_order":"430","aliases":[],"aliases_ascii":[],"keywords":["game","sport","badminton"]},"hockey":{"unicode":"1f3d2","unicode_alternates":"","name":"ice hockey stick and puck","shortname":":hockey:","category":"activity","emoji_order":"431","aliases":[],"aliases_ascii":[],"keywords":["game","sport","hockey"]},"field_hockey":{"unicode":"1f3d1","unicode_alternates":"","name":"field hockey stick and ball","shortname":":field_hockey:","category":"activity","emoji_order":"432","aliases":[],"aliases_ascii":[],"keywords":["ball","sport","hockey"]},"cricket":{"unicode":"1f3cf","unicode_alternates":"","name":"cricket bat and ball","shortname":":cricket:","category":"activity","emoji_order":"433","aliases":[":cricket_bat_ball:"],"aliases_ascii":[],"keywords":["ball","sport","cricket"]},"ski":{"unicode":"1f3bf","unicode_alternates":"","name":"ski and ski boot","shortname":":ski:","category":"activity","emoji_order":"434","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","skiing"]},"skier":{"unicode":"26f7","unicode_alternates":"26f7-fe0f","name":"skier","shortname":":skier:","category":"activity","emoji_order":"435","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","skiing"]},"snowboarder":{"unicode":"1f3c2","unicode_alternates":"","name":"snowboarder","shortname":":snowboarder:","category":"activity","emoji_order":"436","aliases":[],"aliases_ascii":[],"keywords":["hat","vacation","cold","sport","snowboarding"]},"ice_skate":{"unicode":"26f8","unicode_alternates":"26f8-fe0f","name":"ice skate","shortname":":ice_skate:","category":"activity","emoji_order":"437","aliases":[],"aliases_ascii":[],"keywords":["cold","sport","ice skating"]},"bow_and_arrow":{"unicode":"1f3f9","unicode_alternates":"","name":"bow and arrow","shortname":":bow_and_arrow:","category":"activity","emoji_order":"438","aliases":[":archery:"],"aliases_ascii":[],"keywords":["weapon","sport"]},"fishing_pole_and_fish":{"unicode":"1f3a3","unicode_alternates":"","name":"fishing pole and fish","shortname":":fishing_pole_and_fish:","category":"activity","emoji_order":"439","aliases":[],"aliases_ascii":[],"keywords":["vacation","sport","fishing"]},"rowboat":{"unicode":"1f6a3","unicode_alternates":"","name":"rowboat","shortname":":rowboat:","category":"activity","emoji_order":"440","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","rowing","diversity","diversity"]},"swimmer":{"unicode":"1f3ca","unicode_alternates":"","name":"swimmer","shortname":":swimmer:","category":"activity","emoji_order":"441","aliases":[],"aliases_ascii":[],"keywords":["workout","sport","swim","diversity","diversity"]},"surfer":{"unicode":"1f3c4","unicode_alternates":"","name":"surfer","shortname":":surfer:","category":"activity","emoji_order":"442","aliases":[],"aliases_ascii":[],"keywords":["men","vacation","tropical","sport","diversity","diversity"]},"bath":{"unicode":"1f6c0","unicode_alternates":"","name":"bath","shortname":":bath:","category":"activity","emoji_order":"443","aliases":[],"aliases_ascii":[],"keywords":["bathroom","tired","diversity","diversity","steam","steam"]},"basketball_player":{"unicode":"26f9","unicode_alternates":"26f9-fe0f","name":"person with ball","shortname":":basketball_player:","category":"activity","emoji_order":"444","aliases":[":person_with_ball:"],"aliases_ascii":[],"keywords":["men","game","ball","sport","basketball","diversity","diversity"]},"lifter":{"unicode":"1f3cb","unicode_alternates":"1f3cb-fe0f","name":"weight lifter","shortname":":lifter:","category":"activity","emoji_order":"445","aliases":[":weight_lifter:"],"aliases_ascii":[],"keywords":["men","workout","flex","sport","weight lifting","win","win","diversity","diversity"]},"bicyclist":{"unicode":"1f6b4","unicode_alternates":"","name":"bicyclist","shortname":":bicyclist:","category":"activity","emoji_order":"446","aliases":[],"aliases_ascii":[],"keywords":["men","workout","sport","bike","diversity","diversity"]},"mountain_bicyclist":{"unicode":"1f6b5","unicode_alternates":"","name":"mountain bicyclist","shortname":":mountain_bicyclist:","category":"activity","emoji_order":"447","aliases":[],"aliases_ascii":[],"keywords":["men","sport","bike","diversity","diversity"]},"horse_racing":{"unicode":"1f3c7","unicode_alternates":"","name":"horse racing","shortname":":horse_racing:","category":"activity","emoji_order":"448","aliases":[],"aliases_ascii":[],"keywords":["men","sport","horse racing"]},"levitate":{"unicode":"1f574","unicode_alternates":"1f574-fe0f","name":"man in business suit levitating","shortname":":levitate:","category":"activity","emoji_order":"449","aliases":[":man_in_business_suit_levitating:"],"aliases_ascii":[],"keywords":["men","job","job"]},"trophy":{"unicode":"1f3c6","unicode_alternates":"","name":"trophy","shortname":":trophy:","category":"activity","emoji_order":"450","aliases":[],"aliases_ascii":[],"keywords":["object","game","award","win","win","perfect","perfect","parties","parties"]},"running_shirt_with_sash":{"unicode":"1f3bd","unicode_alternates":"","name":"running shirt with sash","shortname":":running_shirt_with_sash:","category":"activity","emoji_order":"451","aliases":[],"aliases_ascii":[],"keywords":["award"]},"medal":{"unicode":"1f3c5","unicode_alternates":"","name":"sports medal","shortname":":medal:","category":"activity","emoji_order":"452","aliases":[":sports_medal:"],"aliases_ascii":[],"keywords":["object","award","sport","win","win","perfect","perfect"]},"military_medal":{"unicode":"1f396","unicode_alternates":"1f396-fe0f","name":"military medal","shortname":":military_medal:","category":"activity","emoji_order":"453","aliases":[],"aliases_ascii":[],"keywords":["object","award","win","win"]},"reminder_ribbon":{"unicode":"1f397","unicode_alternates":"1f397-fe0f","name":"reminder ribbon","shortname":":reminder_ribbon:","category":"activity","emoji_order":"454","aliases":[],"aliases_ascii":[],"keywords":["award"]},"rosette":{"unicode":"1f3f5","unicode_alternates":"1f3f5-fe0f","name":"rosette","shortname":":rosette:","category":"activity","emoji_order":"455","aliases":[],"aliases_ascii":[],"keywords":["tropical"]},"ticket":{"unicode":"1f3ab","unicode_alternates":"","name":"ticket","shortname":":ticket:","category":"activity","emoji_order":"456","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie","parties","parties"]},"tickets":{"unicode":"1f39f","unicode_alternates":"1f39f-fe0f","name":"admission tickets","shortname":":tickets:","category":"activity","emoji_order":"457","aliases":[":admission_tickets:"],"aliases_ascii":[],"keywords":["theatre","movie","parties","parties"]},"performing_arts":{"unicode":"1f3ad","unicode_alternates":"","name":"performing arts","shortname":":performing_arts:","category":"activity","emoji_order":"458","aliases":[],"aliases_ascii":[],"keywords":["theatre","movie"]},"art":{"unicode":"1f3a8","unicode_alternates":"","name":"artist palette","shortname":":art:","category":"activity","emoji_order":"459","aliases":[],"aliases_ascii":[],"keywords":[]},"circus_tent":{"unicode":"1f3aa","unicode_alternates":"","name":"circus tent","shortname":":circus_tent:","category":"activity","emoji_order":"460","aliases":[],"aliases_ascii":[],"keywords":["circus tent"]},"microphone":{"unicode":"1f3a4","unicode_alternates":"","name":"microphone","shortname":":microphone:","category":"activity","emoji_order":"461","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"headphones":{"unicode":"1f3a7","unicode_alternates":"","name":"headphone","shortname":":headphones:","category":"activity","emoji_order":"462","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_score":{"unicode":"1f3bc","unicode_alternates":"","name":"musical score","shortname":":musical_score:","category":"activity","emoji_order":"463","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"musical_keyboard":{"unicode":"1f3b9","unicode_alternates":"","name":"musical keyboard","shortname":":musical_keyboard:","category":"activity","emoji_order":"464","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"saxophone":{"unicode":"1f3b7","unicode_alternates":"","name":"saxophone","shortname":":saxophone:","category":"activity","emoji_order":"465","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"trumpet":{"unicode":"1f3ba","unicode_alternates":"","name":"trumpet","shortname":":trumpet:","category":"activity","emoji_order":"466","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"guitar":{"unicode":"1f3b8","unicode_alternates":"","name":"guitar","shortname":":guitar:","category":"activity","emoji_order":"467","aliases":[],"aliases_ascii":[],"keywords":["instruments"]},"violin":{"unicode":"1f3bb","unicode_alternates":"","name":"violin","shortname":":violin:","category":"activity","emoji_order":"468","aliases":[],"aliases_ascii":[],"keywords":["instruments","sarcastic","sarcastic"]},"clapper":{"unicode":"1f3ac","unicode_alternates":"","name":"clapper board","shortname":":clapper:","category":"activity","emoji_order":"469","aliases":[],"aliases_ascii":[],"keywords":["movie"]},"video_game":{"unicode":"1f3ae","unicode_alternates":"","name":"video game","shortname":":video_game:","category":"activity","emoji_order":"470","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night","boys night"]},"space_invader":{"unicode":"1f47e","unicode_alternates":"","name":"alien monster","shortname":":space_invader:","category":"activity","emoji_order":"471","aliases":[],"aliases_ascii":[],"keywords":["monster","alien"]},"dart":{"unicode":"1f3af","unicode_alternates":"","name":"direct hit","shortname":":dart:","category":"activity","emoji_order":"472","aliases":[],"aliases_ascii":[],"keywords":["game","sport","boys night","boys night"]},"game_die":{"unicode":"1f3b2","unicode_alternates":"","name":"game die","shortname":":game_die:","category":"activity","emoji_order":"473","aliases":[],"aliases_ascii":[],"keywords":["object","game","boys night","boys night"]},"slot_machine":{"unicode":"1f3b0","unicode_alternates":"","name":"slot machine","shortname":":slot_machine:","category":"activity","emoji_order":"474","aliases":[],"aliases_ascii":[],"keywords":["game","boys night","boys night"]},"bowling":{"unicode":"1f3b3","unicode_alternates":"","name":"bowling","shortname":":bowling:","category":"activity","emoji_order":"475","aliases":[],"aliases_ascii":[],"keywords":["game","ball","sport","boys night","boys night"]},"red_car":{"unicode":"1f697","unicode_alternates":"","name":"automobile","shortname":":red_car:","category":"travel","emoji_order":"476","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"taxi":{"unicode":"1f695","unicode_alternates":"","name":"taxi","shortname":":taxi:","category":"travel","emoji_order":"477","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"blue_car":{"unicode":"1f699","unicode_alternates":"","name":"recreational vehicle","shortname":":blue_car:","category":"travel","emoji_order":"478","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"bus":{"unicode":"1f68c","unicode_alternates":"","name":"bus","shortname":":bus:","category":"travel","emoji_order":"479","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","office"]},"trolleybus":{"unicode":"1f68e","unicode_alternates":"","name":"trolleybus","shortname":":trolleybus:","category":"travel","emoji_order":"480","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"race_car":{"unicode":"1f3ce","unicode_alternates":"1f3ce-fe0f","name":"racing car","shortname":":race_car:","category":"travel","emoji_order":"481","aliases":[":racing_car:"],"aliases_ascii":[],"keywords":["transportation","car"]},"police_car":{"unicode":"1f693","unicode_alternates":"","name":"police car","shortname":":police_car:","category":"travel","emoji_order":"482","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","police","911","911"]},"ambulance":{"unicode":"1f691","unicode_alternates":"","name":"ambulance","shortname":":ambulance:","category":"travel","emoji_order":"483","aliases":[],"aliases_ascii":[],"keywords":["transportation","911","911"]},"fire_engine":{"unicode":"1f692","unicode_alternates":"","name":"fire engine","shortname":":fire_engine:","category":"travel","emoji_order":"484","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck","911","911"]},"minibus":{"unicode":"1f690","unicode_alternates":"","name":"minibus","shortname":":minibus:","category":"travel","emoji_order":"485","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus"]},"truck":{"unicode":"1f69a","unicode_alternates":"","name":"delivery truck","shortname":":truck:","category":"travel","emoji_order":"486","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"articulated_lorry":{"unicode":"1f69b","unicode_alternates":"","name":"articulated lorry","shortname":":articulated_lorry:","category":"travel","emoji_order":"487","aliases":[],"aliases_ascii":[],"keywords":["transportation","truck"]},"tractor":{"unicode":"1f69c","unicode_alternates":"","name":"tractor","shortname":":tractor:","category":"travel","emoji_order":"488","aliases":[],"aliases_ascii":[],"keywords":["transportation"]},"motorcycle":{"unicode":"1f3cd","unicode_alternates":"1f3cd-fe0f","name":"racing motorcycle","shortname":":motorcycle:","category":"travel","emoji_order":"489","aliases":[":racing_motorcycle:"],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"bike":{"unicode":"1f6b2","unicode_alternates":"","name":"bicycle","shortname":":bike:","category":"travel","emoji_order":"490","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","bike"]},"rotating_light":{"unicode":"1f6a8","unicode_alternates":"","name":"police cars revolving light","shortname":":rotating_light:","category":"travel","emoji_order":"491","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","police","police","911","911"]},"oncoming_police_car":{"unicode":"1f694","unicode_alternates":"","name":"oncoming police car","shortname":":oncoming_police_car:","category":"travel","emoji_order":"492","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","police","police","911","911"]},"oncoming_bus":{"unicode":"1f68d","unicode_alternates":"","name":"oncoming bus","shortname":":oncoming_bus:","category":"travel","emoji_order":"493","aliases":[],"aliases_ascii":[],"keywords":["transportation","bus","travel"]},"oncoming_automobile":{"unicode":"1f698","unicode_alternates":"","name":"oncoming automobile","shortname":":oncoming_automobile:","category":"travel","emoji_order":"494","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"oncoming_taxi":{"unicode":"1f696","unicode_alternates":"","name":"oncoming taxi","shortname":":oncoming_taxi:","category":"travel","emoji_order":"495","aliases":[],"aliases_ascii":[],"keywords":["transportation","car","travel"]},"aerial_tramway":{"unicode":"1f6a1","unicode_alternates":"","name":"aerial tramway","shortname":":aerial_tramway:","category":"travel","emoji_order":"496","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"mountain_cableway":{"unicode":"1f6a0","unicode_alternates":"","name":"mountain cableway","shortname":":mountain_cableway:","category":"travel","emoji_order":"497","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"suspension_railway":{"unicode":"1f69f","unicode_alternates":"","name":"suspension railway","shortname":":suspension_railway:","category":"travel","emoji_order":"498","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"railway_car":{"unicode":"1f683","unicode_alternates":"","name":"railway car","shortname":":railway_car:","category":"travel","emoji_order":"499","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"train":{"unicode":"1f68b","unicode_alternates":"","name":"tram car","shortname":":train:","category":"travel","emoji_order":"500","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"monorail":{"unicode":"1f69d","unicode_alternates":"","name":"monorail","shortname":":monorail:","category":"travel","emoji_order":"501","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","vacation"]},"bullettrain_side":{"unicode":"1f684","unicode_alternates":"","name":"high-speed train","shortname":":bullettrain_side:","category":"travel","emoji_order":"502","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"bullettrain_front":{"unicode":"1f685","unicode_alternates":"","name":"high-speed train with bullet nose","shortname":":bullettrain_front:","category":"travel","emoji_order":"503","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"light_rail":{"unicode":"1f688","unicode_alternates":"","name":"light rail","shortname":":light_rail:","category":"travel","emoji_order":"504","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"mountain_railway":{"unicode":"1f69e","unicode_alternates":"","name":"mountain railway","shortname":":mountain_railway:","category":"travel","emoji_order":"505","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"steam_locomotive":{"unicode":"1f682","unicode_alternates":"","name":"steam locomotive","shortname":":steam_locomotive:","category":"travel","emoji_order":"506","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train","steam","steam"]},"train2":{"unicode":"1f686","unicode_alternates":"","name":"train","shortname":":train2:","category":"travel","emoji_order":"507","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"metro":{"unicode":"1f687","unicode_alternates":"","name":"metro","shortname":":metro:","category":"travel","emoji_order":"508","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"tram":{"unicode":"1f68a","unicode_alternates":"","name":"tram","shortname":":tram:","category":"travel","emoji_order":"509","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"station":{"unicode":"1f689","unicode_alternates":"","name":"station","shortname":":station:","category":"travel","emoji_order":"510","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","train"]},"helicopter":{"unicode":"1f681","unicode_alternates":"","name":"helicopter","shortname":":helicopter:","category":"travel","emoji_order":"511","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","fly","fly"]},"airplane_small":{"unicode":"1f6e9","unicode_alternates":"1f6e9-fe0f","name":"small airplane","shortname":":airplane_small:","category":"travel","emoji_order":"512","aliases":[":small_airplane:"],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane":{"unicode":"2708","unicode_alternates":"2708-fe0f","name":"airplane","shortname":":airplane:","category":"travel","emoji_order":"513","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane_departure":{"unicode":"1f6eb","unicode_alternates":"","name":"airplane departure","shortname":":airplane_departure:","category":"travel","emoji_order":"514","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"airplane_arriving":{"unicode":"1f6ec","unicode_alternates":"","name":"airplane arriving","shortname":":airplane_arriving:","category":"travel","emoji_order":"515","aliases":[],"aliases_ascii":[],"keywords":["transportation","plane","travel","vacation","fly","fly"]},"sailboat":{"unicode":"26f5","unicode_alternates":"26f5-fe0f","name":"sailboat","shortname":":sailboat:","category":"travel","emoji_order":"516","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"motorboat":{"unicode":"1f6e5","unicode_alternates":"1f6e5-fe0f","name":"motorboat","shortname":":motorboat:","category":"travel","emoji_order":"517","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat"]},"speedboat":{"unicode":"1f6a4","unicode_alternates":"","name":"speedboat","shortname":":speedboat:","category":"travel","emoji_order":"518","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation","tropical"]},"ferry":{"unicode":"26f4","unicode_alternates":"26f4-fe0f","name":"ferry","shortname":":ferry:","category":"travel","emoji_order":"519","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"cruise_ship":{"unicode":"1f6f3","unicode_alternates":"1f6f3-fe0f","name":"passenger ship","shortname":":cruise_ship:","category":"travel","emoji_order":"520","aliases":[":passenger_ship:"],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"rocket":{"unicode":"1f680","unicode_alternates":"","name":"rocket","shortname":":rocket:","category":"travel","emoji_order":"521","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","space","fly","fly","blast","blast"]},"satellite_orbital":{"unicode":"1f6f0","unicode_alternates":"1f6f0-fe0f","name":"satellite","shortname":":satellite_orbital:","category":"travel","emoji_order":"522","aliases":[],"aliases_ascii":[],"keywords":["object"]},"seat":{"unicode":"1f4ba","unicode_alternates":"","name":"seat","shortname":":seat:","category":"travel","emoji_order":"523","aliases":[],"aliases_ascii":[],"keywords":["transportation","object","travel","vacation"]},"anchor":{"unicode":"2693","unicode_alternates":"2693-fe0f","name":"anchor","shortname":":anchor:","category":"travel","emoji_order":"524","aliases":[],"aliases_ascii":[],"keywords":["object","travel","boat","vacation"]},"construction":{"unicode":"1f6a7","unicode_alternates":"","name":"construction sign","shortname":":construction:","category":"travel","emoji_order":"525","aliases":[],"aliases_ascii":[],"keywords":["object"]},"fuelpump":{"unicode":"26fd","unicode_alternates":"26fd-fe0f","name":"fuel pump","shortname":":fuelpump:","category":"travel","emoji_order":"526","aliases":[],"aliases_ascii":[],"keywords":["object","gas pump"]},"busstop":{"unicode":"1f68f","unicode_alternates":"","name":"bus stop","shortname":":busstop:","category":"travel","emoji_order":"527","aliases":[],"aliases_ascii":[],"keywords":["object"]},"vertical_traffic_light":{"unicode":"1f6a6","unicode_alternates":"","name":"vertical traffic light","shortname":":vertical_traffic_light:","category":"travel","emoji_order":"528","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"traffic_light":{"unicode":"1f6a5","unicode_alternates":"","name":"horizontal traffic light","shortname":":traffic_light:","category":"travel","emoji_order":"529","aliases":[],"aliases_ascii":[],"keywords":["object","stop light"]},"checkered_flag":{"unicode":"1f3c1","unicode_alternates":"","name":"chequered flag","shortname":":checkered_flag:","category":"travel","emoji_order":"530","aliases":[],"aliases_ascii":[],"keywords":["object"]},"ship":{"unicode":"1f6a2","unicode_alternates":"","name":"ship","shortname":":ship:","category":"travel","emoji_order":"531","aliases":[],"aliases_ascii":[],"keywords":["transportation","travel","boat","vacation"]},"ferris_wheel":{"unicode":"1f3a1","unicode_alternates":"","name":"ferris wheel","shortname":":ferris_wheel:","category":"travel","emoji_order":"532","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","ferris wheel"]},"roller_coaster":{"unicode":"1f3a2","unicode_alternates":"","name":"roller coaster","shortname":":roller_coaster:","category":"travel","emoji_order":"533","aliases":[],"aliases_ascii":[],"keywords":["places","vacation","roller coaster"]},"carousel_horse":{"unicode":"1f3a0","unicode_alternates":"","name":"carousel horse","shortname":":carousel_horse:","category":"travel","emoji_order":"534","aliases":[],"aliases_ascii":[],"keywords":["places","object","vacation","roller coaster","carousel"]},"construction_site":{"unicode":"1f3d7","unicode_alternates":"1f3d7-fe0f","name":"building construction","shortname":":construction_site:","category":"travel","emoji_order":"535","aliases":[":building_construction:"],"aliases_ascii":[],"keywords":["building","crane"]},"foggy":{"unicode":"1f301","unicode_alternates":"","name":"foggy","shortname":":foggy:","category":"travel","emoji_order":"536","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","travel","vacation"]},"tokyo_tower":{"unicode":"1f5fc","unicode_alternates":"","name":"tokyo tower","shortname":":tokyo_tower:","category":"travel","emoji_order":"537","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","eiffel tower"]},"factory":{"unicode":"1f3ed","unicode_alternates":"","name":"factory","shortname":":factory:","category":"travel","emoji_order":"538","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","steam","steam"]},"fountain":{"unicode":"26f2","unicode_alternates":"26f2-fe0f","name":"fountain","shortname":":fountain:","category":"travel","emoji_order":"539","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"rice_scene":{"unicode":"1f391","unicode_alternates":"","name":"moon viewing ceremony","shortname":":rice_scene:","category":"travel","emoji_order":"540","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel"]},"mountain":{"unicode":"26f0","unicode_alternates":"26f0-fe0f","name":"mountain","shortname":":mountain:","category":"travel","emoji_order":"541","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"mountain_snow":{"unicode":"1f3d4","unicode_alternates":"1f3d4-fe0f","name":"snow capped mountain","shortname":":mountain_snow:","category":"travel","emoji_order":"542","aliases":[":snow_capped_mountain:"],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"mount_fuji":{"unicode":"1f5fb","unicode_alternates":"","name":"mount fuji","shortname":":mount_fuji:","category":"travel","emoji_order":"543","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","cold","camp"]},"volcano":{"unicode":"1f30b","unicode_alternates":"","name":"volcano","shortname":":volcano:","category":"travel","emoji_order":"544","aliases":[],"aliases_ascii":[],"keywords":["places","tropical"]},"japan":{"unicode":"1f5fe","unicode_alternates":"","name":"silhouette of japan","shortname":":japan:","category":"travel","emoji_order":"545","aliases":[],"aliases_ascii":[],"keywords":["places","travel","map","vacation","tropical"]},"camping":{"unicode":"1f3d5","unicode_alternates":"1f3d5-fe0f","name":"camping","shortname":":camping:","category":"travel","emoji_order":"546","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"tent":{"unicode":"26fa","unicode_alternates":"26fa-fe0f","name":"tent","shortname":":tent:","category":"travel","emoji_order":"547","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","camp"]},"park":{"unicode":"1f3de","unicode_alternates":"1f3de-fe0f","name":"national park","shortname":":park:","category":"travel","emoji_order":"548","aliases":[":national_park:"],"aliases_ascii":[],"keywords":["travel","vacation","park","camp"]},"motorway":{"unicode":"1f6e3","unicode_alternates":"1f6e3-fe0f","name":"motorway","shortname":":motorway:","category":"travel","emoji_order":"549","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation","camp"]},"railway_track":{"unicode":"1f6e4","unicode_alternates":"1f6e4-fe0f","name":"railway track","shortname":":railway_track:","category":"travel","emoji_order":"550","aliases":[":railroad_track:"],"aliases_ascii":[],"keywords":["travel","train","vacation"]},"sunrise":{"unicode":"1f305","unicode_alternates":"","name":"sunrise","shortname":":sunrise:","category":"travel","emoji_order":"551","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","tropical","day","sun","hump day","hump day","morning","morning"]},"sunrise_over_mountains":{"unicode":"1f304","unicode_alternates":"","name":"sunrise over mountains","shortname":":sunrise_over_mountains:","category":"travel","emoji_order":"552","aliases":[],"aliases_ascii":[],"keywords":["places","sky","travel","vacation","day","sun","camp","morning","morning"]},"desert":{"unicode":"1f3dc","unicode_alternates":"1f3dc-fe0f","name":"desert","shortname":":desert:","category":"travel","emoji_order":"553","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","hot","hot"]},"beach":{"unicode":"1f3d6","unicode_alternates":"1f3d6-fe0f","name":"beach with umbrella","shortname":":beach:","category":"travel","emoji_order":"554","aliases":[":beach_with_umbrella:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"island":{"unicode":"1f3dd","unicode_alternates":"1f3dd-fe0f","name":"desert island","shortname":":island:","category":"travel","emoji_order":"555","aliases":[":desert_island:"],"aliases_ascii":[],"keywords":["places","travel","vacation","tropical","beach","swim"]},"city_sunset":{"unicode":"1f307","unicode_alternates":"","name":"sunset over buildings","shortname":":city_sunset:","category":"travel","emoji_order":"556","aliases":[":city_sunrise:"],"aliases_ascii":[],"keywords":["places","building","sky","vacation"]},"city_dusk":{"unicode":"1f306","unicode_alternates":"","name":"cityscape at dusk","shortname":":city_dusk:","category":"travel","emoji_order":"557","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"cityscape":{"unicode":"1f3d9","unicode_alternates":"1f3d9-fe0f","name":"cityscape","shortname":":cityscape:","category":"travel","emoji_order":"558","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"night_with_stars":{"unicode":"1f303","unicode_alternates":"","name":"night with stars","shortname":":night_with_stars:","category":"travel","emoji_order":"559","aliases":[],"aliases_ascii":[],"keywords":["places","building","sky","vacation","goodnight","goodnight"]},"bridge_at_night":{"unicode":"1f309","unicode_alternates":"","name":"bridge at night","shortname":":bridge_at_night:","category":"travel","emoji_order":"560","aliases":[],"aliases_ascii":[],"keywords":["places","travel","vacation","goodnight","goodnight"]},"milky_way":{"unicode":"1f30c","unicode_alternates":"","name":"milky way","shortname":":milky_way:","category":"travel","emoji_order":"561","aliases":[],"aliases_ascii":[],"keywords":["places","space","sky","travel","vacation"]},"stars":{"unicode":"1f320","unicode_alternates":"","name":"shooting star","shortname":":stars:","category":"travel","emoji_order":"562","aliases":[],"aliases_ascii":[],"keywords":["space"]},"sparkler":{"unicode":"1f387","unicode_alternates":"","name":"firework sparkler","shortname":":sparkler:","category":"travel","emoji_order":"563","aliases":[],"aliases_ascii":[],"keywords":["parties","parties"]},"fireworks":{"unicode":"1f386","unicode_alternates":"","name":"fireworks","shortname":":fireworks:","category":"travel","emoji_order":"564","aliases":[],"aliases_ascii":[],"keywords":["parties","parties"]},"rainbow":{"unicode":"1f308","unicode_alternates":"","name":"rainbow","shortname":":rainbow:","category":"travel","emoji_order":"565","aliases":[],"aliases_ascii":[],"keywords":["weather","gay","sky","rain"]},"homes":{"unicode":"1f3d8","unicode_alternates":"1f3d8-fe0f","name":"house buildings","shortname":":homes:","category":"travel","emoji_order":"566","aliases":[":house_buildings:"],"aliases_ascii":[],"keywords":["places","building","house"]},"european_castle":{"unicode":"1f3f0","unicode_alternates":"","name":"european castle","shortname":":european_castle:","category":"travel","emoji_order":"567","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"japanese_castle":{"unicode":"1f3ef","unicode_alternates":"","name":"japanese castle","shortname":":japanese_castle:","category":"travel","emoji_order":"568","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"stadium":{"unicode":"1f3df","unicode_alternates":"1f3df-fe0f","name":"stadium","shortname":":stadium:","category":"travel","emoji_order":"569","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation","boys night","boys night"]},"statue_of_liberty":{"unicode":"1f5fd","unicode_alternates":"","name":"statue of liberty","shortname":":statue_of_liberty:","category":"travel","emoji_order":"570","aliases":[],"aliases_ascii":[],"keywords":["places","america","travel","vacation","statue of liberty","free speech","free speech"]},"house":{"unicode":"1f3e0","unicode_alternates":"","name":"house building","shortname":":house:","category":"travel","emoji_order":"571","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"house_with_garden":{"unicode":"1f3e1","unicode_alternates":"","name":"house with garden","shortname":":house_with_garden:","category":"travel","emoji_order":"572","aliases":[],"aliases_ascii":[],"keywords":["places","building","house"]},"house_abandoned":{"unicode":"1f3da","unicode_alternates":"1f3da-fe0f","name":"derelict house building","shortname":":house_abandoned:","category":"travel","emoji_order":"573","aliases":[":derelict_house_building:"],"aliases_ascii":[],"keywords":["places","building","house"]},"office":{"unicode":"1f3e2","unicode_alternates":"","name":"office building","shortname":":office:","category":"travel","emoji_order":"574","aliases":[],"aliases_ascii":[],"keywords":["places","building","work"]},"department_store":{"unicode":"1f3ec","unicode_alternates":"","name":"department store","shortname":":department_store:","category":"travel","emoji_order":"575","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"post_office":{"unicode":"1f3e3","unicode_alternates":"","name":"japanese post office","shortname":":post_office:","category":"travel","emoji_order":"576","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"european_post_office":{"unicode":"1f3e4","unicode_alternates":"","name":"european post office","shortname":":european_post_office:","category":"travel","emoji_order":"577","aliases":[],"aliases_ascii":[],"keywords":["places","building","post office"]},"hospital":{"unicode":"1f3e5","unicode_alternates":"","name":"hospital","shortname":":hospital:","category":"travel","emoji_order":"578","aliases":[],"aliases_ascii":[],"keywords":["places","building","health","911","911"]},"bank":{"unicode":"1f3e6","unicode_alternates":"","name":"bank","shortname":":bank:","category":"travel","emoji_order":"579","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"hotel":{"unicode":"1f3e8","unicode_alternates":"","name":"hotel","shortname":":hotel:","category":"travel","emoji_order":"580","aliases":[],"aliases_ascii":[],"keywords":["places","building","vacation"]},"convenience_store":{"unicode":"1f3ea","unicode_alternates":"","name":"convenience store","shortname":":convenience_store:","category":"travel","emoji_order":"581","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"school":{"unicode":"1f3eb","unicode_alternates":"","name":"school","shortname":":school:","category":"travel","emoji_order":"582","aliases":[],"aliases_ascii":[],"keywords":["places","building"]},"love_hotel":{"unicode":"1f3e9","unicode_alternates":"","name":"love hotel","shortname":":love_hotel:","category":"travel","emoji_order":"583","aliases":[],"aliases_ascii":[],"keywords":["places","building","love"]},"wedding":{"unicode":"1f492","unicode_alternates":"","name":"wedding","shortname":":wedding:","category":"travel","emoji_order":"584","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","building","love","parties","parties"]},"classical_building":{"unicode":"1f3db","unicode_alternates":"1f3db-fe0f","name":"classical building","shortname":":classical_building:","category":"travel","emoji_order":"585","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"church":{"unicode":"26ea","unicode_alternates":"26ea-fe0f","name":"church","shortname":":church:","category":"travel","emoji_order":"586","aliases":[],"aliases_ascii":[],"keywords":["places","wedding","religion","building","condolence","condolence"]},"mosque":{"unicode":"1f54c","unicode_alternates":"","name":"mosque","shortname":":mosque:","category":"travel","emoji_order":"587","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","vacation","condolence","condolence"]},"synagogue":{"unicode":"1f54d","unicode_alternates":"","name":"synagogue","shortname":":synagogue:","category":"travel","emoji_order":"588","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","travel","vacation","condolence","condolence"]},"kaaba":{"unicode":"1f54b","unicode_alternates":"","name":"kaaba","shortname":":kaaba:","category":"travel","emoji_order":"589","aliases":[],"aliases_ascii":[],"keywords":["places","religion","building","condolence","condolence"]},"shinto_shrine":{"unicode":"26e9","unicode_alternates":"26e9-fe0f","name":"shinto shrine","shortname":":shinto_shrine:","category":"travel","emoji_order":"590","aliases":[],"aliases_ascii":[],"keywords":["places","building","travel","vacation"]},"watch":{"unicode":"231a","unicode_alternates":"231a-fe0f","name":"watch","shortname":":watch:","category":"objects","emoji_order":"591","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"iphone":{"unicode":"1f4f1","unicode_alternates":"","name":"mobile phone","shortname":":iphone:","category":"objects","emoji_order":"592","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie","selfie"]},"calling":{"unicode":"1f4f2","unicode_alternates":"","name":"mobile phone with rightwards arrow at left","shortname":":calling:","category":"objects","emoji_order":"593","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone","selfie","selfie"]},"computer":{"unicode":"1f4bb","unicode_alternates":"","name":"personal computer","shortname":":computer:","category":"objects","emoji_order":"594","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"keyboard":{"unicode":"2328","unicode_alternates":"2328-fe0f","name":"keyboard","shortname":":keyboard:","category":"objects","emoji_order":"595","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"desktop":{"unicode":"1f5a5","unicode_alternates":"1f5a5-fe0f","name":"desktop computer","shortname":":desktop:","category":"objects","emoji_order":"596","aliases":[":desktop_computer:"],"aliases_ascii":[],"keywords":["electronics","work"]},"printer":{"unicode":"1f5a8","unicode_alternates":"1f5a8-fe0f","name":"printer","shortname":":printer:","category":"objects","emoji_order":"597","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"mouse_three_button":{"unicode":"1f5b1","unicode_alternates":"1f5b1-fe0f","name":"three button mouse","shortname":":mouse_three_button:","category":"objects","emoji_order":"598","aliases":[":three_button_mouse:"],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"trackball":{"unicode":"1f5b2","unicode_alternates":"1f5b2-fe0f","name":"trackball","shortname":":trackball:","category":"objects","emoji_order":"599","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","game","office"]},"joystick":{"unicode":"1f579","unicode_alternates":"1f579-fe0f","name":"joystick","shortname":":joystick:","category":"objects","emoji_order":"600","aliases":[],"aliases_ascii":[],"keywords":["electronics","game","boys night","boys night"]},"compression":{"unicode":"1f5dc","unicode_alternates":"1f5dc-fe0f","name":"compression","shortname":":compression:","category":"objects","emoji_order":"601","aliases":[],"aliases_ascii":[],"keywords":[]},"minidisc":{"unicode":"1f4bd","unicode_alternates":"","name":"minidisc","shortname":":minidisc:","category":"objects","emoji_order":"602","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"floppy_disk":{"unicode":"1f4be","unicode_alternates":"","name":"floppy disk","shortname":":floppy_disk:","category":"objects","emoji_order":"603","aliases":[],"aliases_ascii":[],"keywords":["electronics","office"]},"cd":{"unicode":"1f4bf","unicode_alternates":"","name":"optical disc","shortname":":cd:","category":"objects","emoji_order":"604","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"dvd":{"unicode":"1f4c0","unicode_alternates":"","name":"dvd","shortname":":dvd:","category":"objects","emoji_order":"605","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"vhs":{"unicode":"1f4fc","unicode_alternates":"","name":"videocassette","shortname":":vhs:","category":"objects","emoji_order":"606","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"camera":{"unicode":"1f4f7","unicode_alternates":"","name":"camera","shortname":":camera:","category":"objects","emoji_order":"607","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","selfie","selfie"]},"camera_with_flash":{"unicode":"1f4f8","unicode_alternates":"","name":"camera with flash","shortname":":camera_with_flash:","category":"objects","emoji_order":"608","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera"]},"video_camera":{"unicode":"1f4f9","unicode_alternates":"","name":"video camera","shortname":":video_camera:","category":"objects","emoji_order":"609","aliases":[],"aliases_ascii":[],"keywords":["electronics","camera","movie"]},"movie_camera":{"unicode":"1f3a5","unicode_alternates":"","name":"movie camera","shortname":":movie_camera:","category":"objects","emoji_order":"610","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"projector":{"unicode":"1f4fd","unicode_alternates":"1f4fd-fe0f","name":"film projector","shortname":":projector:","category":"objects","emoji_order":"611","aliases":[":film_projector:"],"aliases_ascii":[],"keywords":["object","camera","movie"]},"film_frames":{"unicode":"1f39e","unicode_alternates":"1f39e-fe0f","name":"film frames","shortname":":film_frames:","category":"objects","emoji_order":"612","aliases":[],"aliases_ascii":[],"keywords":["object","camera","movie"]},"telephone_receiver":{"unicode":"1f4de","unicode_alternates":"","name":"telephone receiver","shortname":":telephone_receiver:","category":"objects","emoji_order":"613","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"telephone":{"unicode":"260e","unicode_alternates":"260e-fe0f","name":"black telephone","shortname":":telephone:","category":"objects","emoji_order":"614","aliases":[],"aliases_ascii":[],"keywords":["electronics","phone"]},"pager":{"unicode":"1f4df","unicode_alternates":"","name":"pager","shortname":":pager:","category":"objects","emoji_order":"615","aliases":[],"aliases_ascii":[],"keywords":["electronics","work"]},"fax":{"unicode":"1f4e0","unicode_alternates":"","name":"fax machine","shortname":":fax:","category":"objects","emoji_order":"616","aliases":[],"aliases_ascii":[],"keywords":["electronics","work","office"]},"tv":{"unicode":"1f4fa","unicode_alternates":"","name":"television","shortname":":tv:","category":"objects","emoji_order":"617","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"radio":{"unicode":"1f4fb","unicode_alternates":"","name":"radio","shortname":":radio:","category":"objects","emoji_order":"618","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"microphone2":{"unicode":"1f399","unicode_alternates":"1f399-fe0f","name":"studio microphone","shortname":":microphone2:","category":"objects","emoji_order":"619","aliases":[":studio_microphone:"],"aliases_ascii":[],"keywords":["electronics","object"]},"level_slider":{"unicode":"1f39a","unicode_alternates":"1f39a-fe0f","name":"level slider","shortname":":level_slider:","category":"objects","emoji_order":"620","aliases":[],"aliases_ascii":[],"keywords":[]},"control_knobs":{"unicode":"1f39b","unicode_alternates":"1f39b-fe0f","name":"control knobs","shortname":":control_knobs:","category":"objects","emoji_order":"621","aliases":[],"aliases_ascii":[],"keywords":["time"]},"stopwatch":{"unicode":"23f1","unicode_alternates":"23f1-fe0f","name":"stopwatch","shortname":":stopwatch:","category":"objects","emoji_order":"622","aliases":[],"aliases_ascii":[],"keywords":["electronics","time"]},"timer":{"unicode":"23f2","unicode_alternates":"23f2-fe0f","name":"timer clock","shortname":":timer:","category":"objects","emoji_order":"623","aliases":[":timer_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"alarm_clock":{"unicode":"23f0","unicode_alternates":"","name":"alarm clock","shortname":":alarm_clock:","category":"objects","emoji_order":"624","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"clock":{"unicode":"1f570","unicode_alternates":"1f570-fe0f","name":"mantlepiece clock","shortname":":clock:","category":"objects","emoji_order":"625","aliases":[":mantlepiece_clock:"],"aliases_ascii":[],"keywords":["object","time"]},"hourglass_flowing_sand":{"unicode":"23f3","unicode_alternates":"","name":"hourglass with flowing sand","shortname":":hourglass_flowing_sand:","category":"objects","emoji_order":"626","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"hourglass":{"unicode":"231b","unicode_alternates":"231b-fe0f","name":"hourglass","shortname":":hourglass:","category":"objects","emoji_order":"627","aliases":[],"aliases_ascii":[],"keywords":["object","time"]},"satellite":{"unicode":"1f4e1","unicode_alternates":"","name":"satellite antenna","shortname":":satellite:","category":"objects","emoji_order":"628","aliases":[],"aliases_ascii":[],"keywords":["object"]},"battery":{"unicode":"1f50b","unicode_alternates":"","name":"battery","shortname":":battery:","category":"objects","emoji_order":"629","aliases":[],"aliases_ascii":[],"keywords":["object"]},"electric_plug":{"unicode":"1f50c","unicode_alternates":"","name":"electric plug","shortname":":electric_plug:","category":"objects","emoji_order":"630","aliases":[],"aliases_ascii":[],"keywords":["electronics"]},"bulb":{"unicode":"1f4a1","unicode_alternates":"","name":"electric light bulb","shortname":":bulb:","category":"objects","emoji_order":"631","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"flashlight":{"unicode":"1f526","unicode_alternates":"","name":"electric torch","shortname":":flashlight:","category":"objects","emoji_order":"632","aliases":[],"aliases_ascii":[],"keywords":["electronics","object"]},"candle":{"unicode":"1f56f","unicode_alternates":"1f56f-fe0f","name":"candle","shortname":":candle:","category":"objects","emoji_order":"633","aliases":[],"aliases_ascii":[],"keywords":["object"]},"wastebasket":{"unicode":"1f5d1","unicode_alternates":"1f5d1-fe0f","name":"wastebasket","shortname":":wastebasket:","category":"objects","emoji_order":"634","aliases":[],"aliases_ascii":[],"keywords":["object","work"]},"oil":{"unicode":"1f6e2","unicode_alternates":"1f6e2-fe0f","name":"oil drum","shortname":":oil:","category":"objects","emoji_order":"635","aliases":[":oil_drum:"],"aliases_ascii":[],"keywords":["object"]},"money_with_wings":{"unicode":"1f4b8","unicode_alternates":"","name":"money with wings","shortname":":money_with_wings:","category":"objects","emoji_order":"636","aliases":[],"aliases_ascii":[],"keywords":["money","money","boys night","boys night"]},"dollar":{"unicode":"1f4b5","unicode_alternates":"","name":"banknote with dollar sign","shortname":":dollar:","category":"objects","emoji_order":"637","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"yen":{"unicode":"1f4b4","unicode_alternates":"","name":"banknote with yen sign","shortname":":yen:","category":"objects","emoji_order":"638","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"euro":{"unicode":"1f4b6","unicode_alternates":"","name":"banknote with euro sign","shortname":":euro:","category":"objects","emoji_order":"639","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"pound":{"unicode":"1f4b7","unicode_alternates":"","name":"banknote with pound sign","shortname":":pound:","category":"objects","emoji_order":"640","aliases":[],"aliases_ascii":[],"keywords":["money","money"]},"moneybag":{"unicode":"1f4b0","unicode_alternates":"","name":"money bag","shortname":":moneybag:","category":"objects","emoji_order":"641","aliases":[],"aliases_ascii":[],"keywords":["bag","award","money","money"]},"credit_card":{"unicode":"1f4b3","unicode_alternates":"","name":"credit card","shortname":":credit_card:","category":"objects","emoji_order":"642","aliases":[],"aliases_ascii":[],"keywords":["object","money","money","boys night","boys night"]},"gem":{"unicode":"1f48e","unicode_alternates":"","name":"gem stone","shortname":":gem:","category":"objects","emoji_order":"643","aliases":[],"aliases_ascii":[],"keywords":["object","gem"]},"scales":{"unicode":"2696","unicode_alternates":"2696-fe0f","name":"scales","shortname":":scales:","category":"objects","emoji_order":"644","aliases":[],"aliases_ascii":[],"keywords":["object"]},"wrench":{"unicode":"1f527","unicode_alternates":"","name":"wrench","shortname":":wrench:","category":"objects","emoji_order":"645","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"hammer":{"unicode":"1f528","unicode_alternates":"","name":"hammer","shortname":":hammer:","category":"objects","emoji_order":"646","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"hammer_pick":{"unicode":"2692","unicode_alternates":"2692-fe0f","name":"hammer and pick","shortname":":hammer_pick:","category":"objects","emoji_order":"647","aliases":[":hammer_and_pick:"],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"tools":{"unicode":"1f6e0","unicode_alternates":"1f6e0-fe0f","name":"hammer and wrench","shortname":":tools:","category":"objects","emoji_order":"648","aliases":[":hammer_and_wrench:"],"aliases_ascii":[],"keywords":["object","tool"]},"pick":{"unicode":"26cf","unicode_alternates":"26cf-fe0f","name":"pick","shortname":":pick:","category":"objects","emoji_order":"649","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon"]},"nut_and_bolt":{"unicode":"1f529","unicode_alternates":"","name":"nut and bolt","shortname":":nut_and_bolt:","category":"objects","emoji_order":"650","aliases":[],"aliases_ascii":[],"keywords":["object","tool","nutcase","nutcase"]},"gear":{"unicode":"2699","unicode_alternates":"2699-fe0f","name":"gear","shortname":":gear:","category":"objects","emoji_order":"651","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"chains":{"unicode":"26d3","unicode_alternates":"26d3-fe0f","name":"chains","shortname":":chains:","category":"objects","emoji_order":"652","aliases":[],"aliases_ascii":[],"keywords":["object","tool"]},"gun":{"unicode":"1f52b","unicode_alternates":"","name":"pistol","shortname":":gun:","category":"objects","emoji_order":"653","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","gun","sarcastic","sarcastic"]},"bomb":{"unicode":"1f4a3","unicode_alternates":"","name":"bomb","shortname":":bomb:","category":"objects","emoji_order":"654","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","dead","blast","blast"]},"knife":{"unicode":"1f52a","unicode_alternates":"","name":"hocho","shortname":":knife:","category":"objects","emoji_order":"655","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"dagger":{"unicode":"1f5e1","unicode_alternates":"1f5e1-fe0f","name":"dagger knife","shortname":":dagger:","category":"objects","emoji_order":"656","aliases":[":dagger_knife:"],"aliases_ascii":[],"keywords":["object","weapon"]},"crossed_swords":{"unicode":"2694","unicode_alternates":"2694-fe0f","name":"crossed swords","shortname":":crossed_swords:","category":"objects","emoji_order":"657","aliases":[],"aliases_ascii":[],"keywords":["object","weapon"]},"shield":{"unicode":"1f6e1","unicode_alternates":"1f6e1-fe0f","name":"shield","shortname":":shield:","category":"objects","emoji_order":"658","aliases":[],"aliases_ascii":[],"keywords":["object"]},"smoking":{"unicode":"1f6ac","unicode_alternates":"","name":"smoking symbol","shortname":":smoking:","category":"objects","emoji_order":"659","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs","drugs","smoking","smoking"]},"skull_crossbones":{"unicode":"2620","unicode_alternates":"2620-fe0f","name":"skull and crossbones","shortname":":skull_crossbones:","category":"objects","emoji_order":"660","aliases":[":skull_and_crossbones:"],"aliases_ascii":[],"keywords":["symbol","dead","skull"]},"coffin":{"unicode":"26b0","unicode_alternates":"26b0-fe0f","name":"coffin","shortname":":coffin:","category":"objects","emoji_order":"661","aliases":[],"aliases_ascii":[],"keywords":["object","dead","rip","rip"]},"urn":{"unicode":"26b1","unicode_alternates":"26b1-fe0f","name":"funeral urn","shortname":":urn:","category":"objects","emoji_order":"662","aliases":[":funeral_urn:"],"aliases_ascii":[],"keywords":["object","dead","rip","rip"]},"amphora":{"unicode":"1f3fa","unicode_alternates":"","name":"amphora","shortname":":amphora:","category":"objects","emoji_order":"663","aliases":[],"aliases_ascii":[],"keywords":["object"]},"crystal_ball":{"unicode":"1f52e","unicode_alternates":"","name":"crystal ball","shortname":":crystal_ball:","category":"objects","emoji_order":"664","aliases":[],"aliases_ascii":[],"keywords":["object","ball"]},"prayer_beads":{"unicode":"1f4ff","unicode_alternates":"","name":"prayer beads","shortname":":prayer_beads:","category":"objects","emoji_order":"665","aliases":[],"aliases_ascii":[],"keywords":["object","rosary"]},"barber":{"unicode":"1f488","unicode_alternates":"","name":"barber pole","shortname":":barber:","category":"objects","emoji_order":"666","aliases":[],"aliases_ascii":[],"keywords":["object"]},"alembic":{"unicode":"2697","unicode_alternates":"2697-fe0f","name":"alembic","shortname":":alembic:","category":"objects","emoji_order":"667","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"telescope":{"unicode":"1f52d","unicode_alternates":"","name":"telescope","shortname":":telescope:","category":"objects","emoji_order":"668","aliases":[],"aliases_ascii":[],"keywords":["object","space","science"]},"microscope":{"unicode":"1f52c","unicode_alternates":"","name":"microscope","shortname":":microscope:","category":"objects","emoji_order":"669","aliases":[],"aliases_ascii":[],"keywords":["object","science"]},"hole":{"unicode":"1f573","unicode_alternates":"1f573-fe0f","name":"hole","shortname":":hole:","category":"objects","emoji_order":"670","aliases":[],"aliases_ascii":[],"keywords":["object"]},"pill":{"unicode":"1f48a","unicode_alternates":"","name":"pill","shortname":":pill:","category":"objects","emoji_order":"671","aliases":[],"aliases_ascii":[],"keywords":["object","health","drugs","drugs"]},"syringe":{"unicode":"1f489","unicode_alternates":"","name":"syringe","shortname":":syringe:","category":"objects","emoji_order":"672","aliases":[],"aliases_ascii":[],"keywords":["object","weapon","health","drugs","drugs"]},"thermometer":{"unicode":"1f321","unicode_alternates":"1f321-fe0f","name":"thermometer","shortname":":thermometer:","category":"objects","emoji_order":"673","aliases":[],"aliases_ascii":[],"keywords":["object","science","health","hot","hot"]},"label":{"unicode":"1f3f7","unicode_alternates":"1f3f7-fe0f","name":"label","shortname":":label:","category":"objects","emoji_order":"674","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bookmark":{"unicode":"1f516","unicode_alternates":"","name":"bookmark","shortname":":bookmark:","category":"objects","emoji_order":"675","aliases":[],"aliases_ascii":[],"keywords":["object","book"]},"toilet":{"unicode":"1f6bd","unicode_alternates":"","name":"toilet","shortname":":toilet:","category":"objects","emoji_order":"676","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"shower":{"unicode":"1f6bf","unicode_alternates":"","name":"shower","shortname":":shower:","category":"objects","emoji_order":"677","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom"]},"bathtub":{"unicode":"1f6c1","unicode_alternates":"","name":"bathtub","shortname":":bathtub:","category":"objects","emoji_order":"678","aliases":[],"aliases_ascii":[],"keywords":["object","bathroom","tired","steam","steam"]},"key":{"unicode":"1f511","unicode_alternates":"","name":"key","shortname":":key:","category":"objects","emoji_order":"679","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"key2":{"unicode":"1f5dd","unicode_alternates":"1f5dd-fe0f","name":"old key","shortname":":key2:","category":"objects","emoji_order":"680","aliases":[":old_key:"],"aliases_ascii":[],"keywords":["object","lock"]},"couch":{"unicode":"1f6cb","unicode_alternates":"1f6cb-fe0f","name":"couch and lamp","shortname":":couch:","category":"objects","emoji_order":"681","aliases":[":couch_and_lamp:"],"aliases_ascii":[],"keywords":["object"]},"sleeping_accommodation":{"unicode":"1f6cc","unicode_alternates":"","name":"sleeping accommodation","shortname":":sleeping_accommodation:","category":"objects","emoji_order":"682","aliases":[],"aliases_ascii":[],"keywords":["tired"]},"bed":{"unicode":"1f6cf","unicode_alternates":"1f6cf-fe0f","name":"bed","shortname":":bed:","category":"objects","emoji_order":"683","aliases":[],"aliases_ascii":[],"keywords":["object","tired"]},"door":{"unicode":"1f6aa","unicode_alternates":"","name":"door","shortname":":door:","category":"objects","emoji_order":"684","aliases":[],"aliases_ascii":[],"keywords":["object"]},"bellhop":{"unicode":"1f6ce","unicode_alternates":"1f6ce-fe0f","name":"bellhop bell","shortname":":bellhop:","category":"objects","emoji_order":"685","aliases":[":bellhop_bell:"],"aliases_ascii":[],"keywords":["object"]},"frame_photo":{"unicode":"1f5bc","unicode_alternates":"1f5bc-fe0f","name":"frame with picture","shortname":":frame_photo:","category":"objects","emoji_order":"686","aliases":[":frame_with_picture:"],"aliases_ascii":[],"keywords":["travel","vacation"]},"map":{"unicode":"1f5fa","unicode_alternates":"1f5fa-fe0f","name":"world map","shortname":":map:","category":"objects","emoji_order":"687","aliases":[":world_map:"],"aliases_ascii":[],"keywords":["travel","map","vacation"]},"beach_umbrella":{"unicode":"26f1","unicode_alternates":"26f1-fe0f","name":"umbrella on ground","shortname":":beach_umbrella:","category":"objects","emoji_order":"688","aliases":[":umbrella_on_ground:"],"aliases_ascii":[],"keywords":["travel","vacation","tropical"]},"moyai":{"unicode":"1f5ff","unicode_alternates":"","name":"moyai","shortname":":moyai:","category":"objects","emoji_order":"689","aliases":[],"aliases_ascii":[],"keywords":["travel","vacation"]},"shopping_bags":{"unicode":"1f6cd","unicode_alternates":"1f6cd-fe0f","name":"shopping bags","shortname":":shopping_bags:","category":"objects","emoji_order":"690","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","parties","parties"]},"balloon":{"unicode":"1f388","unicode_alternates":"","name":"balloon","shortname":":balloon:","category":"objects","emoji_order":"691","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","good","good","parties","parties"]},"flags":{"unicode":"1f38f","unicode_alternates":"","name":"carp streamer","shortname":":flags:","category":"objects","emoji_order":"692","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"ribbon":{"unicode":"1f380","unicode_alternates":"","name":"ribbon","shortname":":ribbon:","category":"objects","emoji_order":"693","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday"]},"gift":{"unicode":"1f381","unicode_alternates":"","name":"wrapped present","shortname":":gift:","category":"objects","emoji_order":"694","aliases":[],"aliases_ascii":[],"keywords":["object","gift","birthday","holidays","christmas","parties","parties"]},"confetti_ball":{"unicode":"1f38a","unicode_alternates":"","name":"confetti ball","shortname":":confetti_ball:","category":"objects","emoji_order":"695","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","girls night","girls night","boys night","boys night","parties","parties"]},"tada":{"unicode":"1f389","unicode_alternates":"","name":"party popper","shortname":":tada:","category":"objects","emoji_order":"696","aliases":[],"aliases_ascii":[],"keywords":["object","birthday","holidays","cheers","good","good","girls night","girls night","boys night","boys night","parties","parties"]},"dolls":{"unicode":"1f38e","unicode_alternates":"","name":"japanese dolls","shortname":":dolls:","category":"objects","emoji_order":"697","aliases":[],"aliases_ascii":[],"keywords":["people","japan"]},"wind_chime":{"unicode":"1f390","unicode_alternates":"","name":"wind chime","shortname":":wind_chime:","category":"objects","emoji_order":"698","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"crossed_flags":{"unicode":"1f38c","unicode_alternates":"","name":"crossed flags","shortname":":crossed_flags:","category":"objects","emoji_order":"699","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"izakaya_lantern":{"unicode":"1f3ee","unicode_alternates":"","name":"izakaya lantern","shortname":":izakaya_lantern:","category":"objects","emoji_order":"700","aliases":[],"aliases_ascii":[],"keywords":["object","japan"]},"envelope":{"unicode":"2709","unicode_alternates":"2709-fe0f","name":"envelope","shortname":":envelope:","category":"objects","emoji_order":"701","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"envelope_with_arrow":{"unicode":"1f4e9","unicode_alternates":"","name":"envelope with downwards arrow above","shortname":":envelope_with_arrow:","category":"objects","emoji_order":"702","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"incoming_envelope":{"unicode":"1f4e8","unicode_alternates":"","name":"incoming envelope","shortname":":incoming_envelope:","category":"objects","emoji_order":"703","aliases":[],"aliases_ascii":[],"keywords":["object"]},"e-mail":{"unicode":"1f4e7","unicode_alternates":"","name":"e-mail symbol","shortname":":e-mail:","category":"objects","emoji_order":"704","aliases":[":email:"],"aliases_ascii":[],"keywords":["office"]},"love_letter":{"unicode":"1f48c","unicode_alternates":"","name":"love letter","shortname":":love_letter:","category":"objects","emoji_order":"705","aliases":[],"aliases_ascii":[],"keywords":["object"]},"postbox":{"unicode":"1f4ee","unicode_alternates":"","name":"postbox","shortname":":postbox:","category":"objects","emoji_order":"706","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_closed":{"unicode":"1f4ea","unicode_alternates":"","name":"closed mailbox with lowered flag","shortname":":mailbox_closed:","category":"objects","emoji_order":"707","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"mailbox":{"unicode":"1f4eb","unicode_alternates":"","name":"closed mailbox with raised flag","shortname":":mailbox:","category":"objects","emoji_order":"708","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_with_mail":{"unicode":"1f4ec","unicode_alternates":"","name":"open mailbox with raised flag","shortname":":mailbox_with_mail:","category":"objects","emoji_order":"709","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mailbox_with_no_mail":{"unicode":"1f4ed","unicode_alternates":"","name":"open mailbox with lowered flag","shortname":":mailbox_with_no_mail:","category":"objects","emoji_order":"710","aliases":[],"aliases_ascii":[],"keywords":["object"]},"package":{"unicode":"1f4e6","unicode_alternates":"","name":"package","shortname":":package:","category":"objects","emoji_order":"711","aliases":[],"aliases_ascii":[],"keywords":["object","gift","office"]},"postal_horn":{"unicode":"1f4ef","unicode_alternates":"","name":"postal horn","shortname":":postal_horn:","category":"objects","emoji_order":"712","aliases":[],"aliases_ascii":[],"keywords":["object"]},"inbox_tray":{"unicode":"1f4e5","unicode_alternates":"","name":"inbox tray","shortname":":inbox_tray:","category":"objects","emoji_order":"713","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"outbox_tray":{"unicode":"1f4e4","unicode_alternates":"","name":"outbox tray","shortname":":outbox_tray:","category":"objects","emoji_order":"714","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"scroll":{"unicode":"1f4dc","unicode_alternates":"","name":"scroll","shortname":":scroll:","category":"objects","emoji_order":"715","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"page_with_curl":{"unicode":"1f4c3","unicode_alternates":"","name":"page with curl","shortname":":page_with_curl:","category":"objects","emoji_order":"716","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"bookmark_tabs":{"unicode":"1f4d1","unicode_alternates":"","name":"bookmark tabs","shortname":":bookmark_tabs:","category":"objects","emoji_order":"717","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"bar_chart":{"unicode":"1f4ca","unicode_alternates":"","name":"bar chart","shortname":":bar_chart:","category":"objects","emoji_order":"718","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"chart_with_upwards_trend":{"unicode":"1f4c8","unicode_alternates":"","name":"chart with upwards trend","shortname":":chart_with_upwards_trend:","category":"objects","emoji_order":"719","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"chart_with_downwards_trend":{"unicode":"1f4c9","unicode_alternates":"","name":"chart with downwards trend","shortname":":chart_with_downwards_trend:","category":"objects","emoji_order":"720","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"page_facing_up":{"unicode":"1f4c4","unicode_alternates":"","name":"page facing up","shortname":":page_facing_up:","category":"objects","emoji_order":"721","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"date":{"unicode":"1f4c5","unicode_alternates":"","name":"calendar","shortname":":date:","category":"objects","emoji_order":"722","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"calendar":{"unicode":"1f4c6","unicode_alternates":"","name":"tear-off calendar","shortname":":calendar:","category":"objects","emoji_order":"723","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"calendar_spiral":{"unicode":"1f5d3","unicode_alternates":"1f5d3-fe0f","name":"spiral calendar pad","shortname":":calendar_spiral:","category":"objects","emoji_order":"724","aliases":[":spiral_calendar_pad:"],"aliases_ascii":[],"keywords":["object","office"]},"card_index":{"unicode":"1f4c7","unicode_alternates":"","name":"card index","shortname":":card_index:","category":"objects","emoji_order":"725","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"card_box":{"unicode":"1f5c3","unicode_alternates":"1f5c3-fe0f","name":"card file box","shortname":":card_box:","category":"objects","emoji_order":"726","aliases":[":card_file_box:"],"aliases_ascii":[],"keywords":["object","work","office"]},"ballot_box":{"unicode":"1f5f3","unicode_alternates":"1f5f3-fe0f","name":"ballot box with ballot","shortname":":ballot_box:","category":"objects","emoji_order":"727","aliases":[":ballot_box_with_ballot:"],"aliases_ascii":[],"keywords":["object","office"]},"file_cabinet":{"unicode":"1f5c4","unicode_alternates":"1f5c4-fe0f","name":"file cabinet","shortname":":file_cabinet:","category":"objects","emoji_order":"728","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"clipboard":{"unicode":"1f4cb","unicode_alternates":"","name":"clipboard","shortname":":clipboard:","category":"objects","emoji_order":"729","aliases":[],"aliases_ascii":[],"keywords":["object","work","office","write"]},"notepad_spiral":{"unicode":"1f5d2","unicode_alternates":"1f5d2-fe0f","name":"spiral note pad","shortname":":notepad_spiral:","category":"objects","emoji_order":"730","aliases":[":spiral_note_pad:"],"aliases_ascii":[],"keywords":["work","office","write"]},"file_folder":{"unicode":"1f4c1","unicode_alternates":"","name":"file folder","shortname":":file_folder:","category":"objects","emoji_order":"731","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"open_file_folder":{"unicode":"1f4c2","unicode_alternates":"","name":"open file folder","shortname":":open_file_folder:","category":"objects","emoji_order":"732","aliases":[],"aliases_ascii":[],"keywords":["work","office"]},"dividers":{"unicode":"1f5c2","unicode_alternates":"1f5c2-fe0f","name":"card index dividers","shortname":":dividers:","category":"objects","emoji_order":"733","aliases":[":card_index_dividers:"],"aliases_ascii":[],"keywords":["work","office"]},"newspaper2":{"unicode":"1f5de","unicode_alternates":"1f5de-fe0f","name":"rolled-up newspaper","shortname":":newspaper2:","category":"objects","emoji_order":"734","aliases":[":rolled_up_newspaper:"],"aliases_ascii":[],"keywords":["office","write"]},"newspaper":{"unicode":"1f4f0","unicode_alternates":"","name":"newspaper","shortname":":newspaper:","category":"objects","emoji_order":"735","aliases":[],"aliases_ascii":[],"keywords":["office","write"]},"notebook":{"unicode":"1f4d3","unicode_alternates":"","name":"notebook","shortname":":notebook:","category":"objects","emoji_order":"736","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"closed_book":{"unicode":"1f4d5","unicode_alternates":"","name":"closed book","shortname":":closed_book:","category":"objects","emoji_order":"737","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"green_book":{"unicode":"1f4d7","unicode_alternates":"","name":"green book","shortname":":green_book:","category":"objects","emoji_order":"738","aliases":[],"aliases_ascii":[],"keywords":["object","office","book"]},"blue_book":{"unicode":"1f4d8","unicode_alternates":"","name":"blue book","shortname":":blue_book:","category":"objects","emoji_order":"739","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"orange_book":{"unicode":"1f4d9","unicode_alternates":"","name":"orange book","shortname":":orange_book:","category":"objects","emoji_order":"740","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"notebook_with_decorative_cover":{"unicode":"1f4d4","unicode_alternates":"","name":"notebook with decorative cover","shortname":":notebook_with_decorative_cover:","category":"objects","emoji_order":"741","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"ledger":{"unicode":"1f4d2","unicode_alternates":"","name":"ledger","shortname":":ledger:","category":"objects","emoji_order":"742","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"books":{"unicode":"1f4da","unicode_alternates":"","name":"books","shortname":":books:","category":"objects","emoji_order":"743","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"book":{"unicode":"1f4d6","unicode_alternates":"","name":"open book","shortname":":book:","category":"objects","emoji_order":"744","aliases":[],"aliases_ascii":[],"keywords":["object","office","write","book"]},"link":{"unicode":"1f517","unicode_alternates":"","name":"link symbol","shortname":":link:","category":"objects","emoji_order":"745","aliases":[],"aliases_ascii":[],"keywords":["symbol","office"]},"paperclip":{"unicode":"1f4ce","unicode_alternates":"","name":"paperclip","shortname":":paperclip:","category":"objects","emoji_order":"746","aliases":[],"aliases_ascii":[],"keywords":["object","work","office"]},"paperclips":{"unicode":"1f587","unicode_alternates":"1f587-fe0f","name":"linked paperclips","shortname":":paperclips:","category":"objects","emoji_order":"747","aliases":[":linked_paperclips:"],"aliases_ascii":[],"keywords":["object","work","office"]},"scissors":{"unicode":"2702","unicode_alternates":"2702-fe0f","name":"black scissors","shortname":":scissors:","category":"objects","emoji_order":"748","aliases":[],"aliases_ascii":[],"keywords":["object","tool","weapon","office"]},"triangular_ruler":{"unicode":"1f4d0","unicode_alternates":"","name":"triangular ruler","shortname":":triangular_ruler:","category":"objects","emoji_order":"749","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"straight_ruler":{"unicode":"1f4cf","unicode_alternates":"","name":"straight ruler","shortname":":straight_ruler:","category":"objects","emoji_order":"750","aliases":[],"aliases_ascii":[],"keywords":["object","tool","office"]},"pushpin":{"unicode":"1f4cc","unicode_alternates":"","name":"pushpin","shortname":":pushpin:","category":"objects","emoji_order":"751","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"round_pushpin":{"unicode":"1f4cd","unicode_alternates":"","name":"round pushpin","shortname":":round_pushpin:","category":"objects","emoji_order":"752","aliases":[],"aliases_ascii":[],"keywords":["object","office"]},"triangular_flag_on_post":{"unicode":"1f6a9","unicode_alternates":"","name":"triangular flag on post","shortname":":triangular_flag_on_post:","category":"objects","emoji_order":"753","aliases":[],"aliases_ascii":[],"keywords":["object"]},"flag_white":{"unicode":"1f3f3","unicode_alternates":"1f3f3-fe0f","name":"waving white flag","shortname":":flag_white:","category":"objects","emoji_order":"754","aliases":[":waving_white_flag:"],"aliases_ascii":[],"keywords":["object"]},"flag_black":{"unicode":"1f3f4","unicode_alternates":"","name":"waving black flag","shortname":":flag_black:","category":"objects","emoji_order":"755","aliases":[":waving_black_flag:"],"aliases_ascii":[],"keywords":["object"]},"closed_lock_with_key":{"unicode":"1f510","unicode_alternates":"","name":"closed lock with key","shortname":":closed_lock_with_key:","category":"objects","emoji_order":"756","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"lock":{"unicode":"1f512","unicode_alternates":"","name":"lock","shortname":":lock:","category":"objects","emoji_order":"757","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"unlock":{"unicode":"1f513","unicode_alternates":"","name":"open lock","shortname":":unlock:","category":"objects","emoji_order":"758","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"lock_with_ink_pen":{"unicode":"1f50f","unicode_alternates":"","name":"lock with ink pen","shortname":":lock_with_ink_pen:","category":"objects","emoji_order":"759","aliases":[],"aliases_ascii":[],"keywords":["object","lock"]},"pen_ballpoint":{"unicode":"1f58a","unicode_alternates":"1f58a-fe0f","name":"lower left ballpoint pen","shortname":":pen_ballpoint:","category":"objects","emoji_order":"760","aliases":[":lower_left_ballpoint_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"pen_fountain":{"unicode":"1f58b","unicode_alternates":"1f58b-fe0f","name":"lower left fountain pen","shortname":":pen_fountain:","category":"objects","emoji_order":"761","aliases":[":lower_left_fountain_pen:"],"aliases_ascii":[],"keywords":["object","office","write"]},"black_nib":{"unicode":"2712","unicode_alternates":"2712-fe0f","name":"black nib","shortname":":black_nib:","category":"objects","emoji_order":"762","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"pencil":{"unicode":"1f4dd","unicode_alternates":"","name":"memo","shortname":":pencil:","category":"objects","emoji_order":"763","aliases":[],"aliases_ascii":[],"keywords":["work","office","write"]},"pencil2":{"unicode":"270f","unicode_alternates":"270f-fe0f","name":"pencil","shortname":":pencil2:","category":"objects","emoji_order":"764","aliases":[],"aliases_ascii":[],"keywords":["object","office","write"]},"crayon":{"unicode":"1f58d","unicode_alternates":"1f58d-fe0f","name":"lower left crayon","shortname":":crayon:","category":"objects","emoji_order":"765","aliases":[":lower_left_crayon:"],"aliases_ascii":[],"keywords":["object","office","write"]},"paintbrush":{"unicode":"1f58c","unicode_alternates":"1f58c-fe0f","name":"lower left paintbrush","shortname":":paintbrush:","category":"objects","emoji_order":"766","aliases":[":lower_left_paintbrush:"],"aliases_ascii":[],"keywords":["object","office","write"]},"mag":{"unicode":"1f50d","unicode_alternates":"","name":"left-pointing magnifying glass","shortname":":mag:","category":"objects","emoji_order":"767","aliases":[],"aliases_ascii":[],"keywords":["object"]},"mag_right":{"unicode":"1f50e","unicode_alternates":"","name":"right-pointing magnifying glass","shortname":":mag_right:","category":"objects","emoji_order":"768","aliases":[],"aliases_ascii":[],"keywords":["object"]},"heart":{"unicode":"2764","unicode_alternates":"2764-fe0f","name":"heavy black heart","shortname":":heart:","category":"symbols","emoji_order":"769","aliases":[],"aliases_ascii":["<3"],"keywords":["love","symbol","parties","parties"]},"yellow_heart":{"unicode":"1f49b","unicode_alternates":"","name":"yellow heart","shortname":":yellow_heart:","category":"symbols","emoji_order":"770","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"green_heart":{"unicode":"1f49a","unicode_alternates":"","name":"green heart","shortname":":green_heart:","category":"symbols","emoji_order":"771","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"blue_heart":{"unicode":"1f499","unicode_alternates":"","name":"blue heart","shortname":":blue_heart:","category":"symbols","emoji_order":"772","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"purple_heart":{"unicode":"1f49c","unicode_alternates":"","name":"purple heart","shortname":":purple_heart:","category":"symbols","emoji_order":"773","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"broken_heart":{"unicode":"1f494","unicode_alternates":"","name":"broken heart","shortname":":broken_heart:","category":"symbols","emoji_order":"774","aliases":[],"aliases_ascii":["<\/3"],"keywords":["love","symbol","heartbreak","heartbreak"]},"heart_exclamation":{"unicode":"2763","unicode_alternates":"2763-fe0f","name":"heavy heart exclamation mark ornament","shortname":":heart_exclamation:","category":"symbols","emoji_order":"775","aliases":[":heavy_heart_exclamation_mark_ornament:"],"aliases_ascii":[],"keywords":["love","symbol"]},"two_hearts":{"unicode":"1f495","unicode_alternates":"","name":"two hearts","shortname":":two_hearts:","category":"symbols","emoji_order":"776","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"revolving_hearts":{"unicode":"1f49e","unicode_alternates":"","name":"revolving hearts","shortname":":revolving_hearts:","category":"symbols","emoji_order":"777","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heartbeat":{"unicode":"1f493","unicode_alternates":"","name":"beating heart","shortname":":heartbeat:","category":"symbols","emoji_order":"778","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"heartpulse":{"unicode":"1f497","unicode_alternates":"","name":"growing heart","shortname":":heartpulse:","category":"symbols","emoji_order":"779","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"sparkling_heart":{"unicode":"1f496","unicode_alternates":"","name":"sparkling heart","shortname":":sparkling_heart:","category":"symbols","emoji_order":"780","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","girls night","girls night"]},"cupid":{"unicode":"1f498","unicode_alternates":"","name":"heart with arrow","shortname":":cupid:","category":"symbols","emoji_order":"781","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"gift_heart":{"unicode":"1f49d","unicode_alternates":"","name":"heart with ribbon","shortname":":gift_heart:","category":"symbols","emoji_order":"782","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","condolence","condolence"]},"heart_decoration":{"unicode":"1f49f","unicode_alternates":"","name":"heart decoration","shortname":":heart_decoration:","category":"symbols","emoji_order":"783","aliases":[],"aliases_ascii":[],"keywords":["love","symbol"]},"peace":{"unicode":"262e","unicode_alternates":"262e-fe0f","name":"peace symbol","shortname":":peace:","category":"symbols","emoji_order":"784","aliases":[":peace_symbol:"],"aliases_ascii":[],"keywords":["symbol","peace","peace","drugs","drugs"]},"cross":{"unicode":"271d","unicode_alternates":"271d-fe0f","name":"latin cross","shortname":":cross:","category":"symbols","emoji_order":"785","aliases":[":latin_cross:"],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_and_crescent":{"unicode":"262a","unicode_alternates":"262a-fe0f","name":"star and crescent","shortname":":star_and_crescent:","category":"symbols","emoji_order":"786","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"om_symbol":{"unicode":"1f549","unicode_alternates":"1f549-fe0f","name":"om symbol","shortname":":om_symbol:","category":"symbols","emoji_order":"787","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"wheel_of_dharma":{"unicode":"2638","unicode_alternates":"2638-fe0f","name":"wheel of dharma","shortname":":wheel_of_dharma:","category":"symbols","emoji_order":"788","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"star_of_david":{"unicode":"2721","unicode_alternates":"2721-fe0f","name":"star of david","shortname":":star_of_david:","category":"symbols","emoji_order":"789","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"six_pointed_star":{"unicode":"1f52f","unicode_alternates":"","name":"six pointed star with middle dot","shortname":":six_pointed_star:","category":"symbols","emoji_order":"790","aliases":[],"aliases_ascii":[],"keywords":["religion","jew","star","symbol"]},"menorah":{"unicode":"1f54e","unicode_alternates":"","name":"menorah with nine branches","shortname":":menorah:","category":"symbols","emoji_order":"791","aliases":[],"aliases_ascii":[],"keywords":["religion","object","jew","symbol","holidays"]},"yin_yang":{"unicode":"262f","unicode_alternates":"262f-fe0f","name":"yin yang","shortname":":yin_yang:","category":"symbols","emoji_order":"792","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"orthodox_cross":{"unicode":"2626","unicode_alternates":"2626-fe0f","name":"orthodox cross","shortname":":orthodox_cross:","category":"symbols","emoji_order":"793","aliases":[],"aliases_ascii":[],"keywords":["religion","symbol"]},"place_of_worship":{"unicode":"1f6d0","unicode_alternates":"","name":"place of worship","shortname":":place_of_worship:","category":"symbols","emoji_order":"794","aliases":[":worship_symbol:"],"aliases_ascii":[],"keywords":["religion","symbol","pray","pray"]},"ophiuchus":{"unicode":"26ce","unicode_alternates":"","name":"ophiuchus","shortname":":ophiuchus:","category":"symbols","emoji_order":"795","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"aries":{"unicode":"2648","unicode_alternates":"2648-fe0f","name":"aries","shortname":":aries:","category":"symbols","emoji_order":"796","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"taurus":{"unicode":"2649","unicode_alternates":"2649-fe0f","name":"taurus","shortname":":taurus:","category":"symbols","emoji_order":"797","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"gemini":{"unicode":"264a","unicode_alternates":"264a-fe0f","name":"gemini","shortname":":gemini:","category":"symbols","emoji_order":"798","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"cancer":{"unicode":"264b","unicode_alternates":"264b-fe0f","name":"cancer","shortname":":cancer:","category":"symbols","emoji_order":"799","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"leo":{"unicode":"264c","unicode_alternates":"264c-fe0f","name":"leo","shortname":":leo:","category":"symbols","emoji_order":"800","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"virgo":{"unicode":"264d","unicode_alternates":"264d-fe0f","name":"virgo","shortname":":virgo:","category":"symbols","emoji_order":"801","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"libra":{"unicode":"264e","unicode_alternates":"264e-fe0f","name":"libra","shortname":":libra:","category":"symbols","emoji_order":"802","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"scorpius":{"unicode":"264f","unicode_alternates":"264f-fe0f","name":"scorpius","shortname":":scorpius:","category":"symbols","emoji_order":"803","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"sagittarius":{"unicode":"2650","unicode_alternates":"2650-fe0f","name":"sagittarius","shortname":":sagittarius:","category":"symbols","emoji_order":"804","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"capricorn":{"unicode":"2651","unicode_alternates":"2651-fe0f","name":"capricorn","shortname":":capricorn:","category":"symbols","emoji_order":"805","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"aquarius":{"unicode":"2652","unicode_alternates":"2652-fe0f","name":"aquarius","shortname":":aquarius:","category":"symbols","emoji_order":"806","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"pisces":{"unicode":"2653","unicode_alternates":"2653-fe0f","name":"pisces","shortname":":pisces:","category":"symbols","emoji_order":"807","aliases":[],"aliases_ascii":[],"keywords":["zodiac","symbol"]},"id":{"unicode":"1f194","unicode_alternates":"","name":"squared id","shortname":":id:","category":"symbols","emoji_order":"808","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"atom":{"unicode":"269b","unicode_alternates":"269b-fe0f","name":"atom symbol","shortname":":atom:","category":"symbols","emoji_order":"809","aliases":[":atom_symbol:"],"aliases_ascii":[],"keywords":["symbol","science"]},"u7a7a":{"unicode":"1f233","unicode_alternates":"","name":"squared cjk unified ideograph-7a7a","shortname":":u7a7a:","category":"symbols","emoji_order":"810","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u5272":{"unicode":"1f239","unicode_alternates":"","name":"squared cjk unified ideograph-5272","shortname":":u5272:","category":"symbols","emoji_order":"811","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radioactive":{"unicode":"2622","unicode_alternates":"2622-fe0f","name":"radioactive sign","shortname":":radioactive:","category":"symbols","emoji_order":"812","aliases":[":radioactive_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"biohazard":{"unicode":"2623","unicode_alternates":"2623-fe0f","name":"biohazard sign","shortname":":biohazard:","category":"symbols","emoji_order":"813","aliases":[":biohazard_sign:"],"aliases_ascii":[],"keywords":["symbol","science"]},"mobile_phone_off":{"unicode":"1f4f4","unicode_alternates":"","name":"mobile phone off","shortname":":mobile_phone_off:","category":"symbols","emoji_order":"814","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vibration_mode":{"unicode":"1f4f3","unicode_alternates":"","name":"vibration mode","shortname":":vibration_mode:","category":"symbols","emoji_order":"815","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6709":{"unicode":"1f236","unicode_alternates":"","name":"squared cjk unified ideograph-6709","shortname":":u6709:","category":"symbols","emoji_order":"816","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7121":{"unicode":"1f21a","unicode_alternates":"1f21a-fe0f","name":"squared cjk unified ideograph-7121","shortname":":u7121:","category":"symbols","emoji_order":"817","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u7533":{"unicode":"1f238","unicode_alternates":"","name":"squared cjk unified ideograph-7533","shortname":":u7533:","category":"symbols","emoji_order":"818","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u55b6":{"unicode":"1f23a","unicode_alternates":"","name":"squared cjk unified ideograph-55b6","shortname":":u55b6:","category":"symbols","emoji_order":"819","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6708":{"unicode":"1f237","unicode_alternates":"1f237-fe0f","name":"squared cjk unified ideograph-6708","shortname":":u6708:","category":"symbols","emoji_order":"820","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_pointed_black_star":{"unicode":"2734","unicode_alternates":"2734-fe0f","name":"eight pointed black star","shortname":":eight_pointed_black_star:","category":"symbols","emoji_order":"821","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"vs":{"unicode":"1f19a","unicode_alternates":"","name":"squared vs","shortname":":vs:","category":"symbols","emoji_order":"822","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"accept":{"unicode":"1f251","unicode_alternates":"","name":"circled ideograph accept","shortname":":accept:","category":"symbols","emoji_order":"823","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"white_flower":{"unicode":"1f4ae","unicode_alternates":"","name":"white flower","shortname":":white_flower:","category":"symbols","emoji_order":"824","aliases":[],"aliases_ascii":[],"keywords":["flower","symbol"]},"ideograph_advantage":{"unicode":"1f250","unicode_alternates":"","name":"circled ideograph advantage","shortname":":ideograph_advantage:","category":"symbols","emoji_order":"825","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"secret":{"unicode":"3299","unicode_alternates":"3299-fe0f","name":"circled ideograph secret","shortname":":secret:","category":"symbols","emoji_order":"826","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"congratulations":{"unicode":"3297","unicode_alternates":"3297-fe0f","name":"circled ideograph congratulation","shortname":":congratulations:","category":"symbols","emoji_order":"827","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u5408":{"unicode":"1f234","unicode_alternates":"","name":"squared cjk unified ideograph-5408","shortname":":u5408:","category":"symbols","emoji_order":"828","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u6e80":{"unicode":"1f235","unicode_alternates":"","name":"squared cjk unified ideograph-6e80","shortname":":u6e80:","category":"symbols","emoji_order":"829","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"u7981":{"unicode":"1f232","unicode_alternates":"","name":"squared cjk unified ideograph-7981","shortname":":u7981:","category":"symbols","emoji_order":"830","aliases":[],"aliases_ascii":[],"keywords":["japan","symbol"]},"a":{"unicode":"1f170","unicode_alternates":"","name":"negative squared latin capital letter a","shortname":":a:","category":"symbols","emoji_order":"831","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"b":{"unicode":"1f171","unicode_alternates":"","name":"negative squared latin capital letter b","shortname":":b:","category":"symbols","emoji_order":"832","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ab":{"unicode":"1f18e","unicode_alternates":"","name":"negative squared ab","shortname":":ab:","category":"symbols","emoji_order":"833","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cl":{"unicode":"1f191","unicode_alternates":"","name":"squared cl","shortname":":cl:","category":"symbols","emoji_order":"834","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"o2":{"unicode":"1f17e","unicode_alternates":"","name":"negative squared latin capital letter o","shortname":":o2:","category":"symbols","emoji_order":"835","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"sos":{"unicode":"1f198","unicode_alternates":"","name":"squared sos","shortname":":sos:","category":"symbols","emoji_order":"836","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_entry":{"unicode":"26d4","unicode_alternates":"26d4-fe0f","name":"no entry","shortname":":no_entry:","category":"symbols","emoji_order":"837","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"name_badge":{"unicode":"1f4db","unicode_alternates":"","name":"name badge","shortname":":name_badge:","category":"symbols","emoji_order":"838","aliases":[],"aliases_ascii":[],"keywords":["work"]},"no_entry_sign":{"unicode":"1f6ab","unicode_alternates":"","name":"no entry sign","shortname":":no_entry_sign:","category":"symbols","emoji_order":"839","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"x":{"unicode":"274c","unicode_alternates":"","name":"cross mark","shortname":":x:","category":"symbols","emoji_order":"840","aliases":[],"aliases_ascii":[],"keywords":["symbol","sol","sol"]},"o":{"unicode":"2b55","unicode_alternates":"2b55-fe0f","name":"heavy large circle","shortname":":o:","category":"symbols","emoji_order":"841","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"anger":{"unicode":"1f4a2","unicode_alternates":"","name":"anger symbol","shortname":":anger:","category":"symbols","emoji_order":"842","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"hotsprings":{"unicode":"2668","unicode_alternates":"2668-fe0f","name":"hot springs","shortname":":hotsprings:","category":"symbols","emoji_order":"843","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_pedestrians":{"unicode":"1f6b7","unicode_alternates":"","name":"no pedestrians","shortname":":no_pedestrians:","category":"symbols","emoji_order":"844","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"do_not_litter":{"unicode":"1f6af","unicode_alternates":"","name":"do not litter symbol","shortname":":do_not_litter:","category":"symbols","emoji_order":"845","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_bicycles":{"unicode":"1f6b3","unicode_alternates":"","name":"no bicycles","shortname":":no_bicycles:","category":"symbols","emoji_order":"846","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"non-potable_water":{"unicode":"1f6b1","unicode_alternates":"","name":"non-potable water symbol","shortname":":non-potable_water:","category":"symbols","emoji_order":"847","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"underage":{"unicode":"1f51e","unicode_alternates":"","name":"no one under eighteen symbol","shortname":":underage:","category":"symbols","emoji_order":"848","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_mobile_phones":{"unicode":"1f4f5","unicode_alternates":"","name":"no mobile phones","shortname":":no_mobile_phones:","category":"symbols","emoji_order":"849","aliases":[],"aliases_ascii":[],"keywords":["symbol","phone"]},"exclamation":{"unicode":"2757","unicode_alternates":"2757-fe0f","name":"heavy exclamation mark symbol","shortname":":exclamation:","category":"symbols","emoji_order":"850","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"grey_exclamation":{"unicode":"2755","unicode_alternates":"","name":"white exclamation mark ornament","shortname":":grey_exclamation:","category":"symbols","emoji_order":"851","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"question":{"unicode":"2753","unicode_alternates":"","name":"black question mark ornament","shortname":":question:","category":"symbols","emoji_order":"852","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation","wth","wth"]},"grey_question":{"unicode":"2754","unicode_alternates":"","name":"white question mark ornament","shortname":":grey_question:","category":"symbols","emoji_order":"853","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"bangbang":{"unicode":"203c","unicode_alternates":"203c-fe0f","name":"double exclamation mark","shortname":":bangbang:","category":"symbols","emoji_order":"854","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"interrobang":{"unicode":"2049","unicode_alternates":"2049-fe0f","name":"exclamation question mark","shortname":":interrobang:","category":"symbols","emoji_order":"855","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"100":{"unicode":"1f4af","unicode_alternates":"","name":"hundred points symbol","shortname":":100:","category":"symbols","emoji_order":"856","aliases":[],"aliases_ascii":[],"keywords":["symbol","wow","wow","win","win","perfect","perfect","parties","parties"]},"low_brightness":{"unicode":"1f505","unicode_alternates":"","name":"low brightness symbol","shortname":":low_brightness:","category":"symbols","emoji_order":"857","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"high_brightness":{"unicode":"1f506","unicode_alternates":"","name":"high brightness symbol","shortname":":high_brightness:","category":"symbols","emoji_order":"858","aliases":[],"aliases_ascii":[],"keywords":["symbol","sun"]},"trident":{"unicode":"1f531","unicode_alternates":"","name":"trident emblem","shortname":":trident:","category":"symbols","emoji_order":"859","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"fleur-de-lis":{"unicode":"269c","unicode_alternates":"269c-fe0f","name":"fleur-de-lis","shortname":":fleur-de-lis:","category":"symbols","emoji_order":"860","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"part_alternation_mark":{"unicode":"303d","unicode_alternates":"303d-fe0f","name":"part alternation mark","shortname":":part_alternation_mark:","category":"symbols","emoji_order":"861","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"warning":{"unicode":"26a0","unicode_alternates":"26a0-fe0f","name":"warning sign","shortname":":warning:","category":"symbols","emoji_order":"862","aliases":[],"aliases_ascii":[],"keywords":["symbol","punctuation"]},"children_crossing":{"unicode":"1f6b8","unicode_alternates":"","name":"children crossing","shortname":":children_crossing:","category":"symbols","emoji_order":"863","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"beginner":{"unicode":"1f530","unicode_alternates":"","name":"japanese symbol for beginner","shortname":":beginner:","category":"symbols","emoji_order":"864","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"recycle":{"unicode":"267b","unicode_alternates":"267b-fe0f","name":"black universal recycling symbol","shortname":":recycle:","category":"symbols","emoji_order":"865","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"u6307":{"unicode":"1f22f","unicode_alternates":"1f22f-fe0f","name":"squared cjk unified ideograph-6307","shortname":":u6307:","category":"symbols","emoji_order":"866","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"chart":{"unicode":"1f4b9","unicode_alternates":"","name":"chart with upwards trend and yen sign","shortname":":chart:","category":"symbols","emoji_order":"867","aliases":[],"aliases_ascii":[],"keywords":["symbol","money","money"]},"sparkle":{"unicode":"2747","unicode_alternates":"2747-fe0f","name":"sparkle","shortname":":sparkle:","category":"symbols","emoji_order":"868","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"eight_spoked_asterisk":{"unicode":"2733","unicode_alternates":"2733-fe0f","name":"eight spoked asterisk","shortname":":eight_spoked_asterisk:","category":"symbols","emoji_order":"869","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"negative_squared_cross_mark":{"unicode":"274e","unicode_alternates":"","name":"negative squared cross mark","shortname":":negative_squared_cross_mark:","category":"symbols","emoji_order":"870","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"white_check_mark":{"unicode":"2705","unicode_alternates":"","name":"white heavy check mark","shortname":":white_check_mark:","category":"symbols","emoji_order":"871","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"diamond_shape_with_a_dot_inside":{"unicode":"1f4a0","unicode_alternates":"","name":"diamond shape with a dot inside","shortname":":diamond_shape_with_a_dot_inside:","category":"symbols","emoji_order":"872","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cyclone":{"unicode":"1f300","unicode_alternates":"","name":"cyclone","shortname":":cyclone:","category":"symbols","emoji_order":"873","aliases":[],"aliases_ascii":[],"keywords":["symbol","drugs","drugs"]},"loop":{"unicode":"27bf","unicode_alternates":"","name":"double curly loop","shortname":":loop:","category":"symbols","emoji_order":"874","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"globe_with_meridians":{"unicode":"1f310","unicode_alternates":"","name":"globe with meridians","shortname":":globe_with_meridians:","category":"symbols","emoji_order":"875","aliases":[],"aliases_ascii":[],"keywords":["symbol","globe","globe"]},"m":{"unicode":"24c2","unicode_alternates":"24c2-fe0f","name":"circled latin capital letter m","shortname":":m:","category":"symbols","emoji_order":"876","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"atm":{"unicode":"1f3e7","unicode_alternates":"","name":"automated teller machine","shortname":":atm:","category":"symbols","emoji_order":"877","aliases":[],"aliases_ascii":[],"keywords":["electronics","symbol","money","money"]},"sa":{"unicode":"1f202","unicode_alternates":"1f202-fe0f","name":"squared katakana sa","shortname":":sa:","category":"symbols","emoji_order":"878","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"passport_control":{"unicode":"1f6c2","unicode_alternates":"","name":"passport control","shortname":":passport_control:","category":"symbols","emoji_order":"879","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"customs":{"unicode":"1f6c3","unicode_alternates":"","name":"customs","shortname":":customs:","category":"symbols","emoji_order":"880","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baggage_claim":{"unicode":"1f6c4","unicode_alternates":"","name":"baggage claim","shortname":":baggage_claim:","category":"symbols","emoji_order":"881","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"left_luggage":{"unicode":"1f6c5","unicode_alternates":"","name":"left luggage","shortname":":left_luggage:","category":"symbols","emoji_order":"882","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"wheelchair":{"unicode":"267f","unicode_alternates":"267f-fe0f","name":"wheelchair symbol","shortname":":wheelchair:","category":"symbols","emoji_order":"883","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"no_smoking":{"unicode":"1f6ad","unicode_alternates":"","name":"no smoking symbol","shortname":":no_smoking:","category":"symbols","emoji_order":"884","aliases":[],"aliases_ascii":[],"keywords":["symbol","smoking","smoking"]},"wc":{"unicode":"1f6be","unicode_alternates":"","name":"water closet","shortname":":wc:","category":"symbols","emoji_order":"885","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"parking":{"unicode":"1f17f","unicode_alternates":"1f17f-fe0f","name":"negative squared latin capital letter p","shortname":":parking:","category":"symbols","emoji_order":"886","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"potable_water":{"unicode":"1f6b0","unicode_alternates":"","name":"potable water symbol","shortname":":potable_water:","category":"symbols","emoji_order":"887","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"mens":{"unicode":"1f6b9","unicode_alternates":"","name":"mens symbol","shortname":":mens:","category":"symbols","emoji_order":"888","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"womens":{"unicode":"1f6ba","unicode_alternates":"","name":"womens symbol","shortname":":womens:","category":"symbols","emoji_order":"889","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"baby_symbol":{"unicode":"1f6bc","unicode_alternates":"","name":"baby symbol","shortname":":baby_symbol:","category":"symbols","emoji_order":"890","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"restroom":{"unicode":"1f6bb","unicode_alternates":"","name":"restroom","shortname":":restroom:","category":"symbols","emoji_order":"891","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"put_litter_in_its_place":{"unicode":"1f6ae","unicode_alternates":"","name":"put litter in its place symbol","shortname":":put_litter_in_its_place:","category":"symbols","emoji_order":"892","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cinema":{"unicode":"1f3a6","unicode_alternates":"","name":"cinema","shortname":":cinema:","category":"symbols","emoji_order":"893","aliases":[],"aliases_ascii":[],"keywords":["symbol","camera","movie"]},"signal_strength":{"unicode":"1f4f6","unicode_alternates":"","name":"antenna with bars","shortname":":signal_strength:","category":"symbols","emoji_order":"894","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"koko":{"unicode":"1f201","unicode_alternates":"","name":"squared katakana koko","shortname":":koko:","category":"symbols","emoji_order":"895","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ng":{"unicode":"1f196","unicode_alternates":"","name":"squared ng","shortname":":ng:","category":"symbols","emoji_order":"896","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"ok":{"unicode":"1f197","unicode_alternates":"","name":"squared ok","shortname":":ok:","category":"symbols","emoji_order":"897","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"up":{"unicode":"1f199","unicode_alternates":"","name":"squared up with exclamation mark","shortname":":up:","category":"symbols","emoji_order":"898","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"cool":{"unicode":"1f192","unicode_alternates":"","name":"squared cool","shortname":":cool:","category":"symbols","emoji_order":"899","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"new":{"unicode":"1f195","unicode_alternates":"","name":"squared new","shortname":":new:","category":"symbols","emoji_order":"900","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"free":{"unicode":"1f193","unicode_alternates":"","name":"squared free","shortname":":free:","category":"symbols","emoji_order":"901","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"zero":{"unicode":"0030-20e3","unicode_alternates":"0030-fe0f-20e3","name":"keycap digit zero","shortname":":zero:","category":"symbols","emoji_order":"902","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"one":{"unicode":"0031-20e3","unicode_alternates":"0031-fe0f-20e3","name":"keycap digit one","shortname":":one:","category":"symbols","emoji_order":"903","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"two":{"unicode":"0032-20e3","unicode_alternates":"0032-fe0f-20e3","name":"keycap digit two","shortname":":two:","category":"symbols","emoji_order":"904","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"three":{"unicode":"0033-20e3","unicode_alternates":"0033-fe0f-20e3","name":"keycap digit three","shortname":":three:","category":"symbols","emoji_order":"905","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"four":{"unicode":"0034-20e3","unicode_alternates":"0034-fe0f-20e3","name":"keycap digit four","shortname":":four:","category":"symbols","emoji_order":"906","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"five":{"unicode":"0035-20e3","unicode_alternates":"0035-fe0f-20e3","name":"keycap digit five","shortname":":five:","category":"symbols","emoji_order":"907","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"six":{"unicode":"0036-20e3","unicode_alternates":"0036-fe0f-20e3","name":"keycap digit six","shortname":":six:","category":"symbols","emoji_order":"908","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"seven":{"unicode":"0037-20e3","unicode_alternates":"0037-fe0f-20e3","name":"keycap digit seven","shortname":":seven:","category":"symbols","emoji_order":"909","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"eight":{"unicode":"0038-20e3","unicode_alternates":"0038-fe0f-20e3","name":"keycap digit eight","shortname":":eight:","category":"symbols","emoji_order":"910","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"nine":{"unicode":"0039-20e3","unicode_alternates":"0039-fe0f-20e3","name":"keycap digit nine","shortname":":nine:","category":"symbols","emoji_order":"911","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"ten":{"unicode":"1f51f","unicode_alternates":"","name":"keycap ten","shortname":":ten:","category":"symbols","emoji_order":"912","aliases":[],"aliases_ascii":[],"keywords":["number","math","symbol"]},"1234":{"unicode":"1f522","unicode_alternates":"","name":"input symbol for numbers","shortname":":1234:","category":"symbols","emoji_order":"913","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"arrow_forward":{"unicode":"25b6","unicode_alternates":"25b6-fe0f","name":"black right-pointing triangle","shortname":":arrow_forward:","category":"symbols","emoji_order":"914","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"pause_button":{"unicode":"23f8","unicode_alternates":"23f8-fe0f","name":"double vertical bar","shortname":":pause_button:","category":"symbols","emoji_order":"915","aliases":[":double_vertical_bar:"],"aliases_ascii":[],"keywords":["symbol"]},"play_pause":{"unicode":"23ef","unicode_alternates":"23ef-fe0f","name":"black right-pointing double triangle with double vertical bar","shortname":":play_pause:","category":"symbols","emoji_order":"916","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"stop_button":{"unicode":"23f9","unicode_alternates":"23f9-fe0f","name":"black square for stop","shortname":":stop_button:","category":"symbols","emoji_order":"917","aliases":[],"aliases_ascii":[],"keywords":["symbol","square","square"]},"record_button":{"unicode":"23fa","unicode_alternates":"23fa-fe0f","name":"black circle for record","shortname":":record_button:","category":"symbols","emoji_order":"918","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"track_next":{"unicode":"23ed","unicode_alternates":"23ed-fe0f","name":"black right-pointing double triangle with vertical bar","shortname":":track_next:","category":"symbols","emoji_order":"919","aliases":[":next_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"track_previous":{"unicode":"23ee","unicode_alternates":"23ee-fe0f","name":"black left-pointing double triangle with vertical bar","shortname":":track_previous:","category":"symbols","emoji_order":"920","aliases":[":previous_track:"],"aliases_ascii":[],"keywords":["arrow","symbol"]},"fast_forward":{"unicode":"23e9","unicode_alternates":"","name":"black right-pointing double triangle","shortname":":fast_forward:","category":"symbols","emoji_order":"921","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"rewind":{"unicode":"23ea","unicode_alternates":"","name":"black left-pointing double triangle","shortname":":rewind:","category":"symbols","emoji_order":"922","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"twisted_rightwards_arrows":{"unicode":"1f500","unicode_alternates":"","name":"twisted rightwards arrows","shortname":":twisted_rightwards_arrows:","category":"symbols","emoji_order":"923","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat":{"unicode":"1f501","unicode_alternates":"","name":"clockwise rightwards and leftwards open circle arrows","shortname":":repeat:","category":"symbols","emoji_order":"924","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"repeat_one":{"unicode":"1f502","unicode_alternates":"","name":"clockwise rightwards and leftwards open circle arrows with circled one overlay","shortname":":repeat_one:","category":"symbols","emoji_order":"925","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_backward":{"unicode":"25c0","unicode_alternates":"25c0-fe0f","name":"black left-pointing triangle","shortname":":arrow_backward:","category":"symbols","emoji_order":"926","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_up_small":{"unicode":"1f53c","unicode_alternates":"","name":"up-pointing small red triangle","shortname":":arrow_up_small:","category":"symbols","emoji_order":"927","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_down_small":{"unicode":"1f53d","unicode_alternates":"","name":"down-pointing small red triangle","shortname":":arrow_down_small:","category":"symbols","emoji_order":"928","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol","triangle","triangle"]},"arrow_double_up":{"unicode":"23eb","unicode_alternates":"","name":"black up-pointing double triangle","shortname":":arrow_double_up:","category":"symbols","emoji_order":"929","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_double_down":{"unicode":"23ec","unicode_alternates":"","name":"black down-pointing double triangle","shortname":":arrow_double_down:","category":"symbols","emoji_order":"930","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right":{"unicode":"27a1","unicode_alternates":"27a1-fe0f","name":"black rightwards arrow","shortname":":arrow_right:","category":"symbols","emoji_order":"931","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_left":{"unicode":"2b05","unicode_alternates":"2b05-fe0f","name":"leftwards black arrow","shortname":":arrow_left:","category":"symbols","emoji_order":"932","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up":{"unicode":"2b06","unicode_alternates":"2b06-fe0f","name":"upwards black arrow","shortname":":arrow_up:","category":"symbols","emoji_order":"933","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_down":{"unicode":"2b07","unicode_alternates":"2b07-fe0f","name":"downwards black arrow","shortname":":arrow_down:","category":"symbols","emoji_order":"934","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_right":{"unicode":"2197","unicode_alternates":"2197-fe0f","name":"north east arrow","shortname":":arrow_upper_right:","category":"symbols","emoji_order":"935","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_right":{"unicode":"2198","unicode_alternates":"2198-fe0f","name":"south east arrow","shortname":":arrow_lower_right:","category":"symbols","emoji_order":"936","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_lower_left":{"unicode":"2199","unicode_alternates":"2199-fe0f","name":"south west arrow","shortname":":arrow_lower_left:","category":"symbols","emoji_order":"937","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_upper_left":{"unicode":"2196","unicode_alternates":"2196-fe0f","name":"north west arrow","shortname":":arrow_upper_left:","category":"symbols","emoji_order":"938","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_up_down":{"unicode":"2195","unicode_alternates":"2195-fe0f","name":"up down arrow","shortname":":arrow_up_down:","category":"symbols","emoji_order":"939","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"left_right_arrow":{"unicode":"2194","unicode_alternates":"2194-fe0f","name":"left right arrow","shortname":":left_right_arrow:","category":"symbols","emoji_order":"940","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrows_counterclockwise":{"unicode":"1f504","unicode_alternates":"","name":"anticlockwise downwards and upwards open circle arrows","shortname":":arrows_counterclockwise:","category":"symbols","emoji_order":"941","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_right_hook":{"unicode":"21aa","unicode_alternates":"21aa-fe0f","name":"rightwards arrow with hook","shortname":":arrow_right_hook:","category":"symbols","emoji_order":"942","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"leftwards_arrow_with_hook":{"unicode":"21a9","unicode_alternates":"21a9-fe0f","name":"leftwards arrow with hook","shortname":":leftwards_arrow_with_hook:","category":"symbols","emoji_order":"943","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_up":{"unicode":"2934","unicode_alternates":"2934-fe0f","name":"arrow pointing rightwards then curving upwards","shortname":":arrow_heading_up:","category":"symbols","emoji_order":"944","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"arrow_heading_down":{"unicode":"2935","unicode_alternates":"2935-fe0f","name":"arrow pointing rightwards then curving downwards","shortname":":arrow_heading_down:","category":"symbols","emoji_order":"945","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"hash":{"unicode":"0023-20e3","unicode_alternates":"0023-fe0f-20e3","name":"keycap number sign","shortname":":hash:","category":"symbols","emoji_order":"946","aliases":[],"aliases_ascii":[],"keywords":["number","symbol"]},"asterisk":{"unicode":"002a-20e3","unicode_alternates":"002a-fe0f-20e3","name":"keycap asterisk","shortname":":asterisk:","category":"symbols","emoji_order":"947","aliases":[":keycap_asterisk:"],"aliases_ascii":[],"keywords":["symbol"]},"information_source":{"unicode":"2139","unicode_alternates":"2139-fe0f","name":"information source","shortname":":information_source:","category":"symbols","emoji_order":"948","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abc":{"unicode":"1f524","unicode_alternates":"","name":"input symbol for latin letters","shortname":":abc:","category":"symbols","emoji_order":"949","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"abcd":{"unicode":"1f521","unicode_alternates":"","name":"input symbol for latin small letters","shortname":":abcd:","category":"symbols","emoji_order":"950","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"capital_abcd":{"unicode":"1f520","unicode_alternates":"","name":"input symbol for latin capital letters","shortname":":capital_abcd:","category":"symbols","emoji_order":"951","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"symbols":{"unicode":"1f523","unicode_alternates":"","name":"input symbol for symbols","shortname":":symbols:","category":"symbols","emoji_order":"952","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"musical_note":{"unicode":"1f3b5","unicode_alternates":"","name":"musical note","shortname":":musical_note:","category":"symbols","emoji_order":"953","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"notes":{"unicode":"1f3b6","unicode_alternates":"","name":"multiple musical notes","shortname":":notes:","category":"symbols","emoji_order":"954","aliases":[],"aliases_ascii":[],"keywords":["instruments","symbol"]},"wavy_dash":{"unicode":"3030","unicode_alternates":"3030-fe0f","name":"wavy dash","shortname":":wavy_dash:","category":"symbols","emoji_order":"955","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"curly_loop":{"unicode":"27b0","unicode_alternates":"","name":"curly loop","shortname":":curly_loop:","category":"symbols","emoji_order":"956","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"heavy_check_mark":{"unicode":"2714","unicode_alternates":"2714-fe0f","name":"heavy check mark","shortname":":heavy_check_mark:","category":"symbols","emoji_order":"957","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"arrows_clockwise":{"unicode":"1f503","unicode_alternates":"","name":"clockwise downwards and upwards open circle arrows","shortname":":arrows_clockwise:","category":"symbols","emoji_order":"958","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"heavy_plus_sign":{"unicode":"2795","unicode_alternates":"","name":"heavy plus sign","shortname":":heavy_plus_sign:","category":"symbols","emoji_order":"959","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_minus_sign":{"unicode":"2796","unicode_alternates":"","name":"heavy minus sign","shortname":":heavy_minus_sign:","category":"symbols","emoji_order":"960","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_division_sign":{"unicode":"2797","unicode_alternates":"","name":"heavy division sign","shortname":":heavy_division_sign:","category":"symbols","emoji_order":"961","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_multiplication_x":{"unicode":"2716","unicode_alternates":"2716-fe0f","name":"heavy multiplication x","shortname":":heavy_multiplication_x:","category":"symbols","emoji_order":"962","aliases":[],"aliases_ascii":[],"keywords":["math","symbol"]},"heavy_dollar_sign":{"unicode":"1f4b2","unicode_alternates":"","name":"heavy dollar sign","shortname":":heavy_dollar_sign:","category":"symbols","emoji_order":"963","aliases":[],"aliases_ascii":[],"keywords":["math","symbol","money","money"]},"currency_exchange":{"unicode":"1f4b1","unicode_alternates":"","name":"currency exchange","shortname":":currency_exchange:","category":"symbols","emoji_order":"964","aliases":[],"aliases_ascii":[],"keywords":["symbol","money","money"]},"copyright":{"unicode":"00a9","unicode_alternates":"00a9-fe0f","name":"copyright sign","shortname":":copyright:","category":"symbols","emoji_order":"965","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"registered":{"unicode":"00ae","unicode_alternates":"00ae-fe0f","name":"registered sign","shortname":":registered:","category":"symbols","emoji_order":"966","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"tm":{"unicode":"2122","unicode_alternates":"2122-fe0f","name":"trade mark sign","shortname":":tm:","category":"symbols","emoji_order":"967","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"end":{"unicode":"1f51a","unicode_alternates":"","name":"end with leftwards arrow above","shortname":":end:","category":"symbols","emoji_order":"968","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"back":{"unicode":"1f519","unicode_alternates":"","name":"back with leftwards arrow above","shortname":":back:","category":"symbols","emoji_order":"969","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"on":{"unicode":"1f51b","unicode_alternates":"","name":"on with exclamation mark with left right arrow abo","shortname":":on:","category":"symbols","emoji_order":"970","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"top":{"unicode":"1f51d","unicode_alternates":"","name":"top with upwards arrow above","shortname":":top:","category":"symbols","emoji_order":"971","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"soon":{"unicode":"1f51c","unicode_alternates":"","name":"soon with rightwards arrow above","shortname":":soon:","category":"symbols","emoji_order":"972","aliases":[],"aliases_ascii":[],"keywords":["arrow","symbol"]},"ballot_box_with_check":{"unicode":"2611","unicode_alternates":"2611-fe0f","name":"ballot box with check","shortname":":ballot_box_with_check:","category":"symbols","emoji_order":"973","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"radio_button":{"unicode":"1f518","unicode_alternates":"","name":"radio button","shortname":":radio_button:","category":"symbols","emoji_order":"974","aliases":[],"aliases_ascii":[],"keywords":["symbol","circle","circle"]},"white_circle":{"unicode":"26aa","unicode_alternates":"26aa-fe0f","name":"medium white circle","shortname":":white_circle:","category":"symbols","emoji_order":"975","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"black_circle":{"unicode":"26ab","unicode_alternates":"26ab-fe0f","name":"medium black circle","shortname":":black_circle:","category":"symbols","emoji_order":"976","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"red_circle":{"unicode":"1f534","unicode_alternates":"","name":"large red circle","shortname":":red_circle:","category":"symbols","emoji_order":"977","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"large_blue_circle":{"unicode":"1f535","unicode_alternates":"","name":"large blue circle","shortname":":large_blue_circle:","category":"symbols","emoji_order":"978","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","circle","circle"]},"small_orange_diamond":{"unicode":"1f538","unicode_alternates":"","name":"small orange diamond","shortname":":small_orange_diamond:","category":"symbols","emoji_order":"979","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_blue_diamond":{"unicode":"1f539","unicode_alternates":"","name":"small blue diamond","shortname":":small_blue_diamond:","category":"symbols","emoji_order":"980","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"large_orange_diamond":{"unicode":"1f536","unicode_alternates":"","name":"large orange diamond","shortname":":large_orange_diamond:","category":"symbols","emoji_order":"981","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"large_blue_diamond":{"unicode":"1f537","unicode_alternates":"","name":"large blue diamond","shortname":":large_blue_diamond:","category":"symbols","emoji_order":"982","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol"]},"small_red_triangle":{"unicode":"1f53a","unicode_alternates":"","name":"up-pointing red triangle","shortname":":small_red_triangle:","category":"symbols","emoji_order":"983","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle","triangle"]},"black_small_square":{"unicode":"25aa","unicode_alternates":"25aa-fe0f","name":"black small square","shortname":":black_small_square:","category":"symbols","emoji_order":"984","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_small_square":{"unicode":"25ab","unicode_alternates":"25ab-fe0f","name":"white small square","shortname":":white_small_square:","category":"symbols","emoji_order":"985","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_large_square":{"unicode":"2b1b","unicode_alternates":"2b1b-fe0f","name":"black large square","shortname":":black_large_square:","category":"symbols","emoji_order":"986","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_large_square":{"unicode":"2b1c","unicode_alternates":"2b1c-fe0f","name":"white large square","shortname":":white_large_square:","category":"symbols","emoji_order":"987","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"small_red_triangle_down":{"unicode":"1f53b","unicode_alternates":"","name":"down-pointing red triangle","shortname":":small_red_triangle_down:","category":"symbols","emoji_order":"988","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","triangle","triangle"]},"black_medium_square":{"unicode":"25fc","unicode_alternates":"25fc-fe0f","name":"black medium square","shortname":":black_medium_square:","category":"symbols","emoji_order":"989","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_medium_square":{"unicode":"25fb","unicode_alternates":"25fb-fe0f","name":"white medium square","shortname":":white_medium_square:","category":"symbols","emoji_order":"990","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_medium_small_square":{"unicode":"25fe","unicode_alternates":"25fe-fe0f","name":"black medium small square","shortname":":black_medium_small_square:","category":"symbols","emoji_order":"991","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_medium_small_square":{"unicode":"25fd","unicode_alternates":"25fd-fe0f","name":"white medium small square","shortname":":white_medium_small_square:","category":"symbols","emoji_order":"992","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"black_square_button":{"unicode":"1f532","unicode_alternates":"","name":"black square button","shortname":":black_square_button:","category":"symbols","emoji_order":"993","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"white_square_button":{"unicode":"1f533","unicode_alternates":"","name":"white square button","shortname":":white_square_button:","category":"symbols","emoji_order":"994","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","square","square"]},"speaker":{"unicode":"1f508","unicode_alternates":"","name":"speaker","shortname":":speaker:","category":"symbols","emoji_order":"995","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"sound":{"unicode":"1f509","unicode_alternates":"","name":"speaker with one sound wave","shortname":":sound:","category":"symbols","emoji_order":"996","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"loud_sound":{"unicode":"1f50a","unicode_alternates":"","name":"speaker with three sound waves","shortname":":loud_sound:","category":"symbols","emoji_order":"997","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"mute":{"unicode":"1f507","unicode_alternates":"","name":"speaker with cancellation stroke","shortname":":mute:","category":"symbols","emoji_order":"998","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"mega":{"unicode":"1f4e3","unicode_alternates":"","name":"cheering megaphone","shortname":":mega:","category":"symbols","emoji_order":"999","aliases":[],"aliases_ascii":[],"keywords":["object","sport"]},"loudspeaker":{"unicode":"1f4e2","unicode_alternates":"","name":"public address loudspeaker","shortname":":loudspeaker:","category":"symbols","emoji_order":"1000","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"bell":{"unicode":"1f514","unicode_alternates":"","name":"bell","shortname":":bell:","category":"symbols","emoji_order":"1001","aliases":[],"aliases_ascii":[],"keywords":["object","alarm","symbol"]},"no_bell":{"unicode":"1f515","unicode_alternates":"","name":"bell with cancellation stroke","shortname":":no_bell:","category":"symbols","emoji_order":"1002","aliases":[],"aliases_ascii":[],"keywords":["alarm","symbol"]},"black_joker":{"unicode":"1f0cf","unicode_alternates":"","name":"playing card black joker","shortname":":black_joker:","category":"symbols","emoji_order":"1003","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"mahjong":{"unicode":"1f004","unicode_alternates":"1f004-fe0f","name":"mahjong tile red dragon","shortname":":mahjong:","category":"symbols","emoji_order":"1004","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","game"]},"spades":{"unicode":"2660","unicode_alternates":"2660-fe0f","name":"black spade suit","shortname":":spades:","category":"symbols","emoji_order":"1005","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"clubs":{"unicode":"2663","unicode_alternates":"2663-fe0f","name":"black club suit","shortname":":clubs:","category":"symbols","emoji_order":"1006","aliases":[],"aliases_ascii":[],"keywords":["symbol","game"]},"hearts":{"unicode":"2665","unicode_alternates":"2665-fe0f","name":"black heart suit","shortname":":hearts:","category":"symbols","emoji_order":"1007","aliases":[],"aliases_ascii":[],"keywords":["love","symbol","game"]},"diamonds":{"unicode":"2666","unicode_alternates":"2666-fe0f","name":"black diamond suit","shortname":":diamonds:","category":"symbols","emoji_order":"1008","aliases":[],"aliases_ascii":[],"keywords":["shapes","symbol","game"]},"flower_playing_cards":{"unicode":"1f3b4","unicode_alternates":"","name":"flower playing cards","shortname":":flower_playing_cards:","category":"symbols","emoji_order":"1009","aliases":[],"aliases_ascii":[],"keywords":["object","symbol"]},"thought_balloon":{"unicode":"1f4ad","unicode_alternates":"","name":"thought balloon","shortname":":thought_balloon:","category":"symbols","emoji_order":"1010","aliases":[],"aliases_ascii":[],"keywords":["symbol"]},"anger_right":{"unicode":"1f5ef","unicode_alternates":"1f5ef-fe0f","name":"right anger bubble","shortname":":anger_right:","category":"symbols","emoji_order":"1011","aliases":[":right_anger_bubble:"],"aliases_ascii":[],"keywords":["symbol"]},"speech_balloon":{"unicode":"1f4ac","unicode_alternates":"","name":"speech balloon","shortname":":speech_balloon:","category":"symbols","emoji_order":"1012","aliases":[],"aliases_ascii":[],"keywords":["symbol","free speech","free speech"]},"clock1":{"unicode":"1f550","unicode_alternates":"","name":"clock face one oclock","shortname":":clock1:","category":"symbols","emoji_order":"1013","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock2":{"unicode":"1f551","unicode_alternates":"","name":"clock face two oclock","shortname":":clock2:","category":"symbols","emoji_order":"1014","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock3":{"unicode":"1f552","unicode_alternates":"","name":"clock face three oclock","shortname":":clock3:","category":"symbols","emoji_order":"1015","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock4":{"unicode":"1f553","unicode_alternates":"","name":"clock face four oclock","shortname":":clock4:","category":"symbols","emoji_order":"1016","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock5":{"unicode":"1f554","unicode_alternates":"","name":"clock face five oclock","shortname":":clock5:","category":"symbols","emoji_order":"1017","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock6":{"unicode":"1f555","unicode_alternates":"","name":"clock face six oclock","shortname":":clock6:","category":"symbols","emoji_order":"1018","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock7":{"unicode":"1f556","unicode_alternates":"","name":"clock face seven oclock","shortname":":clock7:","category":"symbols","emoji_order":"1019","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock8":{"unicode":"1f557","unicode_alternates":"","name":"clock face eight oclock","shortname":":clock8:","category":"symbols","emoji_order":"1020","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock9":{"unicode":"1f558","unicode_alternates":"","name":"clock face nine oclock","shortname":":clock9:","category":"symbols","emoji_order":"1021","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock10":{"unicode":"1f559","unicode_alternates":"","name":"clock face ten oclock","shortname":":clock10:","category":"symbols","emoji_order":"1022","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock11":{"unicode":"1f55a","unicode_alternates":"","name":"clock face eleven oclock","shortname":":clock11:","category":"symbols","emoji_order":"1023","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock12":{"unicode":"1f55b","unicode_alternates":"","name":"clock face twelve oclock","shortname":":clock12:","category":"symbols","emoji_order":"1024","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock130":{"unicode":"1f55c","unicode_alternates":"","name":"clock face one-thirty","shortname":":clock130:","category":"symbols","emoji_order":"1025","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock230":{"unicode":"1f55d","unicode_alternates":"","name":"clock face two-thirty","shortname":":clock230:","category":"symbols","emoji_order":"1026","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock330":{"unicode":"1f55e","unicode_alternates":"","name":"clock face three-thirty","shortname":":clock330:","category":"symbols","emoji_order":"1027","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock430":{"unicode":"1f55f","unicode_alternates":"","name":"clock face four-thirty","shortname":":clock430:","category":"symbols","emoji_order":"1028","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock530":{"unicode":"1f560","unicode_alternates":"","name":"clock face five-thirty","shortname":":clock530:","category":"symbols","emoji_order":"1029","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock630":{"unicode":"1f561","unicode_alternates":"","name":"clock face six-thirty","shortname":":clock630:","category":"symbols","emoji_order":"1030","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock730":{"unicode":"1f562","unicode_alternates":"","name":"clock face seven-thirty","shortname":":clock730:","category":"symbols","emoji_order":"1031","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock830":{"unicode":"1f563","unicode_alternates":"","name":"clock face eight-thirty","shortname":":clock830:","category":"symbols","emoji_order":"1032","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock930":{"unicode":"1f564","unicode_alternates":"","name":"clock face nine-thirty","shortname":":clock930:","category":"symbols","emoji_order":"1033","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1030":{"unicode":"1f565","unicode_alternates":"","name":"clock face ten-thirty","shortname":":clock1030:","category":"symbols","emoji_order":"1034","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1130":{"unicode":"1f566","unicode_alternates":"","name":"clock face eleven-thirty","shortname":":clock1130:","category":"symbols","emoji_order":"1035","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"clock1230":{"unicode":"1f567","unicode_alternates":"","name":"clock face twelve-thirty","shortname":":clock1230:","category":"symbols","emoji_order":"1036","aliases":[],"aliases_ascii":[],"keywords":["symbol","time"]},"eye_in_speech_bubble":{"unicode":"1f441-1f5e8","unicode_alternates":"1f441-200d-1f5e8","name":"eye in speech bubble","shortname":":eye_in_speech_bubble:","category":"symbols","emoji_order":"1037","aliases":[],"aliases_ascii":[],"keywords":["object","symbol","eyes","talk"]},"flag_ac":{"unicode":"1f1e6-1f1e8","unicode_alternates":"","name":"ascension","shortname":":flag_ac:","category":"flags","emoji_order":"1038","aliases":[":ac:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_af":{"unicode":"1f1e6-1f1eb","unicode_alternates":"","name":"afghanistan","shortname":":flag_af:","category":"flags","emoji_order":"1039","aliases":[":af:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_al":{"unicode":"1f1e6-1f1f1","unicode_alternates":"","name":"albania","shortname":":flag_al:","category":"flags","emoji_order":"1040","aliases":[":al:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dz":{"unicode":"1f1e9-1f1ff","unicode_alternates":"","name":"algeria","shortname":":flag_dz:","category":"flags","emoji_order":"1041","aliases":[":dz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ad":{"unicode":"1f1e6-1f1e9","unicode_alternates":"","name":"andorra","shortname":":flag_ad:","category":"flags","emoji_order":"1042","aliases":[":ad:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ao":{"unicode":"1f1e6-1f1f4","unicode_alternates":"","name":"angola","shortname":":flag_ao:","category":"flags","emoji_order":"1043","aliases":[":ao:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ai":{"unicode":"1f1e6-1f1ee","unicode_alternates":"","name":"anguilla","shortname":":flag_ai:","category":"flags","emoji_order":"1044","aliases":[":ai:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ag":{"unicode":"1f1e6-1f1ec","unicode_alternates":"","name":"antigua and barbuda","shortname":":flag_ag:","category":"flags","emoji_order":"1045","aliases":[":ag:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ar":{"unicode":"1f1e6-1f1f7","unicode_alternates":"","name":"argentina","shortname":":flag_ar:","category":"flags","emoji_order":"1046","aliases":[":ar:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_am":{"unicode":"1f1e6-1f1f2","unicode_alternates":"","name":"armenia","shortname":":flag_am:","category":"flags","emoji_order":"1047","aliases":[":am:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_aw":{"unicode":"1f1e6-1f1fc","unicode_alternates":"","name":"aruba","shortname":":flag_aw:","category":"flags","emoji_order":"1048","aliases":[":aw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_au":{"unicode":"1f1e6-1f1fa","unicode_alternates":"","name":"australia","shortname":":flag_au:","category":"flags","emoji_order":"1049","aliases":[":au:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_at":{"unicode":"1f1e6-1f1f9","unicode_alternates":"","name":"austria","shortname":":flag_at:","category":"flags","emoji_order":"1050","aliases":[":at:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_az":{"unicode":"1f1e6-1f1ff","unicode_alternates":"","name":"azerbaijan","shortname":":flag_az:","category":"flags","emoji_order":"1051","aliases":[":az:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bs":{"unicode":"1f1e7-1f1f8","unicode_alternates":"","name":"the bahamas","shortname":":flag_bs:","category":"flags","emoji_order":"1052","aliases":[":bs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bh":{"unicode":"1f1e7-1f1ed","unicode_alternates":"","name":"bahrain","shortname":":flag_bh:","category":"flags","emoji_order":"1053","aliases":[":bh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bd":{"unicode":"1f1e7-1f1e9","unicode_alternates":"","name":"bangladesh","shortname":":flag_bd:","category":"flags","emoji_order":"1054","aliases":[":bd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bb":{"unicode":"1f1e7-1f1e7","unicode_alternates":"","name":"barbados","shortname":":flag_bb:","category":"flags","emoji_order":"1055","aliases":[":bb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_by":{"unicode":"1f1e7-1f1fe","unicode_alternates":"","name":"belarus","shortname":":flag_by:","category":"flags","emoji_order":"1056","aliases":[":by:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_be":{"unicode":"1f1e7-1f1ea","unicode_alternates":"","name":"belgium","shortname":":flag_be:","category":"flags","emoji_order":"1057","aliases":[":be:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bz":{"unicode":"1f1e7-1f1ff","unicode_alternates":"","name":"belize","shortname":":flag_bz:","category":"flags","emoji_order":"1058","aliases":[":bz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bj":{"unicode":"1f1e7-1f1ef","unicode_alternates":"","name":"benin","shortname":":flag_bj:","category":"flags","emoji_order":"1059","aliases":[":bj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bm":{"unicode":"1f1e7-1f1f2","unicode_alternates":"","name":"bermuda","shortname":":flag_bm:","category":"flags","emoji_order":"1060","aliases":[":bm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bt":{"unicode":"1f1e7-1f1f9","unicode_alternates":"","name":"bhutan","shortname":":flag_bt:","category":"flags","emoji_order":"1061","aliases":[":bt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bo":{"unicode":"1f1e7-1f1f4","unicode_alternates":"","name":"bolivia","shortname":":flag_bo:","category":"flags","emoji_order":"1062","aliases":[":bo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ba":{"unicode":"1f1e7-1f1e6","unicode_alternates":"","name":"bosnia and herzegovina","shortname":":flag_ba:","category":"flags","emoji_order":"1063","aliases":[":ba:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bw":{"unicode":"1f1e7-1f1fc","unicode_alternates":"","name":"botswana","shortname":":flag_bw:","category":"flags","emoji_order":"1064","aliases":[":bw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_br":{"unicode":"1f1e7-1f1f7","unicode_alternates":"","name":"brazil","shortname":":flag_br:","category":"flags","emoji_order":"1065","aliases":[":br:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bn":{"unicode":"1f1e7-1f1f3","unicode_alternates":"","name":"brunei","shortname":":flag_bn:","category":"flags","emoji_order":"1066","aliases":[":bn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bg":{"unicode":"1f1e7-1f1ec","unicode_alternates":"","name":"bulgaria","shortname":":flag_bg:","category":"flags","emoji_order":"1067","aliases":[":bg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bf":{"unicode":"1f1e7-1f1eb","unicode_alternates":"","name":"burkina faso","shortname":":flag_bf:","category":"flags","emoji_order":"1068","aliases":[":bf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bi":{"unicode":"1f1e7-1f1ee","unicode_alternates":"","name":"burundi","shortname":":flag_bi:","category":"flags","emoji_order":"1069","aliases":[":bi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cv":{"unicode":"1f1e8-1f1fb","unicode_alternates":"","name":"cape verde","shortname":":flag_cv:","category":"flags","emoji_order":"1070","aliases":[":cv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kh":{"unicode":"1f1f0-1f1ed","unicode_alternates":"","name":"cambodia","shortname":":flag_kh:","category":"flags","emoji_order":"1071","aliases":[":kh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cm":{"unicode":"1f1e8-1f1f2","unicode_alternates":"","name":"cameroon","shortname":":flag_cm:","category":"flags","emoji_order":"1072","aliases":[":cm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ca":{"unicode":"1f1e8-1f1e6","unicode_alternates":"","name":"canada","shortname":":flag_ca:","category":"flags","emoji_order":"1073","aliases":[":ca:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ky":{"unicode":"1f1f0-1f1fe","unicode_alternates":"","name":"cayman islands","shortname":":flag_ky:","category":"flags","emoji_order":"1074","aliases":[":ky:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cf":{"unicode":"1f1e8-1f1eb","unicode_alternates":"","name":"central african republic","shortname":":flag_cf:","category":"flags","emoji_order":"1075","aliases":[":cf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_td":{"unicode":"1f1f9-1f1e9","unicode_alternates":"","name":"chad","shortname":":flag_td:","category":"flags","emoji_order":"1076","aliases":[":td:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cl":{"unicode":"1f1e8-1f1f1","unicode_alternates":"","name":"chile","shortname":":flag_cl:","category":"flags","emoji_order":"1077","aliases":[":chile:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cn":{"unicode":"1f1e8-1f1f3","unicode_alternates":"","name":"china","shortname":":flag_cn:","category":"flags","emoji_order":"1078","aliases":[":cn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_co":{"unicode":"1f1e8-1f1f4","unicode_alternates":"","name":"colombia","shortname":":flag_co:","category":"flags","emoji_order":"1079","aliases":[":co:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_km":{"unicode":"1f1f0-1f1f2","unicode_alternates":"","name":"the comoros","shortname":":flag_km:","category":"flags","emoji_order":"1080","aliases":[":km:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cg":{"unicode":"1f1e8-1f1ec","unicode_alternates":"","name":"the republic of the congo","shortname":":flag_cg:","category":"flags","emoji_order":"1081","aliases":[":cg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cd":{"unicode":"1f1e8-1f1e9","unicode_alternates":"","name":"the democratic republic of the congo","shortname":":flag_cd:","category":"flags","emoji_order":"1082","aliases":[":congo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cr":{"unicode":"1f1e8-1f1f7","unicode_alternates":"","name":"costa rica","shortname":":flag_cr:","category":"flags","emoji_order":"1083","aliases":[":cr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hr":{"unicode":"1f1ed-1f1f7","unicode_alternates":"","name":"croatia","shortname":":flag_hr:","category":"flags","emoji_order":"1084","aliases":[":hr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cu":{"unicode":"1f1e8-1f1fa","unicode_alternates":"","name":"cuba","shortname":":flag_cu:","category":"flags","emoji_order":"1085","aliases":[":cu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cy":{"unicode":"1f1e8-1f1fe","unicode_alternates":"","name":"cyprus","shortname":":flag_cy:","category":"flags","emoji_order":"1086","aliases":[":cy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cz":{"unicode":"1f1e8-1f1ff","unicode_alternates":"","name":"the czech republic","shortname":":flag_cz:","category":"flags","emoji_order":"1087","aliases":[":cz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dk":{"unicode":"1f1e9-1f1f0","unicode_alternates":"","name":"denmark","shortname":":flag_dk:","category":"flags","emoji_order":"1088","aliases":[":dk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dj":{"unicode":"1f1e9-1f1ef","unicode_alternates":"","name":"djibouti","shortname":":flag_dj:","category":"flags","emoji_order":"1089","aliases":[":dj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dm":{"unicode":"1f1e9-1f1f2","unicode_alternates":"","name":"dominica","shortname":":flag_dm:","category":"flags","emoji_order":"1090","aliases":[":dm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_do":{"unicode":"1f1e9-1f1f4","unicode_alternates":"","name":"the dominican republic","shortname":":flag_do:","category":"flags","emoji_order":"1091","aliases":[":do:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ec":{"unicode":"1f1ea-1f1e8","unicode_alternates":"","name":"ecuador","shortname":":flag_ec:","category":"flags","emoji_order":"1092","aliases":[":ec:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eg":{"unicode":"1f1ea-1f1ec","unicode_alternates":"","name":"egypt","shortname":":flag_eg:","category":"flags","emoji_order":"1093","aliases":[":eg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sv":{"unicode":"1f1f8-1f1fb","unicode_alternates":"","name":"el salvador","shortname":":flag_sv:","category":"flags","emoji_order":"1094","aliases":[":sv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gq":{"unicode":"1f1ec-1f1f6","unicode_alternates":"","name":"equatorial guinea","shortname":":flag_gq:","category":"flags","emoji_order":"1095","aliases":[":gq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_er":{"unicode":"1f1ea-1f1f7","unicode_alternates":"","name":"eritrea","shortname":":flag_er:","category":"flags","emoji_order":"1096","aliases":[":er:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ee":{"unicode":"1f1ea-1f1ea","unicode_alternates":"","name":"estonia","shortname":":flag_ee:","category":"flags","emoji_order":"1097","aliases":[":ee:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_et":{"unicode":"1f1ea-1f1f9","unicode_alternates":"","name":"ethiopia","shortname":":flag_et:","category":"flags","emoji_order":"1098","aliases":[":et:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fk":{"unicode":"1f1eb-1f1f0","unicode_alternates":"","name":"falkland islands","shortname":":flag_fk:","category":"flags","emoji_order":"1099","aliases":[":fk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fo":{"unicode":"1f1eb-1f1f4","unicode_alternates":"","name":"faroe islands","shortname":":flag_fo:","category":"flags","emoji_order":"1100","aliases":[":fo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fj":{"unicode":"1f1eb-1f1ef","unicode_alternates":"","name":"fiji","shortname":":flag_fj:","category":"flags","emoji_order":"1101","aliases":[":fj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fi":{"unicode":"1f1eb-1f1ee","unicode_alternates":"","name":"finland","shortname":":flag_fi:","category":"flags","emoji_order":"1102","aliases":[":fi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_fr":{"unicode":"1f1eb-1f1f7","unicode_alternates":"","name":"france","shortname":":flag_fr:","category":"flags","emoji_order":"1103","aliases":[":fr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pf":{"unicode":"1f1f5-1f1eb","unicode_alternates":"","name":"french polynesia","shortname":":flag_pf:","category":"flags","emoji_order":"1104","aliases":[":pf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ga":{"unicode":"1f1ec-1f1e6","unicode_alternates":"","name":"gabon","shortname":":flag_ga:","category":"flags","emoji_order":"1105","aliases":[":ga:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gm":{"unicode":"1f1ec-1f1f2","unicode_alternates":"","name":"the gambia","shortname":":flag_gm:","category":"flags","emoji_order":"1106","aliases":[":gm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ge":{"unicode":"1f1ec-1f1ea","unicode_alternates":"","name":"georgia","shortname":":flag_ge:","category":"flags","emoji_order":"1107","aliases":[":ge:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_de":{"unicode":"1f1e9-1f1ea","unicode_alternates":"","name":"germany","shortname":":flag_de:","category":"flags","emoji_order":"1108","aliases":[":de:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gh":{"unicode":"1f1ec-1f1ed","unicode_alternates":"","name":"ghana","shortname":":flag_gh:","category":"flags","emoji_order":"1109","aliases":[":gh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gi":{"unicode":"1f1ec-1f1ee","unicode_alternates":"","name":"gibraltar","shortname":":flag_gi:","category":"flags","emoji_order":"1110","aliases":[":gi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gr":{"unicode":"1f1ec-1f1f7","unicode_alternates":"","name":"greece","shortname":":flag_gr:","category":"flags","emoji_order":"1111","aliases":[":gr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gl":{"unicode":"1f1ec-1f1f1","unicode_alternates":"","name":"greenland","shortname":":flag_gl:","category":"flags","emoji_order":"1112","aliases":[":gl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gd":{"unicode":"1f1ec-1f1e9","unicode_alternates":"","name":"grenada","shortname":":flag_gd:","category":"flags","emoji_order":"1113","aliases":[":gd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gu":{"unicode":"1f1ec-1f1fa","unicode_alternates":"","name":"guam","shortname":":flag_gu:","category":"flags","emoji_order":"1114","aliases":[":gu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gt":{"unicode":"1f1ec-1f1f9","unicode_alternates":"","name":"guatemala","shortname":":flag_gt:","category":"flags","emoji_order":"1115","aliases":[":gt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gn":{"unicode":"1f1ec-1f1f3","unicode_alternates":"","name":"guinea","shortname":":flag_gn:","category":"flags","emoji_order":"1116","aliases":[":gn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gw":{"unicode":"1f1ec-1f1fc","unicode_alternates":"","name":"guinea-bissau","shortname":":flag_gw:","category":"flags","emoji_order":"1117","aliases":[":gw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gy":{"unicode":"1f1ec-1f1fe","unicode_alternates":"","name":"guyana","shortname":":flag_gy:","category":"flags","emoji_order":"1118","aliases":[":gy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ht":{"unicode":"1f1ed-1f1f9","unicode_alternates":"","name":"haiti","shortname":":flag_ht:","category":"flags","emoji_order":"1119","aliases":[":ht:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hn":{"unicode":"1f1ed-1f1f3","unicode_alternates":"","name":"honduras","shortname":":flag_hn:","category":"flags","emoji_order":"1120","aliases":[":hn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hk":{"unicode":"1f1ed-1f1f0","unicode_alternates":"","name":"hong kong","shortname":":flag_hk:","category":"flags","emoji_order":"1121","aliases":[":hk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hu":{"unicode":"1f1ed-1f1fa","unicode_alternates":"","name":"hungary","shortname":":flag_hu:","category":"flags","emoji_order":"1122","aliases":[":hu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_is":{"unicode":"1f1ee-1f1f8","unicode_alternates":"","name":"iceland","shortname":":flag_is:","category":"flags","emoji_order":"1123","aliases":[":is:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_in":{"unicode":"1f1ee-1f1f3","unicode_alternates":"","name":"india","shortname":":flag_in:","category":"flags","emoji_order":"1124","aliases":[":in:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_id":{"unicode":"1f1ee-1f1e9","unicode_alternates":"","name":"indonesia","shortname":":flag_id:","category":"flags","emoji_order":"1125","aliases":[":indonesia:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ir":{"unicode":"1f1ee-1f1f7","unicode_alternates":"","name":"iran","shortname":":flag_ir:","category":"flags","emoji_order":"1126","aliases":[":ir:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_iq":{"unicode":"1f1ee-1f1f6","unicode_alternates":"","name":"iraq","shortname":":flag_iq:","category":"flags","emoji_order":"1127","aliases":[":iq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ie":{"unicode":"1f1ee-1f1ea","unicode_alternates":"","name":"ireland","shortname":":flag_ie:","category":"flags","emoji_order":"1128","aliases":[":ie:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_il":{"unicode":"1f1ee-1f1f1","unicode_alternates":"","name":"israel","shortname":":flag_il:","category":"flags","emoji_order":"1129","aliases":[":il:"],"aliases_ascii":[],"keywords":["jew","country","flag","flag"]},"flag_it":{"unicode":"1f1ee-1f1f9","unicode_alternates":"","name":"italy","shortname":":flag_it:","category":"flags","emoji_order":"1130","aliases":[":it:"],"aliases_ascii":[],"keywords":["italian","country","flag","flag"]},"flag_ci":{"unicode":"1f1e8-1f1ee","unicode_alternates":"","name":"c\u00f4te d\u2019ivoire","shortname":":flag_ci:","category":"flags","emoji_order":"1131","aliases":[":ci:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jm":{"unicode":"1f1ef-1f1f2","unicode_alternates":"","name":"jamaica","shortname":":flag_jm:","category":"flags","emoji_order":"1132","aliases":[":jm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jp":{"unicode":"1f1ef-1f1f5","unicode_alternates":"","name":"japan","shortname":":flag_jp:","category":"flags","emoji_order":"1133","aliases":[":jp:"],"aliases_ascii":[],"keywords":["japan","country","flag","flag"]},"flag_je":{"unicode":"1f1ef-1f1ea","unicode_alternates":"","name":"jersey","shortname":":flag_je:","category":"flags","emoji_order":"1134","aliases":[":je:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_jo":{"unicode":"1f1ef-1f1f4","unicode_alternates":"","name":"jordan","shortname":":flag_jo:","category":"flags","emoji_order":"1135","aliases":[":jo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kz":{"unicode":"1f1f0-1f1ff","unicode_alternates":"","name":"kazakhstan","shortname":":flag_kz:","category":"flags","emoji_order":"1136","aliases":[":kz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ke":{"unicode":"1f1f0-1f1ea","unicode_alternates":"","name":"kenya","shortname":":flag_ke:","category":"flags","emoji_order":"1137","aliases":[":ke:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ki":{"unicode":"1f1f0-1f1ee","unicode_alternates":"","name":"kiribati","shortname":":flag_ki:","category":"flags","emoji_order":"1138","aliases":[":ki:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_xk":{"unicode":"1f1fd-1f1f0","unicode_alternates":"","name":"kosovo","shortname":":flag_xk:","category":"flags","emoji_order":"1139","aliases":[":xk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kw":{"unicode":"1f1f0-1f1fc","unicode_alternates":"","name":"kuwait","shortname":":flag_kw:","category":"flags","emoji_order":"1140","aliases":[":kw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kg":{"unicode":"1f1f0-1f1ec","unicode_alternates":"","name":"kyrgyzstan","shortname":":flag_kg:","category":"flags","emoji_order":"1141","aliases":[":kg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_la":{"unicode":"1f1f1-1f1e6","unicode_alternates":"","name":"laos","shortname":":flag_la:","category":"flags","emoji_order":"1142","aliases":[":la:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lv":{"unicode":"1f1f1-1f1fb","unicode_alternates":"","name":"latvia","shortname":":flag_lv:","category":"flags","emoji_order":"1143","aliases":[":lv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lb":{"unicode":"1f1f1-1f1e7","unicode_alternates":"","name":"lebanon","shortname":":flag_lb:","category":"flags","emoji_order":"1144","aliases":[":lb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ls":{"unicode":"1f1f1-1f1f8","unicode_alternates":"","name":"lesotho","shortname":":flag_ls:","category":"flags","emoji_order":"1145","aliases":[":ls:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lr":{"unicode":"1f1f1-1f1f7","unicode_alternates":"","name":"liberia","shortname":":flag_lr:","category":"flags","emoji_order":"1146","aliases":[":lr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ly":{"unicode":"1f1f1-1f1fe","unicode_alternates":"","name":"libya","shortname":":flag_ly:","category":"flags","emoji_order":"1147","aliases":[":ly:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_li":{"unicode":"1f1f1-1f1ee","unicode_alternates":"","name":"liechtenstein","shortname":":flag_li:","category":"flags","emoji_order":"1148","aliases":[":li:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lt":{"unicode":"1f1f1-1f1f9","unicode_alternates":"","name":"lithuania","shortname":":flag_lt:","category":"flags","emoji_order":"1149","aliases":[":lt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lu":{"unicode":"1f1f1-1f1fa","unicode_alternates":"","name":"luxembourg","shortname":":flag_lu:","category":"flags","emoji_order":"1150","aliases":[":lu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mo":{"unicode":"1f1f2-1f1f4","unicode_alternates":"","name":"macau","shortname":":flag_mo:","category":"flags","emoji_order":"1151","aliases":[":mo:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mk":{"unicode":"1f1f2-1f1f0","unicode_alternates":"","name":"macedonia","shortname":":flag_mk:","category":"flags","emoji_order":"1152","aliases":[":mk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mg":{"unicode":"1f1f2-1f1ec","unicode_alternates":"","name":"madagascar","shortname":":flag_mg:","category":"flags","emoji_order":"1153","aliases":[":mg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mw":{"unicode":"1f1f2-1f1fc","unicode_alternates":"","name":"malawi","shortname":":flag_mw:","category":"flags","emoji_order":"1154","aliases":[":mw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_my":{"unicode":"1f1f2-1f1fe","unicode_alternates":"","name":"malaysia","shortname":":flag_my:","category":"flags","emoji_order":"1155","aliases":[":my:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mv":{"unicode":"1f1f2-1f1fb","unicode_alternates":"","name":"maldives","shortname":":flag_mv:","category":"flags","emoji_order":"1156","aliases":[":mv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ml":{"unicode":"1f1f2-1f1f1","unicode_alternates":"","name":"mali","shortname":":flag_ml:","category":"flags","emoji_order":"1157","aliases":[":ml:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mt":{"unicode":"1f1f2-1f1f9","unicode_alternates":"","name":"malta","shortname":":flag_mt:","category":"flags","emoji_order":"1158","aliases":[":mt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mh":{"unicode":"1f1f2-1f1ed","unicode_alternates":"","name":"the marshall islands","shortname":":flag_mh:","category":"flags","emoji_order":"1159","aliases":[":mh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mr":{"unicode":"1f1f2-1f1f7","unicode_alternates":"","name":"mauritania","shortname":":flag_mr:","category":"flags","emoji_order":"1160","aliases":[":mr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mu":{"unicode":"1f1f2-1f1fa","unicode_alternates":"","name":"mauritius","shortname":":flag_mu:","category":"flags","emoji_order":"1161","aliases":[":mu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mx":{"unicode":"1f1f2-1f1fd","unicode_alternates":"","name":"mexico","shortname":":flag_mx:","category":"flags","emoji_order":"1162","aliases":[":mx:"],"aliases_ascii":[],"keywords":["country","mexican","flag","flag"]},"flag_fm":{"unicode":"1f1eb-1f1f2","unicode_alternates":"","name":"micronesia","shortname":":flag_fm:","category":"flags","emoji_order":"1163","aliases":[":fm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_md":{"unicode":"1f1f2-1f1e9","unicode_alternates":"","name":"moldova","shortname":":flag_md:","category":"flags","emoji_order":"1164","aliases":[":md:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mc":{"unicode":"1f1f2-1f1e8","unicode_alternates":"","name":"monaco","shortname":":flag_mc:","category":"flags","emoji_order":"1165","aliases":[":mc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mn":{"unicode":"1f1f2-1f1f3","unicode_alternates":"","name":"mongolia","shortname":":flag_mn:","category":"flags","emoji_order":"1166","aliases":[":mn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_me":{"unicode":"1f1f2-1f1ea","unicode_alternates":"","name":"montenegro","shortname":":flag_me:","category":"flags","emoji_order":"1167","aliases":[":me:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ms":{"unicode":"1f1f2-1f1f8","unicode_alternates":"","name":"montserrat","shortname":":flag_ms:","category":"flags","emoji_order":"1168","aliases":[":ms:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ma":{"unicode":"1f1f2-1f1e6","unicode_alternates":"","name":"morocco","shortname":":flag_ma:","category":"flags","emoji_order":"1169","aliases":[":ma:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mz":{"unicode":"1f1f2-1f1ff","unicode_alternates":"","name":"mozambique","shortname":":flag_mz:","category":"flags","emoji_order":"1170","aliases":[":mz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mm":{"unicode":"1f1f2-1f1f2","unicode_alternates":"","name":"myanmar","shortname":":flag_mm:","category":"flags","emoji_order":"1171","aliases":[":mm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_na":{"unicode":"1f1f3-1f1e6","unicode_alternates":"","name":"namibia","shortname":":flag_na:","category":"flags","emoji_order":"1172","aliases":[":na:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nr":{"unicode":"1f1f3-1f1f7","unicode_alternates":"","name":"nauru","shortname":":flag_nr:","category":"flags","emoji_order":"1173","aliases":[":nr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_np":{"unicode":"1f1f3-1f1f5","unicode_alternates":"","name":"nepal","shortname":":flag_np:","category":"flags","emoji_order":"1174","aliases":[":np:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nl":{"unicode":"1f1f3-1f1f1","unicode_alternates":"","name":"the netherlands","shortname":":flag_nl:","category":"flags","emoji_order":"1175","aliases":[":nl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nc":{"unicode":"1f1f3-1f1e8","unicode_alternates":"","name":"new caledonia","shortname":":flag_nc:","category":"flags","emoji_order":"1176","aliases":[":nc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nz":{"unicode":"1f1f3-1f1ff","unicode_alternates":"","name":"new zealand","shortname":":flag_nz:","category":"flags","emoji_order":"1177","aliases":[":nz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ni":{"unicode":"1f1f3-1f1ee","unicode_alternates":"","name":"nicaragua","shortname":":flag_ni:","category":"flags","emoji_order":"1178","aliases":[":ni:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ne":{"unicode":"1f1f3-1f1ea","unicode_alternates":"","name":"niger","shortname":":flag_ne:","category":"flags","emoji_order":"1179","aliases":[":ne:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ng":{"unicode":"1f1f3-1f1ec","unicode_alternates":"","name":"nigeria","shortname":":flag_ng:","category":"flags","emoji_order":"1180","aliases":[":nigeria:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nu":{"unicode":"1f1f3-1f1fa","unicode_alternates":"","name":"niue","shortname":":flag_nu:","category":"flags","emoji_order":"1181","aliases":[":nu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kp":{"unicode":"1f1f0-1f1f5","unicode_alternates":"","name":"north korea","shortname":":flag_kp:","category":"flags","emoji_order":"1182","aliases":[":kp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_no":{"unicode":"1f1f3-1f1f4","unicode_alternates":"","name":"norway","shortname":":flag_no:","category":"flags","emoji_order":"1183","aliases":[":no:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_om":{"unicode":"1f1f4-1f1f2","unicode_alternates":"","name":"oman","shortname":":flag_om:","category":"flags","emoji_order":"1184","aliases":[":om:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pk":{"unicode":"1f1f5-1f1f0","unicode_alternates":"","name":"pakistan","shortname":":flag_pk:","category":"flags","emoji_order":"1185","aliases":[":pk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pw":{"unicode":"1f1f5-1f1fc","unicode_alternates":"","name":"palau","shortname":":flag_pw:","category":"flags","emoji_order":"1186","aliases":[":pw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ps":{"unicode":"1f1f5-1f1f8","unicode_alternates":"","name":"palestinian authority","shortname":":flag_ps:","category":"flags","emoji_order":"1187","aliases":[":ps:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pa":{"unicode":"1f1f5-1f1e6","unicode_alternates":"","name":"panama","shortname":":flag_pa:","category":"flags","emoji_order":"1188","aliases":[":pa:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pg":{"unicode":"1f1f5-1f1ec","unicode_alternates":"","name":"papua new guinea","shortname":":flag_pg:","category":"flags","emoji_order":"1189","aliases":[":pg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_py":{"unicode":"1f1f5-1f1fe","unicode_alternates":"","name":"paraguay","shortname":":flag_py:","category":"flags","emoji_order":"1190","aliases":[":py:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pe":{"unicode":"1f1f5-1f1ea","unicode_alternates":"","name":"peru","shortname":":flag_pe:","category":"flags","emoji_order":"1191","aliases":[":pe:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ph":{"unicode":"1f1f5-1f1ed","unicode_alternates":"","name":"the philippines","shortname":":flag_ph:","category":"flags","emoji_order":"1192","aliases":[":ph:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pl":{"unicode":"1f1f5-1f1f1","unicode_alternates":"","name":"poland","shortname":":flag_pl:","category":"flags","emoji_order":"1193","aliases":[":pl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pt":{"unicode":"1f1f5-1f1f9","unicode_alternates":"","name":"portugal","shortname":":flag_pt:","category":"flags","emoji_order":"1194","aliases":[":pt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pr":{"unicode":"1f1f5-1f1f7","unicode_alternates":"","name":"puerto rico","shortname":":flag_pr:","category":"flags","emoji_order":"1195","aliases":[":pr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_qa":{"unicode":"1f1f6-1f1e6","unicode_alternates":"","name":"qatar","shortname":":flag_qa:","category":"flags","emoji_order":"1196","aliases":[":qa:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ro":{"unicode":"1f1f7-1f1f4","unicode_alternates":"","name":"romania","shortname":":flag_ro:","category":"flags","emoji_order":"1197","aliases":[":ro:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ru":{"unicode":"1f1f7-1f1fa","unicode_alternates":"","name":"russia","shortname":":flag_ru:","category":"flags","emoji_order":"1198","aliases":[":ru:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_rw":{"unicode":"1f1f7-1f1fc","unicode_alternates":"","name":"rwanda","shortname":":flag_rw:","category":"flags","emoji_order":"1199","aliases":[":rw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sh":{"unicode":"1f1f8-1f1ed","unicode_alternates":"","name":"saint helena","shortname":":flag_sh:","category":"flags","emoji_order":"1200","aliases":[":sh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kn":{"unicode":"1f1f0-1f1f3","unicode_alternates":"","name":"saint kitts and nevis","shortname":":flag_kn:","category":"flags","emoji_order":"1201","aliases":[":kn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lc":{"unicode":"1f1f1-1f1e8","unicode_alternates":"","name":"saint lucia","shortname":":flag_lc:","category":"flags","emoji_order":"1202","aliases":[":lc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vc":{"unicode":"1f1fb-1f1e8","unicode_alternates":"","name":"saint vincent and the grenadines","shortname":":flag_vc:","category":"flags","emoji_order":"1203","aliases":[":vc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ws":{"unicode":"1f1fc-1f1f8","unicode_alternates":"","name":"samoa","shortname":":flag_ws:","category":"flags","emoji_order":"1204","aliases":[":ws:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sm":{"unicode":"1f1f8-1f1f2","unicode_alternates":"","name":"san marino","shortname":":flag_sm:","category":"flags","emoji_order":"1205","aliases":[":sm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_st":{"unicode":"1f1f8-1f1f9","unicode_alternates":"","name":"s\u00e3o tom\u00e9 and pr\u00edncipe","shortname":":flag_st:","category":"flags","emoji_order":"1206","aliases":[":st:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sa":{"unicode":"1f1f8-1f1e6","unicode_alternates":"","name":"saudi arabia","shortname":":flag_sa:","category":"flags","emoji_order":"1207","aliases":[":saudiarabia:",":saudi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sn":{"unicode":"1f1f8-1f1f3","unicode_alternates":"","name":"senegal","shortname":":flag_sn:","category":"flags","emoji_order":"1208","aliases":[":sn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_rs":{"unicode":"1f1f7-1f1f8","unicode_alternates":"","name":"serbia","shortname":":flag_rs:","category":"flags","emoji_order":"1209","aliases":[":rs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sc":{"unicode":"1f1f8-1f1e8","unicode_alternates":"","name":"the seychelles","shortname":":flag_sc:","category":"flags","emoji_order":"1210","aliases":[":sc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sl":{"unicode":"1f1f8-1f1f1","unicode_alternates":"","name":"sierra leone","shortname":":flag_sl:","category":"flags","emoji_order":"1211","aliases":[":sl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sg":{"unicode":"1f1f8-1f1ec","unicode_alternates":"","name":"singapore","shortname":":flag_sg:","category":"flags","emoji_order":"1212","aliases":[":sg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sk":{"unicode":"1f1f8-1f1f0","unicode_alternates":"","name":"slovakia","shortname":":flag_sk:","category":"flags","emoji_order":"1213","aliases":[":sk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_si":{"unicode":"1f1f8-1f1ee","unicode_alternates":"","name":"slovenia","shortname":":flag_si:","category":"flags","emoji_order":"1214","aliases":[":si:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sb":{"unicode":"1f1f8-1f1e7","unicode_alternates":"","name":"the solomon islands","shortname":":flag_sb:","category":"flags","emoji_order":"1215","aliases":[":sb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_so":{"unicode":"1f1f8-1f1f4","unicode_alternates":"","name":"somalia","shortname":":flag_so:","category":"flags","emoji_order":"1216","aliases":[":so:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_za":{"unicode":"1f1ff-1f1e6","unicode_alternates":"","name":"south africa","shortname":":flag_za:","category":"flags","emoji_order":"1217","aliases":[":za:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_kr":{"unicode":"1f1f0-1f1f7","unicode_alternates":"","name":"korea","shortname":":flag_kr:","category":"flags","emoji_order":"1218","aliases":[":kr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_es":{"unicode":"1f1ea-1f1f8","unicode_alternates":"","name":"spain","shortname":":flag_es:","category":"flags","emoji_order":"1219","aliases":[":es:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_lk":{"unicode":"1f1f1-1f1f0","unicode_alternates":"","name":"sri lanka","shortname":":flag_lk:","category":"flags","emoji_order":"1220","aliases":[":lk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sd":{"unicode":"1f1f8-1f1e9","unicode_alternates":"","name":"sudan","shortname":":flag_sd:","category":"flags","emoji_order":"1221","aliases":[":sd:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sr":{"unicode":"1f1f8-1f1f7","unicode_alternates":"","name":"suriname","shortname":":flag_sr:","category":"flags","emoji_order":"1222","aliases":[":sr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sz":{"unicode":"1f1f8-1f1ff","unicode_alternates":"","name":"swaziland","shortname":":flag_sz:","category":"flags","emoji_order":"1223","aliases":[":sz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_se":{"unicode":"1f1f8-1f1ea","unicode_alternates":"","name":"sweden","shortname":":flag_se:","category":"flags","emoji_order":"1224","aliases":[":se:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ch":{"unicode":"1f1e8-1f1ed","unicode_alternates":"","name":"switzerland","shortname":":flag_ch:","category":"flags","emoji_order":"1225","aliases":[":ch:"],"aliases_ascii":[],"keywords":["country","neutral","flag","flag"]},"flag_sy":{"unicode":"1f1f8-1f1fe","unicode_alternates":"","name":"syria","shortname":":flag_sy:","category":"flags","emoji_order":"1226","aliases":[":sy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tw":{"unicode":"1f1f9-1f1fc","unicode_alternates":"","name":"the republic of china","shortname":":flag_tw:","category":"flags","emoji_order":"1227","aliases":[":tw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tj":{"unicode":"1f1f9-1f1ef","unicode_alternates":"","name":"tajikistan","shortname":":flag_tj:","category":"flags","emoji_order":"1228","aliases":[":tj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tz":{"unicode":"1f1f9-1f1ff","unicode_alternates":"","name":"tanzania","shortname":":flag_tz:","category":"flags","emoji_order":"1229","aliases":[":tz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_th":{"unicode":"1f1f9-1f1ed","unicode_alternates":"","name":"thailand","shortname":":flag_th:","category":"flags","emoji_order":"1230","aliases":[":th:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tl":{"unicode":"1f1f9-1f1f1","unicode_alternates":"","name":"timor-leste","shortname":":flag_tl:","category":"flags","emoji_order":"1231","aliases":[":tl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tg":{"unicode":"1f1f9-1f1ec","unicode_alternates":"","name":"togo","shortname":":flag_tg:","category":"flags","emoji_order":"1232","aliases":[":tg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_to":{"unicode":"1f1f9-1f1f4","unicode_alternates":"","name":"tonga","shortname":":flag_to:","category":"flags","emoji_order":"1233","aliases":[":to:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tt":{"unicode":"1f1f9-1f1f9","unicode_alternates":"","name":"trinidad and tobago","shortname":":flag_tt:","category":"flags","emoji_order":"1234","aliases":[":tt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tn":{"unicode":"1f1f9-1f1f3","unicode_alternates":"","name":"tunisia","shortname":":flag_tn:","category":"flags","emoji_order":"1235","aliases":[":tn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tr":{"unicode":"1f1f9-1f1f7","unicode_alternates":"","name":"turkey","shortname":":flag_tr:","category":"flags","emoji_order":"1236","aliases":[":tr:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tm":{"unicode":"1f1f9-1f1f2","unicode_alternates":"","name":"turkmenistan","shortname":":flag_tm:","category":"flags","emoji_order":"1237","aliases":[":turkmenistan:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tv":{"unicode":"1f1f9-1f1fb","unicode_alternates":"","name":"tuvalu","shortname":":flag_tv:","category":"flags","emoji_order":"1238","aliases":[":tuvalu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ug":{"unicode":"1f1fa-1f1ec","unicode_alternates":"","name":"uganda","shortname":":flag_ug:","category":"flags","emoji_order":"1239","aliases":[":ug:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ua":{"unicode":"1f1fa-1f1e6","unicode_alternates":"","name":"ukraine","shortname":":flag_ua:","category":"flags","emoji_order":"1240","aliases":[":ua:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ae":{"unicode":"1f1e6-1f1ea","unicode_alternates":"","name":"the united arab emirates","shortname":":flag_ae:","category":"flags","emoji_order":"1241","aliases":[":ae:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gb":{"unicode":"1f1ec-1f1e7","unicode_alternates":"","name":"great britain","shortname":":flag_gb:","category":"flags","emoji_order":"1242","aliases":[":gb:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_us":{"unicode":"1f1fa-1f1f8","unicode_alternates":"","name":"united states","shortname":":flag_us:","category":"flags","emoji_order":"1243","aliases":[":us:"],"aliases_ascii":[],"keywords":["america","country","flag","flag"]},"flag_vi":{"unicode":"1f1fb-1f1ee","unicode_alternates":"","name":"u.s. virgin islands","shortname":":flag_vi:","category":"flags","emoji_order":"1244","aliases":[":vi:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_uy":{"unicode":"1f1fa-1f1fe","unicode_alternates":"","name":"uruguay","shortname":":flag_uy:","category":"flags","emoji_order":"1245","aliases":[":uy:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_uz":{"unicode":"1f1fa-1f1ff","unicode_alternates":"","name":"uzbekistan","shortname":":flag_uz:","category":"flags","emoji_order":"1246","aliases":[":uz:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vu":{"unicode":"1f1fb-1f1fa","unicode_alternates":"","name":"vanuatu","shortname":":flag_vu:","category":"flags","emoji_order":"1247","aliases":[":vu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_va":{"unicode":"1f1fb-1f1e6","unicode_alternates":"","name":"the vatican city","shortname":":flag_va:","category":"flags","emoji_order":"1248","aliases":[":va:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ve":{"unicode":"1f1fb-1f1ea","unicode_alternates":"","name":"venezuela","shortname":":flag_ve:","category":"flags","emoji_order":"1249","aliases":[":ve:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vn":{"unicode":"1f1fb-1f1f3","unicode_alternates":"","name":"vietnam","shortname":":flag_vn:","category":"flags","emoji_order":"1250","aliases":[":vn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_wf":{"unicode":"1f1fc-1f1eb","unicode_alternates":"","name":"wallis and futuna","shortname":":flag_wf:","category":"flags","emoji_order":"1251","aliases":[":wf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eh":{"unicode":"1f1ea-1f1ed","unicode_alternates":"","name":"western sahara","shortname":":flag_eh:","category":"flags","emoji_order":"1252","aliases":[":eh:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ye":{"unicode":"1f1fe-1f1ea","unicode_alternates":"","name":"yemen","shortname":":flag_ye:","category":"flags","emoji_order":"1253","aliases":[":ye:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_zm":{"unicode":"1f1ff-1f1f2","unicode_alternates":"","name":"zambia","shortname":":flag_zm:","category":"flags","emoji_order":"1254","aliases":[":zm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_zw":{"unicode":"1f1ff-1f1fc","unicode_alternates":"","name":"zimbabwe","shortname":":flag_zw:","category":"flags","emoji_order":"1255","aliases":[":zw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_re":{"unicode":"1f1f7-1f1ea","unicode_alternates":"","name":"r\u00e9union","shortname":":flag_re:","category":"flags","emoji_order":"1256","aliases":[":re:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ax":{"unicode":"1f1e6-1f1fd","unicode_alternates":"","name":"\u00e5land islands","shortname":":flag_ax:","category":"flags","emoji_order":"1257","aliases":[":ax:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ta":{"unicode":"1f1f9-1f1e6","unicode_alternates":"","name":"tristan da cunha","shortname":":flag_ta:","category":"flags","emoji_order":"1258","aliases":[":ta:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_io":{"unicode":"1f1ee-1f1f4","unicode_alternates":"","name":"british indian ocean territory","shortname":":flag_io:","category":"flags","emoji_order":"1259","aliases":[":io:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bq":{"unicode":"1f1e7-1f1f6","unicode_alternates":"","name":"caribbean netherlands","shortname":":flag_bq:","category":"flags","emoji_order":"1260","aliases":[":bq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cx":{"unicode":"1f1e8-1f1fd","unicode_alternates":"","name":"christmas island","shortname":":flag_cx:","category":"flags","emoji_order":"1261","aliases":[":cx:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cc":{"unicode":"1f1e8-1f1e8","unicode_alternates":"","name":"cocos (keeling) islands","shortname":":flag_cc:","category":"flags","emoji_order":"1262","aliases":[":cc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gg":{"unicode":"1f1ec-1f1ec","unicode_alternates":"","name":"guernsey","shortname":":flag_gg:","category":"flags","emoji_order":"1263","aliases":[":gg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_im":{"unicode":"1f1ee-1f1f2","unicode_alternates":"","name":"isle of man","shortname":":flag_im:","category":"flags","emoji_order":"1264","aliases":[":im:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_yt":{"unicode":"1f1fe-1f1f9","unicode_alternates":"","name":"mayotte","shortname":":flag_yt:","category":"flags","emoji_order":"1265","aliases":[":yt:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_nf":{"unicode":"1f1f3-1f1eb","unicode_alternates":"","name":"norfolk island","shortname":":flag_nf:","category":"flags","emoji_order":"1266","aliases":[":nf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pn":{"unicode":"1f1f5-1f1f3","unicode_alternates":"","name":"pitcairn","shortname":":flag_pn:","category":"flags","emoji_order":"1267","aliases":[":pn:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bl":{"unicode":"1f1e7-1f1f1","unicode_alternates":"","name":"saint barth\u00e9lemy","shortname":":flag_bl:","category":"flags","emoji_order":"1268","aliases":[":bl:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_pm":{"unicode":"1f1f5-1f1f2","unicode_alternates":"","name":"saint pierre and miquelon","shortname":":flag_pm:","category":"flags","emoji_order":"1269","aliases":[":pm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gs":{"unicode":"1f1ec-1f1f8","unicode_alternates":"","name":"south georgia","shortname":":flag_gs:","category":"flags","emoji_order":"1270","aliases":[":gs:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tk":{"unicode":"1f1f9-1f1f0","unicode_alternates":"","name":"tokelau","shortname":":flag_tk:","category":"flags","emoji_order":"1271","aliases":[":tk:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_bv":{"unicode":"1f1e7-1f1fb","unicode_alternates":"","name":"bouvet island","shortname":":flag_bv:","category":"flags","emoji_order":"1272","aliases":[":bv:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_hm":{"unicode":"1f1ed-1f1f2","unicode_alternates":"","name":"heard island and mcdonald islands","shortname":":flag_hm:","category":"flags","emoji_order":"1273","aliases":[":hm:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sj":{"unicode":"1f1f8-1f1ef","unicode_alternates":"","name":"svalbard and jan mayen","shortname":":flag_sj:","category":"flags","emoji_order":"1274","aliases":[":sj:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_um":{"unicode":"1f1fa-1f1f2","unicode_alternates":"","name":"united states minor outlying islands","shortname":":flag_um:","category":"flags","emoji_order":"1275","aliases":[":um:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ic":{"unicode":"1f1ee-1f1e8","unicode_alternates":"","name":"canary islands","shortname":":flag_ic:","category":"flags","emoji_order":"1276","aliases":[":ic:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ea":{"unicode":"1f1ea-1f1e6","unicode_alternates":"","name":"ceuta, melilla","shortname":":flag_ea:","category":"flags","emoji_order":"1277","aliases":[":ea:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cp":{"unicode":"1f1e8-1f1f5","unicode_alternates":"","name":"clipperton island","shortname":":flag_cp:","category":"flags","emoji_order":"1278","aliases":[":cp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_dg":{"unicode":"1f1e9-1f1ec","unicode_alternates":"","name":"diego garcia","shortname":":flag_dg:","category":"flags","emoji_order":"1279","aliases":[":dg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_as":{"unicode":"1f1e6-1f1f8","unicode_alternates":"","name":"american samoa","shortname":":flag_as:","category":"flags","emoji_order":"1280","aliases":[":as:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_aq":{"unicode":"1f1e6-1f1f6","unicode_alternates":"","name":"antarctica","shortname":":flag_aq:","category":"flags","emoji_order":"1281","aliases":[":aq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_vg":{"unicode":"1f1fb-1f1ec","unicode_alternates":"","name":"british virgin islands","shortname":":flag_vg:","category":"flags","emoji_order":"1282","aliases":[":vg:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ck":{"unicode":"1f1e8-1f1f0","unicode_alternates":"","name":"cook islands","shortname":":flag_ck:","category":"flags","emoji_order":"1283","aliases":[":ck:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_cw":{"unicode":"1f1e8-1f1fc","unicode_alternates":"","name":"cura\u00e7ao","shortname":":flag_cw:","category":"flags","emoji_order":"1284","aliases":[":cw:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_eu":{"unicode":"1f1ea-1f1fa","unicode_alternates":"","name":"european union","shortname":":flag_eu:","category":"flags","emoji_order":"1285","aliases":[":eu:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gf":{"unicode":"1f1ec-1f1eb","unicode_alternates":"","name":"french guiana","shortname":":flag_gf:","category":"flags","emoji_order":"1286","aliases":[":gf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tf":{"unicode":"1f1f9-1f1eb","unicode_alternates":"","name":"french southern territories","shortname":":flag_tf:","category":"flags","emoji_order":"1287","aliases":[":tf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_gp":{"unicode":"1f1ec-1f1f5","unicode_alternates":"","name":"guadeloupe","shortname":":flag_gp:","category":"flags","emoji_order":"1288","aliases":[":gp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mq":{"unicode":"1f1f2-1f1f6","unicode_alternates":"","name":"martinique","shortname":":flag_mq:","category":"flags","emoji_order":"1289","aliases":[":mq:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mp":{"unicode":"1f1f2-1f1f5","unicode_alternates":"","name":"northern mariana islands","shortname":":flag_mp:","category":"flags","emoji_order":"1290","aliases":[":mp:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_sx":{"unicode":"1f1f8-1f1fd","unicode_alternates":"","name":"sint maarten","shortname":":flag_sx:","category":"flags","emoji_order":"1291","aliases":[":sx:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_ss":{"unicode":"1f1f8-1f1f8","unicode_alternates":"","name":"south sudan","shortname":":flag_ss:","category":"flags","emoji_order":"1292","aliases":[":ss:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_tc":{"unicode":"1f1f9-1f1e8","unicode_alternates":"","name":"turks and caicos islands","shortname":":flag_tc:","category":"flags","emoji_order":"1293","aliases":[":tc:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"flag_mf":{"unicode":"1f1f2-1f1eb","unicode_alternates":"","name":"saint martin","shortname":":flag_mf:","category":"flags","emoji_order":"1294","aliases":[":mf:"],"aliases_ascii":[],"keywords":["country","flag","flag"]},"raised_hands_tone1":{"unicode":"1f64c-1f3fb","unicode_alternates":"","name":"person raising both hands in celebration tone 1","shortname":":raised_hands_tone1:","category":"people","emoji_order":"1295","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone2":{"unicode":"1f64c-1f3fc","unicode_alternates":"","name":"person raising both hands in celebration tone 2","shortname":":raised_hands_tone2:","category":"people","emoji_order":"1296","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone3":{"unicode":"1f64c-1f3fd","unicode_alternates":"","name":"person raising both hands in celebration tone 3","shortname":":raised_hands_tone3:","category":"people","emoji_order":"1297","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone4":{"unicode":"1f64c-1f3fe","unicode_alternates":"","name":"person raising both hands in celebration tone 4","shortname":":raised_hands_tone4:","category":"people","emoji_order":"1298","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hands_tone5":{"unicode":"1f64c-1f3ff","unicode_alternates":"","name":"person raising both hands in celebration tone 5","shortname":":raised_hands_tone5:","category":"people","emoji_order":"1299","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone1":{"unicode":"1f44f-1f3fb","unicode_alternates":"","name":"clapping hands sign tone 1","shortname":":clap_tone1:","category":"people","emoji_order":"1300","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone2":{"unicode":"1f44f-1f3fc","unicode_alternates":"","name":"clapping hands sign tone 2","shortname":":clap_tone2:","category":"people","emoji_order":"1301","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone3":{"unicode":"1f44f-1f3fd","unicode_alternates":"","name":"clapping hands sign tone 3","shortname":":clap_tone3:","category":"people","emoji_order":"1302","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone4":{"unicode":"1f44f-1f3fe","unicode_alternates":"","name":"clapping hands sign tone 4","shortname":":clap_tone4:","category":"people","emoji_order":"1303","aliases":[],"aliases_ascii":[],"keywords":[]},"clap_tone5":{"unicode":"1f44f-1f3ff","unicode_alternates":"","name":"clapping hands sign tone 5","shortname":":clap_tone5:","category":"people","emoji_order":"1304","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone1":{"unicode":"1f44b-1f3fb","unicode_alternates":"","name":"waving hand sign tone 1","shortname":":wave_tone1:","category":"people","emoji_order":"1305","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone2":{"unicode":"1f44b-1f3fc","unicode_alternates":"","name":"waving hand sign tone 2","shortname":":wave_tone2:","category":"people","emoji_order":"1306","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone3":{"unicode":"1f44b-1f3fd","unicode_alternates":"","name":"waving hand sign tone 3","shortname":":wave_tone3:","category":"people","emoji_order":"1307","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone4":{"unicode":"1f44b-1f3fe","unicode_alternates":"","name":"waving hand sign tone 4","shortname":":wave_tone4:","category":"people","emoji_order":"1308","aliases":[],"aliases_ascii":[],"keywords":[]},"wave_tone5":{"unicode":"1f44b-1f3ff","unicode_alternates":"","name":"waving hand sign tone 5","shortname":":wave_tone5:","category":"people","emoji_order":"1309","aliases":[],"aliases_ascii":[],"keywords":[]},"thumbsup_tone1":{"unicode":"1f44d-1f3fb","unicode_alternates":"","name":"thumbs up sign tone 1","shortname":":thumbsup_tone1:","category":"people","emoji_order":"1310","aliases":[":+1_tone1:",":thumbup_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone2":{"unicode":"1f44d-1f3fc","unicode_alternates":"","name":"thumbs up sign tone 2","shortname":":thumbsup_tone2:","category":"people","emoji_order":"1311","aliases":[":+1_tone2:",":thumbup_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone3":{"unicode":"1f44d-1f3fd","unicode_alternates":"","name":"thumbs up sign tone 3","shortname":":thumbsup_tone3:","category":"people","emoji_order":"1312","aliases":[":+1_tone3:",":thumbup_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone4":{"unicode":"1f44d-1f3fe","unicode_alternates":"","name":"thumbs up sign tone 4","shortname":":thumbsup_tone4:","category":"people","emoji_order":"1313","aliases":[":+1_tone4:",":thumbup_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsup_tone5":{"unicode":"1f44d-1f3ff","unicode_alternates":"","name":"thumbs up sign tone 5","shortname":":thumbsup_tone5:","category":"people","emoji_order":"1314","aliases":[":+1_tone5:",":thumbup_tone5:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone1":{"unicode":"1f44e-1f3fb","unicode_alternates":"","name":"thumbs down sign tone 1","shortname":":thumbsdown_tone1:","category":"people","emoji_order":"1315","aliases":[":-1_tone1:",":thumbdown_tone1:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone2":{"unicode":"1f44e-1f3fc","unicode_alternates":"","name":"thumbs down sign tone 2","shortname":":thumbsdown_tone2:","category":"people","emoji_order":"1316","aliases":[":-1_tone2:",":thumbdown_tone2:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone3":{"unicode":"1f44e-1f3fd","unicode_alternates":"","name":"thumbs down sign tone 3","shortname":":thumbsdown_tone3:","category":"people","emoji_order":"1317","aliases":[":-1_tone3:",":thumbdown_tone3:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone4":{"unicode":"1f44e-1f3fe","unicode_alternates":"","name":"thumbs down sign tone 4","shortname":":thumbsdown_tone4:","category":"people","emoji_order":"1318","aliases":[":-1_tone4:",":thumbdown_tone4:"],"aliases_ascii":[],"keywords":[]},"thumbsdown_tone5":{"unicode":"1f44e-1f3ff","unicode_alternates":"","name":"thumbs down sign tone 5","shortname":":thumbsdown_tone5:","category":"people","emoji_order":"1319","aliases":[":-1_tone5:",":thumbdown_tone5:"],"aliases_ascii":[],"keywords":[]},"punch_tone1":{"unicode":"1f44a-1f3fb","unicode_alternates":"","name":"fisted hand sign tone 1","shortname":":punch_tone1:","category":"people","emoji_order":"1320","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone2":{"unicode":"1f44a-1f3fc","unicode_alternates":"","name":"fisted hand sign tone 2","shortname":":punch_tone2:","category":"people","emoji_order":"1321","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone3":{"unicode":"1f44a-1f3fd","unicode_alternates":"","name":"fisted hand sign tone 3","shortname":":punch_tone3:","category":"people","emoji_order":"1322","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone4":{"unicode":"1f44a-1f3fe","unicode_alternates":"","name":"fisted hand sign tone 4","shortname":":punch_tone4:","category":"people","emoji_order":"1323","aliases":[],"aliases_ascii":[],"keywords":[]},"punch_tone5":{"unicode":"1f44a-1f3ff","unicode_alternates":"","name":"fisted hand sign tone 5","shortname":":punch_tone5:","category":"people","emoji_order":"1324","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone1":{"unicode":"270a-1f3fb","unicode_alternates":"","name":"raised fist tone 1","shortname":":fist_tone1:","category":"people","emoji_order":"1325","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone2":{"unicode":"270a-1f3fc","unicode_alternates":"","name":"raised fist tone 2","shortname":":fist_tone2:","category":"people","emoji_order":"1326","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone3":{"unicode":"270a-1f3fd","unicode_alternates":"","name":"raised fist tone 3","shortname":":fist_tone3:","category":"people","emoji_order":"1327","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone4":{"unicode":"270a-1f3fe","unicode_alternates":"","name":"raised fist tone 4","shortname":":fist_tone4:","category":"people","emoji_order":"1328","aliases":[],"aliases_ascii":[],"keywords":[]},"fist_tone5":{"unicode":"270a-1f3ff","unicode_alternates":"","name":"raised fist tone 5","shortname":":fist_tone5:","category":"people","emoji_order":"1329","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone1":{"unicode":"270c-1f3fb","unicode_alternates":"","name":"victory hand tone 1","shortname":":v_tone1:","category":"people","emoji_order":"1330","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone2":{"unicode":"270c-1f3fc","unicode_alternates":"","name":"victory hand tone 2","shortname":":v_tone2:","category":"people","emoji_order":"1331","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone3":{"unicode":"270c-1f3fd","unicode_alternates":"","name":"victory hand tone 3","shortname":":v_tone3:","category":"people","emoji_order":"1332","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone4":{"unicode":"270c-1f3fe","unicode_alternates":"","name":"victory hand tone 4","shortname":":v_tone4:","category":"people","emoji_order":"1333","aliases":[],"aliases_ascii":[],"keywords":[]},"v_tone5":{"unicode":"270c-1f3ff","unicode_alternates":"","name":"victory hand tone 5","shortname":":v_tone5:","category":"people","emoji_order":"1334","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone1":{"unicode":"1f44c-1f3fb","unicode_alternates":"","name":"ok hand sign tone 1","shortname":":ok_hand_tone1:","category":"people","emoji_order":"1335","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone2":{"unicode":"1f44c-1f3fc","unicode_alternates":"","name":"ok hand sign tone 2","shortname":":ok_hand_tone2:","category":"people","emoji_order":"1336","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone3":{"unicode":"1f44c-1f3fd","unicode_alternates":"","name":"ok hand sign tone 3","shortname":":ok_hand_tone3:","category":"people","emoji_order":"1337","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone4":{"unicode":"1f44c-1f3fe","unicode_alternates":"","name":"ok hand sign tone 4","shortname":":ok_hand_tone4:","category":"people","emoji_order":"1338","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_hand_tone5":{"unicode":"1f44c-1f3ff","unicode_alternates":"","name":"ok hand sign tone 5","shortname":":ok_hand_tone5:","category":"people","emoji_order":"1339","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone1":{"unicode":"270b-1f3fb","unicode_alternates":"","name":"raised hand tone 1","shortname":":raised_hand_tone1:","category":"people","emoji_order":"1340","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone2":{"unicode":"270b-1f3fc","unicode_alternates":"","name":"raised hand tone 2","shortname":":raised_hand_tone2:","category":"people","emoji_order":"1341","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone3":{"unicode":"270b-1f3fd","unicode_alternates":"","name":"raised hand tone 3","shortname":":raised_hand_tone3:","category":"people","emoji_order":"1342","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone4":{"unicode":"270b-1f3fe","unicode_alternates":"","name":"raised hand tone 4","shortname":":raised_hand_tone4:","category":"people","emoji_order":"1343","aliases":[],"aliases_ascii":[],"keywords":[]},"raised_hand_tone5":{"unicode":"270b-1f3ff","unicode_alternates":"","name":"raised hand tone 5","shortname":":raised_hand_tone5:","category":"people","emoji_order":"1344","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone1":{"unicode":"1f450-1f3fb","unicode_alternates":"","name":"open hands sign tone 1","shortname":":open_hands_tone1:","category":"people","emoji_order":"1345","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone2":{"unicode":"1f450-1f3fc","unicode_alternates":"","name":"open hands sign tone 2","shortname":":open_hands_tone2:","category":"people","emoji_order":"1346","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone3":{"unicode":"1f450-1f3fd","unicode_alternates":"","name":"open hands sign tone 3","shortname":":open_hands_tone3:","category":"people","emoji_order":"1347","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone4":{"unicode":"1f450-1f3fe","unicode_alternates":"","name":"open hands sign tone 4","shortname":":open_hands_tone4:","category":"people","emoji_order":"1348","aliases":[],"aliases_ascii":[],"keywords":[]},"open_hands_tone5":{"unicode":"1f450-1f3ff","unicode_alternates":"","name":"open hands sign tone 5","shortname":":open_hands_tone5:","category":"people","emoji_order":"1349","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone1":{"unicode":"1f4aa-1f3fb","unicode_alternates":"","name":"flexed biceps tone 1","shortname":":muscle_tone1:","category":"people","emoji_order":"1350","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone2":{"unicode":"1f4aa-1f3fc","unicode_alternates":"","name":"flexed biceps tone 2","shortname":":muscle_tone2:","category":"people","emoji_order":"1351","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone3":{"unicode":"1f4aa-1f3fd","unicode_alternates":"","name":"flexed biceps tone 3","shortname":":muscle_tone3:","category":"people","emoji_order":"1352","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone4":{"unicode":"1f4aa-1f3fe","unicode_alternates":"","name":"flexed biceps tone 4","shortname":":muscle_tone4:","category":"people","emoji_order":"1353","aliases":[],"aliases_ascii":[],"keywords":[]},"muscle_tone5":{"unicode":"1f4aa-1f3ff","unicode_alternates":"","name":"flexed biceps tone 5","shortname":":muscle_tone5:","category":"people","emoji_order":"1354","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone1":{"unicode":"1f64f-1f3fb","unicode_alternates":"","name":"person with folded hands tone 1","shortname":":pray_tone1:","category":"people","emoji_order":"1355","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone2":{"unicode":"1f64f-1f3fc","unicode_alternates":"","name":"person with folded hands tone 2","shortname":":pray_tone2:","category":"people","emoji_order":"1356","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone3":{"unicode":"1f64f-1f3fd","unicode_alternates":"","name":"person with folded hands tone 3","shortname":":pray_tone3:","category":"people","emoji_order":"1357","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone4":{"unicode":"1f64f-1f3fe","unicode_alternates":"","name":"person with folded hands tone 4","shortname":":pray_tone4:","category":"people","emoji_order":"1358","aliases":[],"aliases_ascii":[],"keywords":[]},"pray_tone5":{"unicode":"1f64f-1f3ff","unicode_alternates":"","name":"person with folded hands tone 5","shortname":":pray_tone5:","category":"people","emoji_order":"1359","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone1":{"unicode":"261d-1f3fb","unicode_alternates":"","name":"white up pointing index tone 1","shortname":":point_up_tone1:","category":"people","emoji_order":"1360","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone2":{"unicode":"261d-1f3fc","unicode_alternates":"","name":"white up pointing index tone 2","shortname":":point_up_tone2:","category":"people","emoji_order":"1361","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone3":{"unicode":"261d-1f3fd","unicode_alternates":"","name":"white up pointing index tone 3","shortname":":point_up_tone3:","category":"people","emoji_order":"1362","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone4":{"unicode":"261d-1f3fe","unicode_alternates":"","name":"white up pointing index tone 4","shortname":":point_up_tone4:","category":"people","emoji_order":"1363","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_tone5":{"unicode":"261d-1f3ff","unicode_alternates":"","name":"white up pointing index tone 5","shortname":":point_up_tone5:","category":"people","emoji_order":"1364","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone1":{"unicode":"1f446-1f3fb","unicode_alternates":"","name":"white up pointing backhand index tone 1","shortname":":point_up_2_tone1:","category":"people","emoji_order":"1365","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone2":{"unicode":"1f446-1f3fc","unicode_alternates":"","name":"white up pointing backhand index tone 2","shortname":":point_up_2_tone2:","category":"people","emoji_order":"1366","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone3":{"unicode":"1f446-1f3fd","unicode_alternates":"","name":"white up pointing backhand index tone 3","shortname":":point_up_2_tone3:","category":"people","emoji_order":"1367","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone4":{"unicode":"1f446-1f3fe","unicode_alternates":"","name":"white up pointing backhand index tone 4","shortname":":point_up_2_tone4:","category":"people","emoji_order":"1368","aliases":[],"aliases_ascii":[],"keywords":[]},"point_up_2_tone5":{"unicode":"1f446-1f3ff","unicode_alternates":"","name":"white up pointing backhand index tone 5","shortname":":point_up_2_tone5:","category":"people","emoji_order":"1369","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone1":{"unicode":"1f447-1f3fb","unicode_alternates":"","name":"white down pointing backhand index tone 1","shortname":":point_down_tone1:","category":"people","emoji_order":"1370","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone2":{"unicode":"1f447-1f3fc","unicode_alternates":"","name":"white down pointing backhand index tone 2","shortname":":point_down_tone2:","category":"people","emoji_order":"1371","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone3":{"unicode":"1f447-1f3fd","unicode_alternates":"","name":"white down pointing backhand index tone 3","shortname":":point_down_tone3:","category":"people","emoji_order":"1372","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone4":{"unicode":"1f447-1f3fe","unicode_alternates":"","name":"white down pointing backhand index tone 4","shortname":":point_down_tone4:","category":"people","emoji_order":"1373","aliases":[],"aliases_ascii":[],"keywords":[]},"point_down_tone5":{"unicode":"1f447-1f3ff","unicode_alternates":"","name":"white down pointing backhand index tone 5","shortname":":point_down_tone5:","category":"people","emoji_order":"1374","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone1":{"unicode":"1f448-1f3fb","unicode_alternates":"","name":"white left pointing backhand index tone 1","shortname":":point_left_tone1:","category":"people","emoji_order":"1375","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone2":{"unicode":"1f448-1f3fc","unicode_alternates":"","name":"white left pointing backhand index tone 2","shortname":":point_left_tone2:","category":"people","emoji_order":"1376","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone3":{"unicode":"1f448-1f3fd","unicode_alternates":"","name":"white left pointing backhand index tone 3","shortname":":point_left_tone3:","category":"people","emoji_order":"1377","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone4":{"unicode":"1f448-1f3fe","unicode_alternates":"","name":"white left pointing backhand index tone 4","shortname":":point_left_tone4:","category":"people","emoji_order":"1378","aliases":[],"aliases_ascii":[],"keywords":[]},"point_left_tone5":{"unicode":"1f448-1f3ff","unicode_alternates":"","name":"white left pointing backhand index tone 5","shortname":":point_left_tone5:","category":"people","emoji_order":"1379","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone1":{"unicode":"1f449-1f3fb","unicode_alternates":"","name":"white right pointing backhand index tone 1","shortname":":point_right_tone1:","category":"people","emoji_order":"1380","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone2":{"unicode":"1f449-1f3fc","unicode_alternates":"","name":"white right pointing backhand index tone 2","shortname":":point_right_tone2:","category":"people","emoji_order":"1381","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone3":{"unicode":"1f449-1f3fd","unicode_alternates":"","name":"white right pointing backhand index tone 3","shortname":":point_right_tone3:","category":"people","emoji_order":"1382","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone4":{"unicode":"1f449-1f3fe","unicode_alternates":"","name":"white right pointing backhand index tone 4","shortname":":point_right_tone4:","category":"people","emoji_order":"1383","aliases":[],"aliases_ascii":[],"keywords":[]},"point_right_tone5":{"unicode":"1f449-1f3ff","unicode_alternates":"","name":"white right pointing backhand index tone 5","shortname":":point_right_tone5:","category":"people","emoji_order":"1384","aliases":[],"aliases_ascii":[],"keywords":[]},"middle_finger_tone1":{"unicode":"1f595-1f3fb","unicode_alternates":"","name":"reversed hand with middle finger extended tone 1","shortname":":middle_finger_tone1:","category":"people","emoji_order":"1385","aliases":[":reversed_hand_with_middle_finger_extended_tone1:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone2":{"unicode":"1f595-1f3fc","unicode_alternates":"","name":"reversed hand with middle finger extended tone 2","shortname":":middle_finger_tone2:","category":"people","emoji_order":"1386","aliases":[":reversed_hand_with_middle_finger_extended_tone2:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone3":{"unicode":"1f595-1f3fd","unicode_alternates":"","name":"reversed hand with middle finger extended tone 3","shortname":":middle_finger_tone3:","category":"people","emoji_order":"1387","aliases":[":reversed_hand_with_middle_finger_extended_tone3:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone4":{"unicode":"1f595-1f3fe","unicode_alternates":"","name":"reversed hand with middle finger extended tone 4","shortname":":middle_finger_tone4:","category":"people","emoji_order":"1388","aliases":[":reversed_hand_with_middle_finger_extended_tone4:"],"aliases_ascii":[],"keywords":[]},"middle_finger_tone5":{"unicode":"1f595-1f3ff","unicode_alternates":"","name":"reversed hand with middle finger extended tone 5","shortname":":middle_finger_tone5:","category":"people","emoji_order":"1389","aliases":[":reversed_hand_with_middle_finger_extended_tone5:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone1":{"unicode":"1f590-1f3fb","unicode_alternates":"","name":"raised hand with fingers splayed tone 1","shortname":":hand_splayed_tone1:","category":"people","emoji_order":"1390","aliases":[":raised_hand_with_fingers_splayed_tone1:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone2":{"unicode":"1f590-1f3fc","unicode_alternates":"","name":"raised hand with fingers splayed tone 2","shortname":":hand_splayed_tone2:","category":"people","emoji_order":"1391","aliases":[":raised_hand_with_fingers_splayed_tone2:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone3":{"unicode":"1f590-1f3fd","unicode_alternates":"","name":"raised hand with fingers splayed tone 3","shortname":":hand_splayed_tone3:","category":"people","emoji_order":"1392","aliases":[":raised_hand_with_fingers_splayed_tone3:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone4":{"unicode":"1f590-1f3fe","unicode_alternates":"","name":"raised hand with fingers splayed tone 4","shortname":":hand_splayed_tone4:","category":"people","emoji_order":"1393","aliases":[":raised_hand_with_fingers_splayed_tone4:"],"aliases_ascii":[],"keywords":[]},"hand_splayed_tone5":{"unicode":"1f590-1f3ff","unicode_alternates":"","name":"raised hand with fingers splayed tone 5","shortname":":hand_splayed_tone5:","category":"people","emoji_order":"1394","aliases":[":raised_hand_with_fingers_splayed_tone5:"],"aliases_ascii":[],"keywords":[]},"metal_tone1":{"unicode":"1f918-1f3fb","unicode_alternates":"","name":"sign of the horns tone 1","shortname":":metal_tone1:","category":"people","emoji_order":"1395","aliases":[":sign_of_the_horns_tone1:"],"aliases_ascii":[],"keywords":[]},"metal_tone2":{"unicode":"1f918-1f3fc","unicode_alternates":"","name":"sign of the horns tone 2","shortname":":metal_tone2:","category":"people","emoji_order":"1396","aliases":[":sign_of_the_horns_tone2:"],"aliases_ascii":[],"keywords":[]},"metal_tone3":{"unicode":"1f918-1f3fd","unicode_alternates":"","name":"sign of the horns tone 3","shortname":":metal_tone3:","category":"people","emoji_order":"1397","aliases":[":sign_of_the_horns_tone3:"],"aliases_ascii":[],"keywords":[]},"metal_tone4":{"unicode":"1f918-1f3fe","unicode_alternates":"","name":"sign of the horns tone 4","shortname":":metal_tone4:","category":"people","emoji_order":"1398","aliases":[":sign_of_the_horns_tone4:"],"aliases_ascii":[],"keywords":[]},"metal_tone5":{"unicode":"1f918-1f3ff","unicode_alternates":"","name":"sign of the horns tone 5","shortname":":metal_tone5:","category":"people","emoji_order":"1399","aliases":[":sign_of_the_horns_tone5:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone1":{"unicode":"1f596-1f3fb","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 1","shortname":":vulcan_tone1:","category":"people","emoji_order":"1400","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone1:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone2":{"unicode":"1f596-1f3fc","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 2","shortname":":vulcan_tone2:","category":"people","emoji_order":"1401","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone2:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone3":{"unicode":"1f596-1f3fd","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 3","shortname":":vulcan_tone3:","category":"people","emoji_order":"1402","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone3:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone4":{"unicode":"1f596-1f3fe","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 4","shortname":":vulcan_tone4:","category":"people","emoji_order":"1403","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone4:"],"aliases_ascii":[],"keywords":[]},"vulcan_tone5":{"unicode":"1f596-1f3ff","unicode_alternates":"","name":"raised hand with part between middle and ring fingers tone 5","shortname":":vulcan_tone5:","category":"people","emoji_order":"1404","aliases":[":raised_hand_with_part_between_middle_and_ring_fingers_tone5:"],"aliases_ascii":[],"keywords":[]},"writing_hand_tone1":{"unicode":"270d-1f3fb","unicode_alternates":"","name":"writing hand tone 1","shortname":":writing_hand_tone1:","category":"people","emoji_order":"1405","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone2":{"unicode":"270d-1f3fc","unicode_alternates":"","name":"writing hand tone 2","shortname":":writing_hand_tone2:","category":"people","emoji_order":"1406","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone3":{"unicode":"270d-1f3fd","unicode_alternates":"","name":"writing hand tone 3","shortname":":writing_hand_tone3:","category":"people","emoji_order":"1407","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone4":{"unicode":"270d-1f3fe","unicode_alternates":"","name":"writing hand tone 4","shortname":":writing_hand_tone4:","category":"people","emoji_order":"1408","aliases":[],"aliases_ascii":[],"keywords":[]},"writing_hand_tone5":{"unicode":"270d-1f3ff","unicode_alternates":"","name":"writing hand tone 5","shortname":":writing_hand_tone5:","category":"people","emoji_order":"1409","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone1":{"unicode":"1f485-1f3fb","unicode_alternates":"","name":"nail polish tone 1","shortname":":nail_care_tone1:","category":"people","emoji_order":"1410","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone2":{"unicode":"1f485-1f3fc","unicode_alternates":"","name":"nail polish tone 2","shortname":":nail_care_tone2:","category":"people","emoji_order":"1411","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone3":{"unicode":"1f485-1f3fd","unicode_alternates":"","name":"nail polish tone 3","shortname":":nail_care_tone3:","category":"people","emoji_order":"1412","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone4":{"unicode":"1f485-1f3fe","unicode_alternates":"","name":"nail polish tone 4","shortname":":nail_care_tone4:","category":"people","emoji_order":"1413","aliases":[],"aliases_ascii":[],"keywords":[]},"nail_care_tone5":{"unicode":"1f485-1f3ff","unicode_alternates":"","name":"nail polish tone 5","shortname":":nail_care_tone5:","category":"people","emoji_order":"1414","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone1":{"unicode":"1f442-1f3fb","unicode_alternates":"","name":"ear tone 1","shortname":":ear_tone1:","category":"people","emoji_order":"1415","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone2":{"unicode":"1f442-1f3fc","unicode_alternates":"","name":"ear tone 2","shortname":":ear_tone2:","category":"people","emoji_order":"1416","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone3":{"unicode":"1f442-1f3fd","unicode_alternates":"","name":"ear tone 3","shortname":":ear_tone3:","category":"people","emoji_order":"1417","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone4":{"unicode":"1f442-1f3fe","unicode_alternates":"","name":"ear tone 4","shortname":":ear_tone4:","category":"people","emoji_order":"1418","aliases":[],"aliases_ascii":[],"keywords":[]},"ear_tone5":{"unicode":"1f442-1f3ff","unicode_alternates":"","name":"ear tone 5","shortname":":ear_tone5:","category":"people","emoji_order":"1419","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone1":{"unicode":"1f443-1f3fb","unicode_alternates":"","name":"nose tone 1","shortname":":nose_tone1:","category":"people","emoji_order":"1420","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone2":{"unicode":"1f443-1f3fc","unicode_alternates":"","name":"nose tone 2","shortname":":nose_tone2:","category":"people","emoji_order":"1421","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone3":{"unicode":"1f443-1f3fd","unicode_alternates":"","name":"nose tone 3","shortname":":nose_tone3:","category":"people","emoji_order":"1422","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone4":{"unicode":"1f443-1f3fe","unicode_alternates":"","name":"nose tone 4","shortname":":nose_tone4:","category":"people","emoji_order":"1423","aliases":[],"aliases_ascii":[],"keywords":[]},"nose_tone5":{"unicode":"1f443-1f3ff","unicode_alternates":"","name":"nose tone 5","shortname":":nose_tone5:","category":"people","emoji_order":"1424","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone1":{"unicode":"1f476-1f3fb","unicode_alternates":"","name":"baby tone 1","shortname":":baby_tone1:","category":"people","emoji_order":"1425","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone2":{"unicode":"1f476-1f3fc","unicode_alternates":"","name":"baby tone 2","shortname":":baby_tone2:","category":"people","emoji_order":"1426","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone3":{"unicode":"1f476-1f3fd","unicode_alternates":"","name":"baby tone 3","shortname":":baby_tone3:","category":"people","emoji_order":"1427","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone4":{"unicode":"1f476-1f3fe","unicode_alternates":"","name":"baby tone 4","shortname":":baby_tone4:","category":"people","emoji_order":"1428","aliases":[],"aliases_ascii":[],"keywords":[]},"baby_tone5":{"unicode":"1f476-1f3ff","unicode_alternates":"","name":"baby tone 5","shortname":":baby_tone5:","category":"people","emoji_order":"1429","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone1":{"unicode":"1f466-1f3fb","unicode_alternates":"","name":"boy tone 1","shortname":":boy_tone1:","category":"people","emoji_order":"1430","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone2":{"unicode":"1f466-1f3fc","unicode_alternates":"","name":"boy tone 2","shortname":":boy_tone2:","category":"people","emoji_order":"1431","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone3":{"unicode":"1f466-1f3fd","unicode_alternates":"","name":"boy tone 3","shortname":":boy_tone3:","category":"people","emoji_order":"1432","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone4":{"unicode":"1f466-1f3fe","unicode_alternates":"","name":"boy tone 4","shortname":":boy_tone4:","category":"people","emoji_order":"1433","aliases":[],"aliases_ascii":[],"keywords":[]},"boy_tone5":{"unicode":"1f466-1f3ff","unicode_alternates":"","name":"boy tone 5","shortname":":boy_tone5:","category":"people","emoji_order":"1434","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone1":{"unicode":"1f467-1f3fb","unicode_alternates":"","name":"girl tone 1","shortname":":girl_tone1:","category":"people","emoji_order":"1435","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone2":{"unicode":"1f467-1f3fc","unicode_alternates":"","name":"girl tone 2","shortname":":girl_tone2:","category":"people","emoji_order":"1436","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone3":{"unicode":"1f467-1f3fd","unicode_alternates":"","name":"girl tone 3","shortname":":girl_tone3:","category":"people","emoji_order":"1437","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone4":{"unicode":"1f467-1f3fe","unicode_alternates":"","name":"girl tone 4","shortname":":girl_tone4:","category":"people","emoji_order":"1438","aliases":[],"aliases_ascii":[],"keywords":[]},"girl_tone5":{"unicode":"1f467-1f3ff","unicode_alternates":"","name":"girl tone 5","shortname":":girl_tone5:","category":"people","emoji_order":"1439","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone1":{"unicode":"1f468-1f3fb","unicode_alternates":"","name":"man tone 1","shortname":":man_tone1:","category":"people","emoji_order":"1440","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone2":{"unicode":"1f468-1f3fc","unicode_alternates":"","name":"man tone 2","shortname":":man_tone2:","category":"people","emoji_order":"1441","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone3":{"unicode":"1f468-1f3fd","unicode_alternates":"","name":"man tone 3","shortname":":man_tone3:","category":"people","emoji_order":"1442","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone4":{"unicode":"1f468-1f3fe","unicode_alternates":"","name":"man tone 4","shortname":":man_tone4:","category":"people","emoji_order":"1443","aliases":[],"aliases_ascii":[],"keywords":[]},"man_tone5":{"unicode":"1f468-1f3ff","unicode_alternates":"","name":"man tone 5","shortname":":man_tone5:","category":"people","emoji_order":"1444","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone1":{"unicode":"1f469-1f3fb","unicode_alternates":"","name":"woman tone 1","shortname":":woman_tone1:","category":"people","emoji_order":"1445","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone2":{"unicode":"1f469-1f3fc","unicode_alternates":"","name":"woman tone 2","shortname":":woman_tone2:","category":"people","emoji_order":"1446","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone3":{"unicode":"1f469-1f3fd","unicode_alternates":"","name":"woman tone 3","shortname":":woman_tone3:","category":"people","emoji_order":"1447","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone4":{"unicode":"1f469-1f3fe","unicode_alternates":"","name":"woman tone 4","shortname":":woman_tone4:","category":"people","emoji_order":"1448","aliases":[],"aliases_ascii":[],"keywords":[]},"woman_tone5":{"unicode":"1f469-1f3ff","unicode_alternates":"","name":"woman tone 5","shortname":":woman_tone5:","category":"people","emoji_order":"1449","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone1":{"unicode":"1f471-1f3fb","unicode_alternates":"","name":"person with blond hair tone 1","shortname":":person_with_blond_hair_tone1:","category":"people","emoji_order":"1450","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone2":{"unicode":"1f471-1f3fc","unicode_alternates":"","name":"person with blond hair tone 2","shortname":":person_with_blond_hair_tone2:","category":"people","emoji_order":"1451","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone3":{"unicode":"1f471-1f3fd","unicode_alternates":"","name":"person with blond hair tone 3","shortname":":person_with_blond_hair_tone3:","category":"people","emoji_order":"1452","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone4":{"unicode":"1f471-1f3fe","unicode_alternates":"","name":"person with blond hair tone 4","shortname":":person_with_blond_hair_tone4:","category":"people","emoji_order":"1453","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_blond_hair_tone5":{"unicode":"1f471-1f3ff","unicode_alternates":"","name":"person with blond hair tone 5","shortname":":person_with_blond_hair_tone5:","category":"people","emoji_order":"1454","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone1":{"unicode":"1f474-1f3fb","unicode_alternates":"","name":"older man tone 1","shortname":":older_man_tone1:","category":"people","emoji_order":"1455","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone2":{"unicode":"1f474-1f3fc","unicode_alternates":"","name":"older man tone 2","shortname":":older_man_tone2:","category":"people","emoji_order":"1456","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone3":{"unicode":"1f474-1f3fd","unicode_alternates":"","name":"older man tone 3","shortname":":older_man_tone3:","category":"people","emoji_order":"1457","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone4":{"unicode":"1f474-1f3fe","unicode_alternates":"","name":"older man tone 4","shortname":":older_man_tone4:","category":"people","emoji_order":"1458","aliases":[],"aliases_ascii":[],"keywords":[]},"older_man_tone5":{"unicode":"1f474-1f3ff","unicode_alternates":"","name":"older man tone 5","shortname":":older_man_tone5:","category":"people","emoji_order":"1459","aliases":[],"aliases_ascii":[],"keywords":[]},"older_woman_tone1":{"unicode":"1f475-1f3fb","unicode_alternates":"","name":"older woman tone 1","shortname":":older_woman_tone1:","category":"people","emoji_order":"1460","aliases":[":grandma_tone1:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone2":{"unicode":"1f475-1f3fc","unicode_alternates":"","name":"older woman tone 2","shortname":":older_woman_tone2:","category":"people","emoji_order":"1461","aliases":[":grandma_tone2:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone3":{"unicode":"1f475-1f3fd","unicode_alternates":"","name":"older woman tone 3","shortname":":older_woman_tone3:","category":"people","emoji_order":"1462","aliases":[":grandma_tone3:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone4":{"unicode":"1f475-1f3fe","unicode_alternates":"","name":"older woman tone 4","shortname":":older_woman_tone4:","category":"people","emoji_order":"1463","aliases":[":grandma_tone4:"],"aliases_ascii":[],"keywords":[]},"older_woman_tone5":{"unicode":"1f475-1f3ff","unicode_alternates":"","name":"older woman tone 5","shortname":":older_woman_tone5:","category":"people","emoji_order":"1464","aliases":[":grandma_tone5:"],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone1":{"unicode":"1f472-1f3fb","unicode_alternates":"","name":"man with gua pi mao tone 1","shortname":":man_with_gua_pi_mao_tone1:","category":"people","emoji_order":"1465","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone2":{"unicode":"1f472-1f3fc","unicode_alternates":"","name":"man with gua pi mao tone 2","shortname":":man_with_gua_pi_mao_tone2:","category":"people","emoji_order":"1466","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone3":{"unicode":"1f472-1f3fd","unicode_alternates":"","name":"man with gua pi mao tone 3","shortname":":man_with_gua_pi_mao_tone3:","category":"people","emoji_order":"1467","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone4":{"unicode":"1f472-1f3fe","unicode_alternates":"","name":"man with gua pi mao tone 4","shortname":":man_with_gua_pi_mao_tone4:","category":"people","emoji_order":"1468","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_gua_pi_mao_tone5":{"unicode":"1f472-1f3ff","unicode_alternates":"","name":"man with gua pi mao tone 5","shortname":":man_with_gua_pi_mao_tone5:","category":"people","emoji_order":"1469","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone1":{"unicode":"1f473-1f3fb","unicode_alternates":"","name":"man with turban tone 1","shortname":":man_with_turban_tone1:","category":"people","emoji_order":"1470","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone2":{"unicode":"1f473-1f3fc","unicode_alternates":"","name":"man with turban tone 2","shortname":":man_with_turban_tone2:","category":"people","emoji_order":"1471","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone3":{"unicode":"1f473-1f3fd","unicode_alternates":"","name":"man with turban tone 3","shortname":":man_with_turban_tone3:","category":"people","emoji_order":"1472","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone4":{"unicode":"1f473-1f3fe","unicode_alternates":"","name":"man with turban tone 4","shortname":":man_with_turban_tone4:","category":"people","emoji_order":"1473","aliases":[],"aliases_ascii":[],"keywords":[]},"man_with_turban_tone5":{"unicode":"1f473-1f3ff","unicode_alternates":"","name":"man with turban tone 5","shortname":":man_with_turban_tone5:","category":"people","emoji_order":"1474","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone1":{"unicode":"1f46e-1f3fb","unicode_alternates":"","name":"police officer tone 1","shortname":":cop_tone1:","category":"people","emoji_order":"1475","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone2":{"unicode":"1f46e-1f3fc","unicode_alternates":"","name":"police officer tone 2","shortname":":cop_tone2:","category":"people","emoji_order":"1476","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone3":{"unicode":"1f46e-1f3fd","unicode_alternates":"","name":"police officer tone 3","shortname":":cop_tone3:","category":"people","emoji_order":"1477","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone4":{"unicode":"1f46e-1f3fe","unicode_alternates":"","name":"police officer tone 4","shortname":":cop_tone4:","category":"people","emoji_order":"1478","aliases":[],"aliases_ascii":[],"keywords":[]},"cop_tone5":{"unicode":"1f46e-1f3ff","unicode_alternates":"","name":"police officer tone 5","shortname":":cop_tone5:","category":"people","emoji_order":"1479","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone1":{"unicode":"1f477-1f3fb","unicode_alternates":"","name":"construction worker tone 1","shortname":":construction_worker_tone1:","category":"people","emoji_order":"1480","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone2":{"unicode":"1f477-1f3fc","unicode_alternates":"","name":"construction worker tone 2","shortname":":construction_worker_tone2:","category":"people","emoji_order":"1481","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone3":{"unicode":"1f477-1f3fd","unicode_alternates":"","name":"construction worker tone 3","shortname":":construction_worker_tone3:","category":"people","emoji_order":"1482","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone4":{"unicode":"1f477-1f3fe","unicode_alternates":"","name":"construction worker tone 4","shortname":":construction_worker_tone4:","category":"people","emoji_order":"1483","aliases":[],"aliases_ascii":[],"keywords":[]},"construction_worker_tone5":{"unicode":"1f477-1f3ff","unicode_alternates":"","name":"construction worker tone 5","shortname":":construction_worker_tone5:","category":"people","emoji_order":"1484","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone1":{"unicode":"1f482-1f3fb","unicode_alternates":"","name":"guardsman tone 1","shortname":":guardsman_tone1:","category":"people","emoji_order":"1485","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone2":{"unicode":"1f482-1f3fc","unicode_alternates":"","name":"guardsman tone 2","shortname":":guardsman_tone2:","category":"people","emoji_order":"1486","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone3":{"unicode":"1f482-1f3fd","unicode_alternates":"","name":"guardsman tone 3","shortname":":guardsman_tone3:","category":"people","emoji_order":"1487","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone4":{"unicode":"1f482-1f3fe","unicode_alternates":"","name":"guardsman tone 4","shortname":":guardsman_tone4:","category":"people","emoji_order":"1488","aliases":[],"aliases_ascii":[],"keywords":[]},"guardsman_tone5":{"unicode":"1f482-1f3ff","unicode_alternates":"","name":"guardsman tone 5","shortname":":guardsman_tone5:","category":"people","emoji_order":"1489","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone1":{"unicode":"1f385-1f3fb","unicode_alternates":"","name":"father christmas tone 1","shortname":":santa_tone1:","category":"people","emoji_order":"1490","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone2":{"unicode":"1f385-1f3fc","unicode_alternates":"","name":"father christmas tone 2","shortname":":santa_tone2:","category":"people","emoji_order":"1491","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone3":{"unicode":"1f385-1f3fd","unicode_alternates":"","name":"father christmas tone 3","shortname":":santa_tone3:","category":"people","emoji_order":"1492","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone4":{"unicode":"1f385-1f3fe","unicode_alternates":"","name":"father christmas tone 4","shortname":":santa_tone4:","category":"people","emoji_order":"1493","aliases":[],"aliases_ascii":[],"keywords":[]},"santa_tone5":{"unicode":"1f385-1f3ff","unicode_alternates":"","name":"father christmas tone 5","shortname":":santa_tone5:","category":"people","emoji_order":"1494","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone1":{"unicode":"1f47c-1f3fb","unicode_alternates":"","name":"baby angel tone 1","shortname":":angel_tone1:","category":"people","emoji_order":"1495","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone2":{"unicode":"1f47c-1f3fc","unicode_alternates":"","name":"baby angel tone 2","shortname":":angel_tone2:","category":"people","emoji_order":"1496","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone3":{"unicode":"1f47c-1f3fd","unicode_alternates":"","name":"baby angel tone 3","shortname":":angel_tone3:","category":"people","emoji_order":"1497","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone4":{"unicode":"1f47c-1f3fe","unicode_alternates":"","name":"baby angel tone 4","shortname":":angel_tone4:","category":"people","emoji_order":"1498","aliases":[],"aliases_ascii":[],"keywords":[]},"angel_tone5":{"unicode":"1f47c-1f3ff","unicode_alternates":"","name":"baby angel tone 5","shortname":":angel_tone5:","category":"people","emoji_order":"1499","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone1":{"unicode":"1f478-1f3fb","unicode_alternates":"","name":"princess tone 1","shortname":":princess_tone1:","category":"people","emoji_order":"1500","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone2":{"unicode":"1f478-1f3fc","unicode_alternates":"","name":"princess tone 2","shortname":":princess_tone2:","category":"people","emoji_order":"1501","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone3":{"unicode":"1f478-1f3fd","unicode_alternates":"","name":"princess tone 3","shortname":":princess_tone3:","category":"people","emoji_order":"1502","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone4":{"unicode":"1f478-1f3fe","unicode_alternates":"","name":"princess tone 4","shortname":":princess_tone4:","category":"people","emoji_order":"1503","aliases":[],"aliases_ascii":[],"keywords":[]},"princess_tone5":{"unicode":"1f478-1f3ff","unicode_alternates":"","name":"princess tone 5","shortname":":princess_tone5:","category":"people","emoji_order":"1504","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone1":{"unicode":"1f470-1f3fb","unicode_alternates":"","name":"bride with veil tone 1","shortname":":bride_with_veil_tone1:","category":"people","emoji_order":"1505","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone2":{"unicode":"1f470-1f3fc","unicode_alternates":"","name":"bride with veil tone 2","shortname":":bride_with_veil_tone2:","category":"people","emoji_order":"1506","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone3":{"unicode":"1f470-1f3fd","unicode_alternates":"","name":"bride with veil tone 3","shortname":":bride_with_veil_tone3:","category":"people","emoji_order":"1507","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone4":{"unicode":"1f470-1f3fe","unicode_alternates":"","name":"bride with veil tone 4","shortname":":bride_with_veil_tone4:","category":"people","emoji_order":"1508","aliases":[],"aliases_ascii":[],"keywords":[]},"bride_with_veil_tone5":{"unicode":"1f470-1f3ff","unicode_alternates":"","name":"bride with veil tone 5","shortname":":bride_with_veil_tone5:","category":"people","emoji_order":"1509","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone1":{"unicode":"1f6b6-1f3fb","unicode_alternates":"","name":"pedestrian tone 1","shortname":":walking_tone1:","category":"people","emoji_order":"1510","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone2":{"unicode":"1f6b6-1f3fc","unicode_alternates":"","name":"pedestrian tone 2","shortname":":walking_tone2:","category":"people","emoji_order":"1511","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone3":{"unicode":"1f6b6-1f3fd","unicode_alternates":"","name":"pedestrian tone 3","shortname":":walking_tone3:","category":"people","emoji_order":"1512","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone4":{"unicode":"1f6b6-1f3fe","unicode_alternates":"","name":"pedestrian tone 4","shortname":":walking_tone4:","category":"people","emoji_order":"1513","aliases":[],"aliases_ascii":[],"keywords":[]},"walking_tone5":{"unicode":"1f6b6-1f3ff","unicode_alternates":"","name":"pedestrian tone 5","shortname":":walking_tone5:","category":"people","emoji_order":"1514","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone1":{"unicode":"1f3c3-1f3fb","unicode_alternates":"","name":"runner tone 1","shortname":":runner_tone1:","category":"people","emoji_order":"1515","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone2":{"unicode":"1f3c3-1f3fc","unicode_alternates":"","name":"runner tone 2","shortname":":runner_tone2:","category":"people","emoji_order":"1516","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone3":{"unicode":"1f3c3-1f3fd","unicode_alternates":"","name":"runner tone 3","shortname":":runner_tone3:","category":"people","emoji_order":"1517","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone4":{"unicode":"1f3c3-1f3fe","unicode_alternates":"","name":"runner tone 4","shortname":":runner_tone4:","category":"people","emoji_order":"1518","aliases":[],"aliases_ascii":[],"keywords":[]},"runner_tone5":{"unicode":"1f3c3-1f3ff","unicode_alternates":"","name":"runner tone 5","shortname":":runner_tone5:","category":"people","emoji_order":"1519","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone1":{"unicode":"1f483-1f3fb","unicode_alternates":"","name":"dancer tone 1","shortname":":dancer_tone1:","category":"people","emoji_order":"1520","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone2":{"unicode":"1f483-1f3fc","unicode_alternates":"","name":"dancer tone 2","shortname":":dancer_tone2:","category":"people","emoji_order":"1521","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone3":{"unicode":"1f483-1f3fd","unicode_alternates":"","name":"dancer tone 3","shortname":":dancer_tone3:","category":"people","emoji_order":"1522","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone4":{"unicode":"1f483-1f3fe","unicode_alternates":"","name":"dancer tone 4","shortname":":dancer_tone4:","category":"people","emoji_order":"1523","aliases":[],"aliases_ascii":[],"keywords":[]},"dancer_tone5":{"unicode":"1f483-1f3ff","unicode_alternates":"","name":"dancer tone 5","shortname":":dancer_tone5:","category":"people","emoji_order":"1524","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone1":{"unicode":"1f647-1f3fb","unicode_alternates":"","name":"person bowing deeply tone 1","shortname":":bow_tone1:","category":"people","emoji_order":"1525","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone2":{"unicode":"1f647-1f3fc","unicode_alternates":"","name":"person bowing deeply tone 2","shortname":":bow_tone2:","category":"people","emoji_order":"1526","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone3":{"unicode":"1f647-1f3fd","unicode_alternates":"","name":"person bowing deeply tone 3","shortname":":bow_tone3:","category":"people","emoji_order":"1527","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone4":{"unicode":"1f647-1f3fe","unicode_alternates":"","name":"person bowing deeply tone 4","shortname":":bow_tone4:","category":"people","emoji_order":"1528","aliases":[],"aliases_ascii":[],"keywords":[]},"bow_tone5":{"unicode":"1f647-1f3ff","unicode_alternates":"","name":"person bowing deeply tone 5","shortname":":bow_tone5:","category":"people","emoji_order":"1529","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone1":{"unicode":"1f481-1f3fb","unicode_alternates":"","name":"information desk person tone 1","shortname":":information_desk_person_tone1:","category":"people","emoji_order":"1530","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone2":{"unicode":"1f481-1f3fc","unicode_alternates":"","name":"information desk person tone 2","shortname":":information_desk_person_tone2:","category":"people","emoji_order":"1531","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone3":{"unicode":"1f481-1f3fd","unicode_alternates":"","name":"information desk person tone 3","shortname":":information_desk_person_tone3:","category":"people","emoji_order":"1532","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone4":{"unicode":"1f481-1f3fe","unicode_alternates":"","name":"information desk person tone 4","shortname":":information_desk_person_tone4:","category":"people","emoji_order":"1533","aliases":[],"aliases_ascii":[],"keywords":[]},"information_desk_person_tone5":{"unicode":"1f481-1f3ff","unicode_alternates":"","name":"information desk person tone 5","shortname":":information_desk_person_tone5:","category":"people","emoji_order":"1534","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone1":{"unicode":"1f645-1f3fb","unicode_alternates":"","name":"face with no good gesture tone 1","shortname":":no_good_tone1:","category":"people","emoji_order":"1535","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone2":{"unicode":"1f645-1f3fc","unicode_alternates":"","name":"face with no good gesture tone 2","shortname":":no_good_tone2:","category":"people","emoji_order":"1536","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone3":{"unicode":"1f645-1f3fd","unicode_alternates":"","name":"face with no good gesture tone 3","shortname":":no_good_tone3:","category":"people","emoji_order":"1537","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone4":{"unicode":"1f645-1f3fe","unicode_alternates":"","name":"face with no good gesture tone 4","shortname":":no_good_tone4:","category":"people","emoji_order":"1538","aliases":[],"aliases_ascii":[],"keywords":[]},"no_good_tone5":{"unicode":"1f645-1f3ff","unicode_alternates":"","name":"face with no good gesture tone 5","shortname":":no_good_tone5:","category":"people","emoji_order":"1539","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone1":{"unicode":"1f646-1f3fb","unicode_alternates":"","name":"face with ok gesture tone1","shortname":":ok_woman_tone1:","category":"people","emoji_order":"1540","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone2":{"unicode":"1f646-1f3fc","unicode_alternates":"","name":"face with ok gesture tone2","shortname":":ok_woman_tone2:","category":"people","emoji_order":"1541","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone3":{"unicode":"1f646-1f3fd","unicode_alternates":"","name":"face with ok gesture tone3","shortname":":ok_woman_tone3:","category":"people","emoji_order":"1542","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone4":{"unicode":"1f646-1f3fe","unicode_alternates":"","name":"face with ok gesture tone4","shortname":":ok_woman_tone4:","category":"people","emoji_order":"1543","aliases":[],"aliases_ascii":[],"keywords":[]},"ok_woman_tone5":{"unicode":"1f646-1f3ff","unicode_alternates":"","name":"face with ok gesture tone5","shortname":":ok_woman_tone5:","category":"people","emoji_order":"1544","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone1":{"unicode":"1f64b-1f3fb","unicode_alternates":"","name":"happy person raising one hand tone1","shortname":":raising_hand_tone1:","category":"people","emoji_order":"1545","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone2":{"unicode":"1f64b-1f3fc","unicode_alternates":"","name":"happy person raising one hand tone2","shortname":":raising_hand_tone2:","category":"people","emoji_order":"1546","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone3":{"unicode":"1f64b-1f3fd","unicode_alternates":"","name":"happy person raising one hand tone3","shortname":":raising_hand_tone3:","category":"people","emoji_order":"1547","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone4":{"unicode":"1f64b-1f3fe","unicode_alternates":"","name":"happy person raising one hand tone4","shortname":":raising_hand_tone4:","category":"people","emoji_order":"1548","aliases":[],"aliases_ascii":[],"keywords":[]},"raising_hand_tone5":{"unicode":"1f64b-1f3ff","unicode_alternates":"","name":"happy person raising one hand tone5","shortname":":raising_hand_tone5:","category":"people","emoji_order":"1549","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone1":{"unicode":"1f64e-1f3fb","unicode_alternates":"","name":"person with pouting face tone1","shortname":":person_with_pouting_face_tone1:","category":"people","emoji_order":"1550","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone2":{"unicode":"1f64e-1f3fc","unicode_alternates":"","name":"person with pouting face tone2","shortname":":person_with_pouting_face_tone2:","category":"people","emoji_order":"1551","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone3":{"unicode":"1f64e-1f3fd","unicode_alternates":"","name":"person with pouting face tone3","shortname":":person_with_pouting_face_tone3:","category":"people","emoji_order":"1552","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone4":{"unicode":"1f64e-1f3fe","unicode_alternates":"","name":"person with pouting face tone4","shortname":":person_with_pouting_face_tone4:","category":"people","emoji_order":"1553","aliases":[],"aliases_ascii":[],"keywords":[]},"person_with_pouting_face_tone5":{"unicode":"1f64e-1f3ff","unicode_alternates":"","name":"person with pouting face tone5","shortname":":person_with_pouting_face_tone5:","category":"people","emoji_order":"1554","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone1":{"unicode":"1f64d-1f3fb","unicode_alternates":"","name":"person frowning tone 1","shortname":":person_frowning_tone1:","category":"people","emoji_order":"1555","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone2":{"unicode":"1f64d-1f3fc","unicode_alternates":"","name":"person frowning tone 2","shortname":":person_frowning_tone2:","category":"people","emoji_order":"1556","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone3":{"unicode":"1f64d-1f3fd","unicode_alternates":"","name":"person frowning tone 3","shortname":":person_frowning_tone3:","category":"people","emoji_order":"1557","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone4":{"unicode":"1f64d-1f3fe","unicode_alternates":"","name":"person frowning tone 4","shortname":":person_frowning_tone4:","category":"people","emoji_order":"1558","aliases":[],"aliases_ascii":[],"keywords":[]},"person_frowning_tone5":{"unicode":"1f64d-1f3ff","unicode_alternates":"","name":"person frowning tone 5","shortname":":person_frowning_tone5:","category":"people","emoji_order":"1559","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone1":{"unicode":"1f487-1f3fb","unicode_alternates":"","name":"haircut tone 1","shortname":":haircut_tone1:","category":"people","emoji_order":"1560","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone2":{"unicode":"1f487-1f3fc","unicode_alternates":"","name":"haircut tone 2","shortname":":haircut_tone2:","category":"people","emoji_order":"1561","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone3":{"unicode":"1f487-1f3fd","unicode_alternates":"","name":"haircut tone 3","shortname":":haircut_tone3:","category":"people","emoji_order":"1562","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone4":{"unicode":"1f487-1f3fe","unicode_alternates":"","name":"haircut tone 4","shortname":":haircut_tone4:","category":"people","emoji_order":"1563","aliases":[],"aliases_ascii":[],"keywords":[]},"haircut_tone5":{"unicode":"1f487-1f3ff","unicode_alternates":"","name":"haircut tone 5","shortname":":haircut_tone5:","category":"people","emoji_order":"1564","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone1":{"unicode":"1f486-1f3fb","unicode_alternates":"","name":"face massage tone 1","shortname":":massage_tone1:","category":"people","emoji_order":"1565","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone2":{"unicode":"1f486-1f3fc","unicode_alternates":"","name":"face massage tone 2","shortname":":massage_tone2:","category":"people","emoji_order":"1566","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone3":{"unicode":"1f486-1f3fd","unicode_alternates":"","name":"face massage tone 3","shortname":":massage_tone3:","category":"people","emoji_order":"1567","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone4":{"unicode":"1f486-1f3fe","unicode_alternates":"","name":"face massage tone 4","shortname":":massage_tone4:","category":"people","emoji_order":"1568","aliases":[],"aliases_ascii":[],"keywords":[]},"massage_tone5":{"unicode":"1f486-1f3ff","unicode_alternates":"","name":"face massage tone 5","shortname":":massage_tone5:","category":"people","emoji_order":"1569","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone1":{"unicode":"1f6a3-1f3fb","unicode_alternates":"","name":"rowboat tone 1","shortname":":rowboat_tone1:","category":"activity","emoji_order":"1570","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone2":{"unicode":"1f6a3-1f3fc","unicode_alternates":"","name":"rowboat tone 2","shortname":":rowboat_tone2:","category":"activity","emoji_order":"1571","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone3":{"unicode":"1f6a3-1f3fd","unicode_alternates":"","name":"rowboat tone 3","shortname":":rowboat_tone3:","category":"activity","emoji_order":"1572","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone4":{"unicode":"1f6a3-1f3fe","unicode_alternates":"","name":"rowboat tone 4","shortname":":rowboat_tone4:","category":"activity","emoji_order":"1573","aliases":[],"aliases_ascii":[],"keywords":[]},"rowboat_tone5":{"unicode":"1f6a3-1f3ff","unicode_alternates":"","name":"rowboat tone 5","shortname":":rowboat_tone5:","category":"activity","emoji_order":"1574","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone1":{"unicode":"1f3ca-1f3fb","unicode_alternates":"","name":"swimmer tone 1","shortname":":swimmer_tone1:","category":"activity","emoji_order":"1575","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone2":{"unicode":"1f3ca-1f3fc","unicode_alternates":"","name":"swimmer tone 2","shortname":":swimmer_tone2:","category":"activity","emoji_order":"1576","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone3":{"unicode":"1f3ca-1f3fd","unicode_alternates":"","name":"swimmer tone 3","shortname":":swimmer_tone3:","category":"activity","emoji_order":"1577","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone4":{"unicode":"1f3ca-1f3fe","unicode_alternates":"","name":"swimmer tone 4","shortname":":swimmer_tone4:","category":"activity","emoji_order":"1578","aliases":[],"aliases_ascii":[],"keywords":[]},"swimmer_tone5":{"unicode":"1f3ca-1f3ff","unicode_alternates":"","name":"swimmer tone 5","shortname":":swimmer_tone5:","category":"activity","emoji_order":"1579","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone1":{"unicode":"1f3c4-1f3fb","unicode_alternates":"","name":"surfer tone 1","shortname":":surfer_tone1:","category":"activity","emoji_order":"1580","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone2":{"unicode":"1f3c4-1f3fc","unicode_alternates":"","name":"surfer tone 2","shortname":":surfer_tone2:","category":"activity","emoji_order":"1581","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone3":{"unicode":"1f3c4-1f3fd","unicode_alternates":"","name":"surfer tone 3","shortname":":surfer_tone3:","category":"activity","emoji_order":"1582","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone4":{"unicode":"1f3c4-1f3fe","unicode_alternates":"","name":"surfer tone 4","shortname":":surfer_tone4:","category":"activity","emoji_order":"1583","aliases":[],"aliases_ascii":[],"keywords":[]},"surfer_tone5":{"unicode":"1f3c4-1f3ff","unicode_alternates":"","name":"surfer tone 5","shortname":":surfer_tone5:","category":"activity","emoji_order":"1584","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone1":{"unicode":"1f6c0-1f3fb","unicode_alternates":"","name":"bath tone 1","shortname":":bath_tone1:","category":"activity","emoji_order":"1585","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone2":{"unicode":"1f6c0-1f3fc","unicode_alternates":"","name":"bath tone 2","shortname":":bath_tone2:","category":"activity","emoji_order":"1586","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone3":{"unicode":"1f6c0-1f3fd","unicode_alternates":"","name":"bath tone 3","shortname":":bath_tone3:","category":"activity","emoji_order":"1587","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone4":{"unicode":"1f6c0-1f3fe","unicode_alternates":"","name":"bath tone 4","shortname":":bath_tone4:","category":"activity","emoji_order":"1588","aliases":[],"aliases_ascii":[],"keywords":[]},"bath_tone5":{"unicode":"1f6c0-1f3ff","unicode_alternates":"","name":"bath tone 5","shortname":":bath_tone5:","category":"activity","emoji_order":"1589","aliases":[],"aliases_ascii":[],"keywords":[]},"basketball_player_tone1":{"unicode":"26f9-1f3fb","unicode_alternates":"","name":"person with ball tone 1","shortname":":basketball_player_tone1:","category":"activity","emoji_order":"1590","aliases":[":person_with_ball_tone1:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone2":{"unicode":"26f9-1f3fc","unicode_alternates":"","name":"person with ball tone 2","shortname":":basketball_player_tone2:","category":"activity","emoji_order":"1591","aliases":[":person_with_ball_tone2:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone3":{"unicode":"26f9-1f3fd","unicode_alternates":"","name":"person with ball tone 3","shortname":":basketball_player_tone3:","category":"activity","emoji_order":"1592","aliases":[":person_with_ball_tone3:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone4":{"unicode":"26f9-1f3fe","unicode_alternates":"","name":"person with ball tone 4","shortname":":basketball_player_tone4:","category":"activity","emoji_order":"1593","aliases":[":person_with_ball_tone4:"],"aliases_ascii":[],"keywords":[]},"basketball_player_tone5":{"unicode":"26f9-1f3ff","unicode_alternates":"","name":"person with ball tone 5","shortname":":basketball_player_tone5:","category":"activity","emoji_order":"1594","aliases":[":person_with_ball_tone5:"],"aliases_ascii":[],"keywords":[]},"lifter_tone1":{"unicode":"1f3cb-1f3fb","unicode_alternates":"","name":"weight lifter tone 1","shortname":":lifter_tone1:","category":"activity","emoji_order":"1595","aliases":[":weight_lifter_tone1:"],"aliases_ascii":[],"keywords":[]},"lifter_tone2":{"unicode":"1f3cb-1f3fc","unicode_alternates":"","name":"weight lifter tone 2","shortname":":lifter_tone2:","category":"activity","emoji_order":"1596","aliases":[":weight_lifter_tone2:"],"aliases_ascii":[],"keywords":[]},"lifter_tone3":{"unicode":"1f3cb-1f3fd","unicode_alternates":"","name":"weight lifter tone 3","shortname":":lifter_tone3:","category":"activity","emoji_order":"1597","aliases":[":weight_lifter_tone3:"],"aliases_ascii":[],"keywords":[]},"lifter_tone4":{"unicode":"1f3cb-1f3fe","unicode_alternates":"","name":"weight lifter tone 4","shortname":":lifter_tone4:","category":"activity","emoji_order":"1598","aliases":[":weight_lifter_tone4:"],"aliases_ascii":[],"keywords":[]},"lifter_tone5":{"unicode":"1f3cb-1f3ff","unicode_alternates":"","name":"weight lifter tone 5","shortname":":lifter_tone5:","category":"activity","emoji_order":"1599","aliases":[":weight_lifter_tone5:"],"aliases_ascii":[],"keywords":[]},"bicyclist_tone1":{"unicode":"1f6b4-1f3fb","unicode_alternates":"","name":"bicyclist tone 1","shortname":":bicyclist_tone1:","category":"activity","emoji_order":"1600","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone2":{"unicode":"1f6b4-1f3fc","unicode_alternates":"","name":"bicyclist tone 2","shortname":":bicyclist_tone2:","category":"activity","emoji_order":"1601","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone3":{"unicode":"1f6b4-1f3fd","unicode_alternates":"","name":"bicyclist tone 3","shortname":":bicyclist_tone3:","category":"activity","emoji_order":"1602","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone4":{"unicode":"1f6b4-1f3fe","unicode_alternates":"","name":"bicyclist tone 4","shortname":":bicyclist_tone4:","category":"activity","emoji_order":"1603","aliases":[],"aliases_ascii":[],"keywords":[]},"bicyclist_tone5":{"unicode":"1f6b4-1f3ff","unicode_alternates":"","name":"bicyclist tone 5","shortname":":bicyclist_tone5:","category":"activity","emoji_order":"1604","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone1":{"unicode":"1f6b5-1f3fb","unicode_alternates":"","name":"mountain bicyclist tone 1","shortname":":mountain_bicyclist_tone1:","category":"activity","emoji_order":"1605","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone2":{"unicode":"1f6b5-1f3fc","unicode_alternates":"","name":"mountain bicyclist tone 2","shortname":":mountain_bicyclist_tone2:","category":"activity","emoji_order":"1606","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone3":{"unicode":"1f6b5-1f3fd","unicode_alternates":"","name":"mountain bicyclist tone 3","shortname":":mountain_bicyclist_tone3:","category":"activity","emoji_order":"1607","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone4":{"unicode":"1f6b5-1f3fe","unicode_alternates":"","name":"mountain bicyclist tone 4","shortname":":mountain_bicyclist_tone4:","category":"activity","emoji_order":"1608","aliases":[],"aliases_ascii":[],"keywords":[]},"mountain_bicyclist_tone5":{"unicode":"1f6b5-1f3ff","unicode_alternates":"","name":"mountain bicyclist tone 5","shortname":":mountain_bicyclist_tone5:","category":"activity","emoji_order":"1609","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone1":{"unicode":"1f3c7-1f3fb","unicode_alternates":"","name":"horse racing tone 1","shortname":":horse_racing_tone1:","category":"activity","emoji_order":"1610","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone2":{"unicode":"1f3c7-1f3fc","unicode_alternates":"","name":"horse racing tone 2","shortname":":horse_racing_tone2:","category":"activity","emoji_order":"1611","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone3":{"unicode":"1f3c7-1f3fd","unicode_alternates":"","name":"horse racing tone 3","shortname":":horse_racing_tone3:","category":"activity","emoji_order":"1612","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone4":{"unicode":"1f3c7-1f3fe","unicode_alternates":"","name":"horse racing tone 4","shortname":":horse_racing_tone4:","category":"activity","emoji_order":"1613","aliases":[],"aliases_ascii":[],"keywords":[]},"horse_racing_tone5":{"unicode":"1f3c7-1f3ff","unicode_alternates":"","name":"horse racing tone 5","shortname":":horse_racing_tone5:","category":"activity","emoji_order":"1614","aliases":[],"aliases_ascii":[],"keywords":[]},"spy_tone1":{"unicode":"1f575-1f3fb","unicode_alternates":"","name":"sleuth or spy tone 1","shortname":":spy_tone1:","category":"people","emoji_order":"1615","aliases":[":sleuth_or_spy_tone1:"],"aliases_ascii":[],"keywords":[]},"spy_tone2":{"unicode":"1f575-1f3fc","unicode_alternates":"","name":"sleuth or spy tone 2","shortname":":spy_tone2:","category":"people","emoji_order":"1616","aliases":[":sleuth_or_spy_tone2:"],"aliases_ascii":[],"keywords":[]},"spy_tone3":{"unicode":"1f575-1f3fd","unicode_alternates":"","name":"sleuth or spy tone 3","shortname":":spy_tone3:","category":"people","emoji_order":"1617","aliases":[":sleuth_or_spy_tone3:"],"aliases_ascii":[],"keywords":[]},"spy_tone4":{"unicode":"1f575-1f3fe","unicode_alternates":"","name":"sleuth or spy tone 4","shortname":":spy_tone4:","category":"people","emoji_order":"1618","aliases":[":sleuth_or_spy_tone4:"],"aliases_ascii":[],"keywords":[]},"spy_tone5":{"unicode":"1f575-1f3ff","unicode_alternates":"","name":"sleuth or spy tone 5","shortname":":spy_tone5:","category":"people","emoji_order":"1619","aliases":[":sleuth_or_spy_tone5:"],"aliases_ascii":[],"keywords":[]},"tone1":{"unicode":"1f3fb","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-1-2","shortname":":tone1:","category":"modifier","emoji_order":"1620","aliases":[],"aliases_ascii":[],"keywords":[]},"tone2":{"unicode":"1f3fc","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-3","shortname":":tone2:","category":"modifier","emoji_order":"1621","aliases":[],"aliases_ascii":[],"keywords":[]},"tone3":{"unicode":"1f3fd","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-4","shortname":":tone3:","category":"modifier","emoji_order":"1622","aliases":[],"aliases_ascii":[],"keywords":[]},"tone4":{"unicode":"1f3fe","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-5","shortname":":tone4:","category":"modifier","emoji_order":"1623","aliases":[],"aliases_ascii":[],"keywords":[]},"tone5":{"unicode":"1f3ff","unicode_alternates":"","name":"emoji modifier Fitzpatrick type-6","shortname":":tone5:","category":"modifier","emoji_order":"1624","aliases":[],"aliases_ascii":[],"keywords":[]}} \ No newline at end of file
diff --git a/library/fullcalendar/CHANGELOG.txt b/library/fullcalendar/CHANGELOG.txt
index ed2eddb8a..379f23691 100644
--- a/library/fullcalendar/CHANGELOG.txt
+++ b/library/fullcalendar/CHANGELOG.txt
@@ -1,4 +1,25 @@
+v3.2.0 (2017-02-14)
+-------------------
+
+Features:
+- `selectMinDistance`, threshold before a mouse selection begins (#2428)
+
+Bugfixes:
+- iOS 10, unwanted scrolling while dragging events/selection (#3403)
+- dayClick triggered when swiping on touch devices (#3332)
+- dayClick not functioning on Firefix mobile (#3450)
+- title computed incorrectly for views with no weekends (#2884)
+- unwanted scrollbars in month-view when non-integer width (#3453, #3444)
+- incorrect date formatting for locales with non-standlone month/day names (#3478)
+- date formatting, incorrect omission of trailing period for certain locales (#2504, #3486)
+- formatRange should collapse same week numbers (#3467)
+- Taiwanese locale updated (#3426)
+- Finnish noEventsMessage updated (#3476)
+- Croatian (hr) buttonText is blank (#3270)
+- JSON feed PHP example, date range math bug (#3485)
+
+
v3.1.0 (2016-12-05)
-------------------
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
index 5620e0bd6..a2f76c960 100644
--- a/library/fullcalendar/fullcalendar.css
+++ b/library/fullcalendar/fullcalendar.css
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
index b7371e25f..04399302b 100644
--- a/library/fullcalendar/fullcalendar.js
+++ b/library/fullcalendar/fullcalendar.js
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
(function(factory) {
@@ -19,8 +19,11 @@
;;
var FC = $.fullCalendar = {
- version: "3.1.0",
- internalApiVersion: 7
+ version: "3.2.0",
+ // When introducing internal API incompatibilities (where fullcalendar plugins would break),
+ // the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)
+ // and the below integer should be incremented.
+ internalApiVersion: 8
};
var fcViews = FC.views = {};
@@ -313,12 +316,13 @@ function getContentRect(el, origin) {
// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.
function getScrollbarWidths(el) {
var leftRightWidth = el.innerWidth() - el[0].clientWidth; // the paddings cancel out, leaving the scrollbars
- var widths = {
- left: 0,
- right: 0,
- top: 0,
- bottom: el.innerHeight() - el[0].clientHeight // the paddings cancel out, leaving the bottom scrollbar
- };
+ var bottomWidth = el.innerHeight() - el[0].clientHeight; // "
+ var widths;
+
+ leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);
+ bottomWidth = sanitizeScrollbarWidth(bottomWidth);
+
+ widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };
if (getIsLeftRtlScrollbars() && el.css('direction') == 'rtl') { // is the scrollbar on the left side?
widths.left = leftRightWidth;
@@ -331,6 +335,15 @@ function getScrollbarWidths(el) {
}
+// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to
+// retina displays, rounding, and IE11. Massage them into a usable value.
+function sanitizeScrollbarWidth(width) {
+ width = Math.max(0, width); // no negatives
+ width = Math.round(width);
+ return width;
+}
+
+
// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
var _isLeftRtlScrollbars = null;
@@ -381,24 +394,28 @@ function isPrimaryMouseButton(ev) {
function getEvX(ev) {
- if (ev.pageX !== undefined) {
- return ev.pageX;
- }
var touches = ev.originalEvent.touches;
- if (touches) {
+
+ // on mobile FF, pageX for touch events is present, but incorrect,
+ // so, look at touch coordinates first.
+ if (touches && touches.length) {
return touches[0].pageX;
}
+
+ return ev.pageX;
}
function getEvY(ev) {
- if (ev.pageY !== undefined) {
- return ev.pageY;
- }
var touches = ev.originalEvent.touches;
- if (touches) {
+
+ // on mobile FF, pageX for touch events is present, but incorrect,
+ // so, look at touch coordinates first.
+ if (touches && touches.length) {
return touches[0].pageY;
}
+
+ return ev.pageY;
}
@@ -413,33 +430,15 @@ function preventSelection(el) {
}
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
- ev.preventDefault();
-}
-
-
-// attach a handler to get called when ANY scroll action happens on the page.
-// this was impossible to do with normal on/off because 'scroll' doesn't bubble.
-// http://stackoverflow.com/a/32954565/96342
-// returns `true` on success.
-function bindAnyScroll(handler) {
- if (window.addEventListener) {
- window.addEventListener('scroll', handler, true); // useCapture=true
- return true;
- }
- return false;
+function allowSelection(el) {
+ el.removeClass('fc-unselectable')
+ .off('selectstart', preventDefault);
}
-// undoes bindAnyScroll. must pass in the original function.
-// returns `true` on success.
-function unbindAnyScroll(handler) {
- if (window.removeEventListener) {
- window.removeEventListener('scroll', handler, true); // useCapture=true
- return true;
- }
- return false;
+// Stops a mouse/touch event from doing it's native browser action
+function preventDefault(ev) {
+ ev.preventDefault();
}
@@ -1329,38 +1328,42 @@ newMomentProto.toISOString = function() {
};
;;
+(function() {
-// Single Date Formatting
-// -------------------------------------------------------------------------------------------------
-
-
-// call this if you want Moment's original format method to be used
-function oldMomentFormat(mom, formatStr) {
- return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js
-}
-
+// exports
+FC.formatDate = formatDate;
+FC.formatRange = formatRange;
+FC.oldMomentFormat = oldMomentFormat;
+FC.queryMostGranularFormatUnit = queryMostGranularFormatUnit;
-// Formats `date` with a Moment formatting string, but allow our non-zero areas and
-// additional token.
-function formatDate(date, formatStr) {
- return formatDateWithChunks(date, getFormatStringChunks(formatStr));
-}
+// Config
+// ---------------------------------------------------------------------------------------------------------------------
-function formatDateWithChunks(date, chunks) {
- var s = '';
- var i;
-
- for (i=0; i<chunks.length; i++) {
- s += formatDateWithChunk(date, chunks[i]);
- }
+/*
+Inserted between chunks in the fake ("intermediate") formatting string.
+Important that it passes as whitespace (\s) because moment often identifies non-standalone months
+via a regexp with an \s.
+*/
+var PART_SEPARATOR = '\u000b'; // vertical tab
- return s;
-}
+/*
+Inserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,
+but rather, a "special" token that has custom rendering (see specialTokens map).
+*/
+var SPECIAL_TOKEN_MARKER = '\u001f'; // information separator 1
+/*
+Inserted at the beginning and end of a span of text that must have non-zero numeric characters.
+Handling of these markers is done in a post-processing step at the very end of text rendering.
+*/
+var MAYBE_MARKER = '\u001e'; // information separator 2
+var MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global
-// addition formatting tokens we want recognized
-var tokenOverrides = {
+/*
+Addition formatting tokens we want recognized
+*/
+var specialTokens = {
t: function(date) { // "a" or "p"
return oldMomentFormat(date, 'a').charAt(0);
},
@@ -1369,28 +1372,39 @@ var tokenOverrides = {
}
};
+/*
+The first characters of formatting tokens for units that are 1 day or larger.
+`value` is for ranking relative size (lower means bigger).
+`unit` is a normalized unit, used for comparing moments.
+*/
+var largeTokenMap = {
+ Y: { value: 1, unit: 'year' },
+ M: { value: 2, unit: 'month' },
+ W: { value: 3, unit: 'week' }, // ISO week
+ w: { value: 3, unit: 'week' }, // local week
+ D: { value: 4, unit: 'day' }, // day of month
+ d: { value: 4, unit: 'day' } // day of week
+};
+
-function formatDateWithChunk(date, chunk) {
- var token;
- var maybeStr;
+// Single Date Formatting
+// ---------------------------------------------------------------------------------------------------------------------
- if (typeof chunk === 'string') { // a literal string
- return chunk;
- }
- else if ((token = chunk.token)) { // a token, like "YYYY"
- if (tokenOverrides[token]) {
- return tokenOverrides[token](date); // use our custom token
- }
- return oldMomentFormat(date, token);
- }
- else if (chunk.maybe) { // a grouping of other chunks that must be non-zero
- maybeStr = formatDateWithChunks(date, chunk.maybe);
- if (maybeStr.match(/[1-9]/)) {
- return maybeStr;
- }
- }
+/*
+Formats `date` with a Moment formatting string, but allow our non-zero areas and special token
+*/
+function formatDate(date, formatStr) {
+ return renderFakeFormatString(
+ getParsedFormatString(formatStr).fakeFormatString,
+ date
+ );
+}
- return '';
+/*
+Call this if you want Moment's original format method to be used
+*/
+function oldMomentFormat(mom, formatStr) {
+ return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js
}
@@ -1398,10 +1412,12 @@ function formatDateWithChunk(date, chunk) {
// -------------------------------------------------------------------------------------------------
// TODO: make it work with timezone offset
-// Using a formatting string meant for a single date, generate a range string, like
-// "Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ.
-// If the dates are the same as far as the format string is concerned, just return a single
-// rendering of one date, without any separator.
+/*
+Using a formatting string meant for a single date, generate a range string, like
+"Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ.
+If the dates are the same as far as the format string is concerned, just return a single
+rendering of one date, without any separator.
+*/
function formatRange(date1, date2, formatStr, separator, isRTL) {
var localeData;
@@ -1410,28 +1426,31 @@ function formatRange(date1, date2, formatStr, separator, isRTL) {
localeData = date1.localeData();
- // Expand localized format strings, like "LL" -> "MMMM D YYYY"
- formatStr = localeData.longDateFormat(formatStr) || formatStr;
+ // Expand localized format strings, like "LL" -> "MMMM D YYYY".
// BTW, this is not important for `formatDate` because it is impossible to put custom tokens
// or non-zero areas in Moment's localized format strings.
+ formatStr = localeData.longDateFormat(formatStr) || formatStr;
- separator = separator || ' - ';
-
- return formatRangeWithChunks(
+ return renderParsedFormat(
+ getParsedFormatString(formatStr),
date1,
date2,
- getFormatStringChunks(formatStr),
- separator,
+ separator || ' - ',
isRTL
);
}
-FC.formatRange = formatRange; // expose
-
-function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
- var unzonedDate1 = date1.clone().stripZone(); // for formatSimilarChunk
+/*
+Renders a range with an already-parsed format string.
+*/
+function renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {
+ var sameUnits = parsedFormat.sameUnits;
+ var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons
var unzonedDate2 = date2.clone().stripZone(); // "
- var chunkStr; // the rendering of the chunk
+
+ var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);
+ var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);
+
var leftI;
var leftStr = '';
var rightI;
@@ -1443,28 +1462,35 @@ function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
// Start at the leftmost side of the formatting string and continue until you hit a token
// that is not the same between dates.
- for (leftI=0; leftI<chunks.length; leftI++) {
- chunkStr = formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunks[leftI]);
- if (chunkStr === false) {
- break;
- }
- leftStr += chunkStr;
+ for (
+ leftI = 0;
+ leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI]));
+ leftI++
+ ) {
+ leftStr += renderedParts1[leftI];
}
// Similarly, start at the rightmost side of the formatting string and move left
- for (rightI=chunks.length-1; rightI>leftI; rightI--) {
- chunkStr = formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunks[rightI]);
- if (chunkStr === false) {
+ for (
+ rightI = sameUnits.length - 1;
+ rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI]));
+ rightI--
+ ) {
+ // If current chunk is on the boundary of unique date-content, and is a special-case
+ // date-formatting postfix character, then don't consume it. Consider it unique date-content.
+ // TODO: make configurable
+ if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {
break;
}
- rightStr = chunkStr + rightStr;
+
+ rightStr = renderedParts1[rightI] + rightStr;
}
// The area in the middle is different for both of the dates.
// Collect them distinctly so we can jam them together later.
- for (middleI=leftI; middleI<=rightI; middleI++) {
- middleStr1 += formatDateWithChunk(date1, chunks[middleI]);
- middleStr2 += formatDateWithChunk(date2, chunks[middleI]);
+ for (middleI = leftI; middleI <= rightI; middleI++) {
+ middleStr1 += renderedParts1[middleI];
+ middleStr2 += renderedParts2[middleI];
}
if (middleStr1 || middleStr2) {
@@ -1476,77 +1502,59 @@ function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) {
}
}
- return leftStr + middleStr + rightStr;
+ return processMaybeMarkers(
+ leftStr + middleStr + rightStr
+ );
}
-var similarUnitMap = {
- Y: 'year',
- M: 'month',
- D: 'day', // day of month
- d: 'day', // day of week
- // prevents a separator between anything time-related...
- A: 'second', // AM/PM
- a: 'second', // am/pm
- T: 'second', // A/P
- t: 'second', // a/p
- H: 'second', // hour (24)
- h: 'second', // hour (12)
- m: 'second', // minute
- s: 'second' // second
-};
-// TODO: week maybe?
-
-
-// Given a formatting chunk, and given that both dates are similar in the regard the
-// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`.
-function formatSimilarChunk(date1, date2, unzonedDate1, unzonedDate2, chunk) {
- var token;
- var unit;
+// Format String Parsing
+// ---------------------------------------------------------------------------------------------------------------------
- if (typeof chunk === 'string') { // a literal string
- return chunk;
- }
- else if ((token = chunk.token)) {
- unit = similarUnitMap[token.charAt(0)];
+var parsedFormatStrCache = {};
- // are the dates the same for this unit of measurement?
- // use the unzoned dates for this calculation because unreliable when near DST (bug #2396)
- if (unit && unzonedDate1.isSame(unzonedDate2, unit)) {
- return oldMomentFormat(date1, token); // would be the same if we used `date2`
- // BTW, don't support custom tokens
- }
- }
-
- return false; // the chunk is NOT the same for the two dates
- // BTW, don't support splitting on non-zero areas
+/*
+Returns a parsed format string, leveraging a cache.
+*/
+function getParsedFormatString(formatStr) {
+ return parsedFormatStrCache[formatStr] ||
+ (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));
}
-
-// Chunking Utils
-// -------------------------------------------------------------------------------------------------
-
-
-var formatStringChunkCache = {};
-
-
-function getFormatStringChunks(formatStr) {
- if (formatStr in formatStringChunkCache) {
- return formatStringChunkCache[formatStr];
- }
- return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr));
+/*
+Parses a format string into the following:
+- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.
+- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like "day"),
+ that indicates how similar a range's start & end must be in order to share the same formatted text.
+ If not a token, then the value is null.
+ Always a flat array (not nested liked "chunks").
+*/
+function parseFormatString(formatStr) {
+ var chunks = chunkFormatString(formatStr);
+
+ return {
+ fakeFormatString: buildFakeFormatString(chunks),
+ sameUnits: buildSameUnits(chunks)
+ };
}
-
-// Break the formatting string into an array of chunks
+/*
+Break the formatting string into an array of chunks.
+A 'maybe' chunk will have nested chunks.
+*/
function chunkFormatString(formatStr) {
var chunks = [];
- var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination
var match;
+ // TODO: more descrimination
+ // \4 is a backreference to the first character of a multi-character set.
+ var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;
+
while ((match = chunker.exec(formatStr))) {
if (match[1]) { // a literal string inside [ ... ]
- chunks.push(match[1]);
+ chunks.push.apply(chunks, // append
+ splitStringLiteral(match[1])
+ );
}
else if (match[2]) { // non-zero formatting inside ( ... )
chunks.push({ maybe: chunkFormatString(match[2]) });
@@ -1555,41 +1563,166 @@ function chunkFormatString(formatStr) {
chunks.push({ token: match[3] });
}
else if (match[5]) { // an unenclosed literal string
- chunks.push(match[5]);
+ chunks.push.apply(chunks, // append
+ splitStringLiteral(match[5])
+ );
}
}
return chunks;
}
+/*
+Potentially splits a literal-text string into multiple parts. For special cases.
+*/
+function splitStringLiteral(s) {
+ if (s === '. ') {
+ return [ '.', ' ' ]; // for locales with periods bound to the end of each year/month/date
+ }
+ else {
+ return [ s ];
+ }
+}
-// Misc Utils
-// -------------------------------------------------------------------------------------------------
+/*
+Given chunks parsed from a real format string, generate a fake (aka "intermediate") format string with special control
+characters that will eventually be given to moment for formatting, and then post-processed.
+*/
+function buildFakeFormatString(chunks) {
+ var parts = [];
+ var i, chunk;
+ for (i = 0; i < chunks.length; i++) {
+ chunk = chunks[i];
-// granularity only goes up until day
-// TODO: unify with similarUnitMap
-var tokenGranularities = {
- Y: { value: 1, unit: 'year' },
- M: { value: 2, unit: 'month' },
- W: { value: 3, unit: 'week' },
- w: { value: 3, unit: 'week' },
- D: { value: 4, unit: 'day' }, // day of month
- d: { value: 4, unit: 'day' } // day of week
-};
+ if (typeof chunk === 'string') {
+ parts.push('[' + chunk + ']');
+ }
+ else if (chunk.token) {
+ if (chunk.token in specialTokens) {
+ parts.push(
+ SPECIAL_TOKEN_MARKER + // useful during post-processing
+ '[' + chunk.token + ']' // preserve as literal text
+ );
+ }
+ else {
+ parts.push(chunk.token); // unprotected text implies a format string
+ }
+ }
+ else if (chunk.maybe) {
+ parts.push(
+ MAYBE_MARKER + // useful during post-processing
+ buildFakeFormatString(chunk.maybe) +
+ MAYBE_MARKER
+ );
+ }
+ }
+
+ return parts.join(PART_SEPARATOR);
+}
-// returns a unit string, either 'year', 'month', 'day', or null
-// for the most granular formatting token in the string.
-FC.queryMostGranularFormatUnit = function(formatStr) {
- var chunks = getFormatStringChunks(formatStr);
+/*
+Given parsed chunks from a real formatting string, generates an array of unit strings (like "day") that indicate
+in which regard two dates must be similar in order to share range formatting text.
+The `chunks` can be nested (because of "maybe" chunks), however, the returned array will be flat.
+*/
+function buildSameUnits(chunks) {
+ var units = [];
+ var i, chunk;
+ var tokenInfo;
+
+ for (i = 0; i < chunks.length; i++) {
+ chunk = chunks[i];
+
+ if (chunk.token) {
+ tokenInfo = largeTokenMap[chunk.token.charAt(0)];
+ units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second
+ }
+ else if (chunk.maybe) {
+ units.push.apply(units, // append
+ buildSameUnits(chunk.maybe)
+ );
+ }
+ else {
+ units.push(null);
+ }
+ }
+
+ return units;
+}
+
+
+// Rendering to text
+// ---------------------------------------------------------------------------------------------------------------------
+
+/*
+Formats a date with a fake format string, post-processes the control characters, then returns.
+*/
+function renderFakeFormatString(fakeFormatString, date) {
+ return processMaybeMarkers(
+ renderFakeFormatStringParts(fakeFormatString, date).join('')
+ );
+}
+
+/*
+Formats a date into parts that will have been post-processed, EXCEPT for the "maybe" markers.
+*/
+function renderFakeFormatStringParts(fakeFormatString, date) {
+ var parts = [];
+ var fakeRender = oldMomentFormat(date, fakeFormatString);
+ var fakeParts = fakeRender.split(PART_SEPARATOR);
+ var i, fakePart;
+
+ for (i = 0; i < fakeParts.length; i++) {
+ fakePart = fakeParts[i];
+
+ if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {
+ parts.push(
+ // the literal string IS the token's name.
+ // call special token's registered function.
+ specialTokens[fakePart.substring(1)](date)
+ );
+ }
+ else {
+ parts.push(fakePart);
+ }
+ }
+
+ return parts;
+}
+
+/*
+Accepts an almost-finally-formatted string and processes the "maybe" control characters, returning a new string.
+*/
+function processMaybeMarkers(s) {
+ return s.replace(MAYBE_REGEXP, function(m0, m1) { // regex assumed to have 'g' flag
+ if (m1.match(/[1-9]/)) { // any non-zero numeric characters?
+ return m1;
+ }
+ else {
+ return '';
+ }
+ });
+}
+
+
+// Misc Utils
+// -------------------------------------------------------------------------------------------------
+
+/*
+Returns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.
+*/
+function queryMostGranularFormatUnit(formatStr) {
+ var chunks = chunkFormatString(formatStr);
var i, chunk;
var candidate;
var best;
for (i = 0; i < chunks.length; i++) {
chunk = chunks[i];
+
if (chunk.token) {
- candidate = tokenGranularities[chunk.token.charAt(0)];
+ candidate = largeTokenMap[chunk.token.charAt(0)];
if (candidate) {
if (!best || candidate.value > best.value) {
best = candidate;
@@ -1605,6 +1738,13 @@ FC.queryMostGranularFormatUnit = function(formatStr) {
return null;
};
+})();
+
+// quick local references
+var formatDate = FC.formatDate;
+var formatRange = FC.formatRange;
+var oldMomentFormat = FC.oldMomentFormat;
+
;;
FC.Class = Class; // export
@@ -1998,35 +2138,6 @@ var ListenerMixin = FC.ListenerMixin = (function() {
})();
;;
-// simple class for toggle a `isIgnoringMouse` flag on delay
-// initMouseIgnoring must first be called, with a millisecond delay setting.
-var MouseIgnorerMixin = {
-
- isIgnoringMouse: false, // bool
- delayUnignoreMouse: null, // method
-
-
- initMouseIgnoring: function(delay) {
- this.delayUnignoreMouse = debounce(proxy(this, 'unignoreMouse'), delay || 1000);
- },
-
-
- // temporarily ignore mouse actions on segments
- tempIgnoreMouse: function() {
- this.isIgnoringMouse = true;
- this.delayUnignoreMouse();
- },
-
-
- // delayUnignoreMouse eventually calls this
- unignoreMouse: function() {
- this.isIgnoringMouse = false;
- }
-
-};
-
-;;
-
/* A rectangular panel that is absolutely positioned over other content
------------------------------------------------------------------------------------------------------------------------
Options:
@@ -2457,7 +2568,7 @@ var CoordCache = FC.CoordCache = Class.extend({
----------------------------------------------------------------------------------------------------------------------*/
// TODO: use Emitter
-var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMixin, {
+var DragListener = FC.DragListener = Class.extend(ListenerMixin, {
options: null,
subjectEl: null,
@@ -2480,13 +2591,12 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
delayTimeoutId: null,
minDistance: null,
- handleTouchScrollProxy: null, // calls handleTouchScroll, always bound to `this`
+ shouldCancelTouchScroll: true,
+ scrollAlwaysKills: false,
constructor: function(options) {
this.options = options || {};
- this.handleTouchScrollProxy = proxy(this, 'handleTouchScroll');
- this.initMouseIgnoring(500);
},
@@ -2498,7 +2608,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
var isTouch = getEvIsTouch(ev);
if (ev.type === 'mousedown') {
- if (this.isIgnoringMouse) {
+ if (GlobalEmitter.get().shouldIgnoreMouse()) {
return;
}
else if (!isPrimaryMouseButton(ev)) {
@@ -2517,6 +2627,8 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
this.minDistance = firstDefined(extraOptions.distance, this.options.distance, 0);
this.subjectEl = this.options.subjectEl;
+ preventSelection($('body'));
+
this.isInteracting = true;
this.isTouch = isTouch;
this.isDelayEnded = false;
@@ -2558,12 +2670,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
this.isInteracting = false;
this.handleInteractionEnd(ev, isCancelled);
- // a touchstart+touchend on the same element will result in the following addition simulated events:
- // mouseover + mouseout + click
- // let's ignore these bogus events
- if (this.isTouch) {
- this.tempIgnoreMouse();
- }
+ allowSelection($('body'));
}
},
@@ -2578,45 +2685,25 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
bindHandlers: function() {
- var _this = this;
- var touchStartIgnores = 1;
+ // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,
+ // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.
+ var globalEmitter = GlobalEmitter.get();
if (this.isTouch) {
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
touchmove: this.handleTouchMove,
touchend: this.endInteraction,
- touchcancel: this.endInteraction,
-
- // Sometimes touchend doesn't fire
- // (can't figure out why. touchcancel doesn't fire either. has to do with scrolling?)
- // If another touchstart happens, we know it's bogus, so cancel the drag.
- // touchend will continue to be broken until user does a shorttap/scroll, but this is best we can do.
- touchstart: function(ev) {
- if (touchStartIgnores) { // bindHandlers is called from within a touchstart,
- touchStartIgnores--; // and we don't want this to fire immediately, so ignore.
- }
- else {
- _this.endInteraction(ev, true); // isCancelled=true
- }
- }
+ scroll: this.handleTouchScroll
});
-
- // listen to ALL scroll actions on the page
- if (
- !bindAnyScroll(this.handleTouchScrollProxy) && // hopefully this works and short-circuits the rest
- this.scrollEl // otherwise, attach a single handler to this
- ) {
- this.listenTo(this.scrollEl, 'scroll', this.handleTouchScroll);
- }
}
else {
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
mousemove: this.handleMouseMove,
mouseup: this.endInteraction
});
}
- this.listenTo($(document), {
+ this.listenTo(globalEmitter, {
selectstart: preventDefault, // don't allow selection while dragging
contextmenu: preventDefault // long taps would open menu on Chrome dev tools
});
@@ -2624,13 +2711,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
unbindHandlers: function() {
- this.stopListeningTo($(document));
-
- // unbind scroll listening
- unbindAnyScroll(this.handleTouchScrollProxy);
- if (this.scrollEl) {
- this.stopListeningTo(this.scrollEl, 'scroll');
- }
+ this.stopListeningTo(GlobalEmitter.get());
},
@@ -2738,8 +2819,9 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
handleTouchMove: function(ev) {
+
// prevent inertia and touchmove-scrolling while dragging
- if (this.isDragging) {
+ if (this.isDragging && this.shouldCancelTouchScroll) {
ev.preventDefault();
}
@@ -2759,7 +2841,7 @@ var DragListener = FC.DragListener = Class.extend(ListenerMixin, MouseIgnorerMix
handleTouchScroll: function(ev) {
// if the drag is being initiated by touch, but a scroll happens before
// the drag-initiating delay is over, cancel the drag
- if (!this.isDragging) {
+ if (!this.isDragging || this.scrollAlwaysKills) {
this.endInteraction(ev, true); // isCancelled=true
}
},
@@ -2982,7 +3064,7 @@ options:
var HitDragListener = DragListener.extend({
component: null, // converts coordinates to hits
- // methods: prepareHits, releaseHits, queryHit
+ // methods: hitsNeeded, hitsNotNeeded, queryHit
origHit: null, // the hit the mouse was over when listening started
hit: null, // the hit the mouse is over
@@ -3004,7 +3086,8 @@ var HitDragListener = DragListener.extend({
var origPoint;
var point;
- this.computeCoords();
+ this.component.hitsNeeded();
+ this.computeScrollBounds(); // for autoscroll
if (ev) {
origPoint = { left: getEvX(ev), top: getEvY(ev) };
@@ -3043,13 +3126,6 @@ var HitDragListener = DragListener.extend({
},
- // Recomputes the drag-critical positions of elements
- computeCoords: function() {
- this.component.prepareHits();
- this.computeScrollBounds(); // why is this here??????
- },
-
-
// Called when the actual drag has started
handleDragStart: function(ev) {
var hit;
@@ -3128,7 +3204,7 @@ var HitDragListener = DragListener.extend({
this.origHit = null;
this.hit = null;
- this.component.releaseHits();
+ this.component.hitsNotNeeded();
},
@@ -3136,7 +3212,12 @@ var HitDragListener = DragListener.extend({
handleScrollEnd: function() {
DragListener.prototype.handleScrollEnd.apply(this, arguments); // call the super-method
- this.computeCoords(); // hits' absolute positions will be in new places. recompute
+ // hits' absolute positions will be in new places after a user's scroll.
+ // HACK for recomputing.
+ if (this.isDragging) {
+ this.component.releaseHits();
+ this.component.prepareHits();
+ }
},
@@ -3186,6 +3267,231 @@ function isHitPropsWithin(subHit, superHit) {
;;
+/*
+Listens to document and window-level user-interaction events, like touch events and mouse events,
+and fires these events as-is to whoever is observing a GlobalEmitter.
+Best when used as a singleton via GlobalEmitter.get()
+
+Normalizes mouse/touch events. For examples:
+- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click
+- compensates for various buggy scenarios where a touchend does not fire
+*/
+
+FC.touchMouseIgnoreWait = 500;
+
+var GlobalEmitter = Class.extend(ListenerMixin, EmitterMixin, {
+
+ isTouching: false,
+ mouseIgnoreDepth: 0,
+ handleScrollProxy: null,
+
+
+ bind: function() {
+ var _this = this;
+
+ this.listenTo($(document), {
+ touchstart: this.handleTouchStart,
+ touchcancel: this.handleTouchCancel,
+ touchend: this.handleTouchEnd,
+ mousedown: this.handleMouseDown,
+ mousemove: this.handleMouseMove,
+ mouseup: this.handleMouseUp,
+ click: this.handleClick,
+ selectstart: this.handleSelectStart,
+ contextmenu: this.handleContextMenu
+ });
+
+ // because we need to call preventDefault
+ // because https://www.chromestatus.com/features/5093566007214080
+ // TODO: investigate performance because this is a global handler
+ window.addEventListener(
+ 'touchmove',
+ this.handleTouchMoveProxy = function(ev) {
+ _this.handleTouchMove($.Event(ev));
+ },
+ { passive: false } // allows preventDefault()
+ );
+
+ // attach a handler to get called when ANY scroll action happens on the page.
+ // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
+ // http://stackoverflow.com/a/32954565/96342
+ window.addEventListener(
+ 'scroll',
+ this.handleScrollProxy = function(ev) {
+ _this.handleScroll($.Event(ev));
+ },
+ true // useCapture
+ );
+ },
+
+ unbind: function() {
+ this.stopListeningTo($(document));
+
+ window.removeEventListener(
+ 'touchmove',
+ this.handleTouchMoveProxy
+ );
+
+ window.removeEventListener(
+ 'scroll',
+ this.handleScrollProxy,
+ true // useCapture
+ );
+ },
+
+
+ // Touch Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleTouchStart: function(ev) {
+
+ // if a previous touch interaction never ended with a touchend, then implicitly end it,
+ // but since a new touch interaction is about to begin, don't start the mouse ignore period.
+ this.stopTouch(ev, true); // skipMouseIgnore=true
+
+ this.isTouching = true;
+ this.trigger('touchstart', ev);
+ },
+
+ handleTouchMove: function(ev) {
+ if (this.isTouching) {
+ this.trigger('touchmove', ev);
+ }
+ },
+
+ handleTouchCancel: function(ev) {
+ if (this.isTouching) {
+ this.trigger('touchcancel', ev);
+
+ // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.
+ // If touchend fires later, it won't have any effect b/c isTouching will be false.
+ this.stopTouch(ev);
+ }
+ },
+
+ handleTouchEnd: function(ev) {
+ this.stopTouch(ev);
+ },
+
+
+ // Mouse Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleMouseDown: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mousedown', ev);
+ }
+ },
+
+ handleMouseMove: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mousemove', ev);
+ }
+ },
+
+ handleMouseUp: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('mouseup', ev);
+ }
+ },
+
+ handleClick: function(ev) {
+ if (!this.shouldIgnoreMouse()) {
+ this.trigger('click', ev);
+ }
+ },
+
+
+ // Misc Handlers
+ // -----------------------------------------------------------------------------------------------------------------
+
+ handleSelectStart: function(ev) {
+ this.trigger('selectstart', ev);
+ },
+
+ handleContextMenu: function(ev) {
+ this.trigger('contextmenu', ev);
+ },
+
+ handleScroll: function(ev) {
+ this.trigger('scroll', ev);
+ },
+
+
+ // Utils
+ // -----------------------------------------------------------------------------------------------------------------
+
+ stopTouch: function(ev, skipMouseIgnore) {
+ if (this.isTouching) {
+ this.isTouching = false;
+ this.trigger('touchend', ev);
+
+ if (!skipMouseIgnore) {
+ this.startTouchMouseIgnore();
+ }
+ }
+ },
+
+ startTouchMouseIgnore: function() {
+ var _this = this;
+ var wait = FC.touchMouseIgnoreWait;
+
+ if (wait) {
+ this.mouseIgnoreDepth++;
+ setTimeout(function() {
+ _this.mouseIgnoreDepth--;
+ }, wait);
+ }
+ },
+
+ shouldIgnoreMouse: function() {
+ return this.isTouching || Boolean(this.mouseIgnoreDepth);
+ }
+
+});
+
+
+// Singleton
+// ---------------------------------------------------------------------------------------------------------------------
+
+(function() {
+ var globalEmitter = null;
+ var neededCount = 0;
+
+
+ // gets the singleton
+ GlobalEmitter.get = function() {
+
+ if (!globalEmitter) {
+ globalEmitter = new GlobalEmitter();
+ globalEmitter.bind();
+ }
+
+ return globalEmitter;
+ };
+
+
+ // called when an object knows it will need a GlobalEmitter in the near future.
+ GlobalEmitter.needed = function() {
+ GlobalEmitter.get(); // ensures globalEmitter
+ neededCount++;
+ };
+
+
+ // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.
+ GlobalEmitter.unneeded = function() {
+ neededCount--;
+
+ if (!neededCount) { // nobody else needs it
+ globalEmitter.unbind();
+ globalEmitter = null;
+ }
+ };
+
+})();
+
+;;
+
/* Creates a clone of an element and lets it track the mouse as it moves
----------------------------------------------------------------------------------------------------------------------*/
@@ -3383,7 +3689,7 @@ var MouseFollower = Class.extend(ListenerMixin, {
/* An abstract class comprised of a "grid" of areas that each represent a specific datetime
----------------------------------------------------------------------------------------------------------------------*/
-var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
+var Grid = FC.Grid = Class.extend(ListenerMixin, {
// self-config, overridable by subclasses
hasDayInteractions: true, // can user click/select ranges of time?
@@ -3409,7 +3715,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// TODO: port isTimeScale into same system?
largeUnit: null,
- dayDragListener: null,
+ dayClickListener: null,
+ daySelectListener: null,
segDragListener: null,
segResizeListener: null,
externalDragListener: null,
@@ -3420,8 +3727,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
this.isRTL = view.opt('isRTL');
this.elsByFill = {};
- this.dayDragListener = this.buildDayDragListener();
- this.initMouseIgnoring();
+ this.dayClickListener = this.buildDayClickListener();
+ this.daySelectListener = this.buildDaySelectListener();
},
@@ -3516,6 +3823,20 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
/* Hit Area
------------------------------------------------------------------------------------------------------------------*/
+ hitsNeededDepth: 0, // necessary because multiple callers might need the same hits
+
+ hitsNeeded: function() {
+ if (!(this.hitsNeededDepth++)) {
+ this.prepareHits();
+ }
+ },
+
+ hitsNotNeeded: function() {
+ if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {
+ this.releaseHits();
+ }
+ },
+
// Called before one or more queryHit calls might happen. Should prepare any cached coordinates for queryHit
prepareHits: function() {
@@ -3643,9 +3964,19 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// Process a mousedown on an element that represents a day. For day clicking and selecting.
dayMousedown: function(ev) {
- if (!this.isIgnoringMouse) {
- this.dayDragListener.startInteraction(ev, {
- //distance: 5, // needs more work if we want dayClick to fire correctly
+ var view = this.view;
+
+ // prevent a user's clickaway for unselecting a range or an event from
+ // causing a dayClick or starting an immediate new selection.
+ if (view.isSelected || view.selectedEvent) {
+ return;
+ }
+
+ this.dayClickListener.startInteraction(ev);
+
+ if (view.opt('selectable')) {
+ this.daySelectListener.startInteraction(ev, {
+ distance: view.opt('selectMinDistance')
});
}
},
@@ -3653,40 +3984,79 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
dayTouchStart: function(ev) {
var view = this.view;
- var selectLongPressDelay = view.opt('selectLongPressDelay');
+ var selectLongPressDelay;
- // HACK to prevent a user's clickaway for unselecting a range or an event
- // from causing a dayClick.
+ // prevent a user's clickaway for unselecting a range or an event from
+ // causing a dayClick or starting an immediate new selection.
if (view.isSelected || view.selectedEvent) {
- this.tempIgnoreMouse();
+ return;
}
+ selectLongPressDelay = view.opt('selectLongPressDelay');
if (selectLongPressDelay == null) {
selectLongPressDelay = view.opt('longPressDelay'); // fallback
}
- this.dayDragListener.startInteraction(ev, {
- delay: selectLongPressDelay
- });
+ this.dayClickListener.startInteraction(ev);
+
+ if (view.opt('selectable')) {
+ this.daySelectListener.startInteraction(ev, {
+ delay: selectLongPressDelay
+ });
+ }
},
- // Creates a listener that tracks the user's drag across day elements.
- // For day clicking and selecting.
- buildDayDragListener: function() {
+ // Creates a listener that tracks the user's drag across day elements, for day clicking.
+ buildDayClickListener: function() {
var _this = this;
var view = this.view;
- var isSelectable = view.opt('selectable');
var dayClickHit; // null if invalid dayClick
+
+ var dragListener = new HitDragListener(this, {
+ scroll: view.opt('dragScroll'),
+ interactionStart: function() {
+ dayClickHit = dragListener.origHit;
+ },
+ hitOver: function(hit, isOrig, origHit) {
+ // if user dragged to another cell at any point, it can no longer be a dayClick
+ if (!isOrig) {
+ dayClickHit = null;
+ }
+ },
+ hitOut: function() { // called before mouse moves to a different hit OR moved out of all hits
+ dayClickHit = null;
+ },
+ interactionEnd: function(ev, isCancelled) {
+ if (!isCancelled && dayClickHit) {
+ view.triggerDayClick(
+ _this.getHitSpan(dayClickHit),
+ _this.getHitEl(dayClickHit),
+ ev
+ );
+ }
+ }
+ });
+
+ // because dayClickListener won't be called with any time delay, "dragging" will begin immediately,
+ // which will kill any touchmoving/scrolling. Prevent this.
+ dragListener.shouldCancelTouchScroll = false;
+
+ dragListener.scrollAlwaysKills = true;
+
+ return dragListener;
+ },
+
+
+ // Creates a listener that tracks the user's drag across day elements, for day selecting.
+ buildDaySelectListener: function() {
+ var _this = this;
+ var view = this.view;
var selectionSpan; // null if invalid selection
- // this listener tracks a mousedown on a day element, and a subsequent drag.
- // if the drag ends on the same day, it is a 'dayClick'.
- // if 'selectable' is enabled, this listener also detects selections.
var dragListener = new HitDragListener(this, {
scroll: view.opt('dragScroll'),
interactionStart: function() {
- dayClickHit = dragListener.origHit; // for dayClick, where no dragging happens
selectionSpan = null;
},
dragStart: function() {
@@ -3695,27 +4065,20 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
hitOver: function(hit, isOrig, origHit) {
if (origHit) { // click needs to have started on a hit
- // if user dragged to another cell at any point, it can no longer be a dayClick
- if (!isOrig) {
- dayClickHit = null;
- }
+ selectionSpan = _this.computeSelection(
+ _this.getHitSpan(origHit),
+ _this.getHitSpan(hit)
+ );
- if (isSelectable) {
- selectionSpan = _this.computeSelection(
- _this.getHitSpan(origHit),
- _this.getHitSpan(hit)
- );
- if (selectionSpan) {
- _this.renderSelection(selectionSpan);
- }
- else if (selectionSpan === false) {
- disableCursor();
- }
+ if (selectionSpan) {
+ _this.renderSelection(selectionSpan);
+ }
+ else if (selectionSpan === false) {
+ disableCursor();
}
}
},
hitOut: function() { // called before mouse moves to a different hit OR moved out of all hits
- dayClickHit = null;
selectionSpan = null;
_this.unrenderSelection();
},
@@ -3723,21 +4086,9 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
enableCursor();
},
interactionEnd: function(ev, isCancelled) {
- if (!isCancelled) {
- if (
- dayClickHit &&
- !_this.isIgnoringMouse // see hack in dayTouchStart
- ) {
- view.triggerDayClick(
- _this.getHitSpan(dayClickHit),
- _this.getHitEl(dayClickHit),
- ev
- );
- }
- if (selectionSpan) {
- // the selection will already have been rendered. just report it
- view.reportSelection(selectionSpan, ev);
- }
+ if (!isCancelled && selectionSpan) {
+ // the selection will already have been rendered. just report it
+ view.reportSelection(selectionSpan, ev);
}
}
});
@@ -3750,7 +4101,8 @@ var Grid = FC.Grid = Class.extend(ListenerMixin, MouseIgnorerMixin, {
// Useful for when public API methods that result in re-rendering are invoked during a drag.
// Also useful for when touch devices misbehave and don't fire their touchend.
clearDragListeners: function() {
- this.dayDragListener.endInteraction();
+ this.dayClickListener.endInteraction();
+ this.daySelectListener.endInteraction();
if (this.segDragListener) {
this.segDragListener.endInteraction(); // will clear this.segDragListener
@@ -4269,7 +4621,6 @@ Grid.mixin({
// Attaches event-element-related handlers to an arbitrary container element. leverages bubbling.
bindSegHandlersToEl: function(el) {
this.bindSegHandlerToEl(el, 'touchstart', this.handleSegTouchStart);
- this.bindSegHandlerToEl(el, 'touchend', this.handleSegTouchEnd);
this.bindSegHandlerToEl(el, 'mouseenter', this.handleSegMouseover);
this.bindSegHandlerToEl(el, 'mouseleave', this.handleSegMouseout);
this.bindSegHandlerToEl(el, 'mousedown', this.handleSegMousedown);
@@ -4304,7 +4655,7 @@ Grid.mixin({
// Updates internal state and triggers handlers for when an event element is moused over
handleSegMouseover: function(seg, ev) {
if (
- !this.isIgnoringMouse &&
+ !GlobalEmitter.get().shouldIgnoreMouse() &&
!this.mousedOverSeg
) {
this.mousedOverSeg = seg;
@@ -4374,16 +4725,6 @@ Grid.mixin({
delay: isSelected ? 0 : eventLongPressDelay // do delay if not already selected
});
}
-
- // a long tap simulates a mouseover. ignore this bogus mouseover.
- this.tempIgnoreMouse();
- },
-
-
- handleSegTouchEnd: function(seg, ev) {
- // touchstart+touchend = click, which simulates a mouseover.
- // ignore this bogus mouseover.
- this.tempIgnoreMouse();
},
@@ -4509,7 +4850,7 @@ Grid.mixin({
if (dropLocation) {
// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
- view.reportEventDrop(event, dropLocation, _this.largeUnit, el, ev);
+ view.reportSegDrop(seg, dropLocation, _this.largeUnit, el, ev);
}
else {
view.showEvent(event);
@@ -4812,7 +5153,7 @@ Grid.mixin({
if (resizeLocation) { // valid date to resize to?
// no need to re-show original, will rerender all anyways. esp important if eventRenderWait
- view.reportEventResize(event, resizeLocation, _this.largeUnit, el, ev);
+ view.reportSegResize(seg, resizeLocation, _this.largeUnit, el, ev);
}
else {
view.showEvent(event);
@@ -6833,9 +7174,9 @@ DayGrid.mixin({
// because segments in the popover are not part of a grid coordinate system, provide a hint to any
// grids that want to do drag-n-drop about which cell it came from
- this.prepareHits();
+ this.hitsNeeded();
segs[i].hit = this.getCellHit(row, col);
- this.releaseHits();
+ this.hitsNotNeeded();
segContainer.append(segs[i].el);
}
@@ -8261,11 +8602,23 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Computes what the title at the top of the calendar should be for this view
computeTitle: function() {
+ var start, end;
+
+ // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
+ if (this.intervalUnit === 'year' || this.intervalUnit === 'month') {
+ start = this.intervalStart;
+ end = this.intervalEnd;
+ }
+ else { // for day units or smaller, use the actual day range
+ start = this.start;
+ end = this.end;
+ }
+
return this.formatRange(
{
// in case intervalStart/End has a time, make sure timezone is correct
- start: this.calendar.applyTimezone(this.intervalStart),
- end: this.calendar.applyTimezone(this.intervalEnd)
+ start: this.calendar.applyTimezone(start),
+ end: this.calendar.applyTimezone(end)
},
this.opt('titleFormat') || this.computeTitleFormat(),
this.opt('titleRangeSeparator')
@@ -8579,14 +8932,16 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Binds DOM handlers to elements that reside outside the view container, such as the document
bindGlobalHandlers: function() {
- this.listenTo($(document), 'mousedown', this.handleDocumentMousedown);
- this.listenTo($(document), 'touchstart', this.processUnselect);
+ this.listenTo(GlobalEmitter.get(), {
+ touchstart: this.processUnselect,
+ mousedown: this.handleDocumentMousedown
+ });
},
// Unbinds DOM handlers from elements that reside outside the view container
unbindGlobalHandlers: function() {
- this.stopListeningTo($(document));
+ this.stopListeningTo(GlobalEmitter.get());
},
@@ -9158,15 +9513,15 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Must be called when an event in the view is dropped onto new location.
// `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.
- reportEventDrop: function(event, dropLocation, largeUnit, el, ev) {
+ reportSegDrop: function(seg, dropLocation, largeUnit, el, ev) {
var calendar = this.calendar;
- var mutateResult = calendar.mutateEvent(event, dropLocation, largeUnit);
+ var mutateResult = calendar.mutateSeg(seg, dropLocation, largeUnit);
var undoFunc = function() {
mutateResult.undo();
calendar.reportEventChange();
};
- this.triggerEventDrop(event, mutateResult.dateDelta, undoFunc, el, ev);
+ this.triggerEventDrop(seg.event, mutateResult.dateDelta, undoFunc, el, ev);
calendar.reportEventChange(); // will rerender events
},
@@ -9261,15 +9616,15 @@ var View = FC.View = Class.extend(EmitterMixin, ListenerMixin, {
// Must be called when an event in the view has been resized to a new length
- reportEventResize: function(event, resizeLocation, largeUnit, el, ev) {
+ reportSegResize: function(seg, resizeLocation, largeUnit, el, ev) {
var calendar = this.calendar;
- var mutateResult = calendar.mutateEvent(event, resizeLocation, largeUnit);
+ var mutateResult = calendar.mutateSeg(seg, resizeLocation, largeUnit);
var undoFunc = function() {
mutateResult.undo();
calendar.reportEventChange();
};
- this.triggerEventResize(event, mutateResult.durationDelta, undoFunc, el, ev);
+ this.triggerEventResize(seg.event, mutateResult.durationDelta, undoFunc, el, ev);
calendar.reportEventChange(); // will rerender events
},
@@ -10202,6 +10557,9 @@ Calendar.mixin(EmitterMixin);
function Calendar_constructor(element, overrides) {
var t = this;
+ // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.
+ GlobalEmitter.needed();
+
// Exports
// -----------------------------------------------------------------------------------
@@ -10545,6 +10903,8 @@ function Calendar_constructor(element, overrides) {
if (windowResizeProxy) {
$(window).unbind('resize', windowResizeProxy);
}
+
+ GlobalEmitter.unneeded();
}
@@ -11176,6 +11536,7 @@ Calendar.defaults = {
//selectable: false,
unselectAuto: true,
+ //selectMinDistance: 0,
dropAccept: '*',
@@ -12551,6 +12912,12 @@ function EventManager() { // assumed to be a calendar
}
+// returns an undo function
+Calendar.prototype.mutateSeg = function(seg, newProps) {
+ return this.mutateEvent(seg.event, newProps);
+};
+
+
// hook for external libs to manipulate event properties upon creation.
// should manipulate the event in-place.
Calendar.prototype.normalizeEvent = function(event) {
@@ -13096,6 +13463,16 @@ var BasicView = FC.BasicView = View.extend({
// forward all hit-related method calls to dayGrid
+ hitsNeeded: function() {
+ this.dayGrid.hitsNeeded();
+ },
+
+
+ hitsNotNeeded: function() {
+ this.dayGrid.hitsNotNeeded();
+ },
+
+
prepareHits: function() {
this.dayGrid.prepareHits();
},
@@ -13623,6 +14000,22 @@ var AgendaView = FC.AgendaView = View.extend({
// forward all hit-related method calls to the grids (dayGrid might not be defined)
+ hitsNeeded: function() {
+ this.timeGrid.hitsNeeded();
+ if (this.dayGrid) {
+ this.dayGrid.hitsNeeded();
+ }
+ },
+
+
+ hitsNotNeeded: function() {
+ this.timeGrid.hitsNotNeeded();
+ if (this.dayGrid) {
+ this.dayGrid.hitsNotNeeded();
+ }
+ },
+
+
prepareHits: function() {
this.timeGrid.prepareHits();
if (this.dayGrid) {
diff --git a/library/fullcalendar/fullcalendar.min.css b/library/fullcalendar/fullcalendar.min.css
index 1339120b4..255dbfffa 100644
--- a/library/fullcalendar/fullcalendar.min.css
+++ b/library/fullcalendar/fullcalendar.min.css
@@ -1,5 +1,5 @@
/*!
- * FullCalendar v3.1.0 Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/.fc-icon,body .fc{font-size:1em}.fc-button-group,.fc-icon{display:inline-block}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-icon,.fc-unselectable{-khtml-user-select:none;-webkit-touch-callout:none}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}.fc th,.fc-basic-view td.fc-week-number,.fc-icon,.fc-toolbar{text-align:center}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-icon{height:1em;line-height:1em;overflow:hidden;font-family:"Courier New",Courier,monospace;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\000AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\000BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\000D7";font-size:200%;top:6%}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;box-shadow:none}.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a[data-goto]{cursor:pointer}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:.9em;margin-top:2px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-row.fc-rigid,.fc-time-grid-event{overflow:hidden}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;font-weight:400}.fc-event,.fc-event-dot{background-color:#3a87ad}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fc-toolbar.fc-header-toolbar{margin-bottom:1em}.fc-toolbar.fc-footer-toolbar{margin-top:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:2px}.fc-basic-view th.fc-day-number,.fc-basic-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-basic-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-basic-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-basic-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-basic-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-basic-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-basic-view td.fc-week-number>*{display:inline-block;min-width:1.25em}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item:hover td{background-color:#f5f5f5}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee} \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
index 8484b7c45..c5eb8c751 100644
--- a/library/fullcalendar/fullcalendar.min.js
+++ b/library/fullcalendar/fullcalendar.min.js
@@ -1,10 +1,10 @@
/*!
- * FullCalendar v3.1.0
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
-!function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):"object"==typeof exports?module.exports=t(require("jquery"),require("moment")):t(jQuery,moment)}(function(t,e){function n(t){return q(t,$t)}function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function s(){t("body").addClass("fc-not-allowed")}function o(){t("body").removeClass("fc-not-allowed")}function l(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],u=[],c=0;a(e),e.each(function(n,i){var a=n===e.length-1?s:r,d=t(i).outerHeight(!0);d<a?(o.push(i),l.push(d),u.push(t(i).height())):c+=d}),i&&(n-=c,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,a=l[e],c=u[e],d=i-(a-c);a<i&&t(n).height(d)})}function a(t){t.height("")}function u(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function c(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function f(t,e){var n=t.offset(),i=p(t),r=n.left+y(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+y(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function g(t,e){var n=t.offset(),i=n.left+y(t,"border-left-width")+y(t,"padding-left")-(e?e.left:0),r=n.top+y(t,"border-top-width")+y(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function p(t){var e=t.innerWidth()-t[0].clientWidth,n={left:0,right:0,top:0,bottom:t.innerHeight()-t[0].clientHeight};return v()&&"rtl"==t.css("direction")?n.left=e:n.right=e,n}function v(){return null===Qt&&(Qt=m()),Qt}function m(){var e=t("<div><div/></div>").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),n=e.children(),i=n.offset().left>e.offset().left;return e.remove(),i}function y(t,e){return parseFloat(t.css(e))||0}function S(t){return 1==t.which&&!t.ctrlKey}function w(t){if(void 0!==t.pageX)return t.pageX;var e=t.originalEvent.touches;return e?e[0].pageX:void 0}function E(t){if(void 0!==t.pageY)return t.pageY;var e=t.originalEvent.touches;return e?e[0].pageY:void 0}function b(t){return/^touch/.test(t.type)}function D(t){t.addClass("fc-unselectable").on("selectstart",T)}function T(t){t.preventDefault()}function C(t){return!!window.addEventListener&&(window.addEventListener("scroll",t,!0),!0)}function H(t){return!!window.removeEventListener&&(window.removeEventListener("scroll",t,!0),!0)}function R(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function x(t,e){return{left:Math.min(Math.max(t.left,e.left),e.right),top:Math.min(Math.max(t.top,e.top),e.bottom)}}function I(t){return{left:(t.left+t.right)/2,top:(t.top+t.bottom)/2}}function k(t,e){return{left:t.left-e.left,top:t.top-e.top}}function L(e){var n,i,r=[],s=[];for("string"==typeof e?s=e.split(/\s*,\s*/):"function"==typeof e?s=[e]:t.isArray(e)&&(s=e),n=0;n<s.length;n++)i=s[n],"string"==typeof i?r.push("-"==i.charAt(0)?{field:i.substring(1),order:-1}:{field:i,order:1}):"function"==typeof i&&r.push({func:i});return r}function M(t,e,n){var i,r;for(i=0;i<n.length;i++)if(r=B(t,e,n[i]))return r;return 0}function B(t,e,n){return n.func?n.func(t,e):z(t[n.field],e[n.field])*(n.order||1)}function z(e,n){return e||n?null==n?-1:null==e?1:"string"===t.type(e)||"string"===t.type(n)?String(e).localeCompare(String(n)):e-n:0}function F(t,e){var n,i,r,s,o=t.start,l=t.end,a=e.start,u=e.end;if(l>a&&o<u)return o>=a?(n=o.clone(),r=!0):(n=a.clone(),r=!1),l<=u?(i=l.clone(),s=!0):(i=u.clone(),s=!1),{start:n,end:i,isStart:r,isEnd:s}}function N(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function G(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days")})}function O(t,n,i){return e.duration(Math.round(t.diff(n,i,!0)),i)}function A(t,e){var n,i,r;for(n=0;n<Kt.length&&(i=Kt[n],r=V(i,t,e),!(r>=1&&ot(r)));n++);return i}function V(t,n,i){return null!=i?i.diff(n,t,!0):e.isDuration(n)?n.as(t):n.end.diff(n.start,t,!0)}function P(t,e,n){var i;return W(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ot(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function _(t,e){var n,i;return W(t)||W(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ot(n)&&Math.abs(i)>=1&&ot(i)?n/i:t.asDays()/e.asDays())}function Y(t,n){var i;return W(t)?e.duration(t*n):(i=t.asMonths(),Math.abs(i)>=1&&ot(i)?e.duration({months:i*n}):e.duration({days:t.asDays()*n}))}function W(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function U(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function j(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function q(t,e){var n,i,r,s,o,l,a={};if(e)for(n=0;n<e.length;n++){for(i=e[n],r=[],s=t.length-1;s>=0;s--)if(o=t[s][i],"object"==typeof o)r.unshift(o);else if(void 0!==o){a[i]=o;break}r.length&&(a[i]=q(r))}for(n=t.length-1;n>=0;n--){l=t[n];for(i in l)i in a||(a[i]=l[i])}return a}function Z(t){var e=function(){};return e.prototype=t,new e}function $(t,e){for(var n in t)Q(t,n)&&(e[n]=t[n])}function Q(t,e){return Jt.call(t,e)}function X(e){return/undefined|null|boolean|number|string/.test(t.type(e))}function K(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;r<e.length;r++)s=e[r].apply(n,i)||s;return s}}function J(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}function tt(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function et(t){return t.replace(/&.*?;/g,"")}function nt(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+":"+e)}),n.join(";")}function it(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+'="'+tt(e)+'"')}),n.join(" ")}function rt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function st(t,e){return t-e}function ot(t){return t%1===0}function lt(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function at(t,e,n){var i,r,s,o,l,a=function(){var u=+new Date-o;u<e?i=setTimeout(a,e-u):(i=null,n||(l=t.apply(s,r),s=r=null))};return function(){s=this,r=arguments,o=+new Date;var u=n&&!i;return i||(i=setTimeout(a,e)),u&&(l=t.apply(s,r),s=r=null),l}}function ut(n,i,r){var s,o,l,a,u=n[0],c=1==n.length&&"string"==typeof u;return e.isMoment(u)||U(u)||void 0===u?a=e.apply(null,n):(s=!1,o=!1,c?te.test(u)?(u+="-01",n=[u],s=!0,o=!0):(l=ee.exec(u))&&(s=!l[5],o=!0):t.isArray(u)&&(o=!0),a=i||s?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:c&&a.utcOffset(u))),a._fullCalendar=!0,a}function ct(t,e){return ie.format.call(t,e)}function dt(t,e){return ht(t,mt(e))}function ht(t,e){var n,i="";for(n=0;n<e.length;n++)i+=ft(t,e[n]);return i}function ft(t,e){var n,i;return"string"==typeof e?e:(n=e.token)?se[n]?se[n](t):ct(t,n):e.maybe&&(i=ht(t,e.maybe),i.match(/[1-9]/))?i:""}function gt(t,e,n,i,r){var s;return t=qt.moment.parseZone(t),e=qt.moment.parseZone(e),s=t.localeData(),n=s.longDateFormat(n)||n,i=i||" - ",pt(t,e,mt(n),i,r)}function pt(t,e,n,i,r){var s,o,l,a,u=t.clone().stripZone(),c=e.clone().stripZone(),d="",h="",f="",g="",p="";for(o=0;o<n.length&&(s=vt(t,e,u,c,n[o]),s!==!1);o++)d+=s;for(l=n.length-1;l>o&&(s=vt(t,e,u,c,n[l]),s!==!1);l--)h=s+h;for(a=o;a<=l;a++)f+=ft(t,n[a]),g+=ft(e,n[a]);return(f||g)&&(p=r?g+i+f:f+i+g),d+p+h}function vt(t,e,n,i,r){var s,o;return"string"==typeof r?r:!!((s=r.token)&&(o=oe[s.charAt(0)],o&&n.isSame(i,o)))&&ct(t,s)}function mt(t){return t in le?le[t]:le[t]=yt(t)}function yt(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push(e[1]):e[2]?n.push({maybe:yt(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push(e[5]);return n}function St(){}function wt(t,e){var n;return Q(e,"constructor")&&(n=e.constructor),"function"!=typeof n&&(n=e.constructor=function(){t.apply(this,arguments)}),n.prototype=Z(t.prototype),$(e,n.prototype),$(t,n),n}function Et(t,e){$(e,t.prototype)}function bt(e){var n=t.Deferred(),i=n.promise();if("function"==typeof e&&e(function(t){bt.immediate&&(i._value=t),n.resolve(t)},function(){n.reject()}),bt.immediate){var r=i.then;i.then=function(t,e){var n=i.state();if("resolved"===n){if("function"==typeof t)return bt.resolve(t(i._value))}else if("rejected"===n&&"function"==typeof e)return e(),i;return r.call(i,t,e)}}return i}function Dt(t){function e(t){return new bt(function(e){var i=function(){bt.resolve(t()).then(e).then(function(){n.shift(),n.length&&n[0]()})};n.push(i),1===n.length&&i()})}var n=[];this.add="number"==typeof t?at(e,t):e,this.addQuickly=e}function Tt(t,e){return!t&&!e||!(!t||!e)&&(t.component===e.component&&Ct(t,e)&&Ct(e,t))}function Ct(t,e){for(var n in t)if(!/^(component|left|right|top|bottom)$/.test(n)&&t[n]!==e[n])return!1;return!0}function Ht(t){return{start:t.start.clone(),end:t.end?t.end.clone():null,allDay:t.allDay}}function Rt(t){var e=It(t);return"background"===e||"inverse-background"===e}function xt(t){return"inverse-background"===It(t)}function It(t){return J((t.source||{}).rendering,t.rendering)}function kt(t){var e,n,i={};for(e=0;e<t.length;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function Lt(t,e){return t.start-e.start}function Mt(n){var i,r,s,o,l=qt.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function Bt(t,e){var n,i;for(n=0;n<e.length;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function zt(t,e){return t.leftCol-e.leftCol}function Ft(t){var e,n,i,r=[];for(e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Ot(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function Nt(t){var e,n,i,r,s;for(e=0;e<t.length;e++)for(n=t[e],i=0;i<n.length;i++)for(r=n[i],r.forwardSegs=[],s=e+1;s<t.length;s++)Ot(r,t[s],r.forwardSegs)}function Gt(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;e<i.length;e++)n=i[e],Gt(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function Ot(t,e,n){n=n||[];for(var i=0;i<e.length;i++)At(t,e[i])&&n.push(e[i]);return n}function At(t,e){return t.bottom>e.top&&t.top<e.bottom}function Vt(t){this.items=t||[]}function Pt(e,n){function i(t){n=t}function r(){var i=n.layout;p=e.options.theme?"ui":"fc",i?(g?g.empty():g=this.el=t("<div class='fc-toolbar "+n.extraClasses+"'/>"),g.append(o("left")).append(o("right")).append(o("center")).append('<div class="fc-clear"/>')):s()}function s(){g&&(g.remove(),g=f.el=null)}function o(i){var r=t('<div class="fc-'+i+'"/>'),s=n.layout[i];return s&&t.each(s.split(" "),function(n){var i,s=t(),o=!0;t.each(this.split(","),function(n,i){var r,l,a,u,c,d,h,f,g,m;"title"==i?(s=s.add(t("<h2>&nbsp;</h2>")),o=!1):((r=(e.options.customButtons||{})[i])?(a=function(t){r.click&&r.click.call(m[0],t)},u="",c=r.text):(l=e.getViewSpec(i))?(a=function(){e.changeView(i)},v.push(i),u=l.buttonTextOverride,c=l.buttonTextDefault):e[i]&&(a=function(){e[i]()},u=(e.overrides.buttonText||{})[i],c=e.options.buttonText[i]),a&&(d=r?r.themeIcon:e.options.themeButtonIcons[i],h=r?r.icon:e.options.buttonIcons[i],f=u?tt(u):d&&e.options.theme?"<span class='ui-icon ui-icon-"+d+"'></span>":h&&!e.options.theme?"<span class='fc-icon fc-icon-"+h+"'></span>":tt(c),g=["fc-"+i+"-button",p+"-button",p+"-state-default"],m=t('<button type="button" class="'+g.join(" ")+'">'+f+"</button>").click(function(t){m.hasClass(p+"-state-disabled")||(a(t),(m.hasClass(p+"-state-active")||m.hasClass(p+"-state-disabled"))&&m.removeClass(p+"-state-hover"))}).mousedown(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-down")}).mouseup(function(){m.removeClass(p+"-state-down")}).hover(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-hover")},function(){m.removeClass(p+"-state-hover").removeClass(p+"-state-down")}),s=s.add(m)))}),o&&s.first().addClass(p+"-corner-left").end().last().addClass(p+"-corner-right").end(),s.length>1?(i=t("<div/>"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function l(t){g&&g.find("h2").text(t)}function a(t){g&&g.find(".fc-"+t+"-button").addClass(p+"-state-active")}function u(t){g&&g.find(".fc-"+t+"-button").removeClass(p+"-state-active")}function c(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!0).addClass(p+"-state-disabled")}function d(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(p+"-state-disabled")}function h(){return v}var f=this;f.setToolbarOptions=i,f.render=r,f.removeElement=s,f.updateTitle=l,f.activateButton=a,f.deactivateButton=u,f.disableButton=c,f.enableButton=d,f.getViewsWithButtons=h,f.el=null;var g,p,v=[]}function _t(n,i){function r(t){t._locale=Y}function s(){q?a()&&(f(),u()):o()}function o(){n.addClass("fc"),n.on("click.fc","a[data-goto]",function(e){var n=t(this),i=n.data("goto"),r=_.moment(i.date),s=i.type,o=Q.opt("navLink"+rt(s)+"Click");"function"==typeof o?o(r,e):("string"==typeof o&&(s=o),B(r,s))}),_.bindOption("theme",function(t){$=t?"ui":"fc",n.toggleClass("ui-widget",t),n.toggleClass("fc-unthemed",!t)}),_.bindOptions(["isRTL","locale"],function(t){n.toggleClass("fc-ltr",!t),n.toggleClass("fc-rtl",t)}),q=t("<div class='fc-view-container'/>").prependTo(n);var e=y();W=new Vt(e),U=_.header=e[0],j=_.footer=e[1],E(),b(),u(_.options.defaultView),_.options.handleWindowResize&&(K=at(v,_.options.windowResizeDelay),t(window).resize(K))}function l(){Q&&Q.removeElement(),W.proxyCall("removeElement"),q.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),n.off(".fc"),K&&t(window).unbind("resize",K)}function a(){return n.is(":visible")}function u(e,n){nt++;var i=Q&&e&&Q.type!==e;i&&(F(),c()),!Q&&e&&(Q=_.view=et[e]||(et[e]=_.instantiateView(e)),Q.setElement(t("<div class='fc-view fc-"+e+"-view' />").appendTo(q)),W.proxyCall("activateButton",e)),Q&&(J=Q.massageCurrentDate(J),Q.isDateSet&&J>=Q.intervalStart&&J<Q.intervalEnd||a()&&(n&&Q.captureInitialScroll(n),Q.setDate(J,n),n&&Q.releaseScroll(),D())),i&&N(),nt--}function c(){W.proxyCall("deactivateButton",Q.type),Q.removeElement(),Q=_.view=null}function d(){nt++,F();var t=Q.type,e=Q.queryScroll();c(),f(),u(t,e),N(),nt--}function h(t){if(a())return t&&g(),nt++,Q.updateSize(!0),nt--,!0}function f(){a()&&g()}function g(){var t=_.options.contentHeight,e=_.options.height;X="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-p():"function"==typeof e?e()-p():"parent"===e?n.parent().height()-p():Math.round(q.width()/Math.max(_.options.aspectRatio,.5))}function p(){return W.items.reduce(function(t,e){var n=e.el?e.el.outerHeight(!0):0;return t+n},0)}function v(t){!nt&&t.target===window&&Q.start&&h(!0)&&Q.publiclyTrigger("windowResize",tt)}function m(){a()&&_.reportEventChange()}function y(){return[new Pt(_,S()),new Pt(_,w())]}function S(){return{extraClasses:"fc-header-toolbar",layout:_.options.header}}function w(){return{extraClasses:"fc-footer-toolbar",layout:_.options.footer}}function E(){U.setToolbarOptions(S()),U.render(),U.el&&n.prepend(U.el)}function b(){j.setToolbarOptions(w()),j.render(),j.el&&n.append(j.el)}function D(){var t=_.getNow();t>=Q.intervalStart&&t<Q.intervalEnd?W.proxyCall("disableButton","today"):W.proxyCall("enableButton","today")}function T(t,e){Q.select(_.buildSelectSpan.apply(_,arguments))}function C(){Q&&Q.unselect()}function H(){J=Q.computePrevDate(J),u()}function R(){J=Q.computeNextDate(J),u()}function x(){J.add(-1,"years"),u()}function I(){J.add(1,"years"),u()}function k(){J=_.getNow(),u()}function L(t){J=_.moment(t).stripZone(),u()}function M(t){J.add(e.duration(t)),u()}function B(t,e){var n;e=e||"day",n=_.getViewSpec(e)||_.getUnitViewSpec(e),J=t.clone(),u(n?n.type:null)}function z(){return _.applyTimezone(J)}function F(){it++||q.css({width:"100%",height:q.height(),overflow:"hidden"})}function N(){--it||q.css({width:"",height:"",overflow:""})}function G(){return _}function O(){return Q}function A(t,e){var n;if("string"==typeof t){if(void 0===e)return _.options[t];n={},n[t]=e,V(n)}else"object"==typeof t&&V(t)}function V(t){var e,n=0;for(e in t)_.dynamicOverrides[e]=t[e];_.viewSpecCache={},_.populateOptionsHash();for(e in t)_.triggerOptionHandlers(e),n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void h(!0);if("defaultDate"===e)return;if("businessHours"===e)return void(Q&&(Q.unrenderBusinessHours(),Q.renderBusinessHours()));if("timezone"===e)return _.rezoneArrayEventSources(),void _.refetchEvents()}E(),b(),et={},d()}function P(t,e){var n=Array.prototype.slice.call(arguments,2);if(e=e||tt,this.triggerWith(t,e,n),_.options[t])return _.options[t].apply(e,n)}var _=this;_.render=s,_.destroy=l,_.rerenderEvents=m,_.changeView=u,_.select=T,_.unselect=C,_.prev=H,_.next=R,_.prevYear=x,_.nextYear=I,_.today=k,_.gotoDate=L,_.incrementDate=M,_.zoomTo=B,_.getDate=z,_.getCalendar=G,_.getView=O,_.option=A,_.publiclyTrigger=P,_.dynamicOverrides={},_.viewSpecCache={},_.optionHandlers={},_.overrides=t.extend({},i),_.populateOptionsHash();var Y;_.bindOptions(["locale","monthNames","monthNamesShort","dayNames","dayNamesShort","firstDay","weekNumberCalculation"],function(t,e,n,i,s,o,l){if("iso"===l&&(l="ISO"),Y=Z(Wt(t)),e&&(Y._months=e),n&&(Y._monthsShort=n),i&&(Y._weekdays=i),s&&(Y._weekdaysShort=s),null==o&&"ISO"===l&&(o=1),null!=o){var a=Z(Y._week);a.dow=o,Y._week=a}"ISO"!==l&&"local"!==l&&"function"!=typeof l||(Y._fullCalendar_weekCalc=l),J&&r(J)}),_.defaultAllDayEventDuration=e.duration(_.options.defaultAllDayEventDuration),_.defaultTimedEventDuration=e.duration(_.options.defaultTimedEventDuration),_.moment=function(){var t;return"local"===_.options.timezone?(t=qt.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===_.options.timezone?qt.moment.utc.apply(null,arguments):qt.moment.parseZone.apply(null,arguments),r(t),t},_.localizeMoment=r,_.getIsAmbigTimezone=function(){return"local"!==_.options.timezone&&"UTC"!==_.options.timezone},_.applyTimezone=function(t){if(!t.hasTime())return t.clone();var e,n=_.moment(t.toArray()),i=t.time()-n.time();return i&&(e=n.clone().add(i),t.time()-e.time()===0&&(n=e)),n},_.getNow=function(){var t=_.options.now;return"function"==typeof t&&(t=t()),_.moment(t).stripZone()},_.getEventEnd=function(t){return t.end?t.end.clone():_.getDefaultEventEnd(t.allDay,t.start)},_.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(_.defaultAllDayEventDuration):n.add(_.defaultTimedEventDuration),_.getIsAmbigTimezone()&&n.stripZone(),n},_.humanizeDuration=function(t){return t.locale(_.options.locale).humanize()},Ut.call(_);var W,U,j,q,$,Q,X,K,J,tt=n[0],et={},nt=0;J=null!=_.options.defaultDate?_.moment(_.options.defaultDate).stripZone():_.getNow(),_.getSuggestedViewHeight=function(){return void 0===X&&f(),X},_.isHeightAuto=function(){return"auto"===_.options.contentHeight||"auto"===_.options.height},_.setToolbarsTitle=function(t){W.proxyCall("updateTitle",t)},_.freezeContentHeight=F,_.thawContentHeight=N;var it=0;_.initialize()}function Yt(e){t.each(Re,function(t,n){null==e[t]&&(e[t]=n(e))})}function Wt(t){return e.localeData(t)||e.localeData("en")}function Ut(){function n(t,e){return!U.options.lazyFetching||s(t,e)?o(t,e):bt.resolve($)}function i(){$=r(nt),U.trigger("eventsReset",$)}function r(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],n.start.clone().stripZone()<Z&&U.getEventEnd(n).stripZone()>q&&i.push(n);return i}function s(t,e){return!q||t<q||e>Z}function o(t,e){return q=t,Z=e,l()}function l(){return u(tt,"reset")}function a(t){return u(E(t))}function u(t,e){var n,i;for("reset"===e?nt=[]:"add"!==e&&(nt=C(nt,t)),n=0;n<t.length;n++)i=t[n],"pending"!==i._status&&et++,i._fetchId=(i._fetchId||0)+1,i._status="pending";for(n=0;n<t.length;n++)i=t[n],c(i,i._fetchId);return et?new bt(function(t){U.one("eventsReceived",t)}):bt.resolve($)}function c(e,n){f(e,function(i){var r,s,o,l=t.isArray(e.events);if(n===e._fetchId&&"rejected"!==e._status){if(e._status="resolved",i)for(r=0;r<i.length;r++)s=i[r],o=l?s:F(s,e),o&&nt.push.apply(nt,_(o));h()}})}function d(t){var e="pending"===t._status;t._status="rejected",e&&h()}function h(){et--,et||(i(nt),U.trigger("eventsReceived",$))}function f(e,n){var i,r,s=qt.sourceFetchers;for(i=0;i<s.length;i++){if(r=s[i].call(U,e,q.clone(),Z.clone(),U.options.timezone,n),r===!0)return;if("object"==typeof r)return void f(r,n)}var o=e.events;if(o)t.isFunction(o)?(U.pushLoading(),o.call(U,q.clone(),Z.clone(),U.options.timezone,function(t){n(t),U.popLoading()})):t.isArray(o)?n(o):n();else{var l=e.url;if(l){var a,u=e.success,c=e.error,d=e.complete;a=t.isFunction(e.data)?e.data():e.data;var h=t.extend({},a||{}),g=J(e.startParam,U.options.startParam),p=J(e.endParam,U.options.endParam),v=J(e.timezoneParam,U.options.timezoneParam);g&&(h[g]=q.format()),p&&(h[p]=Z.format()),U.options.timezone&&"local"!=U.options.timezone&&(h[v]=U.options.timezone),U.pushLoading(),t.ajax(t.extend({},xe,e,{data:h,success:function(e){e=e||[];var i=K(u,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){K(c,this,arguments),n()},complete:function(){K(d,this,arguments),U.popLoading()}}))}else n()}}function g(t){var e=p(t);e&&(tt.push(e),u([e],"add"))}function p(e){var n,i,r=qt.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return F(t,n)})),i=0;i<r.length;i++)r[i].call(U,n);return n}}function v(t){y(b(t))}function m(t){null==t?y(tt,!0):y(E(t))}function y(e,n){var r;for(r=0;r<e.length;r++)d(e[r]);n?(tt=[],nt=[]):(tt=t.grep(tt,function(t){for(r=0;r<e.length;r++)if(t===e[r])return!1;return!0}),nt=C(nt,e)),i()}function S(){return tt.slice(1)}function w(e){return t.grep(tt,function(t){return t.id&&t.id===e})[0]}function E(e){e?t.isArray(e)||(e=[e]):e=[];var n,i=[];for(n=0;n<e.length;n++)i.push.apply(i,b(e[n]));return i}function b(e){var n,i;for(n=0;n<tt.length;n++)if(i=tt[n],i===e)return[i];return i=w(e),i?[i]:t.grep(tt,function(t){return D(e,t)})}function D(t,e){return t&&e&&T(t)==T(e)}function T(t){return("object"==typeof t?t.origArray||t.googleCalendarId||t.url||t.events:null)||t}function C(e,n){return t.grep(e,function(t){for(var e=0;e<n.length;e++)if(t.source===n[e])return!1;return!0})}function H(t){R([t])}function R(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.start=U.moment(n.start),n.end?n.end=U.moment(n.end):n.end=null,Y(n,x(n));i()}function x(e){var n={};return t.each(e,function(t,e){I(t)&&void 0!==e&&X(e)&&(n[t]=e)}),n}function I(t){return!/^_|^(id|allDay|start|end)$/.test(t)}function k(t,e){return L([t],e)}function L(t,e){var n,r,s,o,l,a=[];for(s=0;s<t.length;s++)if(r=F(t[s])){for(n=_(r),o=0;o<n.length;o++)l=n[o],l.source||(e&&(Q.events.push(l),l.source=Q),nt.push(l));a=a.concat(n)}return a.length&&i(),a}function M(e){var n,r;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),nt=t.grep(nt,e,!0),r=0;r<tt.length;r++)t.isArray(tt[r].events)&&(tt[r].events=t.grep(tt[r].events,e,!0));i()}function B(e){return t.isFunction(e)?t.grep(nt,e):null!=e?(e+="",t.grep(nt,function(t){return t._id==e})):nt}function z(t){t.start=U.moment(t.start),t.end&&(t.end=U.moment(t.end)),jt(t)}function F(n,i){var r,s,o,l={};if(U.options.eventDataTransform&&(n=U.options.eventDataTransform(n)),i&&i.eventDataTransform&&(n=i.eventDataTransform(n)),t.extend(l,n),i&&(l.source=i),l._id=n._id||(void 0===n.id?"_fc"+Ie++:n.id+""),n.className?"string"==typeof n.className?l.className=n.className.split(/\s+/):l.className=n.className:l.className=[],r=n.start||n.date,s=n.end,j(r)&&(r=e.duration(r)),j(s)&&(s=e.duration(s)),n.dow||e.isDuration(r)||e.isDuration(s))l.start=r?e.duration(r):null,l.end=s?e.duration(s):null,l._recurring=!0;else{if(r&&(r=U.moment(r),!r.isValid()))return!1;s&&(s=U.moment(s),s.isValid()||(s=null)),o=n.allDay,void 0===o&&(o=J(i?i.allDayDefault:void 0,U.options.allDayDefault)),A(r,s,o,l)}return U.normalizeEvent(l),l}function A(t,e,n,i){i.start=t,i.end=e,i.allDay=n,V(i),jt(i)}function V(t){P(t),t.end&&!t.end.isAfter(t.start)&&(t.end=null),t.end||(U.options.forceEventDuration?t.end=U.getDefaultEventEnd(t.allDay,t.start):t.end=null)}function P(t){null==t.allDay&&(t.allDay=!(t.start.hasTime()||t.end&&t.end.hasTime())),t.allDay?(t.start.stripTime(),t.end&&t.end.stripTime()):(t.start.hasTime()||(t.start=U.applyTimezone(t.start.time(0))),t.end&&!t.end.hasTime()&&(t.end=U.applyTimezone(t.end.time(0))))}function _(e,n,i){var r,s,o,l,a,u,c,d,h,f=[];if(n=n||q,i=i||Z,e)if(e._recurring){if(s=e.dow)for(r={},o=0;o<s.length;o++)r[s[o]]=!0;for(l=n.clone().stripTime();l.isBefore(i);)r&&!r[l.day()]||(a=e.start,u=e.end,c=l.clone(),d=null,a&&(c=c.time(a)),u&&(d=l.clone().time(u)),h=t.extend({},e),A(c,d,!a&&!u,h),f.push(h)),l.add(1,"days")}else f.push(e);return f}function Y(e,n,i){function r(t,e){return i?O(t,e,i):n.allDay?G(t,e):N(t,e)}var s,o,l,a,u,c,d={};return n=n||{},n.start||(n.start=e.start.clone()),void 0===n.end&&(n.end=e.end?e.end.clone():null),null==n.allDay&&(n.allDay=e.allDay),V(n),s={start:e._start.clone(),end:e._end?e._end.clone():U.getDefaultEventEnd(e._allDay,e._start),allDay:n.allDay},V(s),o=null!==e._end&&null===n.end,l=r(n.start,s.start),n.end?(a=r(n.end,s.end),u=a.subtract(l)):u=null,t.each(n,function(t,e){I(t)&&void 0!==e&&(d[t]=e)}),c=W(B(e._id),o,n.allDay,l,u,d),{dateDelta:l,durationDelta:u,undo:c}}function W(e,n,i,r,s,o){var l=U.getIsAmbigTimezone(),a=[];return r&&!r.valueOf()&&(r=null),s&&!s.valueOf()&&(s=null),t.each(e,function(e,u){var c,d;c={start:u.start.clone(),end:u.end?u.end.clone():null,allDay:u.allDay},t.each(o,function(t){c[t]=u[t]}),d={start:u._start,end:u._end,allDay:i},V(d),n?d.end=null:s&&!d.end&&(d.end=U.getDefaultEventEnd(d.allDay,d.start)),r&&(d.start.add(r),d.end&&d.end.add(r)),s&&d.end.add(s),l&&!d.allDay&&(r||s)&&(d.start.stripZone(),d.end&&d.end.stripZone()),t.extend(u,o,d),jt(u),a.push(function(){t.extend(u,c),jt(u)})}),function(){for(var t=0;t<a.length;t++)a[t]()}}var U=this;U.requestEvents=n,U.reportEventChange=i,U.isFetchNeeded=s,U.fetchEvents=o,U.fetchEventSources=u,U.refetchEvents=l,U.refetchEventSources=a,U.getEventSources=S,U.getEventSourceById=w,U.addEventSource=g,U.removeEventSource=v,U.removeEventSources=m,U.updateEvent=H,U.updateEvents=R,U.renderEvent=k,U.renderEvents=L,U.removeEvents=M,U.clientEvents=B,U.mutateEvent=Y,U.normalizeEventDates=V,U.normalizeEventTimes=P;var q,Z,$,Q={events:[]},tt=[Q],et=0,nt=[];t.each((U.options.events?[U.options.events]:[]).concat(U.options.eventSources||[]),function(t,e){var n=p(e);n&&tt.push(n)}),U.getEventCache=function(){return nt},U.getPrunedEventCache=function(){return $},U.rezoneArrayEventSources=function(){var e,n,i;for(e=0;e<tt.length;e++)if(n=tt[e].events,t.isArray(n))for(i=0;i<n.length;i++)z(n[i])},U.buildEventFromInput=F,U.expandEvent=_}function jt(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}var qt=t.fullCalendar={version:"3.1.0",internalApiVersion:7},Zt=qt.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,l=t(s),a=l.data("fullCalendar");"string"==typeof e?a&&t.isFunction(a[e])&&(o=a[e].apply(a,n),r||(i=o),"destroy"===e&&l.removeData("fullCalendar")):a||(a=new De(l,e),l.data("fullCalendar",a),a.render())}),i};var $t=["header","footer","buttonText","buttonIcons","themeButtonIcons"];qt.intersectRanges=F,qt.applyAll=K,qt.debounce=at,qt.isInt=ot,qt.htmlEscape=tt,qt.cssToStr=nt,qt.proxy=lt,qt.capitaliseFirstLetter=rt,qt.getOuterRect=h,qt.getClientRect=f,qt.getContentRect=g,qt.getScrollbarWidths=p;var Qt=null;qt.preventDefault=T,qt.intersectRects=R,qt.parseFieldSpecs=L,qt.compareByFieldSpecs=M,qt.compareByFieldSpec=B,qt.flexibleCompare=z,qt.computeIntervalUnit=A,qt.divideRangeByDuration=P,qt.divideDurationByDuration=_,qt.multiplyDuration=Y,qt.durationHasTime=W;var Xt=["sun","mon","tue","wed","thu","fri","sat"],Kt=["year","month","week","day","hour","minute","second","millisecond"];qt.log=function(){var t=window.console;if(t&&t.log)return t.log.apply(t,arguments)},qt.warn=function(){var t=window.console;return t&&t.warn?t.warn.apply(t,arguments):qt.log.apply(qt,arguments)};var Jt={}.hasOwnProperty;qt.createObject=Z;var te=/^\s*\d{4}-\d\d$/,ee=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,ne=e.fn,ie=t.extend({},ne),re=e.momentProperties;re.push("_fullCalendar"),re.push("_ambigTime"),re.push("_ambigZone"),qt.moment=function(){return ut(arguments)},qt.moment.utc=function(){var t=ut(arguments,!0);return t.hasTime()&&t.utc(),t},qt.moment.parseZone=function(){return ut(arguments,!0,!0)},ne.week=ne.weeks=function(t){var e=this._locale._fullCalendar_weekCalc;return null==t&&"function"==typeof e?e(this):"ISO"===e?ie.isoWeek.apply(this,arguments):ie.week.apply(this,arguments)},ne.time=function(t){if(!this._fullCalendar)return ie.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},ne.stripTime=function(){return this._ambigTime||(this.utc(!0),this.set({hours:0,minutes:0,seconds:0,ms:0}),this._ambigTime=!0,this._ambigZone=!0),this},ne.hasTime=function(){return!this._ambigTime},ne.stripZone=function(){var t;return this._ambigZone||(t=this._ambigTime,this.utc(!0),this._ambigTime=t||!1,this._ambigZone=!0),this},ne.hasZone=function(){return!this._ambigZone},ne.local=function(t){return ie.local.call(this,this._ambigZone||t),this._ambigTime=!1,this._ambigZone=!1,this},ne.utc=function(t){return ie.utc.call(this,t),this._ambigTime=!1,this._ambigZone=!1,this},ne.utcOffset=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),ie.utcOffset.apply(this,arguments)},ne.format=function(){return this._fullCalendar&&arguments[0]?dt(this,arguments[0]):this._ambigTime?ct(this,"YYYY-MM-DD"):this._ambigZone?ct(this,"YYYY-MM-DD[T]HH:mm:ss"):ie.format.apply(this,arguments)},ne.toISOString=function(){return this._ambigTime?ct(this,"YYYY-MM-DD"):this._ambigZone?ct(this,"YYYY-MM-DD[T]HH:mm:ss"):ie.toISOString.apply(this,arguments)};var se={t:function(t){return ct(t,"a").charAt(0)},T:function(t){return ct(t,"A").charAt(0)}};qt.formatRange=gt;var oe={Y:"year",M:"month",D:"day",d:"day",A:"second",a:"second",T:"second",t:"second",H:"second",h:"second",m:"second",s:"second"},le={},ae={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}};qt.queryMostGranularFormatUnit=function(t){
-var e,n,i,r,s=mt(t);for(e=0;e<s.length;e++)n=s[e],n.token&&(i=ae[n.token.charAt(0)],i&&(!r||i.value>r.value)&&(r=i));return r?r.unit:null},qt.Class=St,St.extend=function(){var t,e,n=arguments.length;for(t=0;t<n;t++)e=arguments[t],t<n-1&&Et(this,e);return wt(this,e||{})},St.mixin=function(t){Et(this,t)},qt.Promise=bt,bt.immediate=!0,bt.resolve=function(e){if(e&&"function"==typeof e.resolve)return e.promise();if(e&&"function"==typeof e.then)return e;var n=t.Deferred().resolve(e),i=n.promise();if(bt.immediate){var r=i.then;i._value=e,i.then=function(t,n){return"function"==typeof t?bt.resolve(t(e)):r.call(i,t,n)}}return i},bt.reject=function(){return t.Deferred().reject().promise()},bt.all=function(e){var n,i,r,s=!1;if(bt.immediate)for(s=!0,n=[],i=0;i<e.length;i++)if(r=e[i],r&&"function"==typeof r.state&&"resolved"===r.state()&&"_value"in r)n.push(r._value);else{if(r&&"function"==typeof r.then){s=!1;break}n.push(r)}return s?bt.resolve(n):t.when.apply(t.when,e).then(function(){return t.when(t.makeArray(arguments))})},qt.TaskQueue=Dt;var ue=qt.EmitterMixin={on:function(e,n){return t(this).on(e,this._prepareIntercept(n)),this},one:function(e,n){return t(this).one(e,this._prepareIntercept(n)),this},_prepareIntercept:function(e){var n=function(t,n){return e.apply(n.context||this,n.args||[])};return e.guid||(e.guid=t.guid++),n.guid=e.guid,n},off:function(e,n){return t(this).off(e,n),this},trigger:function(e){var n=Array.prototype.slice.call(arguments,1);return t(this).triggerHandler(e,{args:n}),this},triggerWith:function(e,n,i){return t(this).triggerHandler(e,{context:n,args:i}),this}},ce=qt.ListenerMixin=function(){var e=0,n={listenerId:null,listenTo:function(e,n,i){if("object"==typeof n)for(var r in n)n.hasOwnProperty(r)&&this.listenTo(e,r,n[r]);else"string"==typeof n&&e.on(n+"."+this.getListenerNamespace(),t.proxy(i,this))},stopListeningTo:function(t,e){t.off((e||"")+"."+this.getListenerNamespace())},getListenerNamespace:function(){return null==this.listenerId&&(this.listenerId=e++),"_listener"+this.listenerId}};return n}(),de={isIgnoringMouse:!1,delayUnignoreMouse:null,initMouseIgnoring:function(t){this.delayUnignoreMouse=at(lt(this,"unignoreMouse"),t||1e3)},tempIgnoreMouse:function(){this.isIgnoringMouse=!0,this.delayUnignoreMouse()},unignoreMouse:function(){this.isIgnoringMouse=!1}},he=St.extend(ce,{isHidden:!0,options:null,el:null,margin:10,constructor:function(t){this.options=t||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var e=this,n=this.options;this.el=t('<div class="fc-popover"/>').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&this.listenTo(t(document),"mousedown",this.documentMousedown)},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(t(document),"mousedown")},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),u=this.el.outerHeight(),c=t(window),h=d(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,h.is(window)||h.is(document)?(h=c,e=0,n=0):(i=h.offset(),e=i.top,n=i.left),e+=c.scrollTop(),n+=c.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-u-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+h.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}}),fe=qt.CoordCache=St.extend({els:null,forcedOffsetParentEl:null,origin:null,boundingRect:null,isHorizontal:!1,isVertical:!1,lefts:null,rights:null,tops:null,bottoms:null,constructor:function(e){this.els=t(e.els),this.isHorizontal=e.isHorizontal,this.isVertical=e.isVertical,this.forcedOffsetParentEl=e.offsetParent?t(e.offsetParent):null},build:function(){var t=this.forcedOffsetParentEl;!t&&this.els.length>0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},ensureBuilt:function(){this.origin||this.build()},buildElHorizontals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().left,l=s.outerWidth();e.push(o),n.push(o+l)}),this.lefts=e,this.rights=n},buildElVerticals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().top,l=s.outerHeight();e.push(o),n.push(o+l)}),this.tops=e,this.bottoms=n},getHorizontalIndex:function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getVerticalIndex:function(t){this.ensureBuilt();var e,n=this.tops,i=this.bottoms,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getLeftOffset:function(t){return this.ensureBuilt(),this.lefts[t]},getLeftPosition:function(t){return this.ensureBuilt(),this.lefts[t]-this.origin.left},getRightOffset:function(t){return this.ensureBuilt(),this.rights[t]},getRightPosition:function(t){return this.ensureBuilt(),this.rights[t]-this.origin.left},getWidth:function(t){return this.ensureBuilt(),this.rights[t]-this.lefts[t]},getTopOffset:function(t){return this.ensureBuilt(),this.tops[t]},getTopPosition:function(t){return this.ensureBuilt(),this.tops[t]-this.origin.top},getBottomOffset:function(t){return this.ensureBuilt(),this.bottoms[t]},getBottomPosition:function(t){return this.ensureBuilt(),this.bottoms[t]-this.origin.top},getHeight:function(t){return this.ensureBuilt(),this.bottoms[t]-this.tops[t]},queryBoundingRect:function(){var t;return this.els.length>0&&(t=d(this.els.eq(0)),!t.is(document))?f(t):null},isPointInBounds:function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},isLeftInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.left&&t<this.boundingRect.right},isTopInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.top&&t<this.boundingRect.bottom}}),ge=qt.DragListener=St.extend(ce,de,{options:null,subjectEl:null,originX:null,originY:null,scrollEl:null,isInteracting:!1,isDistanceSurpassed:!1,isDelayEnded:!1,isDragging:!1,isTouch:!1,delay:null,delayTimeoutId:null,minDistance:null,handleTouchScrollProxy:null,constructor:function(t){this.options=t||{},this.handleTouchScrollProxy=lt(this,"handleTouchScroll"),this.initMouseIgnoring(500)},startInteraction:function(e,n){var i=b(e);if("mousedown"===e.type){if(this.isIgnoringMouse)return;if(!S(e))return;e.preventDefault()}this.isInteracting||(n=n||{},this.delay=J(n.delay,this.options.delay,0),this.minDistance=J(n.distance,this.options.distance,0),this.subjectEl=this.options.subjectEl,this.isInteracting=!0,this.isTouch=i,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.originX=w(e),this.originY=E(e),this.scrollEl=d(t(e.target)),this.bindHandlers(),this.initAutoScroll(),this.handleInteractionStart(e),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e))},handleInteractionStart:function(t){this.trigger("interactionStart",t)},endInteraction:function(t,e){this.isInteracting&&(this.endDrag(t),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null),this.destroyAutoScroll(),this.unbindHandlers(),this.isInteracting=!1,this.handleInteractionEnd(t,e),this.isTouch&&this.tempIgnoreMouse())},handleInteractionEnd:function(t,e){this.trigger("interactionEnd",t,e||!1)},bindHandlers:function(){var e=this,n=1;this.isTouch?(this.listenTo(t(document),{touchmove:this.handleTouchMove,touchend:this.endInteraction,touchcancel:this.endInteraction,touchstart:function(t){n?n--:e.endInteraction(t,!0)}}),!C(this.handleTouchScrollProxy)&&this.scrollEl&&this.listenTo(this.scrollEl,"scroll",this.handleTouchScroll)):this.listenTo(t(document),{mousemove:this.handleMouseMove,mouseup:this.endInteraction}),this.listenTo(t(document),{selectstart:T,contextmenu:T})},unbindHandlers:function(){this.stopListeningTo(t(document)),H(this.handleTouchScrollProxy),this.scrollEl&&this.stopListeningTo(this.scrollEl,"scroll")},startDrag:function(t,e){this.startInteraction(t,e),this.isDragging||(this.isDragging=!0,this.handleDragStart(t))},handleDragStart:function(t){this.trigger("dragStart",t)},handleMove:function(t){var e,n=w(t)-this.originX,i=E(t)-this.originY,r=this.minDistance;this.isDistanceSurpassed||(e=n*n+i*i,e>=r*r&&this.handleDistanceSurpassed(t)),this.isDragging&&this.handleDrag(n,i,t)},handleDrag:function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},endDrag:function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},handleDragEnd:function(t){this.trigger("dragEnd",t)},startDelay:function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},handleDelayEnd:function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},handleDistanceSurpassed:function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},handleTouchMove:function(t){this.isDragging&&t.preventDefault(),this.handleMove(t)},handleMouseMove:function(t){this.handleMove(t)},handleTouchScroll:function(t){this.isDragging||this.endInteraction(t,!0)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1)),this["_"+t]&&this["_"+t].apply(this,Array.prototype.slice.call(arguments,1))}});ge.mixin({isAutoScroll:!1,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,initAutoScroll:function(){var t=this.scrollEl;this.isAutoScroll=this.options.scroll&&t&&!t.is(window)&&!t.is(document),this.isAutoScroll&&this.listenTo(t,"scroll",at(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=h(this.scrollEl))},updateAutoScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(E(t)-o.top))/s,n=(s-(o.bottom-E(t)))/s,i=(s-(w(t)-o.left))/s,r=(s-(o.right-w(t)))/s,e>=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?a=i*this.scrollSpeed*-1:r>=0&&r<=1&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(lt(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},handleDebouncedScroll:function(){this.scrollIntervalId||this.handleScrollEnd()},handleScrollEnd:function(){}});var pe=ge.extend({component:null,origHit:null,hit:null,coordAdjust:null,constructor:function(t,e){ge.call(this,e),this.component=t},handleInteractionStart:function(t){var e,n,i,r=this.subjectEl;this.computeCoords(),t?(n={left:w(t),top:E(t)},i=n,r&&(e=h(r),i=x(i,e)),this.origHit=this.queryHit(i.left,i.top),r&&this.options.subjectCenter&&(this.origHit&&(e=R(this.origHit,e)||e),i=I(e)),this.coordAdjust=k(i,n)):(this.origHit=null,this.coordAdjust=null),ge.prototype.handleInteractionStart.apply(this,arguments)},computeCoords:function(){this.component.prepareHits(),this.computeScrollBounds()},handleDragStart:function(t){var e;ge.prototype.handleDragStart.apply(this,arguments),e=this.queryHit(w(t),E(t)),e&&this.handleHitOver(e)},handleDrag:function(t,e,n){var i;ge.prototype.handleDrag.apply(this,arguments),i=this.queryHit(w(n),E(n)),Tt(i,this.hit)||(this.hit&&this.handleHitOut(),i&&this.handleHitOver(i))},handleDragEnd:function(){this.handleHitDone(),ge.prototype.handleDragEnd.apply(this,arguments)},handleHitOver:function(t){var e=Tt(t,this.origHit);this.hit=t,this.trigger("hitOver",this.hit,e,this.origHit)},handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)},handleInteractionEnd:function(){ge.prototype.handleInteractionEnd.apply(this,arguments),this.origHit=null,this.hit=null,this.component.releaseHits()},handleScrollEnd:function(){ge.prototype.handleScrollEnd.apply(this,arguments),this.computeCoords()},queryHit:function(t,e){return this.coordAdjust&&(t+=this.coordAdjust.left,e+=this.coordAdjust.top),this.component.queryHit(t,e)}}),ve=St.extend(ce,{options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,y0:null,x0:null,topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()},start:function(e){this.isFollowing||(this.isFollowing=!0,this.y0=E(e),this.x0=w(e),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),b(e)?this.listenTo(t(document),"touchmove",this.handleMove):this.listenTo(t(document),"mousemove",this.handleMove))},stop:function(e,n){function i(){r.isAnimating=!1,r.removeElement(),r.top0=r.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(t(document)),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(t=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),t.addClass("fc-unselectable"),t.appendTo(this.parentEl)),t},removeElement:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},handleMove:function(t){this.topDelta=E(t)-this.y0,this.leftDelta=w(t)-this.x0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),me=qt.Grid=St.extend(ce,de,{hasDayInteractions:!0,view:null,isRTL:null,start:null,end:null,el:null,elsByFill:null,eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,largeUnit:null,dayDragListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(t){this.view=t,this.isRTL=t.opt("isRTL"),this.elsByFill={},this.dayDragListener=this.buildDayDragListener(),this.initMouseIgnoring()},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventTime:function(){return!0},computeDisplayEventEnd:function(){return!0},setRange:function(t){this.start=t.start.clone(),this.end=t.end.clone(),this.rangeUpdated(),this.processRangeOptions()},rangeUpdated:function(){},processRangeOptions:function(){var t,e,n=this.view;this.eventTimeFormat=n.opt("eventTimeFormat")||n.opt("timeFormat")||this.computeEventTimeFormat(),t=n.opt("displayEventTime"),null==t&&(t=this.computeDisplayEventTime()),e=n.opt("displayEventEnd"),null==e&&(e=this.computeDisplayEventEnd()),this.displayEventTime=t,this.displayEventEnd=e},spanToSegs:function(t){},diffDates:function(t,e){return this.largeUnit?O(t,e,this.largeUnit):N(t,e)},prepareHits:function(){},releaseHits:function(){},queryHit:function(t,e){},getHitSpan:function(t){},getHitEl:function(t){},setElement:function(t){this.el=t,this.hasDayInteractions&&(D(t),this.bindDayHandler("touchstart",this.dayTouchStart),this.bindDayHandler("mousedown",this.dayMousedown)),this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(e,n){var i=this;this.el.on(e,function(e){if(!t(e.target).is(i.segSelector+","+i.segSelector+" *,.fc-more,a[data-goto]"))return n.call(i,e)})},removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()},renderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},bindGlobalHandlers:function(){this.listenTo(t(document),{dragstart:this.externalDragStart,sortstart:this.externalDragStart})},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},dayMousedown:function(t){this.isIgnoringMouse||this.dayDragListener.startInteraction(t,{})},dayTouchStart:function(t){var e=this.view,n=e.opt("selectLongPressDelay");(e.isSelected||e.selectedEvent)&&this.tempIgnoreMouse(),null==n&&(n=e.opt("longPressDelay")),this.dayDragListener.startInteraction(t,{delay:n})},buildDayDragListener:function(){var t,e,n=this,i=this.view,r=i.opt("selectable"),l=new pe(this,{scroll:i.opt("dragScroll"),interactionStart:function(){t=l.origHit,e=null},dragStart:function(){i.unselect()},hitOver:function(i,o,l){l&&(o||(t=null),r&&(e=n.computeSelection(n.getHitSpan(l),n.getHitSpan(i)),e?n.renderSelection(e):e===!1&&s()))},hitOut:function(){t=null,e=null,n.unrenderSelection()},hitDone:function(){o()},interactionEnd:function(r,s){s||(t&&!n.isIgnoringMouse&&i.triggerDayClick(n.getHitSpan(t),n.getHitEl(t),r),e&&i.reportSelection(e,r))}});return l},clearDragListeners:function(){this.dayDragListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},renderEventLocationHelper:function(t,e){var n=this.fabricateHelperEvent(t,e);return this.renderHelper(n,e)},fabricateHelperEvent:function(t,e){var n=e?Z(e.event):{};return n.start=t.start.clone(),n.end=t.end?t.end.clone():null,n.allDay=null,this.view.calendar.normalizeEventDates(n),n.className=(n.className||[]).concat("fc-helper"),e||(n.editable=!1),n},renderHelper:function(t,e){},unrenderHelper:function(){},renderSelection:function(t){this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHighlight()},computeSelection:function(t,e){var n=this.computeSelectionSpan(t,e);return!(n&&!this.view.calendar.isSelectionSpanAllowed(n))&&n},computeSelectionSpan:function(t,e){var n=[t.start,t.end,e.start,e.end];return n.sort(st),{start:n[0].clone(),end:n[3].clone()}},renderHighlight:function(t){this.renderFill("highlight",this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderBusinessHours:function(){},unrenderBusinessHours:function(){},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},renderFill:function(t,e){},unrenderFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;i<n.length;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegCss"],r=n?n.call(this,e):[],s=nt(i?i.call(this,e):{});return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},getDayClasses:function(t,e){var n=this.view,i=n.calendar.getNow(),r=["fc-"+Xt[t.day()]];return 1==n.intervalDuration.as("months")&&t.month()!=n.intervalStart.month()&&r.push("fc-other-month"),t.isSame(i,"day")?(r.push("fc-today"),e!==!0&&r.push(n.highlightStateClass)):t<i?r.push("fc-past"):r.push("fc-future"),r}});me.mixin({segSelector:".fc-event-container > *",mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,isDraggingExternal:!1,segs:null,renderEvents:function(t){var e,n=[],i=[];for(e=0;e<t.length;e++)(Rt(t[e])?n:i).push(t[e]);this.segs=[].concat(this.renderBgEvents(n),this.renderFgEvents(i))},renderBgEvents:function(t){var e=this.eventsToSegs(t);return this.renderBgSegs(e)||e},renderFgEvents:function(t){var e=this.eventsToSegs(t);return this.renderFgSegs(e)||e},unrenderEvents:function(){this.handleSegMouseout(),this.clearDragListeners(),this.unrenderFgSegs(),this.unrenderBgSegs(),this.segs=null},getEventSegs:function(){return this.segs||[]},renderFgSegs:function(t){},unrenderFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;i<e.length;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(t,e){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},unrenderBgSegs:function(){this.unrenderFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegCss:function(t){return{"background-color":this.getSegSkinCss(t)["background-color"]}},businessHoursSegClasses:function(t){return["fc-nonbusiness","fc-bgevent"]},buildBusinessHourSegs:function(t,e){return this.eventsToSegs(this.buildBusinessHourEvents(t,e))},buildBusinessHourEvents:function(e,n){var i,r=this.view.calendar;return null==n&&(n=r.options.businessHours),i=r.computeBusinessHourEvents(e,n),!i.length&&n&&(i=[t.extend({},ke,{start:this.view.end,end:this.view.end,dow:null})]),i},bindSegHandlers:function(){this.bindSegHandlersToEl(this.el)},bindSegHandlersToEl:function(t){this.bindSegHandlerToEl(t,"touchstart",this.handleSegTouchStart),this.bindSegHandlerToEl(t,"touchend",this.handleSegTouchEnd),this.bindSegHandlerToEl(t,"mouseenter",this.handleSegMouseover),this.bindSegHandlerToEl(t,"mouseleave",this.handleSegMouseout),this.bindSegHandlerToEl(t,"mousedown",this.handleSegMousedown),this.bindSegHandlerToEl(t,"click",this.handleSegClick)},bindSegHandlerToEl:function(e,n,i){var r=this;e.on(n,this.segSelector,function(e){var n=t(this).data("fc-seg");if(n&&!r.isDraggingSeg&&!r.isResizingSeg)return i.call(r,n,e)})},handleSegClick:function(t,e){var n=this.view.publiclyTrigger("eventClick",t.el[0],t.event,e);n===!1&&e.preventDefault()},handleSegMouseover:function(t,e){this.isIgnoringMouse||this.mousedOverSeg||(this.mousedOverSeg=t,this.view.isEventResizable(t.event)&&t.el.addClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseover",t.el[0],t.event,e))},handleSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.isEventResizable(t.event)&&t.el.removeClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseout",t.el[0],t.event,e))},handleSegMousedown:function(t,e){var n=this.startSegResize(t,e,{distance:5});!n&&this.view.isEventDraggable(t.event)&&this.buildSegDragListener(t).startInteraction(e,{distance:5})},handleSegTouchStart:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventSelected(s),l=r.isEventDraggable(s),a=r.isEventResizable(s),u=!1;o&&a&&(u=this.startSegResize(t,e)),u||!l&&!a||(i=r.opt("eventLongPressDelay"),null==i&&(i=r.opt("longPressDelay")),n=l?this.buildSegDragListener(t):this.buildSegSelectListener(t),n.startInteraction(e,{delay:o?0:i})),this.tempIgnoreMouse()},handleSegTouchEnd:function(t,e){this.tempIgnoreMouse()},startSegResize:function(e,n,i){return!!t(n.target).is(".fc-resizer")&&(this.buildSegResizeListener(e,t(n.target).is(".fc-start-resizer")).startInteraction(n,i),!0)},buildSegDragListener:function(t){var e,n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event;if(this.segDragListener)return this.segDragListener;var d=this.segDragListener=new pe(l,{scroll:l.opt("dragScroll"),subjectEl:u,subjectCenter:!0,interactionStart:function(i){t.component=r,e=!1,n=new ve(t.el,{additionalClass:"fc-dragging",parentEl:l.el,opacity:d.isTouch?null:l.opt("dragOpacity"),revertDuration:l.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){d.isTouch&&!l.isEventSelected(c)&&l.selectEvent(c),e=!0,r.handleSegMouseout(t,n),r.segDragStart(t,n),l.hideEvent(c)},hitOver:function(e,o,u){var h;t.hit&&(u=t.hit),i=r.computeEventDrop(u.component.getHitSpan(u),e.component.getHitSpan(e),c),i&&!a.isEventSpanAllowed(r.eventToSpan(i),c)&&(s(),i=null),i&&(h=l.renderDrag(i,t))?(h.addClass("fc-dragging"),d.isTouch||r.applyDragOpacity(h),n.hide()):n.show(),o&&(i=null)},hitOut:function(){l.unrenderDrag(),n.show(),i=null},hitDone:function(){o()},interactionEnd:function(s){delete t.component,n.stop(!i,function(){e&&(l.unrenderDrag(),r.segDragStop(t,s)),i?l.reportEventDrop(c,i,r.largeUnit,u,s):l.showEvent(c)}),r.segDragListener=null}});return d},buildSegSelectListener:function(t){var e=this,n=this.view,i=t.event;if(this.segDragListener)return this.segDragListener;var r=this.segDragListener=new ge({dragStart:function(t){r.isTouch&&!n.isEventSelected(i)&&n.selectEvent(i)},interactionEnd:function(t){e.segDragListener=null}});return r},segDragStart:function(t,e){this.isDraggingSeg=!0,this.view.publiclyTrigger("eventDragStart",t.el[0],t.event,e,{})},segDragStop:function(t,e){this.isDraggingSeg=!1,this.view.publiclyTrigger("eventDragStop",t.el[0],t.event,e,{})},computeEventDrop:function(t,e,n){var i,r,s=this.view.calendar,o=t.start,l=e.start;return o.hasTime()===l.hasTime()?(i=this.diffDates(l,o),n.allDay&&W(i)?(r={start:n.start.clone(),end:s.getEventEnd(n),allDay:!1},s.normalizeEventTimes(r)):r=Ht(n),r.start.add(i),r.end&&r.end.add(i)):r={start:l.clone(),end:null,allDay:!l.hasTime()},r},applyDragOpacity:function(t){var e=this.view.opt("dragOpacity");null!=e&&t.css("opacity",e)},externalDragStart:function(e,n){var i,r,s=this.view;s.opt("droppable")&&(i=t((n?n.item:null)||e.target),r=s.opt("dropAccept"),(t.isFunction(r)?r.call(i[0],i):i.is(r))&&(this.isDraggingExternal||this.listenToExternalDrag(i,e,n)))},listenToExternalDrag:function(t,e,n){var i,r=this,l=this.view.calendar,a=Mt(t),u=r.externalDragListener=new pe(this,{interactionStart:function(){r.isDraggingExternal=!0},hitOver:function(t){i=r.computeExternalDrop(t.component.getHitSpan(t),a),i&&!l.isExternalSpanAllowed(r.eventToSpan(i),i,a.eventProps)&&(s(),i=null),i&&r.renderDrag(i)},hitOut:function(){i=null},hitDone:function(){o(),r.unrenderDrag()},interactionEnd:function(e){i&&r.view.reportExternalDrop(a,i,t,e,n),r.isDraggingExternal=!1,r.externalDragListener=null}});u.startDrag(e)},computeExternalDrop:function(t,e){var n=this.view.calendar,i={start:n.applyTimezone(t.start),end:null};return e.startTime&&!i.start.hasTime()&&i.start.time(e.startTime),e.duration&&(i.end=i.start.clone().add(e.duration)),i},renderDrag:function(t,e){},unrenderDrag:function(){},buildSegResizeListener:function(t,e){var n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event,d=a.getEventEnd(c),h=this.segResizeListener=new pe(this,{scroll:l.opt("dragScroll"),subjectEl:u,interactionStart:function(){n=!1},dragStart:function(e){n=!0,r.handleSegMouseout(t,e),r.segResizeStart(t,e)},hitOver:function(n,o,u){var h=r.getHitSpan(u),f=r.getHitSpan(n);i=e?r.computeEventStartResize(h,f,c):r.computeEventEndResize(h,f,c),i&&(a.isEventSpanAllowed(r.eventToSpan(i),c)?i.start.isSame(c.start.clone().stripZone())&&i.end.isSame(d.clone().stripZone())&&(i=null):(s(),i=null)),i&&(l.hideEvent(c),r.renderEventResize(i,t))},hitOut:function(){i=null,l.showEvent(c)},hitDone:function(){r.unrenderEventResize(),o()},interactionEnd:function(e){n&&r.segResizeStop(t,e),i?l.reportEventResize(c,i,r.largeUnit,u,e):l.showEvent(c),r.segResizeListener=null}});return h},segResizeStart:function(t,e){this.isResizingSeg=!0,this.view.publiclyTrigger("eventResizeStart",t.el[0],t.event,e,{})},segResizeStop:function(t,e){this.isResizingSeg=!1,this.view.publiclyTrigger("eventResizeStop",t.el[0],t.event,e,{})},computeEventStartResize:function(t,e,n){return this.computeEventResize("start",t,e,n)},computeEventEndResize:function(t,e,n){return this.computeEventResize("end",t,e,n)},computeEventResize:function(t,e,n,i){var r,s,o=this.view.calendar,l=this.diffDates(n[t],e[t]);return r={start:i.start.clone(),end:o.getEventEnd(i),allDay:i.allDay},r.allDay&&W(l)&&(r.allDay=!1,o.normalizeEventTimes(r)),r[t].add(l),r.start.isBefore(r.end)||(s=this.minResizeDuration||(i.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration),"start"==t?r.start=r.end.clone().subtract(s):r.end=r.start.clone().add(s)),r},renderEventResize:function(t,e){},unrenderEventResize:function(){},getEventTimeText:function(t,e,n){return null==e&&(e=this.eventTimeFormat),null==n&&(n=this.displayEventEnd),this.displayEventTime&&t.start.hasTime()?n&&t.end?this.view.formatRange(t,e):t.start.format(e):""},getSegClasses:function(t,e,n){var i=this.view,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(this.getSegCustomClasses(t));return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),i.isEventSelected(t.event)&&r.push("fc-selected"),r},getSegCustomClasses:function(t){var e=t.event;return[].concat(e.className,e.source?e.source.className:[])},getSegSkinCss:function(t){return{"background-color":this.getSegBackgroundColor(t),"border-color":this.getSegBorderColor(t),color:this.getSegTextColor(t)}},getSegBackgroundColor:function(t){return t.event.backgroundColor||t.event.color||this.getSegDefaultBackgroundColor(t)},getSegDefaultBackgroundColor:function(t){var e=t.event.source||{};return e.backgroundColor||e.color||this.view.opt("eventBackgroundColor")||this.view.opt("eventColor")},getSegBorderColor:function(t){return t.event.borderColor||t.event.color||this.getSegDefaultBorderColor(t)},getSegDefaultBorderColor:function(t){var e=t.event.source||{};return e.borderColor||e.color||this.view.opt("eventBorderColor")||this.view.opt("eventColor")},getSegTextColor:function(t){return t.event.textColor||this.getSegDefaultTextColor(t)},getSegDefaultTextColor:function(t){var e=t.event.source||{};return e.textColor||this.view.opt("eventTextColor")},eventToSegs:function(t){return this.eventsToSegs([t])},eventToSpan:function(t){return this.eventToSpans(t)[0]},eventToSpans:function(t){var e=this.eventToRange(t);return this.eventRangeToSpans(e,t)},eventsToSegs:function(e,n){var i=this,r=kt(e),s=[];return t.each(r,function(t,e){var r,o=[];for(r=0;r<e.length;r++)o.push(i.eventToRange(e[r]));if(xt(e[0]))for(o=i.invertRanges(o),r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[0],n));else for(r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[r],n))}),s},eventToRange:function(t){var e=this.view.calendar,n=t.start.clone().stripZone(),i=(t.end?t.end.clone():e.getDefaultEventEnd(null!=t.allDay?t.allDay:!t.start.hasTime(),t.start)).stripZone();return e.localizeMoment(n),e.localizeMoment(i),{start:n,end:i}},eventRangeToSegs:function(t,e,n){var i,r=this.eventRangeToSpans(t,e),s=[];for(i=0;i<r.length;i++)s.push.apply(s,this.eventSpanToSegs(r[i],e,n));return s},eventRangeToSpans:function(e,n){return[t.extend({},e)]},eventSpanToSegs:function(t,e,n){var i,r,s=n?n(t):this.spanToSegs(t);
-for(i=0;i<s.length;i++)r=s[i],r.event=e,r.eventStartMS=+t.start,r.eventDurationMS=t.end-t.start;return s},invertRanges:function(t){var e,n,i=this.view,r=i.start.clone(),s=i.end.clone(),o=[],l=r;for(t.sort(Lt),e=0;e<t.length;e++)n=t[e],n.start>l&&o.push({start:l,end:n.start}),l=n.end;return l<s&&o.push({start:l,end:s}),o},sortEventSegs:function(t){t.sort(lt(this,"compareEventSegs"))},compareEventSegs:function(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||M(t.event,e.event,this.view.eventOrderSpecs)}}),qt.pluckEventDateProps=Ht,qt.isBgEvent=Rt,qt.dataAttrPrefix="";var ye=qt.DayTableMixin={breakOnWeeks:!1,dayDates:null,dayIndices:null,daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null,updateDayTable:function(){for(var t,e,n,i=this.view,r=this.start.clone(),s=-1,o=[],l=[];r.isBefore(this.end);)i.isHiddenDay(r)?o.push(s+.5):(s++,o.push(s),l.push(r.clone())),r.add(1,"days");if(this.breakOnWeeks){for(e=l[0].day(),t=1;t<l.length&&l[t].day()!=e;t++);n=Math.ceil(l.length/t)}else n=1,t=l.length;this.dayDates=l,this.dayIndices=o,this.daysPerRow=t,this.rowCnt=n,this.updateDayTableCols()},updateDayTableCols:function(){this.colCnt=this.computeColCnt(),this.colHeadFormat=this.view.opt("columnFormat")||this.computeColHeadFormat()},computeColCnt:function(){return this.daysPerRow},getCellDate:function(t,e){return this.dayDates[this.getCellDayIndex(t,e)].clone()},getCellRange:function(t,e){var n=this.getCellDate(t,e),i=n.clone().add(1,"days");return{start:n,end:i}},getCellDayIndex:function(t,e){return t*this.daysPerRow+this.getColDayIndex(e)},getColDayIndex:function(t){return this.isRTL?this.colCnt-1-t:t},getDateDayIndex:function(t){var e=this.dayIndices,n=t.diff(this.start,"days");return n<0?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},computeColHeadFormat:function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},sliceRangeByRow:function(t){var e,n,i,r,s,o=this.daysPerRow,l=this.view.computeDayRange(t),a=this.getDateDayIndex(l.start),u=this.getDateDayIndex(l.end.clone().subtract(1,"days")),c=[];for(e=0;e<this.rowCnt;e++)n=e*o,i=n+o-1,r=Math.max(a,n),s=Math.min(u,i),r=Math.ceil(r),s=Math.floor(s),r<=s&&c.push({row:e,firstRowDayIndex:r-n,lastRowDayIndex:s-n,isStart:r===a,isEnd:s===u});return c},sliceRangeByDay:function(t){var e,n,i,r,s,o,l=this.daysPerRow,a=this.view.computeDayRange(t),u=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),d=[];for(e=0;e<this.rowCnt;e++)for(n=e*l,i=n+l-1,r=n;r<=i;r++)s=Math.max(u,r),o=Math.min(c,r),s=Math.ceil(s),o=Math.floor(o),s<=o&&d.push({row:e,firstRowDayIndex:s-n,lastRowDayIndex:o-n,isStart:s===u,isEnd:o===c});return d},renderHeadHtml:function(){var t=this.view;return'<div class="fc-row '+t.widgetHeaderClass+'"><table><thead>'+this.renderHeadTrHtml()+"</thead></table></div>"},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return"<tr>"+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+"</tr>"},renderHeadDateCellsHtml:function(){var t,e,n=[];for(t=0;t<this.colCnt;t++)e=this.getCellDate(0,t),n.push(this.renderHeadDateCellHtml(e));return n.join("")},renderHeadDateCellHtml:function(t,e,n){var i=this.view,r=["fc-day-header",i.widgetHeaderClass];return 1===this.rowCnt?r=r.concat(this.getDayClasses(t,!0)):r.push("fc-"+Xt[t.day()]),'<th class="'+r.join(" ")+'"'+(1===this.rowCnt?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e>1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+i.buildGotoAnchorHtml({date:t,forceOff:this.rowCnt>1||1===this.colCnt},tt(t.format(this.colHeadFormat)))+"</th>"},renderBgTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+"</tr>"},renderBgIntroHtml:function(t){return this.renderIntroHtml()},renderBgCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderBgCellHtml(n));return i.join("")},renderBgCellHtml:function(t,e){var n=this.view,i=this.getDayClasses(t);return i.unshift("fc-day",n.widgetContentClass),'<td class="'+i.join(" ")+'" data-date="'+t.format("YYYY-MM-DD")+'"'+(e?" "+e:"")+"></td>"},renderIntroHtml:function(){},bookendCells:function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))}},Se=qt.DayGrid=me.extend(ye,{numbersVisible:!1,bottomCoordPadding:0,rowEls:null,cellEls:null,helperEls:null,rowCoordCache:null,colCoordCache:null,renderDates:function(t){var e,n,i=this.view,r=this.rowCnt,s=this.colCnt,o="";for(e=0;e<r;e++)o+=this.renderDayRowHtml(e,t);for(this.el.html(o),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new fe({els:this.rowEls,isVertical:!0}),this.colCoordCache=new fe({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),e=0;e<r;e++)for(n=0;n<s;n++)i.publiclyTrigger("dayRender",null,this.getCellDate(e,n),this.getCellEl(e,n))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var t=this.buildBusinessHourSegs(!0);this.renderFill("businessHours",t,"bgevent")},unrenderBusinessHours:function(){this.unrenderFill("businessHours")},renderDayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'"><div class="fc-bg"><table>'+this.renderBgTrHtml(t)+'</table></div><div class="fc-content-skeleton"><table>'+(this.numbersVisible?"<thead>"+this.renderNumberTrHtml(t)+"</thead>":"")+"</table></div></div>"},renderNumberTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+"</tr>"},renderNumberIntroHtml:function(t){return this.renderIntroHtml()},renderNumberCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderNumberCellHtml(n));return i.join("")},renderNumberCellHtml:function(t){var e,n,i="";return this.view.dayNumbersVisible||this.view.cellWeekNumbersVisible?(e=this.getDayClasses(t),e.unshift("fc-day-top"),this.view.cellWeekNumbersVisible&&(n="ISO"===t._locale._fullCalendar_weekCalc?1:t._locale.firstDayOfWeek()),i+='<td class="'+e.join(" ")+'" data-date="'+t.format()+'">',this.view.cellWeekNumbersVisible&&t.day()==n&&(i+=this.view.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),this.view.dayNumbersVisible&&(i+=this.view.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.date())),i+="</td>"):"<td/>"},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},rangeUpdated:function(){this.updateDayTable()},spanToSegs:function(t){var e,n,i=this.sliceRangeByRow(t);for(e=0;e<i.length;e++)n=i[e],this.isRTL?(n.leftCol=this.daysPerRow-1-n.lastRowDayIndex,n.rightCol=this.daysPerRow-1-n.firstRowDayIndex):(n.leftCol=n.firstRowDayIndex,n.rightCol=n.lastRowDayIndex);return i},prepareHits:function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},releaseHits:function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},queryHit:function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},getHitSpan:function(t){return this.getCellRange(t.row,t.col)},getHitEl:function(t){return this.getCellEl(t.row,t.col)},getCellHit:function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},getCellEl:function(t,e){return this.cellEls.eq(t*this.colCnt+e)},renderDrag:function(t,e){if(this.renderHighlight(this.eventToSpan(t)),e&&e.component!==this)return this.renderEventLocationHelper(t,e)},unrenderDrag:function(){this.unrenderHighlight(),this.unrenderHelper()},renderEventResize:function(t,e){return this.renderHighlight(this.eventToSpan(t)),this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHighlight(),this.unrenderHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventToSegs(e);return s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('<div class="fc-helper-skeleton"><table/></div>');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n,i){var r,s,o,l=[];for(n=this.renderFillSegEls(e,n),r=0;r<n.length;r++)s=n[r],o=this.renderFillRow(e,s,i),this.rowEls.eq(s.row).append(o),l.push(o[0]);return this.elsByFill[e]=t(l),n},renderFillRow:function(e,n,i){var r,s,o=this.colCnt,l=n.leftCol,a=n.rightCol+1;return i=i||e.toLowerCase(),r=t('<div class="fc-'+i+'-skeleton"><table><tr/></table></div>'),s=r.find("tr"),l>0&&s.append('<td colspan="'+l+'"/>'),s.append(n.el.attr("colspan",a-l)),a<o&&s.append('<td colspan="'+(o-a)+'"/>'),this.bookendCells(s),r}});Se.mixin({rowStructs:null,unrenderEvents:function(){this.removeSegPopover(),me.prototype.unrenderEvents.apply(this,arguments)},getEventSegs:function(){return me.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return me.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},unrenderFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n<e.length;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventDraggable(s),l=!e&&s.allDay&&t.isStart&&r.isEventResizableFromStart(s),a=!e&&s.allDay&&t.isEnd&&r.isEventResizableFromEnd(s),u=this.getSegClasses(t,o,l||a),c=nt(this.getSegSkinCss(t)),d="";return u.unshift("fc-day-grid-event","fc-h-event"),t.isStart&&(n=this.getEventTimeText(s),n&&(d='<span class="fc-time">'+tt(n)+"</span>")),i='<span class="fc-title">'+(tt(s.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(s.url?' href="'+tt(s.url)+'"':"")+(c?' style="'+c+'"':"")+'><div class="fc-content">'+(this.isRTL?i+" "+d:d+" "+i)+"</div>"+(l?'<div class="fc-resizer fc-start-resizer" />':"")+(a?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},renderSegRow:function(e,n){function i(e){for(;o<e;)c=(m[r-1]||[])[o],c?c.attr("rowspan",parseInt(c.attr("rowspan")||1,10)+1):(c=t("<td/>"),l.append(c)),v[r][o]=c,m[r][o]=c,o++}var r,s,o,l,a,u,c,d=this.colCnt,h=this.buildSegLevels(n),f=Math.max(1,h.length),g=t("<tbody/>"),p=[],v=[],m=[];for(r=0;r<f;r++){if(s=h[r],o=0,l=t("<tr/>"),p.push([]),v.push([]),m.push([]),s)for(a=0;a<s.length;a++){for(u=s[a],i(u.leftCol),c=t('<td class="fc-event-container"/>').append(u.el),u.leftCol!=u.rightCol?c.attr("colspan",u.rightCol-u.leftCol+1):m[r][o]=c;o<=u.rightCol;)v[r][o]=c,p[r][o]=u,o++;l.append(c)}i(d),this.bookendCells(l),g.append(l)}return{row:e,tbodyEl:g,cellMatrix:v,segMatrix:p,segLevels:h,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(this.sortEventSegs(t),e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Bt(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;i<r.length;i++)r[i].sort(zt);return r},groupSegRows:function(t){var e,n=[];for(e=0;e<this.rowCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].row].push(t[e]);return n}}),Se.mixin({segPopover:null,popoverSegs:null,removeSegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;e<i.length;e++)this.unlimitRow(e),n=!!t&&("number"==typeof t?t:this.computeRowLevelLimit(e)),n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(e){function n(e,n){s=Math.max(s,t(n).outerHeight())}var i,r,s,o=this.rowEls.eq(e),l=o.height(),a=this.rowStructs[e].tbodyEl.children();for(i=0;i<a.length;i++)if(r=a.eq(i).removeClass("fc-limited"),s=0,r.find("> td > :first-child").each(n),r.position().top+s>l)return i;return!1},limitRow:function(e,n){function i(i){for(;b<i;)u=S.getCellSegs(e,b,n),u.length&&(h=s[n-1][b],y=S.renderMoreLink(e,b,u),m=t("<div/>").append(y),h.append(m),E.push(m[0])),b++}var r,s,o,l,a,u,c,d,h,f,g,p,v,m,y,S=this,w=this.rowStructs[e],E=[],b=0;if(n&&n<w.segLevels.length){for(r=w.segLevels[n-1],s=w.cellMatrix,o=w.tbodyEl.children().slice(n).addClass("fc-limited").get(),l=0;l<r.length;l++){for(a=r[l],i(a.leftCol),d=[],c=0;b<=a.rightCol;)u=this.getCellSegs(e,b,n),d.push(u),c+=u.length,b++;if(c){for(h=s[n-1][a.leftCol],f=h.attr("rowspan")||1,g=[],p=0;p<d.length;p++)v=t('<td class="fc-more-cell"/>').attr("rowspan",f),u=d[p],y=this.renderMoreLink(e,a.leftCol+p,[a].concat(u)),m=t("<div/>").append(y),v.append(m),g.push(v[0]),E.push(v[0]);h.addClass("fc-limited").after(t(g)),o.push(h[0])}}i(this.colCnt),w.moreEls=t(E),w.limitedEls=t(o)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n,i){var r=this,s=this.view;return t('<a class="fc-more"/>').text(this.getMoreLinkText(i.length)).on("click",function(o){var l=s.opt("eventLimitClick"),a=r.getCellDate(e,n),u=t(this),c=r.getCellEl(e,n),d=r.getCellSegs(e,n),h=r.resliceDaySegs(d,a),f=r.resliceDaySegs(i,a);"function"==typeof l&&(l=s.publiclyTrigger("eventLimitClick",null,{date:a,dayEl:c,moreEl:u,segs:h,hiddenSegs:f},o)),"popover"===l?r.showSegPopover(e,n,u,h):"string"==typeof l&&s.calendar.zoomTo(a,l)})},showSegPopover:function(t,e,n,i){var r,s,o=this,l=this.view,a=n.parent();r=1==this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover",content:this.renderSegPopoverContent(t,e,i),parentEl:this.view.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){if(o.popoverSegs)for(var t,e=0;e<o.popoverSegs.length;++e)t=o.popoverSegs[e],l.publiclyTrigger("eventDestroy",t.event,t.event,t.el);o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=a.offset().left+a.outerWidth()+1:s.left=a.offset().left-1,this.segPopover=new he(s),this.segPopover.show(),this.bindSegHandlersToEl(this.segPopover.el)},renderSegPopoverContent:function(e,n,i){var r,s=this.view,o=s.opt("theme"),l=this.getCellDate(e,n).format(s.opt("dayPopoverFormat")),a=t('<div class="fc-header '+s.widgetHeaderClass+'"><span class="fc-close '+(o?"ui-icon ui-icon-closethick":"fc-icon fc-icon-x")+'"></span><span class="fc-title">'+tt(l)+'</span><div class="fc-clear"/></div><div class="fc-body '+s.widgetContentClass+'"><div class="fc-event-container"></div></div>'),u=a.find(".fc-event-container");for(i=this.renderFgSegEls(i,!0),this.popoverSegs=i,r=0;r<i.length;r++)this.prepareHits(),i[r].hit=this.getCellHit(e,n),this.releaseHits(),u.append(i[r].el);return a},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone(),s=r.clone().add(1,"days"),o={start:r,end:s};return e=this.eventsToSegs(i,function(t){var e=F(t,o);return e?[e]:[]}),this.sortEventSegs(e),e},getMoreLinkText:function(t){var e=this.view.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},getCellSegs:function(t,e,n){for(var i,r=this.rowStructs[t].segMatrix,s=n||0,o=[];s<r.length;)i=r[s][e],i&&o.push(i),s++;return o}});var we=qt.TimeGrid=me.extend(ye,{slotDuration:null,snapDuration:null,snapsPerSlot:null,minTime:null,maxTime:null,labelFormat:null,labelInterval:null,colEls:null,slatContainerEl:null,slatEls:null,nowIndicatorEls:null,colCoordCache:null,slatCoordCache:null,constructor:function(){me.apply(this,arguments),this.processOptions()},renderDates:function(){this.el.html(this.renderHtml()),this.colEls=this.el.find(".fc-day"),this.slatContainerEl=this.el.find(".fc-slats"),this.slatEls=this.slatContainerEl.find("tr"),this.colCoordCache=new fe({els:this.colEls,isHorizontal:!0}),this.slatCoordCache=new fe({els:this.slatEls,isVertical:!0}),this.renderContentSkeleton()},renderHtml:function(){return'<div class="fc-bg"><table>'+this.renderBgTrHtml(0)+'</table></div><div class="fc-slats"><table>'+this.renderSlatRowHtml()+"</table></div>"},renderSlatRowHtml:function(){for(var t,n,i,r=this.view,s=this.isRTL,o="",l=e.duration(+this.minTime);l<this.maxTime;)t=this.start.clone().time(l),n=ot(_(l,this.labelInterval)),i='<td class="fc-axis fc-time '+r.widgetContentClass+'" '+r.axisStyleAttr()+">"+(n?"<span>"+tt(t.format(this.labelFormat))+"</span>":"")+"</td>",o+='<tr data-time="'+t.format("HH:mm:ss")+'"'+(n?"":' class="fc-minor"')+">"+(s?"":i)+'<td class="'+r.widgetContentClass+'"/>'+(s?i:"")+"</tr>",l.add(this.slotDuration);return o},processOptions:function(){var n,i=this.view,r=i.opt("slotDuration"),s=i.opt("snapDuration");r=e.duration(r),s=s?e.duration(s):r,this.slotDuration=r,this.snapDuration=s,this.snapsPerSlot=r/s,this.minResizeDuration=s,this.minTime=e.duration(i.opt("minTime")),this.maxTime=e.duration(i.opt("maxTime")),n=i.opt("slotLabelFormat"),t.isArray(n)&&(n=n[n.length-1]),this.labelFormat=n||i.opt("smallTimeFormat"),n=i.opt("slotLabelInterval"),this.labelInterval=n?e.duration(n):this.computeLabelInterval(r)},computeLabelInterval:function(t){var n,i,r;for(n=Oe.length-1;n>=0;n--)if(i=e.duration(Oe[n]),r=_(i,t),ot(r)&&r>1)return i;return e.duration(t)},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(t,e){var n=this.snapsPerSlot,i=this.colCoordCache,r=this.slatCoordCache;if(i.isLeftInBounds(t)&&r.isTopInBounds(e)){var s=i.getHorizontalIndex(t),o=r.getVerticalIndex(e);if(null!=s&&null!=o){var l=r.getTopOffset(o),a=r.getHeight(o),u=(e-l)/a,c=Math.floor(u*n),d=o*n+c,h=l+c/n*a,f=l+(c+1)/n*a;return{col:s,snap:d,component:this,left:i.getLeftOffset(s),right:i.getRightOffset(s),top:h,bottom:f}}}},getHitSpan:function(t){var e,n=this.getCellDate(0,t.col),i=this.computeSnapTime(t.snap);return n.time(i),e=n.clone().add(this.snapDuration),{start:n,end:e}},getHitEl:function(t){return this.colEls.eq(t.col)},rangeUpdated:function(){this.updateDayTable()},computeSnapTime:function(t){return e.duration(this.minTime+this.snapDuration*t)},spanToSegs:function(t){var e,n=this.sliceRangeByTimes(t);for(e=0;e<n.length;e++)this.isRTL?n[e].col=this.daysPerRow-1-n[e].dayIndex:n[e].col=n[e].dayIndex;return n},sliceRangeByTimes:function(t){var e,n,i,r,s=[];for(n=0;n<this.daysPerRow;n++)i=this.dayDates[n].clone(),r={start:i.clone().time(this.minTime),end:i.clone().time(this.maxTime)},e=F(t,r),e&&(e.dayIndex=n,s.push(e));return s},updateSize:function(t){this.slatCoordCache.build(),t&&this.updateSegVerticals([].concat(this.fgSegs||[],this.bgSegs||[],this.businessSegs||[]))},getTotalSlatHeight:function(){return this.slatContainerEl.outerHeight()},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i=this.slatEls.length,r=(t-this.minTime)/this.slotDuration;return r=Math.max(0,r),r=Math.min(i,r),e=Math.floor(r),e=Math.min(e,i-1),n=r-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},renderDrag:function(t,e){return e?this.renderEventLocationHelper(t,e):void this.renderHighlight(this.eventToSpan(t))},unrenderDrag:function(){this.unrenderHelper(),this.unrenderHighlight()},renderEventResize:function(t,e){return this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHelper()},renderHelper:function(t,e){return this.renderHelperSegs(this.eventToSegs(t),e)},unrenderHelper:function(){this.unrenderHelperSegs()},renderBusinessHours:function(){this.renderBusinessSegs(this.buildBusinessHourSegs())},unrenderBusinessHours:function(){this.unrenderBusinessSegs()},getNowIndicatorUnit:function(){return"minute"},renderNowIndicator:function(e){var n,i=this.spanToSegs({start:e,end:e}),r=this.computeDateTop(e,e),s=[];for(n=0;n<i.length;n++)s.push(t('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top",r).appendTo(this.colContainerEls.eq(i[n].col))[0]);i.length>0&&s.push(t('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top",r).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=t(s)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},renderSelection:function(t){this.view.opt("selectHelper")?this.renderEventLocationHelper(t):this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},renderHighlight:function(t){this.renderHighlightSegs(this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});we.mixin({colContainerEls:null,fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null,fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null,renderContentSkeleton:function(){var e,n,i="";for(e=0;e<this.colCnt;e++)i+='<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';n=t('<div class="fc-content-skeleton"><table><tr>'+i+"</tr></table></div>"),this.colContainerEls=n.find(".fc-content-col"),this.helperContainerEls=n.find(".fc-helper-container"),this.fgContainerEls=n.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=n.find(".fc-bgevent-container"),this.highlightContainerEls=n.find(".fc-highlight-container"),this.businessContainerEls=n.find(".fc-business-container"),this.bookendCells(n.find("tr")),this.el.append(n)},renderFgSegs:function(t){return t=this.renderFgSegsIntoContainers(t,this.fgContainerEls),this.fgSegs=t,t},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},renderHelperSegs:function(e,n){var i,r,s,o=[];for(e=this.renderFgSegsIntoContainers(e,this.helperContainerEls),i=0;i<e.length;i++)r=e[i],n&&n.col===r.col&&(s=n.el,r.el.css({left:s.css("left"),right:s.css("right"),"margin-left":s.css("margin-left"),"margin-right":s.css("margin-right")})),o.push(r.el[0]);return this.helperSegs=e,t(o)},unrenderHelperSegs:function(){this.unrenderNamedSegs("helperSegs")},renderBgSegs:function(t){return t=this.renderFillSegEls("bgEvent",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.bgContainerEls),this.bgSegs=t,t},unrenderBgSegs:function(){this.unrenderNamedSegs("bgSegs")},renderHighlightSegs:function(t){t=this.renderFillSegEls("highlight",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.highlightContainerEls),this.highlightSegs=t},unrenderHighlightSegs:function(){this.unrenderNamedSegs("highlightSegs")},renderBusinessSegs:function(t){t=this.renderFillSegEls("businessHours",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.businessContainerEls),this.businessSegs=t},unrenderBusinessSegs:function(){this.unrenderNamedSegs("businessSegs")},groupSegsByCol:function(t){var e,n=[];for(e=0;e<this.colCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].col].push(t[e]);return n},attachSegsByCol:function(t,e){var n,i,r;for(n=0;n<this.colCnt;n++)for(i=t[n],r=0;r<i.length;r++)e.eq(n).append(i[r].el)},unrenderNamedSegs:function(t){var e,n=this[t];if(n){for(e=0;e<n.length;e++)n[e].el.remove();this[t]=null}},renderFgSegsIntoContainers:function(t,e){var n,i;for(t=this.renderFgSegEls(t),n=this.groupSegsByCol(t),i=0;i<this.colCnt;i++)this.updateFgSegCoords(n[i]);return this.attachSegsByCol(n,e),t},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isStart&&s.isEventResizableFromStart(o),u=!e&&t.isEnd&&s.isEventResizableFromEnd(o),c=this.getSegClasses(t,l,a||u),d=nt(this.getSegSkinCss(t));return c.unshift("fc-time-grid-event","fc-v-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=this.getEventTimeText(t),i=this.getEventTimeText(t,"LT"),r=this.getEventTimeText(t,null,!1)):(n=this.getEventTimeText(o),i=this.getEventTimeText(o,"LT"),r=this.getEventTimeText(o,null,!1)),'<a class="'+c.join(" ")+'"'+(o.url?' href="'+tt(o.url)+'"':"")+(d?' style="'+d+'"':"")+'><div class="fc-content">'+(n?'<div class="fc-time" data-start="'+tt(r)+'" data-full="'+tt(i)+'"><span>'+tt(n)+"</span></div>":"")+(o.title?'<div class="fc-title">'+tt(o.title)+"</div>":"")+'</div><div class="fc-bg"/>'+(u?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},updateSegVerticals:function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},computeSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},assignSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateSegVerticalCss(n))},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},updateFgSegCoords:function(t){this.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.assignSegVerticals(t),this.assignFgSegHorizontals(t)},computeFgSegHorizontals:function(t){var e,n,i;if(this.sortEventSegs(t),e=Ft(t),Nt(e),n=e[0]){for(i=0;i<n.length;i++)Gt(n[i]);for(i=0;i<n.length;i++)this.computeFgSegForwardBack(n[i],0,0)}},computeFgSegForwardBack:function(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(this.sortForwardSegs(r),this.computeFgSegForwardBack(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;i<r.length;i++)this.computeFgSegForwardBack(r[i],0,t.forwardCoord)},sortForwardSegs:function(t){t.sort(lt(this,"compareForwardSegs"))},compareForwardSegs:function(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||this.compareEventSegs(t,e)},assignFgSegHorizontals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateFgSegHorizontalCss(n)),n.bottom-n.top<30&&n.el.addClass("fc-short")},generateFgSegHorizontalCss:function(t){var e,n,i=this.view.opt("slotEventOverlap"),r=t.backwardCoord,s=t.forwardCoord,o=this.generateSegVerticalCss(t);return i&&(s=Math.min(1,r+2*(s-r))),this.isRTL?(e=1-s,n=r):(e=r,n=1-s),o.zIndex=t.level+1,o.left=100*e+"%",o.right=100*n+"%",i&&t.forwardPressure&&(o[this.isRTL?"marginLeft":"marginRight"]=20),o}});var Ee=qt.View=St.extend(ue,ce,{type:null,name:null,title:null,calendar:null,options:null,el:null,isDateSet:!1,isDateRendered:!1,dateRenderQueue:null,isEventsBound:!1,isEventsSet:!1,isEventsRendered:!1,eventRenderQueue:null,start:null,end:null,intervalStart:null,intervalEnd:null,intervalDuration:null,intervalUnit:null,isRTL:!1,isSelected:!1,selectedEvent:null,eventOrderSpecs:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,nextDayThreshold:null,isHiddenDayHash:null,isNowIndicatorRendered:null,initialNowDate:null,initialNowQueriedMs:null,nowIndicatorTimeoutID:null,nowIndicatorIntervalID:null,constructor:function(t,n,i,r){this.calendar=t,this.type=this.name=n,this.options=i,this.intervalDuration=r||e.duration(1,"day"),this.nextDayThreshold=e.duration(this.opt("nextDayThreshold")),this.initThemingProps(),this.initHiddenDays(),this.isRTL=this.opt("isRTL"),this.eventOrderSpecs=L(this.opt("eventOrder")),this.dateRenderQueue=new Dt,this.eventRenderQueue=new Dt(this.opt("eventRenderWait")),this.initialize()},initialize:function(){},opt:function(t){return this.options[t]},publiclyTrigger:function(t,e){var n=this.calendar;return n.publiclyTrigger.apply(n,[t,e||this].concat(Array.prototype.slice.call(arguments,2),[this]))},rejectOn:function(t,e){var n=this;return new bt(function(i,r){function s(){n.off(t,r)}n.one(t,r),e.then(function(t){s(),i(t)},function(){s(),r()})})},setRange:function(e){t.extend(this,e),this.updateTitle()},computeRange:function(t){var e,n,i=A(this.intervalDuration),r=t.clone().startOf(i),s=r.clone().add(this.intervalDuration);return/year|month|week|day/.test(i)?(r.stripTime(),s.stripTime()):(r.hasTime()||(r=this.calendar.time(0)),s.hasTime()||(s=this.calendar.time(0))),e=r.clone(),e=this.skipHiddenDays(e),n=s.clone(),n=this.skipHiddenDays(n,-1,!0),{intervalUnit:i,intervalStart:r,intervalEnd:s,start:e,end:n}},computePrevDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).subtract(this.intervalDuration),-1)},computeNextDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).add(this.intervalDuration))},massageCurrentDate:function(t,e){return this.intervalDuration.as("days")<=1&&this.isHiddenDay(t)&&(t=this.skipHiddenDays(t,e),t.startOf("day")),t},updateTitle:function(){this.title=this.computeTitle(),this.calendar.setToolbarsTitle(this.title)},computeTitle:function(){return this.formatRange({start:this.calendar.applyTimezone(this.intervalStart),end:this.calendar.applyTimezone(this.intervalEnd)},this.opt("titleFormat")||this.computeTitleFormat(),this.opt("titleRangeSeparator"))},computeTitleFormat:function(){return"year"==this.intervalUnit?"YYYY":"month"==this.intervalUnit?this.opt("monthYearFormat"):this.intervalDuration.as("days")>1?"ll":"LL"},formatRange:function(t,e,n){var i=t.end;return i.hasTime()||(i=i.clone().subtract(1)),gt(t.start,i,e,n,this.opt("isRTL"))},getAllDayHtml:function(){return this.opt("allDayHtml")||tt(this.opt("allDayText"))},buildGotoAnchorHtml:function(e,n,i){var r,s,o,l;return t.isPlainObject(e)?(r=e.date,s=e.type,o=e.forceOff):r=e,r=qt.moment(r),l={date:r.format("YYYY-MM-DD"),type:s||"day"},"string"==typeof n&&(i=n,n=null),n=n?" "+it(n):"",i=i||"",!o&&this.opt("navLinks")?"<a"+n+' data-goto="'+tt(JSON.stringify(l))+'">'+i+"</a>":"<span"+n+">"+i+"</span>"},setElement:function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton()},removeElement:function(){this.unsetDate(),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},renderSkeleton:function(){},unrenderSkeleton:function(){},setDate:function(t){var e=this.isDateSet;this.isDateSet=!0,this.handleDate(t,e),this.trigger(e?"dateReset":"dateSet",t)},unsetDate:function(){this.isDateSet&&(this.isDateSet=!1,this.handleDateUnset(),this.trigger("dateUnset"))},handleDate:function(t,e){var n=this;this.unbindEvents(),this.requestDateRender(t).then(function(){n.bindEvents()})},handleDateUnset:function(){this.unbindEvents(),this.requestDateUnrender()},requestDateRender:function(t){var e=this;return this.dateRenderQueue.add(function(){return e.executeDateRender(t)})},requestDateUnrender:function(){var t=this;return this.dateRenderQueue.add(function(){return t.executeDateUnrender()})},executeDateRender:function(t){var e=this;return t?this.captureInitialScroll():this.captureScroll(),this.freezeHeight(),this.executeDateUnrender().then(function(){t&&e.setRange(e.computeRange(t)),e.render&&e.render(),e.renderDates(),e.updateSize(),e.renderBusinessHours(),e.startNowIndicator(),e.thawHeight(),e.releaseScroll(),e.isDateRendered=!0,e.onDateRender(),e.trigger("dateRender")})},executeDateUnrender:function(){var t=this;return t.isDateRendered?this.requestEventsUnrender().then(function(){t.unselect(),t.stopNowIndicator(),t.triggerUnrender(),t.unrenderBusinessHours(),t.unrenderDates(),t.destroy&&t.destroy(),t.isDateRendered=!1,t.trigger("dateUnrender")}):bt.resolve()},onDateRender:function(){this.triggerRender()},renderDates:function(){},unrenderDates:function(){},triggerRender:function(){this.publiclyTrigger("viewRender",this,this,this.el);
-},triggerUnrender:function(){this.publiclyTrigger("viewDestroy",this,this,this.el)},bindGlobalHandlers:function(){this.listenTo(t(document),"mousedown",this.handleDocumentMousedown),this.listenTo(t(document),"touchstart",this.processUnselect)},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},initThemingProps:function(){var t=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=t+"-widget-header",this.widgetContentClass=t+"-widget-content",this.highlightStateClass=t+"-state-highlight"},renderBusinessHours:function(){},unrenderBusinessHours:function(){},startNowIndicator:function(){var t,n,i,r=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(),t&&(n=lt(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,i=this.initialNowDate.clone().startOf(t).add(1,t)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){r.nowIndicatorTimeoutID=null,n(),i=+e.duration(1,t),i=Math.max(100,i),r.nowIndicatorIntervalID=setInterval(n,i)},i)))},updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))},stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},updateSize:function(t){t&&this.captureScroll(),this.updateHeight(t),this.updateWidth(t),this.updateNowIndicator(),t&&this.releaseScroll()},updateWidth:function(t){},updateHeight:function(t){var e=this.calendar;this.setHeight(e.getSuggestedViewHeight(),e.isHeightAuto())},setHeight:function(t,e){},capturedScroll:null,capturedScrollDepth:0,captureScroll:function(){return!this.capturedScrollDepth++&&(this.capturedScroll=this.isDateRendered?this.queryScroll():{},!0)},captureInitialScroll:function(e){this.captureScroll()&&(this.capturedScroll.isInitial=!0,e?t.extend(this.capturedScroll,e):this.capturedScroll.isComputed=!0)},releaseScroll:function(){var e=this.capturedScroll,n=this.discardScroll();e.isComputed&&(n?t.extend(e,this.computeInitialScroll()):e=null),e&&(e.isInitial?this.hardSetScroll(e):this.setScroll(e))},discardScroll:function(){return!--this.capturedScrollDepth&&(this.capturedScroll=null,!0)},computeInitialScroll:function(){return{}},queryScroll:function(){return{}},hardSetScroll:function(t){var e=this,n=function(){e.setScroll(t)};n(),setTimeout(n,0)},setScroll:function(t){},freezeHeight:function(){this.calendar.freezeContentHeight()},thawHeight:function(){this.calendar.thawContentHeight()},bindEvents:function(){var t=this;this.isEventsBound||(this.isEventsBound=!0,this.rejectOn("eventsUnbind",this.requestEvents()).then(function(e){t.listenTo(t.calendar,"eventsReset",t.setEvents),t.setEvents(e)}))},unbindEvents:function(){this.isEventsBound&&(this.isEventsBound=!1,this.stopListeningTo(this.calendar,"eventsReset"),this.unsetEvents(),this.trigger("eventsUnbind"))},setEvents:function(t){var e=this.isEventSet;this.isEventsSet=!0,this.handleEvents(t,e),this.trigger(e?"eventsReset":"eventsSet",t)},unsetEvents:function(){this.isEventsSet&&(this.isEventsSet=!1,this.handleEventsUnset(),this.trigger("eventsUnset"))},whenEventsSet:function(){var t=this;return this.isEventsSet?bt.resolve(this.getCurrentEvents()):new bt(function(e){t.one("eventsSet",e)})},handleEvents:function(t,e){this.requestEventsRender(t)},handleEventsUnset:function(){this.requestEventsUnrender()},requestEventsRender:function(t){var e=this;return this.eventRenderQueue.add(function(){return e.executeEventsRender(t)})},requestEventsUnrender:function(){var t=this;return this.isEventsRendered?this.eventRenderQueue.addQuickly(function(){return t.executeEventsUnrender()}):bt.resolve()},requestCurrentEventsRender:function(){return this.isEventsSet?void this.requestEventsRender(this.getCurrentEvents()):bt.reject()},executeEventsRender:function(t){var e=this;return this.captureScroll(),this.freezeHeight(),this.executeEventsUnrender().then(function(){e.renderEvents(t),e.thawHeight(),e.releaseScroll(),e.isEventsRendered=!0,e.onEventsRender(),e.trigger("eventsRender")})},executeEventsUnrender:function(){return this.isEventsRendered&&(this.onBeforeEventsUnrender(),this.captureScroll(),this.freezeHeight(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.thawHeight(),this.releaseScroll(),this.isEventsRendered=!1,this.trigger("eventsUnrender")),bt.resolve()},onEventsRender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventAfterRender",t.event,t.event,t.el)}),this.publiclyTrigger("eventAfterAllRender")},onBeforeEventsUnrender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventDestroy",t.event,t.event,t.el)})},renderEvents:function(t){},unrenderEvents:function(){},requestEvents:function(){return this.calendar.requestEvents(this.start,this.end)},getCurrentEvents:function(){return this.calendar.getPrunedEventCache()},resolveEventEl:function(e,n){var i=this.publiclyTrigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","hidden")},t)},renderedEventSegEach:function(t,e){var n,i=this.getEventSegs();for(n=0;n<i.length;n++)e&&i[n].event._id!==e._id||i[n].el&&t.call(this,i[n])},getEventSegs:function(){return[]},isEventDraggable:function(t){return this.isEventStartEditable(t)},isEventStartEditable:function(t){return J(t.startEditable,(t.source||{}).startEditable,this.opt("eventStartEditable"),this.isEventGenerallyEditable(t))},isEventGenerallyEditable:function(t){return J(t.editable,(t.source||{}).editable,this.opt("editable"))},reportEventDrop:function(t,e,n,i,r){var s=this.calendar,o=s.mutateEvent(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventDrop(t,o.dateDelta,l,i,r),s.reportEventChange()},triggerEventDrop:function(t,e,n,i,r){this.publiclyTrigger("eventDrop",i[0],t,e,n,r,{})},reportExternalDrop:function(e,n,i,r,s){var o,l,a=e.eventProps;a&&(o=t.extend({},a,n),l=this.calendar.renderEvent(o,e.stick)[0]),this.triggerExternalDrop(l,n,i,r,s)},triggerExternalDrop:function(t,e,n,i,r){this.publiclyTrigger("drop",n[0],e.start,i,r),t&&this.publiclyTrigger("eventReceive",null,t)},renderDrag:function(t,e){},unrenderDrag:function(){},isEventResizableFromStart:function(t){return this.opt("eventResizableFromStart")&&this.isEventResizable(t)},isEventResizableFromEnd:function(t){return this.isEventResizable(t)},isEventResizable:function(t){var e=t.source||{};return J(t.durationEditable,e.durationEditable,this.opt("eventDurationEditable"),t.editable,e.editable,this.opt("editable"))},reportEventResize:function(t,e,n,i,r){var s=this.calendar,o=s.mutateEvent(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventResize(t,o.durationDelta,l,i,r),s.reportEventChange()},triggerEventResize:function(t,e,n,i,r){this.publiclyTrigger("eventResize",i[0],t,e,n,r,{})},select:function(t,e){this.unselect(e),this.renderSelection(t),this.reportSelection(t,e)},renderSelection:function(t){},reportSelection:function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},triggerSelect:function(t,e){this.publiclyTrigger("select",null,this.calendar.applyTimezone(t.start),this.calendar.applyTimezone(t.end),e)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",null,t))},unrenderSelection:function(){},selectEvent:function(t){this.selectedEvent&&this.selectedEvent===t||(this.unselectEvent(),this.renderedEventSegEach(function(t){t.el.addClass("fc-selected")},t),this.selectedEvent=t)},unselectEvent:function(){this.selectedEvent&&(this.renderedEventSegEach(function(t){t.el.removeClass("fc-selected")},this.selectedEvent),this.selectedEvent=null)},isEventSelected:function(t){return this.selectedEvent&&this.selectedEvent._id===t._id},handleDocumentMousedown:function(t){S(t)&&this.processUnselect(t)},processUnselect:function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},processRangeUnselect:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))},processEventUnselect:function(e){this.selectedEvent&&(t(e.target).closest(".fc-selected").length||this.unselectEvent())},triggerDayClick:function(t,e,n){this.publiclyTrigger("dayClick",e,this.calendar.applyTimezone(t.start),n)},initHiddenDays:function(){var e,n=this.opt("hiddenDays")||[],i=[],r=0;for(this.opt("weekends")===!1&&n.push(0,6),e=0;e<7;e++)(i[e]=t.inArray(e,n)!==-1)||r++;if(!r)throw"invalid hiddenDays";this.isHiddenDayHash=i},isHiddenDay:function(t){return e.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},skipHiddenDays:function(t,e,n){var i=t.clone();for(e=e||1;this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},computeDayRange:function(t){var e,n=t.start.clone().stripTime(),i=t.end,r=null;return i&&(r=i.clone().stripTime(),e=+i.time(),e&&e>=this.nextDayThreshold&&r.add(1,"days")),(!i||r<=n)&&(r=n.clone().add(1,"days")),{start:n,end:r}},isMultiDayEvent:function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1}}),be=qt.Scroller=St.extend({el:null,scrollEl:null,overflowX:null,overflowY:null,constructor:function(t){t=t||{},this.overflowX=t.overflowX||t.overflow||"auto",this.overflowY=t.overflowY||t.overflow||"auto"},render:function(){this.el=this.renderEl(),this.applyOverflow()},renderEl:function(){return this.scrollEl=t('<div class="fc-scroller"></div>')},clear:function(){this.setHeight("auto"),this.applyOverflow()},destroy:function(){this.el.remove()},applyOverflow:function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},lockOverflow:function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},setHeight:function(t){this.scrollEl.height(t)},getScrollTop:function(){return this.scrollEl.scrollTop()},setScrollTop:function(t){this.scrollEl.scrollTop(t)},getClientWidth:function(){return this.scrollEl[0].clientWidth},getClientHeight:function(){return this.scrollEl[0].clientHeight},getScrollbarWidths:function(){return p(this.scrollEl)}});Vt.prototype.proxyCall=function(t){var e=Array.prototype.slice.call(arguments,1),n=[];return this.items.forEach(function(i){n.push(i[t].apply(i,e))}),n};var De=qt.Calendar=St.extend({dirDefaults:null,localeDefaults:null,overrides:null,dynamicOverrides:null,options:null,viewSpecCache:null,view:null,header:null,footer:null,loadingLevel:0,constructor:_t,initialize:function(){},populateOptionsHash:function(){var t,e,i,r;t=J(this.dynamicOverrides.locale,this.overrides.locale),e=Te[t],e||(t=De.defaults.locale,e=Te[t]||{}),i=J(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,De.defaults.isRTL),r=i?De.rtlDefaults:{},this.dirDefaults=r,this.localeDefaults=e,this.options=n([De.defaults,r,e,this.overrides,this.dynamicOverrides]),Yt(this.options)},getViewSpec:function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},getUnitViewSpec:function(e){var n,i,r;if(t.inArray(e,Kt)!=-1)for(n=this.header.getViewsWithButtons(),t.each(qt.views,function(t){n.push(t)}),i=0;i<n.length;i++)if(r=this.getViewSpec(n[i]),r&&r.singleUnit==e)return r},buildViewSpec:function(t){for(var i,r,s,o,l=this.overrides.views||{},a=[],u=[],c=[],d=t;d;)i=Zt[d],r=l[d],d=null,"function"==typeof i&&(i={class:i}),i&&(a.unshift(i),u.unshift(i.defaults||{}),s=s||i.duration,d=d||i.type),r&&(c.unshift(r),s=s||r.duration,d=d||r.type);return i=q(a),i.type=t,!!i.class&&(s&&(s=e.duration(s),s.valueOf()&&(i.duration=s,o=A(s),1===s.as(o)&&(i.singleUnit=o,c.unshift(l[o]||{})))),i.defaults=n(u),i.overrides=n(c),this.buildViewSpecOptions(i),this.buildViewSpecButtonText(i,t),i)},buildViewSpecOptions:function(t){t.options=n([De.defaults,t.defaults,this.dirDefaults,this.localeDefaults,this.overrides,t.overrides,this.dynamicOverrides]),Yt(t.options)},buildViewSpecButtonText:function(t,e){function n(n){var i=n.buttonText||{};return i[e]||(t.buttonTextKey?i[t.buttonTextKey]:null)||(t.singleUnit?i[t.singleUnit]:null)}t.buttonTextOverride=n(this.dynamicOverrides)||n(this.overrides)||t.overrides.buttonText,t.buttonTextDefault=n(this.localeDefaults)||n(this.dirDefaults)||t.defaults.buttonText||n(De.defaults)||(t.duration?this.humanizeDuration(t.duration):null)||e},instantiateView:function(t){var e=this.getViewSpec(t);return new e.class(this,t,e.options,e.duration)},isValidViewType:function(t){return Boolean(this.getViewSpec(t))},pushLoading:function(){this.loadingLevel++||this.publiclyTrigger("loading",null,!0,this.view)},popLoading:function(){--this.loadingLevel||this.publiclyTrigger("loading",null,!1,this.view)},buildSelectSpan:function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),{start:i,end:n}}});De.mixin(ue),De.mixin({optionHandlers:null,bindOption:function(t,e){this.bindOptions([t],e)},bindOptions:function(t,e){var n,i={func:e,names:t};for(n=0;n<t.length;n++)this.registerOptionHandlerObj(t[n],i);this.triggerOptionHandlerObj(i)},registerOptionHandlerObj:function(t,e){(this.optionHandlers[t]||(this.optionHandlers[t]=[])).push(e)},triggerOptionHandlers:function(t){var e,n=this.optionHandlers[t]||[];for(e=0;e<n.length;e++)this.triggerOptionHandlerObj(n[e])},triggerOptionHandlerObj:function(t){var e,n=t.names,i=[];for(e=0;e<n.length;e++)i.push(this.options[n[e]]);t.func.apply(this,i)}}),De.defaults={titleRangeSeparator:" – ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",scrollTime:"06:00:00",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,isRTL:!1,buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},allDayText:"all-day",theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventOrder:"title",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3},De.englishDefaults={dayPopoverFormat:"dddd, MMMM D"},De.rtlDefaults={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}};var Te=qt.locales={};qt.datepickerLocale=function(e,n,i){var r=Te[e]||(Te[e]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,t.each(Ce,function(t,e){r[t]=e(i)}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},qt.locale=function(e,i){var r,s;r=Te[e]||(Te[e]={}),i&&(r=Te[e]=n([r,i])),s=Wt(e),t.each(He,function(t,e){null==r[t]&&(r[t]=e(s,r))}),De.defaults.locale=e};var Ce={buttonText:function(t){return{prev:et(t.prevText),next:et(t.nextText),today:et(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},He={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},mediumTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"a")},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},hourFormat:function(t){return t.longDateFormat("LT").replace(":mm","").replace(/(\Wmm)$/,"").replace(/\s*a$/i,"a")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}},Re={smallDayDateFormat:function(t){return t.isRTL?"D dd":"dd D"},weekFormat:function(t){return t.isRTL?"w[ "+t.weekNumberTitle+"]":"["+t.weekNumberTitle+" ]w"},smallWeekFormat:function(t){return t.isRTL?"w["+t.weekNumberTitle+"]":"["+t.weekNumberTitle+"]w"}};qt.locale("en",De.englishDefaults),qt.sourceNormalizers=[],qt.sourceFetchers=[];var xe={dataType:"json",cache:!1},Ie=1;De.prototype.normalizeEvent=function(t){},De.prototype.spanContainsSpan=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start>=n&&e.end<=i},De.prototype.getPeerEvents=function(t,e){var n,i,r=this.getEventCache(),s=[];for(n=0;n<r.length;n++)i=r[n],e&&e._id===i._id||s.push(i);return s},De.prototype.isEventSpanAllowed=function(t,e){var n=e.source||{},i=J(e.constraint,n.constraint,this.options.eventConstraint),r=J(e.overlap,n.overlap,this.options.eventOverlap);return this.isSpanAllowed(t,i,r,e)&&(!this.options.eventAllow||this.options.eventAllow(t,e)!==!1)},De.prototype.isExternalSpanAllowed=function(e,n,i){var r,s;return i&&(r=t.extend({},i,n),s=this.expandEvent(this.buildEventFromInput(r))[0]),s?this.isEventSpanAllowed(e,s):this.isSelectionSpanAllowed(e)},De.prototype.isSelectionSpanAllowed=function(t){return this.isSpanAllowed(t,this.options.selectConstraint,this.options.selectOverlap)&&(!this.options.selectAllow||this.options.selectAllow(t)!==!1)},De.prototype.isSpanAllowed=function(t,e,n,i){var r,s,o,l,a,u;if(null!=e&&(r=this.constraintToEvents(e))){for(s=!1,l=0;l<r.length;l++)if(this.spanContainsSpan(r[l],t)){s=!0;break}if(!s)return!1}for(o=this.getPeerEvents(t,i),l=0;l<o.length;l++)if(a=o[l],this.eventIntersectsRange(a,t)){if(n===!1)return!1;if("function"==typeof n&&!n(a,i))return!1;if(i){if(u=J(a.overlap,(a.source||{}).overlap),u===!1)return!1;if("function"==typeof u&&!u(i,a))return!1}}return!0},De.prototype.constraintToEvents=function(t){return"businessHours"===t?this.getCurrentBusinessHourEvents():"object"==typeof t?null!=t.start?this.expandEvent(this.buildEventFromInput(t)):null:this.clientEvents(t)},De.prototype.eventIntersectsRange=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start<i&&e.end>n};var ke={id:"_fcBusinessHours",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"};De.prototype.getCurrentBusinessHourEvents=function(t){return this.computeBusinessHourEvents(t,this.options.businessHours)},De.prototype.computeBusinessHourEvents=function(e,n){return n===!0?this.expandBusinessHourEvents(e,[{}]):t.isPlainObject(n)?this.expandBusinessHourEvents(e,[n]):t.isArray(n)?this.expandBusinessHourEvents(e,n,!0):[]},De.prototype.expandBusinessHourEvents=function(e,n,i){var r,s,o=this.getView(),l=[];for(r=0;r<n.length;r++)s=n[r],i&&!s.dow||(s=t.extend({},ke,s),e&&(s.start=null,s.end=null),l.push.apply(l,this.expandEvent(this.buildEventFromInput(s),o.start,o.end)));return l};var Le=qt.BasicView=Ee.extend({scroller:null,dayGridClass:Se,dayGrid:null,dayNumbersVisible:!1,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1,weekNumberWidth:null,headContainerEl:null,headRowEl:null,initialize:function(){this.dayGrid=this.instantiateDayGrid(),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},instantiateDayGrid:function(){var t=this.dayGridClass.extend(Me);return new t(this)},setRange:function(t){Ee.prototype.setRange.call(this,t),this.dayGrid.breakOnWeeks=/year|month|week/.test(this.intervalUnit),this.dayGrid.setRange(t)},computeRange:function(t){var e=Ee.prototype.computeRange.call(this,t);return/year|month/.test(e.intervalUnit)&&(e.start.startOf("week"),e.start=this.skipHiddenDays(e.start),e.end.weekday()&&(e.end.add(1,"week").startOf("week"),e.end=this.skipHiddenDays(e.end,-1,!0))),e},renderDates:function(){this.dayNumbersVisible=this.dayGrid.rowCnt>1,this.opt("weekNumbers")&&(this.opt("weekNumbersWithinDays")?(this.cellWeekNumbersVisible=!0,this.colWeekNumbersVisible=!1):(this.cellWeekNumbersVisible=!1,this.colWeekNumbersVisible=!0)),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.cellWeekNumbersVisible||this.colWeekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-day-grid-container"),n=t('<div class="fc-day-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.dayGrid.setElement(n),this.dayGrid.renderDates(this.hasRigidRows())},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()),this.headRowEl=this.headContainerEl.find(".fc-row")},unrenderDates:function(){this.dayGrid.unrenderDates(),this.dayGrid.removeElement(),this.scroller.destroy()},renderBusinessHours:function(){this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.dayGrid.unrenderBusinessHours()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'"></td></tr></tbody></table>'},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.colWeekNumbersVisible&&(this.weekNumberWidth=u(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,s,o=this.opt("eventLimit");this.scroller.clear(),r(this.headRowEl),this.dayGrid.removeSegPopover(),o&&"number"==typeof o&&this.dayGrid.limitRows(o),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),o&&"number"!=typeof o&&this.dayGrid.limitRows(o),e||(this.scroller.setHeight(n),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(i(this.headRowEl,s),n=this.computeScrollerHeight(t),this.scroller.setHeight(n)),this.scroller.lockOverflow(s))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},setGridHeight:function(t,e){e?a(this.dayGrid.rowEls):l(this.dayGrid.rowEls,t,!0)},computeInitialScroll:function(){return{top:0}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},prepareHits:function(){this.dayGrid.prepareHits()},releaseHits:function(){this.dayGrid.releaseHits()},queryHit:function(t,e){return this.dayGrid.queryHit(t,e)},getHitSpan:function(t){return this.dayGrid.getHitSpan(t)},getHitEl:function(t){return this.dayGrid.getHitEl(t)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},unrenderEvents:function(){this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return this.dayGrid.renderDrag(t,e)},unrenderDrag:function(){this.dayGrid.unrenderDrag()},renderSelection:function(t){this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.dayGrid.unrenderSelection()}}),Me={renderHeadIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<th class="fc-week-number '+t.widgetHeaderClass+'" '+t.weekNumberStyleAttr()+"><span>"+tt(t.opt("weekNumberTitle"))+"</span></th>":""},renderNumberIntroHtml:function(t){var e=this.view,n=this.getCellDate(t,0);return e.colWeekNumbersVisible?'<td class="fc-week-number" '+e.weekNumberStyleAttr()+">"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"</td>":""},renderBgIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number '+t.widgetContentClass+'" '+t.weekNumberStyleAttr()+"></td>":""},renderIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number" '+t.weekNumberStyleAttr()+"></td>":""}},Be=qt.MonthView=Le.extend({computeRange:function(t){var e,n=Le.prototype.computeRange.call(this,t);return this.isFixedWeeks()&&(e=Math.ceil(n.end.diff(n.start,"weeks",!0)),n.end.add(6-e,"weeks")),n},setGridHeight:function(t,e){e&&(t*=this.rowCnt/6),l(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){return this.opt("fixedWeekCount")}});Zt.basic={class:Le},Zt.basicDay={type:"basic",duration:{days:1}},Zt.basicWeek={type:"basic",duration:{weeks:1}},Zt.month={class:Be,duration:{months:1},defaults:{fixedWeekCount:!0}};var ze=qt.AgendaView=Ee.extend({scroller:null,timeGridClass:we,timeGrid:null,dayGridClass:Se,dayGrid:null,axisWidth:null,headContainerEl:null,noScrollRowEls:null,bottomRuleEl:null,initialize:function(){this.timeGrid=this.instantiateTimeGrid(),this.opt("allDaySlot")&&(this.dayGrid=this.instantiateDayGrid()),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},instantiateTimeGrid:function(){var t=this.timeGridClass.extend(Fe);return new t(this)},instantiateDayGrid:function(){var t=this.dayGridClass.extend(Ne);return new t(this)},setRange:function(t){Ee.prototype.setRange.call(this,t),this.timeGrid.setRange(t),this.dayGrid&&this.dayGrid.setRange(t)},renderDates:function(){this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-time-grid-container"),n=t('<div class="fc-time-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.timeGrid.setElement(n),this.timeGrid.renderDates(),this.bottomRuleEl=t('<hr class="fc-divider '+this.widgetHeaderClass+'"/>').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.renderDates(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())},unrenderDates:function(){this.timeGrid.unrenderDates(),this.timeGrid.removeElement(),this.dayGrid&&(this.dayGrid.unrenderDates(),this.dayGrid.removeElement()),this.scroller.destroy()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="fc-divider '+this.widgetHeaderClass+'"/>':"")+"</td></tr></tbody></table>"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},renderBusinessHours:function(){this.timeGrid.renderBusinessHours(),this.dayGrid&&this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.timeGrid.unrenderBusinessHours(),this.dayGrid&&this.dayGrid.unrenderBusinessHours()},getNowIndicatorUnit:function(){return this.timeGrid.getNowIndicatorUnit()},renderNowIndicator:function(t){this.timeGrid.renderNowIndicator(t)},unrenderNowIndicator:function(){this.timeGrid.unrenderNowIndicator()},updateSize:function(t){this.timeGrid.updateSize(t),Ee.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=u(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,s,o;this.bottomRuleEl.hide(),this.scroller.clear(),r(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.removeSegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=Ge),n&&this.dayGrid.limitRows(n)),e||(s=this.computeScrollerHeight(t),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(i(this.noScrollRowEls,o),s=this.computeScrollerHeight(t),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()<s&&this.bottomRuleEl.show())},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},computeInitialScroll:function(){var t=e.duration(this.opt("scrollTime")),n=this.timeGrid.computeTimeTop(t);return n=Math.ceil(n),n&&n++,{top:n}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},prepareHits:function(){this.timeGrid.prepareHits(),this.dayGrid&&this.dayGrid.prepareHits()},releaseHits:function(){this.timeGrid.releaseHits(),this.dayGrid&&this.dayGrid.releaseHits()},queryHit:function(t,e){var n=this.timeGrid.queryHit(t,e);return!n&&this.dayGrid&&(n=this.dayGrid.queryHit(t,e)),n},getHitSpan:function(t){return t.component.getHitSpan(t)},getHitEl:function(t){return t.component.getHitEl(t)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;n<t.length;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight()},getEventSegs:function(){return this.timeGrid.getEventSegs().concat(this.dayGrid?this.dayGrid.getEventSegs():[])},unrenderEvents:function(){this.timeGrid.unrenderEvents(),this.dayGrid&&this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return t.start.hasTime()?this.timeGrid.renderDrag(t,e):this.dayGrid?this.dayGrid.renderDrag(t,e):void 0},unrenderDrag:function(){this.timeGrid.unrenderDrag(),this.dayGrid&&this.dayGrid.unrenderDrag()},renderSelection:function(t){t.start.hasTime()||t.end.hasTime()?this.timeGrid.renderSelection(t):this.dayGrid&&this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.timeGrid.unrenderSelection(),this.dayGrid&&this.dayGrid.unrenderSelection()}}),Fe={renderHeadIntroHtml:function(){var t,e=this.view;return e.opt("weekNumbers")?(t=this.start.format(e.opt("smallWeekFormat")),'<th class="fc-axis fc-week-number '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+">"+e.buildGotoAnchorHtml({date:this.start,type:"week",forceOff:this.colCnt>1},tt(t))+"</th>"):'<th class="fc-axis '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+"></th>"},renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},Ne={renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"><span>"+t.getAllDayHtml()+"</span></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},Ge=5,Oe=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];Zt.agenda={class:ze,defaults:{allDaySlot:!0,slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0}},Zt.agendaDay={type:"agenda",duration:{days:1}},Zt.agendaWeek={type:"agenda",duration:{weeks:1}};var Ae=Ee.extend({grid:null,scroller:null,initialize:function(){this.grid=new Ve(this),this.scroller=new be({overflowX:"hidden",overflowY:"auto"})},setRange:function(t){Ee.prototype.setRange.call(this,t),this.grid.setRange(t)},renderSkeleton:function(){this.el.addClass("fc-list-view "+this.widgetContentClass),this.scroller.render(),this.scroller.el.appendTo(this.el),this.grid.setElement(this.scroller.scrollEl)},unrenderSkeleton:function(){this.scroller.destroy()},setHeight:function(t,e){this.scroller.setHeight(this.computeScrollerHeight(t))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el);
-},renderEvents:function(t){this.grid.renderEvents(t)},unrenderEvents:function(){this.grid.unrenderEvents()},isEventResizable:function(t){return!1},isEventDraggable:function(t){return!1}}),Ve=me.extend({segSelector:".fc-list-item",hasDayInteractions:!1,spanToSegs:function(t){for(var e,n=this.view,i=n.start.clone().time(0),r=0,s=[];i<n.end;)if(e=F(t,{start:i,end:i.clone().add(1,"day")}),e&&(e.dayIndex=r,s.push(e)),i.add(1,"day"),r++,e&&!e.isEnd&&t.end.hasTime()&&t.end<i.clone().add(this.view.nextDayThreshold)){e.end=t.end.clone(),e.isEnd=!0;break}return s},computeEventTimeFormat:function(){return this.view.opt("mediumTimeFormat")},handleSegClick:function(e,n){var i;me.prototype.handleSegClick.apply(this,arguments),t(n.target).closest("a[href]").length||(i=e.event.url,i&&!n.isDefaultPrevented()&&(window.location.href=i))},renderFgSegs:function(t){return t=this.renderFgSegEls(t),t.length?this.renderSegList(t):this.renderEmptyMessage(),t},renderEmptyMessage:function(){this.el.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+tt(this.view.opt("noEventsMessage"))+"</div></div></div>")},renderSegList:function(e){var n,i,r,s=this.groupSegsByDay(e),o=t('<table class="fc-list-table"><tbody/></table>'),l=o.find("tbody");for(n=0;n<s.length;n++)if(i=s[n])for(l.append(this.dayHeaderHtml(this.view.start.clone().add(n,"days"))),this.sortEventSegs(i),r=0;r<i.length;r++)l.append(i[r].el);this.el.empty().append(o)},groupSegsByDay:function(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i},dayHeaderHtml:function(t){var e=this.view,n=e.opt("listDayFormat"),i=e.opt("listDayAltFormat");return'<tr class="fc-list-heading" data-date="'+t.format("YYYY-MM-DD")+'"><td class="'+e.widgetHeaderClass+'" colspan="3">'+(n?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},tt(t.format(n))):"")+(i?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},tt(t.format(i))):"")+"</td></tr>"},fgSegHtml:function(t){var e,n=this.view,i=["fc-list-item"].concat(this.getSegCustomClasses(t)),r=this.getSegBackgroundColor(t),s=t.event,o=s.url;return e=s.allDay?n.getAllDayHtml():n.isMultiDayEvent(s)?t.isStart||t.isEnd?tt(this.getEventTimeText(t)):n.getAllDayHtml():tt(this.getEventTimeText(s)),o&&i.push("fc-has-url"),'<tr class="'+i.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+n.widgetContentClass+'">'+(e||"")+"</td>":"")+'<td class="fc-list-item-marker '+n.widgetContentClass+'"><span class="fc-event-dot"'+(r?' style="background-color:'+r+'"':"")+'></span></td><td class="fc-list-item-title '+n.widgetContentClass+'"><a'+(o?' href="'+tt(o)+'"':"")+">"+tt(t.event.title||"")+"</a></td></tr>"}});return Zt.list={class:Ae,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}},Zt.listDay={type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}},Zt.listWeek={type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}},Zt.listMonth={type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}},Zt.listYear={type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}},qt}); \ No newline at end of file
+!function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):"object"==typeof exports?module.exports=t(require("jquery"),require("moment")):t(jQuery,moment)}(function(t,e){function n(t){return q(t,Vt)}function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function s(){t("body").addClass("fc-not-allowed")}function o(){t("body").removeClass("fc-not-allowed")}function l(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],u=[],c=0;a(e),e.each(function(n,i){var a=n===e.length-1?s:r,d=t(i).outerHeight(!0);d<a?(o.push(i),l.push(d),u.push(t(i).height())):c+=d}),i&&(n-=c,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,a=l[e],c=u[e],d=i-(a-c);a<i&&t(n).height(d)})}function a(t){t.height("")}function u(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function c(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function d(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function h(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function f(t,e){var n=t.offset(),i=p(t),r=n.left+S(t,"border-left-width")+i.left-(e?e.left:0),s=n.top+S(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:s,bottom:s+t[0].clientHeight}}function g(t,e){var n=t.offset(),i=n.left+S(t,"border-left-width")+S(t,"padding-left")-(e?e.left:0),r=n.top+S(t,"border-top-width")+S(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function p(t){var e,n=t.innerWidth()-t[0].clientWidth,i=t.innerHeight()-t[0].clientHeight;return n=v(n),i=v(i),e={left:0,right:0,top:0,bottom:i},m()&&"rtl"==t.css("direction")?e.left=n:e.right=n,e}function v(t){return t=Math.max(0,t),t=Math.round(t)}function m(){return null===Pt&&(Pt=y()),Pt}function y(){var e=t("<div><div/></div>").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),n=e.children(),i=n.offset().left>e.offset().left;return e.remove(),i}function S(t,e){return parseFloat(t.css(e))||0}function w(t){return 1==t.which&&!t.ctrlKey}function E(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageX:t.pageX}function b(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageY:t.pageY}function D(t){return/^touch/.test(t.type)}function T(t){t.addClass("fc-unselectable").on("selectstart",H)}function C(t){t.removeClass("fc-unselectable").off("selectstart",H)}function H(t){t.preventDefault()}function x(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function R(t,e){return{left:Math.min(Math.max(t.left,e.left),e.right),top:Math.min(Math.max(t.top,e.top),e.bottom)}}function I(t){return{left:(t.left+t.right)/2,top:(t.top+t.bottom)/2}}function k(t,e){return{left:t.left-e.left,top:t.top-e.top}}function L(e){var n,i,r=[],s=[];for("string"==typeof e?s=e.split(/\s*,\s*/):"function"==typeof e?s=[e]:t.isArray(e)&&(s=e),n=0;n<s.length;n++)i=s[n],"string"==typeof i?r.push("-"==i.charAt(0)?{field:i.substring(1),order:-1}:{field:i,order:1}):"function"==typeof i&&r.push({func:i});return r}function M(t,e,n){var i,r;for(i=0;i<n.length;i++)if(r=B(t,e,n[i]))return r;return 0}function B(t,e,n){return n.func?n.func(t,e):N(t[n.field],e[n.field])*(n.order||1)}function N(e,n){return e||n?null==n?-1:null==e?1:"string"===t.type(e)||"string"===t.type(n)?String(e).localeCompare(String(n)):e-n:0}function F(t,e){var n,i,r,s,o=t.start,l=t.end,a=e.start,u=e.end;if(l>a&&o<u)return o>=a?(n=o.clone(),r=!0):(n=a.clone(),r=!1),l<=u?(i=l.clone(),s=!0):(i=u.clone(),s=!1),{start:n,end:i,isStart:r,isEnd:s}}function z(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function G(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days")})}function O(t,n,i){return e.duration(Math.round(t.diff(n,i,!0)),i)}function A(t,e){var n,i,r;for(n=0;n<Yt.length&&(i=Yt[n],r=V(i,t,e),!(r>=1&&ot(r)));n++);return i}function V(t,n,i){return null!=i?i.diff(n,t,!0):e.isDuration(n)?n.as(t):n.end.diff(n.start,t,!0)}function P(t,e,n){var i;return W(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ot(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function _(t,e){var n,i;return W(t)||W(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ot(n)&&Math.abs(i)>=1&&ot(i)?n/i:t.asDays()/e.asDays())}function Y(t,n){var i;return W(t)?e.duration(t*n):(i=t.asMonths(),Math.abs(i)>=1&&ot(i)?e.duration({months:i*n}):e.duration({days:t.asDays()*n}))}function W(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function U(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function j(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function q(t,e){var n,i,r,s,o,l,a={};if(e)for(n=0;n<e.length;n++){for(i=e[n],r=[],s=t.length-1;s>=0;s--)if(o=t[s][i],"object"==typeof o)r.unshift(o);else if(void 0!==o){a[i]=o;break}r.length&&(a[i]=q(r))}for(n=t.length-1;n>=0;n--){l=t[n];for(i in l)i in a||(a[i]=l[i])}return a}function Z(t){var e=function(){};return e.prototype=t,new e}function $(t,e){for(var n in t)Q(t,n)&&(e[n]=t[n])}function Q(t,e){return Wt.call(t,e)}function X(e){return/undefined|null|boolean|number|string/.test(t.type(e))}function K(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;r<e.length;r++)s=e[r].apply(n,i)||s;return s}}function J(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}function tt(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function et(t){return t.replace(/&.*?;/g,"")}function nt(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+":"+e)}),n.join(";")}function it(e){var n=[];return t.each(e,function(t,e){null!=e&&n.push(t+'="'+tt(e)+'"')}),n.join(" ")}function rt(t){return t.charAt(0).toUpperCase()+t.slice(1)}function st(t,e){return t-e}function ot(t){return t%1===0}function lt(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function at(t,e,n){var i,r,s,o,l,a=function(){var u=+new Date-o;u<e?i=setTimeout(a,e-u):(i=null,n||(l=t.apply(s,r),s=r=null))};return function(){s=this,r=arguments,o=+new Date;var u=n&&!i;return i||(i=setTimeout(a,e)),u&&(l=t.apply(s,r),s=r=null),l}}function ut(n,i,r){var s,o,l,a,u=n[0],c=1==n.length&&"string"==typeof u;return e.isMoment(u)||U(u)||void 0===u?a=e.apply(null,n):(s=!1,o=!1,c?Ut.test(u)?(u+="-01",n=[u],s=!0,o=!0):(l=jt.exec(u))&&(s=!l[5],o=!0):t.isArray(u)&&(o=!0),a=i||s?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:c&&a.utcOffset(u))),a._fullCalendar=!0,a}function ct(){}function dt(t,e){var n;return Q(e,"constructor")&&(n=e.constructor),"function"!=typeof n&&(n=e.constructor=function(){t.apply(this,arguments)}),n.prototype=Z(t.prototype),$(e,n.prototype),$(t,n),n}function ht(t,e){$(e,t.prototype)}function ft(e){var n=t.Deferred(),i=n.promise();if("function"==typeof e&&e(function(t){ft.immediate&&(i._value=t),n.resolve(t)},function(){n.reject()}),ft.immediate){var r=i.then;i.then=function(t,e){var n=i.state();if("resolved"===n){if("function"==typeof t)return ft.resolve(t(i._value))}else if("rejected"===n&&"function"==typeof e)return e(),i;return r.call(i,t,e)}}return i}function gt(t){function e(t){return new ft(function(e){var i=function(){ft.resolve(t()).then(e).then(function(){n.shift(),n.length&&n[0]()})};n.push(i),1===n.length&&i()})}var n=[];this.add="number"==typeof t?at(e,t):e,this.addQuickly=e}function pt(t,e){return!t&&!e||!(!t||!e)&&(t.component===e.component&&vt(t,e)&&vt(e,t))}function vt(t,e){for(var n in t)if(!/^(component|left|right|top|bottom)$/.test(n)&&t[n]!==e[n])return!1;return!0}function mt(t){return{start:t.start.clone(),end:t.end?t.end.clone():null,allDay:t.allDay}}function yt(t){var e=wt(t);return"background"===e||"inverse-background"===e}function St(t){return"inverse-background"===wt(t)}function wt(t){return J((t.source||{}).rendering,t.rendering)}function Et(t){var e,n,i={};for(e=0;e<t.length;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function bt(t,e){return t.start-e.start}function Dt(n){var i,r,s,o,l=Ot.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function Tt(t,e){var n,i;for(n=0;n<e.length;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function Ct(t,e){return t.leftCol-e.leftCol}function Ht(t){var e,n,i,r=[];for(e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&It(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function xt(t){var e,n,i,r,s;for(e=0;e<t.length;e++)for(n=t[e],i=0;i<n.length;i++)for(r=n[i],r.forwardSegs=[],s=e+1;s<t.length;s++)It(r,t[s],r.forwardSegs)}function Rt(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;e<i.length;e++)n=i[e],Rt(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function It(t,e,n){n=n||[];for(var i=0;i<e.length;i++)kt(t,e[i])&&n.push(e[i]);return n}function kt(t,e){return t.bottom>e.top&&t.top<e.bottom}function Lt(t){this.items=t||[]}function Mt(e,n){function i(t){n=t}function r(){var i=n.layout;p=e.options.theme?"ui":"fc",i?(g?g.empty():g=this.el=t("<div class='fc-toolbar "+n.extraClasses+"'/>"),g.append(o("left")).append(o("right")).append(o("center")).append('<div class="fc-clear"/>')):s()}function s(){g&&(g.remove(),g=f.el=null)}function o(i){var r=t('<div class="fc-'+i+'"/>'),s=n.layout[i];return s&&t.each(s.split(" "),function(n){var i,s=t(),o=!0;t.each(this.split(","),function(n,i){var r,l,a,u,c,d,h,f,g,m;"title"==i?(s=s.add(t("<h2>&nbsp;</h2>")),o=!1):((r=(e.options.customButtons||{})[i])?(a=function(t){r.click&&r.click.call(m[0],t)},u="",c=r.text):(l=e.getViewSpec(i))?(a=function(){e.changeView(i)},v.push(i),u=l.buttonTextOverride,c=l.buttonTextDefault):e[i]&&(a=function(){e[i]()},u=(e.overrides.buttonText||{})[i],c=e.options.buttonText[i]),a&&(d=r?r.themeIcon:e.options.themeButtonIcons[i],h=r?r.icon:e.options.buttonIcons[i],f=u?tt(u):d&&e.options.theme?"<span class='ui-icon ui-icon-"+d+"'></span>":h&&!e.options.theme?"<span class='fc-icon fc-icon-"+h+"'></span>":tt(c),g=["fc-"+i+"-button",p+"-button",p+"-state-default"],m=t('<button type="button" class="'+g.join(" ")+'">'+f+"</button>").click(function(t){m.hasClass(p+"-state-disabled")||(a(t),(m.hasClass(p+"-state-active")||m.hasClass(p+"-state-disabled"))&&m.removeClass(p+"-state-hover"))}).mousedown(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-down")}).mouseup(function(){m.removeClass(p+"-state-down")}).hover(function(){m.not("."+p+"-state-active").not("."+p+"-state-disabled").addClass(p+"-state-hover")},function(){m.removeClass(p+"-state-hover").removeClass(p+"-state-down")}),s=s.add(m)))}),o&&s.first().addClass(p+"-corner-left").end().last().addClass(p+"-corner-right").end(),s.length>1?(i=t("<div/>"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function l(t){g&&g.find("h2").text(t)}function a(t){g&&g.find(".fc-"+t+"-button").addClass(p+"-state-active")}function u(t){g&&g.find(".fc-"+t+"-button").removeClass(p+"-state-active")}function c(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!0).addClass(p+"-state-disabled")}function d(t){g&&g.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(p+"-state-disabled")}function h(){return v}var f=this;f.setToolbarOptions=i,f.render=r,f.removeElement=s,f.updateTitle=l,f.activateButton=a,f.deactivateButton=u,f.disableButton=c,f.enableButton=d,f.getViewsWithButtons=h,f.el=null;var g,p,v=[]}function Bt(n,i){function r(t){t._locale=Y}function s(){q?a()&&(f(),u()):o()}function o(){n.addClass("fc"),n.on("click.fc","a[data-goto]",function(e){var n=t(this),i=n.data("goto"),r=_.moment(i.date),s=i.type,o=Q.opt("navLink"+rt(s)+"Click");"function"==typeof o?o(r,e):("string"==typeof o&&(s=o),B(r,s))}),_.bindOption("theme",function(t){$=t?"ui":"fc",n.toggleClass("ui-widget",t),n.toggleClass("fc-unthemed",!t)}),_.bindOptions(["isRTL","locale"],function(t){n.toggleClass("fc-ltr",!t),n.toggleClass("fc-rtl",t)}),q=t("<div class='fc-view-container'/>").prependTo(n);var e=y();W=new Lt(e),U=_.header=e[0],j=_.footer=e[1],E(),b(),u(_.options.defaultView),_.options.handleWindowResize&&(K=at(v,_.options.windowResizeDelay),t(window).resize(K))}function l(){Q&&Q.removeElement(),W.proxyCall("removeElement"),q.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),n.off(".fc"),K&&t(window).unbind("resize",K),se.unneeded()}function a(){return n.is(":visible")}function u(e,n){nt++;var i=Q&&e&&Q.type!==e;i&&(F(),c()),!Q&&e&&(Q=_.view=et[e]||(et[e]=_.instantiateView(e)),Q.setElement(t("<div class='fc-view fc-"+e+"-view' />").appendTo(q)),W.proxyCall("activateButton",e)),Q&&(J=Q.massageCurrentDate(J),Q.isDateSet&&J>=Q.intervalStart&&J<Q.intervalEnd||a()&&(n&&Q.captureInitialScroll(n),Q.setDate(J,n),n&&Q.releaseScroll(),D())),i&&z(),nt--}function c(){W.proxyCall("deactivateButton",Q.type),Q.removeElement(),Q=_.view=null}function d(){nt++,F();var t=Q.type,e=Q.queryScroll();c(),f(),u(t,e),z(),nt--}function h(t){if(a())return t&&g(),nt++,Q.updateSize(!0),nt--,!0}function f(){a()&&g()}function g(){var t=_.options.contentHeight,e=_.options.height;X="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-p():"function"==typeof e?e()-p():"parent"===e?n.parent().height()-p():Math.round(q.width()/Math.max(_.options.aspectRatio,.5))}function p(){return W.items.reduce(function(t,e){var n=e.el?e.el.outerHeight(!0):0;return t+n},0)}function v(t){!nt&&t.target===window&&Q.start&&h(!0)&&Q.publiclyTrigger("windowResize",tt)}function m(){a()&&_.reportEventChange()}function y(){return[new Mt(_,S()),new Mt(_,w())]}function S(){return{extraClasses:"fc-header-toolbar",layout:_.options.header}}function w(){return{extraClasses:"fc-footer-toolbar",layout:_.options.footer}}function E(){U.setToolbarOptions(S()),U.render(),U.el&&n.prepend(U.el)}function b(){j.setToolbarOptions(w()),j.render(),j.el&&n.append(j.el)}function D(){var t=_.getNow();t>=Q.intervalStart&&t<Q.intervalEnd?W.proxyCall("disableButton","today"):W.proxyCall("enableButton","today")}function T(t,e){Q.select(_.buildSelectSpan.apply(_,arguments))}function C(){Q&&Q.unselect()}function H(){J=Q.computePrevDate(J),u()}function x(){J=Q.computeNextDate(J),u()}function R(){J.add(-1,"years"),u()}function I(){J.add(1,"years"),u()}function k(){J=_.getNow(),u()}function L(t){J=_.moment(t).stripZone(),u()}function M(t){J.add(e.duration(t)),u()}function B(t,e){var n;e=e||"day",n=_.getViewSpec(e)||_.getUnitViewSpec(e),J=t.clone(),u(n?n.type:null)}function N(){return _.applyTimezone(J)}function F(){it++||q.css({width:"100%",height:q.height(),overflow:"hidden"})}function z(){--it||q.css({width:"",height:"",overflow:""})}function G(){return _}function O(){return Q}function A(t,e){var n;if("string"==typeof t){if(void 0===e)return _.options[t];n={},n[t]=e,V(n)}else"object"==typeof t&&V(t)}function V(t){var e,n=0;for(e in t)_.dynamicOverrides[e]=t[e];_.viewSpecCache={},_.populateOptionsHash();for(e in t)_.triggerOptionHandlers(e),n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void h(!0);if("defaultDate"===e)return;if("businessHours"===e)return void(Q&&(Q.unrenderBusinessHours(),Q.renderBusinessHours()));if("timezone"===e)return _.rezoneArrayEventSources(),void _.refetchEvents()}E(),b(),et={},d()}function P(t,e){var n=Array.prototype.slice.call(arguments,2);if(e=e||tt,this.triggerWith(t,e,n),_.options[t])return _.options[t].apply(e,n)}var _=this;se.needed(),_.render=s,_.destroy=l,_.rerenderEvents=m,_.changeView=u,_.select=T,_.unselect=C,_.prev=H,_.next=x,_.prevYear=R,_.nextYear=I,_.today=k,_.gotoDate=L,_.incrementDate=M,_.zoomTo=B,_.getDate=N,_.getCalendar=G,_.getView=O,_.option=A,_.publiclyTrigger=P,_.dynamicOverrides={},_.viewSpecCache={},_.optionHandlers={},_.overrides=t.extend({},i),_.populateOptionsHash();var Y;_.bindOptions(["locale","monthNames","monthNamesShort","dayNames","dayNamesShort","firstDay","weekNumberCalculation"],function(t,e,n,i,s,o,l){if("iso"===l&&(l="ISO"),Y=Z(Ft(t)),e&&(Y._months=e),n&&(Y._monthsShort=n),i&&(Y._weekdays=i),s&&(Y._weekdaysShort=s),null==o&&"ISO"===l&&(o=1),null!=o){var a=Z(Y._week);a.dow=o,Y._week=a}"ISO"!==l&&"local"!==l&&"function"!=typeof l||(Y._fullCalendar_weekCalc=l),J&&r(J)}),_.defaultAllDayEventDuration=e.duration(_.options.defaultAllDayEventDuration),_.defaultTimedEventDuration=e.duration(_.options.defaultTimedEventDuration),_.moment=function(){var t;return"local"===_.options.timezone?(t=Ot.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===_.options.timezone?Ot.moment.utc.apply(null,arguments):Ot.moment.parseZone.apply(null,arguments),r(t),t},_.localizeMoment=r,_.getIsAmbigTimezone=function(){return"local"!==_.options.timezone&&"UTC"!==_.options.timezone},_.applyTimezone=function(t){if(!t.hasTime())return t.clone();var e,n=_.moment(t.toArray()),i=t.time()-n.time();return i&&(e=n.clone().add(i),t.time()-e.time()===0&&(n=e)),n},_.getNow=function(){var t=_.options.now;return"function"==typeof t&&(t=t()),_.moment(t).stripZone()},_.getEventEnd=function(t){return t.end?t.end.clone():_.getDefaultEventEnd(t.allDay,t.start)},_.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(_.defaultAllDayEventDuration):n.add(_.defaultTimedEventDuration),_.getIsAmbigTimezone()&&n.stripZone(),n},_.humanizeDuration=function(t){return t.locale(_.options.locale).humanize()},zt.call(_);var W,U,j,q,$,Q,X,K,J,tt=n[0],et={},nt=0;J=null!=_.options.defaultDate?_.moment(_.options.defaultDate).stripZone():_.getNow(),_.getSuggestedViewHeight=function(){return void 0===X&&f(),X},_.isHeightAuto=function(){return"auto"===_.options.contentHeight||"auto"===_.options.height},_.setToolbarsTitle=function(t){W.proxyCall("updateTitle",t)},_.freezeContentHeight=F,_.thawContentHeight=z;var it=0;_.initialize()}function Nt(e){t.each(me,function(t,n){null==e[t]&&(e[t]=n(e))})}function Ft(t){return e.localeData(t)||e.localeData("en")}function zt(){function n(t,e){return!U.options.lazyFetching||s(t,e)?o(t,e):ft.resolve($)}function i(){$=r(nt),U.trigger("eventsReset",$)}function r(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],n.start.clone().stripZone()<Z&&U.getEventEnd(n).stripZone()>q&&i.push(n);return i}function s(t,e){return!q||t<q||e>Z}function o(t,e){return q=t,Z=e,l()}function l(){return u(tt,"reset")}function a(t){return u(E(t))}function u(t,e){var n,i;for("reset"===e?nt=[]:"add"!==e&&(nt=C(nt,t)),n=0;n<t.length;n++)i=t[n],"pending"!==i._status&&et++,i._fetchId=(i._fetchId||0)+1,i._status="pending";for(n=0;n<t.length;n++)i=t[n],c(i,i._fetchId);return et?new ft(function(t){U.one("eventsReceived",t)}):ft.resolve($)}function c(e,n){f(e,function(i){var r,s,o,l=t.isArray(e.events);if(n===e._fetchId&&"rejected"!==e._status){if(e._status="resolved",i)for(r=0;r<i.length;r++)s=i[r],o=l?s:F(s,e),o&&nt.push.apply(nt,_(o));h()}})}function d(t){var e="pending"===t._status;t._status="rejected",e&&h()}function h(){et--,et||(i(nt),U.trigger("eventsReceived",$))}function f(e,n){var i,r,s=Ot.sourceFetchers;for(i=0;i<s.length;i++){if(r=s[i].call(U,e,q.clone(),Z.clone(),U.options.timezone,n),r===!0)return;if("object"==typeof r)return void f(r,n)}var o=e.events;if(o)t.isFunction(o)?(U.pushLoading(),o.call(U,q.clone(),Z.clone(),U.options.timezone,function(t){n(t),U.popLoading()})):t.isArray(o)?n(o):n();else{var l=e.url;if(l){var a,u=e.success,c=e.error,d=e.complete;a=t.isFunction(e.data)?e.data():e.data;var h=t.extend({},a||{}),g=J(e.startParam,U.options.startParam),p=J(e.endParam,U.options.endParam),v=J(e.timezoneParam,U.options.timezoneParam);g&&(h[g]=q.format()),p&&(h[p]=Z.format()),U.options.timezone&&"local"!=U.options.timezone&&(h[v]=U.options.timezone),U.pushLoading(),t.ajax(t.extend({},ye,e,{data:h,success:function(e){e=e||[];var i=K(u,this,arguments);t.isArray(i)&&(e=i),n(e)},error:function(){K(c,this,arguments),n()},complete:function(){K(d,this,arguments),U.popLoading()}}))}else n()}}function g(t){var e=p(t);e&&(tt.push(e),u([e],"add"))}function p(e){var n,i,r=Ot.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return F(t,n)})),i=0;i<r.length;i++)r[i].call(U,n);return n}}function v(t){y(b(t))}function m(t){null==t?y(tt,!0):y(E(t))}function y(e,n){var r;for(r=0;r<e.length;r++)d(e[r]);n?(tt=[],nt=[]):(tt=t.grep(tt,function(t){for(r=0;r<e.length;r++)if(t===e[r])return!1;return!0}),nt=C(nt,e)),i()}function S(){return tt.slice(1)}function w(e){return t.grep(tt,function(t){return t.id&&t.id===e})[0]}function E(e){e?t.isArray(e)||(e=[e]):e=[];var n,i=[];for(n=0;n<e.length;n++)i.push.apply(i,b(e[n]));return i}function b(e){var n,i;for(n=0;n<tt.length;n++)if(i=tt[n],i===e)return[i];return i=w(e),i?[i]:t.grep(tt,function(t){return D(e,t)})}function D(t,e){return t&&e&&T(t)==T(e)}function T(t){return("object"==typeof t?t.origArray||t.googleCalendarId||t.url||t.events:null)||t}function C(e,n){return t.grep(e,function(t){for(var e=0;e<n.length;e++)if(t.source===n[e])return!1;return!0})}function H(t){x([t])}function x(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.start=U.moment(n.start),n.end?n.end=U.moment(n.end):n.end=null,Y(n,R(n));i()}function R(e){var n={};return t.each(e,function(t,e){I(t)&&void 0!==e&&X(e)&&(n[t]=e)}),n}function I(t){return!/^_|^(id|allDay|start|end)$/.test(t)}function k(t,e){return L([t],e)}function L(t,e){var n,r,s,o,l,a=[];for(s=0;s<t.length;s++)if(r=F(t[s])){for(n=_(r),o=0;o<n.length;o++)l=n[o],l.source||(e&&(Q.events.push(l),l.source=Q),nt.push(l));a=a.concat(n)}return a.length&&i(),a}function M(e){var n,r;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),nt=t.grep(nt,e,!0),r=0;r<tt.length;r++)t.isArray(tt[r].events)&&(tt[r].events=t.grep(tt[r].events,e,!0));i()}function B(e){return t.isFunction(e)?t.grep(nt,e):null!=e?(e+="",t.grep(nt,function(t){return t._id==e})):nt}function N(t){t.start=U.moment(t.start),t.end&&(t.end=U.moment(t.end)),Gt(t)}function F(n,i){var r,s,o,l={};if(U.options.eventDataTransform&&(n=U.options.eventDataTransform(n)),i&&i.eventDataTransform&&(n=i.eventDataTransform(n)),t.extend(l,n),i&&(l.source=i),l._id=n._id||(void 0===n.id?"_fc"+Se++:n.id+""),n.className?"string"==typeof n.className?l.className=n.className.split(/\s+/):l.className=n.className:l.className=[],r=n.start||n.date,s=n.end,j(r)&&(r=e.duration(r)),j(s)&&(s=e.duration(s)),n.dow||e.isDuration(r)||e.isDuration(s))l.start=r?e.duration(r):null,l.end=s?e.duration(s):null,l._recurring=!0;else{if(r&&(r=U.moment(r),!r.isValid()))return!1;s&&(s=U.moment(s),s.isValid()||(s=null)),o=n.allDay,void 0===o&&(o=J(i?i.allDayDefault:void 0,U.options.allDayDefault)),A(r,s,o,l)}return U.normalizeEvent(l),l}function A(t,e,n,i){i.start=t,i.end=e,i.allDay=n,V(i),Gt(i)}function V(t){P(t),t.end&&!t.end.isAfter(t.start)&&(t.end=null),t.end||(U.options.forceEventDuration?t.end=U.getDefaultEventEnd(t.allDay,t.start):t.end=null)}function P(t){null==t.allDay&&(t.allDay=!(t.start.hasTime()||t.end&&t.end.hasTime())),t.allDay?(t.start.stripTime(),t.end&&t.end.stripTime()):(t.start.hasTime()||(t.start=U.applyTimezone(t.start.time(0))),t.end&&!t.end.hasTime()&&(t.end=U.applyTimezone(t.end.time(0))))}function _(e,n,i){var r,s,o,l,a,u,c,d,h,f=[];if(n=n||q,i=i||Z,e)if(e._recurring){if(s=e.dow)for(r={},o=0;o<s.length;o++)r[s[o]]=!0;for(l=n.clone().stripTime();l.isBefore(i);)r&&!r[l.day()]||(a=e.start,u=e.end,c=l.clone(),d=null,a&&(c=c.time(a)),u&&(d=l.clone().time(u)),h=t.extend({},e),A(c,d,!a&&!u,h),f.push(h)),l.add(1,"days")}else f.push(e);return f}function Y(e,n,i){function r(t,e){return i?O(t,e,i):n.allDay?G(t,e):z(t,e)}var s,o,l,a,u,c,d={};return n=n||{},n.start||(n.start=e.start.clone()),void 0===n.end&&(n.end=e.end?e.end.clone():null),null==n.allDay&&(n.allDay=e.allDay),V(n),s={start:e._start.clone(),end:e._end?e._end.clone():U.getDefaultEventEnd(e._allDay,e._start),allDay:n.allDay},V(s),o=null!==e._end&&null===n.end,l=r(n.start,s.start),n.end?(a=r(n.end,s.end),u=a.subtract(l)):u=null,t.each(n,function(t,e){I(t)&&void 0!==e&&(d[t]=e)}),c=W(B(e._id),o,n.allDay,l,u,d),{dateDelta:l,durationDelta:u,undo:c}}function W(e,n,i,r,s,o){var l=U.getIsAmbigTimezone(),a=[];return r&&!r.valueOf()&&(r=null),s&&!s.valueOf()&&(s=null),t.each(e,function(e,u){var c,d;c={start:u.start.clone(),end:u.end?u.end.clone():null,allDay:u.allDay},t.each(o,function(t){c[t]=u[t]}),d={start:u._start,end:u._end,allDay:i},V(d),n?d.end=null:s&&!d.end&&(d.end=U.getDefaultEventEnd(d.allDay,d.start)),r&&(d.start.add(r),d.end&&d.end.add(r)),s&&d.end.add(s),l&&!d.allDay&&(r||s)&&(d.start.stripZone(),d.end&&d.end.stripZone()),t.extend(u,o,d),Gt(u),a.push(function(){t.extend(u,c),Gt(u)})}),function(){for(var t=0;t<a.length;t++)a[t]()}}var U=this;U.requestEvents=n,U.reportEventChange=i,U.isFetchNeeded=s,U.fetchEvents=o,U.fetchEventSources=u,U.refetchEvents=l,U.refetchEventSources=a,U.getEventSources=S,U.getEventSourceById=w,U.addEventSource=g,U.removeEventSource=v,U.removeEventSources=m,U.updateEvent=H,U.updateEvents=x,U.renderEvent=k,U.renderEvents=L,U.removeEvents=M,U.clientEvents=B,U.mutateEvent=Y,U.normalizeEventDates=V,U.normalizeEventTimes=P;var q,Z,$,Q={events:[]},tt=[Q],et=0,nt=[];t.each((U.options.events?[U.options.events]:[]).concat(U.options.eventSources||[]),function(t,e){var n=p(e);n&&tt.push(n)}),U.getEventCache=function(){return nt},U.getPrunedEventCache=function(){return $},U.rezoneArrayEventSources=function(){var e,n,i;for(e=0;e<tt.length;e++)if(n=tt[e].events,t.isArray(n))for(i=0;i<n.length;i++)N(n[i])},U.buildEventFromInput=F,U.expandEvent=_}function Gt(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}var Ot=t.fullCalendar={version:"3.2.0",internalApiVersion:8},At=Ot.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,l=t(s),a=l.data("fullCalendar");"string"==typeof e?a&&t.isFunction(a[e])&&(o=a[e].apply(a,n),r||(i=o),"destroy"===e&&l.removeData("fullCalendar")):a||(a=new fe(l,e),l.data("fullCalendar",a),a.render())}),i};var Vt=["header","footer","buttonText","buttonIcons","themeButtonIcons"];Ot.intersectRanges=F,Ot.applyAll=K,Ot.debounce=at,Ot.isInt=ot,Ot.htmlEscape=tt,Ot.cssToStr=nt,Ot.proxy=lt,Ot.capitaliseFirstLetter=rt,Ot.getOuterRect=h,Ot.getClientRect=f,Ot.getContentRect=g,Ot.getScrollbarWidths=p;var Pt=null;Ot.preventDefault=H,Ot.intersectRects=x,Ot.parseFieldSpecs=L,Ot.compareByFieldSpecs=M,Ot.compareByFieldSpec=B,Ot.flexibleCompare=N,Ot.computeIntervalUnit=A,Ot.divideRangeByDuration=P,Ot.divideDurationByDuration=_,Ot.multiplyDuration=Y,Ot.durationHasTime=W;var _t=["sun","mon","tue","wed","thu","fri","sat"],Yt=["year","month","week","day","hour","minute","second","millisecond"];Ot.log=function(){var t=window.console;if(t&&t.log)return t.log.apply(t,arguments)},Ot.warn=function(){var t=window.console;return t&&t.warn?t.warn.apply(t,arguments):Ot.log.apply(Ot,arguments)};var Wt={}.hasOwnProperty;Ot.createObject=Z;var Ut=/^\s*\d{4}-\d\d$/,jt=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,qt=e.fn,Zt=t.extend({},qt),$t=e.momentProperties;$t.push("_fullCalendar"),$t.push("_ambigTime"),$t.push("_ambigZone"),Ot.moment=function(){return ut(arguments)},Ot.moment.utc=function(){var t=ut(arguments,!0);return t.hasTime()&&t.utc(),t},Ot.moment.parseZone=function(){return ut(arguments,!0,!0)},qt.week=qt.weeks=function(t){var e=this._locale._fullCalendar_weekCalc;return null==t&&"function"==typeof e?e(this):"ISO"===e?Zt.isoWeek.apply(this,arguments):Zt.week.apply(this,arguments)},qt.time=function(t){if(!this._fullCalendar)return Zt.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},qt.stripTime=function(){return this._ambigTime||(this.utc(!0),this.set({hours:0,minutes:0,seconds:0,ms:0}),this._ambigTime=!0,this._ambigZone=!0),this},qt.hasTime=function(){return!this._ambigTime},qt.stripZone=function(){var t;return this._ambigZone||(t=this._ambigTime,this.utc(!0),this._ambigTime=t||!1,this._ambigZone=!0),this},qt.hasZone=function(){return!this._ambigZone},qt.local=function(t){return Zt.local.call(this,this._ambigZone||t),this._ambigTime=!1,this._ambigZone=!1,this},qt.utc=function(t){return Zt.utc.call(this,t),this._ambigTime=!1,this._ambigZone=!1,this},qt.utcOffset=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),Zt.utcOffset.apply(this,arguments)},qt.format=function(){return this._fullCalendar&&arguments[0]?Qt(this,arguments[0]):this._ambigTime?Kt(this,"YYYY-MM-DD"):this._ambigZone?Kt(this,"YYYY-MM-DD[T]HH:mm:ss"):Zt.format.apply(this,arguments)},qt.toISOString=function(){return this._ambigTime?Kt(this,"YYYY-MM-DD"):this._ambigZone?Kt(this,"YYYY-MM-DD[T]HH:mm:ss"):Zt.toISOString.apply(this,arguments)},function(){function t(t,e){return c(r(e).fakeFormatString,t)}function e(t,e){return Zt.format.call(t,e)}function n(t,e,n,s,o){var l;return t=Ot.moment.parseZone(t),e=Ot.moment.parseZone(e),l=t.localeData(),n=l.longDateFormat(n)||n,i(r(n),t,e,s||" - ",o)}function i(t,e,n,i,r){var s,o,l,a=t.sameUnits,u=e.clone().stripZone(),c=n.clone().stripZone(),f=d(t.fakeFormatString,e),g=d(t.fakeFormatString,n),p="",v="",m="",y="",S="";for(s=0;s<a.length&&(!a[s]||u.isSame(c,a[s]));s++)p+=f[s];for(o=a.length-1;o>s&&(!a[o]||u.isSame(c,a[o]))&&(o-1!==s||"."!==f[o]);o--)v=f[o]+v;for(l=s;l<=o;l++)m+=f[l],y+=g[l];return(m||y)&&(S=r?y+i+m:m+i+y),h(p+S+v)}function r(t){return w[t]||(w[t]=s(t))}function s(t){var e=o(t);return{fakeFormatString:a(e),sameUnits:u(e)}}function o(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push.apply(n,l(e[1])):e[2]?n.push({maybe:o(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push.apply(n,l(e[5]));return n}function l(t){return". "===t?["."," "]:[t]}function a(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],"string"==typeof n?i.push("["+n+"]"):n.token?n.token in y?i.push(p+"["+n.token+"]"):i.push(n.token):n.maybe&&i.push(v+a(n.maybe)+v);return i.join(g)}function u(t){var e,n,i,r=[];for(e=0;e<t.length;e++)n=t[e],n.token?(i=S[n.token.charAt(0)],r.push(i?i.unit:"second")):n.maybe?r.push.apply(r,u(n.maybe)):r.push(null);return r}function c(t,e){return h(d(t,e).join(""))}function d(t,n){var i,r,s=[],o=e(n,t),l=o.split(g);for(i=0;i<l.length;i++)r=l[i],r.charAt(0)===p?s.push(y[r.substring(1)](n)):s.push(r);return s}function h(t){return t.replace(m,function(t,e){
+return e.match(/[1-9]/)?e:""})}function f(t){var e,n,i,r,s=o(t);for(e=0;e<s.length;e++)n=s[e],n.token&&(i=S[n.token.charAt(0)],i&&(!r||i.value>r.value)&&(r=i));return r?r.unit:null}Ot.formatDate=t,Ot.formatRange=n,Ot.oldMomentFormat=e,Ot.queryMostGranularFormatUnit=f;var g="\v",p="",v="",m=new RegExp(v+"([^"+v+"]*)"+v,"g"),y={t:function(t){return e(t,"a").charAt(0)},T:function(t){return e(t,"A").charAt(0)}},S={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}},w={}}();var Qt=Ot.formatDate,Xt=Ot.formatRange,Kt=Ot.oldMomentFormat;Ot.Class=ct,ct.extend=function(){var t,e,n=arguments.length;for(t=0;t<n;t++)e=arguments[t],t<n-1&&ht(this,e);return dt(this,e||{})},ct.mixin=function(t){ht(this,t)},Ot.Promise=ft,ft.immediate=!0,ft.resolve=function(e){if(e&&"function"==typeof e.resolve)return e.promise();if(e&&"function"==typeof e.then)return e;var n=t.Deferred().resolve(e),i=n.promise();if(ft.immediate){var r=i.then;i._value=e,i.then=function(t,n){return"function"==typeof t?ft.resolve(t(e)):r.call(i,t,n)}}return i},ft.reject=function(){return t.Deferred().reject().promise()},ft.all=function(e){var n,i,r,s=!1;if(ft.immediate)for(s=!0,n=[],i=0;i<e.length;i++)if(r=e[i],r&&"function"==typeof r.state&&"resolved"===r.state()&&"_value"in r)n.push(r._value);else{if(r&&"function"==typeof r.then){s=!1;break}n.push(r)}return s?ft.resolve(n):t.when.apply(t.when,e).then(function(){return t.when(t.makeArray(arguments))})},Ot.TaskQueue=gt;var Jt=Ot.EmitterMixin={on:function(e,n){return t(this).on(e,this._prepareIntercept(n)),this},one:function(e,n){return t(this).one(e,this._prepareIntercept(n)),this},_prepareIntercept:function(e){var n=function(t,n){return e.apply(n.context||this,n.args||[])};return e.guid||(e.guid=t.guid++),n.guid=e.guid,n},off:function(e,n){return t(this).off(e,n),this},trigger:function(e){var n=Array.prototype.slice.call(arguments,1);return t(this).triggerHandler(e,{args:n}),this},triggerWith:function(e,n,i){return t(this).triggerHandler(e,{context:n,args:i}),this}},te=Ot.ListenerMixin=function(){var e=0,n={listenerId:null,listenTo:function(e,n,i){if("object"==typeof n)for(var r in n)n.hasOwnProperty(r)&&this.listenTo(e,r,n[r]);else"string"==typeof n&&e.on(n+"."+this.getListenerNamespace(),t.proxy(i,this))},stopListeningTo:function(t,e){t.off((e||"")+"."+this.getListenerNamespace())},getListenerNamespace:function(){return null==this.listenerId&&(this.listenerId=e++),"_listener"+this.listenerId}};return n}(),ee=ct.extend(te,{isHidden:!0,options:null,el:null,margin:10,constructor:function(t){this.options=t||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var e=this,n=this.options;this.el=t('<div class="fc-popover"/>').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&this.listenTo(t(document),"mousedown",this.documentMousedown)},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},removeElement:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(t(document),"mousedown")},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),u=this.el.outerHeight(),c=t(window),h=d(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,h.is(window)||h.is(document)?(h=c,e=0,n=0):(i=h.offset(),e=i.top,n=i.left),e+=c.scrollTop(),n+=c.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+h.outerHeight()-u-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+h.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}}),ne=Ot.CoordCache=ct.extend({els:null,forcedOffsetParentEl:null,origin:null,boundingRect:null,isHorizontal:!1,isVertical:!1,lefts:null,rights:null,tops:null,bottoms:null,constructor:function(e){this.els=t(e.els),this.isHorizontal=e.isHorizontal,this.isVertical=e.isVertical,this.forcedOffsetParentEl=e.offsetParent?t(e.offsetParent):null},build:function(){var t=this.forcedOffsetParentEl;!t&&this.els.length>0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},clear:function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},ensureBuilt:function(){this.origin||this.build()},buildElHorizontals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().left,l=s.outerWidth();e.push(o),n.push(o+l)}),this.lefts=e,this.rights=n},buildElVerticals:function(){var e=[],n=[];this.els.each(function(i,r){var s=t(r),o=s.offset().top,l=s.outerHeight();e.push(o),n.push(o+l)}),this.tops=e,this.bottoms=n},getHorizontalIndex:function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getVerticalIndex:function(t){this.ensureBuilt();var e,n=this.tops,i=this.bottoms,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},getLeftOffset:function(t){return this.ensureBuilt(),this.lefts[t]},getLeftPosition:function(t){return this.ensureBuilt(),this.lefts[t]-this.origin.left},getRightOffset:function(t){return this.ensureBuilt(),this.rights[t]},getRightPosition:function(t){return this.ensureBuilt(),this.rights[t]-this.origin.left},getWidth:function(t){return this.ensureBuilt(),this.rights[t]-this.lefts[t]},getTopOffset:function(t){return this.ensureBuilt(),this.tops[t]},getTopPosition:function(t){return this.ensureBuilt(),this.tops[t]-this.origin.top},getBottomOffset:function(t){return this.ensureBuilt(),this.bottoms[t]},getBottomPosition:function(t){return this.ensureBuilt(),this.bottoms[t]-this.origin.top},getHeight:function(t){return this.ensureBuilt(),this.bottoms[t]-this.tops[t]},queryBoundingRect:function(){var t;return this.els.length>0&&(t=d(this.els.eq(0)),!t.is(document))?f(t):null},isPointInBounds:function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},isLeftInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.left&&t<this.boundingRect.right},isTopInBounds:function(t){return!this.boundingRect||t>=this.boundingRect.top&&t<this.boundingRect.bottom}}),ie=Ot.DragListener=ct.extend(te,{options:null,subjectEl:null,originX:null,originY:null,scrollEl:null,isInteracting:!1,isDistanceSurpassed:!1,isDelayEnded:!1,isDragging:!1,isTouch:!1,delay:null,delayTimeoutId:null,minDistance:null,shouldCancelTouchScroll:!0,scrollAlwaysKills:!1,constructor:function(t){this.options=t||{}},startInteraction:function(e,n){var i=D(e);if("mousedown"===e.type){if(se.get().shouldIgnoreMouse())return;if(!w(e))return;e.preventDefault()}this.isInteracting||(n=n||{},this.delay=J(n.delay,this.options.delay,0),this.minDistance=J(n.distance,this.options.distance,0),this.subjectEl=this.options.subjectEl,T(t("body")),this.isInteracting=!0,this.isTouch=i,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.originX=E(e),this.originY=b(e),this.scrollEl=d(t(e.target)),this.bindHandlers(),this.initAutoScroll(),this.handleInteractionStart(e),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e))},handleInteractionStart:function(t){this.trigger("interactionStart",t)},endInteraction:function(e,n){this.isInteracting&&(this.endDrag(e),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null),this.destroyAutoScroll(),this.unbindHandlers(),this.isInteracting=!1,this.handleInteractionEnd(e,n),C(t("body")))},handleInteractionEnd:function(t,e){this.trigger("interactionEnd",t,e||!1)},bindHandlers:function(){var t=se.get();this.isTouch?this.listenTo(t,{touchmove:this.handleTouchMove,touchend:this.endInteraction,scroll:this.handleTouchScroll}):this.listenTo(t,{mousemove:this.handleMouseMove,mouseup:this.endInteraction}),this.listenTo(t,{selectstart:H,contextmenu:H})},unbindHandlers:function(){this.stopListeningTo(se.get())},startDrag:function(t,e){this.startInteraction(t,e),this.isDragging||(this.isDragging=!0,this.handleDragStart(t))},handleDragStart:function(t){this.trigger("dragStart",t)},handleMove:function(t){var e,n=E(t)-this.originX,i=b(t)-this.originY,r=this.minDistance;this.isDistanceSurpassed||(e=n*n+i*i,e>=r*r&&this.handleDistanceSurpassed(t)),this.isDragging&&this.handleDrag(n,i,t)},handleDrag:function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},endDrag:function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},handleDragEnd:function(t){this.trigger("dragEnd",t)},startDelay:function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},handleDelayEnd:function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},handleDistanceSurpassed:function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},handleTouchMove:function(t){this.isDragging&&this.shouldCancelTouchScroll&&t.preventDefault(),this.handleMove(t)},handleMouseMove:function(t){this.handleMove(t)},handleTouchScroll:function(t){this.isDragging&&!this.scrollAlwaysKills||this.endInteraction(t,!0)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1)),this["_"+t]&&this["_"+t].apply(this,Array.prototype.slice.call(arguments,1))}});ie.mixin({isAutoScroll:!1,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,initAutoScroll:function(){var t=this.scrollEl;this.isAutoScroll=this.options.scroll&&t&&!t.is(window)&&!t.is(document),this.isAutoScroll&&this.listenTo(t,"scroll",at(this.handleDebouncedScroll,100))},destroyAutoScroll:function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},computeScrollBounds:function(){this.isAutoScroll&&(this.scrollBounds=h(this.scrollEl))},updateAutoScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(b(t)-o.top))/s,n=(s-(o.bottom-b(t)))/s,i=(s-(E(t)-o.left))/s,r=(s-(o.right-E(t)))/s,e>=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?a=i*this.scrollSpeed*-1:r>=0&&r<=1&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(lt(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},endAutoScroll:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},handleDebouncedScroll:function(){this.scrollIntervalId||this.handleScrollEnd()},handleScrollEnd:function(){}});var re=ie.extend({component:null,origHit:null,hit:null,coordAdjust:null,constructor:function(t,e){ie.call(this,e),this.component=t},handleInteractionStart:function(t){var e,n,i,r=this.subjectEl;this.component.hitsNeeded(),this.computeScrollBounds(),t?(n={left:E(t),top:b(t)},i=n,r&&(e=h(r),i=R(i,e)),this.origHit=this.queryHit(i.left,i.top),r&&this.options.subjectCenter&&(this.origHit&&(e=x(this.origHit,e)||e),i=I(e)),this.coordAdjust=k(i,n)):(this.origHit=null,this.coordAdjust=null),ie.prototype.handleInteractionStart.apply(this,arguments)},handleDragStart:function(t){var e;ie.prototype.handleDragStart.apply(this,arguments),e=this.queryHit(E(t),b(t)),e&&this.handleHitOver(e)},handleDrag:function(t,e,n){var i;ie.prototype.handleDrag.apply(this,arguments),i=this.queryHit(E(n),b(n)),pt(i,this.hit)||(this.hit&&this.handleHitOut(),i&&this.handleHitOver(i))},handleDragEnd:function(){this.handleHitDone(),ie.prototype.handleDragEnd.apply(this,arguments)},handleHitOver:function(t){var e=pt(t,this.origHit);this.hit=t,this.trigger("hitOver",this.hit,e,this.origHit)},handleHitOut:function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},handleHitDone:function(){this.hit&&this.trigger("hitDone",this.hit)},handleInteractionEnd:function(){ie.prototype.handleInteractionEnd.apply(this,arguments),this.origHit=null,this.hit=null,this.component.hitsNotNeeded()},handleScrollEnd:function(){ie.prototype.handleScrollEnd.apply(this,arguments),this.isDragging&&(this.component.releaseHits(),this.component.prepareHits())},queryHit:function(t,e){return this.coordAdjust&&(t+=this.coordAdjust.left,e+=this.coordAdjust.top),this.component.queryHit(t,e)}});Ot.touchMouseIgnoreWait=500;var se=ct.extend(te,Jt,{isTouching:!1,mouseIgnoreDepth:0,handleScrollProxy:null,bind:function(){var e=this;this.listenTo(t(document),{touchstart:this.handleTouchStart,touchcancel:this.handleTouchCancel,touchend:this.handleTouchEnd,mousedown:this.handleMouseDown,mousemove:this.handleMouseMove,mouseup:this.handleMouseUp,click:this.handleClick,selectstart:this.handleSelectStart,contextmenu:this.handleContextMenu}),window.addEventListener("touchmove",this.handleTouchMoveProxy=function(n){e.handleTouchMove(t.Event(n))},{passive:!1}),window.addEventListener("scroll",this.handleScrollProxy=function(n){e.handleScroll(t.Event(n))},!0)},unbind:function(){this.stopListeningTo(t(document)),window.removeEventListener("touchmove",this.handleTouchMoveProxy),window.removeEventListener("scroll",this.handleScrollProxy,!0)},handleTouchStart:function(t){this.stopTouch(t,!0),this.isTouching=!0,this.trigger("touchstart",t)},handleTouchMove:function(t){this.isTouching&&this.trigger("touchmove",t)},handleTouchCancel:function(t){this.isTouching&&(this.trigger("touchcancel",t),this.stopTouch(t))},handleTouchEnd:function(t){this.stopTouch(t)},handleMouseDown:function(t){this.shouldIgnoreMouse()||this.trigger("mousedown",t)},handleMouseMove:function(t){this.shouldIgnoreMouse()||this.trigger("mousemove",t)},handleMouseUp:function(t){this.shouldIgnoreMouse()||this.trigger("mouseup",t)},handleClick:function(t){this.shouldIgnoreMouse()||this.trigger("click",t)},handleSelectStart:function(t){this.trigger("selectstart",t)},handleContextMenu:function(t){this.trigger("contextmenu",t)},handleScroll:function(t){this.trigger("scroll",t)},stopTouch:function(t,e){this.isTouching&&(this.isTouching=!1,this.trigger("touchend",t),e||this.startTouchMouseIgnore())},startTouchMouseIgnore:function(){var t=this,e=Ot.touchMouseIgnoreWait;e&&(this.mouseIgnoreDepth++,setTimeout(function(){t.mouseIgnoreDepth--},e))},shouldIgnoreMouse:function(){return this.isTouching||Boolean(this.mouseIgnoreDepth)}});!function(){var t=null,e=0;se.get=function(){return t||(t=new se,t.bind()),t},se.needed=function(){se.get(),e++},se.unneeded=function(){e--,e||(t.unbind(),t=null)}}();var oe=ct.extend(te,{options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,y0:null,x0:null,topDelta:null,leftDelta:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()},start:function(e){this.isFollowing||(this.isFollowing=!0,this.y0=b(e),this.x0=E(e),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),D(e)?this.listenTo(t(document),"touchmove",this.handleMove):this.listenTo(t(document),"mousemove",this.handleMove))},stop:function(e,n){function i(){r.isAnimating=!1,r.removeElement(),r.top0=r.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(t(document)),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(t=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),t.addClass("fc-unselectable"),t.appendTo(this.parentEl)),t},removeElement:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},handleMove:function(t){this.topDelta=b(t)-this.y0,this.leftDelta=E(t)-this.x0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),le=Ot.Grid=ct.extend(te,{hasDayInteractions:!0,view:null,isRTL:null,start:null,end:null,el:null,elsByFill:null,eventTimeFormat:null,displayEventTime:null,displayEventEnd:null,minResizeDuration:null,largeUnit:null,dayClickListener:null,daySelectListener:null,segDragListener:null,segResizeListener:null,externalDragListener:null,constructor:function(t){this.view=t,this.isRTL=t.opt("isRTL"),this.elsByFill={},this.dayClickListener=this.buildDayClickListener(),this.daySelectListener=this.buildDaySelectListener()},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventTime:function(){return!0},computeDisplayEventEnd:function(){return!0},setRange:function(t){this.start=t.start.clone(),this.end=t.end.clone(),this.rangeUpdated(),this.processRangeOptions()},rangeUpdated:function(){},processRangeOptions:function(){var t,e,n=this.view;this.eventTimeFormat=n.opt("eventTimeFormat")||n.opt("timeFormat")||this.computeEventTimeFormat(),t=n.opt("displayEventTime"),null==t&&(t=this.computeDisplayEventTime()),e=n.opt("displayEventEnd"),null==e&&(e=this.computeDisplayEventEnd()),this.displayEventTime=t,this.displayEventEnd=e},spanToSegs:function(t){},diffDates:function(t,e){return this.largeUnit?O(t,e,this.largeUnit):z(t,e)},hitsNeededDepth:0,hitsNeeded:function(){this.hitsNeededDepth++||this.prepareHits()},hitsNotNeeded:function(){this.hitsNeededDepth&&!--this.hitsNeededDepth&&this.releaseHits()},prepareHits:function(){},releaseHits:function(){},queryHit:function(t,e){},getHitSpan:function(t){},getHitEl:function(t){},setElement:function(t){this.el=t,this.hasDayInteractions&&(T(t),this.bindDayHandler("touchstart",this.dayTouchStart),this.bindDayHandler("mousedown",this.dayMousedown)),this.bindSegHandlers(),this.bindGlobalHandlers()},bindDayHandler:function(e,n){var i=this;this.el.on(e,function(e){if(!t(e.target).is(i.segSelector+","+i.segSelector+" *,.fc-more,a[data-goto]"))return n.call(i,e)})},removeElement:function(){this.unbindGlobalHandlers(),this.clearDragListeners(),this.el.remove()},renderSkeleton:function(){},renderDates:function(){},unrenderDates:function(){},bindGlobalHandlers:function(){this.listenTo(t(document),{dragstart:this.externalDragStart,sortstart:this.externalDragStart})},unbindGlobalHandlers:function(){this.stopListeningTo(t(document))},dayMousedown:function(t){var e=this.view;e.isSelected||e.selectedEvent||(this.dayClickListener.startInteraction(t),e.opt("selectable")&&this.daySelectListener.startInteraction(t,{distance:e.opt("selectMinDistance")}))},dayTouchStart:function(t){var e,n=this.view;n.isSelected||n.selectedEvent||(e=n.opt("selectLongPressDelay"),null==e&&(e=n.opt("longPressDelay")),this.dayClickListener.startInteraction(t),n.opt("selectable")&&this.daySelectListener.startInteraction(t,{delay:e}))},buildDayClickListener:function(){var t,e=this,n=this.view,i=new re(this,{scroll:n.opt("dragScroll"),interactionStart:function(){t=i.origHit},hitOver:function(e,n,i){n||(t=null)},hitOut:function(){t=null},interactionEnd:function(i,r){!r&&t&&n.triggerDayClick(e.getHitSpan(t),e.getHitEl(t),i)}});return i.shouldCancelTouchScroll=!1,i.scrollAlwaysKills=!0,i},buildDaySelectListener:function(){var t,e=this,n=this.view,i=new re(this,{scroll:n.opt("dragScroll"),interactionStart:function(){t=null},dragStart:function(){n.unselect()},hitOver:function(n,i,r){r&&(t=e.computeSelection(e.getHitSpan(r),e.getHitSpan(n)),t?e.renderSelection(t):t===!1&&s())},hitOut:function(){t=null,e.unrenderSelection()},hitDone:function(){o()},interactionEnd:function(e,i){!i&&t&&n.reportSelection(t,e)}});return i},clearDragListeners:function(){this.dayClickListener.endInteraction(),this.daySelectListener.endInteraction(),this.segDragListener&&this.segDragListener.endInteraction(),this.segResizeListener&&this.segResizeListener.endInteraction(),this.externalDragListener&&this.externalDragListener.endInteraction()},renderEventLocationHelper:function(t,e){var n=this.fabricateHelperEvent(t,e);return this.renderHelper(n,e)},fabricateHelperEvent:function(t,e){var n=e?Z(e.event):{};return n.start=t.start.clone(),n.end=t.end?t.end.clone():null,n.allDay=null,this.view.calendar.normalizeEventDates(n),n.className=(n.className||[]).concat("fc-helper"),e||(n.editable=!1),n},renderHelper:function(t,e){},unrenderHelper:function(){},renderSelection:function(t){this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHighlight()},computeSelection:function(t,e){var n=this.computeSelectionSpan(t,e);return!(n&&!this.view.calendar.isSelectionSpanAllowed(n))&&n},computeSelectionSpan:function(t,e){var n=[t.start,t.end,e.start,e.end];return n.sort(st),{start:n[0].clone(),end:n[3].clone()}},renderHighlight:function(t){this.renderFill("highlight",this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderBusinessHours:function(){},unrenderBusinessHours:function(){},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},renderFill:function(t,e){},unrenderFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;i<n.length;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegCss"],r=n?n.call(this,e):[],s=nt(i?i.call(this,e):{});return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},getDayClasses:function(t,e){var n=this.view,i=n.calendar.getNow(),r=["fc-"+_t[t.day()]];return 1==n.intervalDuration.as("months")&&t.month()!=n.intervalStart.month()&&r.push("fc-other-month"),t.isSame(i,"day")?(r.push("fc-today"),e!==!0&&r.push(n.highlightStateClass)):t<i?r.push("fc-past"):r.push("fc-future"),r}});le.mixin({segSelector:".fc-event-container > *",mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,isDraggingExternal:!1,segs:null,renderEvents:function(t){var e,n=[],i=[];for(e=0;e<t.length;e++)(yt(t[e])?n:i).push(t[e]);this.segs=[].concat(this.renderBgEvents(n),this.renderFgEvents(i))},renderBgEvents:function(t){var e=this.eventsToSegs(t);return this.renderBgSegs(e)||e},renderFgEvents:function(t){var e=this.eventsToSegs(t);return this.renderFgSegs(e)||e},unrenderEvents:function(){this.handleSegMouseout(),this.clearDragListeners(),this.unrenderFgSegs(),this.unrenderBgSegs(),this.segs=null},getEventSegs:function(){return this.segs||[]},renderFgSegs:function(t){},unrenderFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;i<e.length;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(t,e){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},unrenderBgSegs:function(){this.unrenderFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegCss:function(t){return{"background-color":this.getSegSkinCss(t)["background-color"]}},businessHoursSegClasses:function(t){return["fc-nonbusiness","fc-bgevent"]},buildBusinessHourSegs:function(t,e){return this.eventsToSegs(this.buildBusinessHourEvents(t,e))},buildBusinessHourEvents:function(e,n){var i,r=this.view.calendar;return null==n&&(n=r.options.businessHours),i=r.computeBusinessHourEvents(e,n),!i.length&&n&&(i=[t.extend({},we,{start:this.view.end,end:this.view.end,dow:null})]),i},bindSegHandlers:function(){this.bindSegHandlersToEl(this.el)},bindSegHandlersToEl:function(t){this.bindSegHandlerToEl(t,"touchstart",this.handleSegTouchStart),this.bindSegHandlerToEl(t,"mouseenter",this.handleSegMouseover),this.bindSegHandlerToEl(t,"mouseleave",this.handleSegMouseout),this.bindSegHandlerToEl(t,"mousedown",this.handleSegMousedown),this.bindSegHandlerToEl(t,"click",this.handleSegClick)},bindSegHandlerToEl:function(e,n,i){var r=this;e.on(n,this.segSelector,function(e){var n=t(this).data("fc-seg");if(n&&!r.isDraggingSeg&&!r.isResizingSeg)return i.call(r,n,e)})},handleSegClick:function(t,e){var n=this.view.publiclyTrigger("eventClick",t.el[0],t.event,e);n===!1&&e.preventDefault()},handleSegMouseover:function(t,e){se.get().shouldIgnoreMouse()||this.mousedOverSeg||(this.mousedOverSeg=t,this.view.isEventResizable(t.event)&&t.el.addClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseover",t.el[0],t.event,e))},handleSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.isEventResizable(t.event)&&t.el.removeClass("fc-allow-mouse-resize"),this.view.publiclyTrigger("eventMouseout",t.el[0],t.event,e))},handleSegMousedown:function(t,e){var n=this.startSegResize(t,e,{distance:5});!n&&this.view.isEventDraggable(t.event)&&this.buildSegDragListener(t).startInteraction(e,{distance:5})},handleSegTouchStart:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventSelected(s),l=r.isEventDraggable(s),a=r.isEventResizable(s),u=!1;o&&a&&(u=this.startSegResize(t,e)),u||!l&&!a||(i=r.opt("eventLongPressDelay"),null==i&&(i=r.opt("longPressDelay")),n=l?this.buildSegDragListener(t):this.buildSegSelectListener(t),n.startInteraction(e,{delay:o?0:i}))},startSegResize:function(e,n,i){return!!t(n.target).is(".fc-resizer")&&(this.buildSegResizeListener(e,t(n.target).is(".fc-start-resizer")).startInteraction(n,i),!0)},buildSegDragListener:function(t){var e,n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event;if(this.segDragListener)return this.segDragListener;var d=this.segDragListener=new re(l,{scroll:l.opt("dragScroll"),subjectEl:u,subjectCenter:!0,interactionStart:function(i){t.component=r,e=!1,n=new oe(t.el,{additionalClass:"fc-dragging",parentEl:l.el,opacity:d.isTouch?null:l.opt("dragOpacity"),revertDuration:l.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){d.isTouch&&!l.isEventSelected(c)&&l.selectEvent(c),e=!0,r.handleSegMouseout(t,n),r.segDragStart(t,n),l.hideEvent(c)},hitOver:function(e,o,u){var h;t.hit&&(u=t.hit),i=r.computeEventDrop(u.component.getHitSpan(u),e.component.getHitSpan(e),c),i&&!a.isEventSpanAllowed(r.eventToSpan(i),c)&&(s(),i=null),i&&(h=l.renderDrag(i,t))?(h.addClass("fc-dragging"),d.isTouch||r.applyDragOpacity(h),n.hide()):n.show(),o&&(i=null)},hitOut:function(){l.unrenderDrag(),n.show(),i=null},hitDone:function(){o()},interactionEnd:function(s){delete t.component,n.stop(!i,function(){e&&(l.unrenderDrag(),r.segDragStop(t,s)),i?l.reportSegDrop(t,i,r.largeUnit,u,s):l.showEvent(c)}),r.segDragListener=null}});return d},buildSegSelectListener:function(t){var e=this,n=this.view,i=t.event;if(this.segDragListener)return this.segDragListener;var r=this.segDragListener=new ie({dragStart:function(t){r.isTouch&&!n.isEventSelected(i)&&n.selectEvent(i)},interactionEnd:function(t){e.segDragListener=null}});return r},segDragStart:function(t,e){this.isDraggingSeg=!0,this.view.publiclyTrigger("eventDragStart",t.el[0],t.event,e,{})},segDragStop:function(t,e){this.isDraggingSeg=!1,this.view.publiclyTrigger("eventDragStop",t.el[0],t.event,e,{})},computeEventDrop:function(t,e,n){var i,r,s=this.view.calendar,o=t.start,l=e.start;return o.hasTime()===l.hasTime()?(i=this.diffDates(l,o),n.allDay&&W(i)?(r={start:n.start.clone(),end:s.getEventEnd(n),allDay:!1},s.normalizeEventTimes(r)):r=mt(n),r.start.add(i),r.end&&r.end.add(i)):r={start:l.clone(),end:null,allDay:!l.hasTime()},r},applyDragOpacity:function(t){var e=this.view.opt("dragOpacity");null!=e&&t.css("opacity",e)},externalDragStart:function(e,n){var i,r,s=this.view;s.opt("droppable")&&(i=t((n?n.item:null)||e.target),r=s.opt("dropAccept"),(t.isFunction(r)?r.call(i[0],i):i.is(r))&&(this.isDraggingExternal||this.listenToExternalDrag(i,e,n)))},listenToExternalDrag:function(t,e,n){var i,r=this,l=this.view.calendar,a=Dt(t),u=r.externalDragListener=new re(this,{interactionStart:function(){r.isDraggingExternal=!0},hitOver:function(t){i=r.computeExternalDrop(t.component.getHitSpan(t),a),i&&!l.isExternalSpanAllowed(r.eventToSpan(i),i,a.eventProps)&&(s(),i=null),i&&r.renderDrag(i)},hitOut:function(){i=null},hitDone:function(){o(),r.unrenderDrag()},interactionEnd:function(e){i&&r.view.reportExternalDrop(a,i,t,e,n),r.isDraggingExternal=!1,r.externalDragListener=null}});u.startDrag(e)},computeExternalDrop:function(t,e){var n=this.view.calendar,i={start:n.applyTimezone(t.start),end:null};return e.startTime&&!i.start.hasTime()&&i.start.time(e.startTime),e.duration&&(i.end=i.start.clone().add(e.duration)),i},renderDrag:function(t,e){},unrenderDrag:function(){},buildSegResizeListener:function(t,e){var n,i,r=this,l=this.view,a=l.calendar,u=t.el,c=t.event,d=a.getEventEnd(c),h=this.segResizeListener=new re(this,{scroll:l.opt("dragScroll"),subjectEl:u,interactionStart:function(){n=!1},dragStart:function(e){n=!0,r.handleSegMouseout(t,e),r.segResizeStart(t,e)},hitOver:function(n,o,u){var h=r.getHitSpan(u),f=r.getHitSpan(n);i=e?r.computeEventStartResize(h,f,c):r.computeEventEndResize(h,f,c),i&&(a.isEventSpanAllowed(r.eventToSpan(i),c)?i.start.isSame(c.start.clone().stripZone())&&i.end.isSame(d.clone().stripZone())&&(i=null):(s(),i=null)),i&&(l.hideEvent(c),r.renderEventResize(i,t))},hitOut:function(){i=null,l.showEvent(c)},hitDone:function(){r.unrenderEventResize(),o()},interactionEnd:function(e){n&&r.segResizeStop(t,e),i?l.reportSegResize(t,i,r.largeUnit,u,e):l.showEvent(c),r.segResizeListener=null}});return h},segResizeStart:function(t,e){this.isResizingSeg=!0,this.view.publiclyTrigger("eventResizeStart",t.el[0],t.event,e,{})},segResizeStop:function(t,e){this.isResizingSeg=!1,this.view.publiclyTrigger("eventResizeStop",t.el[0],t.event,e,{})},computeEventStartResize:function(t,e,n){return this.computeEventResize("start",t,e,n)},computeEventEndResize:function(t,e,n){return this.computeEventResize("end",t,e,n)},computeEventResize:function(t,e,n,i){var r,s,o=this.view.calendar,l=this.diffDates(n[t],e[t]);return r={start:i.start.clone(),end:o.getEventEnd(i),allDay:i.allDay},r.allDay&&W(l)&&(r.allDay=!1,o.normalizeEventTimes(r)),r[t].add(l),r.start.isBefore(r.end)||(s=this.minResizeDuration||(i.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration),"start"==t?r.start=r.end.clone().subtract(s):r.end=r.start.clone().add(s)),
+r},renderEventResize:function(t,e){},unrenderEventResize:function(){},getEventTimeText:function(t,e,n){return null==e&&(e=this.eventTimeFormat),null==n&&(n=this.displayEventEnd),this.displayEventTime&&t.start.hasTime()?n&&t.end?this.view.formatRange(t,e):t.start.format(e):""},getSegClasses:function(t,e,n){var i=this.view,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(this.getSegCustomClasses(t));return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),i.isEventSelected(t.event)&&r.push("fc-selected"),r},getSegCustomClasses:function(t){var e=t.event;return[].concat(e.className,e.source?e.source.className:[])},getSegSkinCss:function(t){return{"background-color":this.getSegBackgroundColor(t),"border-color":this.getSegBorderColor(t),color:this.getSegTextColor(t)}},getSegBackgroundColor:function(t){return t.event.backgroundColor||t.event.color||this.getSegDefaultBackgroundColor(t)},getSegDefaultBackgroundColor:function(t){var e=t.event.source||{};return e.backgroundColor||e.color||this.view.opt("eventBackgroundColor")||this.view.opt("eventColor")},getSegBorderColor:function(t){return t.event.borderColor||t.event.color||this.getSegDefaultBorderColor(t)},getSegDefaultBorderColor:function(t){var e=t.event.source||{};return e.borderColor||e.color||this.view.opt("eventBorderColor")||this.view.opt("eventColor")},getSegTextColor:function(t){return t.event.textColor||this.getSegDefaultTextColor(t)},getSegDefaultTextColor:function(t){var e=t.event.source||{};return e.textColor||this.view.opt("eventTextColor")},eventToSegs:function(t){return this.eventsToSegs([t])},eventToSpan:function(t){return this.eventToSpans(t)[0]},eventToSpans:function(t){var e=this.eventToRange(t);return this.eventRangeToSpans(e,t)},eventsToSegs:function(e,n){var i=this,r=Et(e),s=[];return t.each(r,function(t,e){var r,o=[];for(r=0;r<e.length;r++)o.push(i.eventToRange(e[r]));if(St(e[0]))for(o=i.invertRanges(o),r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[0],n));else for(r=0;r<o.length;r++)s.push.apply(s,i.eventRangeToSegs(o[r],e[r],n))}),s},eventToRange:function(t){var e=this.view.calendar,n=t.start.clone().stripZone(),i=(t.end?t.end.clone():e.getDefaultEventEnd(null!=t.allDay?t.allDay:!t.start.hasTime(),t.start)).stripZone();return e.localizeMoment(n),e.localizeMoment(i),{start:n,end:i}},eventRangeToSegs:function(t,e,n){var i,r=this.eventRangeToSpans(t,e),s=[];for(i=0;i<r.length;i++)s.push.apply(s,this.eventSpanToSegs(r[i],e,n));return s},eventRangeToSpans:function(e,n){return[t.extend({},e)]},eventSpanToSegs:function(t,e,n){var i,r,s=n?n(t):this.spanToSegs(t);for(i=0;i<s.length;i++)r=s[i],r.event=e,r.eventStartMS=+t.start,r.eventDurationMS=t.end-t.start;return s},invertRanges:function(t){var e,n,i=this.view,r=i.start.clone(),s=i.end.clone(),o=[],l=r;for(t.sort(bt),e=0;e<t.length;e++)n=t[e],n.start>l&&o.push({start:l,end:n.start}),l=n.end;return l<s&&o.push({start:l,end:s}),o},sortEventSegs:function(t){t.sort(lt(this,"compareEventSegs"))},compareEventSegs:function(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||M(t.event,e.event,this.view.eventOrderSpecs)}}),Ot.pluckEventDateProps=mt,Ot.isBgEvent=yt,Ot.dataAttrPrefix="";var ae=Ot.DayTableMixin={breakOnWeeks:!1,dayDates:null,dayIndices:null,daysPerRow:null,rowCnt:null,colCnt:null,colHeadFormat:null,updateDayTable:function(){for(var t,e,n,i=this.view,r=this.start.clone(),s=-1,o=[],l=[];r.isBefore(this.end);)i.isHiddenDay(r)?o.push(s+.5):(s++,o.push(s),l.push(r.clone())),r.add(1,"days");if(this.breakOnWeeks){for(e=l[0].day(),t=1;t<l.length&&l[t].day()!=e;t++);n=Math.ceil(l.length/t)}else n=1,t=l.length;this.dayDates=l,this.dayIndices=o,this.daysPerRow=t,this.rowCnt=n,this.updateDayTableCols()},updateDayTableCols:function(){this.colCnt=this.computeColCnt(),this.colHeadFormat=this.view.opt("columnFormat")||this.computeColHeadFormat()},computeColCnt:function(){return this.daysPerRow},getCellDate:function(t,e){return this.dayDates[this.getCellDayIndex(t,e)].clone()},getCellRange:function(t,e){var n=this.getCellDate(t,e),i=n.clone().add(1,"days");return{start:n,end:i}},getCellDayIndex:function(t,e){return t*this.daysPerRow+this.getColDayIndex(e)},getColDayIndex:function(t){return this.isRTL?this.colCnt-1-t:t},getDateDayIndex:function(t){var e=this.dayIndices,n=t.diff(this.start,"days");return n<0?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},computeColHeadFormat:function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},sliceRangeByRow:function(t){var e,n,i,r,s,o=this.daysPerRow,l=this.view.computeDayRange(t),a=this.getDateDayIndex(l.start),u=this.getDateDayIndex(l.end.clone().subtract(1,"days")),c=[];for(e=0;e<this.rowCnt;e++)n=e*o,i=n+o-1,r=Math.max(a,n),s=Math.min(u,i),r=Math.ceil(r),s=Math.floor(s),r<=s&&c.push({row:e,firstRowDayIndex:r-n,lastRowDayIndex:s-n,isStart:r===a,isEnd:s===u});return c},sliceRangeByDay:function(t){var e,n,i,r,s,o,l=this.daysPerRow,a=this.view.computeDayRange(t),u=this.getDateDayIndex(a.start),c=this.getDateDayIndex(a.end.clone().subtract(1,"days")),d=[];for(e=0;e<this.rowCnt;e++)for(n=e*l,i=n+l-1,r=n;r<=i;r++)s=Math.max(u,r),o=Math.min(c,r),s=Math.ceil(s),o=Math.floor(o),s<=o&&d.push({row:e,firstRowDayIndex:s-n,lastRowDayIndex:o-n,isStart:s===u,isEnd:o===c});return d},renderHeadHtml:function(){var t=this.view;return'<div class="fc-row '+t.widgetHeaderClass+'"><table><thead>'+this.renderHeadTrHtml()+"</thead></table></div>"},renderHeadIntroHtml:function(){return this.renderIntroHtml()},renderHeadTrHtml:function(){return"<tr>"+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+"</tr>"},renderHeadDateCellsHtml:function(){var t,e,n=[];for(t=0;t<this.colCnt;t++)e=this.getCellDate(0,t),n.push(this.renderHeadDateCellHtml(e));return n.join("")},renderHeadDateCellHtml:function(t,e,n){var i=this.view,r=["fc-day-header",i.widgetHeaderClass];return 1===this.rowCnt?r=r.concat(this.getDayClasses(t,!0)):r.push("fc-"+_t[t.day()]),'<th class="'+r.join(" ")+'"'+(1===this.rowCnt?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e>1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+i.buildGotoAnchorHtml({date:t,forceOff:this.rowCnt>1||1===this.colCnt},tt(t.format(this.colHeadFormat)))+"</th>"},renderBgTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+"</tr>"},renderBgIntroHtml:function(t){return this.renderIntroHtml()},renderBgCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderBgCellHtml(n));return i.join("")},renderBgCellHtml:function(t,e){var n=this.view,i=this.getDayClasses(t);return i.unshift("fc-day",n.widgetContentClass),'<td class="'+i.join(" ")+'" data-date="'+t.format("YYYY-MM-DD")+'"'+(e?" "+e:"")+"></td>"},renderIntroHtml:function(){},bookendCells:function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))}},ue=Ot.DayGrid=le.extend(ae,{numbersVisible:!1,bottomCoordPadding:0,rowEls:null,cellEls:null,helperEls:null,rowCoordCache:null,colCoordCache:null,renderDates:function(t){var e,n,i=this.view,r=this.rowCnt,s=this.colCnt,o="";for(e=0;e<r;e++)o+=this.renderDayRowHtml(e,t);for(this.el.html(o),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day"),this.rowCoordCache=new ne({els:this.rowEls,isVertical:!0}),this.colCoordCache=new ne({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),e=0;e<r;e++)for(n=0;n<s;n++)i.publiclyTrigger("dayRender",null,this.getCellDate(e,n),this.getCellEl(e,n))},unrenderDates:function(){this.removeSegPopover()},renderBusinessHours:function(){var t=this.buildBusinessHourSegs(!0);this.renderFill("businessHours",t,"bgevent")},unrenderBusinessHours:function(){this.unrenderFill("businessHours")},renderDayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'"><div class="fc-bg"><table>'+this.renderBgTrHtml(t)+'</table></div><div class="fc-content-skeleton"><table>'+(this.numbersVisible?"<thead>"+this.renderNumberTrHtml(t)+"</thead>":"")+"</table></div></div>"},renderNumberTrHtml:function(t){return"<tr>"+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+"</tr>"},renderNumberIntroHtml:function(t){return this.renderIntroHtml()},renderNumberCellsHtml:function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderNumberCellHtml(n));return i.join("")},renderNumberCellHtml:function(t){var e,n,i="";return this.view.dayNumbersVisible||this.view.cellWeekNumbersVisible?(e=this.getDayClasses(t),e.unshift("fc-day-top"),this.view.cellWeekNumbersVisible&&(n="ISO"===t._locale._fullCalendar_weekCalc?1:t._locale.firstDayOfWeek()),i+='<td class="'+e.join(" ")+'" data-date="'+t.format()+'">',this.view.cellWeekNumbersVisible&&t.day()==n&&(i+=this.view.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),this.view.dayNumbersVisible&&(i+=this.view.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.date())),i+="</td>"):"<td/>"},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},rangeUpdated:function(){this.updateDayTable()},spanToSegs:function(t){var e,n,i=this.sliceRangeByRow(t);for(e=0;e<i.length;e++)n=i[e],this.isRTL?(n.leftCol=this.daysPerRow-1-n.lastRowDayIndex,n.rightCol=this.daysPerRow-1-n.firstRowDayIndex):(n.leftCol=n.firstRowDayIndex,n.rightCol=n.lastRowDayIndex);return i},prepareHits:function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},releaseHits:function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},queryHit:function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},getHitSpan:function(t){return this.getCellRange(t.row,t.col)},getHitEl:function(t){return this.getCellEl(t.row,t.col)},getCellHit:function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},getCellEl:function(t,e){return this.cellEls.eq(t*this.colCnt+e)},renderDrag:function(t,e){if(this.renderHighlight(this.eventToSpan(t)),e&&e.component!==this)return this.renderEventLocationHelper(t,e)},unrenderDrag:function(){this.unrenderHighlight(),this.unrenderHelper()},renderEventResize:function(t,e){return this.renderHighlight(this.eventToSpan(t)),this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHighlight(),this.unrenderHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventToSegs(e);return s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('<div class="fc-helper-skeleton"><table/></div>');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},unrenderHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n,i){var r,s,o,l=[];for(n=this.renderFillSegEls(e,n),r=0;r<n.length;r++)s=n[r],o=this.renderFillRow(e,s,i),this.rowEls.eq(s.row).append(o),l.push(o[0]);return this.elsByFill[e]=t(l),n},renderFillRow:function(e,n,i){var r,s,o=this.colCnt,l=n.leftCol,a=n.rightCol+1;return i=i||e.toLowerCase(),r=t('<div class="fc-'+i+'-skeleton"><table><tr/></table></div>'),s=r.find("tr"),l>0&&s.append('<td colspan="'+l+'"/>'),s.append(n.el.attr("colspan",a-l)),a<o&&s.append('<td colspan="'+(o-a)+'"/>'),this.bookendCells(s),r}});ue.mixin({rowStructs:null,unrenderEvents:function(){this.removeSegPopover(),le.prototype.unrenderEvents.apply(this,arguments)},getEventSegs:function(){return le.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return le.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},unrenderFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n<e.length;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i,r=this.view,s=t.event,o=r.isEventDraggable(s),l=!e&&s.allDay&&t.isStart&&r.isEventResizableFromStart(s),a=!e&&s.allDay&&t.isEnd&&r.isEventResizableFromEnd(s),u=this.getSegClasses(t,o,l||a),c=nt(this.getSegSkinCss(t)),d="";return u.unshift("fc-day-grid-event","fc-h-event"),t.isStart&&(n=this.getEventTimeText(s),n&&(d='<span class="fc-time">'+tt(n)+"</span>")),i='<span class="fc-title">'+(tt(s.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(s.url?' href="'+tt(s.url)+'"':"")+(c?' style="'+c+'"':"")+'><div class="fc-content">'+(this.isRTL?i+" "+d:d+" "+i)+"</div>"+(l?'<div class="fc-resizer fc-start-resizer" />':"")+(a?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},renderSegRow:function(e,n){function i(e){for(;o<e;)c=(m[r-1]||[])[o],c?c.attr("rowspan",parseInt(c.attr("rowspan")||1,10)+1):(c=t("<td/>"),l.append(c)),v[r][o]=c,m[r][o]=c,o++}var r,s,o,l,a,u,c,d=this.colCnt,h=this.buildSegLevels(n),f=Math.max(1,h.length),g=t("<tbody/>"),p=[],v=[],m=[];for(r=0;r<f;r++){if(s=h[r],o=0,l=t("<tr/>"),p.push([]),v.push([]),m.push([]),s)for(a=0;a<s.length;a++){for(u=s[a],i(u.leftCol),c=t('<td class="fc-event-container"/>').append(u.el),u.leftCol!=u.rightCol?c.attr("colspan",u.rightCol-u.leftCol+1):m[r][o]=c;o<=u.rightCol;)v[r][o]=c,p[r][o]=u,o++;l.append(c)}i(d),this.bookendCells(l),g.append(l)}return{row:e,tbodyEl:g,cellMatrix:v,segMatrix:p,segLevels:h,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(this.sortEventSegs(t),e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&Tt(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;i<r.length;i++)r[i].sort(Ct);return r},groupSegRows:function(t){var e,n=[];for(e=0;e<this.rowCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].row].push(t[e]);return n}}),ue.mixin({segPopover:null,popoverSegs:null,removeSegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;e<i.length;e++)this.unlimitRow(e),n=!!t&&("number"==typeof t?t:this.computeRowLevelLimit(e)),n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(e){function n(e,n){s=Math.max(s,t(n).outerHeight())}var i,r,s,o=this.rowEls.eq(e),l=o.height(),a=this.rowStructs[e].tbodyEl.children();for(i=0;i<a.length;i++)if(r=a.eq(i).removeClass("fc-limited"),s=0,r.find("> td > :first-child").each(n),r.position().top+s>l)return i;return!1},limitRow:function(e,n){function i(i){for(;b<i;)u=S.getCellSegs(e,b,n),u.length&&(h=s[n-1][b],y=S.renderMoreLink(e,b,u),m=t("<div/>").append(y),h.append(m),E.push(m[0])),b++}var r,s,o,l,a,u,c,d,h,f,g,p,v,m,y,S=this,w=this.rowStructs[e],E=[],b=0;if(n&&n<w.segLevels.length){for(r=w.segLevels[n-1],s=w.cellMatrix,o=w.tbodyEl.children().slice(n).addClass("fc-limited").get(),l=0;l<r.length;l++){for(a=r[l],i(a.leftCol),d=[],c=0;b<=a.rightCol;)u=this.getCellSegs(e,b,n),d.push(u),c+=u.length,b++;if(c){for(h=s[n-1][a.leftCol],f=h.attr("rowspan")||1,g=[],p=0;p<d.length;p++)v=t('<td class="fc-more-cell"/>').attr("rowspan",f),u=d[p],y=this.renderMoreLink(e,a.leftCol+p,[a].concat(u)),m=t("<div/>").append(y),v.append(m),g.push(v[0]),E.push(v[0]);h.addClass("fc-limited").after(t(g)),o.push(h[0])}}i(this.colCnt),w.moreEls=t(E),w.limitedEls=t(o)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n,i){var r=this,s=this.view;return t('<a class="fc-more"/>').text(this.getMoreLinkText(i.length)).on("click",function(o){var l=s.opt("eventLimitClick"),a=r.getCellDate(e,n),u=t(this),c=r.getCellEl(e,n),d=r.getCellSegs(e,n),h=r.resliceDaySegs(d,a),f=r.resliceDaySegs(i,a);"function"==typeof l&&(l=s.publiclyTrigger("eventLimitClick",null,{date:a,dayEl:c,moreEl:u,segs:h,hiddenSegs:f},o)),"popover"===l?r.showSegPopover(e,n,u,h):"string"==typeof l&&s.calendar.zoomTo(a,l)})},showSegPopover:function(t,e,n,i){var r,s,o=this,l=this.view,a=n.parent();r=1==this.rowCnt?l.el:this.rowEls.eq(t),s={className:"fc-more-popover",content:this.renderSegPopoverContent(t,e,i),parentEl:this.view.el,top:r.offset().top,autoHide:!0,viewportConstrain:l.opt("popoverViewportConstrain"),hide:function(){if(o.popoverSegs)for(var t,e=0;e<o.popoverSegs.length;++e)t=o.popoverSegs[e],l.publiclyTrigger("eventDestroy",t.event,t.event,t.el);o.segPopover.removeElement(),o.segPopover=null,o.popoverSegs=null}},this.isRTL?s.right=a.offset().left+a.outerWidth()+1:s.left=a.offset().left-1,this.segPopover=new ee(s),this.segPopover.show(),this.bindSegHandlersToEl(this.segPopover.el)},renderSegPopoverContent:function(e,n,i){var r,s=this.view,o=s.opt("theme"),l=this.getCellDate(e,n).format(s.opt("dayPopoverFormat")),a=t('<div class="fc-header '+s.widgetHeaderClass+'"><span class="fc-close '+(o?"ui-icon ui-icon-closethick":"fc-icon fc-icon-x")+'"></span><span class="fc-title">'+tt(l)+'</span><div class="fc-clear"/></div><div class="fc-body '+s.widgetContentClass+'"><div class="fc-event-container"></div></div>'),u=a.find(".fc-event-container");for(i=this.renderFgSegEls(i,!0),this.popoverSegs=i,r=0;r<i.length;r++)this.hitsNeeded(),i[r].hit=this.getCellHit(e,n),this.hitsNotNeeded(),u.append(i[r].el);return a},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone(),s=r.clone().add(1,"days"),o={start:r,end:s};return e=this.eventsToSegs(i,function(t){var e=F(t,o);return e?[e]:[]}),this.sortEventSegs(e),e},getMoreLinkText:function(t){var e=this.view.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},getCellSegs:function(t,e,n){for(var i,r=this.rowStructs[t].segMatrix,s=n||0,o=[];s<r.length;)i=r[s][e],i&&o.push(i),s++;return o}});var ce=Ot.TimeGrid=le.extend(ae,{slotDuration:null,snapDuration:null,snapsPerSlot:null,minTime:null,maxTime:null,labelFormat:null,labelInterval:null,colEls:null,slatContainerEl:null,slatEls:null,nowIndicatorEls:null,colCoordCache:null,slatCoordCache:null,constructor:function(){le.apply(this,arguments),this.processOptions()},renderDates:function(){this.el.html(this.renderHtml()),this.colEls=this.el.find(".fc-day"),this.slatContainerEl=this.el.find(".fc-slats"),this.slatEls=this.slatContainerEl.find("tr"),this.colCoordCache=new ne({els:this.colEls,isHorizontal:!0}),this.slatCoordCache=new ne({els:this.slatEls,isVertical:!0}),this.renderContentSkeleton()},renderHtml:function(){return'<div class="fc-bg"><table>'+this.renderBgTrHtml(0)+'</table></div><div class="fc-slats"><table>'+this.renderSlatRowHtml()+"</table></div>"},renderSlatRowHtml:function(){for(var t,n,i,r=this.view,s=this.isRTL,o="",l=e.duration(+this.minTime);l<this.maxTime;)t=this.start.clone().time(l),n=ot(_(l,this.labelInterval)),i='<td class="fc-axis fc-time '+r.widgetContentClass+'" '+r.axisStyleAttr()+">"+(n?"<span>"+tt(t.format(this.labelFormat))+"</span>":"")+"</td>",o+='<tr data-time="'+t.format("HH:mm:ss")+'"'+(n?"":' class="fc-minor"')+">"+(s?"":i)+'<td class="'+r.widgetContentClass+'"/>'+(s?i:"")+"</tr>",l.add(this.slotDuration);return o},processOptions:function(){var n,i=this.view,r=i.opt("slotDuration"),s=i.opt("snapDuration");r=e.duration(r),s=s?e.duration(s):r,this.slotDuration=r,this.snapDuration=s,this.snapsPerSlot=r/s,this.minResizeDuration=s,this.minTime=e.duration(i.opt("minTime")),this.maxTime=e.duration(i.opt("maxTime")),n=i.opt("slotLabelFormat"),t.isArray(n)&&(n=n[n.length-1]),this.labelFormat=n||i.opt("smallTimeFormat"),n=i.opt("slotLabelInterval"),this.labelInterval=n?e.duration(n):this.computeLabelInterval(r)},computeLabelInterval:function(t){var n,i,r;for(n=Re.length-1;n>=0;n--)if(i=e.duration(Re[n]),r=_(i,t),ot(r)&&r>1)return i;return e.duration(t)},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},prepareHits:function(){this.colCoordCache.build(),this.slatCoordCache.build()},releaseHits:function(){this.colCoordCache.clear()},queryHit:function(t,e){var n=this.snapsPerSlot,i=this.colCoordCache,r=this.slatCoordCache;if(i.isLeftInBounds(t)&&r.isTopInBounds(e)){var s=i.getHorizontalIndex(t),o=r.getVerticalIndex(e);if(null!=s&&null!=o){var l=r.getTopOffset(o),a=r.getHeight(o),u=(e-l)/a,c=Math.floor(u*n),d=o*n+c,h=l+c/n*a,f=l+(c+1)/n*a;return{col:s,snap:d,component:this,left:i.getLeftOffset(s),right:i.getRightOffset(s),top:h,bottom:f}}}},getHitSpan:function(t){var e,n=this.getCellDate(0,t.col),i=this.computeSnapTime(t.snap);return n.time(i),e=n.clone().add(this.snapDuration),{start:n,end:e}},getHitEl:function(t){return this.colEls.eq(t.col)},rangeUpdated:function(){this.updateDayTable()},computeSnapTime:function(t){return e.duration(this.minTime+this.snapDuration*t)},spanToSegs:function(t){var e,n=this.sliceRangeByTimes(t);for(e=0;e<n.length;e++)this.isRTL?n[e].col=this.daysPerRow-1-n[e].dayIndex:n[e].col=n[e].dayIndex;return n},sliceRangeByTimes:function(t){var e,n,i,r,s=[];for(n=0;n<this.daysPerRow;n++)i=this.dayDates[n].clone(),r={start:i.clone().time(this.minTime),end:i.clone().time(this.maxTime)},e=F(t,r),e&&(e.dayIndex=n,s.push(e));return s},updateSize:function(t){this.slatCoordCache.build(),t&&this.updateSegVerticals([].concat(this.fgSegs||[],this.bgSegs||[],this.businessSegs||[]))},getTotalSlatHeight:function(){return this.slatContainerEl.outerHeight()},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i=this.slatEls.length,r=(t-this.minTime)/this.slotDuration;return r=Math.max(0,r),r=Math.min(i,r),e=Math.floor(r),e=Math.min(e,i-1),n=r-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},renderDrag:function(t,e){return e?this.renderEventLocationHelper(t,e):void this.renderHighlight(this.eventToSpan(t))},unrenderDrag:function(){this.unrenderHelper(),this.unrenderHighlight()},renderEventResize:function(t,e){return this.renderEventLocationHelper(t,e)},unrenderEventResize:function(){this.unrenderHelper()},renderHelper:function(t,e){return this.renderHelperSegs(this.eventToSegs(t),e)},unrenderHelper:function(){this.unrenderHelperSegs()},renderBusinessHours:function(){this.renderBusinessSegs(this.buildBusinessHourSegs())},unrenderBusinessHours:function(){this.unrenderBusinessSegs()},getNowIndicatorUnit:function(){return"minute"},renderNowIndicator:function(e){var n,i=this.spanToSegs({start:e,end:e}),r=this.computeDateTop(e,e),s=[];for(n=0;n<i.length;n++)s.push(t('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top",r).appendTo(this.colContainerEls.eq(i[n].col))[0]);i.length>0&&s.push(t('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top",r).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=t(s)},unrenderNowIndicator:function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},renderSelection:function(t){this.view.opt("selectHelper")?this.renderEventLocationHelper(t):this.renderHighlight(t)},unrenderSelection:function(){this.unrenderHelper(),this.unrenderHighlight()},renderHighlight:function(t){this.renderHighlightSegs(this.spanToSegs(t))},unrenderHighlight:function(){this.unrenderHighlightSegs()}});ce.mixin({colContainerEls:null,fgContainerEls:null,bgContainerEls:null,helperContainerEls:null,highlightContainerEls:null,businessContainerEls:null,fgSegs:null,bgSegs:null,helperSegs:null,highlightSegs:null,businessSegs:null,renderContentSkeleton:function(){var e,n,i="";for(e=0;e<this.colCnt;e++)i+='<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';n=t('<div class="fc-content-skeleton"><table><tr>'+i+"</tr></table></div>"),this.colContainerEls=n.find(".fc-content-col"),this.helperContainerEls=n.find(".fc-helper-container"),this.fgContainerEls=n.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=n.find(".fc-bgevent-container"),this.highlightContainerEls=n.find(".fc-highlight-container"),this.businessContainerEls=n.find(".fc-business-container"),this.bookendCells(n.find("tr")),this.el.append(n)},renderFgSegs:function(t){return t=this.renderFgSegsIntoContainers(t,this.fgContainerEls),this.fgSegs=t,t},unrenderFgSegs:function(){this.unrenderNamedSegs("fgSegs")},renderHelperSegs:function(e,n){var i,r,s,o=[];for(e=this.renderFgSegsIntoContainers(e,this.helperContainerEls),i=0;i<e.length;i++)r=e[i],n&&n.col===r.col&&(s=n.el,r.el.css({left:s.css("left"),right:s.css("right"),"margin-left":s.css("margin-left"),"margin-right":s.css("margin-right")})),o.push(r.el[0]);return this.helperSegs=e,t(o)},unrenderHelperSegs:function(){this.unrenderNamedSegs("helperSegs")},renderBgSegs:function(t){return t=this.renderFillSegEls("bgEvent",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.bgContainerEls),this.bgSegs=t,t},unrenderBgSegs:function(){this.unrenderNamedSegs("bgSegs")},renderHighlightSegs:function(t){t=this.renderFillSegEls("highlight",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.highlightContainerEls),this.highlightSegs=t},unrenderHighlightSegs:function(){this.unrenderNamedSegs("highlightSegs")},renderBusinessSegs:function(t){t=this.renderFillSegEls("businessHours",t),this.updateSegVerticals(t),this.attachSegsByCol(this.groupSegsByCol(t),this.businessContainerEls),this.businessSegs=t},unrenderBusinessSegs:function(){this.unrenderNamedSegs("businessSegs")},groupSegsByCol:function(t){var e,n=[];for(e=0;e<this.colCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].col].push(t[e]);return n},attachSegsByCol:function(t,e){var n,i,r;for(n=0;n<this.colCnt;n++)for(i=t[n],r=0;r<i.length;r++)e.eq(n).append(i[r].el)},unrenderNamedSegs:function(t){var e,n=this[t];if(n){for(e=0;e<n.length;e++)n[e].el.remove();this[t]=null}},renderFgSegsIntoContainers:function(t,e){var n,i;for(t=this.renderFgSegEls(t),n=this.groupSegsByCol(t),i=0;i<this.colCnt;i++)this.updateFgSegCoords(n[i]);return this.attachSegsByCol(n,e),t},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isStart&&s.isEventResizableFromStart(o),u=!e&&t.isEnd&&s.isEventResizableFromEnd(o),c=this.getSegClasses(t,l,a||u),d=nt(this.getSegSkinCss(t));return c.unshift("fc-time-grid-event","fc-v-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=this.getEventTimeText(t),i=this.getEventTimeText(t,"LT"),r=this.getEventTimeText(t,null,!1)):(n=this.getEventTimeText(o),i=this.getEventTimeText(o,"LT"),r=this.getEventTimeText(o,null,!1)),'<a class="'+c.join(" ")+'"'+(o.url?' href="'+tt(o.url)+'"':"")+(d?' style="'+d+'"':"")+'><div class="fc-content">'+(n?'<div class="fc-time" data-start="'+tt(r)+'" data-full="'+tt(i)+'"><span>'+tt(n)+"</span></div>":"")+(o.title?'<div class="fc-title">'+tt(o.title)+"</div>":"")+'</div><div class="fc-bg"/>'+(u?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},updateSegVerticals:function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},computeSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},assignSegVerticals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateSegVerticalCss(n))},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},updateFgSegCoords:function(t){this.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.assignSegVerticals(t),this.assignFgSegHorizontals(t)},computeFgSegHorizontals:function(t){var e,n,i;if(this.sortEventSegs(t),e=Ht(t),xt(e),n=e[0]){for(i=0;i<n.length;i++)Rt(n[i]);for(i=0;i<n.length;i++)this.computeFgSegForwardBack(n[i],0,0)}},computeFgSegForwardBack:function(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(this.sortForwardSegs(r),this.computeFgSegForwardBack(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;i<r.length;i++)this.computeFgSegForwardBack(r[i],0,t.forwardCoord)},sortForwardSegs:function(t){t.sort(lt(this,"compareForwardSegs"))},compareForwardSegs:function(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||this.compareEventSegs(t,e)},assignFgSegHorizontals:function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateFgSegHorizontalCss(n)),n.bottom-n.top<30&&n.el.addClass("fc-short")},generateFgSegHorizontalCss:function(t){var e,n,i=this.view.opt("slotEventOverlap"),r=t.backwardCoord,s=t.forwardCoord,o=this.generateSegVerticalCss(t);return i&&(s=Math.min(1,r+2*(s-r))),this.isRTL?(e=1-s,n=r):(e=r,n=1-s),o.zIndex=t.level+1,o.left=100*e+"%",o.right=100*n+"%",i&&t.forwardPressure&&(o[this.isRTL?"marginLeft":"marginRight"]=20),o}});var de=Ot.View=ct.extend(Jt,te,{type:null,name:null,title:null,calendar:null,options:null,el:null,isDateSet:!1,isDateRendered:!1,dateRenderQueue:null,isEventsBound:!1,isEventsSet:!1,isEventsRendered:!1,eventRenderQueue:null,start:null,end:null,intervalStart:null,intervalEnd:null,intervalDuration:null,intervalUnit:null,isRTL:!1,isSelected:!1,selectedEvent:null,eventOrderSpecs:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,nextDayThreshold:null,isHiddenDayHash:null,isNowIndicatorRendered:null,initialNowDate:null,initialNowQueriedMs:null,nowIndicatorTimeoutID:null,nowIndicatorIntervalID:null,constructor:function(t,n,i,r){this.calendar=t,this.type=this.name=n,this.options=i,this.intervalDuration=r||e.duration(1,"day"),this.nextDayThreshold=e.duration(this.opt("nextDayThreshold")),this.initThemingProps(),this.initHiddenDays(),this.isRTL=this.opt("isRTL"),this.eventOrderSpecs=L(this.opt("eventOrder")),this.dateRenderQueue=new gt,this.eventRenderQueue=new gt(this.opt("eventRenderWait")),this.initialize()},initialize:function(){},opt:function(t){return this.options[t]},publiclyTrigger:function(t,e){var n=this.calendar;return n.publiclyTrigger.apply(n,[t,e||this].concat(Array.prototype.slice.call(arguments,2),[this]))},rejectOn:function(t,e){var n=this;return new ft(function(i,r){function s(){n.off(t,r)}n.one(t,r),e.then(function(t){s(),i(t)},function(){s(),r()})})},setRange:function(e){t.extend(this,e),this.updateTitle()},computeRange:function(t){var e,n,i=A(this.intervalDuration),r=t.clone().startOf(i),s=r.clone().add(this.intervalDuration);return/year|month|week|day/.test(i)?(r.stripTime(),s.stripTime()):(r.hasTime()||(r=this.calendar.time(0)),s.hasTime()||(s=this.calendar.time(0))),e=r.clone(),e=this.skipHiddenDays(e),n=s.clone(),n=this.skipHiddenDays(n,-1,!0),{intervalUnit:i,intervalStart:r,intervalEnd:s,start:e,end:n}},computePrevDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).subtract(this.intervalDuration),-1)},computeNextDate:function(t){return this.massageCurrentDate(t.clone().startOf(this.intervalUnit).add(this.intervalDuration))},massageCurrentDate:function(t,e){return this.intervalDuration.as("days")<=1&&this.isHiddenDay(t)&&(t=this.skipHiddenDays(t,e),t.startOf("day")),t},updateTitle:function(){this.title=this.computeTitle(),this.calendar.setToolbarsTitle(this.title)},computeTitle:function(){var t,e;return"year"===this.intervalUnit||"month"===this.intervalUnit?(t=this.intervalStart,
+e=this.intervalEnd):(t=this.start,e=this.end),this.formatRange({start:this.calendar.applyTimezone(t),end:this.calendar.applyTimezone(e)},this.opt("titleFormat")||this.computeTitleFormat(),this.opt("titleRangeSeparator"))},computeTitleFormat:function(){return"year"==this.intervalUnit?"YYYY":"month"==this.intervalUnit?this.opt("monthYearFormat"):this.intervalDuration.as("days")>1?"ll":"LL"},formatRange:function(t,e,n){var i=t.end;return i.hasTime()||(i=i.clone().subtract(1)),Xt(t.start,i,e,n,this.opt("isRTL"))},getAllDayHtml:function(){return this.opt("allDayHtml")||tt(this.opt("allDayText"))},buildGotoAnchorHtml:function(e,n,i){var r,s,o,l;return t.isPlainObject(e)?(r=e.date,s=e.type,o=e.forceOff):r=e,r=Ot.moment(r),l={date:r.format("YYYY-MM-DD"),type:s||"day"},"string"==typeof n&&(i=n,n=null),n=n?" "+it(n):"",i=i||"",!o&&this.opt("navLinks")?"<a"+n+' data-goto="'+tt(JSON.stringify(l))+'">'+i+"</a>":"<span"+n+">"+i+"</span>"},setElement:function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton()},removeElement:function(){this.unsetDate(),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},renderSkeleton:function(){},unrenderSkeleton:function(){},setDate:function(t){var e=this.isDateSet;this.isDateSet=!0,this.handleDate(t,e),this.trigger(e?"dateReset":"dateSet",t)},unsetDate:function(){this.isDateSet&&(this.isDateSet=!1,this.handleDateUnset(),this.trigger("dateUnset"))},handleDate:function(t,e){var n=this;this.unbindEvents(),this.requestDateRender(t).then(function(){n.bindEvents()})},handleDateUnset:function(){this.unbindEvents(),this.requestDateUnrender()},requestDateRender:function(t){var e=this;return this.dateRenderQueue.add(function(){return e.executeDateRender(t)})},requestDateUnrender:function(){var t=this;return this.dateRenderQueue.add(function(){return t.executeDateUnrender()})},executeDateRender:function(t){var e=this;return t?this.captureInitialScroll():this.captureScroll(),this.freezeHeight(),this.executeDateUnrender().then(function(){t&&e.setRange(e.computeRange(t)),e.render&&e.render(),e.renderDates(),e.updateSize(),e.renderBusinessHours(),e.startNowIndicator(),e.thawHeight(),e.releaseScroll(),e.isDateRendered=!0,e.onDateRender(),e.trigger("dateRender")})},executeDateUnrender:function(){var t=this;return t.isDateRendered?this.requestEventsUnrender().then(function(){t.unselect(),t.stopNowIndicator(),t.triggerUnrender(),t.unrenderBusinessHours(),t.unrenderDates(),t.destroy&&t.destroy(),t.isDateRendered=!1,t.trigger("dateUnrender")}):ft.resolve()},onDateRender:function(){this.triggerRender()},renderDates:function(){},unrenderDates:function(){},triggerRender:function(){this.publiclyTrigger("viewRender",this,this,this.el)},triggerUnrender:function(){this.publiclyTrigger("viewDestroy",this,this,this.el)},bindGlobalHandlers:function(){this.listenTo(se.get(),{touchstart:this.processUnselect,mousedown:this.handleDocumentMousedown})},unbindGlobalHandlers:function(){this.stopListeningTo(se.get())},initThemingProps:function(){var t=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=t+"-widget-header",this.widgetContentClass=t+"-widget-content",this.highlightStateClass=t+"-state-highlight"},renderBusinessHours:function(){},unrenderBusinessHours:function(){},startNowIndicator:function(){var t,n,i,r=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(),t&&(n=lt(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=+new Date,this.renderNowIndicator(this.initialNowDate),this.isNowIndicatorRendered=!0,i=this.initialNowDate.clone().startOf(t).add(1,t)-this.initialNowDate,this.nowIndicatorTimeoutID=setTimeout(function(){r.nowIndicatorTimeoutID=null,n(),i=+e.duration(1,t),i=Math.max(100,i),r.nowIndicatorIntervalID=setInterval(n,i)},i)))},updateNowIndicator:function(){this.isNowIndicatorRendered&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add(new Date-this.initialNowQueriedMs)))},stopNowIndicator:function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearTimeout(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},getNowIndicatorUnit:function(){},renderNowIndicator:function(t){},unrenderNowIndicator:function(){},updateSize:function(t){t&&this.captureScroll(),this.updateHeight(t),this.updateWidth(t),this.updateNowIndicator(),t&&this.releaseScroll()},updateWidth:function(t){},updateHeight:function(t){var e=this.calendar;this.setHeight(e.getSuggestedViewHeight(),e.isHeightAuto())},setHeight:function(t,e){},capturedScroll:null,capturedScrollDepth:0,captureScroll:function(){return!this.capturedScrollDepth++&&(this.capturedScroll=this.isDateRendered?this.queryScroll():{},!0)},captureInitialScroll:function(e){this.captureScroll()&&(this.capturedScroll.isInitial=!0,e?t.extend(this.capturedScroll,e):this.capturedScroll.isComputed=!0)},releaseScroll:function(){var e=this.capturedScroll,n=this.discardScroll();e.isComputed&&(n?t.extend(e,this.computeInitialScroll()):e=null),e&&(e.isInitial?this.hardSetScroll(e):this.setScroll(e))},discardScroll:function(){return!--this.capturedScrollDepth&&(this.capturedScroll=null,!0)},computeInitialScroll:function(){return{}},queryScroll:function(){return{}},hardSetScroll:function(t){var e=this,n=function(){e.setScroll(t)};n(),setTimeout(n,0)},setScroll:function(t){},freezeHeight:function(){this.calendar.freezeContentHeight()},thawHeight:function(){this.calendar.thawContentHeight()},bindEvents:function(){var t=this;this.isEventsBound||(this.isEventsBound=!0,this.rejectOn("eventsUnbind",this.requestEvents()).then(function(e){t.listenTo(t.calendar,"eventsReset",t.setEvents),t.setEvents(e)}))},unbindEvents:function(){this.isEventsBound&&(this.isEventsBound=!1,this.stopListeningTo(this.calendar,"eventsReset"),this.unsetEvents(),this.trigger("eventsUnbind"))},setEvents:function(t){var e=this.isEventSet;this.isEventsSet=!0,this.handleEvents(t,e),this.trigger(e?"eventsReset":"eventsSet",t)},unsetEvents:function(){this.isEventsSet&&(this.isEventsSet=!1,this.handleEventsUnset(),this.trigger("eventsUnset"))},whenEventsSet:function(){var t=this;return this.isEventsSet?ft.resolve(this.getCurrentEvents()):new ft(function(e){t.one("eventsSet",e)})},handleEvents:function(t,e){this.requestEventsRender(t)},handleEventsUnset:function(){this.requestEventsUnrender()},requestEventsRender:function(t){var e=this;return this.eventRenderQueue.add(function(){return e.executeEventsRender(t)})},requestEventsUnrender:function(){var t=this;return this.isEventsRendered?this.eventRenderQueue.addQuickly(function(){return t.executeEventsUnrender()}):ft.resolve()},requestCurrentEventsRender:function(){return this.isEventsSet?void this.requestEventsRender(this.getCurrentEvents()):ft.reject()},executeEventsRender:function(t){var e=this;return this.captureScroll(),this.freezeHeight(),this.executeEventsUnrender().then(function(){e.renderEvents(t),e.thawHeight(),e.releaseScroll(),e.isEventsRendered=!0,e.onEventsRender(),e.trigger("eventsRender")})},executeEventsUnrender:function(){return this.isEventsRendered&&(this.onBeforeEventsUnrender(),this.captureScroll(),this.freezeHeight(),this.destroyEvents&&this.destroyEvents(),this.unrenderEvents(),this.thawHeight(),this.releaseScroll(),this.isEventsRendered=!1,this.trigger("eventsUnrender")),ft.resolve()},onEventsRender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventAfterRender",t.event,t.event,t.el)}),this.publiclyTrigger("eventAfterAllRender")},onBeforeEventsUnrender:function(){this.renderedEventSegEach(function(t){this.publiclyTrigger("eventDestroy",t.event,t.event,t.el)})},renderEvents:function(t){},unrenderEvents:function(){},requestEvents:function(){return this.calendar.requestEvents(this.start,this.end)},getCurrentEvents:function(){return this.calendar.getPrunedEventCache()},resolveEventEl:function(e,n){var i=this.publiclyTrigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.renderedEventSegEach(function(t){t.el.css("visibility","hidden")},t)},renderedEventSegEach:function(t,e){var n,i=this.getEventSegs();for(n=0;n<i.length;n++)e&&i[n].event._id!==e._id||i[n].el&&t.call(this,i[n])},getEventSegs:function(){return[]},isEventDraggable:function(t){return this.isEventStartEditable(t)},isEventStartEditable:function(t){return J(t.startEditable,(t.source||{}).startEditable,this.opt("eventStartEditable"),this.isEventGenerallyEditable(t))},isEventGenerallyEditable:function(t){return J(t.editable,(t.source||{}).editable,this.opt("editable"))},reportSegDrop:function(t,e,n,i,r){var s=this.calendar,o=s.mutateSeg(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventDrop(t.event,o.dateDelta,l,i,r),s.reportEventChange()},triggerEventDrop:function(t,e,n,i,r){this.publiclyTrigger("eventDrop",i[0],t,e,n,r,{})},reportExternalDrop:function(e,n,i,r,s){var o,l,a=e.eventProps;a&&(o=t.extend({},a,n),l=this.calendar.renderEvent(o,e.stick)[0]),this.triggerExternalDrop(l,n,i,r,s)},triggerExternalDrop:function(t,e,n,i,r){this.publiclyTrigger("drop",n[0],e.start,i,r),t&&this.publiclyTrigger("eventReceive",null,t)},renderDrag:function(t,e){},unrenderDrag:function(){},isEventResizableFromStart:function(t){return this.opt("eventResizableFromStart")&&this.isEventResizable(t)},isEventResizableFromEnd:function(t){return this.isEventResizable(t)},isEventResizable:function(t){var e=t.source||{};return J(t.durationEditable,e.durationEditable,this.opt("eventDurationEditable"),t.editable,e.editable,this.opt("editable"))},reportSegResize:function(t,e,n,i,r){var s=this.calendar,o=s.mutateSeg(t,e,n),l=function(){o.undo(),s.reportEventChange()};this.triggerEventResize(t.event,o.durationDelta,l,i,r),s.reportEventChange()},triggerEventResize:function(t,e,n,i,r){this.publiclyTrigger("eventResize",i[0],t,e,n,r,{})},select:function(t,e){this.unselect(e),this.renderSelection(t),this.reportSelection(t,e)},renderSelection:function(t){},reportSelection:function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},triggerSelect:function(t,e){this.publiclyTrigger("select",null,this.calendar.applyTimezone(t.start),this.calendar.applyTimezone(t.end),e)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",null,t))},unrenderSelection:function(){},selectEvent:function(t){this.selectedEvent&&this.selectedEvent===t||(this.unselectEvent(),this.renderedEventSegEach(function(t){t.el.addClass("fc-selected")},t),this.selectedEvent=t)},unselectEvent:function(){this.selectedEvent&&(this.renderedEventSegEach(function(t){t.el.removeClass("fc-selected")},this.selectedEvent),this.selectedEvent=null)},isEventSelected:function(t){return this.selectedEvent&&this.selectedEvent._id===t._id},handleDocumentMousedown:function(t){w(t)&&this.processUnselect(t)},processUnselect:function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},processRangeUnselect:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))},processEventUnselect:function(e){this.selectedEvent&&(t(e.target).closest(".fc-selected").length||this.unselectEvent())},triggerDayClick:function(t,e,n){this.publiclyTrigger("dayClick",e,this.calendar.applyTimezone(t.start),n)},initHiddenDays:function(){var e,n=this.opt("hiddenDays")||[],i=[],r=0;for(this.opt("weekends")===!1&&n.push(0,6),e=0;e<7;e++)(i[e]=t.inArray(e,n)!==-1)||r++;if(!r)throw"invalid hiddenDays";this.isHiddenDayHash=i},isHiddenDay:function(t){return e.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},skipHiddenDays:function(t,e,n){var i=t.clone();for(e=e||1;this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},computeDayRange:function(t){var e,n=t.start.clone().stripTime(),i=t.end,r=null;return i&&(r=i.clone().stripTime(),e=+i.time(),e&&e>=this.nextDayThreshold&&r.add(1,"days")),(!i||r<=n)&&(r=n.clone().add(1,"days")),{start:n,end:r}},isMultiDayEvent:function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1}}),he=Ot.Scroller=ct.extend({el:null,scrollEl:null,overflowX:null,overflowY:null,constructor:function(t){t=t||{},this.overflowX=t.overflowX||t.overflow||"auto",this.overflowY=t.overflowY||t.overflow||"auto"},render:function(){this.el=this.renderEl(),this.applyOverflow()},renderEl:function(){return this.scrollEl=t('<div class="fc-scroller"></div>')},clear:function(){this.setHeight("auto"),this.applyOverflow()},destroy:function(){this.el.remove()},applyOverflow:function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},lockOverflow:function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},setHeight:function(t){this.scrollEl.height(t)},getScrollTop:function(){return this.scrollEl.scrollTop()},setScrollTop:function(t){this.scrollEl.scrollTop(t)},getClientWidth:function(){return this.scrollEl[0].clientWidth},getClientHeight:function(){return this.scrollEl[0].clientHeight},getScrollbarWidths:function(){return p(this.scrollEl)}});Lt.prototype.proxyCall=function(t){var e=Array.prototype.slice.call(arguments,1),n=[];return this.items.forEach(function(i){n.push(i[t].apply(i,e))}),n};var fe=Ot.Calendar=ct.extend({dirDefaults:null,localeDefaults:null,overrides:null,dynamicOverrides:null,options:null,viewSpecCache:null,view:null,header:null,footer:null,loadingLevel:0,constructor:Bt,initialize:function(){},populateOptionsHash:function(){var t,e,i,r;t=J(this.dynamicOverrides.locale,this.overrides.locale),e=ge[t],e||(t=fe.defaults.locale,e=ge[t]||{}),i=J(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,fe.defaults.isRTL),r=i?fe.rtlDefaults:{},this.dirDefaults=r,this.localeDefaults=e,this.options=n([fe.defaults,r,e,this.overrides,this.dynamicOverrides]),Nt(this.options)},getViewSpec:function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},getUnitViewSpec:function(e){var n,i,r;if(t.inArray(e,Yt)!=-1)for(n=this.header.getViewsWithButtons(),t.each(Ot.views,function(t){n.push(t)}),i=0;i<n.length;i++)if(r=this.getViewSpec(n[i]),r&&r.singleUnit==e)return r},buildViewSpec:function(t){for(var i,r,s,o,l=this.overrides.views||{},a=[],u=[],c=[],d=t;d;)i=At[d],r=l[d],d=null,"function"==typeof i&&(i={class:i}),i&&(a.unshift(i),u.unshift(i.defaults||{}),s=s||i.duration,d=d||i.type),r&&(c.unshift(r),s=s||r.duration,d=d||r.type);return i=q(a),i.type=t,!!i.class&&(s&&(s=e.duration(s),s.valueOf()&&(i.duration=s,o=A(s),1===s.as(o)&&(i.singleUnit=o,c.unshift(l[o]||{})))),i.defaults=n(u),i.overrides=n(c),this.buildViewSpecOptions(i),this.buildViewSpecButtonText(i,t),i)},buildViewSpecOptions:function(t){t.options=n([fe.defaults,t.defaults,this.dirDefaults,this.localeDefaults,this.overrides,t.overrides,this.dynamicOverrides]),Nt(t.options)},buildViewSpecButtonText:function(t,e){function n(n){var i=n.buttonText||{};return i[e]||(t.buttonTextKey?i[t.buttonTextKey]:null)||(t.singleUnit?i[t.singleUnit]:null)}t.buttonTextOverride=n(this.dynamicOverrides)||n(this.overrides)||t.overrides.buttonText,t.buttonTextDefault=n(this.localeDefaults)||n(this.dirDefaults)||t.defaults.buttonText||n(fe.defaults)||(t.duration?this.humanizeDuration(t.duration):null)||e},instantiateView:function(t){var e=this.getViewSpec(t);return new e.class(this,t,e.options,e.duration)},isValidViewType:function(t){return Boolean(this.getViewSpec(t))},pushLoading:function(){this.loadingLevel++||this.publiclyTrigger("loading",null,!0,this.view)},popLoading:function(){--this.loadingLevel||this.publiclyTrigger("loading",null,!1,this.view)},buildSelectSpan:function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),{start:i,end:n}}});fe.mixin(Jt),fe.mixin({optionHandlers:null,bindOption:function(t,e){this.bindOptions([t],e)},bindOptions:function(t,e){var n,i={func:e,names:t};for(n=0;n<t.length;n++)this.registerOptionHandlerObj(t[n],i);this.triggerOptionHandlerObj(i)},registerOptionHandlerObj:function(t,e){(this.optionHandlers[t]||(this.optionHandlers[t]=[])).push(e)},triggerOptionHandlers:function(t){var e,n=this.optionHandlers[t]||[];for(e=0;e<n.length;e++)this.triggerOptionHandlerObj(n[e])},triggerOptionHandlerObj:function(t){var e,n=t.names,i=[];for(e=0;e<n.length;e++)i.push(this.options[n[e]]);t.func.apply(this,i)}}),fe.defaults={titleRangeSeparator:" – ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",scrollTime:"06:00:00",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,isRTL:!1,buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},allDayText:"all-day",theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventOrder:"title",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3},fe.englishDefaults={dayPopoverFormat:"dddd, MMMM D"},fe.rtlDefaults={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}};var ge=Ot.locales={};Ot.datepickerLocale=function(e,n,i){var r=ge[e]||(ge[e]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,t.each(pe,function(t,e){r[t]=e(i)}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},Ot.locale=function(e,i){var r,s;r=ge[e]||(ge[e]={}),i&&(r=ge[e]=n([r,i])),s=Ft(e),t.each(ve,function(t,e){null==r[t]&&(r[t]=e(s,r))}),fe.defaults.locale=e};var pe={buttonText:function(t){return{prev:et(t.prevText),next:et(t.nextText),today:et(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},ve={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},mediumTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"a")},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},hourFormat:function(t){return t.longDateFormat("LT").replace(":mm","").replace(/(\Wmm)$/,"").replace(/\s*a$/i,"a")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}},me={smallDayDateFormat:function(t){return t.isRTL?"D dd":"dd D"},weekFormat:function(t){return t.isRTL?"w[ "+t.weekNumberTitle+"]":"["+t.weekNumberTitle+" ]w"},smallWeekFormat:function(t){return t.isRTL?"w["+t.weekNumberTitle+"]":"["+t.weekNumberTitle+"]w"}};Ot.locale("en",fe.englishDefaults),Ot.sourceNormalizers=[],Ot.sourceFetchers=[];var ye={dataType:"json",cache:!1},Se=1;fe.prototype.mutateSeg=function(t,e){return this.mutateEvent(t.event,e)},fe.prototype.normalizeEvent=function(t){},fe.prototype.spanContainsSpan=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start>=n&&e.end<=i},fe.prototype.getPeerEvents=function(t,e){var n,i,r=this.getEventCache(),s=[];for(n=0;n<r.length;n++)i=r[n],e&&e._id===i._id||s.push(i);return s},fe.prototype.isEventSpanAllowed=function(t,e){var n=e.source||{},i=J(e.constraint,n.constraint,this.options.eventConstraint),r=J(e.overlap,n.overlap,this.options.eventOverlap);return this.isSpanAllowed(t,i,r,e)&&(!this.options.eventAllow||this.options.eventAllow(t,e)!==!1)},fe.prototype.isExternalSpanAllowed=function(e,n,i){var r,s;return i&&(r=t.extend({},i,n),s=this.expandEvent(this.buildEventFromInput(r))[0]),s?this.isEventSpanAllowed(e,s):this.isSelectionSpanAllowed(e)},fe.prototype.isSelectionSpanAllowed=function(t){return this.isSpanAllowed(t,this.options.selectConstraint,this.options.selectOverlap)&&(!this.options.selectAllow||this.options.selectAllow(t)!==!1)},fe.prototype.isSpanAllowed=function(t,e,n,i){var r,s,o,l,a,u;if(null!=e&&(r=this.constraintToEvents(e))){for(s=!1,l=0;l<r.length;l++)if(this.spanContainsSpan(r[l],t)){s=!0;break}if(!s)return!1}for(o=this.getPeerEvents(t,i),l=0;l<o.length;l++)if(a=o[l],this.eventIntersectsRange(a,t)){if(n===!1)return!1;if("function"==typeof n&&!n(a,i))return!1;if(i){if(u=J(a.overlap,(a.source||{}).overlap),u===!1)return!1;if("function"==typeof u&&!u(i,a))return!1}}return!0},fe.prototype.constraintToEvents=function(t){return"businessHours"===t?this.getCurrentBusinessHourEvents():"object"==typeof t?null!=t.start?this.expandEvent(this.buildEventFromInput(t)):null:this.clientEvents(t)},fe.prototype.eventIntersectsRange=function(t,e){var n=t.start.clone().stripZone(),i=this.getEventEnd(t).stripZone();return e.start<i&&e.end>n};var we={id:"_fcBusinessHours",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"};fe.prototype.getCurrentBusinessHourEvents=function(t){return this.computeBusinessHourEvents(t,this.options.businessHours)},fe.prototype.computeBusinessHourEvents=function(e,n){return n===!0?this.expandBusinessHourEvents(e,[{}]):t.isPlainObject(n)?this.expandBusinessHourEvents(e,[n]):t.isArray(n)?this.expandBusinessHourEvents(e,n,!0):[]},fe.prototype.expandBusinessHourEvents=function(e,n,i){var r,s,o=this.getView(),l=[];for(r=0;r<n.length;r++)s=n[r],i&&!s.dow||(s=t.extend({},we,s),e&&(s.start=null,s.end=null),l.push.apply(l,this.expandEvent(this.buildEventFromInput(s),o.start,o.end)));return l};var Ee=Ot.BasicView=de.extend({scroller:null,dayGridClass:ue,dayGrid:null,dayNumbersVisible:!1,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1,weekNumberWidth:null,headContainerEl:null,headRowEl:null,initialize:function(){this.dayGrid=this.instantiateDayGrid(),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},instantiateDayGrid:function(){var t=this.dayGridClass.extend(be);return new t(this)},setRange:function(t){de.prototype.setRange.call(this,t),this.dayGrid.breakOnWeeks=/year|month|week/.test(this.intervalUnit),this.dayGrid.setRange(t)},computeRange:function(t){var e=de.prototype.computeRange.call(this,t);return/year|month/.test(e.intervalUnit)&&(e.start.startOf("week"),e.start=this.skipHiddenDays(e.start),e.end.weekday()&&(e.end.add(1,"week").startOf("week"),e.end=this.skipHiddenDays(e.end,-1,!0))),e},renderDates:function(){this.dayNumbersVisible=this.dayGrid.rowCnt>1,this.opt("weekNumbers")&&(this.opt("weekNumbersWithinDays")?(this.cellWeekNumbersVisible=!0,this.colWeekNumbersVisible=!1):(this.cellWeekNumbersVisible=!1,this.colWeekNumbersVisible=!0)),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.cellWeekNumbersVisible||this.colWeekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-day-grid-container"),n=t('<div class="fc-day-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.dayGrid.setElement(n),this.dayGrid.renderDates(this.hasRigidRows())},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.dayGrid.renderHeadHtml()),this.headRowEl=this.headContainerEl.find(".fc-row")},unrenderDates:function(){this.dayGrid.unrenderDates(),this.dayGrid.removeElement(),this.scroller.destroy()},renderBusinessHours:function(){this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.dayGrid.unrenderBusinessHours()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'"></td></tr></tbody></table>'},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.colWeekNumbersVisible&&(this.weekNumberWidth=u(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,s,o=this.opt("eventLimit");this.scroller.clear(),r(this.headRowEl),this.dayGrid.removeSegPopover(),o&&"number"==typeof o&&this.dayGrid.limitRows(o),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),o&&"number"!=typeof o&&this.dayGrid.limitRows(o),e||(this.scroller.setHeight(n),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(i(this.headRowEl,s),n=this.computeScrollerHeight(t),this.scroller.setHeight(n)),this.scroller.lockOverflow(s))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},setGridHeight:function(t,e){e?a(this.dayGrid.rowEls):l(this.dayGrid.rowEls,t,!0)},computeInitialScroll:function(){return{top:0}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},hitsNeeded:function(){this.dayGrid.hitsNeeded()},hitsNotNeeded:function(){this.dayGrid.hitsNotNeeded()},prepareHits:function(){this.dayGrid.prepareHits()},releaseHits:function(){this.dayGrid.releaseHits()},queryHit:function(t,e){return this.dayGrid.queryHit(t,e)},getHitSpan:function(t){return this.dayGrid.getHitSpan(t)},getHitEl:function(t){return this.dayGrid.getHitEl(t)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},unrenderEvents:function(){this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return this.dayGrid.renderDrag(t,e)},unrenderDrag:function(){this.dayGrid.unrenderDrag()},renderSelection:function(t){this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.dayGrid.unrenderSelection()}}),be={renderHeadIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<th class="fc-week-number '+t.widgetHeaderClass+'" '+t.weekNumberStyleAttr()+"><span>"+tt(t.opt("weekNumberTitle"))+"</span></th>":""},renderNumberIntroHtml:function(t){var e=this.view,n=this.getCellDate(t,0);return e.colWeekNumbersVisible?'<td class="fc-week-number" '+e.weekNumberStyleAttr()+">"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"</td>":""},renderBgIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number '+t.widgetContentClass+'" '+t.weekNumberStyleAttr()+"></td>":""},renderIntroHtml:function(){var t=this.view;return t.colWeekNumbersVisible?'<td class="fc-week-number" '+t.weekNumberStyleAttr()+"></td>":""}},De=Ot.MonthView=Ee.extend({computeRange:function(t){var e,n=Ee.prototype.computeRange.call(this,t);return this.isFixedWeeks()&&(e=Math.ceil(n.end.diff(n.start,"weeks",!0)),n.end.add(6-e,"weeks")),n},setGridHeight:function(t,e){e&&(t*=this.rowCnt/6),l(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){return this.opt("fixedWeekCount")}});At.basic={class:Ee},At.basicDay={type:"basic",duration:{days:1}},At.basicWeek={type:"basic",duration:{weeks:1}},At.month={class:De,duration:{months:1},defaults:{fixedWeekCount:!0}};var Te=Ot.AgendaView=de.extend({scroller:null,timeGridClass:ce,timeGrid:null,dayGridClass:ue,dayGrid:null,axisWidth:null,headContainerEl:null,noScrollRowEls:null,bottomRuleEl:null,initialize:function(){this.timeGrid=this.instantiateTimeGrid(),this.opt("allDaySlot")&&(this.dayGrid=this.instantiateDayGrid()),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},instantiateTimeGrid:function(){var t=this.timeGridClass.extend(Ce);return new t(this)},instantiateDayGrid:function(){var t=this.dayGridClass.extend(He);return new t(this)},setRange:function(t){de.prototype.setRange.call(this,t),this.timeGrid.setRange(t),this.dayGrid&&this.dayGrid.setRange(t)},renderDates:function(){this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.renderHead(),this.scroller.render();var e=this.scroller.el.addClass("fc-time-grid-container"),n=t('<div class="fc-time-grid" />').appendTo(e);this.el.find(".fc-body > tr > td").append(e),this.timeGrid.setElement(n),this.timeGrid.renderDates(),this.bottomRuleEl=t('<hr class="fc-divider '+this.widgetHeaderClass+'"/>').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.renderDates(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},renderHead:function(){this.headContainerEl=this.el.find(".fc-head-container").html(this.timeGrid.renderHeadHtml())},unrenderDates:function(){this.timeGrid.unrenderDates(),this.timeGrid.removeElement(),this.dayGrid&&(this.dayGrid.unrenderDates(),this.dayGrid.removeElement()),this.scroller.destroy()},renderSkeletonHtml:function(){return'<table><thead class="fc-head"><tr><td class="fc-head-container '+this.widgetHeaderClass+'"></td></tr></thead><tbody class="fc-body"><tr><td class="'+this.widgetContentClass+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="fc-divider '+this.widgetHeaderClass+'"/>':"")+"</td></tr></tbody></table>"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},renderBusinessHours:function(){this.timeGrid.renderBusinessHours(),this.dayGrid&&this.dayGrid.renderBusinessHours()},unrenderBusinessHours:function(){this.timeGrid.unrenderBusinessHours(),this.dayGrid&&this.dayGrid.unrenderBusinessHours()},getNowIndicatorUnit:function(){return this.timeGrid.getNowIndicatorUnit()},renderNowIndicator:function(t){this.timeGrid.renderNowIndicator(t)},unrenderNowIndicator:function(){this.timeGrid.unrenderNowIndicator()},updateSize:function(t){this.timeGrid.updateSize(t),de.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=u(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,s,o;this.bottomRuleEl.hide(),this.scroller.clear(),r(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.removeSegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=xe),n&&this.dayGrid.limitRows(n)),e||(s=this.computeScrollerHeight(t),this.scroller.setHeight(s),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(i(this.noScrollRowEls,o),s=this.computeScrollerHeight(t),this.scroller.setHeight(s)),this.scroller.lockOverflow(o),this.timeGrid.getTotalSlatHeight()<s&&this.bottomRuleEl.show())},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},computeInitialScroll:function(){var t=e.duration(this.opt("scrollTime")),n=this.timeGrid.computeTimeTop(t);return n=Math.ceil(n),n&&n++,{top:n}},queryScroll:function(){return{top:this.scroller.getScrollTop()}},setScroll:function(t){this.scroller.setScrollTop(t.top)},hitsNeeded:function(){this.timeGrid.hitsNeeded(),this.dayGrid&&this.dayGrid.hitsNeeded()},hitsNotNeeded:function(){this.timeGrid.hitsNotNeeded(),this.dayGrid&&this.dayGrid.hitsNotNeeded()},prepareHits:function(){this.timeGrid.prepareHits(),this.dayGrid&&this.dayGrid.prepareHits();
+},releaseHits:function(){this.timeGrid.releaseHits(),this.dayGrid&&this.dayGrid.releaseHits()},queryHit:function(t,e){var n=this.timeGrid.queryHit(t,e);return!n&&this.dayGrid&&(n=this.dayGrid.queryHit(t,e)),n},getHitSpan:function(t){return t.component.getHitSpan(t)},getHitEl:function(t){return t.component.getHitEl(t)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;n<t.length;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight()},getEventSegs:function(){return this.timeGrid.getEventSegs().concat(this.dayGrid?this.dayGrid.getEventSegs():[])},unrenderEvents:function(){this.timeGrid.unrenderEvents(),this.dayGrid&&this.dayGrid.unrenderEvents()},renderDrag:function(t,e){return t.start.hasTime()?this.timeGrid.renderDrag(t,e):this.dayGrid?this.dayGrid.renderDrag(t,e):void 0},unrenderDrag:function(){this.timeGrid.unrenderDrag(),this.dayGrid&&this.dayGrid.unrenderDrag()},renderSelection:function(t){t.start.hasTime()||t.end.hasTime()?this.timeGrid.renderSelection(t):this.dayGrid&&this.dayGrid.renderSelection(t)},unrenderSelection:function(){this.timeGrid.unrenderSelection(),this.dayGrid&&this.dayGrid.unrenderSelection()}}),Ce={renderHeadIntroHtml:function(){var t,e=this.view;return e.opt("weekNumbers")?(t=this.start.format(e.opt("smallWeekFormat")),'<th class="fc-axis fc-week-number '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+">"+e.buildGotoAnchorHtml({date:this.start,type:"week",forceOff:this.colCnt>1},tt(t))+"</th>"):'<th class="fc-axis '+e.widgetHeaderClass+'" '+e.axisStyleAttr()+"></th>"},renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},He={renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.widgetContentClass+'" '+t.axisStyleAttr()+"><span>"+t.getAllDayHtml()+"</span></td>"},renderIntroHtml:function(){var t=this.view;return'<td class="fc-axis" '+t.axisStyleAttr()+"></td>"}},xe=5,Re=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}];At.agenda={class:Te,defaults:{allDaySlot:!0,slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0}},At.agendaDay={type:"agenda",duration:{days:1}},At.agendaWeek={type:"agenda",duration:{weeks:1}};var Ie=de.extend({grid:null,scroller:null,initialize:function(){this.grid=new ke(this),this.scroller=new he({overflowX:"hidden",overflowY:"auto"})},setRange:function(t){de.prototype.setRange.call(this,t),this.grid.setRange(t)},renderSkeleton:function(){this.el.addClass("fc-list-view "+this.widgetContentClass),this.scroller.render(),this.scroller.el.appendTo(this.el),this.grid.setElement(this.scroller.scrollEl)},unrenderSkeleton:function(){this.scroller.destroy()},setHeight:function(t,e){this.scroller.setHeight(this.computeScrollerHeight(t))},computeScrollerHeight:function(t){return t-c(this.el,this.scroller.el)},renderEvents:function(t){this.grid.renderEvents(t)},unrenderEvents:function(){this.grid.unrenderEvents()},isEventResizable:function(t){return!1},isEventDraggable:function(t){return!1}}),ke=le.extend({segSelector:".fc-list-item",hasDayInteractions:!1,spanToSegs:function(t){for(var e,n=this.view,i=n.start.clone().time(0),r=0,s=[];i<n.end;)if(e=F(t,{start:i,end:i.clone().add(1,"day")}),e&&(e.dayIndex=r,s.push(e)),i.add(1,"day"),r++,e&&!e.isEnd&&t.end.hasTime()&&t.end<i.clone().add(this.view.nextDayThreshold)){e.end=t.end.clone(),e.isEnd=!0;break}return s},computeEventTimeFormat:function(){return this.view.opt("mediumTimeFormat")},handleSegClick:function(e,n){var i;le.prototype.handleSegClick.apply(this,arguments),t(n.target).closest("a[href]").length||(i=e.event.url,i&&!n.isDefaultPrevented()&&(window.location.href=i))},renderFgSegs:function(t){return t=this.renderFgSegEls(t),t.length?this.renderSegList(t):this.renderEmptyMessage(),t},renderEmptyMessage:function(){this.el.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+tt(this.view.opt("noEventsMessage"))+"</div></div></div>")},renderSegList:function(e){var n,i,r,s=this.groupSegsByDay(e),o=t('<table class="fc-list-table"><tbody/></table>'),l=o.find("tbody");for(n=0;n<s.length;n++)if(i=s[n])for(l.append(this.dayHeaderHtml(this.view.start.clone().add(n,"days"))),this.sortEventSegs(i),r=0;r<i.length;r++)l.append(i[r].el);this.el.empty().append(o)},groupSegsByDay:function(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i},dayHeaderHtml:function(t){var e=this.view,n=e.opt("listDayFormat"),i=e.opt("listDayAltFormat");return'<tr class="fc-list-heading" data-date="'+t.format("YYYY-MM-DD")+'"><td class="'+e.widgetHeaderClass+'" colspan="3">'+(n?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},tt(t.format(n))):"")+(i?e.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},tt(t.format(i))):"")+"</td></tr>"},fgSegHtml:function(t){var e,n=this.view,i=["fc-list-item"].concat(this.getSegCustomClasses(t)),r=this.getSegBackgroundColor(t),s=t.event,o=s.url;return e=s.allDay?n.getAllDayHtml():n.isMultiDayEvent(s)?t.isStart||t.isEnd?tt(this.getEventTimeText(t)):n.getAllDayHtml():tt(this.getEventTimeText(s)),o&&i.push("fc-has-url"),'<tr class="'+i.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+n.widgetContentClass+'">'+(e||"")+"</td>":"")+'<td class="fc-list-item-marker '+n.widgetContentClass+'"><span class="fc-event-dot"'+(r?' style="background-color:'+r+'"':"")+'></span></td><td class="fc-list-item-title '+n.widgetContentClass+'"><a'+(o?' href="'+tt(o)+'"':"")+">"+tt(t.event.title||"")+"</a></td></tr>"}});return At.list={class:Ie,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}},At.listDay={type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}},At.listWeek={type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}},At.listMonth={type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}},At.listYear={type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}},Ot}); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
index 5e1183071..c92bdd9df 100644
--- a/library/fullcalendar/fullcalendar.print.css
+++ b/library/fullcalendar/fullcalendar.print.css
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Print Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Print Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
/*
diff --git a/library/fullcalendar/fullcalendar.print.min.css b/library/fullcalendar/fullcalendar.print.min.css
index 05281cf21..c193968d7 100644
--- a/library/fullcalendar/fullcalendar.print.min.css
+++ b/library/fullcalendar/fullcalendar.print.min.css
@@ -1,5 +1,5 @@
/*!
- * FullCalendar v3.1.0 Print Stylesheet
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Print Stylesheet
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-helper-container,.fc-helper-skeleton,.fc-highlight-container,.fc-highlight-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-agenda-view .fc-axis,.fc-popover{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important} \ No newline at end of file
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
index 1975cca72..7e895337e 100644
--- a/library/fullcalendar/gcal.js
+++ b/library/fullcalendar/gcal.js
@@ -1,7 +1,7 @@
/*!
- * FullCalendar v3.1.0 Google Calendar Plugin
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Google Calendar Plugin
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
(function(factory) {
diff --git a/library/fullcalendar/gcal.min.js b/library/fullcalendar/gcal.min.js
index 08876848f..02e7ea4d5 100644
--- a/library/fullcalendar/gcal.min.js
+++ b/library/fullcalendar/gcal.min.js
@@ -1,6 +1,6 @@
/*!
- * FullCalendar v3.1.0 Google Calendar Plugin
- * Docs & License: http://fullcalendar.io/
- * (c) 2016 Adam Shaw
+ * FullCalendar v3.2.0 Google Calendar Plugin
+ * Docs & License: https://fullcalendar.io/
+ * (c) 2017 Adam Shaw
*/
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){function a(a,t,d,c,i){function s(o,r){var l=r||[{message:o}];(a.googleCalendarError||e.noop).apply(i,l),(i.options.googleCalendarError||e.noop).apply(i,l),n.warn.apply(null,[o].concat(r||[]))}var u,g,p=r+"/"+encodeURIComponent(a.googleCalendarId)+"/events?callback=?",m=a.googleCalendarApiKey||i.options.googleCalendarApiKey,f=a.success;return m?(t.hasZone()||(t=t.clone().utc().add(-1,"day")),d.hasZone()||(d=d.clone().utc().add(1,"day")),c&&"local"!=c&&(g=c.replace(" ","_")),u=e.extend({},a.data||{},{key:m,timeMin:t.format(),timeMax:d.format(),timeZone:g,singleEvents:!0,maxResults:9999}),e.extend({},a,{googleCalendarId:null,url:p,data:u,startParam:!1,endParam:!1,timezoneParam:!1,success:function(a){var r,n,t=[];if(a.error)s("Google Calendar API: "+a.error.message,a.error.errors);else if(a.items&&(e.each(a.items,function(e,a){var r=a.htmlLink||null;g&&null!==r&&(r=o(r,"ctz="+g)),t.push({id:a.id,title:a.summary,start:a.start.dateTime||a.start.date,end:a.end.dateTime||a.end.date,url:r,location:a.location,description:a.description})}),r=[t].concat(Array.prototype.slice.call(arguments,1)),n=l(f,this,r),e.isArray(n)))return n;return t}})):(s("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"),{})}function o(e,a){return e.replace(/(\?.*?)?(#|$)/,function(e,o,r){return(o?o+"&":"?")+a+r})}var r="https://www.googleapis.com/calendar/v3/calendars",n=e.fullCalendar,l=n.applyAll;n.sourceNormalizers.push(function(e){var a,o=e.googleCalendarId,r=e.url;!o&&r&&(/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(r)?o=r:((a=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(r))||(a=/^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(r)))&&(o=decodeURIComponent(a[1])),o&&(e.googleCalendarId=o)),o&&(null==e.editable&&(e.editable=!1),e.url=o)}),n.sourceFetchers.push(function(e,o,r,n){if(e.googleCalendarId)return a(e,o,r,n,this)})}); \ No newline at end of file
diff --git a/library/fullcalendar/locale-all.js b/library/fullcalendar/locale-all.js
index a648a74bc..689a86e07 100644
--- a/library/fullcalendar/locale-all.js
+++ b/library/fullcalendar/locale-all.js
@@ -1,5 +1,5 @@
!function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):"object"==typeof exports?module.exports=e(require("jquery"),require("moment")):e(jQuery,moment)}(function(e,a){!function(){!function(){var e=a.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"vm":"VM":t?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("af","af",{closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("af",{buttonText:{year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenis"})}(),function(){!function(){var e={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},t={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},r={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(e){return function(a,t,s,d){var i=n(a),o=r[e][n(a)];return 2===i&&(o=o[t?0:1]),o.replace(/%d/i,a)}},d=["كانون الثاني يناير","شباط Ùبراير","آذار مارس","نيسان أبريل","أيار مايو","حزيران يونيو","تموز يوليو","آب أغسطس","أيلول سبتمبر","تشرين الأول أكتوبر","تشرين الثاني نوÙمبر","كانون الأول ديسمبر"],i=a.defineLocale("ar",{months:d,monthsShort:d,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/â€M/â€YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/\u200f/g,"").replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}});return i}(),e.fullCalendar.datepickerLocale("ar","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-dz",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ar-dz","ar-DZ",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["جانÙÙŠ","ÙÙŠÙري","مارس","Ø£Ùريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-dz",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},t=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(e){return function(a,r,s,d){var i=t(a),o=n[e][t(a)];return 2===i&&(o=o[r?0:1]),o.replace(/%d/i,a)}},s=["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],d=a.defineLocale("ar-ly",{months:s,monthsShort:s,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/â€M/â€YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/\u200f/g,"").replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:6,doy:12}});return d}(),e.fullCalendar.datepickerLocale("ar-ly","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-ly",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-ma",{months:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}});return e}(),e.fullCalendar.datepickerLocale("ar-ma","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-ma",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e={1:"Ù¡",2:"Ù¢",3:"Ù£",4:"Ù¤",5:"Ù¥",6:"Ù¦",7:"Ù§",8:"Ù¨",9:"Ù©",0:"Ù "},t={"Ù¡":"1","Ù¢":"2","Ù£":"3","Ù¤":"4","Ù¥":"5","Ù¦":"6","Ù§":"7","Ù¨":"8","Ù©":"9","Ù ":"0"},n=a.defineLocale("ar-sa",{months:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|Ù…/,isPM:function(e){return"Ù…"===e},meridiem:function(e,a,t){return e<12?"ص":"Ù…"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("ar-sa","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-sa",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("ar-tn",{months:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),monthsShort:"جانÙÙŠ_ÙÙŠÙري_مارس_Ø£Ùريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوÙمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"Ø­_Ù†_Ø«_ر_Ø®_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"ÙÙŠ %s",past:"منذ %s",s:"ثوان",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ar-tn","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","Ùبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوÙمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["Ø­","Ù†","Ø«","ر","Ø®","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ar-tn",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})}(),function(){!function(){var e=a.defineLocale("bg",{months:"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),weekdaysShort:"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”Ð½ÐµÑ Ð²] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Ð’ изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[Ð’ изминалиÑ] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"Ñлед %s",past:"преди %s",s:"нÑколко Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дни",M:"меÑец",MM:"%d меÑеца",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("bg","bg",{closeText:"затвори",prevText:"&#x3C;назад",nextText:"напред&#x3E;",nextBigText:"&#x3E;&#x3E;",currentText:"днеÑ",monthNames:["Януари","Февруари","Март","Ðприл","Май","Юни","Юли","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Яну","Фев","Мар","Ðпр","Май","Юни","Юли","Ðвг","Сеп","Окт","Ðов","Дек"],dayNames:["ÐеделÑ","Понеделник","Вторник","СрÑда","Четвъртък","Петък","Събота"],dayNamesShort:["Ðед","Пон","Вто","СрÑ","Чет","Пет","Съб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("bg",{buttonText:{month:"МеÑец",week:"Седмица",day:"Ден",list:"График"},allDayText:"ЦÑл ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"ÐÑма ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° показване"})}(),function(){!function(){var e=a.defineLocale("ca",{months:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),monthsShort:"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"Dg_Dl_Dt_Dc_Dj_Dv_Ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd D MMMM YYYY H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},ordinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(e,a){var t=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"è";return"w"!==a&&"W"!==a||(t="a"),e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ca",{buttonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"})}(),function(){!function(){function e(e){return e>1&&e<5&&1!==~~(e/10)}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?s+(e(a)?"minuty":"minut"):s+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodin"):s+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?s+(e(a)?"dny":"dní"):s+"dny";case"M":return t||r?"mÄ›síc":"mÄ›sícem";case"MM":return t||r?s+(e(a)?"mÄ›síce":"mÄ›síců"):s+"mÄ›síci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?s+(e(a)?"roky":"let"):s+"lety"}}var n="leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),r="led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_"),s=a.defineLocale("cs",{months:n,monthsShort:r,monthsParse:function(e,a){var t,n=[];for(t=0;t<12;t++)n[t]=new RegExp("^"+e[t]+"$|^"+a[t]+"$","i");return n}(n,r),shortMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(r),longMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(n),weekdays:"nedÄ›le_pondÄ›lí_úterý_stÅ™eda_Ätvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_Ät_pá_so".split("_"),weekdaysMin:"ne_po_út_st_Ät_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedÄ›li v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve stÅ™edu v] LT";case 4:return"[ve Ätvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[vÄera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou nedÄ›li v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou stÅ™edu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pÅ™ed %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("cs","cs",{closeText:"Zavřít",prevText:"&#x3C;Dříve",nextText:"PozdÄ›ji&#x3E;",currentText:"Nyní",monthNames:["leden","únor","bÅ™ezen","duben","kvÄ›ten","Äerven","Äervenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bÅ™e","dub","kvÄ›","Äer","Ävc","srp","zář","říj","lis","pro"],dayNames:["nedÄ›le","pondÄ›lí","úterý","stÅ™eda","Ätvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","Ät","pá","so"],dayNamesMin:["ne","po","út","st","Ät","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("cs",{buttonText:{month:"MÄ›síc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"})}(),function(){!function(){var e=a.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY HH:mm"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I gÃ¥r kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"fÃ¥ sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"et Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("da","da",{closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("da",{buttonText:{month:"MÃ¥ned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}var t=a.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("de","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}var t=a.defineLocale("de-at",{months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("de-at","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("de-at",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})}(),function(){!function(){function e(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}var t=a.defineLocale("el",{monthsNominativeEl:"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),monthsGenitiveEl:"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),months:function(e,a){return/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]},monthsShort:"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),weekdays:"ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),weekdaysShort:"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,a,t){return e>11?t?"μμ":"ΜΜ":t?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Îœ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[ΣήμεÏα {}] LT",nextDay:"[ΑÏÏιο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το Ï€ÏοηγοÏμενο] dddd [{}] LT";default:return"[την Ï€ÏοηγοÏμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(a,t){var n=this._calendarEl[a],r=t&&t.hours();return e(n)&&(n=n.apply(t)),n.replace("{}",r%12===1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s Ï€Ïιν",s:"λίγα δευτεÏόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ÏŽÏα",hh:"%d ÏŽÏες",d:"μία μέÏα",dd:"%d μέÏες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χÏόνος",yy:"%d χÏόνια"},ordinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}});return t}(),e.fullCalendar.datepickerLocale("el","el",{closeText:"Κλείσιμο",prevText:"ΠÏοηγοÏμενος",nextText:"Επόμενος",currentText:"ΣήμεÏα",monthNames:["ΙανουάÏιος","ΦεβÏουάÏιος","ΜάÏτιος","ΑπÏίλιος","Μάιος","ΙοÏνιος","ΙοÏλιος","ΑÏγουστος","ΣεπτέμβÏιος","ΟκτώβÏιος","ÎοέμβÏιος","ΔεκέμβÏιος"],monthNamesShort:["Ιαν","Φεβ","ΜαÏ","ΑπÏ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Îοε","Δεκ"],dayNames:["ΚυÏιακή","ΔευτέÏα","ΤÏίτη","ΤετάÏτη","Πέμπτη","ΠαÏασκευή","Σάββατο"],dayNamesShort:["ΚυÏ","Δευ","ΤÏι","Τετ","Πεμ","ΠαÏ","Σαβ"],dayNamesMin:["Κυ","Δε","ΤÏ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("el",{buttonText:{month:"Μήνας",week:"Εβδομάδα",day:"ΗμέÏα",list:"Ατζέντα"},allDayText:"ΟλοήμεÏο",eventLimitText:"πεÏισσότεÏα",noEventsMessage:"Δεν υπάÏχουν γεγονότα για να εμφανιστεί"})}(),function(){!function(){var e=a.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{
-dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-au")}(),function(){!function(){var e=a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t}});return e}(),e.fullCalendar.locale("en-ca")}(),function(){!function(){var e=a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-gb")}(),function(){!function(){var e=a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.locale("en-ie")}(),function(){!function(){var e=a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-nz")}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es-do","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es-do",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("eu","eu",{closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("eu",{buttonText:{month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})}(),function(){!function(){var e={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},t={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"},n=a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,a,t){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[Û°-Û¹]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}});return n}(),e.fullCalendar.datepickerLocale("fa","fa",{closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","Ùوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],dayNamesMin:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],weekHeader:"Ù‡Ù",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fa",{buttonText:{month:"ماه",week:"Ù‡Ùته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})}(),function(){!function(){function e(e,a,n,r){var s="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=t(e,r)+" "+s}function t(e,a){return e<10?a?r[e]:n[e]:e}var n="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),r=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",n[7],n[8],n[9]],s=a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei tapahtumia näytettäviä"})}(),function(){!function(){var e=a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")}});return e}(),e.fullCalendar.datepickerLocale("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ca",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr-ch","fr-CH",{closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ch",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("gl","gl",{closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("gl",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Axenda"},allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})}(),function(){!function(){var e=a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיי×":e+" שעות"},d:"יו×",dd:function(e){return 2===e?"יומיי×":e+" ימי×"},M:"חודש",MM:function(e){return 2===e?"חודשיי×":e+" חודשי×"},y:"שנה",yy:function(e){return 2===e?"שנתיי×":e%10===0&&10!==e?e+" שנה":e+" שני×"}},meridiemParse:/××—×”"צ|לפנה"צ|×חרי הצהריי×|לפני הצהריי×|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(××—×”"צ|×חרי הצהריי×|בערב)$/.test(e)},meridiem:function(e,a,t){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?t?'לפנה"צ':"לפני הצהריי×":e<18?t?'××—×”"צ':"×חרי הצהריי×":"בערב"}});return e}(),e.fullCalendar.datepickerLocale("he","he",{closeText:"סגור",prevText:"&#x3C;הקוד×",nextText:"הב×&#x3E;",currentText:"היו×",monthNames:["ינו×ר","פברו×ר","מרץ","×פריל","מ××™","יוני","יולי","×וגוסט","ספטמבר","×וקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","×פר","מ××™","יוני","יולי","×וג","ספט","×וק","נוב","דצמ"],dayNames:["ר×שון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],dayNamesMin:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("he",{buttonText:{month:"חודש",week:"שבוע",day:"יו×",list:"סדר יו×"},allDayText:"כל היו×",eventLimitText:"×חר",noEventsMessage:"×ין ××™×¨×•×¢×™× ×œ×”×¦×’×”",weekNumberTitle:"שבוע"})}(),function(){!function(){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},t={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},n=a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return t[e]})},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(e,a){return 12===e&&(e=0),"रात"===a?e<4?e:e+12:"सà¥à¤¬à¤¹"===a?e:"दोपहर"===a?e>=10?e:e+12:"शाम"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"रात":e<10?"सà¥à¤¬à¤¹":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अगसà¥à¤¤ ","सितमà¥à¤¬à¤°","अकà¥à¤Ÿà¥‚बर","नवमà¥à¤¬à¤°","दिसमà¥à¤¬à¤°"],monthNamesShort:["जन","फर","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अग","सित","अकà¥à¤Ÿ","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बà¥à¤§à¤µà¤¾à¤°","गà¥à¤°à¥à¤µà¤¾à¤°","शà¥à¤•à¥à¤°à¤µà¤¾à¤°","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],dayNamesMin:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],weekHeader:"हफà¥à¤¤à¤¾",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hi",{buttonText:{month:"महीना",week:"सपà¥à¤¤à¤¾à¤¹",day:"दिन",list:"कारà¥à¤¯à¤¸à¥‚ची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने के लिà¤"})}(),function(){!function(){function e(e,a,t){var n=e+" ";switch(t){case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}var t=a.defineLocale("hr",{months:{format:"sijeÄnja_veljaÄe_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sijeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("hr","hr",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["SijeÄanj","VeljaÄa","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],
-monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","ÄŒetvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","ÄŒet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","ÄŒe","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hr",{buttonText:{month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ joÅ¡ "+e},noEventsMessage:"Nema dogaÄ‘aja za prikaz"})}(),function(){!function(){function e(e,a,t,n){var r=e;switch(t){case"s":return n||a?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||a?" perc":" perce");case"mm":return r+(n||a?" perc":" perce");case"h":return"egy"+(n||a?" óra":" órája");case"hh":return r+(n||a?" óra":" órája");case"d":return"egy"+(n||a?" nap":" napja");case"dd":return r+(n||a?" nap":" napja");case"M":return"egy"+(n||a?" hónap":" hónapja");case"MM":return r+(n||a?" hónap":" hónapja");case"y":return"egy"+(n||a?" év":" éve");case"yy":return r+(n||a?" év":" éve")}return""}function t(e){return(e?"":"[múlt] ")+"["+n[this.day()]+"] LT[-kor]"}var n="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" "),r=a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?t===!0?"de":"DE":t===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return r}(),e.fullCalendar.datepickerLocale("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"elÅ‘re",currentText:"ma",monthNames:["Január","Február","Március","Ãprilis","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ãpr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","HétfÅ‘","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthetÅ‘ események"})}(),function(){!function(){var e=a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?e>=11?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("id","id",{closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})}(),function(){!function(){function e(e){return e%100===11||e%10!==1}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return e(a)?s+(t||r?"mínútur":"mínútum"):t?s+"mínúta":s+"mínútu";case"hh":return e(a)?s+(t||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return e(a)?t?s+"dagar":s+(r?"daga":"dögum"):t?s+"dagur":s+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return e(a)?t?s+"mánuðir":s+(r?"mánuði":"mánuðum"):t?s+"mánuður":s+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return e(a)?s+(t||r?"ár":"árum"):s+(t||r?"ár":"ári")}}var n=a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("is","is",{closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"à dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ãgúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ãgú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})}(),function(){!function(){var e=a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})}(),function(){!function(){var e=a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥Ah時m分",LLLL:"YYYYå¹´M月Dæ—¥Ah時m分 dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(e){return"åˆå¾Œ"===e},meridiem:function(e,a,t){return e<12?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}æ—¥/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";default:return e}},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}});return e}(),e.fullCalendar.datepickerLocale("ja","ja",{closeText:"é–‰ã˜ã‚‹",prevText:"&#x3C;å‰",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","ç«æ›œæ—¥","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["æ—¥","月","ç«","æ°´","木","金","土"],dayNamesMin:["æ—¥","月","ç«","æ°´","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("ja",{buttonText:{month:"月",week:"週",day:"æ—¥",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"ä»– "+e+" 件"},noEventsMessage:"イベントãŒè¡¨ç¤ºã•ã‚Œãªã„よã†ã«"})}(),function(){!function(){var e={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"},t=a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_Ñәуір_мамыр_мауÑым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқÑан".split("_"),monthsShort:"қаң_ақп_нау_Ñәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жекÑенбі_дүйÑенбі_ÑейÑенбі_ÑәрÑенбі_бейÑенбі_жұма_Ñенбі".split("_"),weekdaysShort:"жек_дүй_Ñей_Ñәр_бей_жұм_Ñен".split("_"),weekdaysMin:"жк_дй_Ñй_ÑÑ€_бй_жм_Ñн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін Ñағат] LT",nextDay:"[Ертең Ñағат] LT",nextWeek:"dddd [Ñағат] LT",lastDay:"[Кеше Ñағат] LT",lastWeek:"[Өткен аптаның] dddd [Ñағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше Ñекунд",m:"бір минут",mm:"%d минут",h:"бір Ñағат",hh:"%d Ñағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var t=a%10,n=a>=100?100:null;return a+(e[a]||e[t]||e[n])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("kk","kk",{closeText:"Жабу",prevText:"&#x3C;Ðлдыңғы",nextText:"КелеÑÑ–&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ðқпан","Ðаурыз","Сәуір","Мамыр","МауÑым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","ЖелтоқÑан"],monthNamesShort:["Қаң","Ðқп","Ðау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["ЖекÑенбі","ДүйÑенбі","СейÑенбі","СәрÑенбі","БейÑенбі","Жұма","Сенбі"],dayNamesShort:["жкÑ","дÑн","ÑÑн","ÑÑ€Ñ","бÑн","жма","Ñнб"],dayNamesMin:["Жк","ДÑ","СÑ","Ср","БÑ","Жм","Сн"],weekHeader:"Ðе",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("kk",{buttonText:{month:"Ðй",week:"Ðпта",day:"Күн",list:"Күн тәртібі"},allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"КөрÑету үшін оқиғалар жоқ"})}(),function(){!function(){var e=a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ A hì‹œ m분",LLLL:"YYYYë…„ MMMM Dì¼ dddd A hì‹œ m분"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇 ì´ˆ",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"í•œ 시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"í•œ 달",MM:"%d달",y:"ì¼ ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,a,t){return e<12?"오전":"오후"}});return e}(),e.fullCalendar.datepickerLocale("ko","ko",{closeText:"닫기",prevText:"ì´ì „달",nextText:"다ìŒë‹¬",currentText:"오늘",monthNames:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],monthNamesShort:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],dayNames:["ì¼ìš”ì¼","월요ì¼","화요ì¼","수요ì¼","목요ì¼","금요ì¼","토요ì¼"],dayNamesShort:["ì¼","ì›”","í™”","수","목","금","토"],dayNamesMin:["ì¼","ì›”","í™”","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"ë…„"}),e.fullCalendar.locale("ko",{buttonText:{month:"ì›”",week:"주",day:"ì¼",list:"ì¼ì •ëª©ë¡"},allDayText:"종ì¼",eventLimitText:"ê°œ",noEventsMessage:"ì¼ì •ì´ 표시 없습니다"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?r[t][0]:r[t][1]}function t(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"a "+e:"an "+e}function n(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10,t=e/10;return r(0===a?t:a)}if(e<1e4){for(;e>=10;)e/=10;return r(e)}return e/=1e3,r(e)}var s=a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:t,past:n,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("lb","lb",{closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lb",{buttonText:{month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})}(),function(){!function(){function e(e,a,t,n){return a?"kelios sekundÄ—s":n?"kelių sekundžių":"kelias sekundes"}function t(e,a,t,n){return a?r(t)[0]:n?r(t)[1]:r(t)[2]}function n(e){return e%10===0||e>10&&e<20}function r(e){return d[e].split("_")}function s(e,a,s,d){var i=e+" ";return 1===e?i+t(e,a,s[0],d):a?i+(n(e)?r(s)[1]:r(s)[0]):d?i+r(s)[1]:i+(n(e)?r(s)[1]:r(s)[2])}var d={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i=a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjÅ«tis_rugsÄ—jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_treÄiadienį_ketvirtadienį_penktadienį_Å¡eÅ¡tadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:e,m:t,mm:s,h:t,hh:s,d:t,dd:s,M:t,MM:s,y:t,yy:s},ordinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});return i}(),e.fullCalendar.datepickerLocale("lt","lt",{closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Å iandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","RugpjÅ«tis","RugsÄ—jis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","treÄiadienis","ketvirtadienis","penktadienis","Å¡eÅ¡tadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","Å¡eÅ¡"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Å e"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("lt",{buttonText:{month:"MÄ—nuo",week:"SavaitÄ—",day:"Diena",list:"DarbotvarkÄ—"},allDayText:"VisÄ… dienÄ…",eventLimitText:"daugiau",noEventsMessage:"NÄ—ra įvykių rodyti"})}(),function(){!function(){function e(e,a,t){return t?a%10===1&&a%100!==11?e[2]:e[3]:a%10===1&&a%100!==11?e[0]:e[1]}function t(a,t,n){return a+" "+e(s[n],a,t)}function n(a,t,n){return e(s[n],a,t)}function r(e,a){return a?"dažas sekundes":"dažÄm sekundÄ“m"}var s={m:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),mm:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),h:"stundas_stundÄm_stunda_stundas".split("_"),hh:"stundas_stundÄm_stunda_stundas".split("_"),d:"dienas_dienÄm_diena_dienas".split("_"),dd:"dienas_dienÄm_diena_dienas".split("_"),M:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),MM:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},d=a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pÄ“c %s",past:"pirms %s",s:r,m:n,mm:t,h:n,hh:t,d:n,dd:t,M:n,MM:t,y:n,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),e.fullCalendar.datepickerLocale("lv","lv",{closeText:"AizvÄ“rt",prevText:"Iepr.",nextText:"NÄk.",currentText:"Å odien",monthNames:["JanvÄris","FebruÄris","Marts","AprÄ«lis","Maijs","JÅ«nijs","JÅ«lijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","JÅ«n","JÅ«l","Aug","Sep","Okt","Nov","Dec"],dayNames:["svÄ“tdiena","pirmdiena","otrdiena","treÅ¡diena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lv",{buttonText:{month:"MÄ“nesis",week:"Nedēļa",day:"Diena",list:"Dienas kÄrtÄ«ba"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vÄ“l "+e},noEventsMessage:"Nav notikumu, lai parÄdÄ«tu"})}(),function(){!function(){var e=a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("mk","mk",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДенеÑ",monthNames:["Јануари","Февруари","Март","Ðприл","Мај","Јуни","Јули","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Јан","Фев","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðое","Дек"],dayNames:["Ðедела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Ðед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("mk",{buttonText:{month:"МеÑец",week:"Ðедела",day:"Ден",list:"График"},allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Ðема наÑтани за прикажување"})}(),function(){!function(){var e=a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms-my","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms-my",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nb","nb",{closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nb",{buttonText:{month:"MÃ¥ned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",
-lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl","nl",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl-be","nl-BE",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl-be",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e=a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nn","nn",{closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mÃ¥n","tys","ons","tor","fre","lau"],dayNames:["sundag","mÃ¥ndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","mÃ¥","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nn",{buttonText:{month:"MÃ¥nad",week:"Veke",day:"Dag",list:"Agenda"},allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){function e(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function t(a,t,n){var r=a+" ";switch(n){case"m":return t?"minuta":"minutÄ™";case"mm":return r+(e(a)?"minuty":"minut");case"h":return t?"godzina":"godzinÄ™";case"hh":return r+(e(a)?"godziny":"godzin");case"MM":return r+(e(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return r+(e(a)?"lata":"lat")}}var n="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"),s=a.defineLocale("pl",{months:function(e,a){return""===a?"("+r[e.month()]+"|"+n[e.month()]+")":/D MMMM/.test(a)?r[e.month()]:n[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_Å›r_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:t,mm:t,h:t,hh:t,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:t,y:"rok",yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"NastÄ™pny&#x3E;",currentText:"DziÅ›",monthNames:["StyczeÅ„","Luty","Marzec","KwiecieÅ„","Maj","Czerwiec","Lipiec","SierpieÅ„","WrzesieÅ„","Październik","Listopad","GrudzieÅ„"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","PoniedziaÅ‚ek","Wtorek","Åšroda","Czwartek","PiÄ…tek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Åšr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Åšr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pl",{buttonText:{month:"MiesiÄ…c",week:"TydzieÅ„",day:"DzieÅ„",list:"Plan dnia"},allDayText:"CaÅ‚y dzieÅ„",eventLimitText:"wiÄ™cej",noEventsMessage:"Brak wydarzeÅ„ do wyÅ›wietlenia"})}(),function(){!function(){var e=a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return e}(),e.fullCalendar.datepickerLocale("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){function e(e,a,t){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&e%100===0)&&(r=" de "),e+r+n[t]}var t=a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("ro","ro",{closeText:"ÃŽnchide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","MarÅ£i","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afiÈ™at"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":a+" "+e(r[n],+a)}var n=[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йÑ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],r=a.defineLocale("ru",{months:{format:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_"),standalone:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_")},monthsShort:{format:"Ñнв._февр._мар._апр._маÑ_июнÑ_июлÑ_авг._Ñент._окт._ноÑб._дек.".split("_"),standalone:"Ñнв._февр._март_апр._май_июнь_июль_авг._Ñент._окт._ноÑб._дек.".split("_")},weekdays:{standalone:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),format:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/},weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsShortRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsStrictRegex:/^(Ñнвар[ÑÑŒ]|феврал[ÑÑŒ]|марта?|апрел[ÑÑŒ]|ма[Ñй]|июн[ÑÑŒ]|июл[ÑÑŒ]|авгуÑта?|ÑентÑбр[ÑÑŒ]|октÑбр[ÑÑŒ]|ноÑбр[ÑÑŒ]|декабр[ÑÑŒ])/i,monthsShortStrictRegex:/^(Ñнв\.|февр?\.|мар[Ñ‚.]|апр\.|ма[Ñй]|июн[ÑŒÑ.]|июл[ÑŒÑ.]|авг\.|Ñент?\.|окт\.|ноÑб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ Ñледующее] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ Ñледующий] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ Ñледующую] dddd [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:t,mm:t,h:"чаÑ",hh:t,d:"день",dd:t,M:"меÑÑц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(e){return/^(днÑ|вечера)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночи":e<12?"утра":e<17?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-Ñ";default:return e}},week:{dow:1,doy:7}});return r}(),e.fullCalendar.datepickerLocale("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"СегоднÑ",monthNames:["Январь","Февраль","Март","Ðпрель","Май","Июнь","Июль","ÐвгуÑÑ‚","СентÑбрь","ОктÑбрь","ÐоÑбрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Ðпр","Май","Июн","Июл","Ðвг","Сен","Окт","ÐоÑ","Дек"],dayNames:["воÑкреÑенье","понедельник","вторник","Ñреда","четверг","пÑтница","Ñуббота"],dayNamesShort:["вÑк","пнд","втр","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ð’Ñ","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Ðед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ru",{buttonText:{month:"МеÑÑц",week:"ÐеделÑ",day:"День",list:"ПовеÑтка днÑ"},allDayText:"ВеÑÑŒ день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Ðет Ñобытий Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"})}(),function(){!function(){function e(e){return e>1&&e<5}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?s+(e(a)?"minúty":"minút"):s+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodín"):s+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?s+(e(a)?"dni":"dní"):s+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?s+(e(a)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?s+(e(a)?"roky":"rokov"):s+"rokmi"}}var n="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),s=a.defineLocale("sk",{months:n,monthsShort:r,weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("sk","sk",{closeText:"ZavrieÅ¥",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","Å¡tvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Å tv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Å t","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ÄalÅ¡ie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})}(),function(){!function(){function e(e,a,t,n){var r=e+" ";switch(t){case"s":return a||n?"nekaj sekund":"nekaj sekundami";case"m":return a?"ena minuta":"eno minuto";case"mm":return r+=1===e?a?"minuta":"minuto":2===e?a||n?"minuti":"minutama":e<5?a||n?"minute":"minutami":a||n?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return r+=1===e?a?"ura":"uro":2===e?a||n?"uri":"urama":e<5?a||n?"ure":"urami":a||n?"ur":"urami";case"d":return a||n?"en dan":"enim dnem";case"dd":return r+=1===e?a||n?"dan":"dnem":2===e?a||n?"dni":"dnevoma":a||n?"dni":"dnevi";case"M":return a||n?"en mesec":"enim mesecem";case"MM":return r+=1===e?a||n?"mesec":"mesecem":2===e?a||n?"meseca":"mesecema":e<5?a||n?"mesece":"meseci":a||n?"mesecev":"meseci";case"y":return a||n?"eno leto":"enim letom";case"yy":return r+=1===e?a||n?"leto":"letom":2===e?a||n?"leti":"letoma":e<5?a||n?"leta":"leti":a||n?"let":"leti"}}var t=a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejÅ¡njo] [nedeljo] [ob] LT";case 3:return"[prejÅ¡njo] [sredo] [ob] LT";case 6:return"[prejÅ¡njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"pred %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sl","sl",{closeText:"Zapri",prevText:"&#x3C;PrejÅ¡nji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","ÄŒetrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","ÄŒet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","ÄŒe","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"veÄ",noEventsMessage:"Ni dogodkov za prikaz"})}(),function(){!function(){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var e=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_авгуÑÑ‚_Ñептембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._Ñеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_Ñреда_четвртак_петак_Ñубота".split("_"),weekdaysShort:"нед._пон._уто._Ñре._чет._пет._Ñуб.".split("_"),weekdaysMin:"не_по_ут_ÑÑ€_че_пе_Ñу".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"меÑец",MM:e.translate,y:"годину",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr-cyrl","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr-cyrl",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e=a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"[PÃ¥] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"e":1===a?"a":2===a?"a":"e";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","MÃ¥n","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","MÃ¥ndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","MÃ¥","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sv",{buttonText:{month:"MÃ¥nad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})}(),function(){!function(){var e=a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"ม.ค._à¸.พ._มี.ค._เม.ย._พ.ค._มิ.ย._à¸.ค._ส.ค._à¸.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,a,t){return e<12?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"
-}});return e}(),e.fullCalendar.datepickerLocale("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มà¸à¸£à¸²à¸„ม","à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","à¸à¸£à¸à¸Žà¸²à¸„ม","สิงหาคม","à¸à¸±à¸™à¸¢à¸²à¸¢à¸™","ตุลาคม","พฤศจิà¸à¸²à¸¢à¸™","ธันวาคม"],monthNamesShort:["ม.ค.","à¸.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","à¸.ค.","ส.ค.","à¸.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุà¸à¸£à¹Œ","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"à¹à¸œà¸™à¸‡à¸²à¸™"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸—ี่จะà¹à¸ªà¸”ง"})}(),function(){!function(){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},t=a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var t=a%10,n=a%100-t,r=a>=100?100:null;return a+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Åžubat","Mart","Nisan","Mayıs","Haziran","Temmuz","AÄŸustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Åžub","Mar","Nis","May","Haz","Tem","AÄŸu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","ÇarÅŸamba","PerÅŸembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":a+" "+e(r[n],+a)}function n(e,a){var t={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(a)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(a)?"genitive":"nominative";return t[n][e.day()]}function r(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}var s=a.defineLocale("uk",{months:{format:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_"),standalone:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_")},monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., HH:mm",LLLL:"dddd, D MMMM YYYY Ñ€., HH:mm"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"міÑÑць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(e){return/^(днÑ|вечора)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночі":e<12?"ранку":e<17?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return s}(),e.fullCalendar.datepickerLocale("uk","uk",{closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","ВереÑень","Жовтень","ЛиÑтопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","ЛиÑ","Гру"],dayNames:["неділÑ","понеділок","вівторок","Ñереда","четвер","п’ÑтницÑ","Ñубота"],dayNamesShort:["нед","пнд","вів","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ðд","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("uk",{buttonText:{month:"МіÑÑць",week:"Тиждень",day:"День",list:"ПорÑдок денний"},allDayText:"УвеÑÑŒ день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Ðемає подій Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"})}(),function(){!function(){var e=a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("vi","vi",{closeText:"Äóng",prevText:"&#x3C;TrÆ°á»›c",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Má»™t","Tháng Hai","Tháng Ba","Tháng TÆ°","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng MÆ°á»i","Tháng MÆ°á»i Má»™t","Tháng MÆ°á»i Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ TÆ°","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sá»± kiện để hiển thị"})}(),function(){!function(){var e=a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah点mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah点mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh点mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"下åˆ"===a||"晚上"===a?e+12:e>=11?e:e+12},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,t;return e=a().startOf("week"),t=this.diff(e,"days")>=7?"[下]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},lastWeek:function(){var e,t;return e=a().startOf("week"),t=this.unix()<e.unix()?"[上]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(æ—¥|月|周)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 å°æ—¶",hh:"%d å°æ—¶",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 å¹´",yy:"%d å¹´"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-cn",{buttonText:{month:"月",week:"周",day:"æ—¥",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"å¦å¤– "+e+" 个"},noEventsMessage:"没有事件显示"})}(),function(){!function(){var e=a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah點mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh點mm分",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah點mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh點mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"中åˆ"===a?e>=11?e:e+12:"下åˆ"===a||"晚上"===a?e+12:void 0},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"1 分é˜",mm:"%d 分é˜",h:"1 å°æ™‚",hh:"%d å°æ™‚",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 å¹´",yy:"%d å¹´"}});return e}(),e.fullCalendar.datepickerLocale("zh-tw","zh-TW",{closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"待辦事項"},allDayText:"全天",eventLimitText:"更多",noEventsMessage:"没有事件显示"})}(),a.locale("en"),e.fullCalendar.locale("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file
+dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-au")}(),function(){!function(){var e=a.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t}});return e}(),e.fullCalendar.locale("en-ca")}(),function(){!function(){var e=a.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-gb")}(),function(){!function(){var e=a.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.locale("en-ie")}(),function(){!function(){var e=a.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},ordinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("en-nz")}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=a.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("es-do","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("es-do",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("eu","eu",{closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("eu",{buttonText:{month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})}(),function(){!function(){var e={1:"Û±",2:"Û²",3:"Û³",4:"Û´",5:"Ûµ",6:"Û¶",7:"Û·",8:"Û¸",9:"Û¹",0:"Û°"},t={"Û±":"1","Û²":"2","Û³":"3","Û´":"4","Ûµ":"5","Û¶":"6","Û·":"7","Û¸":"8","Û¹":"9","Û°":"0"},n=a.defineLocale("fa",{months:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,a,t){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[Ùردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چندین ثانیه",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[Û°-Û¹]/g,function(e){return t[e]}).replace(/ØŒ/g,",")},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]}).replace(/,/g,"ØŒ")},ordinalParse:/\d{1,2}Ù…/,ordinal:"%dÙ…",week:{dow:6,doy:12}});return n}(),e.fullCalendar.datepickerLocale("fa","fa",{closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","Ùوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],dayNamesMin:["ÛŒ","د","س","Ú†","Ù¾","ج","Ø´"],weekHeader:"Ù‡Ù",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fa",{buttonText:{month:"ماه",week:"Ù‡Ùته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})}(),function(){!function(){function e(e,a,n,r){var s="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=t(e,r)+" "+s}function t(e,a){return e<10?a?r[e]:n[e]:e}var n="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),r=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",n[7],n[8],n[9]],s=a.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"})}(),function(){!function(){var e=a.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")}});return e}(),e.fullCalendar.datepickerLocale("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ca",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|e)/,ordinal:function(e){return e+(1===e?"er":"e")},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("fr-ch","fr-CH",{closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("fr-ch",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})}(),function(){!function(){var e=a.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("gl","gl",{closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("gl",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Axenda"},allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})}(),function(){!function(){var e=a.defineLocale("he",{months:"ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),weekdays:"ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"×_ב_×’_ד_×”_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[×”×™×•× ×‘Ö¾]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[×תמול ב־]LT",lastWeek:"[ביו×] dddd [×”×חרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיי×":e+" שעות"},d:"יו×",dd:function(e){return 2===e?"יומיי×":e+" ימי×"},M:"חודש",MM:function(e){return 2===e?"חודשיי×":e+" חודשי×"},y:"שנה",yy:function(e){return 2===e?"שנתיי×":e%10===0&&10!==e?e+" שנה":e+" שני×"}},meridiemParse:/××—×”"צ|לפנה"צ|×חרי הצהריי×|לפני הצהריי×|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(××—×”"צ|×חרי הצהריי×|בערב)$/.test(e)},meridiem:function(e,a,t){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?t?'לפנה"צ':"לפני הצהריי×":e<18?t?'××—×”"צ':"×חרי הצהריי×":"בערב"}});return e}(),e.fullCalendar.datepickerLocale("he","he",{closeText:"סגור",prevText:"&#x3C;הקוד×",nextText:"הב×&#x3E;",currentText:"היו×",monthNames:["ינו×ר","פברו×ר","מרץ","×פריל","מ××™","יוני","יולי","×וגוסט","ספטמבר","×וקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","×פר","מ××™","יוני","יולי","×וג","ספט","×וק","נוב","דצמ"],dayNames:["ר×שון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],dayNamesMin:["×'","ב'","×’'","ד'","×”'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("he",{buttonText:{month:"חודש",week:"שבוע",day:"יו×",list:"סדר יו×"},allDayText:"כל היו×",eventLimitText:"×חר",noEventsMessage:"×ין ××™×¨×•×¢×™× ×œ×”×¦×’×”",weekNumberTitle:"שבוע"})}(),function(){!function(){var e={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},t={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"},n=a.defineLocale("hi",{months:"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°".split("_"),monthsShort:"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि".split("_"),weekdaysMin:"र_सो_मं_बà¥_गà¥_शà¥_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कà¥à¤› ही कà¥à¤·à¤£",m:"à¤à¤• मिनट",mm:"%d मिनट",h:"à¤à¤• घंटा",hh:"%d घंटे",d:"à¤à¤• दिन",dd:"%d दिन",M:"à¤à¤• महीने",MM:"%d महीने",y:"à¤à¤• वरà¥à¤·",yy:"%d वरà¥à¤·"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return t[e]})},postformat:function(a){return a.replace(/\d/g,function(a){return e[a]})},meridiemParse:/रात|सà¥à¤¬à¤¹|दोपहर|शाम/,meridiemHour:function(e,a){return 12===e&&(e=0),"रात"===a?e<4?e:e+12:"सà¥à¤¬à¤¹"===a?e:"दोपहर"===a?e>=10?e:e+12:"शाम"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"रात":e<10?"सà¥à¤¬à¤¹":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}});return n}(),e.fullCalendar.datepickerLocale("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अगसà¥à¤¤ ","सितमà¥à¤¬à¤°","अकà¥à¤Ÿà¥‚बर","नवमà¥à¤¬à¤°","दिसमà¥à¤¬à¤°"],monthNamesShort:["जन","फर","मारà¥à¤š","अपà¥à¤°à¥‡à¤²","मई","जून","जूलाई","अग","सित","अकà¥à¤Ÿ","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बà¥à¤§à¤µà¤¾à¤°","गà¥à¤°à¥à¤µà¤¾à¤°","शà¥à¤•à¥à¤°à¤µà¤¾à¤°","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],dayNamesMin:["रवि","सोम","मंगल","बà¥à¤§","गà¥à¤°à¥","शà¥à¤•à¥à¤°","शनि"],weekHeader:"हफà¥à¤¤à¤¾",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hi",{buttonText:{month:"महीना",week:"सपà¥à¤¤à¤¾à¤¹",day:"दिन",list:"कारà¥à¤¯à¤¸à¥‚ची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करने के लिà¤"})}(),function(){!function(){function e(e,a,t){var n=e+" ";switch(t){case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}var t=a.defineLocale("hr",{months:{format:"sijeÄnja_veljaÄe_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sijeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[proÅ¡lu] dddd [u] LT";case 6:return"[proÅ¡le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[proÅ¡li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("hr","hr",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["SijeÄanj","VeljaÄa","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],
+monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","ÄŒetvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","ÄŒet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","ÄŒe","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("hr",{buttonText:{prev:"PrijaÅ¡nji",next:"Sljedeći",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ joÅ¡ "+e},noEventsMessage:"Nema dogaÄ‘aja za prikaz"})}(),function(){!function(){function e(e,a,t,n){var r=e;switch(t){case"s":return n||a?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(n||a?" perc":" perce");case"mm":return r+(n||a?" perc":" perce");case"h":return"egy"+(n||a?" óra":" órája");case"hh":return r+(n||a?" óra":" órája");case"d":return"egy"+(n||a?" nap":" napja");case"dd":return r+(n||a?" nap":" napja");case"M":return"egy"+(n||a?" hónap":" hónapja");case"MM":return r+(n||a?" hónap":" hónapja");case"y":return"egy"+(n||a?" év":" éve");case"yy":return r+(n||a?" év":" éve")}return""}function t(e){return(e?"":"[múlt] ")+"["+n[this.day()]+"] LT[-kor]"}var n="vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton".split(" "),r=a.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?t===!0?"de":"DE":t===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return r}(),e.fullCalendar.datepickerLocale("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"elÅ‘re",currentText:"ma",monthNames:["Január","Február","Március","Ãprilis","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ãpr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","HétfÅ‘","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthetÅ‘ események"})}(),function(){!function(){var e=a.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?e>=11?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("id","id",{closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})}(),function(){!function(){function e(e){return e%100===11||e%10!==1}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"m":return t?"mínúta":"mínútu";case"mm":return e(a)?s+(t||r?"mínútur":"mínútum"):t?s+"mínúta":s+"mínútu";case"hh":return e(a)?s+(t||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return e(a)?t?s+"dagar":s+(r?"daga":"dögum"):t?s+"dagur":s+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return e(a)?t?s+"mánuðir":s+(r?"mánuði":"mánuðum"):t?s+"mánuður":s+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return e(a)?s+(t||r?"ár":"árum"):s+(t||r?"ár":"ári")}}var n=a.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return n}(),e.fullCalendar.datepickerLocale("is","is",{closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"à dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ãgúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ãgú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})}(),function(){!function(){var e=a.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"Do_Lu_Ma_Me_Gi_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})}(),function(){!function(){var e=a.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),weekdaysMin:"æ—¥_月_ç«_æ°´_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"Ah時m分s秒",L:"YYYY/MM/DD",LL:"YYYYå¹´M月Dæ—¥",LLL:"YYYYå¹´M月Dæ—¥Ah時m分",LLLL:"YYYYå¹´M月Dæ—¥Ah時m分 dddd"},meridiemParse:/åˆå‰|åˆå¾Œ/i,isPM:function(e){return"åˆå¾Œ"===e},meridiem:function(e,a,t){return e<12?"åˆå‰":"åˆå¾Œ"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[æ¥é€±]dddd LT",lastDay:"[昨日] LT",lastWeek:"[å‰é€±]dddd LT",sameElse:"L"},ordinalParse:/\d{1,2}æ—¥/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";default:return e}},relativeTime:{future:"%s後",past:"%så‰",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1æ—¥",dd:"%dæ—¥",M:"1ヶ月",MM:"%dヶ月",y:"1å¹´",yy:"%då¹´"}});return e}(),e.fullCalendar.datepickerLocale("ja","ja",{closeText:"é–‰ã˜ã‚‹",prevText:"&#x3C;å‰",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","ç«æ›œæ—¥","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["æ—¥","月","ç«","æ°´","木","金","土"],dayNamesMin:["æ—¥","月","ç«","æ°´","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("ja",{buttonText:{month:"月",week:"週",day:"æ—¥",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"ä»– "+e+" 件"},noEventsMessage:"イベントãŒè¡¨ç¤ºã•ã‚Œãªã„よã†ã«"})}(),function(){!function(){var e={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"},t=a.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_Ñәуір_мамыр_мауÑым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқÑан".split("_"),monthsShort:"қаң_ақп_нау_Ñәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жекÑенбі_дүйÑенбі_ÑейÑенбі_ÑәрÑенбі_бейÑенбі_жұма_Ñенбі".split("_"),weekdaysShort:"жек_дүй_Ñей_Ñәр_бей_жұм_Ñен".split("_"),weekdaysMin:"жк_дй_Ñй_ÑÑ€_бй_жм_Ñн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін Ñағат] LT",nextDay:"[Ертең Ñағат] LT",nextWeek:"dddd [Ñағат] LT",lastDay:"[Кеше Ñағат] LT",lastWeek:"[Өткен аптаның] dddd [Ñағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше Ñекунд",m:"бір минут",mm:"%d минут",h:"бір Ñағат",hh:"%d Ñағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},ordinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(a){var t=a%10,n=a>=100?100:null;return a+(e[a]||e[t]||e[n])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("kk","kk",{closeText:"Жабу",prevText:"&#x3C;Ðлдыңғы",nextText:"КелеÑÑ–&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ðқпан","Ðаурыз","Сәуір","Мамыр","МауÑым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","ЖелтоқÑан"],monthNamesShort:["Қаң","Ðқп","Ðау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["ЖекÑенбі","ДүйÑенбі","СейÑенбі","СәрÑенбі","БейÑенбі","Жұма","Сенбі"],dayNamesShort:["жкÑ","дÑн","ÑÑн","ÑÑ€Ñ","бÑн","жма","Ñнб"],dayNamesMin:["Жк","ДÑ","СÑ","Ср","БÑ","Жм","Сн"],weekHeader:"Ðе",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("kk",{buttonText:{month:"Ðй",week:"Ðпта",day:"Күн",list:"Күн тәртібі"},allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"КөрÑету үшін оқиғалар жоқ"})}(),function(){!function(){var e=a.defineLocale("ko",{months:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),monthsShort:"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”".split("_"),weekdays:"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_토요ì¼".split("_"),weekdaysShort:"ì¼_ì›”_í™”_수_목_금_토".split("_"),weekdaysMin:"ì¼_ì›”_í™”_수_목_금_토".split("_"),longDateFormat:{LT:"A hì‹œ m분",LTS:"A hì‹œ m분 sì´ˆ",L:"YYYY.MM.DD",LL:"YYYYë…„ MMMM Dì¼",LLL:"YYYYë…„ MMMM Dì¼ A hì‹œ m분",LLLL:"YYYYë…„ MMMM Dì¼ dddd A hì‹œ m분"},calendar:{sameDay:"오늘 LT",nextDay:"ë‚´ì¼ LT",nextWeek:"dddd LT",lastDay:"ì–´ì œ LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s ì „",s:"몇 ì´ˆ",ss:"%dì´ˆ",m:"ì¼ë¶„",mm:"%d분",h:"í•œ 시간",hh:"%d시간",d:"하루",dd:"%dì¼",M:"í•œ 달",MM:"%d달",y:"ì¼ ë…„",yy:"%dë…„"},ordinalParse:/\d{1,2}ì¼/,ordinal:"%dì¼",meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,a,t){return e<12?"오전":"오후"}});return e}(),e.fullCalendar.datepickerLocale("ko","ko",{closeText:"닫기",prevText:"ì´ì „달",nextText:"다ìŒë‹¬",currentText:"오늘",monthNames:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],monthNamesShort:["1ì›”","2ì›”","3ì›”","4ì›”","5ì›”","6ì›”","7ì›”","8ì›”","9ì›”","10ì›”","11ì›”","12ì›”"],dayNames:["ì¼ìš”ì¼","월요ì¼","화요ì¼","수요ì¼","목요ì¼","금요ì¼","토요ì¼"],dayNamesShort:["ì¼","ì›”","í™”","수","목","금","토"],dayNamesMin:["ì¼","ì›”","í™”","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"ë…„"}),e.fullCalendar.locale("ko",{buttonText:{month:"ì›”",week:"주",day:"ì¼",list:"ì¼ì •ëª©ë¡"},allDayText:"종ì¼",eventLimitText:"ê°œ",noEventsMessage:"ì¼ì •ì´ 표시 없습니다"})}(),function(){!function(){function e(e,a,t,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?r[t][0]:r[t][1]}function t(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"a "+e:"an "+e}function n(e){var a=e.substr(0,e.indexOf(" "));return r(a)?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10,t=e/10;return r(0===a?t:a)}if(e<1e4){for(;e>=10;)e/=10;return r(e)}return e/=1e3,r(e)}var s=a.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:t,past:n,s:"e puer Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d Méint",y:e,yy:"%d Joer"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("lb","lb",{closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lb",{buttonText:{month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})}(),function(){!function(){function e(e,a,t,n){return a?"kelios sekundÄ—s":n?"kelių sekundžių":"kelias sekundes"}function t(e,a,t,n){return a?r(t)[0]:n?r(t)[1]:r(t)[2]}function n(e){return e%10===0||e>10&&e<20}function r(e){return d[e].split("_")}function s(e,a,s,d){var i=e+" ";return 1===e?i+t(e,a,s[0],d):a?i+(n(e)?r(s)[1]:r(s)[0]):d?i+r(s)[1]:i+(n(e)?r(s)[1]:r(s)[2])}var d={m:"minutÄ—_minutÄ—s_minutÄ™",mm:"minutÄ—s_minuÄių_minutes",h:"valanda_valandos_valandÄ…",hh:"valandos_valandų_valandas",d:"diena_dienos_dienÄ…",dd:"dienos_dienų_dienas",M:"mÄ—nuo_mÄ—nesio_mÄ—nesį",MM:"mÄ—nesiai_mÄ—nesių_mÄ—nesius",y:"metai_metų_metus",yy:"metai_metų_metus"},i=a.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjÅ«tis_rugsÄ—jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_treÄiadienį_ketvirtadienį_penktadienį_Å¡eÅ¡tadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Å ".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Å iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[PraÄ—jusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieÅ¡ %s",s:e,m:t,mm:s,h:t,hh:s,d:t,dd:s,M:t,MM:s,y:t,yy:s},ordinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}});return i}(),e.fullCalendar.datepickerLocale("lt","lt",{closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Å iandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","RugpjÅ«tis","RugsÄ—jis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","treÄiadienis","ketvirtadienis","penktadienis","Å¡eÅ¡tadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","Å¡eÅ¡"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Å e"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.locale("lt",{buttonText:{month:"MÄ—nuo",week:"SavaitÄ—",day:"Diena",list:"DarbotvarkÄ—"},allDayText:"VisÄ… dienÄ…",eventLimitText:"daugiau",noEventsMessage:"NÄ—ra įvykių rodyti"})}(),function(){!function(){function e(e,a,t){return t?a%10===1&&a%100!==11?e[2]:e[3]:a%10===1&&a%100!==11?e[0]:e[1]}function t(a,t,n){return a+" "+e(s[n],a,t)}function n(a,t,n){return e(s[n],a,t)}function r(e,a){return a?"dažas sekundes":"dažÄm sekundÄ“m"}var s={m:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),mm:"minÅ«tes_minÅ«tÄ“m_minÅ«te_minÅ«tes".split("_"),h:"stundas_stundÄm_stunda_stundas".split("_"),hh:"stundas_stundÄm_stunda_stundas".split("_"),d:"dienas_dienÄm_diena_dienas".split("_"),dd:"dienas_dienÄm_diena_dienas".split("_"),M:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),MM:"mÄ“neÅ¡a_mÄ“neÅ¡iem_mÄ“nesis_mÄ“neÅ¡i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")},d=a.defineLocale("lv",{months:"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec".split("_"),weekdays:"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Å odien pulksten] LT",nextDay:"[RÄ«t pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[PagÄjuÅ¡Ä] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pÄ“c %s",past:"pirms %s",s:r,m:n,mm:t,h:n,hh:t,d:n,dd:t,M:n,MM:t,y:n,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return d}(),e.fullCalendar.datepickerLocale("lv","lv",{closeText:"AizvÄ“rt",prevText:"Iepr.",nextText:"NÄk.",currentText:"Å odien",monthNames:["JanvÄris","FebruÄris","Marts","AprÄ«lis","Maijs","JÅ«nijs","JÅ«lijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","JÅ«n","JÅ«l","Aug","Sep","Okt","Nov","Dec"],dayNames:["svÄ“tdiena","pirmdiena","otrdiena","treÅ¡diena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("lv",{buttonText:{month:"MÄ“nesis",week:"Nedēļa",day:"Diena",list:"Dienas kÄrtÄ«ba"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vÄ“l "+e},noEventsMessage:"Nav notikumu, lai parÄdÄ«tu"})}(),function(){!function(){var e=a.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота".split("_"),weekdaysShort:"нед_пон_вто_Ñре_чет_пет_Ñаб".split("_"),weekdaysMin:"нe_пo_вт_ÑÑ€_че_пе_Ña".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"поÑле %s",past:"пред %s",s:"неколку Ñекунди",m:"минута",mm:"%d минути",h:"чаÑ",hh:"%d чаÑа",d:"ден",dd:"%d дена",M:"меÑец",MM:"%d меÑеци",y:"година",yy:"%d години"},ordinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("mk","mk",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДенеÑ",monthNames:["Јануари","Февруари","Март","Ðприл","Мај","Јуни","Јули","ÐвгуÑÑ‚","Септември","Октомври","Ðоември","Декември"],monthNamesShort:["Јан","Фев","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðое","Дек"],dayNames:["Ðедела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Ðед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Ðе","По","Ð’Ñ‚","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("mk",{buttonText:{month:"МеÑец",week:"Ðедела",day:"Ден",list:"График"},allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Ðема наÑтани за прикажување"})}(),function(){!function(){var e=a.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}});return e}(),e.fullCalendar.datepickerLocale("ms-my","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ms-my",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})}(),function(){!function(){var e=a.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i gÃ¥r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en mÃ¥ned",MM:"%d mÃ¥neder",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nb","nb",{closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nb",{buttonText:{month:"MÃ¥ned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",
+lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl","nl",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,s=a.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(a,n){return/-MMM-/.test(n)?t[a.month()]:e[a.month()]},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("nl-be","nl-BE",{closeText:"Sluiten",prevText:"â†",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nl-be",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})}(),function(){!function(){var e=a.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mÃ¥n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_mÃ¥_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I gÃ¥r klokka] LT",lastWeek:"[FøregÃ¥ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein mÃ¥nad",MM:"%d mÃ¥nader",y:"eit Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("nn","nn",{closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mÃ¥n","tys","ons","tor","fre","lau"],dayNames:["sundag","mÃ¥ndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","mÃ¥","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("nn",{buttonText:{month:"MÃ¥nad",week:"Veke",day:"Dag",list:"Agenda"},allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser Ã¥ vise"})}(),function(){!function(){function e(e){return e%10<5&&e%10>1&&~~(e/10)%10!==1}function t(a,t,n){var r=a+" ";switch(n){case"m":return t?"minuta":"minutÄ™";case"mm":return r+(e(a)?"minuty":"minut");case"h":return t?"godzina":"godzinÄ™";case"hh":return r+(e(a)?"godziny":"godzin");case"MM":return r+(e(a)?"miesiÄ…ce":"miesiÄ™cy");case"yy":return r+(e(a)?"lata":"lat")}}var n="styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia".split("_"),s=a.defineLocale("pl",{months:function(e,a){return""===a?"("+r[e.month()]+"|"+n[e.month()]+")":/D MMMM/.test(a)?r[e.month()]:n[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_Å›r_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Åšr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DziÅ› o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszÅ‚Ä… niedzielÄ™ o] LT";case 3:return"[W zeszÅ‚Ä… Å›rodÄ™ o] LT";case 6:return"[W zeszÅ‚Ä… sobotÄ™ o] LT";default:return"[W zeszÅ‚y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:t,mm:t,h:t,hh:t,d:"1 dzieÅ„",dd:"%d dni",M:"miesiÄ…c",MM:t,y:"rok",yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"NastÄ™pny&#x3E;",currentText:"DziÅ›",monthNames:["StyczeÅ„","Luty","Marzec","KwiecieÅ„","Maj","Czerwiec","Lipiec","SierpieÅ„","WrzesieÅ„","Październik","Listopad","GrudzieÅ„"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","PoniedziaÅ‚ek","Wtorek","Åšroda","Czwartek","PiÄ…tek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Åšr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Åšr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pl",{buttonText:{month:"MiesiÄ…c",week:"TydzieÅ„",day:"DzieÅ„",list:"Plan dnia"},allDayText:"CaÅ‚y dzieÅ„",eventLimitText:"wiÄ™cej",noEventsMessage:"Brak wydarzeÅ„ do wyÅ›wietlenia"})}(),function(){!function(){var e=a.defineLocale("pt",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-Feira_Terça-Feira_Quarta-Feira_Quinta-Feira_Sexta-Feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){var e=a.defineLocale("pt-br",{months:"Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Dom_2ª_3ª_4ª_5ª_6ª_Sáb".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"poucos segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"});return e}(),e.fullCalendar.datepickerLocale("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})}(),function(){!function(){function e(e,a,t){var n={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&e%100===0)&&(r=" de "),e+r+n[t]}var t=a.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",m:"un minut",mm:e,h:"o oră",hh:e,d:"o zi",dd:e,M:"o lună",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("ro","ro",{closeText:"ÃŽnchide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","MarÅ£i","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afiÈ™at"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"чаÑ_чаÑа_чаÑов",dd:"день_днÑ_дней",MM:"меÑÑц_меÑÑца_меÑÑцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":a+" "+e(r[n],+a)}var n=[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йÑ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],r=a.defineLocale("ru",{months:{format:"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ".split("_"),standalone:"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_")},monthsShort:{format:"Ñнв._февр._мар._апр._маÑ_июнÑ_июлÑ_авг._Ñент._окт._ноÑб._дек.".split("_"),standalone:"Ñнв._февр._март_апр._май_июнь_июль_авг._Ñент._окт._ноÑб._дек.".split("_")},weekdays:{standalone:"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота".split("_"),format:"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|Ñледующую|Ñту)? ?\] ?dddd/},weekdaysShort:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsShortRegex:/^(Ñнвар[ÑŒÑ]|Ñнв\.?|феврал[ÑŒÑ]|февр?\.?|марта?|мар\.?|апрел[ÑŒÑ]|апр\.?|ма[йÑ]|июн[ÑŒÑ]|июн\.?|июл[ÑŒÑ]|июл\.?|авгуÑта?|авг\.?|ÑентÑбр[ÑŒÑ]|Ñент?\.?|октÑбр[ÑŒÑ]|окт\.?|ноÑбр[ÑŒÑ]|ноÑб?\.?|декабр[ÑŒÑ]|дек\.?)/i,monthsStrictRegex:/^(Ñнвар[ÑÑŒ]|феврал[ÑÑŒ]|марта?|апрел[ÑÑŒ]|ма[Ñй]|июн[ÑÑŒ]|июл[ÑÑŒ]|авгуÑта?|ÑентÑбр[ÑÑŒ]|октÑбр[ÑÑŒ]|ноÑбр[ÑÑŒ]|декабр[ÑÑŒ])/i,monthsShortStrictRegex:/^(Ñнв\.|февр?\.|мар[Ñ‚.]|апр\.|ма[Ñй]|июн[ÑŒÑ.]|июл[ÑŒÑ.]|авг\.|Ñент?\.|окт\.|ноÑб?\.|дек\.)/i,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., HH:mm",LLLL:"dddd, D MMMM YYYY г., HH:mm"},calendar:{sameDay:"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ Ñледующее] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ Ñледующий] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ Ñледующую] dddd [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[Ð’] dddd [в] LT";switch(this.day()){case 0:return"[Ð’ прошлое] dddd [в] LT";case 1:case 2:case 4:return"[Ð’ прошлый] dddd [в] LT";case 3:case 5:case 6:return"[Ð’ прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"неÑколько Ñекунд",m:t,mm:t,h:"чаÑ",hh:t,d:"день",dd:t,M:"меÑÑц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(e){return/^(днÑ|вечера)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночи":e<12?"утра":e<17?"днÑ":"вечера"},ordinalParse:/\d{1,2}-(й|го|Ñ)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-Ñ";default:return e}},week:{dow:1,doy:7}});return r}(),e.fullCalendar.datepickerLocale("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"СегоднÑ",monthNames:["Январь","Февраль","Март","Ðпрель","Май","Июнь","Июль","ÐвгуÑÑ‚","СентÑбрь","ОктÑбрь","ÐоÑбрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Ðпр","Май","Июн","Июл","Ðвг","Сен","Окт","ÐоÑ","Дек"],dayNames:["воÑкреÑенье","понедельник","вторник","Ñреда","четверг","пÑтница","Ñуббота"],dayNamesShort:["вÑк","пнд","втр","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ð’Ñ","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Ðед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("ru",{buttonText:{month:"МеÑÑц",week:"ÐеделÑ",day:"День",list:"ПовеÑтка днÑ"},allDayText:"ВеÑÑŒ день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Ðет Ñобытий Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ"})}(),function(){!function(){function e(e){return e>1&&e<5}function t(a,t,n,r){var s=a+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?s+(e(a)?"minúty":"minút"):s+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(e(a)?"hodiny":"hodín"):s+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?s+(e(a)?"dni":"dní"):s+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?s+(e(a)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?s+(e(a)?"roky":"rokov"):s+"rokmi"}}var n="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_"),s=a.defineLocale("sk",{months:n,monthsShort:r,weekdays:"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_Å¡t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_Å¡t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo Å¡tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[vÄera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}});return s}(),e.fullCalendar.datepickerLocale("sk","sk",{closeText:"ZavrieÅ¥",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","Å¡tvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Å tv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Å t","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ÄalÅ¡ie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})}(),function(){!function(){function e(e,a,t,n){var r=e+" ";switch(t){case"s":return a||n?"nekaj sekund":"nekaj sekundami";case"m":return a?"ena minuta":"eno minuto";case"mm":return r+=1===e?a?"minuta":"minuto":2===e?a||n?"minuti":"minutama":e<5?a||n?"minute":"minutami":a||n?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return r+=1===e?a?"ura":"uro":2===e?a||n?"uri":"urama":e<5?a||n?"ure":"urami":a||n?"ur":"urami";case"d":return a||n?"en dan":"enim dnem";case"dd":return r+=1===e?a||n?"dan":"dnem":2===e?a||n?"dni":"dnevoma":a||n?"dni":"dnevi";case"M":return a||n?"en mesec":"enim mesecem";case"MM":return r+=1===e?a||n?"mesec":"mesecem":2===e?a||n?"meseca":"mesecema":e<5?a||n?"mesece":"meseci":a||n?"mesecev":"meseci";case"y":return a||n?"eno leto":"enim letom";case"yy":return r+=1===e?a||n?"leto":"letom":2===e?a||n?"leti":"letoma":e<5?a||n?"leta":"leti":a||n?"let":"leti"}}var t=a.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._Äet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_Äe_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[vÄeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejÅ¡njo] [nedeljo] [ob] LT";case 3:return"[prejÅ¡njo] [sredo] [ob] LT";case 6:return"[prejÅ¡njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejÅ¡nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"Äez %s",past:"pred %s",s:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sl","sl",{closeText:"Zapri",prevText:"&#x3C;PrejÅ¡nji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","ÄŒetrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","ÄŒet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","ÄŒe","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"veÄ",noEventsMessage:"Ni dogodkov za prikaz"})}(),function(){!function(){var e={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_Äetvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._Äet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_Äe_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juÄe u] LT",lastWeek:function(){var e=["[proÅ¡le] [nedelje] [u] LT","[proÅ¡log] [ponedeljka] [u] LT","[proÅ¡log] [utorka] [u] LT","[proÅ¡le] [srede] [u] LT","[proÅ¡log] [Äetvrtka] [u] LT","[proÅ¡log] [petka] [u] LT","[proÅ¡le] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e={words:{m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један Ñат","једног Ñата"],hh:["Ñат","Ñата","Ñати"],dd:["дан","дана","дана"],MM:["меÑец","меÑеца","меÑеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(a,t,n){var r=e.words[n];return 1===n.length?t?r[0]:r[1]:a+" "+e.correctGrammaticalCase(a,r)}},t=a.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_авгуÑÑ‚_Ñептембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._Ñеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_Ñреда_четвртак_петак_Ñубота".split("_"),weekdaysShort:"нед._пон._уто._Ñре._чет._пет._Ñуб.".split("_"),weekdaysMin:"не_по_ут_ÑÑ€_че_пе_Ñу".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT",nextDay:"[Ñутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [Ñреду] [у] LT";case 6:return"[у] [Ñуботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){var e=["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [Ñреде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [Ñуботе] [у] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико Ñекунди",m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"дан",dd:e.translate,M:"меÑец",MM:e.translate,y:"годину",yy:e.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("sr-cyrl","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"ДанаÑ",monthNames:["Јануар","Фебруар","Март","Ðприл","Мај","Јун","Јул","ÐвгуÑÑ‚","Септембар","Октобар","Ðовембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Ðпр","Мај","Јун","Јул","Ðвг","Сеп","Окт","Ðов","Дец"],dayNames:["Ðедеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Ðед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Ðе","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sr-cyrl",{buttonText:{month:"МеÑец",week:"Ðедеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Ðема догађаја за приказ"})}(),function(){!function(){var e=a.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mÃ¥n_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_mÃ¥_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[IgÃ¥r] LT",nextWeek:"[PÃ¥] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"nÃ¥gra sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en mÃ¥nad",MM:"%d mÃ¥nader",y:"ett Ã¥r",yy:"%d Ã¥r"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var a=e%10,t=1===~~(e%100/10)?"e":1===a?"a":2===a?"a":"e";return e+t},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","MÃ¥n","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","MÃ¥ndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","MÃ¥","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("sv",{buttonText:{month:"MÃ¥nad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})}(),function(){!function(){var e=a.defineLocale("th",{months:"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),monthsShort:"ม.ค._à¸.พ._มี.ค._เม.ย._พ.ค._มิ.ย._à¸.ค._ส.ค._à¸.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,a,t){return e<12?"à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT",sameElse:"L"},relativeTime:{future:"อีภ%s",past:"%sที่à¹à¸¥à¹‰à¸§",s:"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",
+y:"1 ปี",yy:"%d ปี"}});return e}(),e.fullCalendar.datepickerLocale("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มà¸à¸£à¸²à¸„ม","à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","à¸à¸£à¸à¸Žà¸²à¸„ม","สิงหาคม","à¸à¸±à¸™à¸¢à¸²à¸¢à¸™","ตุลาคม","พฤศจิà¸à¸²à¸¢à¸™","ธันวาคม"],monthNamesShort:["ม.ค.","à¸.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","à¸.ค.","ส.ค.","à¸.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุà¸à¸£à¹Œ","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"à¹à¸œà¸™à¸‡à¸²à¸™"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีà¸à¸´à¸ˆà¸à¸£à¸£à¸¡à¸—ี่จะà¹à¸ªà¸”ง"})}(),function(){!function(){var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"},t=a.defineLocale("tr",{months:"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(a){if(0===a)return a+"'ıncı";var t=a%10,n=a%100-t,r=a>=100?100:null;return a+(e[t]||e[n]||e[r])},week:{dow:1,doy:7}});return t}(),e.fullCalendar.datepickerLocale("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Åžubat","Mart","Nisan","Mayıs","Haziran","Temmuz","AÄŸustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Åžub","Mar","Nis","May","Haz","Tem","AÄŸu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","ÇarÅŸamba","PerÅŸembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})}(),function(){!function(){function e(e,a){var t=e.split("_");return a%10===1&&a%100!==11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(a,t,n){var r={mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"міÑÑць_міÑÑці_міÑÑців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":a+" "+e(r[n],+a)}function n(e,a){var t={nominative:"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота".split("_"),accusative:"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу".split("_"),genitive:"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи".split("_")},n=/(\[[ВвУу]\]) ?dddd/.test(a)?"accusative":/\[?(?:минулої|наÑтупної)? ?\] ?dddd/.test(a)?"genitive":"nominative";return t[n][e.day()]}function r(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}var s=a.defineLocale("uk",{months:{format:"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ".split("_"),standalone:"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень".split("_")},monthsShort:"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),weekdaysMin:"нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY Ñ€.",LLL:"D MMMM YYYY Ñ€., HH:mm",LLLL:"dddd, D MMMM YYYY Ñ€., HH:mm"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька Ñекунд",m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"міÑÑць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|днÑ|вечора/,isPM:function(e){return/^(днÑ|вечора)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночі":e<12?"ранку":e<17?"днÑ":"вечора"},ordinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-й";case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}});return s}(),e.fullCalendar.datepickerLocale("uk","uk",{closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","ВереÑень","Жовтень","ЛиÑтопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","ЛиÑ","Гру"],dayNames:["неділÑ","понеділок","вівторок","Ñереда","четвер","п’ÑтницÑ","Ñубота"],dayNamesShort:["нед","пнд","вів","Ñрд","чтв","птн","Ñбт"],dayNamesMin:["Ðд","Пн","Ð’Ñ‚","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("uk",{buttonText:{month:"МіÑÑць",week:"Тиждень",day:"День",list:"ПорÑдок денний"},allDayText:"УвеÑÑŒ день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Ðемає подій Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ"})}(),function(){!function(){var e=a.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tá»›i lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tá»›i",past:"%s trÆ°á»›c",s:"vài giây",m:"má»™t phút",mm:"%d phút",h:"má»™t giá»",hh:"%d giá»",d:"má»™t ngày",dd:"%d ngày",M:"má»™t tháng",MM:"%d tháng",y:"má»™t năm",yy:"%d năm"},ordinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("vi","vi",{closeText:"Äóng",prevText:"&#x3C;TrÆ°á»›c",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Má»™t","Tháng Hai","Tháng Ba","Tháng TÆ°","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng MÆ°á»i","Tháng MÆ°á»i Má»™t","Tháng MÆ°á»i Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ TÆ°","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.locale("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sá»± kiện để hiển thị"})}(),function(){!function(){var e=a.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah点mm分",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah点mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh点mm分",l:"YYYY-MM-DD",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah点mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh点mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"下åˆ"===a||"晚上"===a?e+12:e>=11?e:e+12},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,t;return e=a().startOf("week"),t=this.diff(e,"days")>=7?"[下]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},lastWeek:function(){var e,t;return e=a().startOf("week"),t=this.unix()<e.unix()?"[上]":"[本]",0===this.minutes()?t+"dddAh点整":t+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(æ—¥|月|周)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%så‰",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 å°æ—¶",hh:"%d å°æ—¶",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 å¹´",yy:"%d å¹´"},week:{dow:1,doy:4}});return e}(),e.fullCalendar.datepickerLocale("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-cn",{buttonText:{month:"月",week:"周",day:"æ—¥",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"å¦å¤– "+e+" 个"},noEventsMessage:"没有事件显示"})}(),function(){!function(){var e=a.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_ä¹æœˆ_å月_å一月_å二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"æ—¥_一_二_三_å››_五_å…­".split("_"),longDateFormat:{LT:"Ah點mm分",LTS:"Ah點m分s秒",L:"YYYYå¹´MMMDæ—¥",LL:"YYYYå¹´MMMDæ—¥",LLL:"YYYYå¹´MMMDæ—¥Ah點mm分",LLLL:"YYYYå¹´MMMDæ—¥ddddAh點mm分",l:"YYYYå¹´MMMDæ—¥",ll:"YYYYå¹´MMMDæ—¥",lll:"YYYYå¹´MMMDæ—¥Ah點mm分",llll:"YYYYå¹´MMMDæ—¥ddddAh點mm分"},meridiemParse:/凌晨|早上|上åˆ|中åˆ|下åˆ|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上åˆ"===a?e:"中åˆ"===a?e>=11?e:e+12:"下åˆ"===a||"晚上"===a?e+12:void 0},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上åˆ":n<1230?"中åˆ":n<1800?"下åˆ":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},ordinalParse:/\d{1,2}(æ—¥|月|週)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"æ—¥";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%så…§",past:"%så‰",s:"幾秒",m:"1 分é˜",mm:"%d 分é˜",h:"1 å°æ™‚",hh:"%d å°æ™‚",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 å¹´",yy:"%d å¹´"}});return e}(),e.fullCalendar.datepickerLocale("zh-tw","zh-TW",{closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","ä¹æœˆ","å月","å一月","å二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["æ—¥","一","二","三","å››","五","å…­"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"å¹´"}),e.fullCalendar.locale("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"活動列表"},allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"})}(),a.locale("en"),e.fullCalendar.locale("en"),e.datepicker&&e.datepicker.setDefaults(e.datepicker.regional[""])}); \ No newline at end of file
diff --git a/library/htmlpurifier-4.6.0-lite/INSTALL b/library/htmlpurifier-4.6.0-lite/INSTALL
deleted file mode 100644
index 677c04aa0..000000000
--- a/library/htmlpurifier-4.6.0-lite/INSTALL
+++ /dev/null
@@ -1,374 +0,0 @@
-
-Install
- How to install HTML Purifier
-
-HTML Purifier is designed to run out of the box, so actually using the
-library is extremely easy. (Although... if you were looking for a
-step-by-step installation GUI, you've downloaded the wrong software!)
-
-While the impatient can get going immediately with some of the sample
-code at the bottom of this library, it's well worth reading this entire
-document--most of the other documentation assumes that you are familiar
-with these contents.
-
-
----------------------------------------------------------------------------
-1. Compatibility
-
-HTML Purifier is PHP 5 only, and is actively tested from PHP 5.0.5 and
-up. It has no core dependencies with other libraries. PHP
-4 support was deprecated on December 31, 2007 with HTML Purifier 3.0.0.
-HTML Purifier is not compatible with zend.ze1_compatibility_mode.
-
-These optional extensions can enhance the capabilities of HTML Purifier:
-
- * iconv : Converts text to and from non-UTF-8 encodings
- * bcmath : Used for unit conversion and imagecrash protection
- * tidy : Used for pretty-printing HTML
-
-These optional libraries can enhance the capabilities of HTML Purifier:
-
- * CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
- * Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
-
----------------------------------------------------------------------------
-2. Reconnaissance
-
-A big plus of HTML Purifier is its inerrant support of standards, so
-your web-pages should be standards-compliant. (They should also use
-semantic markup, but that's another issue altogether, one HTML Purifier
-cannot fix without reading your mind.)
-
-HTML Purifier can process these doctypes:
-
-* XHTML 1.0 Transitional (default)
-* XHTML 1.0 Strict
-* HTML 4.01 Transitional
-* HTML 4.01 Strict
-* XHTML 1.1
-
-...and these character encodings:
-
-* UTF-8 (default)
-* Any encoding iconv supports (with crippled internationalization support)
-
-These defaults reflect what my choices would be if I were authoring an
-HTML document, however, what you choose depends on the nature of your
-codebase. If you don't know what doctype you are using, you can determine
-the doctype from this identifier at the top of your source code:
-
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-...and the character encoding from this code:
-
- <meta http-equiv="Content-type" content="text/html;charset=ENCODING">
-
-If the character encoding declaration is missing, STOP NOW, and
-read 'docs/enduser-utf8.html' (web accessible at
-http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
-present, read this document anyway, as many websites specify their
-document's character encoding incorrectly.
-
-
----------------------------------------------------------------------------
-3. Including the library
-
-The procedure is quite simple:
-
- require_once '/path/to/library/HTMLPurifier.auto.php';
-
-This will setup an autoloader, so the library's files are only included
-when you use them.
-
-Only the contents in the library/ folder are necessary, so you can remove
-everything else when using HTML Purifier in a production environment.
-
-If you installed HTML Purifier via PEAR, all you need to do is:
-
- require_once 'HTMLPurifier.auto.php';
-
-Please note that the usual PEAR practice of including just the classes you
-want will not work with HTML Purifier's autoloading scheme.
-
-Advanced users, read on; other users can skip to section 4.
-
-Autoload compatibility
-----------------------
-
- HTML Purifier attempts to be as smart as possible when registering an
- autoloader, but there are some cases where you will need to change
- your own code to accomodate HTML Purifier. These are those cases:
-
- PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
- Because spl_autoload_register() doesn't exist in early versions
- of PHP 5, HTML Purifier has no way of adding itself to the autoload
- stack. Modify your __autoload function to test
- HTMLPurifier_Bootstrap::autoload($class)
-
- For example, suppose your autoload function looks like this:
-
- function __autoload($class) {
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- A modified version with HTML Purifier would look like this:
-
- function __autoload($class) {
- if (HTMLPurifier_Bootstrap::autoload($class)) return true;
- require str_replace('_', '/', $class) . '.php';
- return true;
- }
-
- Note that there *is* some custom behavior in our autoloader; the
- original autoloader in our example would work for 99% of the time,
- but would fail when including language files.
-
- AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
- spl_autoload_register() has the curious behavior of disabling
- the existing __autoload() handler. Users need to explicitly
- spl_autoload_register('__autoload'). Because we use SPL when it
- is available, __autoload() will ALWAYS be disabled. If __autoload()
- is declared before HTML Purifier is loaded, this is not a problem:
- HTML Purifier will register the function for you. But if it is
- declared afterwards, it will mysteriously not work. This
- snippet of code (after your autoloader is defined) will fix it:
-
- spl_autoload_register('__autoload')
-
- Users should also be on guard if they use a version of PHP previous
- to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
- for you, which can collide with an autoloader that was added by *you*
- later.
-
-
-For better performance
-----------------------
-
- Opcode caches, which greatly speed up PHP initialization for scripts
- with large amounts of code (HTML Purifier included), don't like
- autoloaders. We offer an include file that includes all of HTML Purifier's
- files in one go in an opcode cache friendly manner:
-
- // If /path/to/library isn't already in your include path, uncomment
- // the below line:
- // require '/path/to/library/HTMLPurifier.path.php';
-
- require 'HTMLPurifier.includes.php';
-
- Optional components still need to be included--you'll know if you try to
- use a feature and you get a class doesn't exists error! The autoloader
- can be used in conjunction with this approach to catch classes that are
- missing. Simply add this afterwards:
-
- require 'HTMLPurifier.autoload.php';
-
-Standalone version
-------------------
-
- HTML Purifier has a standalone distribution; you can also generate
- a standalone file from the full version by running the script
- maintenance/generate-standalone.php . The standalone version has the
- benefit of having most of its code in one file, so parsing is much
- faster and the library is easier to manage.
-
- If HTMLPurifier.standalone.php exists in the library directory, you
- can use it like this:
-
- require '/path/to/HTMLPurifier.standalone.php';
-
- This is equivalent to including HTMLPurifier.includes.php, except that
- the contents of standalone/ will be added to your path. To override this
- behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
- be found (usually, this will be one directory up, the "true" library
- directory in full distributions). Don't forget to set your path too!
-
- The autoloader can be added to the end to ensure the classes are
- loaded when necessary; otherwise you can manually include them.
- To use the autoloader, use this:
-
- require 'HTMLPurifier.autoload.php';
-
-For advanced users
-------------------
-
- HTMLPurifier.auto.php performs a number of operations that can be done
- individually. These are:
-
- HTMLPurifier.path.php
- Puts /path/to/library in the include path. For high performance,
- this should be done in php.ini.
-
- HTMLPurifier.autoload.php
- Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
-
- You can do these operations by yourself--in fact, you must modify your own
- autoload handler if you are using a version of PHP earlier than PHP 5.1.2
- (See "Autoload compatibility" above).
-
-
----------------------------------------------------------------------------
-4. Configuration
-
-HTML Purifier is designed to run out-of-the-box, but occasionally HTML
-Purifier needs to be told what to do. If you answer no to any of these
-questions, read on; otherwise, you can skip to the next section (or, if you're
-into configuring things just for the heck of it, skip to 4.3).
-
-* Am I using UTF-8?
-* Am I using XHTML 1.0 Transitional?
-
-If you answered no to any of these questions, instantiate a configuration
-object and read on:
-
- $config = HTMLPurifier_Config::createDefault();
-
-
-4.1. Setting a different character encoding
-
-You really shouldn't use any other encoding except UTF-8, especially if you
-plan to support multilingual websites (read section three for more details).
-However, switching to UTF-8 is not always immediately feasible, so we can
-adapt.
-
-HTML Purifier uses iconv to support other character encodings, as such,
-any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
-HTML Purifier supports with this code:
-
- $config->set('Core.Encoding', /* put your encoding here */);
-
-An example usage for Latin-1 websites (the most common encoding for English
-websites):
-
- $config->set('Core.Encoding', 'ISO-8859-1');
-
-Note that HTML Purifier's support for non-Unicode encodings is crippled by the
-fact that any character not supported by that encoding will be silently
-dropped, EVEN if it is ampersand escaped. If you want to work around
-this, you are welcome to read docs/enduser-utf8.html for a fix,
-but please be cognizant of the issues the "solution" creates (for this
-reason, I do not include the solution in this document).
-
-
-4.2. Setting a different doctype
-
-For those of you using HTML 4.01 Transitional, you can disable
-XHTML output like this:
-
- $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
-
-Other supported doctypes include:
-
- * HTML 4.01 Strict
- * HTML 4.01 Transitional
- * XHTML 1.0 Strict
- * XHTML 1.0 Transitional
- * XHTML 1.1
-
-
-4.3. Other settings
-
-There are more configuration directives which can be read about
-here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
-but they can help out for those of you who like to exert maximum control over
-your code. Some of the more interesting ones are configurable at the
-demo <http://htmlpurifier.org/demo.php> and are well worth looking into
-for your own system.
-
-For example, you can fine tune allowed elements and attributes, convert
-relative URLs to absolute ones, and even autoparagraph input text! These
-are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
-%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
-translates to:
-
- $config->set('Namespace.Directive', $value);
-
-E.g.
-
- $config->set('HTML.Allowed', 'p,b,a[href],i');
- $config->set('URI.Base', 'http://www.example.com');
- $config->set('URI.MakeAbsolute', true);
- $config->set('AutoFormat.AutoParagraph', true);
-
-
----------------------------------------------------------------------------
-5. Caching
-
-HTML Purifier generates some cache files (generally one or two) to speed up
-its execution. For maximum performance, make sure that
-library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
-
-If you are in the library/ folder of HTML Purifier, you can set the
-appropriate permissions using:
-
- chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
-
-If the above command doesn't work, you may need to assign write permissions
-to all. This may be necessary if your webserver runs as nobody, but is
-not recommended since it means any other user can write files in the
-directory. Use:
-
- chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer
-
-You can also chmod files via your FTP client; this option
-is usually accessible by right clicking the corresponding directory and
-then selecting "chmod" or "file permissions".
-
-Starting with 2.0.1, HTML Purifier will generate friendly error messages
-that will tell you exactly what you have to chmod the directory to, if in doubt,
-follow its advice.
-
-If you are unable or unwilling to give write permissions to the cache
-directory, you can either disable the cache (and suffer a performance
-hit):
-
- $config->set('Core.DefinitionCache', null);
-
-Or move the cache directory somewhere else (no trailing slash):
-
- $config->set('Cache.SerializerPath', '/home/user/absolute/path');
-
-
----------------------------------------------------------------------------
-6. Using the code
-
-The interface is mind-numbingly simple:
-
- $purifier = new HTMLPurifier($config);
- $clean_html = $purifier->purify( $dirty_html );
-
-That's it! For more examples, check out docs/examples/ (they aren't very
-different though). Also, docs/enduser-slow.html gives advice on what to
-do if HTML Purifier is slowing down your application.
-
-
----------------------------------------------------------------------------
-7. Quick install
-
-First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
-writable by the webserver (see Section 5: Caching above for details).
-If your website is in UTF-8 and XHTML Transitional, use this code:
-
-<?php
- require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
-
- $config = HTMLPurifier_Config::createDefault();
- $purifier = new HTMLPurifier($config);
- $clean_html = $purifier->purify($dirty_html);
-?>
-
-If your website is in a different encoding or doctype, use this code:
-
-<?php
- require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
- $config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
- $purifier = new HTMLPurifier($config);
-
- $clean_html = $purifier->purify($dirty_html);
-?>
-
- vim: et sw=4 sts=4
diff --git a/library/htmlpurifier-4.6.0-lite/NEWS b/library/htmlpurifier-4.6.0-lite/NEWS
deleted file mode 100644
index 90a054620..000000000
--- a/library/htmlpurifier-4.6.0-lite/NEWS
+++ /dev/null
@@ -1,1078 +0,0 @@
-NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-
-= KEY ====================
- # Breaks back-compat
- ! Feature
- - Bugfix
- + Sub-comment
- . Internal change
-==========================
-
-4.6.0, released 2013-11-30
-# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
- Please update any verification scripts you may have.
-# URI parsing algorithm was made more strict, so only prefixes which
- looks like schemes will actually be schemes. Thanks
- Michael Gusev <mgusev@sugarcrm.com> for fixing.
-# %Core.EscapeInvalidChildren is no longer supported, and no longer does
- anything.
-! New directive %Core.AllowHostnameUnderscore which allows underscores
- in hostnames.
-- Eliminate quadratic behavior in DOMLex by using a proper queue.
- Thanks Ole Laursen for noticing this.
-- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
- behavior in the rest of the purificaiton pipeline. Thanks Chedburn
- Networks for sponsoring this work.
-- Made Linkify URL parser a bit less permissive, so that non-breaking
- spaces and commas are not included as part of URL. Thanks nAS for fixing.
-- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
- David Hirtz for reporting.
-- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
- for reporting.
-
-4.5.0, released 2013-02-17
-# Fix bug where stacked attribute transforms clobber each other;
- this also means it's no longer possible to override attribute
- transforms in later modules. No internal code was using this
- but this may break some clients.
-# We now use SHA-1 to identify cached definitions, instead of MD5.
-! Support display:inline-block
-! Support for more white-space CSS values.
-! Permit underscores in font families
-! Support for page-break-* CSS3 properties when proprietary properties
- are enabled.
-! New directive %Core.DisableExcludes; can be set to 'true' to turn off
- SGML excludes checking. If HTML Purifier is removing too much text
- and you don't care about full standards compliance, try setting this to
- 'true'.
-- Use prepend for SPL autoloading on PHP 5.3 and later.
-- Fix bug with nofollow transform when pre-existing rel exists.
-- Fix bug where background:url() always gets lower-cased
- (but not background-image:url())
-- Fix bug with non lower-case color names in HTML
-- Fix bug where data URI validation doesn't remove temporary files.
- Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
-- Don't remove certain empty tags on RemoveEmpty.
-
-4.4.0, released 2012-01-18
-# Removed PEARSax3 handler.
-# URI.Munge now munges URIs inside the same host that go from https
- to http. Reported by Neike Taika-Tessaro.
-# Core.EscapeNonASCIICharacters now always transforms entities to
- entities, even if target encoding is UTF-8.
-# Tighten up selector validation in ExtractStyleBlocks.
- Non-syntactically valid selectors are now rejected, along with
- some of the more obscure ones such as attribute selectors, the
- :lang pseudoselector, and anything not in CSS2.1. Furthermore,
- ID and class selectors now work properly with the relevant
- configuration attributes. Also, mute errors when parsing CSS
- with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
-! Added support for 'scope' attribute on tables.
-! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
-! Properly handle sub-lists directly nested inside of lists in
- a standards compliant way, by moving them into the preceding <li>
-! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
- limited allowed comments in untrusted situations.
-! Implement iframes, and allow them to be used in untrusted mode with
- %HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
- <brad.froehle@gmail.com> for submitting an initial version of the patch.
-! The Forms module now works properly for transitional doctypes.
-! Added support for internationalized domain names. You need the PEAR
- Net_IDNA2 module to be in your path; if it is installed, ensure the
- class can be loaded and then set %Core.EnableIDNA to true.
-- Color keywords are now case insensitive. Thanks Yzmir Ramirez
- <yramirez-htmlpurifier@adicio.com> for reporting.
-- Explicitly initialize anonModule variable to null.
-- Do not duplicate nofollow if already present. Thanks 178
- for reporting.
-- Do not add nofollow if hostname matches our current host. Thanks 178
- for reporting, and Neike Taika-Tessaro for helping diagnose.
-- Do not unset parser variable; this fixes intermittent serialization
- problems. Thanks Neike Taika-Tessaro for reporting, bill
- <10010tiger@gmail.com> for diagnosing.
-- Fix iconv truncation bug, where non-UTF-8 target encodings see
- output truncated after around 8000 characters. Thanks Jörg Ludwig
- <joerg.ludwig@iserv.eu> for reporting.
-- Fix broken table content model for XHTML1.1 (and also earlier
- versions, although the W3C validator doesn't catch those violations).
- Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
-
-4.3.0, released 2011-03-27
-# Fixed broken caching of customized raw definitions, but requires an
- API change. The old API still works but will emit a warning,
- see http://htmlpurifier.org/docs/enduser-customize.html#optimized
- for how to upgrade your code.
-# Protect against Internet Explorer innerHTML behavior by specially
- treating attributes with backticks but no angled brackets, quotes or
- spaces. This constitutes a slight semantic change, which can be
- reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
- and Mario Heiderich.
-# Protect against cssText/innerHTML by restricting allowed characters
- used in fonts further than mandated by the specification and encoding
- some extra special characters in URLs. Reported by Neike
- Taika-Tessaro and Mario Heiderich.
-! Added %HTML.Nofollow to add rel="nofollow" to external links.
-! More types of SPL autoloaders allowed on later versions of PHP.
-! Implementations for position, top, left, right, bottom, z-index
- when %CSS.Trusted is on.
-! Add %Cache.SerializerPermissions option for custom serializer
- directory/file permissions
-! Fix longstanding bug in Flash support for non-IE browsers, and
- allow more wmode attributes.
-! Add %CSS.AllowedFonts to restrict permissible font names.
-- Switch to an iterative traversal of the DOM, which prevents us
- from running out of stack space for deeply nested documents.
- Thanks Maxim Krizhanovsky for contributing a patch.
-- Make removal of conditional IE comments ungreedy; thanks Bernd
- for reporting.
-- Escape CDATA before removing Internet Explorer comments.
-- Fix removal of id attributes under certain conditions by ensuring
- armor attributes are preserved when recreating tags.
-- Check if schema.ser was corrupted.
-- Check if zend.ze1_compatibility_mode is on, and error out if it is.
- This safety check is only done for HTMLPurifier.auto.php; if you
- are using standalone or the specialized includes files, you're
- expected to know what you're doing.
-- Stop repeatedly writing the cache file after I'm done customizing a
- raw definition. Reported by ajh.
-- Switch to using require_once in the Bootstrap to work around bad
- interaction with Zend Debugger and APC. Reported by Antonio Parraga.
-- Fix URI handling when hostname is missing but scheme is present.
- Reported by Neike Taika-Tessaro.
-- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
- for reporting.
-- Fix harmless notice from indexing into empty string. Thanks Matthijs
- Kooijman <matthijs@stdin.nl> for reporting.
-- Don't autoclose no parent elements are able to support the element
- that triggered the autoclose. In particular fixes strange behavior
- of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
- Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
-
-4.2.0, released 2010-09-15
-! Added %Core.RemoveProcessingInstructions, which lets you remove
- <? ... ?> statements.
-! Added %URI.DisableResources functionality; the directive originally
- did nothing. Thanks David Rothstein for reporting.
-! Add documentation about configuration directive types.
-! Add %CSS.ForbiddenProperties configuration directive.
-! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
- to utilize full-screen mode.
-! Add optional support for the <code>file</code> URI scheme, enable
- by explicitly setting %URI.AllowedSchemes.
-! Add %Core.NormalizeNewlines options to allow turning off newline
- normalization.
-- Fix improper handling of Internet Explorer conditional comments
- by parser. Thanks zmonteca for reporting.
-- Fix missing attributes bug when running on Mac Snow Leopard and APC.
- Thanks sidepodcast for the fix.
-- Warn if an element is allowed, but an attribute it requires is
- not allowed.
-
-4.1.1, released 2010-05-31
-- Fix undefined index warnings in maintenance scripts.
-- Fix bug in DirectLex for parsing elements with a single attribute
- with entities.
-- Rewrite CSS output logic for font-family and url(). Thanks Mario
- Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
- Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
-- Emit an error for CollectErrors if a body is extracted
-- Fix bug where in background-position for center keyword handling.
-- Fix infinite loop when a wrapper element is inserted in a context
- where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
-- Remove +x bit and shebang from index.php; only supported mode is to
- explicitly call it with php.
-- Make test script less chatty when log_errors is on.
-
-4.1.0, released 2010-04-26
-! Support proprietary height attribute on table element
-! Support YouTube slideshows that contain /cp/ in their URL.
-! Support for data: URI scheme; not enabled by default, add it using
- %URI.AllowedSchemes
-! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
-! Support for Internet Explorer compatibility with %HTML.SafeObject
- using %Output.FlashCompat.
-! Handle <ol><ol> properly, by inserting the necessary <li> tag.
-- Always quote the insides of url(...) in CSS.
-
-4.0.0, released 2009-07-07
-# APIs for ConfigSchema subsystem have substantially changed. See
- docs/dev-config-bcbreaks.txt for details; in essence, anything that
- had both namespace and directive now have a single unified key.
-# Some configuration directives were renamed, specifically:
- %AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
- %FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
- %FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
- %FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
- As usual, the old directive names will still work, but will throw E_NOTICE
- errors.
-# The allowed values for class have been relaxed to allow all of CDATA for
- doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
- %Attr.ClassUseCDATA to false.
-# Instead of appending the content model to an old content model, a blank
- element will replace the old content model. You can use #SUPER to get
- the old content model.
-! More robust support for name="" and id=""
-! HTMLPurifier_Config::inherit($config) allows you to inherit one
- configuration, and have changes to that configuration be propagated
- to all of its children.
-! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
- the name attribute when set. Use with care. Thanks Ian Cook for
- sponsoring.
-! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
- tags that contain non-breaking spaces as well other whitespace. You
- can also modify which tags should have &nbsp; maintained with
- %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
-! Implement %Attr.AllowedClasses, which allows administrators to restrict
- classes users can use to a specified finite set of classes, and
- %Attr.ForbiddenClasses, which is the logical inverse.
-! You can now maintain your own configuration schema directories by
- creating a config-schema.php file or passing an extra argument. Check
- docs/dev-config-schema.html for more details.
-! Added HTMLPurifier_Config->serialize() method, which lets you save away
- your configuration in a compact serial file, which you can unserialize
- and use directly without having to go through the overhead of setup.
-- Fix bug where URIDefinition would not get cleared if it's directives got
- changed.
-- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
-- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
-- Make %URI.Munge not apply to links that have the same host as your host.
-- Prevent stray </body> tag from truncating output, if a second </body>
- is present.
-. Created script maintenance/rename-config.php for renaming a configuration
- directive while maintaining its alias. This script does not change source code.
-. Implement namespace locking for definition construction, to prevent
- bugs where a directive is used for definition construction but is not
- used to construct the cache hash.
-
-3.3.0, released 2009-02-16
-! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
-! Implement generic property list classess
-- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
- does not do the "right thing" with characters not supported in the output
- set.
-- Spellcheck UTF-8: The Secret To Character Encoding
-- Fix improper removal of the contents of elements with only whitespace. Thanks
- Eric Wald for reporting.
-- Fix broken test suite in versions of PHP without spl_autoload_register()
-- Fix degenerate case with YouTube filter involving double hyphens.
- Thanks Pierre Attar for reporting.
-- Fix YouTube rendering problem on certain versions of Firefox.
-- Fix CSSDefinition Printer problems with decorators
-- Add text parameter to unit tests, forces text output
-. Add verbose mode to command line test runner, use (--verbose)
-. Turn on unit tests for UnitConverter
-. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
-. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
- tested on Linux.
-. Removed trailing whitespace from all text files, see
- remote-trailing-whitespace.php maintenance script.
-. Convert configuration to use property list backend.
-
-3.2.0, released 2008-10-31
-# Using %Core.CollectErrors forces line number/column tracking on, whereas
- previously you could theoretically turn it off.
-# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
- use handleEnd() instead.
-! %Output.AttrSort for when you need your attributes in alphabetical order to
- deal with a bug in FCKEditor. Requested by frank farmer.
-! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
-! Proper support for name attribute. It is now allowed and equivalent to the id
- attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
- is heavy (for all doctypes).
-! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
- use on hand-written HTML.
-! Add error-cases for unsupported elements in MakeWellFormed. This enables
- the strategy to be used, standalone, on untrusted input.
-! %Core.AggressivelyFixLt is on by default. This causes more sensible
- processing of left angled brackets in smileys and other whatnot.
-! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
- 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
- the --only-phpt parameter, although for backwards-compatibility the flag
- will still work.
-! AutoParagraph auto-formatter will now preserve double-newlines upon output.
- Users who are not performing inbound filtering, this may seem a little
- useless, but as a bonus, the test suite and handling of edge cases is also
- improved.
-! Experimental implementation of forms for %HTML.Trusted
-! Track column numbers when maintain line numbers is on
-! Proprietary 'background' attribute on table-related elements converted into
- corresponding CSS. Thanks Fusemail for sponsoring this feature!
-! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
- supertype.
-! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
- time of operation varies slightly from notifyEnd() as *all* end tokens are
- processed by the injector before they are subject to the well-formedness rules.
-! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
- basename of image when not present.
-! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
-- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
- the other involving an undefined $is_folder error.
-- Throw error when %Core.Encoding is set to a spurious value. Previously,
- this errored silently and returned false.
-- Redirected stderr to stdout for flush error output.
-- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
- available.
-- Do not re-munge URL if the output URL has the same host as the input URL.
- Requested by Chris.
-- Fix error in documentation regarding %Filter.ExtractStyleBlocks
-- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
-- Fix bug with inline elements in blockquotes conflicting with strict doctype
-- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
-- Fix bug where dots and double-dots in absolute URLs without hostname were
- not collapsed by URIFilter_MakeAbsolute.
-- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
- by reordering their addition.
-- Will now throw exception on many error conditions during lexer creation; also
- throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
- is being used.
-- Detect if domxml extension is loaded, and use DirectLEx accordingly.
-- Improve handling of big numbers with floating point arithmetic in UnitConverter.
- Reported by David Morton.
-. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
- for more interesting filter-backtracking
-. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
- index to reprocess tokens.
-. StringHashParser now allows for multiline sections with "empty" content;
- previously the section would remain undefined.
-. Added --quick option to multitest.php, which tests only the most recent
- release for each series.
-. Added --distro option to multitest.php, which accepts either 'normal' or
- 'standalone'. This supercedes --exclude-normal and --exclude-standalone
-
-3.1.1, released 2008-06-19
-# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
- In order to enable this again, please set %URI.MungeResources to true.
-! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
- and height/width HTML with %HTML.MaxImgLength.
-! %URI.MungeSecretKey for secure URI munging. Thanks Chris
- for sponsoring this feature. Check out the corresponding documentation
- for details. (Att Nightly testers: The API for this feature changed before
- the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
- %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
-! Implemented post URI filtering. Set member variable $post to true to set
- a URIFilter as such.
-! Allow modules to define injectors via $info_injector. Injectors are
- automatically disabled if injector's needed elements are not found.
-! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
- Thanks Chris for sponsoring. If you've been using ad hoc code from the
- forums, PLEASE use this instead.
-! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
- embedded, tag name, attribute name, CSS property name). See %URI.Munge
- for more details. Requested by Jochem Blok.
-- Disable percent height/width attributes for img.
-- AttrValidator operations are now atomic; updates to attributes are not
- manifest in token until end of operations. This prevents naughty internal
- code from directly modifying CurrentToken when they're not supposed to.
- This semantics change was requested by frank farmer.
-- Percent encoding checks enabled for URI query and fragment
-- Fix stray backslashes in font-family; CSS Unicode character escapes are
- now properly resolved (although *only* in font-family). Thanks Takeshi Terada
- for reporting.
-- Improve parseCDATA algorithm to take into account newline normalization
-- Account for browser confusion between Yen character and backslash in
- Shift_JIS encoding. This fix generalizes to any other encoding which is not
- a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
-- Fix missing configuration parameter in Generator calls. Thanks vs for the
- partial patch.
-- Improved adherence to Unicode by checking for non-character codepoints.
- Thanks Geoffrey Sneddon for reporting. This may result in degraded
- performance for extremely large inputs.
-- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
- for reporting.
-. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
- handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
- this class.
-. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
- to __construct($min, $max). __construct(true) is equivalent to
- __construct('0').
-. Added HTMLPurifier_AttrDef_Switch class
-. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
- up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
- get this called with the configuration object. All modules now
- use this rather than __construct(), although legacy code using constructors
- will still work--the new format, however, lets modules access the
- configuration object for HTML namespace dependant tweaks.
-. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
-. ConfigSchema data-structure heavily optimized; on average it uses a third
- the memory it did previously. The interface has changed accordingly,
- consult changes to HTMLPurifier_Config for details.
-. Variable parsing types now are magic integers instead of strings
-. Added benchmark for ConfigSchema
-. HTMLPurifier_Generator requires $config and $context parameters. If you
- don't know what they should be, use HTMLPurifier_Config::createDefault()
- and new HTMLPurifier_Context().
-. Printers now properly distinguish between output configuration, and
- target configuration. This is not applicable to scripts using
- the Printers for HTML Purifier related tasks.
-. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
- fatal errors will ensue.
-. URIFilter->prepare can return false in order to abort loading of the filter
-. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
- an external resource.
-. %URI.Munge functionality factored out into a post-filter class.
-. Added CurrentCSSProperty context variable during CSS validation
-
-3.1.0, released 2008-05-18
-# Unnecessary references to objects (vestiges of PHP4) removed from method
- signatures. The following methods do not need references when assigning from
- them and will result in E_STRICT errors if you try:
- + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
- + HTMLPurifier_ConfigSchema::instance()
- + HTMLPurifier_DefinitionCacheFactory::instance()
- + HTMLPurifier_DefinitionCacheFactory->create()
- + HTMLPurifier_DoctypeRegistry->register()
- + HTMLPurifier_DoctypeRegistry->get()
- + HTMLPurifier_HTMLModule->addElement()
- + HTMLPurifier_HTMLModule->addBlankElement()
- + HTMLPurifier_LanguageFactory::instance()
-# Printer_ConfigForm's get*() functions were static-ified
-# %HTML.ForbiddenAttributes requires attribute declarations to be in the
- form of tag@attr, NOT tag.attr (which will throw an error and won't do
- anything). This is for forwards compatibility with XML; you'd do best
- to migrate an %HTML.AllowedAttributes directives to this syntax too.
-! Allow index to be false for config from form creation
-! Added HTMLPurifier::VERSION constant
-! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
- and allows for version numbers like "3.1.0-dev".
-! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
-! HTML Purifier's URI handling is a lot more robust, with much stricter
- validation checks and better percent encoding handling. Thanks Gareth Heyes
- for indicating security vulnerabilities from lax percent encoding.
-! Bootstrap autoloader deals more robustly with classes that don't exist,
- preventing class_exists($class, true) from barfing.
-- InterchangeBuilder now alphabetizes its lists
-- Validation error in configdoc output fixed
-- Iconv and other encoding errors muted even with custom error handlers that
- do not honor error_reporting
-- Add protection against imagecrash attack with CSS height/width
-- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
-- Fixed and revamped broken ConfigForm smoketest
-- Bug with bool/null fields in Printer_ConfigForm fixed
-- Bug with global forbidden attributes fixed
-- Improved error messages for allowed and forbidden HTML elements and attributes
-- Missing (or null) in configdoc documentation restored
-- If DOM throws and exception during parsing with PH5P (occurs in newer versions
- of DOM), HTML Purifier punts to DirectLex
-- Fatal error with unserialization of ScriptRequired
-- Created directories are now chmod'ed properly
-- Fixed bug with fallback languages in LanguageFactory
-- Standalone testing setup properly with autoload
-. Out-of-date documentation revised
-. UTF-8 encoding check optimization as suggested by Diego
-. HTMLPurifier_Error removed in favor of exceptions
-. More copy() function removed; should use clone instead
-. More extensive unit tests for HTMLDefinition
-. assertPurification moved to central harness
-. HTMLPurifier_Generator accepts $config and $context parameters during
- instantiation, not runtime
-. Double-quotes outside of attribute values are now unescaped
-
-3.1.0rc1, released 2008-04-22
-# Autoload support added. Internal require_once's removed in favor of an
- explicit require list or autoloading. To use HTML Purifier,
- you must now either use HTMLPurifier.auto.php
- or HTMLPurifier.includes.php; setting the include path and including
- HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
- as well to register our autoload handler (or modify your autoload function
- to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
- HTMLPurifier.safe-includes.php for a less performance friendly but more
- user-friendly library load.
-# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
- information is stored in the ConfigSchema directory, and the
- maintenance/generate-schema-cache.php generates the schema.ser file, which
- is now instantiated. Support for userland schema changes coming soon!
-# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
- alias; to get rid of these errors just modify your configuration to use
- the new directive name.
-# HTMLPurifier->addFilter is deprecated; built-in filters can now be
- enabled using %Filter.$filter_name or by setting your own filters using
- %Filter.Custom
-# Directive-level safety properties superceded in favor of module-level
- safety. Internal method HTMLModule->addElement() has changed, although
- the externally visible HTMLDefinition->addElement has *not* changed.
-! Extra utility classes for testing and non-library operations can
- be found in extras/. Specifically, these are FSTools and ConfigDoc.
- You may find a use for these in your own project, but right now they
- are highly experimental and volatile.
-! Integration with PHPT allows for automated smoketests
-! Limited support for proprietary HTML elements, namely <marquee>, sponsored
- by Chris. You can enable them with %HTML.Proprietary if your client
- demands them.
-! Support for !important CSS cascade modifier. By default, this will be stripped
- from CSS, but you can enable it using %CSS.AllowImportant
-! Support for display and visibility CSS properties added, set %CSS.AllowTricky
- to true to use them.
-! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
- Developer error (not enduser error) can cause these to be triggered.
-! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
-! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
- mucking around with HTMLPurifier_CSSDefinition
-! ConfigDoc output has been enhanced with version and deprecation info.
-! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
-- Autoclose now operates iteratively, i.e. <span><span><div> now has
- both span tags closed.
-- Various HTMLPurifier_Config convenience functions now accept another parameter
- $schema which defines what HTMLPurifier_ConfigSchema to use besides the
- global default.
-- Fix bug with trusted script handling in libxml versions later than 2.6.28.
-- Fix bug in ExtractStyleBlocks with comments in style tags
-- Fix bug in comment parsing for DirectLex
-- Flush output now displayed when in command line mode for unit tester
-- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
-- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
- on the same element without emitting errors.
-- Fixed fatal error in PH5P lexer with invalid tag names
-. Plugins now get their own changelogs according to project conventions.
-. Convert tokens to use instanceof, reducing memory footprint and
- improving comparison speed.
-. Dry runs now supported in SimpleTest; testing facilities improved
-. Bootstrap class added for handling autoloading functionality
-. Implemented recursive glob at FSTools->globr
-. ConfigSchema now has instance methods for all corresponding define*
- static methods.
-. A couple of new historical maintenance scripts were added.
-. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
-. tests/index.php can now be run from any directory.
-. HTMLPurifier_Token subclasses split into seperate files
-. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
-. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
-. New --php=php flag added, allows PHP executable to be specified (command
- line only!)
-. htmlpurifier_add_test() preferred method to translate test files in to
- classes, because it handles PHPT files too.
-. Debugger class is deprecated and will be removed soon.
-. Command line argument parsing for testing scripts revamped, now --opt value
- format is supported.
-. Smoketests now cleanup after magic quotes
-. Generator now can output comments (however, comments are still stripped
- from HTML Purifier output)
-. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
- HTMLPurifier_VarParser->parse()
-. Integers auto-cast into float type by VarParser.
-. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
- during cache generation
-. Reordered script calls in maintenance/flush.php
-. Command line scripts now honor exit codes
-. When --flush fails in unit testers, abort tests and print message
-. Improved documentation in docs/dev-flush.html about the maintenance scripts
-. copy() methods removed in favor of clone keyword
-
-3.0.0, released 2008-01-06
-# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
- until PHP 4 is completely deprecated, but no new features will be added
- to it.
- + Visibility declarations added
- + Constructor methods renamed to __construct()
- + PHP4 reference cruft removed (in progress)
-! CSS properties are now case-insensitive
-! DefinitionCacheFactory now can register new implementations
-! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
- documents and cleaning their contents up. Requires the CSSTidy library
- <http://csstidy.sourceforge.net/>. You can access the blocks with the
- 'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
- The output CSS can also be "scoped" for a specific element, use:
- %Filter.ExtractStyleBlocksScope
-! Experimental support for some proprietary CSS attributes allowed:
- opacity (and all of the browser-specific equivalents) and scrollbar colors.
- Enable by setting %CSS.Proprietary to true.
-- Colors missing # but in hex form will be corrected
-- CSS Number algorithm improved
-- Unit testing and multi-testing now on steroids: command lines,
- XML output, and other goodies now added.
-. Unit tests for Injector improved
-. New classes:
- + HTMLPurifier_AttrDef_CSS_AlphaValue
- + HTMLPurifier_AttrDef_CSS_Filter
-. Multitest now has a file docblock
-
-2.1.3, released 2007-11-05
-! tests/multitest.php allows you to test multiple versions by running
- tests/index.php through multiple interpreters using `phpv` shell
- script (you must provide this script!)
-- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
- on some systems.
-- Injector algorithm further refined: off-by-one error regarding skip
- counts for dormant injectors fixed
-- Corrective blockquote definition now enabled for HTML 4.01 Strict
-- Fatal error when <img> tag (or any other element with required attributes)
- has 'id' attribute fixed, thanks NykO18 for reporting
-- Fix warning emitted when a non-supported URI scheme is passed to the
- MakeAbsolute URIFilter, thanks NykO18 (again)
-- Further refine AutoParagraph injector. Behavior inside of elements
- allowing paragraph tags clarified: only inline content delimeted by
- double newlines (not block elements) are paragraphed.
-- Buggy treatment of end tags of elements that have required attributes
- fixed (does not manifest on default tag-set)
-- Spurious internal content reorganization error suppressed
-- HTMLDefinition->addElement now returns a reference to the created
- element object, as implied by the documentation
-- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
-- Fix a theoretical class of infinite loops from DirectLex reported
- by Nate Abele
-- Work around unnecessary DOMElement type-cast in PH5P that caused errors
- in PHP 5.1
-- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
- HTMLDefinition errors, this may indicate problems with error-collecting
- facilities in PHP 5
-- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
-- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
-. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
- to better communicate its purpose
-. Error unit tests can now specify the expectation of no errors. Future
- iterations of the harness will be extremely strict about what errors
- are allowed
-. Extend Injector hooks to allow for more powerful injector routines
-. HTMLDefinition->addBlankElement created, as according to the HTMLModule
- method
-. Doxygen configuration file updated, with minor improvements
-. Test runner now checks for similarly named files in conf/ directory too.
-. Minor cosmetic change to flush-definition-cache.php: trailing newline is
- outputted
-. Maintenance script for generating PH5P patch added, original PH5P source
- file also added under version control
-. Full unit test runner script title made more descriptive with PHP version
-. Updated INSTALL file to state that 4.3.7 is the earliest version we
- are actively testing
-
-2.1.2, released 2007-09-03
-! Implemented Object module for trusted users
-! Implemented experimental HTML5 parsing mode using PH5P. To use, add
- this to your code:
- require_once 'HTMLPurifier/Lexer/PH5P.php';
- $config->set('Core', 'LexerImpl', 'PH5P');
- Note that this Lexer introduces some classes not in the HTMLPurifier
- namespace. Also, this is PHP5 only.
-! CSS property border-spacing implemented
-- Fix non-visible parsing error in DirectLex with empty tags that have
- slashes inside attribute values.
-- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
- accepted as valid CSS. Usually non-visible, because this styling is the
- default for tables in most browsers. Thanks Brett Zamir for pointing
- this out.
-- Fix validation errors in configuration form
-- Hammer out a bunch of edge-case bugs in the standalone distribution
-- Inclusion reflection removed from URISchemeRegistry; you must manually
- include any new schema files you wish to use
-- Numerous typo fixes in documentation thanks to Brett Zamir
-. Unit test refactoring for one logical test per test function
-. Config and context parameters in ComplexHarness deprecated: instead, edit
- the $config and $context member variables
-. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
- really make a difference, but is good for completeness sake
-. merge-library.php script refactored for greater code reusability and
- PHP4 compatibility
-
-2.1.1, released 2007-08-04
-- Fix show-stopper bug in %URI.MakeAbsolute functionality
-- Fix PHP4 syntax error in standalone version
-. Add prefix directory to include path for standalone, this prevents
- other installations from clobbering the standalone's URI schemes
-. Single test methods can be invoked by prefixing with __only
-
-2.1.0, released 2007-08-02
-# flush-htmldefinition-cache.php superseded in favor of a generic
- flush-definition-cache.php script, you can clear a specific cache
- by passing its name as a parameter to the script
-! Phorum mod implemented for HTML Purifier
-! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
- trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
- for PHP4 (DirectLex).
-! Standalone file now available, which greatly reduces the amount of
- includes (although there are still a few files that reside in the
- standalone folder)
-! Relative URIs can now be transformed into their absolute equivalents
- using %URI.Base and %URI.MakeAbsolute
-! Ruby implemented for XHTML 1.1
-! You can now define custom URI filtering behavior, see enduser-uri-filter.html
- for more details
-! UTF-8 font names now supported in CSS
-- AutoFormatters emit friendly error messages if tags or attributes they
- need are not allowed
-- ConfigForm's compactification of directive names is now configurable
-- AutoParagraph autoformatter algorithm refined after field-testing
-- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
- blockquote wrapping
-- Contents of <style> tags removed by default when tags are removed
-. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
- for output cache invalidation
-. ConfigForm printer now can retrieve CSS and JS files as strings, in
- case HTML Purifier's directory is not publically accessible
-. Introduce new text/itext configuration directive values: these represent
- longer strings that would be more appropriately edited with a textarea
-. Allow newlines to act as separators for lists, hashes, lookups and
- %HTML.Allowed
-. ConfigForm generates textareas instead of text inputs for lists, hashes,
- lookups, text and itext fields
-. Hidden element content removal genericized: %Core.HiddenElements can
- be used to customize this behavior, by default <script> and <style> are
- hidden
-. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
-. Custom ChildDef added to default include list
-. URIScheme reflection improved: will not attempt to include file if class
- already exists. May clobber autoload, so I need to keep an eye on it
-. ConfigSchema heavily optimized, will only collect information and validate
- definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
-. AttrDef_URI unit tests and implementation refactored
-. benchmarks/ directory now protected from public view with .htaccess file;
- run the tests via command line
-. URI scheme is munged off if there is no authority and the scheme is the
- default one
-. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
-. Interface for URIScheme changed
-. Generic URI object to hold components of URI added, most systems involved
- in URI validation have been migrated to use it
-. Custom filtering for URIs factored out to URIDefinition interface for
- maximum extensibility
-
-2.0.1, released 2007-06-27
-! Tag auto-closing now based on a ChildDef heuristic rather than a
- manually set auto_close array; some behavior may change
-! Experimental AutoFormat functionality added: auto-paragraph and
- linkify your HTML input by setting %AutoFormat.AutoParagraph and
- %AutoFormat.Linkify to true
-! Newlines normalized internally, and then converted back to the
- value of PHP_EOL. If this is not desired, set your newline format
- using %Output.Newline.
-! Beta error collection, messages are implemented for the most generic
- cases involving Lexing or Strategies
-- Clean up special case code for <script> tags
-- Reorder includes for DefinitionCache decorators, fixes a possible
- missing class error
-- Fixed bug where manually modified definitions were not saved via cache
- (mostly harmless, except for the fact that it would be a little slower)
-- Configuration objects with different serials do not clobber each
- others when revision numbers are unequal
-- Improve Serializer DefinitionCache directory permissions checks
-- DefinitionCache no longer throws errors when it encounters old
- serial files that do not conform to the current style
-- Stray xmlns attributes removed from configuration documentation
-- configForm.php smoketest no longer has XSS vulnerability due to
- unescaped print_r output
-- Printer adheres to configuration's directives on output format
-- Fix improperly named form field in ConfigForm printer
-. Rewire some test-cases to swallow errors rather than expect them
-. HTMLDefinition printer updated with some of the new attributes
-. DefinitionCache keys reordered to reflect precedence: version number,
- hash, then revision number
-. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
-. Interlinking in configuration documentation added using
- Injector_PurifierLinkify
-. Directives now keep track of aliases to themselves
-. Error collector now requires a severity to be passed, use PHP's internal
- error constants for this
-. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
- much easier selective embedding of configuration values
-. Doctype objects now accept public and system DTD identifiers
-. %HTML.Doctype is now constrained by specific values, to specify a custom
- doctype use new %HTML.CustomDoctype
-. ConfigForm truncates long directives to keep the form small, and does
- not re-output namespaces
-
-2.0.0, released 2007-06-20
-# Completely refactored HTMLModuleManager, decentralizing safety
- information
-# Transform modules changed to Tidy modules, which offer more flexibility
- and better modularization
-# Configuration object now finalizes itself when a read operation is
- performed on it, ensuring that its internal state stays consistent.
- To revert this behavior, you can set the $autoFinalize member variable
- off, but it's not recommended.
-# New compact syntax for AttrDef objects that can be used to instantiate
- new objects via make()
-# Definitions (esp. HTMLDefinition) are now cached for a significant
- performance boost. You can disable caching by setting %Core.DefinitionCache
- to null. You CANNOT edit raw definitions without setting the corresponding
- DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
-# Contents between <script> tags are now completely removed if <script>
- is not allowed
-# Prototype-declarations for Lexer removed in favor of configuration
- determination of Lexer implementations.
-! HTML Purifier now works in PHP 4.3.2.
-! Configuration form-editing API makes tweaking HTMLPurifier_Config a
- breeze!
-! Configuration directives that accept hashes now allow new string
- format: key1:value1,key2:value2
-! ConfigDoc now factored into OOP design
-! All deprecated elements now natively supported
-! Implement TinyMCE styled whitelist specification format in
- %HTML.Allowed
-! Config object gives more friendly error messages when things go wrong
-! Advanced API implemented: easy functions for creating elements (addElement)
- and attributes (addAttribute) on HTMLDefinition
-! Add native support for required attributes
-- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
-- DOMLex will not emit errors when a custom error handler that does not
- honor error_reporting is used
-- StrictBlockquote child definition refrains from wrapping whitespace
- in tags now.
-- Bug resulting from tag transforms to non-allowed elements fixed
-- ChildDef_Custom's regex generation has been improved, removing several
- false positives
-. Unit test for ElementDef created, ElementDef behavior modified to
- be more flexible
-. Added convenience functions for HTMLModule constructors
-. AttrTypes now has accessor functions that should be used instead
- of directly manipulating info
-. TagTransform_Center deprecated in favor of generic TagTransform_Simple
-. Add extra protection in AttrDef_URI against phantom Schemes
-. Doctype object added to HTMLDefinition which describes certain aspects
- of the operational document type
-. Lexer is now pre-emptively included, with a conditional include for the
- PHP5 only version.
-. HTMLDefinition and CSSDefinition have a common parent class: Definition.
-. DirectLex can now track line-numbers
-. Preliminary error collector is in place, although no code actually reports
- errors yet
-. Factor out most of ValidateAttributes to new AttrValidator class
-
-1.6.1, released 2007-05-05
-! Support for more deprecated attributes via transformations:
- + hspace and vspace in img
- + size and noshade in hr
- + nowrap in td
- + clear in br
- + align in caption, table, img and hr
- + type in ul, ol and li
-! DirectLex now preserves text in which a < bracket is followed by
- a non-alphanumeric character. This means that certain emoticons
- are now preserved.
-! %Core.RemoveInvalidImg is now operational, when set to false invalid
- images will hang around with an empty src
-! target attribute in a tag supported, use %Attr.AllowedFrameTargets
- to enable
-! CSS property white-space now allows nowrap (supported in all modern
- browsers) but not others (which have spotty browser implementations)
-! XHTML 1.1 mode now sort-of works without any fatal errors, and
- lang is now moved over to xml:lang.
-! Attribute transformation smoketest available at smoketests/attrTransform.php
-! Transformation of font's size attribute now handles super-large numbers
-- Possibly fatal bug with __autoload() fixed in module manager
-- Invert HTMLModuleManager->addModule() processing order to check
- prefixes first and then the literal module
-- Empty strings get converted to empty arrays instead of arrays with
- an empty string in them.
-- Merging in attribute lists now works.
-. Demo script removed: it has been added to the website's repository
-. Basic.php script modified to work out of the box
-. Refactor AttrTransform classes to reduce duplication
-. AttrTransform_TextAlign axed in favor of a more general
- AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
- see how the new equivalent is implemented
-. Unit tests now use exclusively assertIdentical
-
-1.6.0, released 2007-04-01
-! Support for most common deprecated attributes via transformations:
- + bgcolor in td, th, tr and table
- + border in img
- + name in a and img
- + width in td, th and hr
- + height in td, th
-! Support for CSS attribute 'height' added
-! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
- and %Attr.AllowedRev to activate
-- You can define ID blacklists using regular expressions via
- %Attr.IDBlacklistRegexp
-- Error messages are emitted when you attempt to "allow" elements or
- attributes that HTML Purifier does not support
-- Fix segfault in unit test. The problem is not very reproduceable and
- I don't know what causes it, but a six line patch fixed it.
-
-1.5.0, released 2007-03-23
-! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
- doesn't actually do anything yet, but keep your eyes peeled.
-! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
-! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
- I am loathe to release beta quality APIs, but this is exactly that;
- don't use the internal interfaces if you're not willing to do migration
- later on.
-- Allow 'x' subtag in language codes
-- Fixed buggy chameleon-support for ins and del
-. Added support for IDREF attributes (i.e. for)
-. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
-. Removed context variable ParentType, replaced with IsInline, which
- is false when you're not inline and an integer of the parent that
- caused you to become inline when you are (so possibly zero)
-. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
- and HTMLDefinition->content_sets
-. StrictBlockquote now reports what elements its supposed to allow,
- rather than what it does allow
-. Removed HTMLDefinition->info_flow_elements in favor of
- HTMLDefinition->content_sets['Flow']
-. Removed redundant "exclusionary" definitions from DTD roster
-. StrictBlockquote now requires a construction parameter as if it
- were an Required ChildDef, this is the "real" set of allowed elements
-. AttrDef partitioned into HTML, CSS and URI segments
-. Modify Youtube filter regexp to be multiline
-. Require both PHP5 and DOM extension in order to use DOMLex, fixes
- some edge cases where a DOMDocument class exists in a PHP4 environment
- due to DOM XML extension.
-
-1.4.1, released 2007-01-21
-! docs/enduser-youtube.html updated according to new functionality
-- YouTube IDs can have underscores and dashes
-
-1.4.0, released 2007-01-21
-! Implemented list-style-image, URIs now allowed in list-style
-! Implemented background-image, background-repeat, background-attachment
- and background-position CSS properties. Shorthand property background
- supports all of these properties.
-! Configuration documentation looks nicer
-! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
- characters while %Core.Encoding is set to a non-UTF-8 encoding.
-! Support for configuration directive aliases added
-! Config object can now be instantiated from ini files
-! YouTube preservation code added to the core, with two lines of code
- you can add it as a filter to your code. See smoketests/preserveYouTube.php
- for sample code.
-! Moved SLOW to docs/enduser-slow.html and added code examples
-- Replaced version check with functionality check for DOM (thanks Stephen
- Khoo)
-. Added smoketest 'all.php', which loads all other smoketests via frames
-. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
-. Added convenient single test selector form on test runner
-
-1.3.2, released 2006-12-25
-! HTMLPurifier object now accepts configuration arrays, no need to manually
- instantiate a configuration object
-! Context object now accessible to outside
-! Added enduser-youtube.html, explains how to embed YouTube videos. See
- also corresponding smoketest preserveYouTube.php.
-! Added purifyArray(), which takes a list of HTML and purifies it all
-! Added static member variable $version to HTML Purifier with PHP-compatible
- version number string.
-- Fixed fatal error thrown by upper-cased language attributes
-- printDefinition.php: added labels, added better clarification
-. HTMLPurifier_Config::create() added, takes mixed variable and converts into
- a HTMLPurifier_Config object.
-
-1.3.1, released 2006-12-06
-! Added HTMLPurifier.func.php stub for a convenient function to call the library
-- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
- (thanks to .mario for reporting this)
-. Standardized all attribute handling variables to attr, made it plural
-
-1.3.0, released 2006-11-26
-# Invalid images are now removed, rather than replaced with a dud
- <img src="" alt="Invalid image" />. Previous behavior can be restored
- with new directive %Core.RemoveInvalidImg set to false.
-! (X)HTML Strict now supported
- + Transparently handles inline elements in block context (blockquote)
-! Added GET method to demo for easier validation, added 50kb max input size
-! New directive %HTML.BlockWrapper, for block-ifying inline elements
-! New directive %HTML.Parent, allows you to only allow inline content
-! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
- users narrow the set of allowed tags
-! <li value="4"> and <ul start="2"> now allowed in loose mode
-! New directives %URI.DisableExternalResources and %URI.DisableResources
-! New directive %Attr.DisableURI, which eliminates all hyperlinking
-! New directive %URI.Munge, munges URI so you can use some sort of redirector
- service to avoid PageRank leaks or warn users that they are exiting your site.
-! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
- the configuration settings and see how the internal rules are affected.
-! New directive %URI.HostBlacklist for blocking links to bad hosts.
- xssAttacks.php smoketest updated accordingly.
-- Added missing type to ChildDef_Chameleon
-- Remove Tidy option from demo if there is not Tidy available
-. ChildDef_Required guards against empty tags
-. Lookup table HTMLDefinition->info_flow_elements added
-. Added peace-of-mind variable initialization to Strategy_FixNesting
-. Added HTMLPurifier->info_parent_def, parent child processing made special
-. Added internal documents briefly summarizing future progression of HTML
-. HTMLPurifier_Config->getBatch($namespace) added
-. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
-. Refactored ChildDef classes into their own files
-
-1.2.0, released 2006-11-19
-# ID attributes now disabled by default. New directives:
- + %HTML.EnableAttrID - restores old behavior by allowing IDs
- + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
- so that they don't collide with your IDs
- + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
- instances of user content on the page
- + Profuse documentation on how to use these available in docs/enduser-id.txt
-! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
-! Added percent encoding normalization
-! XSS attacks smoketest given facelift
-! Configuration documentation now has table of contents
-! Added %URI.DisableExternal, which prevents links to external websites. You
- can also use %URI.Host to permit absolute linking to subdomains
-! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
-- Type variable in HTMLDefinition was not being set properly, fixed
-- Documentation updated
- + TODO added request Phalanger
- + TODO added request Native compression
- + TODO added request Remove redundant tags
- + TODO added possible plaintext formatter for HTML Purifier documentation
- + Updated ConfigDoc TODO
- + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
- and AttrDef/Host.php
- + Revamped documentation into HTML, along with misc updates
-- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
- to retrieve a non-existent variable
-. Switched to purify()-wide Context object registry
-. Refactored unit tests to minimize duplication
-. XSS attack sheet updated
-. configdoc.xml now has xml:space attached to default value nodes
-. Allow configuration directives to permit null values
-. Cleaned up test-cases to remove unnecessary swallowErrors()
-
-1.1.2, released 2006-09-30
-! Add HTMLPurifier.auto.php stub file that configures include_path
-- Documentation updated
- + INSTALL document rewritten
- + TODO added semi-lossy conversion
- + API Doxygen docs' file exclusions updated
- + Added notes on HTML versus XML attribute whitespace handling
- + Noted that HTMLPurifier_ChildDef_Custom isn't being used
- + Noted that config object's definitions are cached versions
-- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
-- ftp:// URIs now have their typecodes checked
-- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
-. Line endings standardized throughout project (svn:eol-style standardized)
-. Refactored parseData() to general Lexer class
-. Tester named "HTML Purifier" not "HTMLPurifier"
-
-1.1.1, released 2006-09-24
-! Configuration option to optionally Tidy up output for indentation to make up
- for dropped whitespace by DOMLex (pretty-printing for the entire application
- should be done by a page-wide Tidy)
-- Various documentation updates
-- Fixed parse error in configuration documentation script
-- Fixed fatal error in benchmark scripts, slightly augmented
-- As far as possible, whitespace is preserved in-between table children
-- Sample test-settings.php file included
-
-1.1.0, released 2006-09-16
-! Directive documentation generation using XSLT
-! XHTML can now be turned off, output becomes <br>
-- Made URI validator more forgiving: will ignore leading and trailing
- quotes, apostrophes and less than or greater than signs.
-- Enforce alphanumeric namespace and directive names for configuration.
-- Table child definition made more flexible, will fix up poorly ordered elements
-. Renamed ConfigDef to ConfigSchema
-
-1.0.1, released 2006-09-04
-- Fixed slight bug in DOMLex attribute parsing
-- Fixed rejection of case-insensitive configuration values when there is a
- set of allowed values. This manifested in %Core.Encoding.
-- Fixed rejection of inline style declarations that had lots of extra
- space in them. This manifested in TinyMCE.
-
-1.0.0, released 2006-09-01
-! Shorthand CSS properties implemented: font, border, background, list-style
-! Basic color keywords translated into hexadecimal values
-! Table CSS properties implemented
-! Support for charsets other than UTF-8 (defined by iconv)
-! Malformed UTF-8 and non-SGML character detection and cleaning implemented
-- Fixed broken numeric entity conversion
-- API documentation completed
-. (HTML|CSS)Definition de-singleton-ized
-
-1.0.0beta, released 2006-08-16
-! First public release, most functionality implemented. Notable omissions are:
- + Shorthand CSS properties
- + Table CSS properties
- + Deprecated attribute transformations
-
- vim: et sw=4 sts=4
diff --git a/library/jquery-textcomplete/LICENSE b/library/jquery-textcomplete/LICENSE
deleted file mode 100644
index 4848bd637..000000000
--- a/library/jquery-textcomplete/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2013-2014 Yuku Takahashi
-
-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.
diff --git a/library/jquery-textcomplete/jquery.textcomplete.js b/library/jquery-textcomplete/jquery.textcomplete.js
index 95e75149c..0dd9fd827 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.js
@@ -136,10 +136,6 @@ if (typeof jQuery === 'undefined') {
return Object.prototype.toString.call(obj) === '[object String]';
};
- var isFunction = function (obj) {
- return Object.prototype.toString.call(obj) === '[object Function]';
- };
-
var uniqueId = 0;
function Completer(element, option) {
@@ -147,33 +143,47 @@ if (typeof jQuery === 'undefined') {
this.id = 'textcomplete' + uniqueId++;
this.strategies = [];
this.views = [];
- this.option = $.extend({}, Completer._getDefaults(), option);
+ this.option = $.extend({}, Completer.defaults, option);
if (!this.$el.is('input[type=text]') && !this.$el.is('input[type=search]') && !this.$el.is('textarea') && !element.isContentEditable && element.contentEditable != 'true') {
throw new Error('textcomplete must be called on a Textarea or a ContentEditable.');
}
- if (element === document.activeElement) {
+ // use ownerDocument to fix iframe / IE issues
+ if (element === element.ownerDocument.activeElement) {
// element has already been focused. Initialize view objects immediately.
this.initialize()
} else {
// Initialize view objects lazily.
var self = this;
this.$el.one('focus.' + this.id, function () { self.initialize(); });
- }
- }
- Completer._getDefaults = function () {
- if (!Completer.DEFAULTS) {
- Completer.DEFAULTS = {
- appendTo: $('body'),
- zIndex: '100'
- };
+ // Special handling for CKEditor: lazy init on instance load
+ if ((!this.option.adapter || this.option.adapter == 'CKEditor') && typeof CKEDITOR != 'undefined' && (this.$el.is('textarea'))) {
+ CKEDITOR.on("instanceReady", function(event) {
+ event.editor.once("focus", function(event2) {
+ // replace the element with the Iframe element and flag it as CKEditor
+ self.$el = $(event.editor.editable().$);
+ if (!self.option.adapter) {
+ self.option.adapter = $.fn.textcomplete['CKEditor'];
+ self.option.ckeditor_instance = event.editor;
+ }
+ self.initialize();
+ });
+ });
+ }
}
-
- return Completer.DEFAULTS;
}
+ Completer.defaults = {
+ appendTo: 'body',
+ className: '', // deprecated option
+ dropdownClassName: 'dropdown-menu textcomplete-dropdown',
+ maxCount: 10,
+ zIndex: '100',
+ rightEdgeOffset: 30
+ };
+
$.extend(Completer.prototype, {
// Public properties
// -----------------
@@ -184,12 +194,26 @@ if (typeof jQuery === 'undefined') {
adapter: null,
dropdown: null,
$el: null,
+ $iframe: null,
// Public methods
// --------------
initialize: function () {
var element = this.$el.get(0);
+
+ // check if we are in an iframe
+ // we need to alter positioning logic if using an iframe
+ if (this.$el.prop('ownerDocument') !== document && window.frames.length) {
+ for (var iframeIndex = 0; iframeIndex < window.frames.length; iframeIndex++) {
+ if (this.$el.prop('ownerDocument') === window.frames[iframeIndex].document) {
+ this.$iframe = $(window.frames[iframeIndex].frameElement);
+ break;
+ }
+ }
+ }
+
+
// Initialize view objects.
this.dropdown = new $.fn.textcomplete.Dropdown(element, this, this.option);
var Adapter, viewName;
@@ -281,7 +305,7 @@ if (typeof jQuery === 'undefined') {
var strategy = this.strategies[i];
var context = strategy.context(text);
if (context || context === '') {
- var matchRegexp = isFunction(strategy.match) ? strategy.match(text) : strategy.match;
+ var matchRegexp = $.isFunction(strategy.match) ? strategy.match(text) : strategy.match;
if (isString(context)) { text = context; }
var match = text.match(matchRegexp);
if (match) { return [strategy, match[strategy.index], match]; }
@@ -399,7 +423,7 @@ if (typeof jQuery === 'undefined') {
var $parent = option.appendTo;
if (!($parent instanceof $)) { $parent = $($parent); }
var $el = $('<ul></ul>')
- .addClass('dropdown-menu textcomplete-dropdown')
+ .addClass(option.dropdownClassName)
.attr('id', 'textcomplete-dropdown-' + option._oid)
.css({
display: 'none',
@@ -422,7 +446,7 @@ if (typeof jQuery === 'undefined') {
footer: null,
header: null,
id: null,
- maxCount: 10,
+ maxCount: null,
placement: '',
shown: false,
data: [], // Shown zipped data.
@@ -445,8 +469,8 @@ if (typeof jQuery === 'undefined') {
render: function (zippedData) {
var contentsHtml = this._buildContents(zippedData);
- var unzippedData = $.map(this.data, function (d) { return d.value; });
- if (this.data.length) {
+ var unzippedData = $.map(zippedData, function (d) { return d.value; });
+ if (zippedData.length) {
var strategy = zippedData[0].strategy;
if (strategy.id) {
this.$el.attr('data-strategy', strategy.id);
@@ -480,7 +504,7 @@ if (typeof jQuery === 'undefined') {
return false;
if($(this).css('position') === 'fixed') {
pos.top -= $window.scrollTop();
- pos.left -= $window.scrollLeft();
+ pos.left -= $window.scrollLeft();
position = 'fixed';
return false;
}
@@ -785,7 +809,10 @@ if (typeof jQuery === 'undefined') {
var windowScrollBottom = $window.scrollTop() + $window.height();
var height = this.$el.height();
if ((this.$el.position().top + height) > windowScrollBottom) {
- this.$el.offset({top: windowScrollBottom - height});
+ // only do this if we are not in an iframe
+ if (!this.completer.$iframe) {
+ this.$el.offset({top: windowScrollBottom - height});
+ }
}
},
@@ -794,7 +821,7 @@ if (typeof jQuery === 'undefined') {
// to the document width so we don't know if we would have overrun it. As a heuristic to avoid that clipping
// (which makes our elements wrap onto the next line and corrupt the next item), if we're close to the right
// edge, move left. We don't know how far to move left, so just keep nudging a bit.
- var tolerance = 30; // pixels. Make wider than vertical scrollbar because we might not be able to use that space.
+ var tolerance = this.option.rightEdgeOffset; // pixels. Make wider than vertical scrollbar because we might not be able to use that space.
var lastOffset = this.$el.offset().left, offset;
var width = this.$el.width();
var maxLeft = $window.width() - tolerance;
@@ -1005,8 +1032,14 @@ if (typeof jQuery === 'undefined') {
switch (clickEvent.keyCode) {
case 9: // TAB
case 13: // ENTER
+ case 16: // SHIFT
+ case 17: // CTRL
+ case 18: // ALT
+ case 33: // PAGEUP
+ case 34: // PAGEDOWN
case 40: // DOWN
case 38: // UP
+ case 27: // ESC
return true;
}
if (clickEvent.ctrlKey) switch (clickEvent.keyCode) {
@@ -1040,12 +1073,14 @@ if (typeof jQuery === 'undefined') {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(this.el.selectionEnd);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr);
this.$el.val(pre + post);
this.el.selectionStart = this.el.selectionEnd = pre.length;
}
@@ -1062,7 +1097,8 @@ if (typeof jQuery === 'undefined') {
var p = $.fn.textcomplete.getCaretCoordinates(this.el, this.el.selectionStart);
return {
top: p.top + this._calculateLineHeight() - this.$el.scrollTop(),
- left: p.left - this.$el.scrollLeft()
+ left: p.left - this.$el.scrollLeft(),
+ lineHeight: this._calculateLineHeight()
};
},
@@ -1111,12 +1147,14 @@ if (typeof jQuery === 'undefined') {
var pre = this.getTextFromHeadToCaret();
var post = this.el.value.substring(pre.length);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr);
this.$el.val(pre + post);
this.el.focus();
var range = this.el.createTextRange();
@@ -1162,30 +1200,35 @@ if (typeof jQuery === 'undefined') {
// When an dropdown item is selected, it is executed.
select: function (value, strategy, e) {
var pre = this.getTextFromHeadToCaret();
- var sel = window.getSelection()
+ // use ownerDocument instead of window to support iframes
+ var sel = this.el.ownerDocument.getSelection();
+
var range = sel.getRangeAt(0);
var selection = range.cloneRange();
selection.selectNodeContents(range.startContainer);
var content = selection.toString();
var post = content.substring(range.startOffset);
var newSubstr = strategy.replace(value, e);
+ var regExp;
if (typeof newSubstr !== 'undefined') {
if ($.isArray(newSubstr)) {
post = newSubstr[1] + post;
newSubstr = newSubstr[0];
}
- pre = pre.replace(strategy.match, newSubstr);
+ regExp = $.isFunction(strategy.match) ? strategy.match(pre) : strategy.match;
+ pre = pre.replace(regExp, newSubstr)
+ .replace(/ $/, "&nbsp"); // &nbsp necessary at least for CKeditor to not eat spaces
range.selectNodeContents(range.startContainer);
range.deleteContents();
// create temporary elements
- var preWrapper = document.createElement("div");
+ var preWrapper = this.el.ownerDocument.createElement("div");
preWrapper.innerHTML = pre;
- var postWrapper = document.createElement("div");
+ var postWrapper = this.el.ownerDocument.createElement("div");
postWrapper.innerHTML = post;
// create the fragment thats inserted
- var fragment = document.createDocumentFragment();
+ var fragment = this.el.ownerDocument.createDocumentFragment();
var childNode;
var lastOfPre;
while (childNode = preWrapper.firstChild) {
@@ -1218,8 +1261,8 @@ if (typeof jQuery === 'undefined') {
//
// Dropdown's position will be decided using the result.
_getCaretRelativePosition: function () {
- var range = window.getSelection().getRangeAt(0).cloneRange();
- var node = document.createElement('span');
+ var range = this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange();
+ var node = this.el.ownerDocument.createElement('span');
range.insertNode(node);
range.selectNodeContents(node);
range.deleteContents();
@@ -1228,6 +1271,17 @@ if (typeof jQuery === 'undefined') {
position.left -= this.$el.offset().left;
position.top += $node.height() - this.$el.offset().top;
position.lineHeight = $node.height();
+
+ // special positioning logic for iframes
+ // this is typically used for contenteditables such as tinymce or ckeditor
+ if (this.completer.$iframe) {
+ var iframePosition = this.completer.$iframe.offset();
+ position.top += iframePosition.top;
+ position.left += iframePosition.left;
+ //subtract scrollTop from element in iframe
+ position.top -= this.$el.scrollTop();
+ }
+
$node.remove();
return position;
},
@@ -1241,7 +1295,7 @@ if (typeof jQuery === 'undefined') {
// this.getTextFromHeadToCaret()
// // => ' wor' // not '<b>hello</b> wor'
getTextFromHeadToCaret: function () {
- var range = window.getSelection().getRangeAt(0);
+ var range = this.el.ownerDocument.getSelection().getRangeAt(0);
var selection = range.cloneRange();
selection.selectNodeContents(range.startContainer);
return selection.toString().substring(0, range.startOffset);
@@ -1251,6 +1305,39 @@ if (typeof jQuery === 'undefined') {
$.fn.textcomplete.ContentEditable = ContentEditable;
}(jQuery);
+// NOTE: TextComplete plugin has contenteditable support but it does not work
+// fine especially on old IEs.
+// Any pull requests are REALLY welcome.
+
++function ($) {
+ 'use strict';
+
+ // CKEditor adapter
+ // =======================
+ //
+ // Adapter for CKEditor, based on contenteditable elements.
+ function CKEditor (element, completer, option) {
+ this.initialize(element, completer, option);
+ }
+
+ $.extend(CKEditor.prototype, $.fn.textcomplete.ContentEditable.prototype, {
+ _bindEvents: function () {
+ var $this = this;
+ this.option.ckeditor_instance.on('key', function(event) {
+ var domEvent = event.data;
+ $this._onKeyup(domEvent);
+ if ($this.completer.dropdown.shown && $this._skipSearch(domEvent)) {
+ return false;
+ }
+ }, null, null, 1); // 1 = Priority = Important!
+ // we actually also need the native event, as the CKEditor one is happening to late
+ this.$el.on('keyup.' + this.id, $.proxy(this._onKeyup, this));
+ },
+});
+
+ $.fn.textcomplete.CKEditor = CKEditor;
+}(jQuery);
+
// The MIT License (MIT)
//
// Copyright (c) 2015 Jonathan Ong me@jongleberry.com
diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.js b/library/jquery-textcomplete/jquery.textcomplete.min.js
index d3a427f27..d8f67a804 100644
--- a/library/jquery-textcomplete/jquery.textcomplete.min.js
+++ b/library/jquery-textcomplete/jquery.textcomplete.min.js
@@ -1,3 +1,3 @@
-/*! jquery-textcomplete - v1.3.4 - 2016-04-19 */
-!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+f++,this.strategies=[],this.views=[],this.option=a.extend({},b._getDefaults(),d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===document.activeElement)this.initialize();else{var e=this;this.$el.one("focus."+this.id,function(){e.initialize()})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=function(a){return"[object Function]"===Object.prototype.toString.call(a)},f=0;b._getDefaults=function(){return b.DEFAULTS||(b.DEFAULTS={appendTo:a("body"),zIndex:"100"}),b.DEFAULTS},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,initialize:function(){var b=this.$el.get(0);this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var c,d;this.option.adapter?c=this.option.adapter:(d=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",c=a.fn.textcomplete[d]),this.adapter=new c(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(a){for(var b=0;b<this.strategies.length;b++){var c=this.strategies[b],f=c.context(a);if(f||""===f){var g=e(c.match)?c.match(a):c.match;d(f)&&(a=f);var h=a.match(g);if(h)return[c,h[c.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass("dropdown-menu textcomplete-dropdown").attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:10,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(this.data,function(a){return a.value});if(this.data.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&this.$el.offset({top:a-b})},_fitToRight:function(){for(var a,b=30,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 40:case 38:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(this.el.selectionEnd),g=c.replace(b,d);"undefined"!=typeof g&&(a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.selectionStart=this.el.selectionEnd=e.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="å¶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.value.substring(e.length),g=c.replace(b,d);if("undefined"!=typeof g){a.isArray(g)&&(f=g[1]+f,g=g[0]),e=e.replace(c.match,g),this.$el.val(e+f),this.el.focus();var h=this.el.createTextRange();h.collapse(!0),h.moveEnd("character",e.length),h.moveStart("character",e.length),h.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=window.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i=h.toString(),j=i.substring(g.startOffset),k=c.replace(b,d);if("undefined"!=typeof k){a.isArray(k)&&(j=k[1]+j,k=k[0]),e=e.replace(c.match,k),g.selectNodeContents(g.startContainer),g.deleteContents();var l=document.createElement("div");l.innerHTML=e;var m=document.createElement("div");m.innerHTML=j;for(var n,o,p=document.createDocumentFragment();n=l.firstChild;)o=p.appendChild(n);for(;n=m.firstChild;)p.appendChild(n);g.insertNode(p),g.setStartAfter(o),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=window.getSelection().getRangeAt(0).cloneRange(),c=document.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();return e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),d.remove(),e},getTextFromHeadToCaret:function(){var a=window.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a});
+/*! jquery-textcomplete - v1.8.0 - 2016-11-15 */
+!function(a){if("function"==typeof define&&define.amd)define(["jquery"],a);else if("object"==typeof module&&module.exports){var b=require("jquery");module.exports=a(b)}else a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("jQuery.textcomplete requires jQuery");return+function(a){"use strict";var b=function(a){console.warn&&console.warn(a)},c=1;a.fn.textcomplete=function(d,e){var f=Array.prototype.slice.call(arguments);return this.each(function(){var g=this,h=a(this),i=h.data("textComplete");if(i||(e||(e={}),e._oid=c++,i=new a.fn.textcomplete.Completer(this,e),h.data("textComplete",i)),"string"==typeof d){if(!i)return;f.shift(),i[d].apply(i,f),"destroy"===d&&h.removeData("textComplete")}else a.each(d,function(c){a.each(["header","footer","placement","maxCount"],function(a){c[a]&&(i.option[a]=c[a],b(a+"as a strategy param is deprecated. Use option."),delete c[a])})}),i.register(a.fn.textcomplete.Strategy.parse(d,{el:g,$el:h}))})}}(a),+function(a){"use strict";function b(c,d){if(this.$el=a(c),this.id="textcomplete"+e++,this.strategies=[],this.views=[],this.option=a.extend({},b.defaults,d),!(this.$el.is("input[type=text]")||this.$el.is("input[type=search]")||this.$el.is("textarea")||c.isContentEditable||"true"==c.contentEditable))throw new Error("textcomplete must be called on a Textarea or a ContentEditable.");if(c===c.ownerDocument.activeElement)this.initialize();else{var f=this;this.$el.one("focus."+this.id,function(){f.initialize()}),this.option.adapter&&"CKEditor"!=this.option.adapter||"undefined"==typeof CKEDITOR||!this.$el.is("textarea")||CKEDITOR.on("instanceReady",function(b){b.editor.once("focus",function(c){f.$el=a(b.editor.editable().$),f.option.adapter||(f.option.adapter=a.fn.textcomplete.CKEditor,f.option.ckeditor_instance=b.editor),f.initialize()})})}}var c=function(a){var b,c;return function(){var d=Array.prototype.slice.call(arguments);if(b)return void(c=d);b=!0;var e=this;d.unshift(function f(){if(c){var d=c;c=void 0,d.unshift(f),a.apply(e,d)}else b=!1}),a.apply(this,d)}},d=function(a){return"[object String]"===Object.prototype.toString.call(a)},e=0;b.defaults={appendTo:"body",className:"",dropdownClassName:"dropdown-menu textcomplete-dropdown",maxCount:10,zIndex:"100",rightEdgeOffset:30},a.extend(b.prototype,{id:null,option:null,strategies:null,adapter:null,dropdown:null,$el:null,$iframe:null,initialize:function(){var b=this.$el.get(0);if(this.$el.prop("ownerDocument")!==document&&window.frames.length)for(var c=0;c<window.frames.length;c++)if(this.$el.prop("ownerDocument")===window.frames[c].document){this.$iframe=a(window.frames[c].frameElement);break}this.dropdown=new a.fn.textcomplete.Dropdown(b,this,this.option);var d,e;this.option.adapter?d=this.option.adapter:(e=this.$el.is("textarea")||this.$el.is("input[type=text]")||this.$el.is("input[type=search]")?"number"==typeof b.selectionEnd?"Textarea":"IETextarea":"ContentEditable",d=a.fn.textcomplete[e]),this.adapter=new d(b,this,this.option)},destroy:function(){this.$el.off("."+this.id),this.adapter&&this.adapter.destroy(),this.dropdown&&this.dropdown.destroy(),this.$el=this.adapter=this.dropdown=null},deactivate:function(){this.dropdown&&this.dropdown.deactivate()},trigger:function(a,b){this.dropdown||this.initialize(),null!=a||(a=this.adapter.getTextFromHeadToCaret());var c=this._extractSearchQuery(a);if(c.length){var d=c[1];if(b&&this._term===d&&""!==d)return;this._term=d,this._search.apply(this,c)}else this._term=null,this.dropdown.deactivate()},fire:function(a){var b=Array.prototype.slice.call(arguments,1);return this.$el.trigger(a,b),this},register:function(a){Array.prototype.push.apply(this.strategies,a)},select:function(a,b,c){this._term=null,this.adapter.select(a,b,c),this.fire("change").fire("textComplete:select",a,b),this.adapter.focus()},_clearAtNext:!0,_term:null,_extractSearchQuery:function(b){for(var c=0;c<this.strategies.length;c++){var e=this.strategies[c],f=e.context(b);if(f||""===f){var g=a.isFunction(e.match)?e.match(b):e.match;d(f)&&(b=f);var h=b.match(g);if(h)return[e,h[e.index],h]}}return[]},_search:c(function(a,b,c,d){var e=this;b.search(c,function(d,f){e.dropdown.shown||e.dropdown.activate(),e._clearAtNext&&(e.dropdown.clear(),e._clearAtNext=!1),e.dropdown.setPosition(e.adapter.getCaretPosition()),e.dropdown.render(e._zip(d,b,c)),f||(a(),e._clearAtNext=!0)},d)}),_zip:function(b,c,d){return a.map(b,function(a){return{value:a,strategy:c,term:d}})}}),a.fn.textcomplete.Completer=b}(a),+function(a){"use strict";function b(c,d,f){this.$el=b.createElement(f),this.completer=d,this.id=d.id+"dropdown",this._data=[],this.$inputEl=a(c),this.option=f,f.listPosition&&(this.setPosition=f.listPosition),f.height&&this.$el.height(f.height);var g=this;a.each(["maxCount","placement","footer","header","noResultsMessage","className"],function(a,b){null!=f[b]&&(g[b]=f[b])}),this._bindEvents(c),e[this.id]=this}var c=a(window),d=function(a,b){var c,d,e=b.strategy.idProperty;for(c=0;c<a.length;c++)if(d=a[c],d.strategy===b.strategy)if(e){if(d.value[e]===b.value[e])return!0}else if(d.value===b.value)return!0;return!1},e={};a(document).on("click",function(b){var c=b.originalEvent&&b.originalEvent.keepTextCompleteDropdown;a.each(e,function(a,b){a!==c&&b.deactivate()})});var f={SKIP_DEFAULT:0,KEY_UP:1,KEY_DOWN:2,KEY_ENTER:3,KEY_PAGEUP:4,KEY_PAGEDOWN:5,KEY_ESCAPE:6};a.extend(b,{createElement:function(b){var c=b.appendTo;c instanceof a||(c=a(c));var d=a("<ul></ul>").addClass(b.dropdownClassName).attr("id","textcomplete-dropdown-"+b._oid).css({display:"none",left:0,position:"absolute",zIndex:b.zIndex}).appendTo(c);return d}}),a.extend(b.prototype,{$el:null,$inputEl:null,completer:null,footer:null,header:null,id:null,maxCount:null,placement:"",shown:!1,data:[],className:"",destroy:function(){this.deactivate(),this.$el.off("."+this.id),this.$inputEl.off("."+this.id),this.clear(),this.$el.remove(),this.$el=this.$inputEl=this.completer=null,delete e[this.id]},render:function(b){var c=this._buildContents(b),d=a.map(b,function(a){return a.value});if(b.length){var e=b[0].strategy;e.id?this.$el.attr("data-strategy",e.id):this.$el.removeAttr("data-strategy"),this._renderHeader(d),this._renderFooter(d),c&&(this._renderContents(c),this._fitToBottom(),this._fitToRight(),this._activateIndexedItem()),this._setScroll()}else this.noResultsMessage?this._renderNoResultsMessage(d):this.shown&&this.deactivate()},setPosition:function(b){var d="absolute";return this.$inputEl.add(this.$inputEl.parents()).each(function(){return"absolute"===a(this).css("position")?!1:"fixed"===a(this).css("position")?(b.top-=c.scrollTop(),b.left-=c.scrollLeft(),d="fixed",!1):void 0}),this.$el.css(this._applyPlacement(b)),this.$el.css({position:d}),this},clear:function(){this.$el.html(""),this.data=[],this._index=0,this._$header=this._$footer=this._$noResultsMessage=null},activate:function(){return this.shown||(this.clear(),this.$el.show(),this.className&&this.$el.addClass(this.className),this.completer.fire("textComplete:show"),this.shown=!0),this},deactivate:function(){return this.shown&&(this.$el.hide(),this.className&&this.$el.removeClass(this.className),this.completer.fire("textComplete:hide"),this.shown=!1),this},isUp:function(a){return 38===a.keyCode||a.ctrlKey&&80===a.keyCode},isDown:function(a){return 40===a.keyCode||a.ctrlKey&&78===a.keyCode},isEnter:function(a){var b=a.ctrlKey||a.altKey||a.metaKey||a.shiftKey;return!b&&(13===a.keyCode||9===a.keyCode||this.option.completeOnSpace===!0&&32===a.keyCode)},isPageup:function(a){return 33===a.keyCode},isPagedown:function(a){return 34===a.keyCode},isEscape:function(a){return 27===a.keyCode},_data:null,_index:null,_$header:null,_$noResultsMessage:null,_$footer:null,_bindEvents:function(){this.$el.on("mousedown."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("touchstart."+this.id,".textcomplete-item",a.proxy(this._onClick,this)),this.$el.on("mouseover."+this.id,".textcomplete-item",a.proxy(this._onMouseover,this)),this.$inputEl.on("keydown."+this.id,a.proxy(this._onKeydown,this))},_onClick:function(b){var c=a(b.target);b.preventDefault(),b.originalEvent.keepTextCompleteDropdown=this.id,c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item"));var d=this.data[parseInt(c.data("index"),10)];this.completer.select(d.value,d.strategy,b);var e=this;setTimeout(function(){e.deactivate(),"touchstart"===b.type&&e.$inputEl.focus()},0)},_onMouseover:function(b){var c=a(b.target);b.preventDefault(),c.hasClass("textcomplete-item")||(c=c.closest(".textcomplete-item")),this._index=parseInt(c.data("index"),10),this._activateIndexedItem()},_onKeydown:function(b){if(this.shown){var c;switch(a.isFunction(this.option.onKeydown)&&(c=this.option.onKeydown(b,f)),null==c&&(c=this._defaultKeydown(b)),c){case f.KEY_UP:b.preventDefault(),this._up();break;case f.KEY_DOWN:b.preventDefault(),this._down();break;case f.KEY_ENTER:b.preventDefault(),this._enter(b);break;case f.KEY_PAGEUP:b.preventDefault(),this._pageup();break;case f.KEY_PAGEDOWN:b.preventDefault(),this._pagedown();break;case f.KEY_ESCAPE:b.preventDefault(),this.deactivate()}}},_defaultKeydown:function(a){return this.isUp(a)?f.KEY_UP:this.isDown(a)?f.KEY_DOWN:this.isEnter(a)?f.KEY_ENTER:this.isPageup(a)?f.KEY_PAGEUP:this.isPagedown(a)?f.KEY_PAGEDOWN:this.isEscape(a)?f.KEY_ESCAPE:void 0},_up:function(){0===this._index?this._index=this.data.length-1:this._index-=1,this._activateIndexedItem(),this._setScroll()},_down:function(){this._index===this.data.length-1?this._index=0:this._index+=1,this._activateIndexedItem(),this._setScroll()},_enter:function(a){var b=this.data[parseInt(this._getActiveElement().data("index"),10)];this.completer.select(b.value,b.strategy,a),this.deactivate()},_pageup:function(){var b=0,c=this._getActiveElement().position().top-this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top+a(this).outerHeight()>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_pagedown:function(){var b=this.data.length-1,c=this._getActiveElement().position().top+this.$el.innerHeight();this.$el.children().each(function(d){return a(this).position().top>c?(b=d,!1):void 0}),this._index=b,this._activateIndexedItem(),this._setScroll()},_activateIndexedItem:function(){this.$el.find(".textcomplete-item.active").removeClass("active"),this._getActiveElement().addClass("active")},_getActiveElement:function(){return this.$el.children(".textcomplete-item:nth("+this._index+")")},_setScroll:function(){var a=this._getActiveElement(),b=a.position().top,c=a.outerHeight(),d=this.$el.innerHeight(),e=this.$el.scrollTop();0===this._index||this._index==this.data.length-1||0>b?this.$el.scrollTop(b+e):b+c>d&&this.$el.scrollTop(b+c+e-d)},_buildContents:function(a){var b,c,e,f="";for(c=0;c<a.length&&this.data.length!==this.maxCount;c++)b=a[c],d(this.data,b)||(e=this.data.length,this.data.push(b),f+='<li class="textcomplete-item" data-index="'+e+'"><a>',f+=b.strategy.template(b.value,b.term),f+="</a></li>");return f},_renderHeader:function(b){if(this.header){this._$header||(this._$header=a('<li class="textcomplete-header"></li>').prependTo(this.$el));var c=a.isFunction(this.header)?this.header(b):this.header;this._$header.html(c)}},_renderFooter:function(b){if(this.footer){this._$footer||(this._$footer=a('<li class="textcomplete-footer"></li>').appendTo(this.$el));var c=a.isFunction(this.footer)?this.footer(b):this.footer;this._$footer.html(c)}},_renderNoResultsMessage:function(b){if(this.noResultsMessage){this._$noResultsMessage||(this._$noResultsMessage=a('<li class="textcomplete-no-results-message"></li>').appendTo(this.$el));var c=a.isFunction(this.noResultsMessage)?this.noResultsMessage(b):this.noResultsMessage;this._$noResultsMessage.html(c)}},_renderContents:function(a){this._$footer?this._$footer.before(a):this.$el.append(a)},_fitToBottom:function(){var a=c.scrollTop()+c.height(),b=this.$el.height();this.$el.position().top+b>a&&(this.completer.$iframe||this.$el.offset({top:a-b}))},_fitToRight:function(){for(var a,b=this.option.rightEdgeOffset,d=this.$el.offset().left,e=this.$el.width(),f=c.width()-b;d+e>f&&(this.$el.offset({left:d-b}),a=this.$el.offset().left,!(a>=d));)d=a},_applyPlacement:function(a){return-1!==this.placement.indexOf("top")?a={top:"auto",bottom:this.$el.parent().height()-a.top+a.lineHeight,left:a.left}:(a.bottom="auto",delete a.lineHeight),-1!==this.placement.indexOf("absleft")?a.left=0:-1!==this.placement.indexOf("absright")&&(a.right=0,a.left="auto"),a}}),a.fn.textcomplete.Dropdown=b,a.extend(a.fn.textcomplete,f)}(a),+function(a){"use strict";function b(b){a.extend(this,b),this.cache&&(this.search=c(this.search))}var c=function(a){var b={};return function(c,d){b[c]?d(b[c]):a.call(this,c,function(a){b[c]=(b[c]||[]).concat(a),d.apply(null,arguments)})}};b.parse=function(c,d){return a.map(c,function(a){var c=new b(a);return c.el=d.el,c.$el=d.$el,c})},a.extend(b.prototype,{match:null,replace:null,search:null,id:null,cache:!1,context:function(){return!0},index:2,template:function(a){return a},idProperty:null}),a.fn.textcomplete.Strategy=b}(a),+function(a){"use strict";function b(){}var c=Date.now||function(){return(new Date).getTime()},d=function(a,b){var d,e,f,g,h,i=function(){var j=c()-g;b>j?d=setTimeout(i,b-j):(d=null,h=a.apply(f,e),f=e=null)};return function(){return f=this,e=arguments,g=c(),d||(d=setTimeout(i,b)),h}};a.extend(b.prototype,{id:null,completer:null,el:null,$el:null,option:null,initialize:function(b,c,e){this.el=b,this.$el=a(b),this.id=c.id+this.constructor.name,this.completer=c,this.option=e,this.option.debounce&&(this._onKeyup=d(this._onKeyup,this.option.debounce)),this._bindEvents()},destroy:function(){this.$el.off("."+this.id),this.$el=this.el=this.completer=null},select:function(){throw new Error("Not implemented")},getCaretPosition:function(){var b=this._getCaretRelativePosition(),c=this.$el.offset(),d=this.option.appendTo;if(d){d instanceof a||(d=a(d));var e=d.offsetParent().offset();c.top-=e.top,c.left-=e.left}return b.top+=c.top,b.left+=c.left,b},focus:function(){this.$el.focus()},_bindEvents:function(){this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))},_onKeyup:function(a){this._skipSearch(a)||this.completer.trigger(this.getTextFromHeadToCaret(),!0)},_skipSearch:function(a){switch(a.keyCode){case 9:case 13:case 16:case 17:case 18:case 33:case 34:case 40:case 38:case 27:return!0}if(a.ctrlKey)switch(a.keyCode){case 78:case 80:return!0}}}),a.fn.textcomplete.Adapter=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(this.el.selectionEnd),h=c.replace(b,d);"undefined"!=typeof h&&(a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.selectionStart=this.el.selectionEnd=f.length)},getTextFromHeadToCaret:function(){return this.el.value.substring(0,this.el.selectionEnd)},_getCaretRelativePosition:function(){var b=a.fn.textcomplete.getCaretCoordinates(this.el,this.el.selectionStart);return{top:b.top+this._calculateLineHeight()-this.$el.scrollTop(),left:b.left-this.$el.scrollLeft(),lineHeight:this._calculateLineHeight()}},_calculateLineHeight:function(){var a=parseInt(this.$el.css("line-height"),10);if(isNaN(a)){var b=this.el.parentNode,c=document.createElement(this.el.nodeName),d=this.el.style;c.setAttribute("style","margin:0px;padding:0px;font-family:"+d.fontFamily+";font-size:"+d.fontSize),c.innerHTML="test",b.appendChild(c),a=c.clientHeight,b.removeChild(c)}return a}}),a.fn.textcomplete.Textarea=b}(a),+function(a){"use strict";function b(b,d,e){this.initialize(b,d,e),a("<span>"+c+"</span>").css({position:"absolute",top:-9999,left:-9999}).insertBefore(b)}var c="å¶";a.extend(b.prototype,a.fn.textcomplete.Textarea.prototype,{select:function(b,c,d){var e,f=this.getTextFromHeadToCaret(),g=this.el.value.substring(f.length),h=c.replace(b,d);if("undefined"!=typeof h){a.isArray(h)&&(g=h[1]+g,h=h[0]),e=a.isFunction(c.match)?c.match(f):c.match,f=f.replace(e,h),this.$el.val(f+g),this.el.focus();var i=this.el.createTextRange();i.collapse(!0),i.moveEnd("character",f.length),i.moveStart("character",f.length),i.select()}},getTextFromHeadToCaret:function(){this.el.focus();var a=document.selection.createRange();a.moveStart("character",-this.el.value.length);var b=a.text.split(c);return 1===b.length?b[0]:b[1]}}),a.fn.textcomplete.IETextarea=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.Adapter.prototype,{select:function(b,c,d){var e=this.getTextFromHeadToCaret(),f=this.el.ownerDocument.getSelection(),g=f.getRangeAt(0),h=g.cloneRange();h.selectNodeContents(g.startContainer);var i,j=h.toString(),k=j.substring(g.startOffset),l=c.replace(b,d);if("undefined"!=typeof l){a.isArray(l)&&(k=l[1]+k,l=l[0]),i=a.isFunction(c.match)?c.match(e):c.match,e=e.replace(i,l).replace(/ $/,"&nbsp"),g.selectNodeContents(g.startContainer),g.deleteContents();var m=this.el.ownerDocument.createElement("div");m.innerHTML=e;var n=this.el.ownerDocument.createElement("div");n.innerHTML=k;for(var o,p,q=this.el.ownerDocument.createDocumentFragment();o=m.firstChild;)p=q.appendChild(o);for(;o=n.firstChild;)q.appendChild(o);g.insertNode(q),g.setStartAfter(p),g.collapse(!0),f.removeAllRanges(),f.addRange(g)}},_getCaretRelativePosition:function(){var b=this.el.ownerDocument.getSelection().getRangeAt(0).cloneRange(),c=this.el.ownerDocument.createElement("span");b.insertNode(c),b.selectNodeContents(c),b.deleteContents();var d=a(c),e=d.offset();if(e.left-=this.$el.offset().left,e.top+=d.height()-this.$el.offset().top,e.lineHeight=d.height(),this.completer.$iframe){var f=this.completer.$iframe.offset();e.top+=f.top,e.left+=f.left,e.top-=this.$el.scrollTop()}return d.remove(),e},getTextFromHeadToCaret:function(){var a=this.el.ownerDocument.getSelection().getRangeAt(0),b=a.cloneRange();return b.selectNodeContents(a.startContainer),b.toString().substring(0,a.startOffset)}}),a.fn.textcomplete.ContentEditable=b}(a),+function(a){"use strict";function b(a,b,c){this.initialize(a,b,c)}a.extend(b.prototype,a.fn.textcomplete.ContentEditable.prototype,{_bindEvents:function(){var b=this;this.option.ckeditor_instance.on("key",function(a){var c=a.data;return b._onKeyup(c),b.completer.dropdown.shown&&b._skipSearch(c)?!1:void 0},null,null,1),this.$el.on("keyup."+this.id,a.proxy(this._onKeyup,this))}}),a.fn.textcomplete.CKEditor=b}(a),function(a){function b(a,b,f){if(!d)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var g=f&&f.debug||!1;if(g){var h=document.querySelector("#input-textarea-caret-position-mirror-div");h&&h.parentNode.removeChild(h)}var i=document.createElement("div");i.id="input-textarea-caret-position-mirror-div",document.body.appendChild(i);var j=i.style,k=window.getComputedStyle?getComputedStyle(a):a.currentStyle;j.whiteSpace="pre-wrap","INPUT"!==a.nodeName&&(j.wordWrap="break-word"),j.position="absolute",g||(j.visibility="hidden"),c.forEach(function(a){j[a]=k[a]}),e?a.scrollHeight>parseInt(k.height)&&(j.overflowY="scroll"):j.overflow="hidden",i.textContent=a.value.substring(0,b),"INPUT"===a.nodeName&&(i.textContent=i.textContent.replace(/\s/g," "));var l=document.createElement("span");l.textContent=a.value.substring(b)||".",i.appendChild(l);var m={top:l.offsetTop+parseInt(k.borderTopWidth),left:l.offsetLeft+parseInt(k.borderLeftWidth)};return g?l.style.backgroundColor="#aaa":document.body.removeChild(i),m}var c=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],d="undefined"!=typeof window,e=d&&null!=window.mozInnerScreenX;a.fn.textcomplete.getCaretCoordinates=b}(a),a});
//# sourceMappingURL=dist/jquery.textcomplete.min.map \ No newline at end of file
diff --git a/library/jquery-textcomplete/jquery.textcomplete.min.map b/library/jquery-textcomplete/jquery.textcomplete.min.map
new file mode 100644
index 000000000..0e249c1c4
--- /dev/null
+++ b/library/jquery-textcomplete/jquery.textcomplete.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"dist/jquery.textcomplete.min.js","sources":["dist/jquery.textcomplete.js"],"names":["factory","define","amd","module","exports","$","require","jQuery","Error","warn","message","console","id","fn","textcomplete","strategies","option","args","Array","prototype","slice","call","arguments","this","each","self","$this","completer","data","_oid","Completer","shift","apply","removeData","obj","name","register","Strategy","parse","el","$el","element","uniqueId","views","extend","defaults","is","isContentEditable","contentEditable","ownerDocument","activeElement","initialize","one","adapter","CKEDITOR","on","event","editor","once","event2","editable","ckeditor_instance","lock","func","locked","queuedArgsToReplay","unshift","replayOrFree","replayArgs","undefined","isString","Object","toString","appendTo","className","dropdownClassName","maxCount","zIndex","rightEdgeOffset","dropdown","$iframe","get","prop","document","window","frames","length","iframeIndex","frameElement","Dropdown","Adapter","viewName","selectionEnd","destroy","off","deactivate","trigger","text","skipUnchangedTerm","getTextFromHeadToCaret","searchQuery","_extractSearchQuery","term","_term","_search","fire","eventName","push","select","value","strategy","e","focus","_clearAtNext","i","context","matchRegexp","isFunction","match","index","free","search","stillSearching","shown","activate","clear","setPosition","getCaretPosition","render","_zip","map","createElement","_data","$inputEl","listPosition","height","_i","_bindEvents","dropdownViews","$window","include","zippedData","datum","elem","idProperty","originalEvent","keepTextCompleteDropdown","key","view","commands","SKIP_DEFAULT","KEY_UP","KEY_DOWN","KEY_ENTER","KEY_PAGEUP","KEY_PAGEDOWN","KEY_ESCAPE","$parent","addClass","attr","css","display","left","position","footer","header","placement","remove","contentsHtml","_buildContents","unzippedData","d","removeAttr","_renderHeader","_renderFooter","_renderContents","_fitToBottom","_fitToRight","_activateIndexedItem","_setScroll","noResultsMessage","_renderNoResultsMessage","pos","add","parents","top","scrollTop","scrollLeft","_applyPlacement","html","_index","_$header","_$footer","_$noResultsMessage","show","hide","removeClass","isUp","keyCode","ctrlKey","isDown","isEnter","modifiers","altKey","metaKey","shiftKey","completeOnSpace","isPageup","isPagedown","isEscape","proxy","_onClick","_onMouseover","_onKeydown","target","preventDefault","hasClass","closest","parseInt","setTimeout","type","command","onKeydown","_defaultKeydown","_up","_down","_enter","_pageup","_pagedown","_getActiveElement","threshold","innerHeight","children","outerHeight","find","$activeEl","itemTop","itemHeight","visibleHeight","visibleTop","template","prependTo","before","append","windowScrollBottom","offset","tolerance","lastOffset","width","maxLeft","indexOf","bottom","parent","lineHeight","right","options","cache","memoize","memo","callback","concat","strategiesArray","params","strategyObj","replace","now","Date","getTime","debounce","wait","timeout","timestamp","result","later","last","constructor","_onKeyup","_getCaretRelativePosition","parentOffset","offsetParent","_skipSearch","clickEvent","Textarea","regExp","pre","post","substring","newSubstr","isArray","val","selectionStart","p","getCaretCoordinates","_calculateLineHeight","isNaN","parentNode","temp","nodeName","style","setAttribute","fontFamily","fontSize","innerHTML","appendChild","clientHeight","removeChild","IETextarea","sentinelChar","insertBefore","range","createTextRange","collapse","moveEnd","moveStart","selection","createRange","arr","split","ContentEditable","sel","getSelection","getRangeAt","cloneRange","selectNodeContents","startContainer","content","startOffset","deleteContents","preWrapper","postWrapper","childNode","lastOfPre","fragment","createDocumentFragment","firstChild","insertNode","setStartAfter","removeAllRanges","addRange","node","$node","iframePosition","CKEditor","domEvent","isBrowser","debug","querySelector","div","body","computed","getComputedStyle","currentStyle","whiteSpace","wordWrap","visibility","properties","forEach","isFirefox","scrollHeight","overflowY","overflow","textContent","span","coordinates","offsetTop","offsetLeft","backgroundColor","mozInnerScreenX"],"mappings":";CAAC,SAAUA,GACT,GAAsB,kBAAXC,SAAyBA,OAAOC,IAEzCD,QAAQ,UAAWD,OACd,IAAsB,gBAAXG,SAAuBA,OAAOC,QAAS,CACvD,GAAIC,GAAIC,QAAQ,SAChBH,QAAOC,QAAUJ,EAAQK,OAGzBL,GAAQO,SAEV,SAAUA,GAUZ,GAAsB,mBAAXA,GACT,KAAM,IAAIC,OAAM,sCAw7ClB,QAr7CC,SAAUH,GACT,YAEA,IAAII,GAAO,SAAUC,GACfC,QAAQF,MAAQE,QAAQF,KAAKC,IAG/BE,EAAK,CAETP,GAAEQ,GAAGC,aAAe,SAAUC,EAAYC,GACxC,GAAIC,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,OAAOC,MAAKC,KAAK,WACf,GAAIC,GAAOF,KACPG,EAAQrB,EAAEkB,MACVI,EAAYD,EAAME,KAAK,eAO3B,IANKD,IACHX,IAAWA,MACXA,EAAOa,KAAOjB,IACde,EAAY,GAAItB,GAAEQ,GAAGC,aAAagB,UAAUP,KAAMP,GAClDU,EAAME,KAAK,eAAgBD,IAEH,gBAAfZ,GAAyB,CAClC,IAAKY,EAAW,MAChBV,GAAKc,QACLJ,EAAUZ,GAAYiB,MAAML,EAAWV,GACpB,YAAfF,GACFW,EAAMO,WAAW,oBAKnB5B,GAAEmB,KAAKT,EAAY,SAAUmB,GAC3B7B,EAAEmB,MAAM,SAAU,SAAU,YAAa,YAAa,SAAUW,GAC1DD,EAAIC,KACNR,EAAUX,OAAOmB,GAAQD,EAAIC,GAC7B1B,EAAK0B,EAAO,wDACLD,GAAIC,QAIjBR,EAAUS,SAAS/B,EAAEQ,GAAGC,aAAauB,SAASC,MAAMvB,GAClDwB,GAAId,EACJe,IAAKd,SAMbnB,IAED,SAAUF,GACT,YAgEA,SAASyB,GAAUW,EAASzB,GAO1B,GANAO,KAAKiB,IAAanC,EAAEoC,GACpBlB,KAAKX,GAAa,eAAiB8B,IACnCnB,KAAKR,cACLQ,KAAKoB,SACLpB,KAAKP,OAAaX,EAAEuC,UAAWd,EAAUe,SAAU7B,KAE9CO,KAAKiB,IAAIM,GAAG,qBAAwBvB,KAAKiB,IAAIM,GAAG,uBAA0BvB,KAAKiB,IAAIM,GAAG,aAAgBL,EAAQM,mBAAgD,QAA3BN,EAAQO,iBAC9I,KAAM,IAAIxC,OAAM,kEAIlB,IAAIiC,IAAYA,EAAQQ,cAAcC,cAEpC3B,KAAK4B,iBACA,CAEL,GAAI1B,GAAOF,IACXA,MAAKiB,IAAIY,IAAI,SAAW7B,KAAKX,GAAI,WAAca,EAAK0B,eAG9C5B,KAAKP,OAAOqC,SAAkC,YAAvB9B,KAAKP,OAAOqC,SAA6C,mBAAZC,YAA4B/B,KAAKiB,IAAIM,GAAG,aAChHQ,SAASC,GAAG,gBAAiB,SAASC,GACpCA,EAAMC,OAAOC,KAAK,QAAS,SAASC,GAElClC,EAAKe,IAAMnC,EAAEmD,EAAMC,OAAOG,WAAWvD,GAChCoB,EAAKT,OAAOqC,UACf5B,EAAKT,OAAOqC,QAAUhD,EAAEQ,GAAGC,aAAuB,SAClDW,EAAKT,OAAO6C,kBAAoBL,EAAMC,QAExChC,EAAK0B,kBAtEf,GAAIW,GAAO,SAAUC,GACnB,GAAIC,GAAQC,CAEZ,OAAO,YAEL,GAAIhD,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UACtC,IAAI0C,EAKF,YADAC,EAAqBhD,EAGvB+C,IAAS,CACT,IAAIvC,GAAOF,IACXN,GAAKiD,QAAQ,QAASC,KACpB,GAAIF,EAAoB,CAMtB,GAAIG,GAAaH,CACjBA,GAAqBI,OACrBD,EAAWF,QAAQC,GACnBJ,EAAK/B,MAAMP,EAAM2C,OAEjBJ,IAAS,IAGbD,EAAK/B,MAAMT,KAAMN,KAIjBqD,EAAW,SAAUpC,GACvB,MAA+C,oBAAxCqC,OAAOpD,UAAUqD,SAASnD,KAAKa,IAGpCQ,EAAW,CAuCfZ,GAAUe,UACR4B,SAAU,OACVC,UAAW,GACXC,kBAAmB,sCACnBC,SAAU,GACVC,OAAQ,MACRC,gBAAiB,IAGnBzE,EAAEuC,OAAOd,EAAUX,WAIjBP,GAAY,KACZI,OAAY,KACZD,WAAY,KACZsC,QAAY,KACZ0B,SAAY,KACZvC,IAAY,KACZwC,QAAY,KAKZ7B,WAAY,WACV,GAAIV,GAAUlB,KAAKiB,IAAIyC,IAAI,EAI3B,IAAI1D,KAAKiB,IAAI0C,KAAK,mBAAqBC,UAAYC,OAAOC,OAAOC,OAC/D,IAAK,GAAIC,GAAc,EAAGA,EAAcH,OAAOC,OAAOC,OAAQC,IAC5D,GAAIhE,KAAKiB,IAAI0C,KAAK,mBAAqBE,OAAOC,OAAOE,GAAaJ,SAAU,CAC1E5D,KAAKyD,QAAU3E,EAAE+E,OAAOC,OAAOE,GAAaC,aAC5C,OAONjE,KAAKwD,SAAW,GAAI1E,GAAEQ,GAAGC,aAAa2E,SAAShD,EAASlB,KAAMA,KAAKP,OACnE,IAAI0E,GAASC,CACTpE,MAAKP,OAAOqC,QACdqC,EAAUnE,KAAKP,OAAOqC,SAGpBsC,EADEpE,KAAKiB,IAAIM,GAAG,aAAevB,KAAKiB,IAAIM,GAAG,qBAAuBvB,KAAKiB,IAAIM,GAAG,sBACjC,gBAAzBL,GAAQmD,aAA4B,WAAa,aAExD,kBAEbF,EAAUrF,EAAEQ,GAAGC,aAAa6E,IAE9BpE,KAAK8B,QAAU,GAAIqC,GAAQjD,EAASlB,KAAMA,KAAKP,SAGjD6E,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACpBW,KAAK8B,SACP9B,KAAK8B,QAAQwC,UAEXtE,KAAKwD,UACPxD,KAAKwD,SAASc,UAEhBtE,KAAKiB,IAAMjB,KAAK8B,QAAU9B,KAAKwD,SAAW,MAG5CgB,WAAY,WACNxE,KAAKwD,UACPxD,KAAKwD,SAASgB,cAKlBC,QAAS,SAAUC,EAAMC,GAClB3E,KAAKwD,UAAYxD,KAAK4B,aACnB,MAAR8C,IAAiBA,EAAO1E,KAAK8B,QAAQ8C,yBACrC,IAAIC,GAAc7E,KAAK8E,oBAAoBJ,EAC3C,IAAIG,EAAYd,OAAQ,CACtB,GAAIgB,GAAOF,EAAY,EAEvB,IAAIF,GAAqB3E,KAAKgF,QAAUD,GAAiB,KAATA,EAAe,MAC/D/E,MAAKgF,MAAQD,EACb/E,KAAKiF,QAAQxE,MAAMT,KAAM6E,OAEzB7E,MAAKgF,MAAQ,KACbhF,KAAKwD,SAASgB,cAIlBU,KAAM,SAAUC,GACd,GAAIzF,GAAOC,MAAMC,UAAUC,MAAMC,KAAKC,UAAW,EAEjD,OADAC,MAAKiB,IAAIwD,QAAQU,EAAWzF,GACrBM,MAGTa,SAAU,SAAUrB,GAClBG,MAAMC,UAAUwF,KAAK3E,MAAMT,KAAKR,WAAYA,IAS9C6F,OAAQ,SAAUC,EAAOC,EAAUC,GACjCxF,KAAKgF,MAAQ,KACbhF,KAAK8B,QAAQuD,OAAOC,EAAOC,EAAUC,GACrCxF,KAAKkF,KAAK,UAAUA,KAAK,sBAAuBI,EAAOC,GACvDvF,KAAK8B,QAAQ2D,SAMfC,cAAc,EACdV,MAAc,KASdF,oBAAqB,SAAUJ,GAC7B,IAAK,GAAIiB,GAAI,EAAGA,EAAI3F,KAAKR,WAAWuE,OAAQ4B,IAAK,CAC/C,GAAIJ,GAAWvF,KAAKR,WAAWmG,GAC3BC,EAAUL,EAASK,QAAQlB,EAC/B,IAAIkB,GAAuB,KAAZA,EAAgB,CAC7B,GAAIC,GAAc/G,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMrB,GAAQa,EAASQ,KAC7EhD,GAAS6C,KAAYlB,EAAOkB,EAChC,IAAIG,GAAQrB,EAAKqB,MAAMF,EACvB,IAAIE,EAAS,OAAQR,EAAUQ,EAAMR,EAASS,OAAQD,IAG1D,UAIFd,QAAS1C,EAAK,SAAU0D,EAAMV,EAAUR,EAAMgB,GAC5C,GAAI7F,GAAOF,IACXuF,GAASW,OAAOnB,EAAM,SAAU1E,EAAM8F,GAC/BjG,EAAKsD,SAAS4C,OACjBlG,EAAKsD,SAAS6C,WAEZnG,EAAKwF,eAEPxF,EAAKsD,SAAS8C,QACdpG,EAAKwF,cAAe,GAEtBxF,EAAKsD,SAAS+C,YAAYrG,EAAK4B,QAAQ0E,oBACvCtG,EAAKsD,SAASiD,OAAOvG,EAAKwG,KAAKrG,EAAMkF,EAAUR,IAC1CoB,IAEHF,IACA/F,EAAKwF,cAAe,IAErBK,KASLW,KAAM,SAAUrG,EAAMkF,EAAUR,GAC9B,MAAOjG,GAAE6H,IAAItG,EAAM,SAAUiF,GAC3B,OAASA,MAAOA,EAAOC,SAAUA,EAAUR,KAAMA,QAKvDjG,EAAEQ,GAAGC,aAAagB,UAAYA,GAC9BvB,IAED,SAAUF,GACT,YA2CA,SAASoF,GAAShD,EAASd,EAAWX,GACpCO,KAAKiB,IAAYiD,EAAS0C,cAAcnH,GACxCO,KAAKI,UAAYA,EACjBJ,KAAKX,GAAYe,EAAUf,GAAK,WAChCW,KAAK6G,SACL7G,KAAK8G,SAAYhI,EAAEoC,GACnBlB,KAAKP,OAAYA,EAGbA,EAAOsH,eAAgB/G,KAAKuG,YAAc9G,EAAOsH,cACjDtH,EAAOuH,QAAUhH,KAAKiB,IAAI+F,OAAOvH,EAAOuH,OAC5C,IAAI9G,GAAOF,IACXlB,GAAEmB,MAAM,WAAY,YAAa,SAAU,SAAU,mBAAoB,aAAc,SAAUgH,EAAIrG,GAC/E,MAAhBnB,EAAOmB,KAAiBV,EAAKU,GAAQnB,EAAOmB,MAElDZ,KAAKkH,YAAYhG,GACjBiG,EAAcnH,KAAKX,IAAMW,KAzD3B,GAAIoH,GAAUtI,EAAE+E,QAEZwD,EAAU,SAAUC,EAAYC,GAClC,GAAI5B,GAAG6B,EACHC,EAAaF,EAAMhC,SAASkC,UAChC,KAAK9B,EAAI,EAAGA,EAAI2B,EAAWvD,OAAQ4B,IAEjC,GADA6B,EAAOF,EAAW3B,GACd6B,EAAKjC,WAAagC,EAAMhC,SAC5B,GAAIkC,GACF,GAAID,EAAKlC,MAAMmC,KAAgBF,EAAMjC,MAAMmC,GAAa,OAAO,MAE/D,IAAID,EAAKlC,QAAUiC,EAAMjC,MAAO,OAAO,CAG3C,QAAO,GAGL6B,IACJrI,GAAE8E,UAAU5B,GAAG,QAAS,SAAUwD,GAChC,GAAInG,GAAKmG,EAAEkC,eAAiBlC,EAAEkC,cAAcC,wBAC5C7I,GAAEmB,KAAKkH,EAAe,SAAUS,EAAKC,GAC/BD,IAAQvI,GAAMwI,EAAKrD,gBAI3B,IAAIsD,IACFC,aAAc,EACdC,OAAQ,EACRC,SAAU,EACVC,UAAW,EACXC,WAAY,EACZC,aAAc,EACdC,WAAY,EA4BdvJ,GAAEuC,OAAO6C,GAIP0C,cAAe,SAAUnH,GACvB,GAAI6I,GAAU7I,EAAOyD,QACfoF,aAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIrH,GAAMnC,EAAE,aACTyJ,SAAS9I,EAAO2D,mBAChBoF,KAAK,KAAM,yBAA2B/I,EAAOa,MAC7CmI,KACCC,QAAS,OACTC,KAAM,EACNC,SAAU,WACVtF,OAAQ7D,EAAO6D,SAEhBJ,SAASoF,EACZ,OAAOrH,MAIXnC,EAAEuC,OAAO6C,EAAStE,WAIhBqB,IAAW,KACX6F,SAAW,KACX1G,UAAW,KACXyI,OAAW,KACXC,OAAW,KACXzJ,GAAW,KACXgE,SAAW,KACX0F,UAAW,GACX3C,OAAW,EACX/F,QACA8C,UAAW,GAKXmB,QAAS,WAEPtE,KAAKwE,aAELxE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAK8G,SAASvC,IAAI,IAAMvE,KAAKX,IAC7BW,KAAKsG,QACLtG,KAAKiB,IAAI+H,SACThJ,KAAKiB,IAAMjB,KAAK8G,SAAW9G,KAAKI,UAAY,WACrC+G,GAAcnH,KAAKX,KAG5BoH,OAAQ,SAAUa,GAChB,GAAI2B,GAAejJ,KAAKkJ,eAAe5B,GACnC6B,EAAerK,EAAE6H,IAAIW,EAAY,SAAU8B,GAAK,MAAOA,GAAE9D,OAC7D,IAAIgC,EAAWvD,OAAQ,CACrB,GAAIwB,GAAW+B,EAAW,GAAG/B,QACzBA,GAASlG,GACXW,KAAKiB,IAAIuH,KAAK,gBAAiBjD,EAASlG,IAExCW,KAAKiB,IAAIoI,WAAW,iBAEtBrJ,KAAKsJ,cAAcH,GACnBnJ,KAAKuJ,cAAcJ,GACfF,IACFjJ,KAAKwJ,gBAAgBP,GACrBjJ,KAAKyJ,eACLzJ,KAAK0J,cACL1J,KAAK2J,wBAEP3J,KAAK4J,iBACI5J,MAAK6J,iBACd7J,KAAK8J,wBAAwBX,GACpBnJ,KAAKoG,OACdpG,KAAKwE,cAIT+B,YAAa,SAAUwD,GAIrB,GAAInB,GAAW,UAef,OAbA5I,MAAK8G,SAASkD,IAAIhK,KAAK8G,SAASmD,WAAWhK,KAAK,WAC9C,MAA+B,aAA5BnB,EAAEkB,MAAMyI,IAAI,aACN,EACsB,UAA5B3J,EAAEkB,MAAMyI,IAAI,aACbsB,EAAIG,KAAO9C,EAAQ+C,YACnBJ,EAAIpB,MAAQvB,EAAQgD,aACpBxB,EAAW,SACJ,GAJT,SAOF5I,KAAKiB,IAAIwH,IAAIzI,KAAKqK,gBAAgBN,IAClC/J,KAAKiB,IAAIwH,KAAMG,SAAUA,IAElB5I,MAGTsG,MAAO,WACLtG,KAAKiB,IAAIqJ,KAAK,IACdtK,KAAKK,QACLL,KAAKuK,OAAS,EACdvK,KAAKwK,SAAWxK,KAAKyK,SAAWzK,KAAK0K,mBAAqB,MAG5DrE,SAAU,WAQR,MAPKrG,MAAKoG,QACRpG,KAAKsG,QACLtG,KAAKiB,IAAI0J,OACL3K,KAAKmD,WAAanD,KAAKiB,IAAIsH,SAASvI,KAAKmD,WAC7CnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGTwE,WAAY,WAOV,MANIxE,MAAKoG,QACPpG,KAAKiB,IAAI2J,OACL5K,KAAKmD,WAAanD,KAAKiB,IAAI4J,YAAY7K,KAAKmD,WAChDnD,KAAKI,UAAU8E,KAAK,qBACpBlF,KAAKoG,OAAQ,GAERpG,MAGT8K,KAAM,SAAUtF,GACd,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CE,OAAQ,SAAUzF,GAChB,MAAqB,MAAdA,EAAEuF,SAAmBvF,EAAEwF,SAAyB,KAAdxF,EAAEuF,SAG7CG,QAAS,SAAU1F,GACjB,GAAI2F,GAAY3F,EAAEwF,SAAWxF,EAAE4F,QAAU5F,EAAE6F,SAAW7F,EAAE8F,QACxD,QAAQH,IAA4B,KAAd3F,EAAEuF,SAAgC,IAAdvF,EAAEuF,SAAkB/K,KAAKP,OAAO8L,mBAAoB,GAAsB,KAAd/F,EAAEuF,UAG1GS,SAAU,SAAUhG,GAClB,MAAqB,MAAdA,EAAEuF,SAGXU,WAAY,SAAUjG,GACpB,MAAqB,MAAdA,EAAEuF,SAGXW,SAAU,SAAUlG,GAClB,MAAqB,MAAdA,EAAEuF,SAMXlE,MAAU,KACV0D,OAAU,KACVC,SAAU,KACVE,mBAAoB,KACpBD,SAAU,KAKVvD,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OACjFA,KAAKiB,IAAIe,GAAG,cAAgBhC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK4L,SAAU5L,OAClFA,KAAKiB,IAAIe,GAAG,aAAehC,KAAKX,GAAI,qBAAsBP,EAAE6M,MAAM3L,KAAK6L,aAAc7L,OACrFA,KAAK8G,SAAS9E,GAAG,WAAahC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK8L,WAAY9L,QAGlE4L,SAAU,SAAUpG,GAClB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACFxG,EAAEkC,cAAcC,yBAA2B3H,KAAKX,GAC3C4B,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,sBAEpB,IAAI3E,GAAQvH,KAAKK,KAAK8L,SAASlL,EAAIZ,KAAK,SAAU,IAClDL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,EACnD,IAAItF,GAAOF,IAGXoM,YAAW,WACTlM,EAAKsE,aACU,eAAXgB,EAAE6G,MACJnM,EAAK4G,SAASrB,SAEf,IAILoG,aAAc,SAAUrG,GACtB,GAAIvE,GAAMnC,EAAE0G,EAAEuG,OACdvG,GAAEwG,iBACG/K,EAAIgL,SAAS,uBAChBhL,EAAMA,EAAIiL,QAAQ,uBAEpBlM,KAAKuK,OAAS4B,SAASlL,EAAIZ,KAAK,SAAU,IAC1CL,KAAK2J,wBAGPmC,WAAY,SAAUtG,GACpB,GAAKxF,KAAKoG,MAAV,CAEA,GAAIkG,EAUJ,QARIxN,EAAEgH,WAAW9F,KAAKP,OAAO8M,aAC3BD,EAAUtM,KAAKP,OAAO8M,UAAU/G,EAAGsC,IAGtB,MAAXwE,IACFA,EAAUtM,KAAKwM,gBAAgBhH,IAGzB8G,GACN,IAAKxE,GAASE,OACZxC,EAAEwG,iBACFhM,KAAKyM,KACL,MACF,KAAK3E,GAASG,SACZzC,EAAEwG,iBACFhM,KAAK0M,OACL,MACF,KAAK5E,GAASI,UACZ1C,EAAEwG,iBACFhM,KAAK2M,OAAOnH,EACZ,MACF,KAAKsC,GAASK,WACZ3C,EAAEwG,iBACFhM,KAAK4M,SACL,MACF,KAAK9E,GAASM,aACZ5C,EAAEwG,iBACFhM,KAAK6M,WACL,MACF,KAAK/E,GAASO,WACZ7C,EAAEwG,iBACFhM,KAAKwE,gBAKXgI,gBAAiB,SAAUhH,GACzB,MAAIxF,MAAK8K,KAAKtF,GACLsC,EAASE,OACPhI,KAAKiL,OAAOzF,GACdsC,EAASG,SACPjI,KAAKkL,QAAQ1F,GACfsC,EAASI,UACPlI,KAAKwL,SAAShG,GAChBsC,EAASK,WACPnI,KAAKyL,WAAWjG,GAClBsC,EAASM,aACPpI,KAAK0L,SAASlG,GAChBsC,EAASO,WADX,QAKToE,IAAK,WACiB,IAAhBzM,KAAKuK,OACPvK,KAAKuK,OAASvK,KAAKK,KAAK0D,OAAS,EAEjC/D,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP8C,MAAO,WACD1M,KAAKuK,SAAWvK,KAAKK,KAAK0D,OAAS,EACrC/D,KAAKuK,OAAS,EAEdvK,KAAKuK,QAAU,EAEjBvK,KAAK2J,uBACL3J,KAAK4J,cAGP+C,OAAQ,SAAUnH,GAChB,GAAI+B,GAAQvH,KAAKK,KAAK8L,SAASnM,KAAK8M,oBAAoBzM,KAAK,SAAU,IACvEL,MAAKI,UAAUiF,OAAOkC,EAAMjC,MAAOiC,EAAMhC,SAAUC,GACnDxF,KAAKwE,cAGPoI,QAAS,WACP,GAAIb,GAAS,EACTgB,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAMpL,EAAEkB,MAAMkN,cAAgBH,GACnDhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPiD,UAAW,WACT,GAAId,GAAS/L,KAAKK,KAAK0D,OAAS,EAC5BgJ,EAAY/M,KAAK8M,oBAAoBlE,WAAWsB,IAAMlK,KAAKiB,IAAI+L,aACnEhN,MAAKiB,IAAIgM,WAAWhN,KAAK,SAAU0F,GACjC,MAAI7G,GAAEkB,MAAM4I,WAAWsB,IAAM6C,GAC3BhB,EAASpG,GACF,GAFT,SAKF3F,KAAKuK,OAASwB,EACd/L,KAAK2J,uBACL3J,KAAK4J,cAGPD,qBAAsB,WACpB3J,KAAKiB,IAAIkM,KAAK,6BAA6BtC,YAAY,UACvD7K,KAAK8M,oBAAoBvE,SAAS,WAGpCuE,kBAAmB,WACjB,MAAO9M,MAAKiB,IAAIgM,SAAS,0BAA4BjN,KAAKuK,OAAS,MAGrEX,WAAY,WACV,GAAIwD,GAAYpN,KAAK8M,oBACjBO,EAAUD,EAAUxE,WAAWsB,IAC/BoD,EAAaF,EAAUF,cACvBK,EAAgBvN,KAAKiB,IAAI+L,cACzBQ,EAAaxN,KAAKiB,IAAIkJ,WACN,KAAhBnK,KAAKuK,QAAgBvK,KAAKuK,QAAUvK,KAAKK,KAAK0D,OAAS,GAAe,EAAVsJ,EAC9DrN,KAAKiB,IAAIkJ,UAAUkD,EAAUG,GACpBH,EAAUC,EAAaC,GAChCvN,KAAKiB,IAAIkJ,UAAUkD,EAAUC,EAAaE,EAAaD,IAI3DrE,eAAgB,SAAU5B,GACxB,GAAIC,GAAO5B,EAAGK,EACVsE,EAAO,EACX,KAAK3E,EAAI,EAAGA,EAAI2B,EAAWvD,QACrB/D,KAAKK,KAAK0D,SAAW/D,KAAKqD,SADGsC,IAEjC4B,EAAQD,EAAW3B,GACf0B,EAAQrH,KAAKK,KAAMkH,KACvBvB,EAAQhG,KAAKK,KAAK0D,OAClB/D,KAAKK,KAAK+E,KAAKmC,GACf+C,GAAQ,6CAA+CtE,EAAQ,QAC/DsE,GAAU/C,EAAMhC,SAASkI,SAASlG,EAAMjC,MAAOiC,EAAMxC,MACrDuF,GAAQ,YAEV,OAAOA,IAGThB,cAAe,SAAUH,GACvB,GAAInJ,KAAK8I,OAAQ,CACV9I,KAAKwK,WACRxK,KAAKwK,SAAW1L,EAAE,yCAAyC4O,UAAU1N,KAAKiB,KAE5E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK8I,QAAU9I,KAAK8I,OAAOK,GAAgBnJ,KAAK8I,MACxE9I,MAAKwK,SAASF,KAAKA,KAIvBf,cAAe,SAAUJ,GACvB,GAAInJ,KAAK6I,OAAQ,CACV7I,KAAKyK,WACRzK,KAAKyK,SAAW3L,EAAE,yCAAyCoE,SAASlD,KAAKiB,KAE3E,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6I,QAAU7I,KAAK6I,OAAOM,GAAgBnJ,KAAK6I,MACxE7I,MAAKyK,SAASH,KAAKA,KAIvBR,wBAAyB,SAAUX,GACjC,GAAInJ,KAAK6J,iBAAkB,CACpB7J,KAAK0K,qBACR1K,KAAK0K,mBAAqB5L,EAAE,qDAAqDoE,SAASlD,KAAKiB,KAEjG,IAAIqJ,GAAOxL,EAAEgH,WAAW9F,KAAK6J,kBAAoB7J,KAAK6J,iBAAiBV,GAAgBnJ,KAAK6J,gBAC5F7J,MAAK0K,mBAAmBJ,KAAKA,KAIjCd,gBAAiB,SAAUc,GACrBtK,KAAKyK,SACPzK,KAAKyK,SAASkD,OAAOrD,GAErBtK,KAAKiB,IAAI2M,OAAOtD,IAIpBb,aAAc,WACZ,GAAIoE,GAAqBzG,EAAQ+C,YAAc/C,EAAQJ,SACnDA,EAAShH,KAAKiB,IAAI+F,QACjBhH,MAAKiB,IAAI2H,WAAWsB,IAAMlD,EAAU6G,IAElC7N,KAAKI,UAAUqD,SAClBzD,KAAKiB,IAAI6M,QAAQ5D,IAAK2D,EAAqB7G,MAKjD0C,YAAa,WASX,IAJA,GACyCoE,GADrCC,EAAY/N,KAAKP,OAAO8D,gBACxByK,EAAahO,KAAKiB,IAAI6M,SAASnF,KAC/BsF,EAAQjO,KAAKiB,IAAIgN,QACjBC,EAAU9G,EAAQ6G,QAAUF,EACzBC,EAAaC,EAAQC,IAC1BlO,KAAKiB,IAAI6M,QAAQnF,KAAMqF,EAAaD,IACpCD,EAAS9N,KAAKiB,IAAI6M,SAASnF,OACvBmF,GAAUE,KACdA,EAAaF,GAIjBzD,gBAAiB,SAAUzB,GAmBzB,MAjBsC,KAAlC5I,KAAK+I,UAAUoF,QAAQ,OAEzBvF,GACEsB,IAAK,OACLkE,OAAQpO,KAAKiB,IAAIoN,SAASrH,SAAW4B,EAASsB,IAAMtB,EAAS0F,WAC7D3F,KAAMC,EAASD,OAGjBC,EAASwF,OAAS,aACXxF,GAAS0F,YAEwB,KAAtCtO,KAAK+I,UAAUoF,QAAQ,WACzBvF,EAASD,KAAO,EACgC,KAAvC3I,KAAK+I,UAAUoF,QAAQ,cAChCvF,EAAS2F,MAAQ,EACjB3F,EAASD,KAAO,QAEXC,KAIX9J,EAAEQ,GAAGC,aAAa2E,SAAWA,EAC7BpF,EAAEuC,OAAOvC,EAAEQ,GAAGC,aAAcuI,IAC5B9I,IAED,SAAUF,GACT,YAiBA,SAASgC,GAAS0N,GAChB1P,EAAEuC,OAAOrB,KAAMwO,GACXxO,KAAKyO,QAASzO,KAAKkG,OAASwI,EAAQ1O,KAAKkG,SAhB/C,GAAIwI,GAAU,SAAUlM,GACtB,GAAImM,KACJ,OAAO,UAAU5J,EAAM6J,GACjBD,EAAK5J,GACP6J,EAASD,EAAK5J,IAEdvC,EAAK1C,KAAKE,KAAM+E,EAAM,SAAU1E,GAC9BsO,EAAK5J,IAAS4J,EAAK5J,QAAa8J,OAAOxO,GACvCuO,EAASnO,MAAM,KAAMV,cAW7Be,GAASC,MAAQ,SAAU+N,EAAiBC,GAC1C,MAAOjQ,GAAE6H,IAAImI,EAAiB,SAAUvJ,GACtC,GAAIyJ,GAAc,GAAIlO,GAASyE,EAG/B,OAFAyJ,GAAYhO,GAAK+N,EAAO/N,GACxBgO,EAAY/N,IAAM8N,EAAO9N,IAClB+N,KAIXlQ,EAAEuC,OAAOP,EAASlB,WAKhBmG,MAAY,KACZkJ,QAAY,KACZ/I,OAAY,KAGZ7G,GAAY,KACZoP,OAAY,EACZ7I,QAAY,WAAc,OAAO,GACjCI,MAAY,EACZyH,SAAY,SAAU9M,GAAO,MAAOA,IACpC8G,WAAY,OAGd3I,EAAEQ,GAAGC,aAAauB,SAAWA,GAE7B9B,IAED,SAAUF,GACT,YAiCA,SAASqF,MA/BT,GAAI+K,GAAMC,KAAKD,KAAO,WAAc,OAAO,GAAIC,OAAOC,WAOlDC,EAAW,SAAU7M,EAAM8M,GAC7B,GAAIC,GAAS7P,EAAMkG,EAAS4J,EAAWC,EACnCC,EAAQ,WACV,GAAIC,GAAOT,IAAQM,CACRF,GAAPK,EACFJ,EAAUnD,WAAWsD,EAAOJ,EAAOK,IAEnCJ,EAAU,KACVE,EAASjN,EAAK/B,MAAMmF,EAASlG,GAC7BkG,EAAUlG,EAAO,MAIrB,OAAO,YAOL,MANAkG,GAAU5F,KACVN,EAAOK,UACPyP,EAAYN,IACPK,IACHA,EAAUnD,WAAWsD,EAAOJ,IAEvBG,GAMX3Q,GAAEuC,OAAO8C,EAAQvE,WAIfP,GAAW,KACXe,UAAW,KACXY,GAAW,KACXC,IAAW,KACXxB,OAAW,KAKXmC,WAAY,SAAUV,EAASd,EAAWX,GACxCO,KAAKgB,GAAYE,EACjBlB,KAAKiB,IAAYnC,EAAEoC,GACnBlB,KAAKX,GAAYe,EAAUf,GAAKW,KAAK4P,YAAYhP,KACjDZ,KAAKI,UAAYA,EACjBJ,KAAKP,OAAYA,EAEbO,KAAKP,OAAO4P,WACdrP,KAAK6P,SAAWR,EAASrP,KAAK6P,SAAU7P,KAAKP,OAAO4P,WAGtDrP,KAAKkH,eAGP5C,QAAS,WACPtE,KAAKiB,IAAIsD,IAAI,IAAMvE,KAAKX,IACxBW,KAAKiB,IAAMjB,KAAKgB,GAAKhB,KAAKI,UAAY,MAQxCiF,OAAQ,WACN,KAAM,IAAIpG,OAAM,oBAIlBuH,iBAAkB,WAChB,GAAIoC,GAAW5I,KAAK8P,4BAChBhC,EAAS9N,KAAKiB,IAAI6M,SAGlBxF,EAAUtI,KAAKP,OAAOyD,QAC1B,IAAIoF,EAAS,CACJA,YAAmBxJ,KAAMwJ,EAAUxJ,EAAEwJ,GAC3C,IAAIyH,GAAezH,EAAQ0H,eAAelC,QAC1CA,GAAO5D,KAAO6F,EAAa7F,IAC3B4D,EAAOnF,MAAQoH,EAAapH,KAK/B,MAFAC,GAASsB,KAAO4D,EAAO5D,IACvBtB,EAASD,MAAQmF,EAAOnF,KACjBC,GAITnD,MAAO,WACLzF,KAAKiB,IAAIwE,SAMXyB,YAAa,WACXlH,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,QAGzD6P,SAAU,SAAUrK,GACdxF,KAAKiQ,YAAYzK,IACrBxF,KAAKI,UAAUqE,QAAQzE,KAAK4E,0BAA0B,IAIxDqL,YAAa,SAAUC,GACrB,OAAQA,EAAWnF,SACjB,IAAK,GACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,EAEX,GAAImF,EAAWlF,QAAS,OAAQkF,EAAWnF,SACzC,IAAK,IACL,IAAK,IACH,OAAO,MAKfjM,EAAEQ,GAAGC,aAAa4E,QAAUA,GAC5BnF,IAED,SAAUF,GACT,YAMA,SAASqR,GAASjP,EAASd,EAAWX,GACpCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO8O,EAASvQ,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAKrDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUvQ,KAAKgB,GAAGqD,cACvCmM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAEf,oBAAdgL,KACL1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAG2P,eAAiB3Q,KAAKgB,GAAGqD,aAAegM,EAAItM,SAIxDa,uBAAwB,WACtB,MAAO5E,MAAKgB,GAAGsE,MAAMiL,UAAU,EAAGvQ,KAAKgB,GAAGqD,eAM5CyL,0BAA2B,WACzB,GAAIc,GAAI9R,EAAEQ,GAAGC,aAAasR,oBAAoB7Q,KAAKgB,GAAIhB,KAAKgB,GAAG2P,eAC/D,QACEzG,IAAK0G,EAAE1G,IAAMlK,KAAK8Q,uBAAyB9Q,KAAKiB,IAAIkJ,YACpDxB,KAAMiI,EAAEjI,KAAO3I,KAAKiB,IAAImJ,aACxBkE,WAAYtO,KAAK8Q,yBAIrBA,qBAAsB,WACpB,GAAIxC,GAAanC,SAASnM,KAAKiB,IAAIwH,IAAI,eAAgB,GACvD,IAAIsI,MAAMzC,GAAa,CAErB,GAAI0C,GAAahR,KAAKgB,GAAGgQ,WACrBC,EAAOrN,SAASgD,cAAc5G,KAAKgB,GAAGkQ,UACtCC,EAAQnR,KAAKgB,GAAGmQ,KACpBF,GAAKG,aACH,QACA,sCAAwCD,EAAME,WAAa,cAAgBF,EAAMG,UAEnFL,EAAKM,UAAY,OACjBP,EAAWQ,YAAYP,GACvB3C,EAAa2C,EAAKQ,aAClBT,EAAWU,YAAYT,GAEzB,MAAO3C,MAIXxP,EAAEQ,GAAGC,aAAa4Q,SAAWA,GAC7BnR,IAED,SAAUF,GACT,YAIA,SAAS6S,GAAWzQ,EAASd,EAAWX,GACtCO,KAAK4B,WAAWV,EAASd,EAAWX,GACpCX,EAAE,SAAW8S,EAAe,WAAWnJ,KACrCG,SAAU,WACVsB,IAAK,MACLvB,KAAM,QACLkJ,aAAa3Q,GARlB,GAAI0Q,GAAe,GAWnB9S,GAAEuC,OAAOsQ,EAAW/R,UAAWd,EAAEQ,GAAGC,aAAa4Q,SAASvQ,WAIxDyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAGI4K,GAHAC,EAAMrQ,KAAK4E,yBACX0L,EAAOtQ,KAAKgB,GAAGsE,MAAMiL,UAAUF,EAAItM,QACnCyM,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GAC1BxQ,KAAKiB,IAAIyP,IAAIL,EAAMC,GACnBtQ,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQ9R,KAAKgB,GAAG+Q,iBACpBD,GAAME,UAAS,GACfF,EAAMG,QAAQ,YAAa5B,EAAItM,QAC/B+N,EAAMI,UAAU,YAAa7B,EAAItM,QACjC+N,EAAMzM,WAIVT,uBAAwB,WACtB5E,KAAKgB,GAAGyE,OACR,IAAIqM,GAAQlO,SAASuO,UAAUC,aAC/BN,GAAMI,UAAU,aAAclS,KAAKgB,GAAGsE,MAAMvB,OAC5C,IAAIsO,GAAMP,EAAMpN,KAAK4N,MAAMV,EAC3B,OAAsB,KAAfS,EAAItO,OAAesO,EAAI,GAAKA,EAAI,MAI3CvT,EAAEQ,GAAGC,aAAaoS,WAAaA,GAC/B3S,IAMD,SAAUF,GACT,YAMA,SAASyT,GAAiBrR,EAASd,EAAWX,GAC5CO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAOkR,EAAgB3S,UAAWd,EAAEQ,GAAGC,aAAa4E,QAAQvE,WAM5DyF,OAAQ,SAAUC,EAAOC,EAAUC,GACjC,GAAI6K,GAAMrQ,KAAK4E,yBAEX4N,EAAMxS,KAAKgB,GAAGU,cAAc+Q,eAE5BX,EAAQU,EAAIE,WAAW,GACvBP,EAAYL,EAAMa,YACtBR,GAAUS,mBAAmBd,EAAMe,eACnC,IAGIzC,GAHA0C,EAAUX,EAAUlP,WACpBqN,EAAOwC,EAAQvC,UAAUuB,EAAMiB,aAC/BvC,EAAYjL,EAAS0J,QAAQ3J,EAAOE,EAExC,IAAyB,mBAAdgL,GAA2B,CAChC1R,EAAE2R,QAAQD,KACZF,EAAOE,EAAU,GAAKF,EACtBE,EAAYA,EAAU,IAExBJ,EAAStR,EAAEgH,WAAWP,EAASQ,OAASR,EAASQ,MAAMsK,GAAO9K,EAASQ,MACvEsK,EAAMA,EAAIpB,QAAQmB,EAAQI,GACrBvB,QAAQ,KAAM,SACnB6C,EAAMc,mBAAmBd,EAAMe,gBAC/Bf,EAAMkB,gBAGN,IAAIC,GAAajT,KAAKgB,GAAGU,cAAckF,cAAc,MACrDqM,GAAW1B,UAAYlB,CACvB,IAAI6C,GAAclT,KAAKgB,GAAGU,cAAckF,cAAc,MACtDsM,GAAY3B,UAAYjB,CAMxB,KAHA,GACI6C,GACAC,EAFAC,EAAWrT,KAAKgB,GAAGU,cAAc4R,yBAG9BH,EAAYF,EAAWM,YAC7BH,EAAYC,EAAS7B,YAAY2B,EAElC,MAAOA,EAAYD,EAAYK,YAC9BF,EAAS7B,YAAY2B,EAItBrB,GAAM0B,WAAWH,GACjBvB,EAAM2B,cAAcL,GAEpBtB,EAAME,UAAS,GACfQ,EAAIkB,kBACJlB,EAAImB,SAAS7B,KAgBjBhC,0BAA2B,WACzB,GAAIgC,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GAAGC,aAC3DiB,EAAO5T,KAAKgB,GAAGU,cAAckF,cAAc,OAC/CkL,GAAM0B,WAAWI,GACjB9B,EAAMc,mBAAmBgB,GACzB9B,EAAMkB,gBACN,IAAIa,GAAQ/U,EAAE8U,GACVhL,EAAWiL,EAAM/F,QAOrB,IANAlF,EAASD,MAAQ3I,KAAKiB,IAAI6M,SAASnF,KACnCC,EAASsB,KAAO2J,EAAM7M,SAAWhH,KAAKiB,IAAI6M,SAAS5D,IACnDtB,EAAS0F,WAAauF,EAAM7M,SAIxBhH,KAAKI,UAAUqD,QAAS,CAC1B,GAAIqQ,GAAiB9T,KAAKI,UAAUqD,QAAQqK,QAC5ClF,GAASsB,KAAO4J,EAAe5J,IAC/BtB,EAASD,MAAQmL,EAAenL,KAEhCC,EAASsB,KAAOlK,KAAKiB,IAAIkJ,YAI3B,MADA0J,GAAM7K,SACCJ,GAWThE,uBAAwB,WACtB,GAAIkN,GAAQ9R,KAAKgB,GAAGU,cAAc+Q,eAAeC,WAAW,GACxDP,EAAYL,EAAMa,YAEtB,OADAR,GAAUS,mBAAmBd,EAAMe,gBAC5BV,EAAUlP,WAAWsN,UAAU,EAAGuB,EAAMiB,gBAInDjU,EAAEQ,GAAGC,aAAagT,gBAAkBA,GACpCvT,IAMD,SAAUF,GACT,YAMA,SAASiV,GAAU7S,EAASd,EAAWX,GACrCO,KAAK4B,WAAWV,EAASd,EAAWX,GAGtCX,EAAEuC,OAAO0S,EAASnU,UAAWd,EAAEQ,GAAGC,aAAagT,gBAAgB3S,WAC7DsH,YAAa,WACX,GAAI/G,GAAQH,IACZA,MAAKP,OAAO6C,kBAAkBN,GAAG,MAAO,SAASC,GAC/C,GAAI+R,GAAW/R,EAAM5B,IAErB,OADAF,GAAM0P,SAASmE,GACX7T,EAAMC,UAAUoD,SAAS4C,OAASjG,EAAM8P,YAAY+D,IAC/C,EADT,QAGC,KAAM,KAAM,GAEfhU,KAAKiB,IAAIe,GAAG,SAAWhC,KAAKX,GAAIP,EAAE6M,MAAM3L,KAAK6P,SAAU7P,UAI3DlB,EAAEQ,GAAGC,aAAawU,SAAWA,GAC7B/U,GAuBD,SAAUF,GAmDX,QAAS+R,GAAoB3P,EAAS0H,EAAU4F,GAC9C,IAAIyF,EACF,KAAM,IAAIhV,OAAM,iFAGlB,IAAIiV,GAAQ1F,GAAWA,EAAQ0F,QAAS,CACxC,IAAIA,EAAO,CACT,GAAIlT,GAAK4C,SAASuQ,cAAc,4CAC3BnT,IAAOA,EAAGgQ,WAAWU,YAAY1Q,GAIxC,GAAIoT,GAAMxQ,SAASgD,cAAc,MACjCwN,GAAI/U,GAAK,2CACTuE,SAASyQ,KAAK7C,YAAY4C,EAE1B,IAAIjD,GAAQiD,EAAIjD,MACZmD,EAAWzQ,OAAO0Q,iBAAkBA,iBAAiBrT,GAAWA,EAAQsT,YAG5ErD,GAAMsD,WAAa,WACM,UAArBvT,EAAQgQ,WACVC,EAAMuD,SAAW,cAGnBvD,EAAMvI,SAAW,WACZsL,IACH/C,EAAMwD,WAAa,UAGrBC,EAAWC,QAAQ,SAAUlR,GAC3BwN,EAAMxN,GAAQ2Q,EAAS3Q,KAGrBmR,EAEE5T,EAAQ6T,aAAe5I,SAASmI,EAAStN,UAC3CmK,EAAM6D,UAAY,UAEpB7D,EAAM8D,SAAW,SAGnBb,EAAIc,YAAchU,EAAQoE,MAAMiL,UAAU,EAAG3H,GAEpB,UAArB1H,EAAQgQ,WACVkD,EAAIc,YAAcd,EAAIc,YAAYjG,QAAQ,MAAO,KAEnD,IAAIkG,GAAOvR,SAASgD,cAAc,OAMlCuO,GAAKD,YAAchU,EAAQoE,MAAMiL,UAAU3H,IAAa,IACxDwL,EAAI5C,YAAY2D,EAEhB,IAAIC,IACFlL,IAAKiL,EAAKE,UAAYlJ,SAASmI,EAAyB,gBACxD3L,KAAMwM,EAAKG,WAAanJ,SAASmI,EAA0B,iBAS7D,OANIJ,GACFiB,EAAKhE,MAAMoE,gBAAkB,OAE7B3R,SAASyQ,KAAK3C,YAAY0C,GAGrBgB,EAhHT,GAAIR,IACF,YACA,YACA,QACA,SACA,YACA,YAEA,iBACA,mBACA,oBACA,kBACA,cAEA,aACA,eACA,gBACA,cAGA,YACA,cACA,aACA,cACA,WACA,iBACA,aACA,aAEA,YACA,gBACA,aACA,iBAEA,gBACA,cAEA,UACA,cAIEX,EAA+B,mBAAXpQ,QACpBiR,EAAab,GAAuC,MAA1BpQ,OAAO2R,eAwErC1W,GAAEQ,GAAGC,aAAasR,oBAAsBA,GAEtC7R,GAEKA"} \ No newline at end of file
diff --git a/library/markdown.php b/library/markdown.php
deleted file mode 100644
index 0e3275ff2..000000000
--- a/library/markdown.php
+++ /dev/null
@@ -1,2932 +0,0 @@
-<?php
-#
-# Markdown Extra - A text-to-HTML conversion tool for web writers
-#
-# PHP Markdown & Extra
-# Copyright (c) 2004-2012 Michel Fortin
-# <http://michelf.com/projects/php-markdown/>
-#
-# Original Markdown
-# Copyright (c) 2004-2006 John Gruber
-# <http://daringfireball.net/projects/markdown/>
-#
-
-
-define( 'MARKDOWN_VERSION', "1.0.1o" ); # Sun 8 Jan 2012
-define( 'MARKDOWNEXTRA_VERSION', "1.2.5" ); # Sun 8 Jan 2012
-
-
-#
-# Global default settings:
-#
-
-# Change to ">" for HTML output
-@define( 'MARKDOWN_EMPTY_ELEMENT_SUFFIX', " />");
-
-# Define the width of a tab for code blocks.
-@define( 'MARKDOWN_TAB_WIDTH', 4 );
-
-# Optional title attribute for footnote links and backlinks.
-@define( 'MARKDOWN_FN_LINK_TITLE', "" );
-@define( 'MARKDOWN_FN_BACKLINK_TITLE', "" );
-
-# Optional class attribute for footnote links and backlinks.
-@define( 'MARKDOWN_FN_LINK_CLASS', "" );
-@define( 'MARKDOWN_FN_BACKLINK_CLASS', "" );
-
-
-#
-# WordPress settings:
-#
-
-# Change to false to remove Markdown from posts and/or comments.
-@define( 'MARKDOWN_WP_POSTS', true );
-@define( 'MARKDOWN_WP_COMMENTS', true );
-
-
-
-### Standard Function Interface ###
-
-@define( 'MARKDOWN_PARSER_CLASS', 'MarkdownExtra_Parser' );
-
-function Markdown($text) {
-#
-# Initialize the parser and return the result of its transform method.
-#
- # Setup static parser variable.
- static $parser;
- if (!isset($parser)) {
- $parser_class = MARKDOWN_PARSER_CLASS;
- $parser = new $parser_class;
- }
-
- # Transform text using parser.
- return $parser->transform($text);
-}
-
-
-### WordPress Plugin Interface ###
-
-/*
-Plugin Name: Markdown Extra
-Plugin URI: http://michelf.com/projects/php-markdown/
-Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>
-Version: 1.2.5
-Author: Michel Fortin
-Author URI: http://michelf.com/
-*/
-
-if (isset($wp_version)) {
- # More details about how it works here:
- # <http://michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/>
-
- # Post content and excerpts
- # - Remove WordPress paragraph generator.
- # - Run Markdown on excerpt, then remove all tags.
- # - Add paragraph tag around the excerpt, but remove it for the excerpt rss.
- if (MARKDOWN_WP_POSTS) {
- remove_filter('the_content', 'wpautop');
- remove_filter('the_content_rss', 'wpautop');
- remove_filter('the_excerpt', 'wpautop');
- add_filter('the_content', 'mdwp_MarkdownPost', 6);
- add_filter('the_content_rss', 'mdwp_MarkdownPost', 6);
- add_filter('get_the_excerpt', 'mdwp_MarkdownPost', 6);
- add_filter('get_the_excerpt', 'trim', 7);
- add_filter('the_excerpt', 'mdwp_add_p');
- add_filter('the_excerpt_rss', 'mdwp_strip_p');
-
- remove_filter('content_save_pre', 'balanceTags', 50);
- remove_filter('excerpt_save_pre', 'balanceTags', 50);
- add_filter('the_content', 'balanceTags', 50);
- add_filter('get_the_excerpt', 'balanceTags', 9);
- }
-
- # Add a footnote id prefix to posts when inside a loop.
- function mdwp_MarkdownPost($text) {
- static $parser;
- if (!$parser) {
- $parser_class = MARKDOWN_PARSER_CLASS;
- $parser = new $parser_class;
- }
- if (is_single() || is_page() || is_feed()) {
- $parser->fn_id_prefix = "";
- } else {
- $parser->fn_id_prefix = get_the_ID() . ".";
- }
- return $parser->transform($text);
- }
-
- # Comments
- # - Remove WordPress paragraph generator.
- # - Remove WordPress auto-link generator.
- # - Scramble important tags before passing them to the kses filter.
- # - Run Markdown on excerpt then remove paragraph tags.
- if (MARKDOWN_WP_COMMENTS) {
- remove_filter('comment_text', 'wpautop', 30);
- remove_filter('comment_text', 'make_clickable');
- add_filter('pre_comment_content', 'Markdown', 6);
- add_filter('pre_comment_content', 'mdwp_hide_tags', 8);
- add_filter('pre_comment_content', 'mdwp_show_tags', 12);
- add_filter('get_comment_text', 'Markdown', 6);
- add_filter('get_comment_excerpt', 'Markdown', 6);
- add_filter('get_comment_excerpt', 'mdwp_strip_p', 7);
-
- global $mdwp_hidden_tags, $mdwp_placeholders;
- $mdwp_hidden_tags = explode(' ',
- '<p> </p> <pre> </pre> <ol> </ol> <ul> </ul> <li> </li>');
- $mdwp_placeholders = explode(' ', str_rot13(
- 'pEj07ZbbBZ U1kqgh4w4p pre2zmeN6K QTi31t9pre ol0MP1jzJR '.
- 'ML5IjmbRol ulANi1NsGY J7zRLJqPul liA8ctl16T K9nhooUHli'));
- }
-
- function mdwp_add_p($text) {
- if (!preg_match('{^$|^<(p|ul|ol|dl|pre|blockquote)>}i', $text)) {
- $text = '<p>'.$text.'</p>';
- $text = preg_replace('{\n{2,}}', "</p>\n\n<p>", $text);
- }
- return $text;
- }
-
- function mdwp_strip_p($t) { return preg_replace('{</?p>}i', '', $t); }
-
- function mdwp_hide_tags($text) {
- global $mdwp_hidden_tags, $mdwp_placeholders;
- return str_replace($mdwp_hidden_tags, $mdwp_placeholders, $text);
- }
- function mdwp_show_tags($text) {
- global $mdwp_hidden_tags, $mdwp_placeholders;
- return str_replace($mdwp_placeholders, $mdwp_hidden_tags, $text);
- }
-}
-
-
-### bBlog Plugin Info ###
-
-function identify_modifier_markdown() {
- return array(
- 'name' => 'markdown',
- 'type' => 'modifier',
- 'nicename' => 'PHP Markdown Extra',
- 'description' => 'A text-to-HTML conversion tool for web writers',
- 'authors' => 'Michel Fortin and John Gruber',
- 'licence' => 'GPL',
- 'version' => MARKDOWNEXTRA_VERSION,
- 'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://michelf.com/projects/php-markdown/">More...</a>',
- );
-}
-
-
-### Smarty Modifier Interface ###
-
-function smarty_modifier_markdown($text) {
- return Markdown($text);
-}
-
-
-### Textile Compatibility Mode ###
-
-# Rename this file to "classTextile.php" and it can replace Textile everywhere.
-
-if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) {
- # Try to include PHP SmartyPants. Should be in the same directory.
- @include_once 'smartypants.php';
- # Fake Textile class. It calls Markdown instead.
- class Textile {
- function TextileThis($text, $lite='', $encode='') {
- if ($lite == '' && $encode == '') $text = Markdown($text);
- if (function_exists('SmartyPants')) $text = SmartyPants($text);
- return $text;
- }
- # Fake restricted version: restrictions are not supported for now.
- function TextileRestricted($text, $lite='', $noimage='') {
- return $this->TextileThis($text, $lite);
- }
- # Workaround to ensure compatibility with TextPattern 4.0.3.
- function blockLite($text) { return $text; }
- }
-}
-
-
-
-#
-# Markdown Parser Class
-#
-
-class Markdown_Parser {
-
- # Regex to match balanced [brackets].
- # Needed to insert a maximum bracked depth while converting to PHP.
- var $nested_brackets_depth = 6;
- var $nested_brackets_re;
-
- var $nested_url_parenthesis_depth = 4;
- var $nested_url_parenthesis_re;
-
- # Table of hash values for escaped characters:
- var $escape_chars = '\`*_{}[]()>#+-.!';
- var $escape_chars_re;
-
- # Change to ">" for HTML output.
- var $empty_element_suffix = MARKDOWN_EMPTY_ELEMENT_SUFFIX;
- var $tab_width = MARKDOWN_TAB_WIDTH;
-
- # Change to `true` to disallow markup or entities.
- var $no_markup = false;
- var $no_entities = false;
-
- # Predefined urls and titles for reference links and images.
- var $predef_urls = array();
- var $predef_titles = array();
-
-
- function Markdown_Parser() {
- #
- # Constructor function. Initialize appropriate member variables.
- #
- $this->_initDetab();
- $this->prepareItalicsAndBold();
-
- $this->nested_brackets_re =
- str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
- str_repeat('\])*', $this->nested_brackets_depth);
-
- $this->nested_url_parenthesis_re =
- str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
- str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
-
- $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
-
- # Sort document, block, and span gamut in ascendent priority order.
- asort($this->document_gamut);
- asort($this->block_gamut);
- asort($this->span_gamut);
- }
-
-
- # Internal hashes used during transformation.
- var $urls = array();
- var $titles = array();
- var $html_hashes = array();
-
- # Status flag to avoid invalid nesting.
- var $in_anchor = false;
-
-
- function setup() {
- #
- # Called before the transformation process starts to setup parser
- # states.
- #
- # Clear global hashes.
- $this->urls = $this->predef_urls;
- $this->titles = $this->predef_titles;
- $this->html_hashes = array();
-
- $in_anchor = false;
- }
-
- function teardown() {
- #
- # Called after the transformation process to clear any variable
- # which may be taking up memory unnecessarly.
- #
- $this->urls = array();
- $this->titles = array();
- $this->html_hashes = array();
- }
-
-
- function transform($text) {
- #
- # Main function. Performs some preprocessing on the input text
- # and pass it through the document gamut.
- #
- $this->setup();
-
- # Remove UTF-8 BOM and marker character in input, if present.
- $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
-
- # Standardize line endings:
- # DOS to Unix and Mac to Unix
- $text = preg_replace('{\r\n?}', "\n", $text);
-
- # Make sure $text ends with a couple of newlines:
- $text .= "\n\n";
-
- # Convert all tabs to spaces.
- $text = $this->detab($text);
-
- # Turn block-level HTML blocks into hash entries
- $text = $this->hashHTMLBlocks($text);
-
- # Strip any lines consisting only of spaces and tabs.
- # This makes subsequent regexen easier to write, because we can
- # match consecutive blank lines with /\n+/ instead of something
- # contorted like /[ ]*\n+/ .
- $text = preg_replace('/^[ ]+$/m', '', $text);
-
- # Run document gamut methods.
- foreach ($this->document_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- $this->teardown();
-
- return $text . "\n";
- }
-
- var $document_gamut = array(
- # Strip link definitions, store in hashes.
- "stripLinkDefinitions" => 20,
-
- "runBasicBlockGamut" => 30,
- );
-
-
- function stripLinkDefinitions($text) {
- #
- # Strips link definitions from text, stores the URLs and titles in
- # hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: ^[id]: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
- [ ]*
- \n? # maybe *one* newline
- [ ]*
- (?:
- <(.+?)> # url = $2
- |
- (\S+?) # url = $3
- )
- [ ]*
- \n? # maybe one newline
- [ ]*
- (?:
- (?<=\s) # lookbehind for whitespace
- ["(]
- (.*?) # title = $4
- [")]
- [ ]*
- )? # title is optional
- (?:\n+|\Z)
- }xm',
- array(&$this, '_stripLinkDefinitions_callback'),
- $text);
- return $text;
- }
- function _stripLinkDefinitions_callback($matches) {
- $link_id = strtolower($matches[1]);
- $url = $matches[2] == '' ? $matches[3] : $matches[2];
- $this->urls[$link_id] = $url;
- $this->titles[$link_id] =& $matches[4];
- return ''; # String that will replace the block
- }
-
-
- function hashHTMLBlocks($text) {
- if ($this->no_markup) return $text;
-
- $less_than_tab = $this->tab_width - 1;
-
- # Hashify HTML blocks:
- # We only want to do this for block-level HTML tags, such as headers,
- # lists, and tables. That's because we still want to wrap <p>s around
- # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- # phrase emphasis, and spans. The list of tags we're looking for is
- # hard-coded:
- #
- # * List "a" is made of tags which can be both inline or block-level.
- # These will be treated block-level when the start tag is alone on
- # its line, otherwise they're not matched here and will be taken as
- # inline later.
- # * List "b" is made of tags which are always block-level;
- #
- $block_tags_a_re = 'ins|del';
- $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
- 'script|noscript|form|fieldset|iframe|math';
-
- # Regular expression for the content of a block tag.
- $nested_tags_level = 4;
- $attr = '
- (?> # optional tag attributes
- \s # starts with whitespace
- (?>
- [^>"/]+ # text outside quotes
- |
- /+(?!>) # slash not followed by ">"
- |
- "[^"]*" # text inside double quotes (tolerate ">")
- |
- \'[^\']*\' # text inside single quotes (tolerate ">")
- )*
- )?
- ';
- $content =
- str_repeat('
- (?>
- [^<]+ # content without tag
- |
- <\2 # nested opening tag
- '.$attr.' # attributes
- (?>
- />
- |
- >', $nested_tags_level). # end of opening tag
- '.*?'. # last level nested tag content
- str_repeat('
- </\2\s*> # closing nested tag
- )
- |
- <(?!/\2\s*> # other tags with a different name
- )
- )*',
- $nested_tags_level);
- $content2 = str_replace('\2', '\3', $content);
-
- # First, look for nested blocks, e.g.:
- # <div>
- # <div>
- # tags for inner block must be indented.
- # </div>
- # </div>
- #
- # The outermost tags must start at the left margin for this to match, and
- # the inner nested divs must be indented.
- # We need to do this before the next, more liberal match, because the next
- # match will start at the first `<div>` and stop at the first `</div>`.
- $text = preg_replace_callback('{(?>
- (?>
- (?<=\n\n) # Starting after a blank line
- | # or
- \A\n? # the beginning of the doc
- )
- ( # save in $1
-
- # Match from `\n<tag>` to `</tag>\n`, handling nested tags
- # in between.
-
- [ ]{0,'.$less_than_tab.'}
- <('.$block_tags_b_re.')# start tag = $2
- '.$attr.'> # attributes followed by > and \n
- '.$content.' # content, support nesting
- </\2> # the matching end tag
- [ ]* # trailing spaces/tabs
- (?=\n+|\Z) # followed by a newline or end of document
-
- | # Special version for tags of group a.
-
- [ ]{0,'.$less_than_tab.'}
- <('.$block_tags_a_re.')# start tag = $3
- '.$attr.'>[ ]*\n # attributes followed by >
- '.$content2.' # content, support nesting
- </\3> # the matching end tag
- [ ]* # trailing spaces/tabs
- (?=\n+|\Z) # followed by a newline or end of document
-
- | # Special case just for <hr />. It was easier to make a special
- # case than to make the other regex more complicated.
-
- [ ]{0,'.$less_than_tab.'}
- <(hr) # start tag = $2
- '.$attr.' # attributes
- /?> # the matching end tag
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- | # Special case for standalone HTML comments:
-
- [ ]{0,'.$less_than_tab.'}
- (?s:
- <!-- .*? -->
- )
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- | # PHP and ASP-style processor instructions (<? and <%)
-
- [ ]{0,'.$less_than_tab.'}
- (?s:
- <([?%]) # $2
- .*?
- \2>
- )
- [ ]*
- (?=\n{2,}|\Z) # followed by a blank line or end of document
-
- )
- )}Sxmi',
- array(&$this, '_hashHTMLBlocks_callback'),
- $text);
-
- return $text;
- }
- function _hashHTMLBlocks_callback($matches) {
- $text = $matches[1];
- $key = $this->hashBlock($text);
- return "\n\n$key\n\n";
- }
-
-
- function hashPart($text, $boundary = 'X') {
- #
- # Called whenever a tag must be hashed when a function insert an atomic
- # element in the text stream. Passing $text to through this function gives
- # a unique text-token which will be reverted back when calling unhash.
- #
- # The $boundary argument specify what character should be used to surround
- # the token. By convension, "B" is used for block elements that needs not
- # to be wrapped into paragraph tags at the end, ":" is used for elements
- # that are word separators and "X" is used in the general case.
- #
- # Swap back any tag hash found in $text so we do not have to `unhash`
- # multiple times at the end.
- $text = $this->unhash($text);
-
- # Then hash the block.
- static $i = 0;
- $key = "$boundary\x1A" . ++$i . $boundary;
- $this->html_hashes[$key] = $text;
- return $key; # String that will replace the tag.
- }
-
-
- function hashBlock($text) {
- #
- # Shortcut function for hashPart with block-level boundaries.
- #
- return $this->hashPart($text, 'B');
- }
-
-
- var $block_gamut = array(
- #
- # These are all the transformations that form block-level
- # tags like paragraphs, headers, and list items.
- #
- "doHeaders" => 10,
- "doHorizontalRules" => 20,
-
- "doLists" => 40,
- "doCodeBlocks" => 50,
- "doBlockQuotes" => 60,
- );
-
- function runBlockGamut($text) {
- #
- # Run block gamut tranformations.
- #
- # We need to escape raw HTML in Markdown source before doing anything
- # else. This need to be done for each block, and not only at the
- # begining in the Markdown function since hashed blocks can be part of
- # list items and could have been indented. Indented blocks would have
- # been seen as a code block in a previous pass of hashHTMLBlocks.
- $text = $this->hashHTMLBlocks($text);
-
- return $this->runBasicBlockGamut($text);
- }
-
- function runBasicBlockGamut($text) {
- #
- # Run block gamut tranformations, without hashing HTML blocks. This is
- # useful when HTML blocks are known to be already hashed, like in the first
- # whole-document pass.
- #
- foreach ($this->block_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- # Finally form paragraph and restore hashed blocks.
- $text = $this->formParagraphs($text);
-
- return $text;
- }
-
-
- function doHorizontalRules($text) {
- # Do Horizontal Rules:
- return preg_replace(
- '{
- ^[ ]{0,3} # Leading space
- ([-*_]) # $1: First marker
- (?> # Repeated marker group
- [ ]{0,2} # Zero, one, or two spaces.
- \1 # Marker character
- ){2,} # Group repeated at least twice
- [ ]* # Tailing spaces
- $ # End of line.
- }mx',
- "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
- $text);
- }
-
-
- var $span_gamut = array(
- #
- # These are all the transformations that occur *within* block-level
- # tags like paragraphs, headers, and list items.
- #
- # Process character escapes, code spans, and inline HTML
- # in one shot.
- "parseSpan" => -30,
-
- # Process anchor and image tags. Images must come first,
- # because ![foo][f] looks like an anchor.
- "doImages" => 10,
- "doAnchors" => 20,
-
- # Make links out of things like `<http://example.com/>`
- # Must come after doAnchors, because you can use < and >
- # delimiters in inline links like [this](<url>).
- "doAutoLinks" => 30,
- "encodeAmpsAndAngles" => 40,
-
- "doItalicsAndBold" => 50,
- "doHardBreaks" => 60,
- );
-
- function runSpanGamut($text) {
- #
- # Run span gamut tranformations.
- #
- foreach ($this->span_gamut as $method => $priority) {
- $text = $this->$method($text);
- }
-
- return $text;
- }
-
-
- function doHardBreaks($text) {
- # Do hard breaks:
- return preg_replace_callback('/ {2,}\n/',
- array(&$this, '_doHardBreaks_callback'), $text);
- }
- function _doHardBreaks_callback($matches) {
- return $this->hashPart("<br$this->empty_element_suffix\n");
- }
-
-
- function doAnchors($text) {
- #
- # Turn Markdown link shortcuts into XHTML <a> tags.
- #
- if ($this->in_anchor) return $text;
- $this->in_anchor = true;
-
- #
- # First, handle reference-style links: [link text] [id]
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ('.$this->nested_brackets_re.') # link text = $2
- \]
-
- [ ]? # one optional space
- (?:\n[ ]*)? # one optional newline followed by spaces
-
- \[
- (.*?) # id = $3
- \]
- )
- }xs',
- array(&$this, '_doAnchors_reference_callback'), $text);
-
- #
- # Next, inline-style links: [link text](url "optional title")
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ('.$this->nested_brackets_re.') # link text = $2
- \]
- \( # literal paren
- [ \n]*
- (?:
- <(.+?)> # href = $3
- |
- ('.$this->nested_url_parenthesis_re.') # href = $4
- )
- [ \n]*
- ( # $5
- ([\'"]) # quote char = $6
- (.*?) # Title = $7
- \6 # matching quote
- [ \n]* # ignore any spaces/tabs between closing quote and )
- )? # title is optional
- \)
- )
- }xs',
- array(&$this, '_doAnchors_inline_callback'), $text);
-
- #
- # Last, handle reference-style shortcuts: [link text]
- # These must come last in case you've also got [link text][1]
- # or [link text](/foo)
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- \[
- ([^\[\]]+) # link text = $2; can\'t contain [ or ]
- \]
- )
- }xs',
- array(&$this, '_doAnchors_reference_callback'), $text);
-
- $this->in_anchor = false;
- return $text;
- }
- function _doAnchors_reference_callback($matches) {
- $whole_match = $matches[1];
- $link_text = $matches[2];
- $link_id =& $matches[3];
-
- if ($link_id == "") {
- # for shortcut links like [this][] or [this].
- $link_id = $link_text;
- }
-
- # lower-case and turn embedded newlines into spaces
- $link_id = strtolower($link_id);
- $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
-
- if (isset($this->urls[$link_id])) {
- $url = $this->urls[$link_id];
- $url = $this->encodeAttribute($url);
-
- $result = "<a href=\"$url\"";
- if ( isset( $this->titles[$link_id] ) ) {
- $title = $this->titles[$link_id];
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text</a>";
- $result = $this->hashPart($result);
- }
- else {
- $result = $whole_match;
- }
- return $result;
- }
- function _doAnchors_inline_callback($matches) {
- $whole_match = $matches[1];
- $link_text = $this->runSpanGamut($matches[2]);
- $url = $matches[3] == '' ? $matches[4] : $matches[3];
- $title =& $matches[7];
-
- $url = $this->encodeAttribute($url);
-
- $result = "<a href=\"$url\"";
- if (isset($title)) {
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text</a>";
-
- return $this->hashPart($result);
- }
-
-
- function doImages($text) {
- #
- # Turn Markdown image shortcuts into <img> tags.
- #
- #
- # First, handle reference-style labeled images: ![alt text][id]
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- !\[
- ('.$this->nested_brackets_re.') # alt text = $2
- \]
-
- [ ]? # one optional space
- (?:\n[ ]*)? # one optional newline followed by spaces
-
- \[
- (.*?) # id = $3
- \]
-
- )
- }xs',
- array(&$this, '_doImages_reference_callback'), $text);
-
- #
- # Next, handle inline images: ![alt text](url "optional title")
- # Don't forget: encode * and _
- #
- $text = preg_replace_callback('{
- ( # wrap whole match in $1
- !\[
- ('.$this->nested_brackets_re.') # alt text = $2
- \]
- \s? # One optional whitespace character
- \( # literal paren
- [ \n]*
- (?:
- <(\S*)> # src url = $3
- |
- ('.$this->nested_url_parenthesis_re.') # src url = $4
- )
- [ \n]*
- ( # $5
- ([\'"]) # quote char = $6
- (.*?) # title = $7
- \6 # matching quote
- [ \n]*
- )? # title is optional
- \)
- )
- }xs',
- array(&$this, '_doImages_inline_callback'), $text);
-
- return $text;
- }
- function _doImages_reference_callback($matches) {
- $whole_match = $matches[1];
- $alt_text = $matches[2];
- $link_id = strtolower($matches[3]);
-
- if ($link_id == "") {
- $link_id = strtolower($alt_text); # for shortcut links like ![this][].
- }
-
- $alt_text = $this->encodeAttribute($alt_text);
- if (isset($this->urls[$link_id])) {
- $url = $this->encodeAttribute($this->urls[$link_id]);
- $result = "<img src=\"$url\" alt=\"$alt_text\"";
- if (isset($this->titles[$link_id])) {
- $title = $this->titles[$link_id];
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
- $result .= $this->empty_element_suffix;
- $result = $this->hashPart($result);
- }
- else {
- # If there's no such link ID, leave intact:
- $result = $whole_match;
- }
-
- return $result;
- }
- function _doImages_inline_callback($matches) {
- $whole_match = $matches[1];
- $alt_text = $matches[2];
- $url = $matches[3] == '' ? $matches[4] : $matches[3];
- $title =& $matches[7];
-
- $alt_text = $this->encodeAttribute($alt_text);
- $url = $this->encodeAttribute($url);
- $result = "<img src=\"$url\" alt=\"$alt_text\"";
- if (isset($title)) {
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\""; # $title already quoted
- }
- $result .= $this->empty_element_suffix;
-
- return $this->hashPart($result);
- }
-
-
- function doHeaders($text) {
- # Setext-style headers:
- # Header 1
- # ========
- #
- # Header 2
- # --------
- #
- $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
- array(&$this, '_doHeaders_callback_setext'), $text);
-
- # atx-style headers:
- # # Header 1
- # ## Header 2
- # ## Header 2 with closing hashes ##
- # ...
- # ###### Header 6
- #
- $text = preg_replace_callback('{
- ^(\#{1,6}) # $1 = string of #\'s
- [ ]*
- (.+?) # $2 = Header text
- [ ]*
- \#* # optional closing #\'s (not counted)
- \n+
- }xm',
- array(&$this, '_doHeaders_callback_atx'), $text);
-
- return $text;
- }
- function _doHeaders_callback_setext($matches) {
- # Terrible hack to check we haven't found an empty list item.
- if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
- return $matches[0];
-
- $level = $matches[2]{0} == '=' ? 1 : 2;
- $block = "<h$level>".$this->runSpanGamut($matches[1])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
- function _doHeaders_callback_atx($matches) {
- $level = strlen($matches[1]);
- $block = "<h$level>".$this->runSpanGamut($matches[2])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
-
-
- function doLists($text) {
- #
- # Form HTML ordered (numbered) and unordered (bulleted) lists.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Re-usable patterns to match list item bullets and number markers:
- $marker_ul_re = '[*+-]';
- $marker_ol_re = '\d+[\.]';
- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
-
- $markers_relist = array(
- $marker_ul_re => $marker_ol_re,
- $marker_ol_re => $marker_ul_re,
- );
-
- foreach ($markers_relist as $marker_re => $other_marker_re) {
- # Re-usable pattern to match any entirel ul or ol list:
- $whole_list_re = '
- ( # $1 = whole list
- ( # $2
- ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
- ('.$marker_re.') # $4 = first list item marker
- [ ]+
- )
- (?s:.+?)
- ( # $5
- \z
- |
- \n{2,}
- (?=\S)
- (?! # Negative lookahead for another list item marker
- [ ]*
- '.$marker_re.'[ ]+
- )
- |
- (?= # Lookahead for another kind of list
- \n
- \3 # Must have the same indentation
- '.$other_marker_re.'[ ]+
- )
- )
- )
- '; // mx
-
- # We use a different prefix before nested lists than top-level lists.
- # See extended comment in _ProcessListItems().
-
- if ($this->list_level) {
- $text = preg_replace_callback('{
- ^
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doLists_callback'), $text);
- }
- else {
- $text = preg_replace_callback('{
- (?:(?<=\n)\n|\A\n?) # Must eat the newline
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doLists_callback'), $text);
- }
- }
-
- return $text;
- }
- function _doLists_callback($matches) {
- # Re-usable patterns to match list item bullets and number markers:
- $marker_ul_re = '[*+-]';
- $marker_ol_re = '\d+[\.]';
- $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
-
- $list = $matches[1];
- $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
-
- $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
-
- $list .= "\n";
- $result = $this->processListItems($list, $marker_any_re);
-
- $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
- return "\n". $result ."\n\n";
- }
-
- var $list_level = 0;
-
- function processListItems($list_str, $marker_any_re) {
- #
- # Process the contents of a single ordered or unordered list, splitting it
- # into individual list items.
- #
- # The $this->list_level global keeps track of when we're inside a list.
- # Each time we enter a list, we increment it; when we leave a list,
- # we decrement. If it's zero, we're not in a list anymore.
- #
- # We do this because when we're not inside a list, we want to treat
- # something like this:
- #
- # I recommend upgrading to version
- # 8. Oops, now this line is treated
- # as a sub-list.
- #
- # As a single paragraph, despite the fact that the second line starts
- # with a digit-period-space sequence.
- #
- # Whereas when we're inside a list (or sub-list), that line will be
- # treated as the start of a sub-list. What a kludge, huh? This is
- # an aspect of Markdown's syntax that's hard to parse perfectly
- # without resorting to mind-reading. Perhaps the solution is to
- # change the syntax rules such that sub-lists must start with a
- # starting cardinal number; e.g. "1." or "a.".
-
- $this->list_level++;
-
- # trim trailing blank lines:
- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
-
- $list_str = preg_replace_callback('{
- (\n)? # leading line = $1
- (^[ ]*) # leading whitespace = $2
- ('.$marker_any_re.' # list marker and space = $3
- (?:[ ]+|(?=\n)) # space only required if item is not empty
- )
- ((?s:.*?)) # list item text = $4
- (?:(\n+(?=\n))|\n) # tailing blank line = $5
- (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
- }xm',
- array(&$this, '_processListItems_callback'), $list_str);
-
- $this->list_level--;
- return $list_str;
- }
- function _processListItems_callback($matches) {
- $item = $matches[4];
- $leading_line =& $matches[1];
- $leading_space =& $matches[2];
- $marker_space = $matches[3];
- $tailing_blank_line =& $matches[5];
-
- if ($leading_line || $tailing_blank_line ||
- preg_match('/\n{2,}/', $item))
- {
- # Replace marker with the appropriate whitespace indentation
- $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
- $item = $this->runBlockGamut($this->outdent($item)."\n");
- }
- else {
- # Recursion for sub-lists:
- $item = $this->doLists($this->outdent($item));
- $item = preg_replace('/\n+$/', '', $item);
- $item = $this->runSpanGamut($item);
- }
-
- return "<li>" . $item . "</li>\n";
- }
-
-
- function doCodeBlocks($text) {
- #
- # Process Markdown `<pre><code>` blocks.
- #
- $text = preg_replace_callback('{
- (?:\n\n|\A\n?)
- ( # $1 = the code block -- one or more lines, starting with a space/tab
- (?>
- [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
- .*\n+
- )+
- )
- ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
- }xm',
- array(&$this, '_doCodeBlocks_callback'), $text);
-
- return $text;
- }
- function _doCodeBlocks_callback($matches) {
- $codeblock = $matches[1];
-
- $codeblock = $this->outdent($codeblock);
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
-
- # trim leading newlines and trailing newlines
- $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
-
- $codeblock = "<pre><code>$codeblock\n</code></pre>";
- return "\n\n".$this->hashBlock($codeblock)."\n\n";
- }
-
-
- function makeCodeSpan($code) {
- #
- # Create a code span markup for $code. Called from handleSpanToken.
- #
- $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
- return $this->hashPart("<code class=\"inline-code\">$code</code>");
- }
-
-
- var $em_relist = array(
- '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?=\S|$)(?![\.,:;]\s)',
- '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
- '_' => '(?<=\S|^)(?<!_)_(?!_)',
- );
- var $strong_relist = array(
- '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?=\S|$)(?![\.,:;]\s)',
- '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
- '__' => '(?<=\S|^)(?<!_)__(?!_)',
- );
- var $em_strong_relist = array(
- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?=\S|$)(?![\.,:;]\s)',
- '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
- '___' => '(?<=\S|^)(?<!_)___(?!_)',
- );
- var $em_strong_prepared_relist;
-
- function prepareItalicsAndBold() {
- #
- # Prepare regular expressions for searching emphasis tokens in any
- # context.
- #
- foreach ($this->em_relist as $em => $em_re) {
- foreach ($this->strong_relist as $strong => $strong_re) {
- # Construct list of allowed token expressions.
- $token_relist = array();
- if (isset($this->em_strong_relist["$em$strong"])) {
- $token_relist[] = $this->em_strong_relist["$em$strong"];
- }
- $token_relist[] = $em_re;
- $token_relist[] = $strong_re;
-
- # Construct master expression from list.
- $token_re = '{('. implode('|', $token_relist) .')}';
- $this->em_strong_prepared_relist["$em$strong"] = $token_re;
- }
- }
- }
-
- function doItalicsAndBold($text) {
- $token_stack = array('');
- $text_stack = array('');
- $em = '';
- $strong = '';
- $tree_char_em = false;
-
- while (1) {
- #
- # Get prepared regular expression for seraching emphasis tokens
- # in current context.
- #
- $token_re = $this->em_strong_prepared_relist["$em$strong"];
-
- #
- # Each loop iteration search for the next emphasis token.
- # Each token is then passed to handleSpanToken.
- #
- $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
- $text_stack[0] .= $parts[0];
- $token =& $parts[1];
- $text =& $parts[2];
-
- if (empty($token)) {
- # Reached end of text span: empty stack without emitting.
- # any more emphasis.
- while ($token_stack[0]) {
- $text_stack[1] .= array_shift($token_stack);
- $text_stack[0] .= array_shift($text_stack);
- }
- break;
- }
-
- $token_len = strlen($token);
- if ($tree_char_em) {
- # Reached closing marker while inside a three-char emphasis.
- if ($token_len == 3) {
- # Three-char closing marker, close em and strong.
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<strong><em>$span</em></strong>";
- $text_stack[0] .= $this->hashPart($span);
- $em = '';
- $strong = '';
- } else {
- # Other closing marker: close one em or strong and
- # change current token state to match the other
- $token_stack[0] = str_repeat($token{0}, 3-$token_len);
- $tag = $token_len == 2 ? "strong" : "em";
- $span = $text_stack[0];
- $span = $this->runSpanGamut($span);
- $span = "<$tag>$span</$tag>";
- $text_stack[0] = $this->hashPart($span);
- $$tag = ''; # $$tag stands for $em or $strong
- }
- $tree_char_em = false;
- } else if ($token_len == 3) {
- if ($em) {
- # Reached closing marker for both em and strong.
- # Closing strong marker:
- for ($i = 0; $i < 2; ++$i) {
- $shifted_token = array_shift($token_stack);
- $tag = strlen($shifted_token) == 2 ? "strong" : "em";
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<$tag>$span</$tag>";
- $text_stack[0] .= $this->hashPart($span);
- $$tag = ''; # $$tag stands for $em or $strong
- }
- } else {
- # Reached opening three-char emphasis marker. Push on token
- # stack; will be handled by the special condition above.
- $em = $token{0};
- $strong = "$em$em";
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $tree_char_em = true;
- }
- } else if ($token_len == 2) {
- if ($strong) {
- # Unwind any dangling emphasis marker:
- if (strlen($token_stack[0]) == 1) {
- $text_stack[1] .= array_shift($token_stack);
- $text_stack[0] .= array_shift($text_stack);
- }
- # Closing strong marker:
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<strong>$span</strong>";
- $text_stack[0] .= $this->hashPart($span);
- $strong = '';
- } else {
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $strong = $token;
- }
- } else {
- # Here $token_len == 1
- if ($em) {
- if (strlen($token_stack[0]) == 1) {
- # Closing emphasis marker:
- array_shift($token_stack);
- $span = array_shift($text_stack);
- $span = $this->runSpanGamut($span);
- $span = "<em>$span</em>";
- $text_stack[0] .= $this->hashPart($span);
- $em = '';
- } else {
- $text_stack[0] .= $token;
- }
- } else {
- array_unshift($token_stack, $token);
- array_unshift($text_stack, '');
- $em = $token;
- }
- }
- }
- return $text_stack[0];
- }
-
-
- function doBlockQuotes($text) {
- $text = preg_replace_callback('/
- ( # Wrap whole match in $1
- (?>
- ^[ ]*>[ ]? # ">" at the start of a line
- .+\n # rest of the first line
- (.+\n)* # subsequent consecutive lines
- \n* # blanks
- )+
- )
- /xm',
- array(&$this, '_doBlockQuotes_callback'), $text);
-
- return $text;
- }
- function _doBlockQuotes_callback($matches) {
- $bq = $matches[1];
- # trim one level of quoting - trim whitespace-only lines
- $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
- $bq = $this->runBlockGamut($bq); # recurse
-
- $bq = preg_replace('/^/m', " ", $bq);
- # These leading spaces cause problem with <pre> content,
- # so we need to fix that:
- $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
- array(&$this, '_doBlockQuotes_callback2'), $bq);
-
- return "\n". $this->hashBlock("<blockquote>\n$bq\n</blockquote>")."\n\n";
- }
- function _doBlockQuotes_callback2($matches) {
- $pre = $matches[1];
- $pre = preg_replace('/^ /m', '', $pre);
- return $pre;
- }
-
-
- function formParagraphs($text) {
- #
- # Params:
- # $text - string to process with html <p> tags
- #
- # Strip leading and trailing lines:
- $text = preg_replace('/\A\n+|\n+\z/', '', $text);
-
- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
-
- #
- # Wrap <p> tags and unhashify HTML blocks
- #
- foreach ($grafs as $key => $value) {
- if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
- # Is a paragraph.
- $value = $this->runSpanGamut($value);
- $value = preg_replace('/^([ ]*)/', "<p>", $value);
- $value .= "</p>";
- $grafs[$key] = $this->unhash($value);
- }
- else {
- # Is a block.
- # Modify elements of @grafs in-place...
- $graf = $value;
- $block = $this->html_hashes[$graf];
- $graf = $block;
-// if (preg_match('{
-// \A
-// ( # $1 = <div> tag
-// <div \s+
-// [^>]*
-// \b
-// markdown\s*=\s* ([\'"]) # $2 = attr quote char
-// 1
-// \2
-// [^>]*
-// >
-// )
-// ( # $3 = contents
-// .*
-// )
-// (</div>) # $4 = closing tag
-// \z
-// }xs', $block, $matches))
-// {
-// list(, $div_open, , $div_content, $div_close) = $matches;
-//
-// # We can't call Markdown(), because that resets the hash;
-// # that initialization code should be pulled into its own sub, though.
-// $div_content = $this->hashHTMLBlocks($div_content);
-//
-// # Run document gamut methods on the content.
-// foreach ($this->document_gamut as $method => $priority) {
-// $div_content = $this->$method($div_content);
-// }
-//
-// $div_open = preg_replace(
-// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
-//
-// $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
-// }
- $grafs[$key] = $graf;
- }
- }
-
- return implode("\n\n", $grafs);
- }
-
-
- function encodeAttribute($text) {
- #
- # Encode text for a double-quoted HTML attribute. This function
- # is *not* suitable for attributes enclosed in single quotes.
- #
- $text = $this->encodeAmpsAndAngles($text);
- $text = str_replace('"', '&quot;', $text);
- return $text;
- }
-
-
- function encodeAmpsAndAngles($text) {
- #
- # Smart processing for ampersands and angle brackets that need to
- # be encoded. Valid character entities are left alone unless the
- # no-entities mode is set.
- #
- if ($this->no_entities) {
- $text = str_replace('&', '&amp;', $text);
- } else {
- # Ampersand-encoding based entirely on Nat Irons's Amputator
- # MT plugin: <http://bumppo.net/projects/amputator/>
- $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
- '&amp;', $text);;
- }
- # Encode remaining <'s
- $text = str_replace('<', '&lt;', $text);
-
- return $text;
- }
-
-
- function doAutoLinks($text) {
- $text = preg_replace_callback('{<((https?|ftp|dict):[^\'">\s]+)>}i',
- array(&$this, '_doAutoLinks_url_callback'), $text);
-
- # Email addresses: <address@domain.foo>
- $text = preg_replace_callback('{
- <
- (?:mailto:)?
- (
- (?:
- [-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
- |
- ".*?"
- )
- \@
- (?:
- [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
- |
- \[[\d.a-fA-F:]+\] # IPv4 & IPv6
- )
- )
- >
- }xi',
- array(&$this, '_doAutoLinks_email_callback'), $text);
-
- return $text;
- }
- function _doAutoLinks_url_callback($matches) {
- $url = $this->encodeAttribute($matches[1]);
- $link = "<a href=\"$url\">$url</a>";
- return $this->hashPart($link);
- }
- function _doAutoLinks_email_callback($matches) {
- $address = $matches[1];
- $link = $this->encodeEmailAddress($address);
- return $this->hashPart($link);
- }
-
-
- function encodeEmailAddress($addr) {
- #
- # Input: an email address, e.g. "foo@example.com"
- #
- # Output: the email address as a mailto link, with each character
- # of the address encoded as either a decimal or hex entity, in
- # the hopes of foiling most address harvesting spam bots. E.g.:
- #
- # <p><a href="&#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
- # &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
- # &#x6d;">&#x66;o&#111;&#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;
- # &#101;&#46;&#x63;&#111;&#x6d;</a></p>
- #
- # Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
- # With some optimizations by Milian Wolff.
- #
- $addr = "mailto:" . $addr;
- $chars = preg_split('/(?<!^)(?!$)/', $addr);
- $seed = (int)abs(crc32($addr) / strlen($addr)); # Deterministic seed.
-
- foreach ($chars as $key => $char) {
- $ord = ord($char);
- # Ignore non-ascii chars.
- if ($ord < 128) {
- $r = ($seed * (1 + $key)) % 100; # Pseudo-random function.
- # roughly 10% raw, 45% hex, 45% dec
- # '@' *must* be encoded. I insist.
- if ($r > 90 && $char != '@') /* do nothing */;
- else if ($r < 45) $chars[$key] = '&#x'.dechex($ord).';';
- else $chars[$key] = '&#'.$ord.';';
- }
- }
-
- $addr = implode('', $chars);
- $text = implode('', array_slice($chars, 7)); # text without `mailto:`
- $addr = "<a href=\"$addr\">$text</a>";
-
- return $addr;
- }
-
-
- function parseSpan($str) {
- #
- # Take the string $str and parse it into tokens, hashing embeded HTML,
- # escaped characters and handling code spans.
- #
- $output = '';
-
- $span_re = '{
- (
- \\\\'.$this->escape_chars_re.'
- |
- (?<![`\\\\])
- `+ # code span marker
- '.( $this->no_markup ? '' : '
- |
- <!-- .*? --> # comment
- |
- <\?.*?\?> | <%.*?%> # processing instruction
- |
- <[/!$]?[-a-zA-Z0-9:_]+ # regular tags
- (?>
- \s
- (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
- )?
- >
- ').'
- )
- }xs';
-
- while (1) {
- #
- # Each loop iteration seach for either the next tag, the next
- # openning code span marker, or the next escaped character.
- # Each token is then passed to handleSpanToken.
- #
- $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
-
- # Create token from text preceding tag.
- if ($parts[0] != "") {
- $output .= $parts[0];
- }
-
- # Check if we reach the end.
- if (isset($parts[1])) {
- $output .= $this->handleSpanToken($parts[1], $parts[2]);
- $str = $parts[2];
- }
- else {
- break;
- }
- }
-
- return $output;
- }
-
-
- function handleSpanToken($token, &$str) {
- #
- # Handle $token provided by parseSpan by determining its nature and
- # returning the corresponding value that should replace it.
- #
- switch ($token{0}) {
- case "\\":
- return $this->hashPart("&#". ord($token{1}). ";");
- case "`":
- # Search for end marker in remaining text.
- if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
- $str, $matches))
- {
- $str = $matches[2];
- $codespan = $this->makeCodeSpan($matches[1]);
- return $this->hashPart($codespan);
- }
- return $token; // return as text since no ending marker found.
- default:
- return $this->hashPart($token);
- }
- }
-
-
- function outdent($text) {
- #
- # Remove one level of line-leading tabs or spaces
- #
- return preg_replace('/^(\t|[ ]{1,'.$this->tab_width.'})/m', '', $text);
- }
-
-
- # String length function for detab. `_initDetab` will create a function to
- # hanlde UTF-8 if the default function does not exist.
- var $utf8_strlen = 'mb_strlen';
-
- function detab($text) {
- #
- # Replace tabs with the appropriate amount of space.
- #
- # For each line we separate the line in blocks delemited by
- # tab characters. Then we reconstruct every line by adding the
- # appropriate number of space between each blocks.
-
- $text = preg_replace_callback('/^.*\t.*$/m',
- array(&$this, '_detab_callback'), $text);
-
- return $text;
- }
- function _detab_callback($matches) {
- $line = $matches[0];
- $strlen = $this->utf8_strlen; # strlen function for UTF-8.
-
- # Split in blocks.
- $blocks = explode("\t", $line);
- # Add each blocks to the line.
- $line = $blocks[0];
- unset($blocks[0]); # Do not add first block twice.
- foreach ($blocks as $block) {
- # Calculate amount of space, insert spaces, insert block.
- $amount = $this->tab_width -
- $strlen($line, 'UTF-8') % $this->tab_width;
- $line .= str_repeat(" ", $amount) . $block;
- }
- return $line;
- }
- function _initDetab() {
- #
- # Check for the availability of the function in the `utf8_strlen` property
- # (initially `mb_strlen`). If the function is not available, create a
- # function that will loosely count the number of UTF-8 characters with a
- # regular expression.
- #
- if (function_exists($this->utf8_strlen)) return;
- $this->utf8_strlen = create_function('$text', 'return preg_match_all(
- "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
- $text, $m);');
- }
-
-
- function unhash($text) {
- #
- # Swap back in all the tags hashed by _HashHTMLBlocks.
- #
- return preg_replace_callback('/(.)\x1A[0-9]+\1/',
- array(&$this, '_unhash_callback'), $text);
- }
- function _unhash_callback($matches) {
- return $this->html_hashes[$matches[0]];
- }
-
-}
-
-
-#
-# Markdown Extra Parser Class
-#
-
-class MarkdownExtra_Parser extends Markdown_Parser {
-
- # Prefix for footnote ids.
- var $fn_id_prefix = "";
-
- # Optional title attribute for footnote links and backlinks.
- var $fn_link_title = MARKDOWN_FN_LINK_TITLE;
- var $fn_backlink_title = MARKDOWN_FN_BACKLINK_TITLE;
-
- # Optional class attribute for footnote links and backlinks.
- var $fn_link_class = MARKDOWN_FN_LINK_CLASS;
- var $fn_backlink_class = MARKDOWN_FN_BACKLINK_CLASS;
-
- # Predefined abbreviations.
- var $predef_abbr = array();
-
-
- function MarkdownExtra_Parser() {
- #
- # Constructor function. Initialize the parser object.
- #
- # Add extra escapable characters before parent constructor
- # initialize the table.
- $this->escape_chars .= ':|';
-
- # Insert extra document, block, and span transformations.
- # Parent constructor will do the sorting.
- $this->document_gamut += array(
- "doFencedCodeBlocks" => 5,
- "stripFootnotes" => 15,
- "stripAbbreviations" => 25,
- "appendFootnotes" => 50,
- );
- $this->block_gamut += array(
- "doFencedCodeBlocks" => 5,
- "doTables" => 15,
- "doDefLists" => 45,
- );
- $this->span_gamut += array(
- "doFootnotes" => 5,
- "doAbbreviations" => 70,
- );
-
- parent::Markdown_Parser();
- }
-
-
- # Extra variables used during extra transformations.
- var $footnotes = array();
- var $footnotes_ordered = array();
- var $abbr_desciptions = array();
- var $abbr_word_re = '';
-
- # Give the current footnote number.
- var $footnote_counter = 1;
-
-
- function setup() {
- #
- # Setting up Extra-specific variables.
- #
- parent::setup();
-
- $this->footnotes = array();
- $this->footnotes_ordered = array();
- $this->abbr_desciptions = array();
- $this->abbr_word_re = '';
- $this->footnote_counter = 1;
-
- foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
- if ($this->abbr_word_re)
- $this->abbr_word_re .= '|';
- $this->abbr_word_re .= preg_quote($abbr_word);
- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
- }
- }
-
- function teardown() {
- #
- # Clearing Extra-specific variables.
- #
- $this->footnotes = array();
- $this->footnotes_ordered = array();
- $this->abbr_desciptions = array();
- $this->abbr_word_re = '';
-
- parent::teardown();
- }
-
-
- ### HTML Block Parser ###
-
- # Tags that are always treated as block tags:
- var $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend';
-
- # Tags treated as block tags only if the opening tag is alone on it's line:
- var $context_block_tags_re = 'script|noscript|math|ins|del';
-
- # Tags where markdown="1" default to span mode:
- var $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
-
- # Tags which must not have their contents modified, no matter where
- # they appear:
- var $clean_tags_re = 'script|math';
-
- # Tags that do not need to be closed.
- var $auto_close_tags_re = 'hr|img';
-
-
- function hashHTMLBlocks($text) {
- #
- # Hashify HTML Blocks and "clean tags".
- #
- # We only want to do this for block-level HTML tags, such as headers,
- # lists, and tables. That's because we still want to wrap <p>s around
- # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- # phrase emphasis, and spans. The list of tags we're looking for is
- # hard-coded.
- #
- # This works by calling _HashHTMLBlocks_InMarkdown, which then calls
- # _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
- # attribute is found whitin a tag, _HashHTMLBlocks_InHTML calls back
- # _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
- # These two functions are calling each other. It's recursive!
- #
- #
- # Call the HTML-in-Markdown hasher.
- #
- list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
-
- return $text;
- }
- function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
- $enclosing_tag_re = '', $span = false)
- {
- #
- # Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
- #
- # * $indent is the number of space to be ignored when checking for code
- # blocks. This is important because if we don't take the indent into
- # account, something like this (which looks right) won't work as expected:
- #
- # <div>
- # <div markdown="1">
- # Hello World. <-- Is this a Markdown code block or text?
- # </div> <-- Is this a Markdown code block or a real tag?
- # <div>
- #
- # If you don't like this, just don't indent the tag on which
- # you apply the markdown="1" attribute.
- #
- # * If $enclosing_tag_re is not empty, stops at the first unmatched closing
- # tag with that name. Nested tags supported.
- #
- # * If $span is true, text inside must treated as span. So any double
- # newline will be replaced by a single newline so that it does not create
- # paragraphs.
- #
- # Returns an array of that form: ( processed text , remaining text )
- #
- if ($text === '') return array('', '');
-
- # Regex to check for the presense of newlines around a block tag.
- $newline_before_re = '/(?:^\n?|\n\n)*$/';
- $newline_after_re =
- '{
- ^ # Start of text following the tag.
- (?>[ ]*<!--.*?-->)? # Optional comment.
- [ ]*\n # Must be followed by newline.
- }xs';
-
- # Regex to match any tag.
- $block_tag_re =
- '{
- ( # $2: Capture hole tag.
- </? # Any opening or closing tag.
- (?> # Tag name.
- '.$this->block_tags_re.' |
- '.$this->context_block_tags_re.' |
- '.$this->clean_tags_re.' |
- (?!\s)'.$enclosing_tag_re.'
- )
- (?:
- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
- (?>
- ".*?" | # Double quotes (can contain `>`)
- \'.*?\' | # Single quotes (can contain `>`)
- .+? # Anything but quotes and `>`.
- )*?
- )?
- > # End of tag.
- |
- <!-- .*? --> # HTML Comment
- |
- <\?.*?\?> | <%.*?%> # Processing instruction
- |
- <!\[CDATA\[.*?\]\]> # CData Block
- |
- # Code span marker
- `+
- '. ( !$span ? ' # If not in span.
- |
- # Indented code block
- (?: ^[ ]*\n | ^ | \n[ ]*\n )
- [ ]{'.($indent+4).'}[^\n]* \n
- (?>
- (?: [ ]{'.($indent+4).'}[^\n]* | [ ]* ) \n
- )*
- |
- # Fenced code block marker
- (?> ^ | \n )
- [ ]{0,'.($indent).'}~~~+[ ]*\n
- ' : '' ). ' # End (if not is span).
- )
- }xs';
-
-
- $depth = 0; # Current depth inside the tag tree.
- $parsed = ""; # Parsed text that will be returned.
-
- #
- # Loop through every tag until we find the closing tag of the parent
- # or loop until reaching the end of text if no parent tag specified.
- #
- do {
- #
- # Split the text using the first $tag_match pattern found.
- # Text before pattern will be first in the array, text after
- # pattern will be at the end, and between will be any catches made
- # by the pattern.
- #
- $parts = preg_split($block_tag_re, $text, 2,
- PREG_SPLIT_DELIM_CAPTURE);
-
- # If in Markdown span mode, add a empty-string span-level hash
- # after each newline to prevent triggering any block element.
- if ($span) {
- $void = $this->hashPart("", ':');
- $newline = "$void\n";
- $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
- }
-
- $parsed .= $parts[0]; # Text before current tag.
-
- # If end of $text has been reached. Stop loop.
- if (count($parts) < 3) {
- $text = "";
- break;
- }
-
- $tag = $parts[1]; # Tag to handle.
- $text = $parts[2]; # Remaining text after current tag.
- $tag_re = preg_quote($tag); # For use in a regular expression.
-
- #
- # Check for: Code span marker
- #
- if ($tag{0} == "`") {
- # Find corresponding end marker.
- $tag_re = preg_quote($tag);
- if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)'.$tag_re.'(?!`)}',
- $text, $matches))
- {
- # End marker found: pass text unchanged until marker.
- $parsed .= $tag . $matches[0];
- $text = substr($text, strlen($matches[0]));
- }
- else {
- # Unmatched marker: just skip it.
- $parsed .= $tag;
- }
- }
- #
- # Check for: Fenced code block marker.
- #
- else if (preg_match('{^\n?[ ]{0,'.($indent+3).'}~}', $tag)) {
- # Fenced code block marker: find matching end marker.
- $tag_re = preg_quote(trim($tag));
- if (preg_match('{^(?>.*\n)+?[ ]{0,'.($indent).'}'.$tag_re.'[ ]*\n}', $text,
- $matches))
- {
- # End marker found: pass text unchanged until marker.
- $parsed .= $tag . $matches[0];
- $text = substr($text, strlen($matches[0]));
- }
- else {
- # No end marker: just skip it.
- $parsed .= $tag;
- }
- }
- #
- # Check for: Indented code block.
- #
- else if ($tag{0} == "\n" || $tag{0} == " ") {
- # Indented code block: pass it unchanged, will be handled
- # later.
- $parsed .= $tag;
- }
- #
- # Check for: Opening Block level tag or
- # Opening Context Block tag (like ins and del)
- # used as a block tag (tag is alone on it's line).
- #
- else if (preg_match('{^<(?:'.$this->block_tags_re.')\b}', $tag) ||
- ( preg_match('{^<(?:'.$this->context_block_tags_re.')\b}', $tag) &&
- preg_match($newline_before_re, $parsed) &&
- preg_match($newline_after_re, $text) )
- )
- {
- # Need to parse tag and following text using the HTML parser.
- list($block_text, $text) =
- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
-
- # Make sure it stays outside of any paragraph by adding newlines.
- $parsed .= "\n\n$block_text\n\n";
- }
- #
- # Check for: Clean tag (like script, math)
- # HTML Comments, processing instructions.
- #
- else if (preg_match('{^<(?:'.$this->clean_tags_re.')\b}', $tag) ||
- $tag{1} == '!' || $tag{1} == '?')
- {
- # Need to parse tag and following text using the HTML parser.
- # (don't check for markdown attribute)
- list($block_text, $text) =
- $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
-
- $parsed .= $block_text;
- }
- #
- # Check for: Tag with same name as enclosing tag.
- #
- else if ($enclosing_tag_re !== '' &&
- # Same name as enclosing tag.
- preg_match('{^</?(?:'.$enclosing_tag_re.')\b}', $tag))
- {
- #
- # Increase/decrease nested tag count.
- #
- if ($tag{1} == '/') $depth--;
- else if ($tag{strlen($tag)-2} != '/') $depth++;
-
- if ($depth < 0) {
- #
- # Going out of parent element. Clean up and break so we
- # return to the calling function.
- #
- $text = $tag . $text;
- break;
- }
-
- $parsed .= $tag;
- }
- else {
- $parsed .= $tag;
- }
- } while ($depth >= 0);
-
- return array($parsed, $text);
- }
- function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
- #
- # Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
- #
- # * Calls $hash_method to convert any blocks.
- # * Stops when the first opening tag closes.
- # * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
- # (it is not inside clean tags)
- #
- # Returns an array of that form: ( processed text , remaining text )
- #
- if ($text === '') return array('', '');
-
- # Regex to match `markdown` attribute inside of a tag.
- $markdown_attr_re = '
- {
- \s* # Eat whitespace before the `markdown` attribute
- markdown
- \s*=\s*
- (?>
- (["\']) # $1: quote delimiter
- (.*?) # $2: attribute value
- \1 # matching delimiter
- |
- ([^\s>]*) # $3: unquoted attribute value
- )
- () # $4: make $3 always defined (avoid warnings)
- }xs';
-
- # Regex to match any tag.
- $tag_re = '{
- ( # $2: Capture hole tag.
- </? # Any opening or closing tag.
- [\w:$]+ # Tag name.
- (?:
- (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
- (?>
- ".*?" | # Double quotes (can contain `>`)
- \'.*?\' | # Single quotes (can contain `>`)
- .+? # Anything but quotes and `>`.
- )*?
- )?
- > # End of tag.
- |
- <!-- .*? --> # HTML Comment
- |
- <\?.*?\?> | <%.*?%> # Processing instruction
- |
- <!\[CDATA\[.*?\]\]> # CData Block
- )
- }xs';
-
- $original_text = $text; # Save original text in case of faliure.
-
- $depth = 0; # Current depth inside the tag tree.
- $block_text = ""; # Temporary text holder for current text.
- $parsed = ""; # Parsed text that will be returned.
-
- #
- # Get the name of the starting tag.
- # (This pattern makes $base_tag_name_re safe without quoting.)
- #
- if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
- $base_tag_name_re = $matches[1];
-
- #
- # Loop through every tag until we find the corresponding closing tag.
- #
- do {
- #
- # Split the text using the first $tag_match pattern found.
- # Text before pattern will be first in the array, text after
- # pattern will be at the end, and between will be any catches made
- # by the pattern.
- #
- $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
-
- if (count($parts) < 3) {
- #
- # End of $text reached with unbalenced tag(s).
- # In that case, we return original text unchanged and pass the
- # first character as filtered to prevent an infinite loop in the
- # parent function.
- #
- return array($original_text{0}, substr($original_text, 1));
- }
-
- $block_text .= $parts[0]; # Text before current tag.
- $tag = $parts[1]; # Tag to handle.
- $text = $parts[2]; # Remaining text after current tag.
-
- #
- # Check for: Auto-close tag (like <hr/>)
- # Comments and Processing Instructions.
- #
- if (preg_match('{^</?(?:'.$this->auto_close_tags_re.')\b}', $tag) ||
- $tag{1} == '!' || $tag{1} == '?')
- {
- # Just add the tag to the block as if it was text.
- $block_text .= $tag;
- }
- else {
- #
- # Increase/decrease nested tag count. Only do so if
- # the tag's name match base tag's.
- #
- if (preg_match('{^</?'.$base_tag_name_re.'\b}', $tag)) {
- if ($tag{1} == '/') $depth--;
- else if ($tag{strlen($tag)-2} != '/') $depth++;
- }
-
- #
- # Check for `markdown="1"` attribute and handle it.
- #
- if ($md_attr &&
- preg_match($markdown_attr_re, $tag, $attr_m) &&
- preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
- {
- # Remove `markdown` attribute from opening tag.
- $tag = preg_replace($markdown_attr_re, '', $tag);
-
- # Check if text inside this tag must be parsed in span mode.
- $this->mode = $attr_m[2] . $attr_m[3];
- $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
- preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);
-
- # Calculate indent before tag.
- if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
- $strlen = $this->utf8_strlen;
- $indent = $strlen($matches[1], 'UTF-8');
- } else {
- $indent = 0;
- }
-
- # End preceding block with this tag.
- $block_text .= $tag;
- $parsed .= $this->$hash_method($block_text);
-
- # Get enclosing tag name for the ParseMarkdown function.
- # (This pattern makes $tag_name_re safe without quoting.)
- preg_match('/^<([\w:$]*)\b/', $tag, $matches);
- $tag_name_re = $matches[1];
-
- # Parse the content using the HTML-in-Markdown parser.
- list ($block_text, $text)
- = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
- $tag_name_re, $span_mode);
-
- # Outdent markdown text.
- if ($indent > 0) {
- $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
- $block_text);
- }
-
- # Append tag content to parsed text.
- if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
- else $parsed .= "$block_text";
-
- # Start over a new block.
- $block_text = "";
- }
- else $block_text .= $tag;
- }
-
- } while ($depth > 0);
-
- #
- # Hash last block text that wasn't processed inside the loop.
- #
- $parsed .= $this->$hash_method($block_text);
-
- return array($parsed, $text);
- }
-
-
- function hashClean($text) {
- #
- # Called whenever a tag must be hashed when a function insert a "clean" tag
- # in $text, it pass through this function and is automaticaly escaped,
- # blocking invalid nested overlap.
- #
- return $this->hashPart($text, 'C');
- }
-
-
- function doHeaders($text) {
- #
- # Redefined to add id attribute support.
- #
- # Setext-style headers:
- # Header 1 {#header1}
- # ========
- #
- # Header 2 {#header2}
- # --------
- #
- $text = preg_replace_callback(
- '{
- (^.+?) # $1: Header text
- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # $2: Id attribute
- [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
- }mx',
- array(&$this, '_doHeaders_callback_setext'), $text);
-
- # atx-style headers:
- # # Header 1 {#header1}
- # ## Header 2 {#header2}
- # ## Header 2 with closing hashes ## {#header3}
- # ...
- # ###### Header 6 {#header2}
- #
- $text = preg_replace_callback('{
- ^(\#{1,6}) # $1 = string of #\'s
- [ ]*
- (.+?) # $2 = Header text
- [ ]*
- \#* # optional closing #\'s (not counted)
- (?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})? # id attribute
- [ ]*
- \n+
- }xm',
- array(&$this, '_doHeaders_callback_atx'), $text);
-
- return $text;
- }
- function _doHeaders_attr($attr) {
- if (empty($attr)) return "";
- return " id=\"$attr\"";
- }
- function _doHeaders_callback_setext($matches) {
- if ($matches[3] == '-' && preg_match('{^- }', $matches[1]))
- return $matches[0];
- $level = $matches[3]{0} == '=' ? 1 : 2;
- $attr = $this->_doHeaders_attr($id =& $matches[2]);
- $block = "<h$level$attr>".$this->runSpanGamut($matches[1])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
- function _doHeaders_callback_atx($matches) {
- $level = strlen($matches[1]);
- $attr = $this->_doHeaders_attr($id =& $matches[3]);
- $block = "<h$level$attr>".$this->runSpanGamut($matches[2])."</h$level>";
- return "\n" . $this->hashBlock($block) . "\n\n";
- }
-
-
- function doTables($text) {
- #
- # Form HTML tables.
- #
- $less_than_tab = $this->tab_width - 1;
- #
- # Find tables with leading pipe.
- #
- # | Header 1 | Header 2
- # | -------- | --------
- # | Cell 1 | Cell 2
- # | Cell 3 | Cell 4
- #
- $text = preg_replace_callback('
- {
- ^ # Start of a line
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- [|] # Optional leading pipe (present)
- (.+) \n # $1: Header row (at least one pipe)
-
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
-
- ( # $3: Cells
- (?>
- [ ]* # Allowed whitespace.
- [|] .* \n # Row content.
- )*
- )
- (?=\n|\Z) # Stop at final double newline.
- }xm',
- array(&$this, '_doTable_leadingPipe_callback'), $text);
-
- #
- # Find tables without leading pipe.
- #
- # Header 1 | Header 2
- # -------- | --------
- # Cell 1 | Cell 2
- # Cell 3 | Cell 4
- #
- $text = preg_replace_callback('
- {
- ^ # Start of a line
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- (\S.*[|].*) \n # $1: Header row (at least one pipe)
-
- [ ]{0,'.$less_than_tab.'} # Allowed whitespace.
- ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
-
- ( # $3: Cells
- (?>
- .* [|] .* \n # Row content
- )*
- )
- (?=\n|\Z) # Stop at final double newline.
- }xm',
- array(&$this, '_DoTable_callback'), $text);
-
- return $text;
- }
- function _doTable_leadingPipe_callback($matches) {
- $head = $matches[1];
- $underline = $matches[2];
- $content = $matches[3];
-
- # Remove leading pipe for each row.
- $content = preg_replace('/^ *[|]/m', '', $content);
-
- return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
- }
- function _doTable_callback($matches) {
- $head = $matches[1];
- $underline = $matches[2];
- $content = $matches[3];
-
- # Remove any tailing pipes for each line.
- $head = preg_replace('/[|] *$/m', '', $head);
- $underline = preg_replace('/[|] *$/m', '', $underline);
- $content = preg_replace('/[|] *$/m', '', $content);
-
- # Reading alignement from header underline.
- $separators = preg_split('/ *[|] */', $underline);
- foreach ($separators as $n => $s) {
- if (preg_match('/^ *-+: *$/', $s)) $attr[$n] = ' align="right"';
- else if (preg_match('/^ *:-+: *$/', $s))$attr[$n] = ' align="center"';
- else if (preg_match('/^ *:-+ *$/', $s)) $attr[$n] = ' align="left"';
- else $attr[$n] = '';
- }
-
- # Parsing span elements, including code spans, character escapes,
- # and inline HTML tags, so that pipes inside those gets ignored.
- $head = $this->parseSpan($head);
- $headers = preg_split('/ *[|] */', $head);
- $col_count = count($headers);
-
- # Write column headers.
- $text = "<table>\n";
- $text .= "<thead>\n";
- $text .= "<tr>\n";
- foreach ($headers as $n => $header)
- $text .= " <th$attr[$n]>".$this->runSpanGamut(trim($header))."</th>\n";
- $text .= "</tr>\n";
- $text .= "</thead>\n";
-
- # Split content by row.
- $rows = explode("\n", trim($content, "\n"));
-
- $text .= "<tbody>\n";
- foreach ($rows as $row) {
- # Parsing span elements, including code spans, character escapes,
- # and inline HTML tags, so that pipes inside those gets ignored.
- $row = $this->parseSpan($row);
-
- # Split row by cell.
- $row_cells = preg_split('/ *[|] */', $row, $col_count);
- $row_cells = array_pad($row_cells, $col_count, '');
-
- $text .= "<tr>\n";
- foreach ($row_cells as $n => $cell)
- $text .= " <td$attr[$n]>".$this->runSpanGamut(trim($cell))."</td>\n";
- $text .= "</tr>\n";
- }
- $text .= "</tbody>\n";
- $text .= "</table>";
-
- return $this->hashBlock($text) . "\n";
- }
-
-
- function doDefLists($text) {
- #
- # Form HTML definition lists.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Re-usable pattern to match any entire dl list:
- $whole_list_re = '(?>
- ( # $1 = whole list
- ( # $2
- [ ]{0,'.$less_than_tab.'}
- ((?>.*\S.*\n)+) # $3 = defined term
- \n?
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- (?s:.+?)
- ( # $4
- \z
- |
- \n{2,}
- (?=\S)
- (?! # Negative lookahead for another term
- [ ]{0,'.$less_than_tab.'}
- (?: \S.*\n )+? # defined term
- \n?
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- (?! # Negative lookahead for another definition
- [ ]{0,'.$less_than_tab.'}:[ ]+ # colon starting definition
- )
- )
- )
- )'; // mx
-
- $text = preg_replace_callback('{
- (?>\A\n?|(?<=\n\n))
- '.$whole_list_re.'
- }mx',
- array(&$this, '_doDefLists_callback'), $text);
-
- return $text;
- }
- function _doDefLists_callback($matches) {
- # Re-usable patterns to match list item bullets and number markers:
- $list = $matches[1];
-
- # Turn double returns into triple returns, so that we can make a
- # paragraph for the last item in a list, if necessary:
- $result = trim($this->processDefListItems($list));
- $result = "<dl>\n" . $result . "\n</dl>";
- return $this->hashBlock($result) . "\n\n";
- }
-
-
- function processDefListItems($list_str) {
- #
- # Process the contents of a single definition list, splitting it
- # into individual term and definition list items.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # trim trailing blank lines:
- $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
-
- # Process definition terms.
- $list_str = preg_replace_callback('{
- (?>\A\n?|\n\n+) # leading line
- ( # definition terms = $1
- [ ]{0,'.$less_than_tab.'} # leading whitespace
- (?![:][ ]|[ ]) # negative lookahead for a definition
- # mark (colon) or more whitespace.
- (?> \S.* \n)+? # actual term (not whitespace).
- )
- (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
- # with a definition mark.
- }xm',
- array(&$this, '_processDefListItems_callback_dt'), $list_str);
-
- # Process actual definitions.
- $list_str = preg_replace_callback('{
- \n(\n+)? # leading line = $1
- ( # marker space = $2
- [ ]{0,'.$less_than_tab.'} # whitespace before colon
- [:][ ]+ # definition mark (colon)
- )
- ((?s:.+?)) # definition text = $3
- (?= \n+ # stop at next definition mark,
- (?: # next term or end of text
- [ ]{0,'.$less_than_tab.'} [:][ ] |
- <dt> | \z
- )
- )
- }xm',
- array(&$this, '_processDefListItems_callback_dd'), $list_str);
-
- return $list_str;
- }
- function _processDefListItems_callback_dt($matches) {
- $terms = explode("\n", trim($matches[1]));
- $text = '';
- foreach ($terms as $term) {
- $term = $this->runSpanGamut(trim($term));
- $text .= "\n<dt>" . $term . "</dt>";
- }
- return $text . "\n";
- }
- function _processDefListItems_callback_dd($matches) {
- $leading_line = $matches[1];
- $marker_space = $matches[2];
- $def = $matches[3];
-
- if ($leading_line || preg_match('/\n{2,}/', $def)) {
- # Replace marker with the appropriate whitespace indentation
- $def = str_repeat(' ', strlen($marker_space)) . $def;
- $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
- $def = "\n". $def ."\n";
- }
- else {
- $def = rtrim($def);
- $def = $this->runSpanGamut($this->outdent($def));
- }
-
- return "\n<dd>" . $def . "</dd>\n";
- }
-
-
- function doFencedCodeBlocks($text) {
- #
- # Adding the fenced code block syntax to regular Markdown:
- #
- # ~~~
- # Code block
- # ~~~
- #
- $less_than_tab = $this->tab_width;
-
- $text = preg_replace_callback('{
- (?:\n|\A)
- # 1: Opening marker
- (
- ~{3,} # Marker: three tilde or more.
- )
- [ ]* \n # Whitespace and newline following marker.
-
- # 2: Content
- (
- (?>
- (?!\1 [ ]* \n) # Not a closing marker.
- .*\n+
- )+
- )
-
- # Closing marker.
- \1 [ ]* \n
- }xm',
- array(&$this, '_doFencedCodeBlocks_callback'), $text);
-
- return $text;
- }
- function _doFencedCodeBlocks_callback($matches) {
- $codeblock = $matches[2];
- $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
- $codeblock = preg_replace_callback('/^\n+/',
- array(&$this, '_doFencedCodeBlocks_newlines'), $codeblock);
- $codeblock = "<pre><code>$codeblock</code></pre>";
- return "\n\n".$this->hashBlock($codeblock)."\n\n";
- }
- function _doFencedCodeBlocks_newlines($matches) {
- return str_repeat("<br$this->empty_element_suffix",
- strlen($matches[0]));
- }
-
-
- #
- # Redefining emphasis markers so that emphasis by underscore does not
- # work in the middle of a word.
- #
- var $em_relist = array(
- '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?=\S|$)(?![\.,:;]\s)',
- '*' => '(?<=\S|^)(?<!\*)\*(?!\*)',
- '_' => '(?<=\S|^)(?<!_)_(?![a-zA-Z0-9_])',
- );
- var $strong_relist = array(
- '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?=\S|$)(?![\.,:;]\s)',
- '**' => '(?<=\S|^)(?<!\*)\*\*(?!\*)',
- '__' => '(?<=\S|^)(?<!_)__(?![a-zA-Z0-9_])',
- );
- var $em_strong_relist = array(
- '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?=\S|$)(?![\.,:;]\s)',
- '***' => '(?<=\S|^)(?<!\*)\*\*\*(?!\*)',
- '___' => '(?<=\S|^)(?<!_)___(?![a-zA-Z0-9_])',
- );
-
-
- function formParagraphs($text) {
- #
- # Params:
- # $text - string to process with html <p> tags
- #
- # Strip leading and trailing lines:
- $text = preg_replace('/\A\n+|\n+\z/', '', $text);
-
- $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
-
- #
- # Wrap <p> tags and unhashify HTML blocks
- #
- foreach ($grafs as $key => $value) {
- $value = trim($this->runSpanGamut($value));
-
- # Check if this should be enclosed in a paragraph.
- # Clean tag hashes & block tag hashes are left alone.
- $is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
-
- if ($is_p) {
- $value = "<p>$value</p>";
- }
- $grafs[$key] = $value;
- }
-
- # Join grafs in one text, then unhash HTML tags.
- $text = implode("\n\n", $grafs);
-
- # Finish by removing any tag hashes still present in $text.
- $text = $this->unhash($text);
-
- return $text;
- }
-
-
- ### Footnotes
-
- function stripFootnotes($text) {
- #
- # Strips link definitions from text, stores the URLs and titles in
- # hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: [^id]: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\[\^(.+?)\][ ]?: # note_id = $1
- [ ]*
- \n? # maybe *one* newline
- ( # text = $2 (no blank lines allowed)
- (?:
- .+ # actual text
- |
- \n # newlines but
- (?!\[\^.+?\]:\s)# negative lookahead for footnote marker.
- (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
- # by non-indented content
- )*
- )
- }xm',
- array(&$this, '_stripFootnotes_callback'),
- $text);
- return $text;
- }
- function _stripFootnotes_callback($matches) {
- $note_id = $this->fn_id_prefix . $matches[1];
- $this->footnotes[$note_id] = $this->outdent($matches[2]);
- return ''; # String that will replace the block
- }
-
-
- function doFootnotes($text) {
- #
- # Replace footnote references in $text [^id] with a special text-token
- # which will be replaced by the actual footnote marker in appendFootnotes.
- #
- if (!$this->in_anchor) {
- $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
- }
- return $text;
- }
-
-
- function appendFootnotes($text) {
- #
- # Append footnote list to text.
- #
- $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
- array(&$this, '_appendFootnotes_callback'), $text);
-
- if (!empty($this->footnotes_ordered)) {
- $text .= "\n\n";
- $text .= "<div class=\"footnotes\">\n";
- $text .= "<hr". $this->empty_element_suffix ."\n";
- $text .= "<ol>\n\n";
-
- $attr = " rev=\"footnote\"";
- if ($this->fn_backlink_class != "") {
- $class = $this->fn_backlink_class;
- $class = $this->encodeAttribute($class);
- $attr .= " class=\"$class\"";
- }
- if ($this->fn_backlink_title != "") {
- $title = $this->fn_backlink_title;
- $title = $this->encodeAttribute($title);
- $attr .= " title=\"$title\"";
- }
- $num = 0;
-
- while (!empty($this->footnotes_ordered)) {
- $footnote = reset($this->footnotes_ordered);
- $note_id = key($this->footnotes_ordered);
- unset($this->footnotes_ordered[$note_id]);
-
- $footnote .= "\n"; # Need to append newline before parsing.
- $footnote = $this->runBlockGamut("$footnote\n");
- $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
- array(&$this, '_appendFootnotes_callback'), $footnote);
-
- $attr = str_replace("%%", ++$num, $attr);
- $note_id = $this->encodeAttribute($note_id);
-
- # Add backlink to last paragraph; create new paragraph if needed.
- $backlink = "<a href=\"#fnref:$note_id\"$attr>&#8617;</a>";
- if (preg_match('{</p>$}', $footnote)) {
- $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>";
- } else {
- $footnote .= "\n\n<p>$backlink</p>";
- }
-
- $text .= "<li id=\"fn:$note_id\">\n";
- $text .= $footnote . "\n";
- $text .= "</li>\n\n";
- }
-
- $text .= "</ol>\n";
- $text .= "</div>";
- }
- return $text;
- }
- function _appendFootnotes_callback($matches) {
- $node_id = $this->fn_id_prefix . $matches[1];
-
- # Create footnote marker only if it has a corresponding footnote *and*
- # the footnote hasn't been used by another marker.
- if (isset($this->footnotes[$node_id])) {
- # Transfert footnote content to the ordered list.
- $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
- unset($this->footnotes[$node_id]);
-
- $num = $this->footnote_counter++;
- $attr = " rel=\"footnote\"";
- if ($this->fn_link_class != "") {
- $class = $this->fn_link_class;
- $class = $this->encodeAttribute($class);
- $attr .= " class=\"$class\"";
- }
- if ($this->fn_link_title != "") {
- $title = $this->fn_link_title;
- $title = $this->encodeAttribute($title);
- $attr .= " title=\"$title\"";
- }
-
- $attr = str_replace("%%", $num, $attr);
- $node_id = $this->encodeAttribute($node_id);
-
- return
- "<sup id=\"fnref:$node_id\">".
- "<a href=\"#fn:$node_id\"$attr>$num</a>".
- "</sup>";
- }
-
- return "[^".$matches[1]."]";
- }
-
-
- ### Abbreviations ###
-
- function stripAbbreviations($text) {
- #
- # Strips abbreviations from text, stores titles in hash references.
- #
- $less_than_tab = $this->tab_width - 1;
-
- # Link defs are in the form: [id]*: url "optional title"
- $text = preg_replace_callback('{
- ^[ ]{0,'.$less_than_tab.'}\*\[(.+?)\][ ]?: # abbr_id = $1
- (.*) # text = $2 (no blank lines allowed)
- }xm',
- array(&$this, '_stripAbbreviations_callback'),
- $text);
- return $text;
- }
- function _stripAbbreviations_callback($matches) {
- $abbr_word = $matches[1];
- $abbr_desc = $matches[2];
- if ($this->abbr_word_re)
- $this->abbr_word_re .= '|';
- $this->abbr_word_re .= preg_quote($abbr_word);
- $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
- return ''; # String that will replace the block
- }
-
-
- function doAbbreviations($text) {
- #
- # Find defined abbreviations in text and wrap them in <abbr> elements.
- #
- if ($this->abbr_word_re) {
- // cannot use the /x modifier because abbr_word_re may
- // contain significant spaces:
- $text = preg_replace_callback('{'.
- '(?<![\w\x1A])'.
- '(?:'.$this->abbr_word_re.')'.
- '(?![\w\x1A])'.
- '}',
- array(&$this, '_doAbbreviations_callback'), $text);
- }
- return $text;
- }
- function _doAbbreviations_callback($matches) {
- $abbr = $matches[0];
- if (isset($this->abbr_desciptions[$abbr])) {
- $desc = $this->abbr_desciptions[$abbr];
- if (empty($desc)) {
- return $this->hashPart("<abbr>$abbr</abbr>");
- } else {
- $desc = $this->encodeAttribute($desc);
- return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");
- }
- } else {
- return $matches[0];
- }
- }
-
-}
-
-
-/*
-
-PHP Markdown Extra
-==================
-
-Description
------------
-
-This is a PHP port of the original Markdown formatter written in Perl
-by John Gruber. This special "Extra" version of PHP Markdown features
-further enhancements to the syntax for making additional constructs
-such as tables and definition list.
-
-Markdown is a text-to-HTML filter; it translates an easy-to-read /
-easy-to-write structured text format into HTML. Markdown's text format
-is most similar to that of plain text email, and supports features such
-as headers, *emphasis*, code blocks, blockquotes, and links.
-
-Markdown's syntax is designed not as a generic markup language, but
-specifically to serve as a front-end to (X)HTML. You can use span-level
-HTML tags anywhere in a Markdown document, and you can use block level
-HTML tags (like <div> and <table> as well).
-
-For more information about Markdown's syntax, see:
-
-<http://daringfireball.net/projects/markdown/>
-
-
-Bugs
-----
-
-To file bug reports please send email to:
-
-<michel.fortin@michelf.com>
-
-Please include with your report: (1) the example input; (2) the output you
-expected; (3) the output Markdown actually produced.
-
-
-Version History
----------------
-
-See the readme file for detailed release notes for this version.
-
-
-Copyright and License
----------------------
-
-PHP Markdown & Extra
-Copyright (c) 2004-2009 Michel Fortin
-<http://michelf.com/>
-All rights reserved.
-
-Based on Markdown
-Copyright (c) 2003-2006 John Gruber
-<http://daringfireball.net/>
-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.
-
-*/
-?> \ No newline at end of file
diff --git a/library/markdownify/TODO b/library/markdownify/TODO
deleted file mode 100644
index 06ec8508b..000000000
--- a/library/markdownify/TODO
+++ /dev/null
@@ -1,29 +0,0 @@
-Markdownify
-===========
-* handle non-markdownifiable lists (i.e. `<ul><li id="foobar">asdf</li></ul>`)
-* organize methods better (i.e. flushlinebreaks & setlinebreaks close to each other)
-* take a look at function names etc.
-* is the new (in rev. 93) lastclosedtag property needed?
-* word wrapping (some work is done but it's still very buggy)
-
-
-Markdownify Extra
-=================
-
-* handle table alignment with KEEP_HTML=false
-* handle tables without headings when KEEP_HTML=false is set
-* handle Markdown inside non-markdownable tags
-
-
-Implementation Thoughts
-=======================
-* non-markdownifiable lists and markdown inside non-markdownable tags as well as the current
- table implementation could be rewritten by using a rollback mechanism.
-
- example:
-
- <ul><li>asdf</li><li id="foobar">asdf</li></ul>
-
- we come to `<ul>`, know that this might fail and create a snapshot of our current parser
- we keep on parsing and when we reach `<li id="foobar">` we gotta rollback and keep this
- list in HTML format.
diff --git a/library/markdownify/example.php b/library/markdownify/example.php
deleted file mode 100644
index ef86dca83..000000000
--- a/library/markdownify/example.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
- error_reporting(E_ALL);
- if (!empty($_POST['input'])) {
- include 'markdownify_extra.php';
- if (!isset($_POST['leap'])) {
- $leap = MDFY_LINKS_EACH_PARAGRAPH;
- } else {
- $leap = $_POST['leap'];
- }
-
- if (!isset($_POST['keepHTML'])) {
- $keephtml = MDFY_KEEPHTML;
- } else {
- $keephtml = $_POST['keepHTML'];
- }
- if (!empty($_POST['extra'])) {
- $md = new Markdownify_Extra($leap, MDFY_BODYWIDTH, $keephtml);
- } else {
- $md = new Markdownify($leap, MDFY_BODYWIDTH, $keephtml);
- }
- if (ini_get('magic_quotes_gpc')) {
- $_POST['input'] = stripslashes($_POST['input']);
- }
- $output = $md->parseString($_POST['input']);
- } else {
- $_POST['input'] = '';
- }
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>HTML to Markdown Converter</title>
- </head>
- <body>
- <?php if (empty($_POST['input'])): ?>
- <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
- <fieldset>
- <legend>HTML Input</legend>
- <textarea style="width:100%;" cols="85" rows="40" name="input"><?php echo htmlspecialchars($_POST['input'], ENT_NOQUOTES, 'UTF-8'); ?></textarea>
- </fieldset>
- <label for="extra">Markdownify Extra: <input name="extra" checked="checked" id="extra" type="checkbox" value="1" /></label>
- <label for="leap">Links after each block elem: <input name="leap" id="leap" type="checkbox" value="1" /></label>
- <label for="keepHTML">keep HTML: <input name="keepHTML" id="keepHTML" type="checkbox" value="1" checked="checked" /></label>
- <input type="submit" name="submit" value="submit" />
- </form>
- <?php else: ?>
- <h1 style="text-align:right;"><a href="<?php echo $_SERVER['PHP_SELF']; ?>">BACK</a></h1>
- <pre><?php echo htmlspecialchars($output, ENT_NOQUOTES, 'UTF-8'); ?></pre>
- <?php endif; ?>
- </body>
-</html> \ No newline at end of file
diff --git a/library/markdownify/markdownify.php b/library/markdownify/markdownify.php
deleted file mode 100644
index 0d4429a01..000000000
--- a/library/markdownify/markdownify.php
+++ /dev/null
@@ -1,1197 +0,0 @@
-<?php
-/**
- * Markdownify converts HTML Markup to [Markdown][1] (by [John Gruber][2]. It
- * also supports [Markdown Extra][3] by [Michel Fortin][4] via Markdownify_Extra.
- *
- * It all started as `html2text.php` - a port of [Aaron Swartz'][5] [`html2text.py`][6] - but
- * got a long way since. This is far more than a mere port now!
- * Starting with version 2.0.0 this is a complete rewrite and cannot be
- * compared to Aaron Swatz' `html2text.py` anylonger. I'm now using a HTML parser
- * (see `parsehtml.php` which I also wrote) which makes most of the evil
- * RegEx magic go away and additionally it gives a much cleaner class
- * structure. Also notably is the fact that I now try to prevent regressions by
- * utilizing testcases of Michel Fortin's [MDTest][7].
- *
- * [1]: http://daringfireball.com/projects/markdown
- * [2]: http://daringfireball.com/
- * [3]: http://www.michelf.com/projects/php-markdown/extra/
- * [4]: http://www.michelf.com/
- * [5]: http://www.aaronsw.com/
- * [6]: http://www.aaronsw.com/2002/html2text/
- * [7]: http://article.gmane.org/gmane.text.markdown.general/2540
- *
- * @version 2.0.0 alpha
- * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * HTML Parser, see http://sf.net/projects/parseHTML
- */
-require_once dirname(__FILE__).'/parsehtml/parsehtml.php';
-
-/**
- * default configuration
- */
-define('MDFY_LINKS_EACH_PARAGRAPH', false);
-define('MDFY_BODYWIDTH', false);
-define('MDFY_KEEPHTML', true);
-
-/**
- * HTML to Markdown converter class
- */
-class Markdownify {
- /**
- * html parser object
- *
- * @var parseHTML
- */
- var $parser;
- /**
- * markdown output
- *
- * @var string
- */
- var $output;
- /**
- * stack with tags which where not converted to html
- *
- * @var array<string>
- */
- var $notConverted = array();
- /**
- * skip conversion to markdown
- *
- * @var bool
- */
- var $skipConversion = false;
- /* options */
- /**
- * keep html tags which cannot be converted to markdown
- *
- * @var bool
- */
- var $keepHTML = false;
- /**
- * wrap output, set to 0 to skip wrapping
- *
- * @var int
- */
- var $bodyWidth = 0;
- /**
- * minimum body width
- *
- * @var int
- */
- var $minBodyWidth = 25;
- /**
- * display links after each paragraph
- *
- * @var bool
- */
- var $linksAfterEachParagraph = false;
- /**
- * constructor, set options, setup parser
- *
- * @param bool $linksAfterEachParagraph wether or not to flush stacked links after each paragraph
- * defaults to false
- * @param int $bodyWidth wether or not to wrap the output to the given width
- * defaults to false
- * @param bool $keepHTML wether to keep non markdownable HTML or to discard it
- * defaults to true (HTML will be kept)
- * @return void
- */
- function Markdownify($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
- $this->linksAfterEachParagraph = $linksAfterEachParagraph;
- $this->keepHTML = $keepHTML;
-
- if ($bodyWidth > $this->minBodyWidth) {
- $this->bodyWidth = intval($bodyWidth);
- } else {
- $this->bodyWidth = false;
- }
-
- $this->parser = new parseHTML;
- $this->parser->noTagsInCode = true;
-
- # we don't have to do this every time
- $search = array();
- $replace = array();
- foreach ($this->escapeInText as $s => $r) {
- array_push($search, '#(?<!\\\)'.$s.'#U');
- array_push($replace, $r);
- }
- $this->escapeInText = array(
- 'search' => $search,
- 'replace' => $replace
- );
- }
- /**
- * parse a HTML string
- *
- * @param string $html
- * @return string markdown formatted
- */
- function parseString($html) {
- $this->parser->html = $html;
- $this->parse();
- return $this->output;
- }
- /**
- * tags with elements which can be handled by markdown
- *
- * @var array<string>
- */
- var $isMarkdownable = array(
- 'p' => array(),
- 'ul' => array(),
- 'ol' => array(),
- 'li' => array(),
- 'br' => array(),
- 'blockquote' => array(),
- 'code' => array(),
- 'pre' => array(),
- 'a' => array(
- 'href' => 'required',
- 'title' => 'optional',
- ),
- 'strong' => array(),
- 'b' => array(),
- 'em' => array(),
- 'i' => array(),
- 'img' => array(
- 'src' => 'required',
- 'alt' => 'optional',
- 'title' => 'optional',
- ),
- 'h1' => array(),
- 'h2' => array(),
- 'h3' => array(),
- 'h4' => array(),
- 'h5' => array(),
- 'h6' => array(),
- 'hr' => array(),
- );
- /**
- * html tags to be ignored (contents will be parsed)
- *
- * @var array<string>
- */
- var $ignore = array(
- 'html',
- 'body',
- );
- /**
- * html tags to be dropped (contents will not be parsed!)
- *
- * @var array<string>
- */
- var $drop = array(
- 'script',
- 'head',
- 'style',
- 'form',
- 'area',
- 'object',
- 'param',
- 'iframe',
- );
- /**
- * Markdown indents which could be wrapped
- * @note: use strings in regex format
- *
- * @var array<string>
- */
- var $wrappableIndents = array(
- '\* ', # ul
- '\d. ', # ol
- '\d\d. ', # ol
- '> ', # blockquote
- '', # p
- );
- /**
- * list of chars which have to be escaped in normal text
- * @note: use strings in regex format
- *
- * @var array
- *
- * TODO: what's with block chars / sequences at the beginning of a block?
- */
- var $escapeInText = array(
- '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0|', # hr
- '\*\*([^*\s]+)\*\*' => '\*\*$1\*\*', # strong
- '\*([^*\s]+)\*' => '\*$1\*', # em
- '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', # em
- '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', # em
- '`(.+)`' => '\`$1\`', # code
- '\[(.+)\](\s*\()' => '\[$1\]$2', # links: [text] (url) => [text\] (url)
- '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', # links: [text][id] => [text\][id\]
- );
- /**
- * wether last processed node was a block tag or not
- *
- * @var bool
- */
- var $lastWasBlockTag = false;
- /**
- * name of last closed tag
- *
- * @var string
- */
- var $lastClosedTag = '';
- /**
- * iterate through the nodes and decide what we
- * shall do with the current node
- *
- * @param void
- * @return void
- */
- function parse() {
- $this->output = '';
- # drop tags
- $this->parser->html = preg_replace('#<('.implode('|', $this->drop).')[^>]*>.*</\\1>#sU', '', $this->parser->html);
- while ($this->parser->nextNode()) {
- switch ($this->parser->nodeType) {
- case 'doctype':
- break;
- case 'pi':
- case 'comment':
- if ($this->keepHTML) {
- $this->flushLinebreaks();
- $this->out($this->parser->node);
- $this->setLineBreaks(2);
- }
- # else drop
- break;
- case 'text':
- $this->handleText();
- break;
- case 'tag':
- if (in_array($this->parser->tagName, $this->ignore)) {
- break;
- }
- if ($this->parser->isStartTag) {
- $this->flushLinebreaks();
- }
- if ($this->skipConversion) {
- $this->isMarkdownable(); # update notConverted
- $this->handleTagToText();
- continue;
- }
- if (!$this->parser->keepWhitespace && $this->parser->isBlockElement && $this->parser->isStartTag) {
- $this->parser->html = ltrim($this->parser->html);
- }
- if ($this->isMarkdownable()) {
- if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
- if (!empty($this->buffer)) {
- $str =& $this->buffer[count($this->buffer) -1];
- } else {
- $str =& $this->output;
- }
- if (substr($str, -strlen($this->indent)-1) != "\n".$this->indent) {
- $str .= "\n".$this->indent;
- }
- }
- $func = 'handleTag_'.$this->parser->tagName;
- $this->$func();
- if ($this->linksAfterEachParagraph && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
- $this->flushStacked();
- }
- if (!$this->parser->isStartTag) {
- $this->lastClosedTag = $this->parser->tagName;
- }
- } else {
- $this->handleTagToText();
- $this->lastClosedTag = '';
- }
- break;
- default:
- trigger_error('invalid node type', E_USER_ERROR);
- break;
- }
- $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
- }
- if (!empty($this->buffer)) {
- trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
- while (!empty($this->buffer)) {
- $this->out($this->unbuffer());
- }
- }
- ### cleanup
- $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
- # end parsing, flush stacked tags
- $this->flushStacked();
- $this->stack = array();
- }
- /**
- * check if current tag can be converted to Markdown
- *
- * @param void
- * @return bool
- */
- function isMarkdownable() {
- if (!isset($this->isMarkdownable[$this->parser->tagName])) {
- # simply not markdownable
- return false;
- }
- if ($this->parser->isStartTag) {
- $return = true;
- if ($this->keepHTML) {
- $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
- if (!empty($diff)) {
- # non markdownable attributes given
- $return = false;
- }
- }
- if ($return) {
- foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
- if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
- # required markdown attribute not given
- $return = false;
- break;
- }
- }
- }
- if (!$return) {
- array_push($this->notConverted, $this->parser->tagName.'::'.implode('/', $this->parser->openTags));
- }
- return $return;
- } else {
- if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
- array_pop($this->notConverted);
- return false;
- }
- return true;
- }
- }
- /**
- * output all stacked tags
- *
- * @param void
- * @return void
- */
- function flushStacked() {
- # links
- foreach ($this->stack as $tag => $a) {
- if (!empty($a)) {
- call_user_func(array(&$this, 'flushStacked_'.$tag));
- }
- }
- }
- /**
- * output link references (e.g. [1]: http://example.com "title");
- *
- * @param void
- * @return void
- */
- function flushStacked_a() {
- $out = false;
- foreach ($this->stack['a'] as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- if (!$out) {
- $out = true;
- $this->out("\n\n", true);
- } else {
- $this->out("\n", true);
- }
- $this->out(' ['.$tag['linkID'].']: '.$tag['href'].(isset($tag['title']) ? ' "'.$tag['title'].'"' : ''), true);
- $tag['unstacked'] = true;
- $this->stack['a'][$k] = $tag;
- }
- }
- }
- /**
- * flush enqued linebreaks
- *
- * @param void
- * @return void
- */
- function flushLinebreaks() {
- if ($this->lineBreaks && !empty($this->output)) {
- $this->out(str_repeat("\n".$this->indent, $this->lineBreaks), true);
- }
- $this->lineBreaks = 0;
- }
- /**
- * handle non Markdownable tags
- *
- * @param void
- * @return void
- */
- function handleTagToText() {
- if (!$this->keepHTML) {
- if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
- $this->setLineBreaks(2);
- }
- } else {
- # dont convert to markdown inside this tag
- /** TODO: markdown extra **/
- if (!$this->parser->isEmptyTag) {
- if ($this->parser->isStartTag) {
- if (!$this->skipConversion) {
- $this->skipConversion = $this->parser->tagName.'::'.implode('/', $this->parser->openTags);
- }
- } else {
- if ($this->skipConversion == $this->parser->tagName.'::'.implode('/', $this->parser->openTags)) {
- $this->skipConversion = false;
- }
- }
- }
-
- if ($this->parser->isBlockElement) {
- if ($this->parser->isStartTag) {
- if (in_array($this->parent(), array('ins', 'del'))) {
- # looks like ins or del are block elements now
- $this->out("\n", true);
- $this->indent(' ');
- }
- if ($this->parser->tagName != 'pre') {
- $this->out($this->parser->node."\n".$this->indent);
- if (!$this->parser->isEmptyTag) {
- $this->indent(' ');
- } else {
- $this->setLineBreaks(1);
- }
- $this->parser->html = ltrim($this->parser->html);
- } else {
- # don't indent inside <pre> tags
- $this->out($this->parser->node);
- static $indent;
- $indent = $this->indent;
- $this->indent = '';
- }
- } else {
- if (!$this->parser->keepWhitespace) {
- $this->output = rtrim($this->output);
- }
- if ($this->parser->tagName != 'pre') {
- $this->indent(' ');
- $this->out("\n".$this->indent.$this->parser->node);
- } else {
- # reset indentation
- $this->out($this->parser->node);
- static $indent;
- $this->indent = $indent;
- }
-
- if (in_array($this->parent(), array('ins', 'del'))) {
- # ins or del was block element
- $this->out("\n");
- $this->indent(' ');
- }
- if ($this->parser->tagName == 'li') {
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- }
- } else {
- $this->out($this->parser->node);
- }
- if (in_array($this->parser->tagName, array('code', 'pre'))) {
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- # add stuff so cleanup just reverses this
- $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
- }
- }
- }
- }
- /**
- * handle plain text
- *
- * @param void
- * @return void
- */
- function handleText() {
- if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
- $this->parser->node = str_replace("\n", "\n".$this->indent, $this->parser->node);
- }
- if (!$this->hasParent('code') && !$this->hasParent('pre')) {
- # entity decode
- $this->parser->node = $this->decode($this->parser->node);
- if (!$this->skipConversion) {
- # escape some chars in normal Text
- $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
- }
- } else {
- $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
- }
- $this->out($this->parser->node);
- $this->lastClosedTag = '';
- }
- /**
- * handle <em> and <i> tags
- *
- * @param void
- * @return void
- */
- function handleTag_em() {
- $this->out('*', true);
- }
- function handleTag_i() {
- $this->handleTag_em();
- }
- /**
- * handle <strong> and <b> tags
- *
- * @param void
- * @return void
- */
- function handleTag_strong() {
- $this->out('**', true);
- }
- function handleTag_b() {
- $this->handleTag_strong();
- }
- /**
- * handle <h1> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h1() {
- $this->handleHeader(1);
- }
- /**
- * handle <h2> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h2() {
- $this->handleHeader(2);
- }
- /**
- * handle <h3> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h3() {
- $this->handleHeader(3);
- }
- /**
- * handle <h4> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h4() {
- $this->handleHeader(4);
- }
- /**
- * handle <h5> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h5() {
- $this->handleHeader(5);
- }
- /**
- * handle <h6> tags
- *
- * @param void
- * @return void
- */
- function handleTag_h6() {
- $this->handleHeader(6);
- }
- /**
- * number of line breaks before next inline output
- */
- var $lineBreaks = 0;
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- function handleHeader($level) {
- if ($this->parser->isStartTag) {
- $this->out(str_repeat('#', $level).' ', true);
- } else {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <p> tags
- *
- * @param void
- * @return void
- */
- function handleTag_p() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <a> tags
- *
- * @param void
- * @return void
- */
- function handleTag_a() {
- if ($this->parser->isStartTag) {
- $this->buffer();
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
- $this->stack();
- } else {
- $tag = $this->unstack();
- $buffer = $this->unbuffer();
-
- if (empty($tag['href']) && empty($tag['title'])) {
- # empty links... testcase mania, who would possibly do anything like that?!
- $this->out('['.$buffer.']()', true);
- return;
- }
-
- if ($buffer == $tag['href'] && empty($tag['title'])) {
- # <http://example.com>
- $this->out('<'.$buffer.'>', true);
- return;
- }
-
- $bufferDecoded = $this->decode(trim($buffer));
- if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:'.$bufferDecoded == $tag['href']) {
- if (is_null($tag['title'])) {
- # <mail@example.com>
- $this->out('<'.$bufferDecoded.'>', true);
- return;
- }
- # [mail@example.com][1]
- # ...
- # [1]: mailto:mail@example.com Title
- $tag['href'] = 'mailto:'.$bufferDecoded;
- }
-
- $this->out('['.$buffer.']('.$tag['href'].' "'.$tag['title'].'")', true);
-
-/*
- # [This link][id]
- foreach ($this->stack['a'] as $tag2) {
- if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
- $tag['linkID'] = $tag2['linkID'];
- break;
- }
- }
- if (!isset($tag['linkID'])) {
- $tag['linkID'] = count($this->stack['a']) + 1;
- array_push($this->stack['a'], $tag);
- }
-
- $this->out('['.$buffer.']['.$tag['linkID'].']', true);
-*/
- }
- }
- /**
- * handle <img /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_img() {
- if (!$this->parser->isStartTag) {
- return; # just to be sure this is really an empty tag...
- }
-
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- if (isset($this->parser->tagAttributes['alt'])) {
- $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
- } else {
- $this->parser->tagAttributes['alt'] = null;
- }
-
- if (empty($this->parser->tagAttributes['src'])) {
- # support for "empty" images... dunno if this is really needed
- # but there are some testcases which do that...
- if (!empty($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = ' '.$this->parser->tagAttributes['title'].' ';
- }
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['title'].')', true);
- return;
- } else {
- $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
- }
-
-// ![Alt text](/path/to/img.jpg "Optional title")
- if ($this->parser->tagAttributes['title'] != "")
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['src'].' "'.$this->parser->tagAttributes['title'].'")', true);
- else
- $this->out('!['.$this->parser->tagAttributes['alt'].']('.$this->parser->tagAttributes['src'].')', true);
-
-/*
- # [This link][id]
- $link_id = false;
- if (!empty($this->stack['a'])) {
- foreach ($this->stack['a'] as $tag) {
- if ($tag['href'] == $this->parser->tagAttributes['src']
- && $tag['title'] === $this->parser->tagAttributes['title']) {
- $link_id = $tag['linkID'];
- break;
- }
- }
- } else {
- $this->stack['a'] = array();
- }
- if (!$link_id) {
- $link_id = count($this->stack['a']) + 1;
- $tag = array(
- 'href' => $this->parser->tagAttributes['src'],
- 'linkID' => $link_id,
- 'title' => $this->parser->tagAttributes['title']
- );
- array_push($this->stack['a'], $tag);
- }
-
- $this->out('!['.$this->parser->tagAttributes['alt'].']['.$link_id.']', true);
-*/
- }
- /**
- * handle <code> tags
- *
- * @param void
- * @return void
- */
- function handleTag_code() {
- if ($this->hasParent('pre')) {
- # ignore code blocks inside <pre>
- return;
- }
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- $buffer = $this->unbuffer();
- # use as many backticks as needed
- preg_match_all('#`+#', $buffer, $matches);
- if (!empty($matches[0])) {
- rsort($matches[0]);
-
- $ticks = '`';
- while (true) {
- if (!in_array($ticks, $matches[0])) {
- break;
- }
- $ticks .= '`';
- }
- } else {
- $ticks = '`';
- }
- if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
- $buffer = ' '.$buffer.' ';
- }
- $this->out($ticks.$buffer.$ticks, true);
- }
- }
- /**
- * handle <pre> tags
- *
- * @param void
- * @return void
- */
- function handleTag_pre() {
- if ($this->keepHTML && $this->parser->isStartTag) {
- # check if a simple <code> follows
- if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
- # this is no standard markdown code block
- $this->handleTagToText();
- return;
- }
- }
- $this->indent(' ');
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- } else {
- $this->parser->html = ltrim($this->parser->html);
- }
- }
- /**
- * handle <blockquote> tags
- *
- * @param void
- * @return void
- */
- function handleTag_blockquote() {
- $this->indent('> ');
- }
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- function handleTag_ul() {
- if ($this->parser->isStartTag) {
- $this->stack();
- if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
- $this->out("\n".$this->indent.'<!-- -->'."\n".$this->indent."\n".$this->indent);
- }
- } else {
- $this->unstack();
- if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
- # dont make Markdown add unneeded paragraphs
- $this->setLineBreaks(2);
- }
- }
- }
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- function handleTag_ol() {
- # same as above
- $this->parser->tagAttributes['num'] = 0;
- $this->handleTag_ul();
- }
- /**
- * handle <li> tags
- *
- * @param void
- * @return void
- */
- function handleTag_li() {
- if ($this->parent() == 'ol') {
- $parent =& $this->getStacked('ol');
- if ($this->parser->isStartTag) {
- $parent['num']++;
- $this->out($parent['num'].'.'.str_repeat(' ', 3 - strlen($parent['num'])), true);
- }
- $this->indent(' ', false);
- } else {
- if ($this->parser->isStartTag) {
- $this->out('* ', true);
- }
- $this->indent(' ', false);
- }
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
- /**
- * handle <hr /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_hr() {
- if (!$this->parser->isStartTag) {
- return; # just to be sure this really is an empty tag
- }
- $this->out('* * *', true);
- $this->setLineBreaks(2);
- }
- /**
- * handle <br /> tags
- *
- * @param void
- * @return void
- */
- function handleTag_br() {
- $this->out(" \n".$this->indent, true);
- $this->parser->html = ltrim($this->parser->html);
- }
- /**
- * node stack, e.g. for <a> and <abbr> tags
- *
- * @var array<array>
- */
- var $stack = array();
- /**
- * add current node to the stack
- * this only stores the attributes
- *
- * @param void
- * @return void
- */
- function stack() {
- if (!isset($this->stack[$this->parser->tagName])) {
- $this->stack[$this->parser->tagName] = array();
- }
- array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
- }
- /**
- * remove current tag from stack
- *
- * @param void
- * @return array
- */
- function unstack() {
- if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
- trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
- }
- return array_pop($this->stack[$this->parser->tagName]);
- }
- /**
- * get last stacked element of type $tagName
- *
- * @param string $tagName
- * @return array
- */
- function & getStacked($tagName) {
- // no end() so it can be referenced
- return $this->stack[$tagName][count($this->stack[$tagName])-1];
- }
- /**
- * set number of line breaks before next start tag
- *
- * @param int $number
- * @return void
- */
- function setLineBreaks($number) {
- if ($this->lineBreaks < $number) {
- $this->lineBreaks = $number;
- }
- }
- /**
- * stores current buffers
- *
- * @var array<string>
- */
- var $buffer = array();
- /**
- * buffer next parser output until unbuffer() is called
- *
- * @param void
- * @return void
- */
- function buffer() {
- array_push($this->buffer, '');
- }
- /**
- * end current buffer and return buffered output
- *
- * @param void
- * @return string
- */
- function unbuffer() {
- return array_pop($this->buffer);
- }
- /**
- * append string to the correct var, either
- * directly to $this->output or to the current
- * buffers
- *
- * @param string $put
- * @return void
- */
- function out($put, $nowrap = false) {
- if (empty($put)) {
- return;
- }
- if (!empty($this->buffer)) {
- $this->buffer[count($this->buffer) - 1] .= $put;
- } else {
- if ($this->bodyWidth && !$this->parser->keepWhitespace) { # wrap lines
- // get last line
- $pos = strrpos($this->output, "\n");
- if ($pos === false) {
- $line = $this->output;
- } else {
- $line = substr($this->output, $pos);
- }
-
- if ($nowrap) {
- if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
- $this->output .= "\n".$this->indent.$put;
- } else {
- $this->output .= $put;
- }
- return;
- } else {
- $put .= "\n"; # make sure we get all lines in the while below
- $lineLen = $this->strlen($line);
- while ($pos = strpos($put, "\n")) {
- $putLine = substr($put, 0, $pos+1);
- $put = substr($put, $pos+1);
- $putLen = $this->strlen($putLine);
- if ($lineLen + $putLen < $this->bodyWidth) {
- $this->output .= $putLine;
- $lineLen = $putLen;
- } else {
- $split = preg_split('#^(.{0,'.($this->bodyWidth - $lineLen).'})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
- $this->output .= rtrim($split[1][0])."\n".$this->indent.$this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n".$this->indent, false);
- }
- }
- $this->output = substr($this->output, 0, -1);
- return;
- }
- } else {
- $this->output .= $put;
- }
- }
- }
- /**
- * current indentation
- *
- * @var string
- */
- var $indent = '';
- /**
- * indent next output (start tag) or unindent (end tag)
- *
- * @param string $str indentation
- * @param bool $output add indendation to output
- * @return void
- */
- function indent($str, $output = true) {
- if ($this->parser->isStartTag) {
- $this->indent .= $str;
- if ($output) {
- $this->out($str, true);
- }
- } else {
- $this->indent = substr($this->indent, 0, -strlen($str));
- }
- }
- /**
- * decode email addresses
- *
- * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
- * @author Milian Wolff <http://milianw.de>
- */
- function decode($text, $quote_style = ENT_QUOTES) {
- if (version_compare(PHP_VERSION, '5', '>=')) {
- # UTF-8 is only supported in PHP 5.x.x and above
- $text = html_entity_decode($text, $quote_style, 'UTF-8');
- } else {
- if (function_exists('html_entity_decode')) {
- $text = html_entity_decode($text, $quote_style, 'ISO-8859-1');
- } else {
- static $trans_tbl;
- if (!isset($trans_tbl)) {
- $trans_tbl = array_flip(get_html_translation_table(HTML_ENTITIES, $quote_style));
- }
- $text = strtr($text, $trans_tbl);
- }
- $text = preg_replace_callback('~&#x([0-9a-f]+);~i', array(&$this, '_decode_hex'), $text);
- $text = preg_replace_callback('~&#(\d{2,5});~', array(&$this, '_decode_numeric'), $text);
- }
- return $text;
- }
- /**
- * callback for decode() which converts a hexadecimal entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function _decode_hex($matches) {
- return $this->unichr(hexdec($matches[1]));
- }
- /**
- * callback for decode() which converts a numerical entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function _decode_numeric($matches) {
- return $this->unichr($matches[1]);
- }
- /**
- * UTF-8 chr() which supports numeric entities
- *
- * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
- * @param array $matches
- * @return string UTF-8 encoded
- */
- function unichr($dec) {
- if ($dec < 128) {
- $utf = chr($dec);
- } else if ($dec < 2048) {
- $utf = chr(192 + (($dec - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- } else {
- $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
- $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- }
- return $utf;
- }
- /**
- * UTF-8 strlen()
- *
- * @param string $str
- * @return int
- *
- * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
- * @author Milian Wolff <http://milianw.de>
- */
- function strlen($str) {
- if (function_exists('mb_strlen')) {
- return mb_strlen($str, 'UTF-8');
- } else {
- return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
- }
- }
- /**
- * wordwrap for utf8 encoded strings
- *
- * @param string $str
- * @param integer $len
- * @param string $what
- * @return string
- */
- function wordwrap($str, $width, $break, $cut = false){
- if (!$cut) {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,'.$width.'}\b#';
- } else {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
- }
- $return = '';
- while (preg_match($regexp, $str, $matches)) {
- $string = $matches[0];
- $str = ltrim(substr($str, strlen($string)));
- if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
- $string .= $str[0];
- $str = ltrim(substr($str, 1));
- }
- $return .= $string.$break;
- }
- return $return.ltrim($str);
- }
- /**
- * check if current node has a $tagName as parent (somewhere, not only the direct parent)
- *
- * @param string $tagName
- * @return bool
- */
- function hasParent($tagName) {
- return in_array($tagName, $this->parser->openTags);
- }
- /**
- * get tagName of direct parent tag
- *
- * @param void
- * @return string $tagName
- */
- function parent() {
- return end($this->parser->openTags);
- }
-}
diff --git a/library/markdownify/markdownify_cli.php b/library/markdownify/markdownify_cli.php
deleted file mode 100755
index b3fffbd5c..000000000
--- a/library/markdownify/markdownify_cli.php
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/php
-<?php
-require dirname(__FILE__) .'/markdownify_extra.php';
-
-function param($name, $default = false) {
- if (!in_array('--'.$name, $_SERVER['argv']))
- return $default;
- reset($_SERVER['argv']);
- while (each($_SERVER['argv'])) {
- if (current($_SERVER['argv']) == '--'.$name)
- break;
- }
- $value = next($_SERVER['argv']);
- if ($value === false || substr($value, 0, 2) == '--')
- return true;
- else
- return $value;
-}
-
-
-$input = stream_get_contents(STDIN);
-
-$linksAfterEachParagraph = param('links');
-$bodyWidth = param('width');
-$keepHTML = param('html', true);
-
-if (param('no_extra')) {
- $parser = new Markdownify($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-} else {
- $parser = new Markdownify_Extra($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-}
-
-echo $parser->parseString($input) ."\n"; \ No newline at end of file
diff --git a/library/markdownify/markdownify_extra.php b/library/markdownify/markdownify_extra.php
deleted file mode 100644
index e978a1c8a..000000000
--- a/library/markdownify/markdownify_extra.php
+++ /dev/null
@@ -1,489 +0,0 @@
-<?php
-/**
- * Class to convert HTML to Markdown with PHP Markdown Extra syntax support.
- *
- * @version 1.0.0 alpha
- * @author Milian Wolff (<mail@milianw.de>, <http://milianw.de>)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
- * standard Markdownify class
- */
-require_once dirname(__FILE__).'/markdownify.php';
-
-class Markdownify_Extra extends Markdownify {
- /**
- * table data, including rows with content and the maximum width of each col
- *
- * @var array
- */
- var $table = array();
- /**
- * current col
- *
- * @var int
- */
- var $col = -1;
- /**
- * current row
- *
- * @var int
- */
- var $row = 0;
- /**
- * constructor, see Markdownify::Markdownify() for more information
- */
- function Markdownify_Extra($linksAfterEachParagraph = MDFY_LINKS_EACH_PARAGRAPH, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML) {
- parent::Markdownify($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-
- ### new markdownable tags & attributes
- # header ids: # foo {bar}
- $this->isMarkdownable['h1']['id'] = 'optional';
- $this->isMarkdownable['h2']['id'] = 'optional';
- $this->isMarkdownable['h3']['id'] = 'optional';
- $this->isMarkdownable['h4']['id'] = 'optional';
- $this->isMarkdownable['h5']['id'] = 'optional';
- $this->isMarkdownable['h6']['id'] = 'optional';
- # tables
- $this->isMarkdownable['table'] = array();
- $this->isMarkdownable['th'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['td'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['tr'] = array();
- array_push($this->ignore, 'thead');
- array_push($this->ignore, 'tbody');
- array_push($this->ignore, 'tfoot');
- # definition lists
- $this->isMarkdownable['dl'] = array();
- $this->isMarkdownable['dd'] = array();
- $this->isMarkdownable['dt'] = array();
- # footnotes
- $this->isMarkdownable['fnref'] = array(
- 'target' => 'required',
- );
- $this->isMarkdownable['footnotes'] = array();
- $this->isMarkdownable['fn'] = array(
- 'name' => 'required',
- );
- $this->parser->blockElements['fnref'] = false;
- $this->parser->blockElements['fn'] = true;
- $this->parser->blockElements['footnotes'] = true;
- # abbr
- $this->isMarkdownable['abbr'] = array(
- 'title' => 'required',
- );
- # build RegEx lookahead to decide wether table can pe parsed or not
- $inlineTags = array_keys($this->parser->blockElements, false);
- $colContents = '(?:[^<]|<(?:'.implode('|', $inlineTags).'|[^a-z]))+';
- $this->tableLookaheadHeader = '{
- ^\s*(?:<thead\s*>)?\s* # open optional thead
- <tr\s*>\s*(?: # start required row with headers
- <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*> # header with optional align
- \s*'.$colContents.'\s* # contents
- </th>\s* # close header
- )+</tr> # close row with headers
- \s*(?:</thead>)? # close optional thead
- }sxi';
- $this->tdSubstitute = '\s*'.$colContents.'\s* # contents
- </td>\s*';
- $this->tableLookaheadBody = '{
- \s*(?:<tbody\s*>)?\s* # open optional tbody
- (?:<tr\s*>\s* # start row
- %s # cols to be substituted
- </tr>)+ # close row
- \s*(?:</tbody>)? # close optional tbody
- \s*</table> # close table
- }sxi';
- }
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- function handleHeader($level) {
- static $id = null;
- if ($this->parser->isStartTag) {
- if (isset($this->parser->tagAttributes['id'])) {
- $id = $this->parser->tagAttributes['id'];
- }
- } else {
- if (!is_null($id)) {
- $this->out(' {#'.$id.'}');
- $id = null;
- }
- }
- parent::handleHeader($level);
- }
- /**
- * handle <abbr> tags
- *
- * @param void
- * @return void
- */
- function handleTag_abbr() {
- if ($this->parser->isStartTag) {
- $this->stack();
- $this->buffer();
- } else {
- $tag = $this->unstack();
- $tag['text'] = $this->unbuffer();
- $add = true;
- foreach ($this->stack['abbr'] as $stacked) {
- if ($stacked['text'] == $tag['text']) {
- /** TODO: differing abbr definitions, i.e. different titles for same text **/
- $add = false;
- break;
- }
- }
- $this->out($tag['text']);
- if ($add) {
- array_push($this->stack['abbr'], $tag);
- }
- }
- }
- /**
- * flush stacked abbr tags
- *
- * @param void
- * @return void
- */
- function flushStacked_abbr() {
- $out = array();
- foreach ($this->stack['abbr'] as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- array_push($out, ' *['.$tag['text'].']: '.$tag['title']);
- $tag['unstacked'] = true;
- $this->stack['abbr'][$k] = $tag;
- }
- }
- if (!empty($out)) {
- $this->out("\n\n".implode("\n", $out));
- }
- }
- /**
- * handle <table> tags
- *
- * @param void
- * @return void
- */
- function handleTag_table() {
- if ($this->parser->isStartTag) {
- # check if upcoming table can be converted
- if ($this->keepHTML) {
- if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
- # header seems good, now check body
- # get align & number of cols
- preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
- $regEx = '';
- $i = 1;
- $aligns = array();
- foreach ($cols[2] as $align) {
- $align = strtolower($align);
- array_push($aligns, $align);
- if (empty($align)) {
- $align = 'left'; # default value
- }
- $td = '\s+align=("|\')'.$align.'\\'.$i;
- $i++;
- if ($align == 'left') {
- # look for empty align or left
- $td = '(?:'.$td.')?';
- }
- $td = '<td'.$td.'\s*>';
- $regEx .= $td.$this->tdSubstitute;
- }
- $regEx = sprintf($this->tableLookaheadBody, $regEx);
- if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
- # this is a markdownable table tag!
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => $aligns,
- );
- $this->row = 0;
- } else {
- # non markdownable table
- $this->handleTagToText();
- }
- } else {
- # non markdownable table
- $this->handleTagToText();
- }
- } else {
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => array(),
- );
- $this->row = 0;
- }
- } else {
- # finally build the table in Markdown Extra syntax
- $separator = array();
- # seperator with correct align identifikators
- foreach($this->table['aligns'] as $col => $align) {
- if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
- break;
- }
- $left = ' ';
- $right = ' ';
- switch ($align) {
- case 'left':
- $left = ':';
- break;
- case 'center':
- $right = ':';
- $left = ':';
- case 'right':
- $right = ':';
- break;
- }
- array_push($separator, $left.str_repeat('-', $this->table['col_widths'][$col]).$right);
- }
- $separator = '|'.implode('|', $separator).'|';
-
- $rows = array();
- # add padding
- array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
- $header = array_shift($this->table['rows']);
- array_push($rows, '| '.implode(' | ', $header).' |');
- array_push($rows, $separator);
- foreach ($this->table['rows'] as $row) {
- array_push($rows, '| '.implode(' | ', $row).' |');
- }
- $this->out(implode("\n".$this->indent, $rows));
- $this->table = array();
- $this->setLineBreaks(2);
- }
- }
- /**
- * properly pad content so it is aligned as whished
- * should be used with array_walk_recursive on $this->table['rows']
- *
- * @param string &$content
- * @param int $col
- * @return void
- */
- function alignTdContent(&$content, $col) {
- switch ($this->table['aligns'][$col]) {
- default:
- case 'left':
- $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
- break;
- case 'right':
- $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)).$content;
- break;
- case 'center':
- $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
- $left = floor($paddingNeeded / 2);
- $right = $paddingNeeded - $left;
- $content = str_repeat(' ', $left).$content.str_repeat(' ', $right);
- break;
- }
- }
- /**
- * handle <tr> tags
- *
- * @param void
- * @return void
- */
- function handleTag_tr() {
- if ($this->parser->isStartTag) {
- $this->col = -1;
- } else {
- $this->row++;
- }
- }
- /**
- * handle <td> tags
- *
- * @param void
- * @return void
- */
- function handleTag_td() {
- if ($this->parser->isStartTag) {
- $this->col++;
- if (!isset($this->table['col_widths'][$this->col])) {
- $this->table['col_widths'][$this->col] = 0;
- }
- $this->buffer();
- } else {
- $buffer = trim($this->unbuffer());
- $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
- $this->table['rows'][$this->row][$this->col] = $buffer;
- }
- }
- /**
- * handle <th> tags
- *
- * @param void
- * @return void
- */
- function handleTag_th() {
- if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col+1])) {
- if (isset($this->parser->tagAttributes['align'])) {
- $this->table['aligns'][$this->col+1] = $this->parser->tagAttributes['align'];
- } else {
- $this->table['aligns'][$this->col+1] = '';
- }
- }
- $this->handleTag_td();
- }
- /**
- * handle <dl> tags
- *
- * @param void
- * @return void
- */
- function handleTag_dl() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * handle <dt> tags
- *
- * @param void
- * @return void
- **/
- function handleTag_dt() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
- /**
- * handle <dd> tags
- *
- * @param void
- * @return void
- */
- function handleTag_dd() {
- if ($this->parser->isStartTag) {
- if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
- # next comes a paragraph, so we'll need an extra line
- $this->out("\n".$this->indent);
- } elseif (substr($this->output, -2) == "\n\n") {
- $this->output = substr($this->output, 0, -1);
- }
- $this->out(': ');
- $this->indent(' ', false);
- } else {
- # lookahead for next dt
- if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
- $this->setLineBreaks(2);
- } else {
- $this->setLineBreaks(1);
- }
- $this->indent(' ');
- }
- }
- /**
- * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
- *
- * @param void
- * @return void
- */
- function handleTag_fnref() {
- $this->out('[^'.$this->parser->tagAttributes['target'].']');
- }
- /**
- * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- function handleTag_fn() {
- if ($this->parser->isStartTag) {
- $this->out('[^'.$this->parser->tagAttributes['name'].']:');
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- $this->indent(' ');
- }
- /**
- * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- function handleTag_footnotes() {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
- /**
- * parse a HTML string, clean up footnotes prior
- *
- * @param string $HTML input
- * @return string Markdown formatted output
- */
- function parseString($html) {
- /** TODO: custom markdown-extra options, e.g. titles & classes **/
- # <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
- # => <fnref target="..." />
- $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
- # <div class="footnotes">
- # <hr />
- # <ol>
- #
- # <li id="fn:...">...</li>
- # ...
- #
- # </ol>
- # </div>
- # =>
- # <footnotes>
- # <fn name="...">...</fn>
- # ...
- # </footnotes>
- $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
- return parent::parseString($html);
- }
- /**
- * replace HTML representation of footnotes with something more easily parsable
- *
- * @note this is a callback to be used in parseString()
- *
- * @param array $matches
- * @return string
- */
- function _makeFootnotes($matches) {
- # <li id="fn:1">
- # ...
- # <a href="#fnref:block" rev="footnote">&#8617;</a></p>
- # </li>
- # => <fn name="1">...</fn>
- # remove footnote link
- $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
- # remove empty paragraph
- $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
- # <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
- $fns = str_replace('<li id="fn:', '<fn name="', $fns);
-
- $fns = '<footnotes>'.$fns.'</footnotes>';
- return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
- }
-} \ No newline at end of file
diff --git a/library/markdownify/parsehtml/parsehtml.php b/library/markdownify/parsehtml/parsehtml.php
deleted file mode 100644
index 1a8ecacda..000000000
--- a/library/markdownify/parsehtml/parsehtml.php
+++ /dev/null
@@ -1,618 +0,0 @@
-<?php
-/**
- * parseHTML is a HTML parser which works with PHP 4 and above.
- * It tries to handle invalid HTML to some degree.
- *
- * @version 1.0 beta
- * @author Milian Wolff (mail@milianw.de, http://milianw.de)
- * @license LGPL, see LICENSE_LGPL.txt and the summary below
- * @copyright (C) 2007 Milian Wolff
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-class parseHTML {
- /**
- * tags which are always empty (<br /> etc.)
- *
- * @var array<string>
- */
- var $emptyTags = array(
- 'br',
- 'hr',
- 'input',
- 'img',
- 'area',
- 'link',
- 'meta',
- 'param',
- );
- /**
- * tags with preformatted text
- * whitespaces wont be touched in them
- *
- * @var array<string>
- */
- var $preformattedTags = array(
- 'script',
- 'style',
- 'pre',
- 'code',
- );
- /**
- * supress HTML tags inside preformatted tags (see above)
- *
- * @var bool
- */
- var $noTagsInCode = false;
- /**
- * html to be parsed
- *
- * @var string
- */
- var $html = '';
- /**
- * node type:
- *
- * - tag (see isStartTag)
- * - text (includes cdata)
- * - comment
- * - doctype
- * - pi (processing instruction)
- *
- * @var string
- */
- var $nodeType = '';
- /**
- * current node content, i.e. either a
- * simple string (text node), or something like
- * <tag attrib="value"...>
- *
- * @var string
- */
- var $node = '';
- /**
- * wether current node is an opening tag (<a>) or not (</a>)
- * set to NULL if current node is not a tag
- * NOTE: empty tags (<br />) set this to true as well!
- *
- * @var bool | null
- */
- var $isStartTag = null;
- /**
- * wether current node is an empty tag (<br />) or not (<a></a>)
- *
- * @var bool | null
- */
- var $isEmptyTag = null;
- /**
- * tag name
- *
- * @var string | null
- */
- var $tagName = '';
- /**
- * attributes of current tag
- *
- * @var array (attribName=>value) | null
- */
- var $tagAttributes = null;
- /**
- * wether the current tag is a block element
- *
- * @var bool | null
- */
- var $isBlockElement = null;
-
- /**
- * keep whitespace
- *
- * @var int
- */
- var $keepWhitespace = 0;
- /**
- * list of open tags
- * count this to get current depth
- *
- * @var array
- */
- var $openTags = array();
- /**
- * list of block elements
- *
- * @var array
- * TODO: what shall we do with <del> and <ins> ?!
- */
- var $blockElements = array (
- # tag name => <bool> is block
- # block elements
- 'address' => true,
- 'blockquote' => true,
- 'center' => true,
- 'del' => true,
- 'dir' => true,
- 'div' => true,
- 'dl' => true,
- 'fieldset' => true,
- 'form' => true,
- 'h1' => true,
- 'h2' => true,
- 'h3' => true,
- 'h4' => true,
- 'h5' => true,
- 'h6' => true,
- 'hr' => true,
- 'ins' => true,
- 'isindex' => true,
- 'menu' => true,
- 'noframes' => true,
- 'noscript' => true,
- 'ol' => true,
- 'p' => true,
- 'pre' => true,
- 'table' => true,
- 'ul' => true,
- # set table elements and list items to block as well
- 'thead' => true,
- 'tbody' => true,
- 'tfoot' => true,
- 'td' => true,
- 'tr' => true,
- 'th' => true,
- 'li' => true,
- 'dd' => true,
- 'dt' => true,
- # header items and html / body as well
- 'html' => true,
- 'body' => true,
- 'head' => true,
- 'meta' => true,
- 'link' => true,
- 'style' => true,
- 'title' => true,
- # unfancy media tags, when indented should be rendered as block
- 'map' => true,
- 'object' => true,
- 'param' => true,
- 'embed' => true,
- 'area' => true,
- # inline elements
- 'a' => false,
- 'abbr' => false,
- 'acronym' => false,
- 'applet' => false,
- 'b' => false,
- 'basefont' => false,
- 'bdo' => false,
- 'big' => false,
- 'br' => false,
- 'button' => false,
- 'cite' => false,
- 'code' => false,
- 'del' => false,
- 'dfn' => false,
- 'em' => false,
- 'font' => false,
- 'i' => false,
- 'img' => false,
- 'ins' => false,
- 'input' => false,
- 'iframe' => false,
- 'kbd' => false,
- 'label' => false,
- 'q' => false,
- 'samp' => false,
- 'script' => false,
- 'select' => false,
- 'small' => false,
- 'span' => false,
- 'strong' => false,
- 'sub' => false,
- 'sup' => false,
- 'textarea' => false,
- 'tt' => false,
- 'var' => false,
- );
- /**
- * get next node, set $this->html prior!
- *
- * @param void
- * @return bool
- */
- function nextNode() {
- if (empty($this->html)) {
- # we are done with parsing the html string
- return false;
- }
- static $skipWhitespace = true;
- if ($this->isStartTag && !$this->isEmptyTag) {
- array_push($this->openTags, $this->tagName);
- if (in_array($this->tagName, $this->preformattedTags)) {
- # dont truncate whitespaces for <code> or <pre> contents
- $this->keepWhitespace++;
- }
- }
-
- if ($this->html[0] == '<') {
- $token = substr($this->html, 0, 9);
- if (substr($token, 0, 2) == '<?') {
- # xml prolog or other pi's
- /** TODO **/
- #trigger_error('this might need some work', E_USER_NOTICE);
- $pos = strpos($this->html, '>');
- $this->setNode('pi', $pos + 1);
- return true;
- }
- if (substr($token, 0, 4) == '<!--') {
- # comment
- $pos = strpos($this->html, '-->');
- if ($pos === false) {
- # could not find a closing -->, use next gt instead
- # this is firefox' behaviour
- $pos = strpos($this->html, '>') + 1;
- } else {
- $pos += 3;
- }
- $this->setNode('comment', $pos);
-
- $skipWhitespace = true;
- return true;
- }
- if ($token == '<!DOCTYPE') {
- # doctype
- $this->setNode('doctype', strpos($this->html, '>')+1);
-
- $skipWhitespace = true;
- return true;
- }
- if ($token == '<![CDATA[') {
- # cdata, use text node
-
- # remove leading <![CDATA[
- $this->html = substr($this->html, 9);
-
- $this->setNode('text', strpos($this->html, ']]>')+3);
-
- # remove trailing ]]> and trim
- $this->node = substr($this->node, 0, -3);
- $this->handleWhitespaces();
-
- $skipWhitespace = true;
- return true;
- }
- if ($this->parseTag()) {
- # seems to be a tag
- # handle whitespaces
- if ($this->isBlockElement) {
- $skipWhitespace = true;
- } else {
- $skipWhitespace = false;
- }
- return true;
- }
- }
- if ($this->keepWhitespace) {
- $skipWhitespace = false;
- }
- # when we get here it seems to be a text node
- $pos = strpos($this->html, '<');
- if ($pos === false) {
- $pos = strlen($this->html);
- }
- $this->setNode('text', $pos);
- $this->handleWhitespaces();
- if ($skipWhitespace && $this->node == ' ') {
- return $this->nextNode();
- }
- $skipWhitespace = false;
- return true;
- }
- /**
- * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
- *
- * @param void
- * @return bool
- */
- function parseTag() {
- static $a_ord, $z_ord, $special_ords;
- if (!isset($a_ord)) {
- $a_ord = ord('a');
- $z_ord = ord('z');
- $special_ords = array(
- ord(':'), // for xml:lang
- ord('-'), // for http-equiv
- );
- }
-
- $tagName = '';
-
- $pos = 1;
- $isStartTag = $this->html[$pos] != '/';
- if (!$isStartTag) {
- $pos++;
- }
- # get tagName
- while (isset($this->html[$pos])) {
- $pos_ord = ord(strtolower($this->html[$pos]));
- if (($pos_ord >= $a_ord && $pos_ord <= $z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
- $tagName .= $this->html[$pos];
- $pos++;
- } else {
- $pos--;
- break;
- }
- }
-
- $tagName = strtolower($tagName);
- if (empty($tagName) || !isset($this->blockElements[$tagName])) {
- # something went wrong => invalid tag
- $this->invalidTag();
- return false;
- }
- if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
- # we supress all HTML tags inside code tags
- $this->invalidTag();
- return false;
- }
-
- # get tag attributes
- /** TODO: in html 4 attributes do not need to be quoted **/
- $isEmptyTag = false;
- $attributes = array();
- $currAttrib = '';
- while (isset($this->html[$pos+1])) {
- $pos++;
- # close tag
- if ($this->html[$pos] == '>' || $this->html[$pos].$this->html[$pos+1] == '/>') {
- if ($this->html[$pos] == '/') {
- $isEmptyTag = true;
- $pos++;
- }
- break;
- }
-
- $pos_ord = ord(strtolower($this->html[$pos]));
- if ( ($pos_ord >= $a_ord && $pos_ord <= $z_ord) || in_array($pos_ord, $special_ords)) {
- # attribute name
- $currAttrib .= $this->html[$pos];
- } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
- # drop whitespace
- } elseif (in_array($this->html[$pos].$this->html[$pos+1], array('="', "='"))) {
- # get attribute value
- $pos++;
- $await = $this->html[$pos]; # single or double quote
- $pos++;
- $value = '';
- while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
- $value .= $this->html[$pos];
- $pos++;
- }
- $attributes[$currAttrib] = $value;
- $currAttrib = '';
- } else {
- $this->invalidTag();
- return false;
- }
- }
- if ($this->html[$pos] != '>') {
- $this->invalidTag();
- return false;
- }
-
- if (!empty($currAttrib)) {
- # html 4 allows something like <option selected> instead of <option selected="selected">
- $attributes[$currAttrib] = $currAttrib;
- }
- if (!$isStartTag) {
- if (!empty($attributes) || $tagName != end($this->openTags)) {
- # end tags must not contain any attributes
- # or maybe we did not expect a different tag to be closed
- $this->invalidTag();
- return false;
- }
- array_pop($this->openTags);
- if (in_array($tagName, $this->preformattedTags)) {
- $this->keepWhitespace--;
- }
- }
- $pos++;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- $this->tagName = $tagName;
- $this->tagAttributes = $attributes;
- $this->isStartTag = $isStartTag;
- $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
- if ($this->isEmptyTag) {
- # might be not well formed
- $this->node = preg_replace('# */? *>$#', ' />', $this->node);
- }
- $this->nodeType = 'tag';
- $this->isBlockElement = $this->blockElements[$tagName];
- return true;
- }
- /**
- * handle invalid tags
- *
- * @param void
- * @return void
- */
- function invalidTag() {
- $this->html = substr_replace($this->html, '&lt;', 0, 1);
- }
- /**
- * update all vars and make $this->html shorter
- *
- * @param string $type see description for $this->nodeType
- * @param int $pos to which position shall we cut?
- * @return void
- */
- function setNode($type, $pos) {
- if ($this->nodeType == 'tag') {
- # set tag specific vars to null
- # $type == tag should not be called here
- # see this::parseTag() for more
- $this->tagName = null;
- $this->tagAttributes = null;
- $this->isStartTag = null;
- $this->isEmptyTag = null;
- $this->isBlockElement = null;
-
- }
- $this->nodeType = $type;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- }
- /**
- * check if $this->html begins with $str
- *
- * @param string $str
- * @return bool
- */
- function match($str) {
- return substr($this->html, 0, strlen($str)) == $str;
- }
- /**
- * truncate whitespaces
- *
- * @param void
- * @return void
- */
- function handleWhitespaces() {
- if ($this->keepWhitespace) {
- # <pre> or <code> before...
- return;
- }
- # truncate multiple whitespaces to a single one
- $this->node = preg_replace('#\s+#s', ' ', $this->node);
- }
- /**
- * normalize self::node
- *
- * @param void
- * @return void
- */
- function normalizeNode() {
- $this->node = '<';
- if (!$this->isStartTag) {
- $this->node .= '/'.$this->tagName.'>';
- return;
- }
- $this->node .= $this->tagName;
- foreach ($this->tagAttributes as $name => $value) {
- $this->node .= ' '.$name.'="'.str_replace('"', '&quot;', $value).'"';
- }
- if ($this->isEmptyTag) {
- $this->node .= ' /';
- }
- $this->node .= '>';
- }
-}
-
-/**
- * indent a HTML string properly
- *
- * @param string $html
- * @param string $indent optional
- * @return string
- */
-function indentHTML($html, $indent = " ", $noTagsInCode = false) {
- $parser = new parseHTML;
- $parser->noTagsInCode = $noTagsInCode;
- $parser->html = $html;
- $html = '';
- $last = true; # last tag was block elem
- $indent_a = array();
- while($parser->nextNode()) {
- if ($parser->nodeType == 'tag') {
- $parser->normalizeNode();
- }
- if ($parser->nodeType == 'tag' && $parser->isBlockElement) {
- $isPreOrCode = in_array($parser->tagName, array('code', 'pre'));
- if (!$parser->keepWhitespace && !$last && !$isPreOrCode) {
- $html = rtrim($html)."\n";
- }
- if ($parser->isStartTag) {
- $html .= implode($indent_a);
- if (!$parser->isEmptyTag) {
- array_push($indent_a, $indent);
- }
- } else {
- array_pop($indent_a);
- if (!$isPreOrCode) {
- $html .= implode($indent_a);
- }
- }
- $html .= $parser->node;
- if (!$parser->keepWhitespace && !($isPreOrCode && $parser->isStartTag)) {
- $html .= "\n";
- }
- $last = true;
- } else {
- if ($parser->nodeType == 'tag' && $parser->tagName == 'br') {
- $html .= $parser->node."\n";
- $last = true;
- continue;
- } elseif ($last && !$parser->keepWhitespace) {
- $html .= implode($indent_a);
- $parser->node = ltrim($parser->node);
- }
- $html .= $parser->node;
-
- if (in_array($parser->nodeType, array('comment', 'pi', 'doctype'))) {
- $html .= "\n";
- } else {
- $last = false;
- }
- }
- }
- return $html;
-}
-/*
-# testcase / example
-error_reporting(E_ALL);
-
-$html = '<p>Simple block on one line:</p>
-
-<div>foo</div>
-
-<p>And nested without indentation:</p>
-
-<div>
-<div>
-<div>
-foo
-</div>
-<div style=">"/>
-</div>
-<div>bar</div>
-</div>
-
-<p>And with attributes:</p>
-
-<div>
- <div id="foo">
- </div>
-</div>
-
-<p>This was broken in 1.0.2b7:</p>
-
-<div class="inlinepage">
-<div class="toggleableend">
-foo
-</div>
-</div>';
-#$html = '<a href="asdfasdf" title=\'asdf\' foo="bar">asdf</a>';
-echo indentHTML($html);
-die();
-*/
diff --git a/library/simplepie/demo/cli_test.php b/library/simplepie/demo/cli_test.php
deleted file mode 100644
index ec933c5ad..000000000
--- a/library/simplepie/demo/cli_test.php
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/php
-<?php
-include_once('../simplepie.inc');
-
-// Parse it
-$feed = new SimplePie();
-if (isset($argv[1]) && $argv[1] !== '')
-{
- $feed->set_feed_url($argv[1]);
- $feed->enable_cache(false);
- $feed->init();
-}
-
-$items = $feed->get_items();
-
-foreach ($items as $item)
-{
- echo $item->get_title() . "\n";
-}
-
-var_dump($feed->get_item_quantity());
-
-?> \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/alternate_favicon.png b/library/simplepie/demo/for_the_demo/alternate_favicon.png
deleted file mode 100644
index 063fb2805..000000000
--- a/library/simplepie/demo/for_the_demo/alternate_favicon.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/background_blockquote.png b/library/simplepie/demo/for_the_demo/background_blockquote.png
deleted file mode 100644
index 8267e23a2..000000000
--- a/library/simplepie/demo/for_the_demo/background_blockquote.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/background_menuitem.gif b/library/simplepie/demo/for_the_demo/background_menuitem.gif
deleted file mode 100644
index fa765d670..000000000
--- a/library/simplepie/demo/for_the_demo/background_menuitem.gif
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/background_menuitem_off.gif b/library/simplepie/demo/for_the_demo/background_menuitem_off.gif
deleted file mode 100644
index 236cf406d..000000000
--- a/library/simplepie/demo/for_the_demo/background_menuitem_off.gif
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/background_menuitem_shadow.gif b/library/simplepie/demo/for_the_demo/background_menuitem_shadow.gif
deleted file mode 100644
index 95cfb820d..000000000
--- a/library/simplepie/demo/for_the_demo/background_menuitem_shadow.gif
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/alternate.png b/library/simplepie/demo/for_the_demo/favicons/alternate.png
deleted file mode 100644
index 063fb2805..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/alternate.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/blinklist.png b/library/simplepie/demo/for_the_demo/favicons/blinklist.png
deleted file mode 100644
index 53200b3c6..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/blinklist.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/blogmarks.png b/library/simplepie/demo/for_the_demo/favicons/blogmarks.png
deleted file mode 100644
index c5372614a..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/blogmarks.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/delicious.png b/library/simplepie/demo/for_the_demo/favicons/delicious.png
deleted file mode 100644
index 2e6021d26..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/delicious.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/digg.png b/library/simplepie/demo/for_the_demo/favicons/digg.png
deleted file mode 100644
index 3aa96770e..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/digg.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/magnolia.png b/library/simplepie/demo/for_the_demo/favicons/magnolia.png
deleted file mode 100644
index da519f5ab..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/magnolia.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/myweb2.png b/library/simplepie/demo/for_the_demo/favicons/myweb2.png
deleted file mode 100644
index 2a12968d5..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/myweb2.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/newsvine.png b/library/simplepie/demo/for_the_demo/favicons/newsvine.png
deleted file mode 100644
index 5cdbb31c6..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/newsvine.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/reddit.png b/library/simplepie/demo/for_the_demo/favicons/reddit.png
deleted file mode 100644
index 65c38867c..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/reddit.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/segnalo.png b/library/simplepie/demo/for_the_demo/favicons/segnalo.png
deleted file mode 100644
index 748149b37..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/segnalo.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/simpy.png b/library/simplepie/demo/for_the_demo/favicons/simpy.png
deleted file mode 100644
index 30b23c1a5..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/simpy.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/spurl.png b/library/simplepie/demo/for_the_demo/favicons/spurl.png
deleted file mode 100644
index f5be3963d..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/spurl.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/technorati.png b/library/simplepie/demo/for_the_demo/favicons/technorati.png
deleted file mode 100644
index 0f19e824e..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/technorati.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/favicons/wists.png b/library/simplepie/demo/for_the_demo/favicons/wists.png
deleted file mode 100644
index 2e2d294d1..000000000
--- a/library/simplepie/demo/for_the_demo/favicons/wists.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/feed.png b/library/simplepie/demo/for_the_demo/feed.png
deleted file mode 100644
index e23c50c85..000000000
--- a/library/simplepie/demo/for_the_demo/feed.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/logo_simplepie_demo.png b/library/simplepie/demo/for_the_demo/logo_simplepie_demo.png
deleted file mode 100644
index eda2d868b..000000000
--- a/library/simplepie/demo/for_the_demo/logo_simplepie_demo.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/lucida-grande-bold.swf b/library/simplepie/demo/for_the_demo/lucida-grande-bold.swf
deleted file mode 100644
index 0a41e15eb..000000000
--- a/library/simplepie/demo/for_the_demo/lucida-grande-bold.swf
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/mediaplayer.swf b/library/simplepie/demo/for_the_demo/mediaplayer.swf
deleted file mode 100644
index bf78fd919..000000000
--- a/library/simplepie/demo/for_the_demo/mediaplayer.swf
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/mediaplayer_readme.htm b/library/simplepie/demo/for_the_demo/mediaplayer_readme.htm
deleted file mode 100644
index 56e12c309..000000000
--- a/library/simplepie/demo/for_the_demo/mediaplayer_readme.htm
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<head>
-<meta http-equiv="refresh" content="0;url=http://www.jeroenwijering.com/extras/readme.html">
-</head>
-</html> \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/mini_podcast.png b/library/simplepie/demo/for_the_demo/mini_podcast.png
deleted file mode 100644
index fd6faf2a3..000000000
--- a/library/simplepie/demo/for_the_demo/mini_podcast.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/place_audio.png b/library/simplepie/demo/for_the_demo/place_audio.png
deleted file mode 100644
index 560ea0039..000000000
--- a/library/simplepie/demo/for_the_demo/place_audio.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/place_video.png b/library/simplepie/demo/for_the_demo/place_video.png
deleted file mode 100644
index be5ec8219..000000000
--- a/library/simplepie/demo/for_the_demo/place_video.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/sIFR-print.css b/library/simplepie/demo/for_the_demo/sIFR-print.css
deleted file mode 100644
index ec89b1961..000000000
--- a/library/simplepie/demo/for_the_demo/sIFR-print.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/*=:project
- scalable Inman Flash Replacement (sIFR) version 3.
-
- =:file
- Copyright: 2006 Mark Wubben.
- Author: Mark Wubben, <http://novemberborn.net/>
-
- =:history
- * IFR: Shaun Inman
- * sIFR 1: Mike Davidson, Shaun Inman and Tomas Jogin
- * sIFR 2: Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben
-
- =:license
- This software is licensed and provided under the CC-GNU LGPL.
- See <http://creativecommons.org/licenses/LGPL/2.1/>
-*/
-
-
-/* This is the print stylesheet to hide the Flash headlines from the browser... regular browser text headlines will now print as normal */
-
-.sIFR-flash {
- display: none !important;
- height: 0;
- width: 0;
- position: absolute;
- overflow: hidden;
-}
-
-.sIFR-alternate {
- visibility: visible !important;
- display: block !important;
- position: static !important;
- left: auto !important;
- top: auto !important;
-} \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/sIFR-screen.css b/library/simplepie/demo/for_the_demo/sIFR-screen.css
deleted file mode 100644
index 778e09d2b..000000000
--- a/library/simplepie/demo/for_the_demo/sIFR-screen.css
+++ /dev/null
@@ -1,39 +0,0 @@
-/*=:project
- scalable Inman Flash Replacement (sIFR) version 3.
-
- =:file
- Copyright: 2006 Mark Wubben.
- Author: Mark Wubben, <http://novemberborn.net/>
-
- =:history
- * IFR: Shaun Inman
- * sIFR 1: Mike Davidson, Shaun Inman and Tomas Jogin
- * sIFR 2: Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben
-
- =:license
- This software is licensed and provided under the CC-GNU LGPL.
- See <http://creativecommons.org/licenses/LGPL/2.1/>
-*/
-
-/*---- sIFR ---*/
-.sIFR-flash {
- visibility: visible !important;
- margin: 0;
- padding: 0;
-}
-
-.sIFR-replaced {
- visibility: visible !important;
-}
-
-.sIFR-alternate {
- position: absolute;
- left: 0;
- top: 0;
- width: 0;
- height: 0;
- display: block;
- overflow: hidden;
-}
-
-/*---- Header styling ---*/
diff --git a/library/simplepie/demo/for_the_demo/sifr-config.js b/library/simplepie/demo/for_the_demo/sifr-config.js
deleted file mode 100644
index e7066b361..000000000
--- a/library/simplepie/demo/for_the_demo/sifr-config.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var yanone_kaffeesatz = {
- src: './for_the_demo/yanone-kaffeesatz-bold.swf'
-};
-
-var lucida_grande = {
- src: './for_the_demo/lucida-grande-bold.swf'
-};
-
-sIFR.activate(yanone_kaffeesatz);
-//sIFR.activate(lucida_grande);
-
-sIFR.replace(yanone_kaffeesatz, {
-//sIFR.replace(lucida_grande, {
-
- selector: 'h3.header',
- wmode: 'transparent',
- css: {
- '.sIFR-root': {
- 'text-align': 'center',
- 'color': '#000000',
- 'font-weight': 'bold',
- 'background-color': '#EEFFEE',
-
- 'font-size': '50px', // For Yanone Kaffeesatz
- //'font-size': '40px', // For Lucida Grande
-
- 'letter-spacing': '0' // For Yanone Kaffeesatz
- //'letter-spacing': '-4' // For Lucida Grande
-
- },
- 'a': {
- 'text-decoration': 'none',
- 'color': '#000000'
- },
- 'a:hover': {
- 'text-decoration': 'none',
- 'color': '#666666'
- }
- }
-});
diff --git a/library/simplepie/demo/for_the_demo/sifr.js b/library/simplepie/demo/for_the_demo/sifr.js
deleted file mode 100644
index 0a8b1b6dc..000000000
--- a/library/simplepie/demo/for_the_demo/sifr.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*=:project
- scalable Inman Flash Replacement (sIFR) version 3, revision 245
-
- =:file
- Copyright: 2006 Mark Wubben.
- Author: Mark Wubben, <http://novemberborn.net/>
-
- =:history
- * IFR: Shaun Inman
- * sIFR 1: Mike Davidson, Shaun Inman and Tomas Jogin
- * sIFR 2: Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben
-
- =:license
- This software is licensed and provided under the CC-GNU LGPL.
- See <http://creativecommons.org/licenses/LGPL/2.1/>
-*/
-
-var parseSelector=(function(){var _1=/\s*,\s*/;var _2=/\s*([\s>+~(),]|^|$)\s*/g;var _3=/([\s>+~,]|[^(]\+|^)([#.:@])/g;var _4=/^[^\s>+~]/;var _5=/[\s#.:>+~()@]|[^\s#.:>+~()@]+/g;function parseSelector(_6,_7){_7=_7||document.documentElement;var _8=_6.split(_1),_9=[];for(var i=0;i<_8.length;i++){var _b=[_7],_c=toStream(_8[i]);for(var j=0;j<_c.length;){var _e=_c[j++],_f=_c[j++],_10="";if(_c[j]=="("){while(_c[j++]!=")"&&j<_c.length){_10+=_c[j]}_10=_10.slice(0,-1)}_b=select(_b,_e,_f,_10)}_9=_9.concat(_b)}return _9}function toStream(_11){var _12=_11.replace(_2,"$1").replace(_3,"$1*$2");if(_4.test(_12)){_12=" "+_12}return _12.match(_5)||[]}function select(_13,_14,_15,_16){return (_17[_14])?_17[_14](_13,_15,_16):[]}var _18={toArray:function(_19){var a=[];for(var i=0;i<_19.length;i++){a.push(_19[i])}return a}};var dom={isTag:function(_1d,tag){return (tag=="*")||(tag.toLowerCase()==_1d.nodeName.toLowerCase())},previousSiblingElement:function(_1f){do{_1f=_1f.previousSibling}while(_1f&&_1f.nodeType!=1);return _1f},nextSiblingElement:function(_20){do{_20=_20.nextSibling}while(_20&&_20.nodeType!=1);return _20},hasClass:function(_21,_22){return (_22.className||"").match("(^|\\s)"+_21+"(\\s|$)")},getByTag:function(tag,_24){return _24.getElementsByTagName(tag)}};var _17={"#":function(_25,_26){for(var i=0;i<_25.length;i++){if(_25[i].getAttribute("id")==_26){return [_25[i]]}}return []}," ":function(_28,_29){var _2a=[];for(var i=0;i<_28.length;i++){_2a=_2a.concat(_18.toArray(dom.getByTag(_29,_28[i])))}return _2a},">":function(_2c,_2d){var _2e=[];for(var i=0,_30;i<_2c.length;i++){_30=_2c[i];for(var j=0,_32;j<_30.childNodes.length;j++){_32=_30.childNodes[j];if(_32.nodeType==1&&dom.isTag(_32,_2d)){_2e.push(_32)}}}return _2e},".":function(_33,_34){var _35=[];for(var i=0,_37;i<_33.length;i++){_37=_33[i];if(dom.hasClass([_34],_37)){_35.push(_37)}}return _35},":":function(_38,_39,_3a){return (pseudoClasses[_39])?pseudoClasses[_39](_38,_3a):[]}};parseSelector.selectors=_17;parseSelector.pseudoClasses={};parseSelector.util=_18;parseSelector.dom=dom;return parseSelector})();
-var sIFR=new function(){var _3b=this;var _3c="sIFR-active";var _3d="sIFR-replaced";var _3e="sIFR-replacing";var _3f="sIFR-flash";var _40="sIFR-ignore";var _41="sIFR-alternate";var _42="sIFR-class";var _43="sIFR-layout";var _44=6;var _45=126;var _46=8;var _47="SIFR-PREFETCHED";var _48=[10,1.55,19,1.45,32,1.35,71,1.3,1.25];var _49=5;this.isActive=false;this.isEnabled=true;this.hideElements=true;this.preserveSingleWhitespace=false;this.fixWrap=true;this.fixHover=true;this.registerEvents=true;this.setPrefetchCookie=true;this.cookiePath="/";this.domains=[];this.fromLocal=true;this.forceClear=false;this.forceWidth=false;this.fitExactly=false;this.forceTextTransform=true;this.useDomContentLoaded=true;this.debugMode=false;this.hasFlashClassSet=false;this.delayCss=false;this.callbacks=[];var _4a=0;var _4b=false,_4c=false;var dom=new function(){var _4e="http://www.w3.org/1999/xhtml";this.getBody=function(){var _4f=document.getElementsByTagName("body");if(_4f.length==1){return _4f[0]}return null};this.addClass=function(_50,_51){if(_51){_51.className=((_51.className||"")==""?"":_51.className+" ")+_50}};this.removeClass=function(_52,_53){if(_53){_53.className=_53.className.replace(new RegExp("(^|\\s)"+_52+"(\\s|$)"),"").replace(/^\s+|(\s)\s+/g,"$1")}};this.hasClass=function(_54,_55){return new RegExp("(^|\\s)"+_54+"(\\s|$)").test(_55.className)};this.hasOneOfClassses=function(_56,_57){for(var i=0;i<_56.length;i++){if(this.hasClass(_56[i],_57)){return true}}return false};this.create=function(_59){if(document.createElementNS){return document.createElementNS(_4e,_59)}return document.createElement(_59)};this.setInnerHtml=function(_5a,_5b){if(ua.innerHtmlSupport){_5a.innerHTML=_5b}else{if(ua.xhtmlSupport){_5b=["<root xmlns=\"",_4e,"\">",_5b,"</root>"].join("");var xml=(new DOMParser()).parseFromString(_5b,"text/xml");xml=document.importNode(xml.documentElement,true);while(_5a.firstChild){_5a.removeChild(_5a.firstChild)}while(xml.firstChild){_5a.appendChild(xml.firstChild)}}}};this.nodeFromHtml=function(_5d){var _5e=this.create("div");_5e.innerHTML=_5d;return _5e.firstChild};this.getComputedStyle=function(_5f,_60){var _61;if(document.defaultView&&document.defaultView.getComputedStyle){_61=document.defaultView.getComputedStyle(_5f,null)[_60]}else{if(_5f.currentStyle){_61=_5f.currentStyle[_60]}}return _61||""};this.getStyleAsInt=function(_62,_63,_64){var _65=this.getComputedStyle(_62,_63);if(_64&&!/px$/.test(_65)){return 0}_65=parseInt(_65);return isNaN(_65)?0:_65};this.getZoom=function(){return _66.zoom.getLatest()}};this.dom=dom;var ua=new function(){var ua=navigator.userAgent.toLowerCase();var _69=(navigator.product||"").toLowerCase();this.macintosh=ua.indexOf("mac")>-1;this.windows=ua.indexOf("windows")>-1;this.quicktime=false;this.opera=ua.indexOf("opera")>-1;this.konqueror=_69.indexOf("konqueror")>-1;this.ie=false/*@cc_on || true @*/;this.ieSupported=this.ie&&!/ppc|smartphone|iemobile|msie\s5\.5/.test(ua)/*@cc_on && @_jscript_version >= 5.5 @*/;this.ieWin=this.ie&&this.windows/*@cc_on && @_jscript_version >= 5.1 @*/;this.windows=this.windows&&(!this.ie||this.ieWin);this.ieMac=this.ie&&this.macintosh/*@cc_on && @_jscript_version < 5.1 @*/;this.macintosh=this.macintosh&&(!this.ie||this.ieMac);this.safari=ua.indexOf("safari")>-1;this.webkit=ua.indexOf("applewebkit")>-1&&!this.konqueror;this.khtml=this.webkit||this.konqueror;this.gecko=!this.webkit&&_69=="gecko";this.operaVersion=this.opera&&/.*opera(\s|\/)(\d+\.\d+)/.exec(ua)?parseInt(RegExp.$2):0;this.webkitVersion=this.webkit&&/.*applewebkit\/(\d+).*/.exec(ua)?parseInt(RegExp.$1):0;this.geckoBuildDate=this.gecko&&/.*gecko\/(\d{8}).*/.exec(ua)?parseInt(RegExp.$1):0;this.konquerorVersion=this.konqueror&&/.*konqueror\/(\d\.\d).*/.exec(ua)?parseInt(RegExp.$1):0;this.flashVersion=0;if(this.ieWin){var axo;var _6b=false;try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7")}catch(e){try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");this.flashVersion=6;axo.AllowScriptAccess="always"}catch(e){_6b=this.flashVersion==6}if(!_6b){try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash")}catch(e){}}}if(!_6b&&axo){this.flashVersion=parseFloat(/([\d,?]+)/.exec(axo.GetVariable("$version"))[1].replace(/,/g,"."))}}else{if(navigator.plugins&&navigator.plugins["Shockwave Flash"]){var _6c=navigator.plugins["Shockwave Flash"];this.flashVersion=parseFloat(/(\d+\.?\d*)/.exec(_6c.description)[1]);var i=0;while(this.flashVersion>=_46&&i<navigator.mimeTypes.length){var _6e=navigator.mimeTypes[i];if(_6e.type=="application/x-shockwave-flash"&&_6e.enabledPlugin.description.toLowerCase().indexOf("quicktime")>-1){this.flashVersion=0;this.quicktime=true}i++}}}this.flash=this.flashVersion>=_46;this.transparencySupport=this.macintosh||this.windows;this.computedStyleSupport=this.ie||document.defaultView&&document.defaultView.getComputedStyle&&(!this.gecko||this.geckoBuildDate>=20030624);this.css=true;if(this.computedStyleSupport){try{var _6f=document.getElementsByTagName("head")[0];_6f.style.backgroundColor="#FF0000";var _70=dom.getComputedStyle(_6f,"backgroundColor");this.css=!_70||/\#F{2}0{4}|rgb\(255,\s?0,\s?0\)/i.test(_70);_6f.style.backgroundColor="";_6f=null}catch(e){}}this.xhtmlSupport=!!window.DOMParser&&!!document.importNode;try{var n=dom.create("span");if(!this.ieMac){n.innerHTML="x"}this.innerHtmlSupport=n.innerHTML=="x"}catch(e){this.innerHtmlSupport=false}this.zoomSupport=!!(this.opera&&document.documentElement);this.geckoXml=this.gecko&&(document.contentType||"").indexOf("xml")>-1;this.requiresPrefetch=this.ieWin||this.khtml;this.verifiedKonqueror=false;this.supported=this.flash&&this.css&&(!this.ie||this.ieSupported)&&(!this.opera||this.operaVersion>=8)&&(!this.webkit||this.webkitVersion>=412)&&(!this.konqueror||this.konquerorVersion>3.5)&&this.computedStyleSupport&&(this.innerHtmlSupport||!this.khtml&&this.xhtmlSupport)};this.ua=ua;var _72=new function(){var _73={leading:true,"margin-left":true,"margin-right":true,"text-indent":true};var _74=" ";function capitalize($){return $.toUpperCase()}this.normalize=function(str){if(_3b.preserveSingleWhitespace){return str.replace(/\s/g,_74)}return str.replace(/(\s)\s+/g,"$1").replace(/\xA0/,_74)};this.textTransform=function(_77,str){switch(_77){case "uppercase":str=str.toUpperCase();break;case "lowercase":str=str.toLowerCase();break;case "capitalize":var _79=str;str=str.replace(/^\w|\s\w/g,capitalize);if(str.indexOf("function capitalize")!=-1){var _7a=_79.replace(/(^|\s)(\w)/g,"$1$1$2$2").split(/^\w|\s\w/g);str="";for(var i=0;i<_7a.length;i++){str+=_7a[i].charAt(0).toUpperCase()+_7a[i].substring(1)}}break}return str};this.toHexString=function(str){if(typeof (str)!="string"||!str.charAt(0)=="#"||str.length!=4&&str.length!=7){return str}str=str.replace(/#/,"");if(str.length==3){str=str.replace(/(.)(.)(.)/,"$1$1$2$2$3$3")}return "0x"+str};this.toJson=function(obj){var _7e="";switch(typeof (obj)){case "string":_7e="\""+obj+"\"";break;case "number":case "boolean":_7e=obj.toString();break;case "object":_7e=[];for(var _7f in obj){if(obj[_7f]==Object.prototype[_7f]){continue}_7e.push("\""+_7f+"\":"+_72.toJson(obj[_7f]))}_7e="{"+_7e.join(",")+"}";break}return _7e};this.convertCssArg=function(arg){if(!arg){return {}}if(typeof (arg)=="object"){if(arg.constructor==Array){arg=arg.join("")}else{return arg}}var obj={};var _82=arg.split("}");for(var i=0;i<_82.length;i++){var $=_82[i].match(/([^\s{]+)\s*\{(.+)\s*;?\s*/);if(!$||$.length!=3){continue}if(!obj[$[1]]){obj[$[1]]={}}var _85=$[2].split(";");for(var j=0;j<_85.length;j++){var $2=_85[j].match(/\s*([^:\s]+)\s*\:\s*([^\s;]+)/);if(!$2||$2.length!=3){continue}obj[$[1]][$2[1]]=$2[2]}}return obj};this.extractFromCss=function(css,_89,_8a,_8b){var _8c=null;if(css&&css[_89]&&css[_89][_8a]){_8c=css[_89][_8a];if(_8b){delete css[_89][_8a]}}return _8c};this.cssToString=function(arg){var css=[];for(var _8f in arg){var _90=arg[_8f];if(_90==Object.prototype[_8f]){continue}css.push(_8f,"{");for(var _91 in _90){if(_90[_91]==Object.prototype[_91]){continue}var _92=_90[_91];if(_73[_91]){_92=parseInt(_92,10)}css.push(_91,":",_92,";")}css.push("}")}return escape(css.join(""))};this.bind=function(_93,_94){return function(){_93[_94].apply(_93,arguments)}}};this.util=_72;var _66={};_66.fragmentIdentifier=new function(){this.fix=true;var _95;this.cache=function(){_95=document.title};function doFix(){document.title=_95}this.restore=function(){if(this.fix){setTimeout(doFix,0)}}};_66.synchronizer=new function(){this.isBlocked=false;this.block=function(){this.isBlocked=true};this.unblock=function(){this.isBlocked=false;_96.replaceAll()}};_66.zoom=new function(){var _97=100;this.getLatest=function(){return _97};if(ua.zoomSupport&&ua.opera){var _98=document.createElement("div");_98.style.position="fixed";_98.style.left="-65536px";_98.style.top="0";_98.style.height="100%";_98.style.width="1px";_98.style.zIndex="-32";document.documentElement.appendChild(_98);function updateZoom(){if(!_98){return}var _99=window.innerHeight/_98.offsetHeight;var _9a=Math.round(_99*100)%10;if(_9a>5){_99=Math.round(_99*100)+10-_9a}else{_99=Math.round(_99*100)-_9a}_97=isNaN(_99)?100:_99;_66.synchronizer.unblock();document.documentElement.removeChild(_98);_98=null}_66.synchronizer.block();setTimeout(updateZoom,54)}};this.hacks=_66;var _9b={kwargs:[],replaceAll:function(){for(var i=0;i<this.kwargs.length;i++){_3b.replace(this.kwargs[i])}this.kwargs=[]}};var _96={kwargs:[],replaceAll:_9b.replaceAll};function isValidDomain(){if(_3b.domains.length==0){return true}var _9d="";try{_9d=document.domain}catch(e){}if(_3b.fromLocal&&sIFR.domains[0]!="localhost"){sIFR.domains.unshift("localhost")}for(var i=0;i<_3b.domains.length;i++){var _9f=_3b.domains[i];if(_9f=="*"||_9f==_9d){return true}var _a0=_9f.lastIndexOf("*");if(_a0>-1){_9f=_9f.substr(_a0+1);var _a1=_9d.lastIndexOf(_9f);if(_a1>-1&&(_a1+_9f.length)==_9d.length){return true}}}return false}this.activate=function(){if(!ua.supported||!this.isEnabled||this.isActive||!isValidDomain()){return}if(arguments.length>0){this.prefetch.apply(this,arguments)}this.isActive=true;if(this.hideElements){this.setFlashClass()}if(ua.ieWin&&_66.fragmentIdentifier.fix&&window.location.hash!=""){_66.fragmentIdentifier.cache()}else{_66.fragmentIdentifier.fix=false}if(!this.registerEvents){return}function handler(evt){_3b.initialize();if(evt&&evt.type=="load"){if(document.removeEventListener){document.removeEventListener("DOMContentLoaded",handler,false)}if(window.removeEventListener){window.removeEventListener("load",handler,false)}}}if(window.addEventListener){if(_3b.useDomContentLoaded&&ua.gecko){document.addEventListener("DOMContentLoaded",handler,false)}window.addEventListener("load",handler,false)}else{if(ua.ieWin){if(_3b.useDomContentLoaded){document.write("<scr"+"ipt id=__sifr_ie_onload defer src=//:></script>");document.getElementById("__sifr_ie_onload").onreadystatechange=function(){if(this.readyState=="complete"){handler();this.removeNode()}}}window.attachEvent("onload",handler)}}};this.setFlashClass=function(){if(this.hasFlashClassSet){return}dom.addClass(_3c,dom.getBody()||document.documentElement);this.hasFlashClassSet=true};this.removeFlashClass=function(){if(!this.hasFlashClassSet){return}dom.removeClass(_3c,dom.getBody());dom.removeClass(_3c,document.documentElement);this.hasFlashClassSet=false};this.initialize=function(){if(_4c||!this.isActive||!this.isEnabled){return}_4c=true;_9b.replaceAll();clearPrefetch()};function getSource(src){if(typeof (src)!="string"){if(src.src){src=src.src}if(typeof (src)!="string"){var _a4=[];for(var _a5 in src){if(src[_a5]!=Object.prototype[_a5]){_a4.push(_a5)}}_a4.sort().reverse();var _a6="";var i=-1;while(!_a6&&++i<_a4.length){if(parseFloat(_a4[i])<=ua.flashVersion){_a6=src[_a4[i]]}}src=_a6}}if(!src&&_3b.debugMode){throw new Error("sIFR: Could not determine appropriate source")}if(ua.ie&&src.charAt(0)=="/"){src=window.location.toString().replace(/([^:]+)(:\/?\/?)([^\/]+).*/,"$1$2$3")+src}return src}this.prefetch=function(){if(!ua.requiresPrefetch||!ua.supported||!this.isEnabled||!isValidDomain()){return}if(this.setPrefetchCookie&&new RegExp(";?"+_47+"=true;?").test(document.cookie)){return}try{_4b=true;if(ua.ieWin){prefetchIexplore(arguments)}else{prefetchLight(arguments)}if(this.setPrefetchCookie){document.cookie=_47+"=true;path="+this.cookiePath}}catch(e){if(_3b.debugMode){throw e}}};function prefetchIexplore(_a8){for(var i=0;i<_a8.length;i++){document.write("<script defer type=\"sifr/prefetch\" src=\""+getSource(_a8[i])+"\"></script>")}}function prefetchLight(_aa){for(var i=0;i<_aa.length;i++){new Image().src=getSource(_aa[i])}}function clearPrefetch(){if(!ua.ieWin||!_4b){return}try{var _ac=document.getElementsByTagName("script");for(var i=_ac.length-1;i>=0;i--){var _ae=_ac[i];if(_ae.type=="sifr/prefetch"){_ae.parentNode.removeChild(_ae)}}}catch(e){}}function getRatio(_af,_b0){for(var i=0;i<_b0.length;i+=2){if(_af<=_b0[i]){return _b0[i+1]}}return _b0[_b0.length-1]}function getFilters(obj){var _b3=[];for(var _b4 in obj){if(obj[_b4]==Object.prototype[_b4]){continue}var _b5=obj[_b4];_b4=[_b4.replace(/filter/i,"")+"Filter"];for(var _b6 in _b5){if(_b5[_b6]==Object.prototype[_b6]){continue}_b4.push(_b6+":"+escape(_72.toJson(_72.toHexString(_b5[_b6]))))}_b3.push(_b4.join(","))}return _b3.join(";")}function calculate(_b7){var _b8,_b9;if(!ua.ie){_b8=dom.getStyleAsInt(_b7,"lineHeight");_b9=Math.floor(dom.getStyleAsInt(_b7,"height")/_b8)}else{if(ua.ie){var _ba=_b7.innerHTML;_b7.style.visibility="visible";_b7.style.overflow="visible";_b7.style.position="static";_b7.style.zoom="normal";_b7.style.writingMode="lr-tb";_b7.style.width=_b7.style.height="auto";_b7.style.maxWidth=_b7.style.maxHeight=_b7.style.styleFloat="none";var _bb=_b7;var _bc=_b7.currentStyle.hasLayout;if(_bc){dom.setInnerHtml(_b7,"<div class=\""+_43+"\">X<br />X<br />X</div>");_bb=_b7.firstChild}else{dom.setInnerHtml(_b7,"X<br />X<br />X")}var _bd=_bb.getClientRects();_b8=_bd[1].bottom-_bd[1].top;_b8=Math.ceil(_b8*0.8);if(_bc){dom.setInnerHtml(_b7,"<div class=\""+_43+"\">"+_ba+"</div>");_bb=_b7.firstChild}else{dom.setInnerHtml(_b7,_ba)}_bd=_bb.getClientRects();_b9=_bd.length;if(_bc){dom.setInnerHtml(_b7,_ba)}_b7.style.visibility=_b7.style.width=_b7.style.height=_b7.style.maxWidth=_b7.style.maxHeight=_b7.style.overflow=_b7.style.styleFloat=_b7.style.position=_b7.style.zoom=_b7.style.writingMode=""}}return {lineHeight:_b8,lines:_b9}}this.replace=function(_be,_bf){if(!ua.supported){return}if(_bf){for(var _c0 in _be){if(typeof (_bf[_c0])=="undefined"){_bf[_c0]=_be[_c0]}}_be=_bf}if(!_4c){return _9b.kwargs.push(_be)}if(_66.synchronizer.isBlocked){return _96.kwargs.push(_be)}var _c1=_be.elements;if(!_c1&&parseSelector){_c1=parseSelector(_be.selector)}if(_c1.length==0){return}this.setFlashClass();var src=getSource(_be.src);var css=_72.convertCssArg(_be.css);var _c4=getFilters(_be.filters);var _c5=(_be.forceClear==null)?_3b.forceClear:_be.forceClear;var _c6=(_be.fitExactly==null)?_3b.fitExactly:_be.fitExactly;var _c7=_c6||(_be.forceWidth==null?_3b.forceWidth:_be.forceWidth);var _c8=parseInt(_72.extractFromCss(css,".sIFR-root","leading"))||0;var _c9=_72.extractFromCss(css,".sIFR-root","font-size",true)||0;var _ca=_72.extractFromCss(css,".sIFR-root","background-color",true)||"#FFFFFF";var _cb=_72.extractFromCss(css,".sIFR-root","kerning",true)||"";var _cc=_be.gridFitType||_72.extractFromCss(css,".sIFR-root","text-align")=="right"?"subpixel":"pixel";var _cd=_3b.forceTextTransform?_72.extractFromCss(css,".sIFR-root","text-transform",true)||"none":"none";var _ce=_72.extractFromCss(css,".sIFR-root","opacity",true)||"100";var _cf=_be.pixelFont||false;var _d0=_be.ratios||_48;if(parseInt(_c9).toString()!=_c9&&_c9.indexOf("px")==-1){_c9=0}else{_c9=parseInt(_c9)}if(parseFloat(_ce)<1){_ce=100*parseFloat(_ce)}var _d1=null;var _d2="";if(_c6){_72.extractFromCss(css,".sIFR-root","text-align",true)}if(!_be.modifyCss){_d2=_72.cssToString(css);_d1=_3b.fixHover&&_d2.indexOf("%3Ahover")>-1}var _d3=!ua.opera&&_3b.delayCss;var _d4=_be.wmode||"";if(!_d4){if(_be.transparent){_d4="transparent"}else{if(_be.opaque){_d4="opaque"}}}if(_d4=="transparent"){if(!ua.transparencySupport){_d4="opaque"}else{_ca="transparent"}}for(var i=0;i<_c1.length;i++){var _d6=_c1[i];if(!ua.verifiedKonqueror){if(dom.getComputedStyle(_d6,"lineHeight").match(/e\+08px/)){ua.supported=_3b.isEnabled=false;this.removeFlashClass();return}ua.verifiedKonqueror=true}if(dom.hasOneOfClassses([_3d,_3e,_40,_41],_d6)){continue}var _d7=_d6.offsetHeight;var _d8=_d6.offsetWidth;var _d9=dom.getComputedStyle(_d6,"display");if(!_d7||!_d8||_d9==null||_d9=="none"){continue}if(_c5&&ua.gecko){_d6.style.clear="both"}var _da=null;if(_3b.fixWrap&&ua.ie&&_d9=="block"){_da=_d6.innerHTML;dom.setInnerHtml(_d6,"X")}_d8=dom.getStyleAsInt(_d6,"width",ua.ie);if(_d8==0){var _db=dom.getStyleAsInt(_d6,"paddingRight",true);var _dc=dom.getStyleAsInt(_d6,"paddingLeft",true);var _dd=dom.getStyleAsInt(_d6,"borderRightWidth",true);var _de=dom.getStyleAsInt(_d6,"borderLeftWidth",true);_d8=_d6.offsetWidth-_dc-_db-_de-_dd}if(_da&&_3b.fixWrap&&ua.ie){dom.setInnerHtml(_d6,_da)}var _df,_e0;if(!_c9){var _e1=calculate(_d6);_df=Math.min(_45,Math.max(_44,_e1.lineHeight));if(_cf){_df=Math.max(8,8*Math.round(_df/8))}_e0=_e1.lines;if(isNaN(_e0)||!isFinite(_e0)||_e0==0){_e0=1}if(_e0>1&&_c8){_d7+=Math.round((_e0-1)*_c8)}}else{_df=_c9;_e0=1}_d7=Math.round(_e0*_df);if(_c5&&ua.gecko){_d6.style.clear=""}var _e2=dom.create("span");_e2.className=_41;var _e3=_d6.cloneNode(true);for(var j=0,l=_e3.childNodes.length;j<l;j++){_e2.appendChild(_e3.childNodes[j].cloneNode(true))}if(_be.modifyContent){_be.modifyContent(_e3,_be.selector)}if(_be.modifyCss){_d2=_be.modifyCss(css,_e3,_be.selector)}if(_d1==null){_d1=_3b.fixHover&&_d2.indexOf("%3Ahover")>-1}var _e6=handleContent(_e3,_cd);if(_be.modifyContentString){_e6=_be.modifyContentString(_e6,_be.selector)}if(_e6==""){continue}var _e7=["content="+_e6,"width="+_d8,"height="+_d7,"fitexactly="+(_c6?"true":""),"tunewidth="+(_be.tuneWidth||""),"tuneheight="+(_be.tuneHeight||""),"offsetleft="+(_be.offsetLeft||""),"offsettop="+(_be.offsetTop||""),"thickness="+(_be.thickness||""),"sharpness="+(_be.sharpness||""),"kerning="+_cb,"gridfittype="+_cc,"zoomsupport="+ua.zoomSupport,"flashfilters="+_c4,"opacity="+_ce,"blendmode="+(_be.blendMode||""),"size="+_df,"zoom="+dom.getZoom(),"css="+_d2,"selectable="+(_be.selectable==null?"true":_be.selectable),"lines="+_e0];var _e8=encodeURI(_e7.join("&amp;"));var _e9="sIFR_callback_"+_4a++;var _ea=new CallbackInfo(_e9,_e7,_be.onReplacement,_d1);window[_e9+"_DoFSCommand"]=(function(_eb){return function(_ec,arg){_eb.handle(_ec,arg)}})(_ea);_d7=Math.round(_e0*getRatio(_df,_d0)*_df)+_49;var _ee=_c7?_d8:"100%";var _ef;if(ua.ie){_ef=["<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" id=\"",_e9,"\" sifr=\"true\" width=\"",_ee,"\" height=\"",_d7,"\" class=\"",_3f,"\">","<param name=\"movie\" value=\"",src,"\"></param>","<param name=\"flashvars\" value=\"",_e8,"\"></param>","<param name=\"allowScriptAccess\" value=\"always\"></param>","<param name=\"quality\" value=\"best\"></param>","<param name=\"wmode\" value=\"",_d4,"\"></param>","<param name=\"bgcolor\" value=\"",_ca,"\"></param>","<param name=\"name\" value=\"",_e9,"\"></param>","</object>","<scr","ipt event=FSCommand(info,args) for=",_e9,">",_e9,"_DoFSCommand(info, args);","</","script>"].join("")}else{_ef=["<embed type=\"application/x-shockwave-flash\"",(_d3?" class=\""+_3f+"\"":"")," src=\"",src,"\" quality=\"best\" flashvars=\"",_e8,"\" width=\"",_ee,"\" height=\"",_d7,"\" wmode=\"",_d4,"\" bgcolor=\"",_ca,"\" name=\"",_e9,"\" id=\"",_e9,"\" allowScriptAccess=\"always\" sifr=\"true\"></embed>"].join("")}dom.setInnerHtml(_d6,_ef);_ea.flashNode=_d6.firstChild;_ea.html=_ef;_3b.callbacks.push(_ea);if(_be.selector){if(!_3b.callbacks[_be.selector]){_3b.callbacks[_be.selector]=[_ea]}else{_3b.callbacks[_be.selector].push(_ea)}}_d6.appendChild(_e2);dom.addClass(_d3?_3e:_3d,_d6);_ea.setupFixHover()}_66.fragmentIdentifier.restore()};this.getCallbackByFlashElement=function(_f0){for(var i=0;i<_3b.callbacks.length;i++){if(_3b.callbacks[i].id==_f0.getAttribute("id")){return _3b.callbacks[i]}}};function handleContent(_f2,_f3){var _f4=[],_f5=[];var _f6=_f2.childNodes;var i=0;while(i<_f6.length){var _f8=_f6[i];if(_f8.nodeType==3){var _f9=_72.normalize(_f8.nodeValue);_f9=_72.textTransform(_f3,_f9);_f5.push(_f9.replace(/\%/g,"%25").replace(/\&/g,"%26").replace(/\,/g,"%2C").replace(/\+/g,"%2B"))}if(_f8.nodeType==1){var _fa=[];var _fb=_f8.nodeName.toLowerCase();var _fc=_f8.className||"";if(/\s+/.test(_fc)){if(_fc.indexOf(_42)>-1){_fc=_fc.match("(\\s|^)"+_42+"-([^\\s$]*)(\\s|$)")[2]}else{_fc=_fc.match(/^([^\s]+)/)[1]}}if(_fc!=""){_fa.push("class=\""+_fc+"\"")}if(_fb=="a"){var _fd=_f8.getAttribute("href")||"";var _fe=_f8.getAttribute("target")||"";_fa.push("href=\""+_fd+"\"","target=\""+_fe+"\"")}_f5.push("<"+_fb+(_fa.length>0?" ":"")+escape(_fa.join(" "))+">");if(_f8.hasChildNodes()){_f4.push(i);i=0;_f6=_f8.childNodes;continue}else{if(!/^(br|img)$/i.test(_f8.nodeName)){_f5.push("</",_f8.nodeName.toLowerCase(),">")}}}if(_f4.length>0&&!_f8.nextSibling){do{i=_f4.pop();_f6=_f8.parentNode.parentNode.childNodes;_f8=_f6[i];if(_f8){_f5.push("</",_f8.nodeName.toLowerCase(),">")}}while(i==_f6.length-1&&_f4.length>0)}i++}return _f5.join("").replace(/\n|\r/g,"")}function CallbackInfo(id,vars,_101,_102){this.id=id;this.vars=vars;this._replacementHandler=_101;this._firedReplacementEvent=!(this._replacementHandler!=null);this._fixHover=_102;this._setClasses=!_3b.delayCss;this.html="";this._pings=0}CallbackInfo.prototype.getFlashElement=function(){return document.getElementById(this.id)};CallbackInfo.prototype.handle=function(info,arg){if(/(FSCommand\:)?resize/.test(info)){var _105=this.getFlashElement();var $=arg.split(/\:|,/);_105.setAttribute($[0],$[1]);if($.length>2){_105.setAttribute($[2],$[3])}if(!this._setClasses){if(!ua.ie&&!ua.opera){dom.addClass(_3f,_105)}dom.removeClass(_3e,_105.parentNode);dom.addClass(_3d,_105.parentNode);this._setClasses=true}if(ua.khtml){var _107=_105.offsetHeight}if(!this._firedReplacementEvent){this._replacementHandler(this);this._firedReplacementEvent=true}}else{if(/(FSCommand\:)?resetmovie/.test(info)){this.resetMovie()}else{if(/(FSCommand\:)?ping/.test(info)){if(this._pings>0){this.setupFixHover()}this._pings++}else{if(this.debugHandler&&/(FSCommand\:)?debug/.test(info)){this.debugHandler(info,arg)}}}}};CallbackInfo.prototype.call=function(type,_109){var _10a=this.getFlashElement();if(!_10a){return}_10a.SetVariable("callbackType",type);_10a.SetVariable("callbackValue",_109);_10a.SetVariable("callbackTrigger",true)};CallbackInfo.prototype.replaceText=function(_10b){_10b=escape(_10b);this.call("replacetext",_10b);this.vars[0]="content="+_10b;this.html=this.html.replace(/(flashvars(=|\"\svalue=)\")[^\"]+/,"$1"+encodeURI(this.vars.join("&amp;")))};CallbackInfo.prototype.resetMovie=function(){var _10c=this.getFlashElement();var node=_10c.parentNode;node.replaceChild(dom.nodeFromHtml(this.html),_10c);this.setupFixHover()};CallbackInfo.prototype.setupFixHover=function(){var _10e=this.getFlashElement();if(!this._fixHover||!_10e){return}var node=_10e.parentNode;if(node.addEventListener){node.addEventListener("mouseout",_72.bind(this,"fixHover"),false)}else{if(node.attachEvent){node.attachEvent("onmouseout",_72.bind(this,"fixHover"))}}};CallbackInfo.prototype.fixHover=function(){this.call("resettext")}}; \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/simplepie.css b/library/simplepie/demo/for_the_demo/simplepie.css
deleted file mode 100644
index 3753cb96d..000000000
--- a/library/simplepie/demo/for_the_demo/simplepie.css
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
-Theme Name: SimplePie
-Theme URI: http://simplepie.org
-Description: A simple, yet beautiful theme inspired by several cleanly designed websites.
-Version: 1.4
-Author: Ryan Parman
-Author URI: http://skyzyx.com
-Updated: 21 June 2007
-*/
-
-
-/*********************************************
-HYPERLINK STYLES
-*********************************************/
-a {
- color:#369;
- text-decoration:underline;
- padding:0 1px;
-}
-
-a:hover {
- color:#fff !important;
- background-color:#333;
- text-decoration:none;
- padding:0 1px;
-}
-
-a.nohover {
- text-decoration:none;
- border:none;
-}
-
-a.nohover:hover {
- background-color:transparent;
- border:none;
-}
-
-a.namelink {
- padding:0;
- margin:0;
- overflow:hidden;
- height:1px;
-}
-
-h4 a,
-.sample_feeds a {
- color:#000;
-}
-
-
-/*********************************************
-GENERAL STYLES
-*********************************************/
-body {
- /*font:12px/18px Verdana, sans-serif;*/
- font:14px/1.5em "Lucida Grande", Tahoma, sans-serif;
- letter-spacing:0px;
- color:#333;
- background-color:#fff;
- margin:0;
- padding:0;
-}
-
-div#site {
- width:600px;
- margin:50px auto 0 auto;
-}
-
-h1#logo {
- margin:0;
- padding:0;
- text-align:center;
-}
-
-h1#logo a,
-h1#logo a:hover {
- background-color:transparent;
- text-decoration:none;
- padding:0;
-}
-
-h2.image {
- margin:0;
- padding:0;
- text-align:center;
-}
-
-h3 {
- margin:20px 0 0 0;
- padding:0;
- font-size:1.5em;
-}
-
-h4 {
- margin:20px 0 0 0;
- padding:0;
- font-size:1.2em;
- letter-spacing:-1px;
-}
-
-h5 {
- margin:10px 0 0 0;
- padding:0;
- font-size:1em;
- font-weight:bold;
-}
-
-em {
- font-style:normal;
- background-color:#ffc;
-}
-
-p {
- margin:0;
- padding:5px 0;
-}
-
-ul, ol {
- margin:10px 0 10px 20px;
- padding:0 0 0 15px;
-}
-
-ul li, ol li {
- margin:0 0 7px 0;
- padding:0 0 0 3px;
-}
-
-form {
- margin:0;
- padding:0;
-}
-
-code {
- font-size:1em;
- background-color:#f3f3ff;
- color:#000;
-}
-
-div#site pre {
- background-color:#f3f3ff;
- color:#000080;
- border:1px dotted #000080;
- overflow:auto;
- padding:3px 5px;
-}
-
-blockquote {
- font-size:1em;
- color:#666;
- border-left:4px solid #666;
- margin:10px 0 10px 30px;
- padding:0 5px 0 10px;
- background:#f3f3f3 url(background_blockquote.png) repeat top left;
-}
-
-input, select, textarea {
- font-size:12px;
- line-height:1.2em;
- padding:2px;
-}
-
-input[type=text], select, textarea {
- background-color:#e9f5ff;
- border:1px solid #333;
-}
-
-input[type=text]:focus, select:focus, textarea:focus {
- background-color:#ffe;
-}
-
-.clearLeft {clear:left;}
-.clearRight {clear:right;}
-.clearBoth {clear:both;}
-.hide {display:none;}
-
-
-/*********************************************
-NAVIGATION STYLES
-*********************************************/
-div#header {
- background:#fff url(top_gradient.gif) repeat-x top left;
- margin:0;
- padding:0;
-}
-
-div#header form {
- margin:0;
- padding:0;
-}
-
-div#header div#headerInner {
- margin:0;
- padding:0;
-}
-
-div#header div#headerInner div#logoContainer {}
-
-div#header div#headerInner div#logoContainerInner {
- width:550px;
- margin:0 auto;
- padding:20px;
-}
-
-div#header div#headerInner div#logoContainer div#logo {
- float:left;
- width:200px;
-}
-
-div#header div#headerInner div#logoContainer div#logo a,
-div#header div#headerInner div#logoContainer div#logo a:hover {
- border:none;
- background:none;
-}
-
-div#header div#headerInner div#logoContainer div#feed {
- float:right;
- width:300px;
- text-align:right;
- padding:10px 0 0 0;
-}
-
-div#header div#headerInner div#logoContainer div#feed input.text {
- width:60%;
-}
-
-div#header div#headerInner div#menu {
- background:#eee url(background_menuitem_shadow.gif) repeat-x top left;
- border-top:2px solid #ccc;
- border-bottom:1px solid #ddd;
- text-align:center;
-}
-
-div#header div#headerInner div#menu table {
- width:auto;
- margin:0 auto;
-}
-
-div#header div#headerInner div#menu ul {
- display:block;
- width:100%;
- margin:0 auto;
- padding:0;
- font-size:12px;
-}
-
-div#header div#headerInner div#menu ul li {
- display:block;
- float:left;
-}
-
-div#header div#headerInner div#menu ul li a {
- display:block;
- margin:-2px 0 0 0;
- padding:5px 7px 8px 7px;
- text-decoration:none;
- color:#666 !important;
- background-color:transparent;
-}
-
-div#header div#headerInner div#menu ul li a:hover {
- display:block;
- margin:-2px 0 0 0;
- padding:5px 7px 8px 7px;
- text-decoration:none;
- color:#666;
- background:#fff url(background_menuitem_off.gif) no-repeat bottom right;
-}
-
-body#bodydemo div#header div#headerInner div#menu ul li#demo a {
- display:block;
- margin:-2px 0 0 0;
- padding:5px 7px 8px 7px;
- text-decoration:none;
- color:#333;
- font-weight:bold;
- background:#fff url(background_menuitem.gif) no-repeat bottom right;
-}
-
-
-/*********************************************
-CONTENT STYLES
-*********************************************/
-div.chunk {
- margin:20px 0 0 0;
- padding:0 0 10px 0;
- border-bottom:1px solid #ccc;
-}
-
-div.topchunk {
- margin:0 !important;
-}
-
-.footnote,
-.footnote a {
- font-size:12px;
- line-height:1.3em;
- color:#aaa;
-}
-
-.footnote em {
- background-color:transparent;
- font-style:italic;
-}
-
-.footnote code {
- background-color:transparent;
- font:11px/14px monospace;
- color:#aaa;
-}
-
-p.subscribe {
- background-color:#f3f3f3;
- font-size:12px;
- text-align:center;
-}
-
-p.highlight {
- background-color:#ffc;
- font-size:12px;
- text-align:center;
-}
-
-p.sample_feeds {
- font-size:12px;
- line-height:1.2em;
-}
-
-div.sp_errors {
- background-color:#eee;
- padding:5px;
- text-align:center;
- font-size:12px;
-}
-
-.noborder {
- border:none !important;
-}
-
-img.favicon {
- margin:0 4px -2px 0;
- width:16px;
- height:16px;
-}
-
-p.favicons a,
-p.favicons a:hover {
- border:none;
- background-color:transparent;
-}
-
-p.favicons img {
- border:none;
-}
-
-
-/*********************************************
-DEMO STYLES
-*********************************************/
-div#sp_input {
- background-color:#ffc;
- border:2px solid #f90;
- padding:5px;
- text-align:center;
-}
-
-div#sp_input input.text {
- border:1px solid #999;
- background:#e9f5ff url(feed.png) no-repeat 4px 50%;
- width:75%;
- padding:2px 2px 2px 28px;
- font:18px/22px "Lucida Grande", Verdana, sans-serif;
- font-weight:bold;
- letter-spacing:-1px;
-}
-
-form#sp_form {
- margin:15px 0;
-}
-
-div.focus {
- margin:0;
- padding:10px 20px;
- background-color:#efe;
-}
-
-p.sample_feeds {
- text-align:justify;
-}
-
-
-/*********************************************
-SIFR STYLES
-*********************************************/
-.sIFR-active h3.header {
- visibility:hidden;
- line-height:1em;
-}
diff --git a/library/simplepie/demo/for_the_demo/sleight.js b/library/simplepie/demo/for_the_demo/sleight.js
deleted file mode 100644
index 4b5058e9a..000000000
--- a/library/simplepie/demo/for_the_demo/sleight.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**********************************************************
-Sleight
-(c) 2001, Aaron Boodman
-http://www.youngpup.net
-**********************************************************/
-
-if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent)
-{
- document.writeln('<style type="text/css">img { visibility:hidden; } </style>');
- window.attachEvent("onload", fnLoadPngs);
-}
-
-function fnLoadPngs()
-{
- var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
- var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5);
-
- for (var i = document.images.length - 1, img = null; (img = document.images[i]); i--)
- {
- if (itsAllGood && img.src.match(/\.png$/i) != null)
- {
- var src = img.src;
- var div = document.createElement("DIV");
- div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizing='scale')"
- div.style.width = img.width + "px";
- div.style.height = img.height + "px";
- img.replaceNode(div);
- }
- img.style.visibility = "visible";
- }
-}
diff --git a/library/simplepie/demo/for_the_demo/source_files/place_audio_fireworksfile.png b/library/simplepie/demo/for_the_demo/source_files/place_audio_fireworksfile.png
deleted file mode 100644
index 2bfd87d0c..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/place_audio_fireworksfile.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/source_files/place_video_fireworksfile.png b/library/simplepie/demo/for_the_demo/source_files/place_video_fireworksfile.png
deleted file mode 100644
index d0629769c..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/place_video_fireworksfile.png
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/SifrStyleSheet.as b/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/SifrStyleSheet.as
deleted file mode 100644
index 6a98ca552..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/SifrStyleSheet.as
+++ /dev/null
@@ -1,71 +0,0 @@
-/*=:project
- scalable Inman Flash Replacement (sIFR) version 3.
-
- =:file
- Copyright: 2006 Mark Wubben.
- Author: Mark Wubben, <http://novemberborn.net/>
-
- =:history
- * IFR: Shaun Inman
- * sIFR 1: Mike Davidson, Shaun Inman and Tomas Jogin
- * sIFR 2: Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben
-
- =:license
- This software is licensed and provided under the CC-GNU LGPL.
- See <http://creativecommons.org/licenses/LGPL/2.1/>
-*/
-
-import TextField.StyleSheet;
-
-class SifrStyleSheet extends TextField.StyleSheet {
- public var fontSize;
- public var latestLeading = 0;
-
- public function parseCSS(cssText:String) {
- var native = new TextField.StyleSheet();
- var parsed = native.parseCSS(cssText);
-
- if(!parsed) return false;
-
- var selectors = native.getStyleNames();
- for(var i = selectors.length - 1; i >= 0; i--) {
- var selector = selectors[i];
- var nativeStyle = native.getStyle(selector);
- var style = this.getStyle(selector) || nativeStyle;
- if(style != nativeStyle) {
- for(var property in nativeStyle) style[property] = nativeStyle[property];
- }
- this.setStyle(selector, style);
- }
-
- return true;
- }
-
- // Apply leading to the textFormat. Much thanks to <http://www.blog.lessrain.com/?p=98>.
- private function applyLeading(format, leading) {
- this.latestLeading = leading;
-
- if(leading >= 0) {
- format.leading = leading;
- return format;
- }
-
- // Workaround for negative leading, which is ignored otherwise.
- var newFormat = new TextFormat(null, null, null, null, null, null, null, null, null, null, null, null, leading);
- for(var property in format) if(property != 'leading') newFormat[property] = format[property];
-
- return newFormat;
- }
-
- public function transform(style) {
- var format = super.transform(style);
- if(style.leading) format = applyLeading(format, style.leading);
- if(style.letterSpacing) format.letterSpacing = style.letterSpacing;
- // Support font sizes relative to the size of .sIFR-root.
- if(this.fontSize && style.fontSize && style.fontSize.indexOf('%')) {
- format.size = this.fontSize * parseInt(style.fontSize) / 100;
- }
- format.kerning = _root.kerning == 'true' || !(_root.kerning == 'false') || sIFR.defaultKerning;
- return format;
- }
-} \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/_README_.txt b/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/_README_.txt
deleted file mode 100644
index 2b9d32d20..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/_README_.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-This is a pre-release nightly of sIFR 3 (r245 to be exact). We (the SimplePie team) will be updating the
-sIFR code and font files from time to time as new releases of sIFR 3 are made available.
-
-In this folder you'll find a few Flash 8 files. The only one of you might want to mess with is sifr.fla.
- * Open it up
- * Double-click the rectangle in the middle
- * Select all
- * Change the font
-
-More information about sIFR 3 can be found here:
- * http://dev.novemberborn.net/sifr3/
- * http://wiki.novemberborn.net/sifr3/ \ No newline at end of file
diff --git a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/options.as b/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/options.as
deleted file mode 100644
index 4d371954b..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/options.as
+++ /dev/null
@@ -1,12 +0,0 @@
-// MTASC only parses as-files with class definitions, so here goes...
-class Options {
- public static function apply() {
- sIFR.fromLocal = true;
- sIFR.domains = ['*'];
-
- // Parsing `p.foo` might not work, see: <http://livedocs.macromedia.com/flash/mx2004/main_7_2/wwhelp/wwhimpl/common/html/wwhelp.htm?context=Flash_MX_2004&file=00001766.html>
- // Appearantly you have to use hex color codes as well, names are not supported!
-
- sIFR.styles.parseCSS('.foo { text-decoration: underline; }');
- }
-}
diff --git a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sIFR.as b/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sIFR.as
deleted file mode 100644
index 4902e003f..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sIFR.as
+++ /dev/null
@@ -1,359 +0,0 @@
-/*=:project
- scalable Inman Flash Replacement (sIFR) version 3.
-
- =:file
- Copyright: 2006 Mark Wubben.
- Author: Mark Wubben, <http://novemberborn.net/>
-
- =:history
- * IFR: Shaun Inman
- * sIFR 1: Mike Davidson, Shaun Inman and Tomas Jogin
- * sIFR 2: Mike Davidson, Shaun Inman, Tomas Jogin and Mark Wubben
-
- =:license
- This software is licensed and provided under the CC-GNU LGPL.
- See <http://creativecommons.org/licenses/LGPL/2.1/>
-*/
-
-import SifrStyleSheet;
-
-class sIFR {
- public static var DEFAULT_TEXT = 'Rendered with sIFR 3, revision 245';
- public static var CSS_ROOT_CLASS = 'sIFR-root';
- public static var DEFAULT_WIDTH = 300;
- public static var DEFAULT_HEIGHT = 100;
- public static var DEFAULT_ANTI_ALIAS_TYPE = 'advanced';
- public static var MARGIN_LEFT = -3;
- public static var PADDING_BOTTOM = 5; // Extra padding to make sure the movie is high enough in most cases.
- public static var LEADING_REMAINDER = 2; // Flash uses the specified leading minus 2 as the applied leading.
-
- public static var MAX_FONT_SIZE = 126;
- public static var ALIASING_MAX_FONT_SIZE = 48;
-
- //= Holds CSS properties and other rendering properties for the Flash movie.
- // *Don't overwrite!*
- public static var styles:SifrStyleSheet = new SifrStyleSheet();
- //= Allow sIFR to be run from localhost
- public static var fromLocal:Boolean = true;
- //= Array containing domains for which sIFR may render text. Used to prevent
- // hotlinking. Use `*` to allow all domains.
- public static var domains:Array = [];
- //= Whether kerning is enabled by default. This can be overriden from the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002811.html>.
- public static var defaultKerning:Boolean = true;
- //= Default value which can be overriden from the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002788.html>.
- public static var defaultSharpness:Number = 0;
- //= Default value which can be overriden from the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002787.html>.
- public static var defaultThickness:Number = 0;
- //= Default value which can be overriden from the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002732.html>.
- public static var defaultOpacity:Number = -1; // Use client settings
- //= Default value which can be overriden from the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002788.html>.
- public static var defaultBlendMode:Number = -1; // Use cliest settings
- //= Overrides the grid fit type as defined on the client side.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002444.html>.
- public static var enforcedGridFitType:String = null;
- //= If `true` sIFR won't override the anti aliasing set in the Flash IDE when exporting.
- // Thickness and sharpness won't be affected either.
- public static var preserveAntiAlias:Boolean = false;
- //= If `true` sIFR will disable anti-aliasing if the font size is larger than `ALIASING_MAX_FONT_SIZE`.
- // This setting is *independent* from `preserveAntiAlias`.
- public static var conditionalAntiAlias:Boolean = true;
- //= Sets the anti alias type. By default it's `DEFAULT_ANTI_ALIAS_TYPE`.
- // See also <http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002733.html>.
- public static var antiAliasType:String = null;
- //= Flash filters can be added to this array and will be applied to the text field.
- public static var filters:Array = [];
- //= A mapping from the names of the filters to their actual objecs, used when transforming
- // filters defined on the client. You can add additional filters here so they'll be supported
- // when defined on the client.
- public static var filterMap:Object = {
- DisplacementMapFilter : flash.filters.DisplacementMapFilter,
- ColorMatrixFilter : flash.filters.ColorMatrixFilter,
- ConvolutionFilter : flash.filters.ConvolutionFilter,
- GradientBevelFilter : flash.filters.GradientBevelFilter,
- GradientGlowFilter : flash.filters.GradientGlowFilter,
- BevelFilter : flash.filters.BevelFilter,
- GlowFilter : flash.filters.GlowFilter,
- BlurFilter : flash.filters.BlurFilter,
- DropShadowFilter : flash.filters.DropShadowFilter
- };
-
- private static var instance;
-
- private var textField;
- private var content;
- private var realHeight;
- private var originalHeight;
- private var currentHeight;
- private var fontSize;
- private var tuneWidth;
- private var tuneHeight;
-
-
-
- //= Sets the default styles for `sIFR.styles`. This method is called
- // directly in `sifr.fla`, before options are applied.
- public static function setDefaultStyles() {
- sIFR.styles.parseCSS([
- '.', CSS_ROOT_CLASS, ' { color: #000000; }',
- 'strong { display: inline; font-weight: bold; } ',
- 'em { display: inline; font-style: italic; }',
- 'a { color: #0000FF; text-decoration: underline; }',
- 'a:hover { color: #0000FF; text-decoration: none; }'
- ].join(''));
- }
-
- //= Validates the domain sIFR is being used on.
- // Returns `true` if the domain is valid, `false` otherwise.
- public static function checkDomain():Boolean {
- if(sIFR.domains.length == 0) return true;
-
- var domain = (new LocalConnection()).domain();
- if(sIFR.fromLocal) sIFR.domains.push('localhost');
-
- for(var i = 0; i < sIFR.domains.length; i++) {
- var match = sIFR.domains[i];
- if(match == '*' || match == domain) return true;
-
- var wildcard = match.lastIndexOf('*');
- if(wildcard > -1) {
- match = match.substr(wildcard + 1);
- var matchPosition = domain.lastIndexOf(match);
- if(matchPosition > -1 && (matchPosition + match.length) == domain.length) return true;
- }
- }
-
- return false;
- }
-
- //= Runs sIFR. Called automatically.
- public static function run() {
- var holder = _root.holder;
- var content = checkDomain() ? unescape(_root.content) : DEFAULT_TEXT
- if(content == 'undefined' || content == '') {
- content = DEFAULT_TEXT;
- fscommand('resetmovie', '');
- } else fscommand('ping', '');
-
- // Sets stage parameters
- Stage.scaleMode = 'noscale';
- Stage.align = 'TL';
- Stage.showMenu = false;
-
- // Other parameters
- var opacity = parseInt(_root.opacity);
- if(!isNaN(opacity)) holder._alpha = sIFR.defaultOpacity == -1 ? opacity : sIFR.defaultOpacity;
- else holder._alpha = 100;
- _root.blendMode = sIFR.defaultBlendMode == -1 ? _root.blendmode : sIFR.defaultBlendMode;
-
- sIFR.instance = new sIFR(holder.txtF, content);
- // This should ignore resizes from the callback. Disabled for now.
-/* if(_root.zoomsupport == 'true') Stage.addListener({onResize: function() { sIFR.instance.scale() }});*/
-
- // Setup callbacks
- _root.watch('callbackTrigger', function() {
- sIFR.callback();
- return false;
- });
- }
-
- private static function eval(str) {
- var as;
-
- if(str.charAt(0) == '{') { // Ah, we need to create an object
- as = {};
- str = str.substring(1, str.length - 1);
- var $ = str.split(',');
- for(var i = 0; i < $.length; i++) {
- var $1 = $[i].split(':');
- as[$1[0]] = sIFR.eval($1[1]);
- }
- } else if(str.charAt(0) == '"') { // String
- as = str.substring(1, str.length - 1);
- } else if(str == 'true' || str == 'false') { // Boolean
- as = str == 'true';
- } else { // Float
- as = parseFloat(str);
- }
-
- return as;
- }
-
- private function applyFilters() {
- var $filters = this.textField.filters;
- $filters = $filters.concat(sIFR.filters);
-
- var $ = _root.flashfilters.split(';'); // name,prop:value,...;
- for(var i = 0; i < $.length; i++) {
- var $1 = $[i].split(',');
-
- var newFilter = new sIFR.filterMap[$1[0]]();
- for(var j = 1; j < $1.length; j++) {
- var $2 = $1[j].split(':');
- newFilter[$2[0]] = sIFR.eval(unescape($2[1]));
- }
-
- $filters.push(newFilter);
- }
-
- this.textField.filters = $filters;
- }
-
- private function sIFR(textField, content) {
- this.textField = textField;
- this.content = content;
-
- var offsetLeft = parseInt(_root.offsetleft);
- textField._x = MARGIN_LEFT + (isNaN(offsetLeft) ? 0 : offsetLeft);
- var offsetTop = parseInt(_root.offsettop);
- if(!isNaN(offsetTop)) textField._y += offsetTop;
-
- tuneWidth = parseInt(_root.tunewidth);
- if(isNaN(tuneWidth)) tuneWidth = 0;
- tuneHeight = parseInt(_root.tuneheight);
- if(isNaN(tuneHeight)) tuneHeight = 0;
-
- textField._width = tuneWidth + (isNaN(parseInt(_root.width)) ? DEFAULT_WIDTH : parseInt(_root.width));
- textField._height = tuneHeight + (isNaN(parseInt(_root.height)) ? DEFAULT_HEIGHT : parseInt(_root.height));
- textField.wordWrap = true;
- textField.selectable = _root.selectable == 'true';
- textField.gridFitType = sIFR.enforcedGridFitType || _root.gridfittype;
- this.applyFilters();
-
- // Determine font-size and the number of lines
- this.fontSize = parseInt(_root.size);
- if(isNaN(this.fontSize)) this.fontSize = 26;
- styles.fontSize = this.fontSize;
-
- if(!sIFR.preserveAntiAlias && (sIFR.conditionalAntiAlias && this.fontSize < ALIASING_MAX_FONT_SIZE
- || !sIFR.conditionalAntiAlias)) {
- textField.antiAliasType = sIFR.antiAliasType || DEFAULT_ANTI_ALIAS_TYPE;
- }
-
- if(!sIFR.preserveAntiAlias || !isNaN(parseInt(_root.sharpness))) {
- textField.sharpness = parseInt(_root.sharpness);
- }
- if(isNaN(textField.sharpness)) textField.sharpness = sIFR.defaultSharpness;
-
- if(!sIFR.preserveAntiAlias || !isNaN(parseInt(_root.thickness))) {
- textField.thickness = parseInt(_root.thickness);
- }
- if(isNaN(textField.thickness)) textField.thickness = sIFR.defaultThickness;
-
- // Set font-size and other styles
- sIFR.styles.parseCSS(unescape(_root.css));
-
- var rootStyle = styles.getStyle('.sIFR-root') || {};
- rootStyle.fontSize = this.fontSize; // won't go higher than 126!
- styles.setStyle('.sIFR-root', rootStyle);
- textField.styleSheet = styles;
-
- this.write(content);
- this.repaint();
- }
-
- private function repaint() {
- var leadingFix = this.isSingleLine() ? sIFR.styles.latestLeading : 0;
- if(leadingFix > 0) leadingFix -= LEADING_REMAINDER;
-
- // Flash wants to scroll the movie by one line, by adding the fontSize to the
- // textField height this is no longer happens. We also add the absolute tuneHeight,
- // to prevent a negative value from triggering the bug. We won't send the fake
- // value to the JavaScript side, though.
- textField._height = textField.textHeight + PADDING_BOTTOM + this.fontSize + Math.abs(tuneHeight) + tuneHeight - leadingFix;
- this.realHeight = textField._height - this.fontSize - Math.abs(tuneHeight);
- var arg = 'height:' + this.realHeight;
- if(_root.fitexactly == 'true') arg += ',width:' + (textField.textWidth + tuneWidth);
- fscommand('resize', arg);
-
- this.originalHeight = textField._height;
- this.currentHeight = Stage.height;
-
- textField._xscale = textField._yscale = parseInt(_root.zoom);
- }
-
- private function write(content) {
- this.textField.htmlText = ['<p class="', CSS_ROOT_CLASS, '">',
- content, '</p>'
- ].join('');
- }
-
- private function isSingleLine() {
- return Math.round((this.textField.textHeight - sIFR.styles.latestLeading) / this.fontSize) == 1;
- }
-
- //= Scales the text field to the new scale of the Flash movie itself.
- public function scale() {
- this.currentHeight = Stage.height;
- var scale = 100 * Math.round(this.currentHeight / this.originalHeight);
- textField._xscale = textField._yscale = scale;
- }
-
- private function calculateRatios() {
- var strings = ['X', 'X<br>X', 'X<br>X<br>X', 'X<br>X<br>X<br>X'];
- var results = {};
-
- for(var i = 1; i <= strings.length; i++) {
- var size = 6;
-
- this.write(strings[i - 1]);
- while(size < MAX_FONT_SIZE) {
- var rootStyle = sIFR.styles.getStyle('.sIFR-root') || {};
- rootStyle.fontSize = size;
- sIFR.styles.setStyle('.sIFR-root', rootStyle);
- this.textField.styleSheet = sIFR.styles;
- this.repaint();
- var ratio = (this.realHeight - PADDING_BOTTOM) / i / size;
- if(!results[size]) results[size] = ratio;
- else results[size] = ((i - 1) * results[size] + ratio) / i;
- size++;
- }
- }
-
- var sizes = [], ratios = [];
- var ratiosToSizes = {}, sizesToRatios = {};
-
- for(var size in results) {
- if(results[size] == Object.prototype[size]) continue;
- var ratio = results[size];
- ratiosToSizes[ratio] = Math.max(ratio, parseInt(size));
- }
-
- for(var ratio in ratiosToSizes) {
- if(ratiosToSizes[ratio] == Object.prototype[ratio]) continue;
- sizesToRatios[ratiosToSizes[ratio]] = roundDecimals(ratio, 2);
- sizes.push(ratiosToSizes[ratio]);
- }
-
- sizes.sort(function(a, b) { return a - b; });
- for(var j = 0; j < sizes.length - 1; j++) ratios.push(sizes[j], sizesToRatios[sizes[j]]);
- ratios.push(sizesToRatios[sizes[sizes.length - 1]]);
-
- fscommand('debug:ratios', '[' + ratios.join(',') + ']');
- }
-
- private function roundDecimals(value, decimals) {
- return Math.round(value * Math.pow(10, decimals)) / Math.pow(10, decimals);
- }
-
- public static function callback() {
- switch(_root.callbackType) {
- case 'replacetext':
- sIFR.instance.content = _root.callbackValue;
- sIFR.instance.write(_root.callbackValue);
- sIFR.instance.repaint();
- break;
- case 'resettext':
- sIFR.instance.write('');
- sIFR.instance.write(sIFR.instance.content);
- break;
- case 'ratios':
- sIFR.instance.calculateRatios();
- break;
- }
- }
-}
diff --git a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sifr.fla b/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sifr.fla
deleted file mode 100644
index 2aa3f647f..000000000
--- a/library/simplepie/demo/for_the_demo/source_files/sIFR-r245/sifr.fla
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/top_gradient.gif b/library/simplepie/demo/for_the_demo/top_gradient.gif
deleted file mode 100644
index f77bd38f9..000000000
--- a/library/simplepie/demo/for_the_demo/top_gradient.gif
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/verdana.swf b/library/simplepie/demo/for_the_demo/verdana.swf
deleted file mode 100644
index baf035047..000000000
--- a/library/simplepie/demo/for_the_demo/verdana.swf
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/for_the_demo/yanone-kaffeesatz-bold.swf b/library/simplepie/demo/for_the_demo/yanone-kaffeesatz-bold.swf
deleted file mode 100644
index c812a79dc..000000000
--- a/library/simplepie/demo/for_the_demo/yanone-kaffeesatz-bold.swf
+++ /dev/null
Binary files differ
diff --git a/library/simplepie/demo/handler_image.php b/library/simplepie/demo/handler_image.php
deleted file mode 100644
index 49c3ec89b..000000000
--- a/library/simplepie/demo/handler_image.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-// This should be modifed as your own use warrants.
-
-require_once('../simplepie.inc');
-SimplePie_Misc::display_cached_file($_GET['i'], './cache', 'spi');
-?>
diff --git a/library/simplepie/demo/index.php b/library/simplepie/demo/index.php
deleted file mode 100644
index 1481ba917..000000000
--- a/library/simplepie/demo/index.php
+++ /dev/null
@@ -1,295 +0,0 @@
-<?php
-// Start counting time for the page load
-$starttime = explode(' ', microtime());
-$starttime = $starttime[1] + $starttime[0];
-
-// Include SimplePie
-// Located in the parent directory
-include_once('../simplepie.inc');
-include_once('../idn/idna_convert.class.php');
-
-// Create a new instance of the SimplePie object
-$feed = new SimplePie();
-
-//$feed->force_fsockopen(true);
-
-// Make sure that page is getting passed a URL
-if (isset($_GET['feed']) && $_GET['feed'] !== '')
-{
- // Strip slashes if magic quotes is enabled (which automatically escapes certain characters)
- if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
- {
- $_GET['feed'] = stripslashes($_GET['feed']);
- }
-
- // Use the URL that was passed to the page in SimplePie
- $feed->set_feed_url($_GET['feed']);
-
- // XML dump
- $feed->enable_xml_dump(isset($_GET['xmldump']) ? true : false);
-}
-
-// Allow us to change the input encoding from the URL string if we want to. (optional)
-if (!empty($_GET['input']))
-{
- $feed->set_input_encoding($_GET['input']);
-}
-
-// Allow us to choose to not re-order the items by date. (optional)
-if (!empty($_GET['orderbydate']) && $_GET['orderbydate'] == 'false')
-{
- $feed->enable_order_by_date(false);
-}
-
-// Allow us to cache images in feeds. This will also bypass any hotlink blocking put in place by the website.
-if (!empty($_GET['image']) && $_GET['image'] == 'true')
-{
- $feed->set_image_handler('./handler_image.php');
-}
-
-// We'll enable the discovering and caching of favicons.
-$feed->set_favicon_handler('./handler_image.php');
-
-// Initialize the whole SimplePie object. Read the feed, process it, parse it, cache it, and
-// all that other good stuff. The feed's information will not be available to SimplePie before
-// this is called.
-$success = $feed->init();
-
-// We'll make sure that the right content type and character encoding gets set automatically.
-// This function will grab the proper character encoding, as well as set the content type to text/html.
-$feed->handle_content_type();
-
-// When we end our PHP block, we want to make sure our DOCTYPE is on the top line to make
-// sure that the browser snaps into Standards Mode.
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
-<head>
-<title>SimplePie: Demo</title>
-
-<link rel="stylesheet" href="./for_the_demo/sIFR-screen.css" type="text/css" media="screen">
-<link rel="stylesheet" href="./for_the_demo/sIFR-print.css" type="text/css" media="print">
-<link rel="stylesheet" href="./for_the_demo/simplepie.css" type="text/css" media="screen, projector" />
-
-<script type="text/javascript" src="./for_the_demo/sifr.js"></script>
-<script type="text/javascript" src="./for_the_demo/sifr-config.js"></script>
-<script type="text/javascript" src="./for_the_demo/sleight.js"></script>
-
-</head>
-
-<body id="bodydemo">
-
-<div id="header">
- <div id="headerInner">
- <div id="logoContainer">
- <div id="logoContainerInner">
- <div align="center"><a href="http://simplepie.org"><img src="./for_the_demo/logo_simplepie_demo.png" alt="SimplePie Demo: PHP-based RSS and Atom feed handling" title="SimplePie Demo: PHP-based RSS and Atom feed handling" border="0" /></a></div>
- <div class="clearLeft"></div>
- </div>
-
- </div>
- <div id="menu">
- <!-- I know, I know, I know... tables for layout, I know. If a web standards evangelist (like me) has to resort
- to using tables for something, it's because no other possible solution could be found. This issue? No way to
- do centered floats purely with CSS. The table box model allows for a dynamic width while centered, while the
- CSS box model for DIVs doesn't allow for it. :( -->
- <table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td>
-<ul><li id="demo"><a href="./">SimplePie Demo</a></li><li><a href="http://simplepie.org/wiki/faq/start">FAQ/Troubleshooting</a></li><li><a href="http://simplepie.org/support/">Support Forums</a></li><li><a href="http://simplepie.org/wiki/reference/start">API Reference</a></li><li><a href="http://simplepie.org/blog/">Weblog</a></li><li><a href="../test/test.php">Unit Tests</a></li></ul>
-
- <div class="clearLeft"></div>
- </td></tr></tbody></table>
- </div>
- </div>
-</div>
-
-<div id="site">
-
- <div id="content">
-
- <div class="chunk">
- <form action="" method="get" name="sp_form" id="sp_form">
- <div id="sp_input">
-
-
- <!-- If a feed has already been passed through the form, then make sure that the URL remains in the form field. -->
- <p><input type="text" name="feed" value="<?php if ($feed->subscribe_url()) echo $feed->subscribe_url(); ?>" class="text" id="feed_input" />&nbsp;<input type="submit" value="Read" class="button" /></p>
-
-
- </div>
- </form>
-
-
- <?php
- // Check to see if there are more than zero errors (i.e. if there are any errors at all)
- if ($feed->error())
- {
- // If so, start a <div> element with a classname so we can style it.
- echo '<div class="sp_errors">' . "\r\n";
-
- // ... and display it.
- echo '<p>' . htmlspecialchars($feed->error()) . "</p>\r\n";
-
- // Close the <div> element we opened.
- echo '</div>' . "\r\n";
- }
- ?>
-
- <!-- Here are some sample feeds. -->
- <p class="sample_feeds"><strong>Or try one of the following:</strong>
- <a href="?feed=http://www.詹姆斯.com/atomtests/iri/everything.atom" title="Test: International Domain Name support">詹姆斯.com</a>,
- <a href="?feed=http://www.adultswim.com/williams/podcast/tools/xml/video_rss.xml" title="Humor from the people who make [adult swim] cartoons.">adult swim</a>,
- <a href="?feed=http://afterdawn.com/news/afterdawn_rss.xml" title="Ripping, Burning, DRM, and the Dark Side of Consumer Electronics Media">Afterdawn</a>,
- <a href="?feed=http://feeds.feedburner.com/ajaxian" title="AJAX and Scripting News">Ajaxian</a>,
- <a href="?feed=http://www.andybudd.com/index.rdf&amp;image=true" title="Test: Bypass Image Hotlink Blocking">Andy Budd</a>,
- <a href="?feed=http://feeds.feedburner.com/AskANinja" title="Test: Embedded Enclosures">Ask a Ninja</a>,
- <a href="?feed=http://www.atomenabled.org/atom.xml" title="Test: Atom 1.0 Support">AtomEnabled.org</a>,
- <a href="?feed=http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml" title="World News">BBC News</a>,
- <a href="?feed=http://newsrss.bbc.co.uk/rss/arabic/news/rss.xml" title="Test: Windows-1256 Encoding">BBC Arabic</a>,
- <a href="?feed=http://newsrss.bbc.co.uk/rss/chinese/simp/news/rss.xml" title="Test: GB2312 Encoding">BBC China</a>,
- <a href="?feed=http://newsrss.bbc.co.uk/rss/russian/news/rss.xml" title="Test: Windows-1251 Encoding">BBC Russia</a>,
- <a href="?feed=http://inessential.com/xml/rss.xml" title="Developer of NetNewsWire">Brent Simmons</a>,
- <a href="?feed=http://www.channelfrederator.com/rss" title="Test: Embedded Enclosures">Channel Frederator</a>,
- <a href="?feed=http://rss.cnn.com/rss/cnn_topstories.rss" title="World News">CNN</a>,
- <a href="?feed=http://digg.com/rss/index.xml" title="Tech news. Better than Slashdot.">Digg</a>,
- <a href="?feed=http://revision3.com/diggnation/feed/quicktime-large" title="Tech and industry videocast.">Diggnation</a>,
- <a href="?feed=http://www.flickr.com/services/feeds/photos_public.gne?format=rss2" title="Flickr Photos">Flickr</a>,
- <a href="?feed=http://news.google.com/?output=rss" title="World News">Google News</a>,
- <a href="?feed=http://video.google.com/videofeed?type=top100new&num=20&output=rss" title="Test: Media RSS Support">Google Video</a>,
- <a href="?feed=http://blogs.law.harvard.edu/home/feed/rdf/" title="Test: Tag Stripping">Harvard Law</a>,
- <a href="?feed=http://hagada.org.il/hagada/html/backend.php" title="Test: Window-1255 Encoding">Hebrew Language</a>,
- <a href="?feed=http://www.infoworld.com/rss/news.xml" title="Test: Ad Stripping">InfoWorld</a>,
- <a href="?feed=http://phobos.apple.com/WebObjects/MZStore.woa/wpa/MRSS/topsongs/limit=10/rss.xml&orderbydate=false" title="Test: Tag Stripping">iTunes</a>,
- <a href="?feed=http://blog.japan.cnet.com/lessig/index.rdf" title="Test: EUC-JP Encoding">Japanese Language</a>,
- <a href="?feed=http://nurapt.kaist.ac.kr/~jamaica/htmls/blog/rss.php&amp;input=EUC-KR" title="Test: EUC-KR Encoding">Korean Language</a>,
- <a href="?feed=http://mir.aculo.us/xml/rss/feed.xml" title="Weblog for the developer of Scriptaculous">mir.aculo.us</a>,
- <a href="?feed=http://images.apple.com/trailers/rss/newtrailers.rss" title="Apple's QuickTime movie trailer site">Movie Trailers</a>,
- <a href="?feed=http://www.newspond.com/rss/main.xml" title="Tech and Science News">Newspond</a>,
- <a href="?feed=http://nick.typepad.com/blog/index.rss" title="Developer of TopStyle and FeedDemon">Nick Bradbury</a>,
- <a href="?feed=http://feeds.feedburner.com/ok-cancel" title="Usability comics and commentary">OK/Cancel</a>,
- <a href="?feed=http://osnews.com/files/recent.rdf" title="News about every OS ever">OS News</a>,
- <a href="?feed=http://weblog.philringnalda.com/feed/" title="Test: Atom 1.0 Support">Phil Ringnalda</a>,
- <a href="?feed=http://kabili.libsyn.com/rss" title="Test: Improved enclosure type sniffing">Photoshop Videocast</a>,
- <a href="?feed=http://www.pariurisportive.com/blog/xmlsrv/rss2.php?blog=2" title="Test: ISO-8859-1 Encoding">Romanian Language</a>,
- <a href="?feed=http://www.erased.info/rss2.php" title="Test: KOI8-R Encoding">Russian Language</a>,
- <a href="?feed=http://www.upsaid.com/isis/index.rdf" title="Test: BIG5 Encoding">Traditional Chinese Language</a>,
- <a href="?feed=http://technorati.com/watchlists/rss.html?wid=29290" title="Technorati watch for SimplePie">Technorati</a>,
- <a href="?feed=http://www.tbray.org/ongoing/ongoing.atom" title="Test: Atom 1.0 Support">Tim Bray</a>,
- <a href="?feed=http://tuaw.com/rss.xml" title="Apple News">TUAW</a>,
- <a href="?feed=http://www.tvgasm.com/atom.xml&amp;image=true" title="Test: Bypass Image Hotlink Blocking">TVgasm</a>,
- <a href="?feed=http://uneasysilence.com/feed/" title="Interesting tech randomness">UNEASYsilence</a>,
- <a href="?feed=http://feeds.feedburner.com/web20Show" title="Test: Embedded Enclosures">Web 2.0 Show</a>,
- <a href="?feed=http://windowsvistablog.com/blogs/MainFeed.aspx" title="Test: Tag Stripping">Windows Vista Blog</a>,
- <a href="?feed=http://xkcd.com/rss.xml" title="Test: LightHTTPd and GZipping">XKCD</a>,
- <a href="?feed=http://rss.news.yahoo.com/rss/topstories" title="World News">Yahoo! News</a>,
- <a href="?feed=http://youtube.com/rss/global/top_favorites.rss" title="Funny user-submitted videos">You Tube</a>,
- <a href="?feed=http://zeldman.com/rss/" title="The father of the web standards movement">Zeldman</a></p>
-
- </div>
-
- <div id="sp_results">
-
- <!-- As long as the feed has data to work with... -->
- <?php if ($success): ?>
- <div class="chunk focus" align="center">
-
- <!-- If the feed has a link back to the site that publishes it (which 99% of them do), link the feed's title to it. -->
- <h3 class="header"><?php if ($feed->get_link()) echo '<a href="' . $feed->get_link() . '">'; echo $feed->get_title(); if ($feed->get_link()) echo '</a>'; ?></h3>
-
- <!-- If the feed has a description, display it. -->
- <?php echo $feed->get_description(); ?>
-
- </div>
-
- <!-- Add subscribe links for several different aggregation services -->
- <p class="subscribe"><strong>Subscribe:</strong> <a href="<?php echo $feed->subscribe_bloglines(); ?>">Bloglines</a>, <a href="<?php echo $feed->subscribe_google(); ?>">Google Reader</a>, <a href="<?php echo $feed->subscribe_msn(); ?>">My MSN</a>, <a href="<?php echo $feed->subscribe_netvibes(); ?>">Netvibes</a>, <a href="<?php echo $feed->subscribe_newsburst(); ?>">Newsburst</a><br /><a href="<?php echo $feed->subscribe_newsgator(); ?>">Newsgator</a>, <a href="<?php echo $feed->subscribe_odeo(); ?>">Odeo</a>, <a href="<?php echo $feed->subscribe_podnova(); ?>">Podnova</a>, <a href="<?php echo $feed->subscribe_rojo(); ?>">Rojo</a>, <a href="<?php echo $feed->subscribe_yahoo(); ?>">My Yahoo!</a>, <a href="<?php echo $feed->subscribe_feed(); ?>">Desktop Reader</a></p>
-
-
- <!-- Let's begin looping through each individual news item in the feed. -->
- <?php foreach($feed->get_items() as $item): ?>
- <div class="chunk">
-
- <?php
- // Let's add a favicon for each item. If one doesn't exist, we'll use an alternate one.
- if (!$favicon = $feed->get_favicon())
- {
- $favicon = './for_the_demo/favicons/alternate.png';
- }
- ?>
-
- <!-- If the item has a permalink back to the original post (which 99% of them do), link the item's title to it. -->
- <h4><img src="<?php echo $favicon; ?>" alt="Favicon" class="favicon" /><?php if ($item->get_permalink()) echo '<a href="' . $item->get_permalink() . '">'; echo $item->get_title(); if ($item->get_permalink()) echo '</a>'; ?>&nbsp;<span class="footnote"><?php echo $item->get_date('j M Y, g:i a'); ?></span></h4>
-
- <!-- Display the item's primary content. -->
- <?php echo $item->get_content(); ?>
-
- <?php
- // Check for enclosures. If an item has any, set the first one to the $enclosure variable.
- if ($enclosure = $item->get_enclosure(0))
- {
- // Use the embed() method to embed the enclosure into the page inline.
- echo '<div align="center">';
- echo '<p>' . $enclosure->embed(array(
- 'audio' => './for_the_demo/place_audio.png',
- 'video' => './for_the_demo/place_video.png',
- 'mediaplayer' => './for_the_demo/mediaplayer.swf',
- 'altclass' => 'download'
- )) . '</p>';
-
- if ($enclosure->get_link() && $enclosure->get_type())
- {
- echo '<p class="footnote" align="center">(' . $enclosure->get_type();
- if ($enclosure->get_size())
- {
- echo '; ' . $enclosure->get_size() . ' MB';
- }
- echo ')</p>';
- }
- if ($enclosure->get_thumbnail())
- {
- echo '<div><img src="' . $enclosure->get_thumbnail() . '" alt="" /></div>';
- }
- echo '</div>';
- }
- ?>
-
- <!-- Add links to add this post to one of a handful of services. -->
- <p class="footnote favicons" align="center">
- <a href="<?php echo $item->add_to_blinklist(); ?>" title="Add post to Blinklist"><img src="./for_the_demo/favicons/blinklist.png" alt="Blinklist" /></a>
- <a href="<?php echo $item->add_to_blogmarks(); ?>" title="Add post to Blogmarks"><img src="./for_the_demo/favicons/blogmarks.png" alt="Blogmarks" /></a>
- <a href="<?php echo $item->add_to_delicious(); ?>" title="Add post to del.icio.us"><img src="./for_the_demo/favicons/delicious.png" alt="del.icio.us" /></a>
- <a href="<?php echo $item->add_to_digg(); ?>" title="Digg this!"><img src="./for_the_demo/favicons/digg.png" alt="Digg" /></a>
- <a href="<?php echo $item->add_to_magnolia(); ?>" title="Add post to Ma.gnolia"><img src="./for_the_demo/favicons/magnolia.png" alt="Ma.gnolia" /></a>
- <a href="<?php echo $item->add_to_myweb20(); ?>" title="Add post to My Web 2.0"><img src="./for_the_demo/favicons/myweb2.png" alt="My Web 2.0" /></a>
- <a href="<?php echo $item->add_to_newsvine(); ?>" title="Add post to Newsvine"><img src="./for_the_demo/favicons/newsvine.png" alt="Newsvine" /></a>
- <a href="<?php echo $item->add_to_reddit(); ?>" title="Add post to Reddit"><img src="./for_the_demo/favicons/reddit.png" alt="Reddit" /></a>
- <a href="<?php echo $item->add_to_segnalo(); ?>" title="Add post to Segnalo"><img src="./for_the_demo/favicons/segnalo.png" alt="Segnalo" /></a>
- <a href="<?php echo $item->add_to_simpy(); ?>" title="Add post to Simpy"><img src="./for_the_demo/favicons/simpy.png" alt="Simpy" /></a>
- <a href="<?php echo $item->add_to_spurl(); ?>" title="Add post to Spurl"><img src="./for_the_demo/favicons/spurl.png" alt="Spurl" /></a>
- <a href="<?php echo $item->add_to_wists(); ?>" title="Add post to Wists"><img src="./for_the_demo/favicons/wists.png" alt="Wists" /></a>
- <a href="<?php echo $item->search_technorati(); ?>" title="Who's linking to this post?"><img src="./for_the_demo/favicons/technorati.png" alt="Technorati" /></a>
- </p>
-
- </div>
-
- <!-- Stop looping through each item once we've gone through all of them. -->
- <?php endforeach; ?>
-
- <!-- From here on, we're no longer using data from the feed. -->
- <?php endif; ?>
-
- </div>
-
- <div>
- <!-- Display how fast the page was rendered. -->
- <p class="footnote">Page processed in <?php $mtime = explode(' ', microtime()); echo round($mtime[0] + $mtime[1] - $starttime, 3); ?> seconds.</p>
-
- <!-- Display the version of SimplePie being loaded. -->
- <p class="footnote">Powered by <a href="<?php echo SIMPLEPIE_URL; ?>"><?php echo SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . ', Build ' . SIMPLEPIE_BUILD; ?></a>. Run the <a href="../compatibility_test/sp_compatibility_test.php">SimplePie Compatibility Test</a>. SimplePie is &copy; 2004&ndash;<?php echo date('Y'); ?>, Ryan Parman and Geoffrey Sneddon, and licensed under the <a href="http://www.opensource.org/licenses/bsd-license.php">BSD License</a>.</p>
- </div>
-
- </div>
-
-</div>
-
-</body>
-</html>
diff --git a/library/simplepie/demo/minimalistic.php b/library/simplepie/demo/minimalistic.php
deleted file mode 100644
index 56509c00c..000000000
--- a/library/simplepie/demo/minimalistic.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-function microtime_float()
-{
- if (version_compare(phpversion(), '5.0.0', '>='))
- {
- return microtime(true);
- }
- else
- {
- list($usec, $sec) = explode(' ', microtime());
- return ((float) $usec + (float) $sec);
- }
-}
-
-$start = microtime_float();
-
-include('../simplepie.inc');
-
-// Parse it
-$feed = new SimplePie();
-if (!empty($_GET['feed']))
-{
- if (get_magic_quotes_gpc())
- {
- $_GET['feed'] = stripslashes($_GET['feed']);
- }
- $feed->set_feed_url($_GET['feed']);
- $feed->init();
-}
-$feed->handle_content_type();
-
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title><?php echo (empty($_GET['feed'])) ? 'SimplePie' : 'SimplePie: ' . $feed->get_title(); ?></title>
-
-<!-- META HTTP-EQUIV -->
-<meta http-equiv="content-type" content="text/html; charset=<?php echo ($feed->get_encoding()) ? $feed->get_encoding() : 'UTF-8'; ?>" />
-<meta http-equiv="imagetoolbar" content="false" />
-
-<style type="text/css">
-html, body {
- height:100%;
- margin:0;
- padding:0;
-}
-
-h1 {
- background-color:#333;
- color:#fff;
- font-size:3em;
- margin:0;
- padding:5px 15px;
- text-align:center;
-}
-
-div#footer {
- padding:5px 0;
-}
-
-div#footer,
-div#footer a {
- text-align:center;
- font-size:0.7em;
-}
-
-div#footer a {
- text-decoration:underline;
-}
-
-code {
- background-color:#f3f3ff;
- color:#000;
-}
-
-pre {
- background-color:#f3f3ff;
- color:#000080;
- border:1px dotted #000080;
- padding:3px 5px;
-}
-
-form {
- margin:0;
- padding:0;
-}
-
-div.chunk {
- border-bottom:1px solid #ccc;
-}
-
-form#sp_form {
- text-align:center;
- margin:0;
- padding:0;
-}
-
-form#sp_form input.text {
- width:85%;
-}
-</style>
-
-</head>
-
-<body>
- <h1><?php echo (empty($_GET['feed'])) ? 'SimplePie' : 'SimplePie: ' . $feed->get_title(); ?></h1>
-
- <form action="" method="get" name="sp_form" id="sp_form">
- <p><input type="text" name="feed" value="<?php echo ($feed->subscribe_url()) ? htmlspecialchars($feed->subscribe_url()) : 'http://'; ?>" class="text" id="feed_input" />&nbsp;<input type="submit" value="Read" class="button" /></p>
- </form>
-
- <div id="sp_results">
- <?php if ($feed->data): ?>
- <?php $items = $feed->get_items(); ?>
- <p align="center"><span style="background-color:#ffc;">Displaying <?php echo $feed->get_item_quantity(); ?> most recent entries.</span></p>
- <?php foreach($items as $item): ?>
- <div class="chunk" style="padding:0 5px;">
- <h4><a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a> <?php echo $item->get_date('j M Y'); ?></h4>
- <?php echo $item->get_content(); ?>
- <?php
- if ($enclosure = $item->get_enclosure(0))
- echo '<p><a href="' . $enclosure->get_link() . '" class="download"><img src="./for_the_demo/mini_podcast.png" alt="Podcast" title="Download the Podcast" border="0" /></a></p>';
- ?>
- </div>
- <?php endforeach; ?>
- </div>
- <?php endif; ?>
- </div>
-
- <div id="footer">
- Powered by <?php echo SIMPLEPIE_LINKBACK; ?>, a product of <a href="http://www.skyzyx.com">Skyzyx Technologies</a>.<br />
- Page created in <?php echo round(microtime_float()-$start, 3); ?> seconds.
- </div>
-</body>
-</html>
diff --git a/library/simplepie/demo/multifeeds.php b/library/simplepie/demo/multifeeds.php
deleted file mode 100644
index b23d792a2..000000000
--- a/library/simplepie/demo/multifeeds.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/********************************************************************
-MULTIFEEDS TEST PAGE
-
-Nothing too exciting here. Just a sample page that demos integrated
-Multifeeds support as well as cached favicons and perhaps a few other
-things.
-
-Lots of this code is commented to help explain some of the new stuff.
-Code was tested in PHP 5.2.2, but *should* also work with earlier
-versions of PHP, as supported by SimplePie (PHP 4.1).
-
-********************************************************************/
-
-// Include the SimplePie library, and the one that handles internationalized domain names.
-require_once('../simplepie.inc');
-require_once('../idn/idna_convert.class.php');
-
-// Initialize some feeds for use.
-$feed = new SimplePie();
-$feed->set_feed_url(array(
- 'http://rss.news.yahoo.com/rss/topstories',
- 'http://news.google.com/?output=atom',
- 'http://rss.cnn.com/rss/cnn_topstories.rss'
-));
-
-// When we set these, we need to make sure that the handler_image.php file is also trying to read from the same cache directory that we are.
-$feed->set_favicon_handler('./handler_image.php');
-$feed->set_image_handler('./handler_image.php');
-
-// Initialize the feed.
-$feed->init();
-
-// Make sure the page is being served with the UTF-8 headers.
-$feed->handle_content_type();
-
-// Begin the (X)HTML page.
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
- <title>Multifeeds Test page</title>
- <link rel="stylesheet" href="../demo/for_the_demo/simplepie.css" type="text/css" media="screen" title="SimplePie Styles" charset="utf-8" />
- <style type="text/css">
- div#site {
- width:600px;
- }
- span.footnote {
- white-space:nowrap;
- }
- h1 {
- line-height:1.4em;
- }
- h4 {
- padding-left:20px;
- background-color:transparent;
- background-repeat:no-repeat;
- background-position:0 1px;
- }
- .clearBoth {
- clear:both;
- }
- </style>
-</head>
-<body>
-<div id="site">
-
- <?php if ($feed->error): ?>
- <p><?=$feed->error()?></p>
- <?php endif ?>
-
- <div class="chunk">
- <h1>Quick-n-Dirty Multifeeds Demo</a></h1>
- </div>
-
- <?php
- // Let's loop through each item in the feed.
- foreach($feed->get_items() as $item):
-
- // Let's give ourselves a reference to the parent $feed object for this particular item.
- $feed = $item->get_feed();
- ?>
-
- <div class="chunk">
- <h4 style="background-image:url(<?php echo $feed->get_favicon(); ?>);"><a href="<?php echo $item->get_permalink(); ?>"><?php echo html_entity_decode($item->get_title(), ENT_QUOTES, 'UTF-8'); ?></a></h4>
-
- <!-- get_content() prefers full content over summaries -->
- <?php echo $item->get_content(); ?>
-
- <?php if ($enclosure = $item->get_enclosure()): ?>
- <div>
- <?php echo $enclosure->native_embed(array(
- // New 'mediaplayer' attribute shows off Flash-based MP3 and FLV playback.
- 'mediaplayer' => '../demo/for_the_demo/mediaplayer.swf'
- )); ?>
- </div>
- <?php endif; ?>
-
- <p class="footnote">Source: <a href="<?php echo $feed->get_permalink(); ?>"><?php echo $feed->get_title(); ?></a> | <?php echo $item->get_date('j M Y | g:i a'); ?></p>
- </div>
-
- <?php endforeach ?>
-
- <p class="footnote">This is a test of the emergency broadcast system. This is only a test&hellip; beeeeeeeeeeeeeeeeeeeeeeeeeep!</p>
-
-</div>
-</body>
-</html> \ No newline at end of file
diff --git a/library/simplepie/demo/test.php b/library/simplepie/demo/test.php
deleted file mode 100644
index 5b9943abb..000000000
--- a/library/simplepie/demo/test.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-include_once('../simplepie.inc');
-include_once('../idn/idna_convert.class.php');
-
-// Parse it
-$feed = new SimplePie();
-if (isset($_GET['feed']) && $_GET['feed'] !== '')
-{
- if (get_magic_quotes_gpc())
- {
- $_GET['feed'] = stripslashes($_GET['feed']);
- }
- $feed->set_feed_url($_GET['feed']);
- $feed->enable_cache(false);
- $starttime = explode(' ', microtime());
- $starttime = $starttime[1] + $starttime[0];
- $feed->init();
- $endtime = explode(' ', microtime());
- $endtime = $endtime[1] + $endtime[0];
- $time = $endtime - $starttime;
-}
-else
-{
- $time = 'null';
-}
-
-$feed->handle_content_type();
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<title>SimplePie Test</title>
-<pre>
-<?php
-
-// memory_get_peak_usage() only exists on PHP 5.2 and higher if PHP is compiled with the --enable-memory-limit configuration option or on PHP 5.2.1 and higher (which runs as if --enable-memory-limit was on, with no option)
-if (function_exists('memory_get_peak_usage'))
-{
- var_dump($time, memory_get_usage(), memory_get_peak_usage());
-}
-// memory_get_usage() only exists if PHP is compiled with the --enable-memory-limit configuration option or on PHP 5.2.1 and higher (which runs as if --enable-memory-limit was on, with no option)
-else if (function_exists('memory_get_usage'))
-{
- var_dump($time, memory_get_usage());
-}
-else
-{
- var_dump($time);
-}
-
-// Output buffer
-function callable_htmlspecialchars($string)
-{
- return htmlspecialchars($string);
-}
-ob_start('callable_htmlspecialchars');
-
-// Output
-print_r($feed);
-ob_end_flush();
-
-?>
-</pre> \ No newline at end of file
diff --git a/tests/phpunit-mariadb.xml b/tests/phpunit-mariadb.xml
new file mode 120000
index 000000000..63656b78b
--- /dev/null
+++ b/tests/phpunit-mariadb.xml
@@ -0,0 +1 @@
+phpunit-mysql.xml \ No newline at end of file
diff --git a/tests/phpunit-mysql.xml b/tests/phpunit-mysql.xml
new file mode 100644
index 000000000..171211094
--- /dev/null
+++ b/tests/phpunit-mysql.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd"
+ bootstrap="../boot.php"
+ forceCoversAnnotation="false"
+ beStrictAboutCoversAnnotation="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutTodoAnnotatedTests="true"
+ verbose="true">
+ <testsuite name="Hubzilla default Test Suite">
+ <directory suffix="Test.php">./unit/</directory>
+ </testsuite>
+ <testsuite name="API Test Suite">
+ <directory suffix="Test.php" prefix="API">./unit/</directory>
+ </testsuite>
+ <testsuite name="Ex-/Import Test Suite">
+ <directory suffix="Test.php">./unit/eximport/</directory>
+ </testsuite>
+ <groups>
+ <exclude>
+ <group>postgresql</group>
+ </exclude>
+ </groups>
+ <!--cover reporting-->
+ <filter>
+ <whitelist processUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../Zotlabs/</directory>
+ <directory suffix=".php">../include/</directory>
+ </whitelist>
+ </filter>
+ <logging>
+ <log type="junit" target="./results/junit.xml" logIncompleteSkipped="false"/>
+ <log type="coverage-clover" target="./results/coverage-clover.xml"/>
+ <log type="coverage-html" target="./results/coverage-report/" lowUpperBound="35"
+ highLowerBound="70"/>
+ </logging>
+</phpunit>
diff --git a/tests/phpunit-pgsql.xml b/tests/phpunit-pgsql.xml
new file mode 100644
index 000000000..ace14e196
--- /dev/null
+++ b/tests/phpunit-pgsql.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd"
+ bootstrap="../boot.php"
+ forceCoversAnnotation="false"
+ beStrictAboutCoversAnnotation="true"
+ beStrictAboutOutputDuringTests="true"
+ beStrictAboutTodoAnnotatedTests="true"
+ verbose="true">
+ <testsuite name="Hubzilla default Test Suite">
+ <directory suffix="Test.php">./unit/</directory>
+ </testsuite>
+ <testsuite name="API Test Suite">
+ <directory suffix="Test.php" prefix="API">./unit/</directory>
+ </testsuite>
+ <groups>
+ <exclude>
+ <group>mysql</group>
+ </exclude>
+ </groups>
+ <!--cover reporting-->
+ <filter>
+ <whitelist processUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../Zotlabs/</directory>
+ <directory suffix=".php">../include/</directory>
+ </whitelist>
+ </filter>
+ <logging>
+ <log type="junit" target="./results/junit.xml" logIncompleteSkipped="false"/>
+ <log type="coverage-clover" target="./results/coverage-clover.xml"/>
+ <log type="coverage-html" target="./results/coverage-report/" lowUpperBound="35"
+ highLowerBound="70"/>
+ </logging>
+</phpunit>
diff --git a/tests/travis/gen_apidocs.sh b/tests/travis/gen_apidocs.sh
new file mode 100755
index 000000000..e5938e1e8
--- /dev/null
+++ b/tests/travis/gen_apidocs.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# 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.
+#
+
+# Exit if anything fails
+set -e
+
+# Only create and deploy API documentation once, on first build job.
+# Waiting for upcoming 'Build Stages' Q1/Q2 2017 to make this cleaner.
+# https://github.com/travis-ci/travis-ci/issues/929
+if [[ "$TRAVIS_JOB_NUMBER" != "${TRAVIS_BUILD_NUMBER}.1" ]]; then
+ echo "Not the first build job. Creating API documentation only once is enough."
+ echo "We are finished ..."
+ exit
+fi
+
+echo "Doxygen version >= 1.8 is required"
+doxygen --version
+
+# Check if newer version of Doxygen should be used
+if [ ! -z "$DOXY_VER" ]; then
+ export DOXY_BINPATH=$HOME/doxygen/doxygen-$DOXY_VER/bin
+ if [ ! -e "$DOXY_BINPATH/doxygen" ]; then
+ echo "Installing newer Doxygen $DOXY_VER ..."
+ mkdir -p $HOME/doxygen && cd $HOME/doxygen
+ wget -O - http://ftp.stack.nl/pub/users/dimitri/doxygen-$DOXY_VER.linux.bin.tar.gz | tar xz
+ export PATH=$DOXY_BINPATH:$PATH
+ fi
+ echo "Doxygen version"
+ doxygen --version
+fi
+
+echo "Generating Doxygen API documentation ..."
+cd $TRAVIS_BUILD_DIR
+mkdir -p ./doc/html
+# Redirect stderr and stdout to log file and console to be able to review documentation errors
+doxygen $DOXYFILE 2>&1 | tee ./doc/html/doxygen.log
+
+# Check if Doxygen successfully created the documentation
+if [ -d "doc/html" ] && [ -f "doc/html/index.html" ]; then
+ echo "API documentation generated"
+ if [ -n "${TRAVIS_TAG}" ]; then
+ echo "Generate API documentation archive for release deployment ..."
+ zip -9 -r -q doc/hubzilla-api-documentation.zip doc/html/
+ fi
+else
+ echo "No API documentation files have been found" >&2
+ exit 1
+fi
diff --git a/tests/travis/prepare.sh b/tests/travis/prepare.sh
new file mode 100755
index 000000000..267b4ec46
--- /dev/null
+++ b/tests/travis/prepare.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# 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.
+#
+
+# Exit if anything fails
+set -e
+
+# gd is required, show some info about the used one
+php -r "var_dump(gd_info());"
+
+
+echo "Creating required folders for Hubzilla ..."
+mkdir -p ./store/\[data\]/smarty3
+
+echo "TODO: create .htconfig"
diff --git a/tests/travis/prepare_mysql.sh b/tests/travis/prepare_mysql.sh
new file mode 100755
index 000000000..92c720205
--- /dev/null
+++ b/tests/travis/prepare_mysql.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# 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.
+#
+
+# Exit if anything fails
+set -e
+
+echo "Preparing for MySQL ..."
+
+# Print out some MySQL information
+mysql --version
+mysql -e "SELECT VERSION();"
+mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
+mysql -e "SHOW VARIABLES LIKE 'collation_%';"
+mysql -e "SHOW VARIABLES LIKE 'character_set%';"
+mysql -e "SELECT @@sql_mode;"
+
+# Create Hubzilla database
+mysql -e "CREATE DATABASE IF NOT EXISTS hubzilla;" -uroot;
diff --git a/tests/travis/prepare_pgsql.sh b/tests/travis/prepare_pgsql.sh
new file mode 100755
index 000000000..dcd83f3be
--- /dev/null
+++ b/tests/travis/prepare_pgsql.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+#
+# Copyright (c) 2016 Hubzilla
+#
+# 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.
+#
+
+# Exit if anything fails
+set -e
+
+echo "Preparing for PostgreSQL ..."
+
+# Print out some PostgreSQL information
+psql --version
+# Why does this hang further execution of the job?
+psql -c "SELECT VERSION();" -U postgres
+
+# Create Hubzilla database
+psql -c "DROP DATABASE IF EXISTS hubzilla;" -U postgres
+psql -c "CREATE DATABASE hubzilla;" -U postgres
diff --git a/tests/unit/Lib/PermissionDescriptionTest.php b/tests/unit/Lib/PermissionDescriptionTest.php
index b1da5a0fd..97a39a2c8 100644
--- a/tests/unit/Lib/PermissionDescriptionTest.php
+++ b/tests/unit/Lib/PermissionDescriptionTest.php
@@ -1,6 +1,6 @@
<?php
/*
- * Copyright (c) 2016 Hubzilla
+ * Copyright (c) 2016-2017 Hubzilla
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,90 +21,75 @@
* SOFTWARE.
*/
-// Global namespace for fully qualified \App class.
-namespace {
- // General channel permissions in boot.php
- // 0 = Only you
- define ( 'PERMS_PUBLIC' , 0x0001 ); // anybody
- define ( 'PERMS_NETWORK' , 0x0002 ); // anybody in this network
- define ( 'PERMS_SITE' , 0x0004 ); // anybody on this site
- define ( 'PERMS_CONTACTS' , 0x0008 ); // any of my connections
- define ( 'PERMS_SPECIFIC' , 0x0080 ); // only specific connections
- define ( 'PERMS_AUTHED' , 0x0100 ); // anybody authenticated (could include visitors from other networks)
- define ( 'PERMS_PENDING' , 0x0200 ); // any connections including those who haven't yet been approved
- // log levels in boot.php
- define ( 'LOGGER_DEBUG', 2 );
+namespace Zotlabs\Tests\Unit\Lib;
- // Stub global fully qualified \App class for static function calls
- class App {
- // Stub get_hostname()
- public static function get_hostname() {
- return 'phpunit';
- }
- }
-}
+use phpmock\phpunit\PHPMock;
+use Zotlabs\Tests\Unit\UnitTestCase;
+use Zotlabs\Lib\PermissionDescription;
-// Stub global functions used in PermissionDescription with the help of
-// PHP's namespace resolution rules.
-namespace Zotlabs\Lib {
- // Stub global translate function t()
- function t($s) {
- return $s;
- }
- // Stub global log function logger()
- function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
- // doesn't matter
- }
-}
+/**
+ * @brief Unit Test case for PermissionDescription class.
+ */
+class PermissionDescriptionTest extends UnitTestCase {
-// regular namespace for this unit test
-namespace Zotlabs\Tests\Unit\Lib {
+ use PHPMock;
- use Zotlabs\Tests\Unit\UnitTestCase;
- use Zotlabs\Lib\PermissionDescription;
+ public function testFromDescription() {
+ $permDesc = PermissionDescription::fromDescription('test');
+ $permDesc2 = PermissionDescription::fromDescription('test');
+ $permDesc3 = PermissionDescription::fromDescription('test2');
- /**
- * @brief Unit Test case for ConnectionPool class.
- */
- class PermissionDescriptionTest extends UnitTestCase {
+ $this->assertEquals($permDesc, $permDesc2);
+ $this->assertNotEquals($permDesc, $permDesc3);
+ }
- public function testFromDescription() {
- $permDesc = PermissionDescription::fromDescription('test');
- $permDesc2 = PermissionDescription::fromDescription('test');
- $permDesc3 = PermissionDescription::fromDescription('test2');
+ public function testFromStandalonePermission() {
+ // Create a stub for global function t()
+ $t = $this->getFunctionMock('Zotlabs\Lib', 't');
+ $t->expects($this->atLeastOnce())->willReturnCallback(
+ function ($string) {
+ return $string;
+ }
+ );
+ // Create a mock for global function logger()
+ $this->getFunctionMock('Zotlabs\Lib', 'logger');
- $this->assertEquals($permDesc, $permDesc2);
- $this->assertNotEquals($permDesc, $permDesc3);
- }
+ $permDescUnknown = PermissionDescription::fromStandalonePermission(-1);
+ $permDescSelf = PermissionDescription::fromStandalonePermission(0);
- public function testFromStandalonePermission() {
- $permDescUnknown = PermissionDescription::fromStandalonePermission(-1);
- $permDescSelf = PermissionDescription::fromStandalonePermission(0);
+ $this->assertNull($permDescUnknown);
+ $this->assertNotNull($permDescSelf);
+ }
- $this->assertNull($permDescUnknown);
- $this->assertNotNull($permDescSelf);
- }
+ public function testFromGlobalPermission() {
+ //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
- public function testFromGlobalPermission() {
- //$permDesc = PermissionDescription::fromGlobalPermission('view_profile');
+ $this->markTestIncomplete(
+ 'The method fromGlobalPermission() is not yet testable ...'
+ );
+ }
- $this->markTestIncomplete(
- 'For this test we need more stubs...'
- );
- }
+ public function testGetPermissionDescription() {
+ // Create a stub for global function t()
+ $t = $this->getFunctionMock('Zotlabs\Lib', 't');
+ $t->expects($this->atLeastOnce())->willReturnCallback(
+ function ($string) {
+ return $string;
+ }
+ );
+ // Create a mock for global function logger()
+ $this->getFunctionMock('Zotlabs\Lib', 'logger');
- public function testGetPermissionDescription() {
+ // Create a stub for the PermissionDescription class
+ $stub = $this->createMock(PermissionDescription::class);
+ $stub->method('get_permission_description')
+ ->will($this->returnArgument(0));
- // fromStandalonePermission uses get_permission_description(), so that will not help
- //$permDescSelf = PermissionDescription::fromStandalonePermission(0);
- //$permDescPublic = PermissionDescription::fromStandalonePermission(PERMS_PUBLIC);
+ $permDescSelf = PermissionDescription::fromStandalonePermission(0);
+ $this->assertInstanceOf(PermissionDescription::class, $permDescSelf);
+ $this->assertEquals($permDescSelf->get_permission_description(), 'Only me');
- $this->markTestIncomplete(
- 'For this test we need a mock of PermissionDescription...'
- );
- //$permDescSelf =
- //$this->assertEquals($permDescSelf->, 'Only me');
- //$this->assertEquals($permDescPublic, 'Public');
- }
+ $permDescPublic = PermissionDescription::fromStandalonePermission(PERMS_PUBLIC);
+ $this->assertEquals($permDescPublic->get_permission_description(), 'Public');
}
}
diff --git a/tests/unit/TextTest.php b/tests/unit/TextTest.php
deleted file mode 100644
index 48c04bc54..000000000
--- a/tests/unit/TextTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * this file contains tests for text.php
- *
- * @package test.util
- */
-
-use PHPUnit\Framework\TestCase;
-
-/** required, it is the file under test */
-require_once('include/text.php');
-
-/**
- * TestCase for the texter
- *
- * @author ken restivo
- * @package test.util
- */
-class TextTest extends TestCase {
- public function testGoodEmail() {
- $this->assertTrue(valid_email_regex('ken@spaz.org'));
- }
- public function testGoodEmail2() {
- $this->assertTrue(valid_email_regex('ken@restivo.org'));
- }
- public function testGoodEmail3() {
- $this->assertTrue(valid_email_regex('nobody@hubzilla.com'));
- }
- public function testBadEmail() {
- $this->assertFalse(valid_email_regex('nobody!uses!these!any.more'));
- }
-
-} \ No newline at end of file
diff --git a/tests/unit/includes/TextTest.php b/tests/unit/includes/TextTest.php
new file mode 100644
index 000000000..e2c7cbb9a
--- /dev/null
+++ b/tests/unit/includes/TextTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Zotlabs\Tests\Unit\includes;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+
+/**
+ * @brief Unit Test case for include/texter.php file.
+ *
+ * @author ken restivo
+ */
+class TextTest extends UnitTestCase {
+
+ public function testGoodEmail() {
+ $this->assertTrue(valid_email_regex('ken@spaz.org'));
+ $this->assertTrue(valid_email_regex('ken@restivo.org'));
+ $this->assertTrue(valid_email_regex('nobody@hubzilla.org'));
+ $this->assertTrue(valid_email_regex('foo+nobody@hubzilla.org'));
+ }
+
+ public function testBadEmail() {
+ $this->assertFalse(valid_email_regex('nobody!uses!these!any.more'));
+ $this->assertFalse(valid_email_regex('foo@bar@hubzilla.org'));
+ }
+
+ public function testPurifyHTML() {
+ // linebreaks
+ $htmlbr = 'first line<br />
+ one tab preserved
+
+empty line above';
+ $this->assertEquals($htmlbr, purify_html($htmlbr));
+
+ // HTML5 is not supported by HTMLPurifier yet, test our own configuration
+ $html5elements = '<section>section<nav>navigation</nav><article>main<a href="http://hubzilla.org/">hubzilla.org</a></article></section><footer>footer</footer>';
+ $this->assertEquals($html5elements, purify_html($html5elements));
+ $this->assertEquals('<button>button label</button>', purify_html('<button>button label</button>'));
+
+ // unsupported HTML5 elements
+ $this->assertEquals('Your HTML parser does not support HTML5 video.', purify_html('<video controls><source src="movie.ogg" type="video/ogg">Your HTML parser does not support HTML5 video.</video>'));
+ $this->assertEquals('Your HTML parser does not support HTML5 audio.', purify_html('<audio controls><source src="movie.ogg" "type="audio/ogg">Your HTML parser does not support HTML5 audio.</audio>'));
+
+ // preserve f6 and bootstrap additional data attributes from our own configuration
+ $this->assertEquals('<div data-title="title">text</div>', purify_html('<div data-title="title">text</div>'));
+ $this->assertEquals('<ul data-accordion-menu=""><li>item1</li></ul>', purify_html('<ul data-accordion-menu><li>item1</li></ul>'));
+ $this->assertEquals('<ul><li>item1</li></ul>', purify_html('<ul data-accordion-menu-unknown><li>item1</li></ul>'));
+ }
+
+ public function testPurifyHTML_html() {
+ $this->assertEquals('<div id="id01"><p class="class01">ids und classes</p></div>', purify_html('<div id="id01"><p class="class01">ids und classes</p></div>'));
+ $this->assertEquals('<div><p>close missing tags</p></div>', purify_html('<div><p>close missing tags'));
+ $this->assertEquals('<center>deprecated tag</center>', purify_html('<center>deprecated tag</center>'));
+ $this->assertEquals('<span></span><div>illegal nesting</div>', purify_html('<span><div>illegal nesting</div></span>'));
+ $this->assertEquals('<a href="#">link with target</a>', purify_html('<a href="#" target="_blank">link with target</a>'));
+ $this->assertEquals('<a href="#">link with rel="nofollow"</a>', purify_html('<a href="#" rel="nofollow">link with rel="nofollow"</a>'));
+ $this->assertEquals('a b', purify_html('a&nbsp;b'));
+ $this->assertEquals('ä ä € €', purify_html('ä &auml; &euro; &#8364;'));
+ $this->assertEquals('<img src="picture.png" alt="text" />', purify_html('<img src="picture.png" alt="text">'));
+ $this->assertEquals('', purify_html('<iframe width="560" height="315" src="https://www.youtube.com/embed/kiNGx5oL7hk" frameborder="0" allowfullscreen></iframe>'));
+ }
+
+ public function testPurifyHTML_js() {
+ $this->assertEquals('<div></div>', purify_html('<div><img src="javascript:evil();" onload="evil();"></div>'));
+ $this->assertEquals('<a href="#">link</a>', purify_html('<a href="#" onclick="alert(\'xss\')">link</a>'));
+ $this->assertEquals('', purify_html('<IMG SRC="javascript:alert(&#039;XSS&#039;);">'));
+ $this->assertEquals('', purify_html('<script>alter("42")</script>'));
+ }
+
+ public function testPurifyHTML_css() {
+ $this->assertEquals('<p style="color:#FF0000;background-color:#fff;">red</p>', purify_html('<p style="color:red; background-color:#fff">red</p>'));
+ $this->assertEquals('<p>invalid color</p>', purify_html('<p style="color:invalid; background-color:#jjkkmm">invalid color</p>'));
+ $this->assertEquals('<p>invalid style</p>', purify_html('<p style="foo:bar">invalid style</p>'));
+
+ // test our own CSS configuration
+ $this->assertEquals('<div>position removed</div>', purify_html('<div style="position:absolut">position removed</div>'));
+ $this->assertEquals('<div style="position:fixed;">position preserved</div>', purify_html('<div style="position:fixed">position preserved</div>', true));
+ $this->assertEquals('<div>invalid position removed</div>', purify_html('<div style="position:invalid">invalid position removed</div>', true));
+
+ $this->assertEquals('<div>position removed</div>', purify_html('<div style="top:10px; left:3em;">position removed</div>'));
+ $this->assertEquals('<div style="top:10px;left:3em;right:50%;">position preserved</div>', purify_html('<div style="top:10px; left:3em; right:50%;">position preserved</div>', true));
+ $this->assertEquals('<div>invalid position removed</div>', purify_html('<div style="top:10p">invalid position removed</div>', true));
+ }
+
+}
diff --git a/tests/unit/template_test.php b/tests/unit/template_test.php
index 1f9f80531..dfaecb4a1 100644
--- a/tests/unit/template_test.php
+++ b/tests/unit/template_test.php
@@ -25,12 +25,6 @@ function x($s,$k = NULL) {
}
}
-if(!function_exists('get_app')) {
-function get_app() {
- return new TemplateMockApp();
-}
-}
-
/**
* TestCase for the template engine
*
diff --git a/util/Doxyfile b/util/Doxyfile
index f6c0692ee..1bca6cbd4 100644
--- a/util/Doxyfile
+++ b/util/Doxyfile
@@ -23,3 +23,12 @@ ALIASES += "TODO=\todo"
ALIASES += "BUG=\bug"
ALIASES += "hooks=\xrefitem hooks \"Hooks\" \"Hooks List\""
ALIASES += "HOOKS=\hooks"
+# Output
+QUIET = YES
+WARNINGS = YES
+# Dot tool config
+HAVE_DOT = YES
+DOT_IMAGE_FORMAT = svg
+INTERACTIVE_SVG = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = NO
diff --git a/util/db_update.php b/util/db_update.php
index ceef061c1..8fc7c7616 100644
--- a/util/db_update.php
+++ b/util/db_update.php
@@ -9,6 +9,7 @@ require_once('boot.php');
require_once('include/cli_startup.php');
cli_startup();
+$build = get_config('system','db_version');
echo "Old DB VERSION: " . $build . "\n";
echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
@@ -16,7 +17,7 @@ echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
if($build != DB_UPDATE_VERSION) {
echo "Updating database...";
- check_config($a);
+ check_config();
echo "Done\n";
}
diff --git a/util/fresh b/util/fresh
index 7f57931aa..0482d1215 100755
--- a/util/fresh
+++ b/util/fresh
@@ -44,8 +44,6 @@ fresh_main($argc,$argv);
function process_command($line) {
- $a = get_app();
-
// split args
App::$cmd = $line;
diff --git a/util/hmessages.po b/util/hmessages.po
index f9f817747..0a244127b 100644
--- a/util/hmessages.po
+++ b/util/hmessages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 2.1\n"
+"Project-Id-Version: 2.3.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-02-10 00:05-0800\n"
+"POT-Creation-Date: 2017-03-31 10:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,6 +17,78 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+#: ../../Zotlabs/Access/Permissions.php:46
+msgid "Can view my channel stream and posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+msgid "Can send me their channel stream and posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+msgid "Can view my default channel profile"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+msgid "Can view my connections"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+msgid "Can view my file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:51
+msgid "Can upload/modify my file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:52
+msgid "Can view my channel webpages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:54
+msgid "Can create/edit my channel webpages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:56
+msgid "Can post on my channel (wall) page"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+msgid "Can comment on or like my posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+msgid "Can send me private mail messages"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:59
+msgid "Can like/dislike profiles and profile things"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:60
+msgid "Can forward to all my channel connections via @+ mentions in posts"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:61
+msgid "Can chat with me"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+msgid "Can source my public posts in derived channels"
+msgstr ""
+
+#: ../../Zotlabs/Access/Permissions.php:63
+msgid "Can administer my channel"
+msgstr ""
+
#: ../../Zotlabs/Access/PermissionRoles.php:248
#: ../../include/permissions.php:945
msgid "Social Networking"
@@ -88,15 +160,15 @@ msgid "Special - Group Repository"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:887
#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:447
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
-#: ../../include/selectors.php:66 ../../include/selectors.php:104
-#: ../../include/selectors.php:140 ../../include/connections.php:901
-#: ../../include/connections.php:908 ../../include/permissions.php:949
+#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949 ../../include/connections.php:675
+#: ../../include/connections.php:682
msgid "Other"
msgstr ""
@@ -105,1928 +177,1944 @@ msgstr ""
msgid "Custom/Expert Mode"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:46
-msgid "Can view my channel stream and posts"
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Achievements.php:15
+#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editblock.php:31
+#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Layouts.php:31
+#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:943
+msgid "Requested profile is not available."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
-msgid "Can send me their channel stream and posts"
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1037
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:104
+#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294 ../../Zotlabs/Module/Network.php:15
+#: ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../Zotlabs/Web/WebServer.php:131 ../../addon/keepout/keepout.php:36
+#: ../../addon/openid/Mod_Id.php:53 ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3457
+#: ../../include/photos.php:27
+msgid "Permission denied."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
-msgid "Can view my default channel profile"
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
+msgid "Block Name"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
-msgid "Can view my connections"
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2275
+msgid "Blocks"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
-msgid "Can view my file storage and photos"
+#: ../../Zotlabs/Module/Blocks.php:156
+msgid "Block Title"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:51
-msgid "Can upload/modify my file storage and photos"
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
+msgid "Created"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:52
-msgid "Can view my channel webpages"
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
+msgid "Edited"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:53
-msgid "Can view my wiki pages"
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:925 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:54
-msgid "Can create/edit my channel webpages"
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
+#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:147
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:357 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1042
+#: ../../include/channel.php:1046 ../../include/menu.php:113
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+msgid "Edit"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:55
-msgid "Can write to my wiki pages"
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123 ../../include/conversation.php:1311
+msgid "Share"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:56
-msgid "Can post on my channel (wall) page"
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:658
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:172
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
+msgid "Delete"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
-msgid "Can comment on or like my posts"
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+msgid "View"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
-msgid "Can send me private mail messages"
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:59
-msgid "Can like/dislike profiles and profile things"
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:60
-msgid "Can forward to all my channel connections via @+ mentions in posts"
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:61
-msgid "Can chat with me"
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
-msgid "Can source my public posts in derived channels"
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:63
-msgid "Can administer my channel"
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
-msgid "parent"
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2698
-msgid "Collection"
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:133
-msgid "Principal"
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
+msgid "Your message:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:136
-msgid "Addressbook"
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:139
-msgid "Calendar"
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:142
-msgid "Schedule Inbox"
+#: ../../Zotlabs/Module/Invite.php:142
+msgid "1. Register at any $Projectname location (they are all inter-connected)"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:145
-msgid "Schedule Outbox"
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1244
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:559
-#: ../../Zotlabs/Lib/Apps.php:637
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/conversation.php:1177 ../../include/widgets.php:1714
-msgid "Unknown"
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
-msgid "Files"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:225
-msgid "Total"
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:126 ../../Zotlabs/Module/Setup.php:309
+#: ../../Zotlabs/Module/Setup.php:357 ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:511 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:890 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:425
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:133
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:714
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281 ../../addon/piwik/piwik.php:95
+#: ../../addon/pageheader/pageheader.php:48 ../../addon/xmpp/xmpp.php:69
+#: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124
+#: ../../addon/hubwall/hubwall.php:95 ../../include/js_strings.php:22
+msgid "Submit"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Shared"
+#: ../../Zotlabs/Module/Editlayout.php:79 ../../Zotlabs/Module/Editblock.php:79
+#: ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80 ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:890
-#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:243
-#: ../../extend/addon/addon/cdav/include/widgets.php:127
-#: ../../extend/addon/addon/cdav/include/widgets.php:164
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-msgid "Create"
+#: ../../Zotlabs/Module/Editlayout.php:128 ../../Zotlabs/Module/Layouts.php:129
+#: ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
-#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Profile_photo.php:410
-#: ../../Zotlabs/Module/Embedphotos.php:157
-#: ../../extend/addon/addon/cdav/include/widgets.php:132
-#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1727
-msgid "Upload"
+#: ../../Zotlabs/Module/Editlayout.php:129 ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Connedit.php:875
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:170
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Chat.php:250
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
-#: ../../include/widgets.php:990
-msgid "Name"
+#: ../../Zotlabs/Module/Editlayout.php:137
+msgid "Edit Layout"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:171
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
-msgid "Type"
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../Zotlabs/Module/Import_items.php:118 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119 ../../addon/frphotos/frphotos.php:81
+#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:327
+msgid "Permission denied"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1406
-msgid "Size"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:236
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:238 ../../Zotlabs/Module/Editpost.php:85
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:300
-#: ../../Zotlabs/Module/Connections.php:320
-#: ../../Zotlabs/Module/Admin/Profs.php:154
-#: ../../Zotlabs/Module/Editlayout.php:114
-#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Module/Wiki.php:163
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:357
-#: ../../extend/addon/addon/cdav/include/widgets.php:125
-#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-#: ../../include/menu.php:113 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/page_widgets.php:9
-#: ../../include/page_widgets.php:39
-msgid "Edit"
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1360
+msgid "Profile"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Photos.php:1174
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:271
-#: ../../Zotlabs/Module/Admin/Profs.php:155
-#: ../../Zotlabs/Module/Admin/Accounts.php:173
-#: ../../Zotlabs/Module/Admin/Channels.php:149
-#: ../../Zotlabs/Module/Editlayout.php:137
-#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Connedit.php:634 ../../Zotlabs/Module/Connedit.php:892
-#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:358
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:656
-msgid "Delete"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:299
-#, php-format
-msgid "You are using %1$s of your available file storage."
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:304
-#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:315
-msgid "WARNING:"
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:320
-msgid "Create new folder"
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:322
-msgid "Upload file"
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:335
-msgid "Drop files here to immediately upload"
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
msgstr ""
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
-#: ../../include/items.php:327
-msgid "Permission denied"
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
-#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Authtest.php:16
-#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:68
-#: ../../Zotlabs/Module/Editwebpage.php:89
-#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:396
-#: ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
-#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
-#: ../../Zotlabs/Module/Appman.php:81 ../../Zotlabs/Module/Mood.php:116
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:636
-#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Setup.php:212
-#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
-#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Profile.php:70
-#: ../../Zotlabs/Module/Profile.php:87 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
-#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
-#: ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Profile_photo.php:273
-#: ../../Zotlabs/Module/Profile_photo.php:286
-#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Common.php:39
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:49
-#: ../../Zotlabs/Module/Wiki.php:214 ../../Zotlabs/Module/Wiki.php:313
-#: ../../Zotlabs/Module/Wiki.php:318 ../../Zotlabs/Module/Sources.php:74
-#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
-#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
-#: ../../Zotlabs/Module/Mail.php:164
-#: ../../Zotlabs/Module/Viewconnections.php:28
-#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
-#: ../../extend/addon/addon/keepout/keepout.php:36
-#: ../../extend/addon/addon/pumpio/pumpio.php:40
-#: ../../extend/addon/addon/openid/Mod_Id.php:53
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
-#: ../../include/attach.php:142 ../../include/attach.php:189
-#: ../../include/attach.php:253 ../../include/attach.php:267
-#: ../../include/attach.php:274 ../../include/attach.php:341
-#: ../../include/attach.php:355 ../../include/attach.php:362
-#: ../../include/attach.php:439 ../../include/attach.php:906
-#: ../../include/attach.php:977 ../../include/attach.php:1135
-#: ../../include/photos.php:27 ../../include/items.php:3445
-msgid "Permission denied."
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
msgstr ""
-#: ../../Zotlabs/Web/Router.php:152 ../../Zotlabs/Module/Display.php:124
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Lib/NativeWikiPage.php:502 ../../include/help.php:66
-msgid "Page not found."
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
msgstr ""
-#: ../../Zotlabs/Zot/Auth.php:138
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:61
msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please "
-"logout and retry."
+"Export your channel information and recent content to a JSON backup that can "
+"be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for "
+"this download to begin."
msgstr ""
-#: ../../Zotlabs/Zot/Auth.php:250
-#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:178
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr ""
+
+#: ../../Zotlabs/Module/Uexport.php:66
#, php-format
-msgid "Welcome %s. Remote authentication successful."
+msgid ""
+"To select all posts for a given year, such as this year, visit <a href=\"%1$s"
+"\">%2$s</a>"
msgstr ""
-#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:945
-msgid "Requested profile is not available."
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
msgstr ""
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a href=\"%1$s\">"
+"%2$s</a> on any site containing your channel. For best results please import "
+"or restore these in date order (oldest first)."
msgstr ""
-#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Photos.php:508
-#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Ratings.php:83
-#: ../../Zotlabs/Module/Directory.php:64
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
msgid "Public access denied."
msgstr ""
-#: ../../Zotlabs/Module/Display.php:38 ../../Zotlabs/Module/Admin.php:60
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3366
-msgid "Item not found."
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:160
+msgid "Search"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation instructions."
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary "
+"location."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:204
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:221 ../../Zotlabs/Module/Siteinfo.php:27
-msgid "Terms of Service"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:227
-#, php-format
-msgid "I accept the %s for this website"
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:229
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Your email address"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:234
-msgid "Choose a password"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing "
+"your channel."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Please re-enter your password"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:236
-msgid "Please enter your invitation code"
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid "Name or caption"
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:237
-#: ../../Zotlabs/Module/New_channel.php:134
-msgid ""
-"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
-"Group\""
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-msgid "Choose a short nickname"
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:239
-#: ../../Zotlabs/Module/New_channel.php:136
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address e."
-"g. nickname%s"
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Channel role and privacy"
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Select a channel role with your privacy requirements."
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:240
-#: ../../Zotlabs/Module/New_channel.php:137
-msgid "Read more about roles"
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:241
-msgid "no"
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:241
-msgid "yes"
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:261
-msgid "Registration"
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:258
-msgid "Membership on this site is by invitation only."
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Connedit.php:783 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "No"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
-#: ../../boot.php:1713
-msgid "Register"
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:239
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "Yes"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:271
-msgid ""
-"This site may require email verification after submitting this form. If you "
-"are returned to a login page, please check your email for instructions."
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
msgstr ""
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
-#, php-format
-msgid "Fetching URL returns error: %1$s"
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:219
-#: ../../include/photo/photo_driver.php:730
-msgid "Profile Photos"
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
-msgid "Delete Photo"
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:519
-msgid "No photos selected"
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:568
-msgid "Access to this item is restricted."
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:607
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:610
-#, php-format
-msgid "%1$.2f MB photo storage used."
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:646
-msgid "Upload Photos"
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:650
-msgid "Enter an album name"
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "or select an existing album (doubleclick)"
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "Create a status post for this upload"
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:218
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:410 ../../Zotlabs/Module/Connedit.php:748
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../Zotlabs/Module/Settings/Channel.php:291
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
-msgid "No"
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:220
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-#: ../../Zotlabs/Module/Connedit.php:410
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Events.php:470
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../Zotlabs/Module/Settings/Channel.php:291
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
-msgid "Yes"
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Caption (optional):"
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Description (optional):"
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Connedit.php:645
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
-#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Chat.php:234
-#: ../../include/acl_selectors.php:208
-msgid "Permissions"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
-#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Connedit.php:855
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Import.php:507 ../../Zotlabs/Module/Mitem.php:243
-#: ../../Zotlabs/Module/Appman.php:133 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Profiles.php:722 ../../Zotlabs/Module/Invite.php:149
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Wiki.php:167
-#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Tokens.php:168
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-#: ../../Zotlabs/Module/Settings/Channel.php:460
-#: ../../Zotlabs/Module/Settings/Display.php:196
-#: ../../Zotlabs/Module/Settings/Permcats.php:112
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Mail.php:413 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:731
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:118
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-#: ../../include/widgets.php:815 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:685
-msgid "Album name could not be decoded"
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:729
-msgid "Contact Photos"
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:752
-msgid "Show Newest First"
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:754
-msgid "Show Oldest First"
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1708
-msgid "View Photo"
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1948 ../../include/event.php:1141
+msgid "event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:809
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1725
-msgid "Edit Album"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:856
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:858
-msgid "Photo not available"
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:916
-msgid "Use as profile photo"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:917
-msgid "Use as cover photo"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:924
-msgid "Private Photo"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:689
-#: ../../Zotlabs/Module/Events.php:698
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:939
-msgid "View Full Size"
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
-#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:984
-#: ../../Zotlabs/Module/Admin/Plugins.php:450
-#: ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "Remove"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1028
-msgid "Edit photo"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1030
-msgid "Rotate CW (right)"
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1031
-msgid "Rotate CCW (left)"
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1034
-msgid "Move photo to album"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Enter a new album name"
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "or select an existing one (doubleclick)"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Caption"
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "Add a Tag"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1049
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1052
-msgid "Flag as adult in album view"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
+msgid "l, F j"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:245
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1378
-msgid "Share"
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
-#: ../../include/conversation.php:738
-msgid "Please wait"
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1767
+msgid "Link to Source"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
-#: ../../Zotlabs/Lib/ThreadItem.php:728
-msgid "This is you"
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
-msgid "Comment"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Edit Event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1094 ../../Zotlabs/Module/Events.php:478
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
-#: ../../include/conversation.php:1347 ../../include/page_widgets.php:43
-msgid "Preview"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
+msgid "Create Event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Likes"
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
-msgctxt "title"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
+msgid "Next"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Agree"
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1363
+msgid "Export"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Disagree"
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
-msgctxt "title"
-msgid "Abstain"
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Attending"
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Not attending"
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
+msgid "Today"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
-msgctxt "title"
-msgid "Might attend"
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1928
-msgid "View all"
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
-#: ../../include/channel.php:1273
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1955
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
+msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1236
-msgid "Photo Tools"
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1245
-msgid "In This Photo:"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "Map"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
-msgctxt "noun"
-msgid "Likes"
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
-msgctxt "noun"
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
-#: ../../include/acl_selectors.php:210
-msgid "Close"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1341
-msgid "View Album"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
-#: ../../Zotlabs/Module/Photos.php:1366
-msgid "Recent Photos"
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
-#: ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-msgid "Item not found"
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
-msgid "Edit post"
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
msgstr ""
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
msgstr ""
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:74
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:116
+#: ../../include/text.php:1945
+msgid "photo"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
-msgid "About"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:144
+#: ../../include/text.php:1951
+msgid "status"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
+#: ../../Zotlabs/Module/Import_items.php:46 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
+#: ../../Zotlabs/Module/Import_items.php:70 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
+#: ../../Zotlabs/Module/Import_items.php:75 ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
msgstr ""
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
+#: ../../Zotlabs/Module/Import_items.php:91 ../../Zotlabs/Module/Import.php:121
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
+#: ../../Zotlabs/Module/Import_items.php:106
+msgid "Import completed"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
+#: ../../Zotlabs/Module/Import_items.php:123
+msgid "Import Items"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
+#: ../../Zotlabs/Module/Import_items.php:124
+msgid "Use this form to import existing posts and content from an export file."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
-msgid "Continue"
+#: ../../Zotlabs/Module/Import_items.php:125
+#: ../../Zotlabs/Module/Import.php:499
+msgid "File to Upload"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:90
-msgid "Premium Channel Setup"
+#: ../../Zotlabs/Module/New_channel.php:121 ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:92
-msgid "Enable premium channel connection restrictions"
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Name or caption"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:93
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
msgid ""
-"Please enter your restrictions or conditions, such as paypal receipt, usage "
-"guidelines, etc."
+"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
+"Group\""
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
-msgid ""
-"This channel may require additional steps or acknowledgement of the "
-"following conditions prior to connecting:"
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+msgid "Choose a short nickname"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:96
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+#, php-format
msgid ""
-"Potential connections will then see the following text before proceeding:"
+"Your nickname will be used to create an easy to remember channel address e."
+"g. nickname%s"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
-msgid ""
-"By continuing, I certify that I have complied with any instructions provided "
-"on this page."
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Channel role and privacy"
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:106
-msgid "(No specific instructions have been provided by the channel owner.)"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Select a channel role with your privacy requirements."
msgstr ""
-#: ../../Zotlabs/Module/Connect.php:114
-msgid "Restricted or Premium Channel"
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Read more about roles"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:431
-msgid "Administration"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:910
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:528
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172 ../../addon/cdav/Mod_Cdav.php:1136
+#: ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1417
+msgid "Size"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
-#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:207
-#: ../../include/conversation.php:1295
-msgid "Insert web link"
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
-msgid "Title (optional)"
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
+#: ../../Zotlabs/Module/Setup.php:184
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
-msgid "Invalid item."
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Cal.php:62
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Wall_upload.php:31
-msgid "Channel not found."
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Setup.php:200
msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
-"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
msgstr ""
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
-#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:202
-#: ../../include/text.php:1003 ../../include/text.php:1015
-msgid "Save"
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:250
-msgid "Blocked"
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:249
-msgid "Ignored"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:248
-msgid "Hidden"
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:247
-msgid "Archived"
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1724
-msgid "New"
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107
-#: ../../Zotlabs/Module/Connedit.php:682 ../../include/widgets.php:544
-msgid "All"
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Pending approval"
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:262
-#, php-format
-msgid "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:263
-msgid "Edit connection"
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:264
-msgid "Delete connection"
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:273
-msgid "Channel address"
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:275
-msgid "Network"
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Call"
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:280
-msgid "Status"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:282
-msgid "Connected"
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:284
-msgid "Approve connection"
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:285
-#: ../../Zotlabs/Module/Admin/Accounts.php:171
-msgid "Approve"
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:286
-msgid "Ignore connection"
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:287
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Ignore"
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:288
-msgid "Recent activity"
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:932 ../../include/nav.php:203
-msgid "Connections"
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to "
+"upload is set to %s. You are allowed to upload up to %d files at once."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/acl_selectors.php:203
-#: ../../include/widgets.php:316 ../../include/text.php:1002
-#: ../../include/text.php:1014 ../../include/nav.php:180
-msgid "Search"
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:317
-msgid "Search your connections"
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:318
-msgid "Connections search"
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:319
-#: ../../Zotlabs/Module/Directory.php:392
-#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
-msgid "Find"
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:61
-msgid "Image uploaded but image cropping failed."
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:135
-msgid "Image resize failed."
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
-msgid "Unable to process image"
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:231
-msgid "Image upload failed."
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:250
-msgid "Unable to process image."
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4276
-msgid "female"
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4277
-#, php-format
-msgid "%1$s updated her %2$s"
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4278
-msgid "male"
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4279
-#, php-format
-msgid "%1$s updated his %2$s"
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4281
-#, php-format
-msgid "%1$s updated their %2$s"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
-msgid "cover photo"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Profile_photo.php:352
-msgid "Photo not available."
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:407
-msgid "Upload File:"
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:408
-msgid "Select a profile:"
+#: ../../Zotlabs/Module/Setup.php:538
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
-#: ../../Zotlabs/Module/Settings/Channel.php:401
-msgid "or"
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "skip this step"
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
-msgid "select a photo from your photo albums"
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:435
-msgid "Crop Image"
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\" "
+"in the top folder of your web server and it is unable to do so."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:436
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:438
-msgid "Done Editing"
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "Off"
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation. "
+"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:55
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#: ../../Zotlabs/Module/Settings/Features.php:38
-msgid "On"
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:56
-#, php-format
-msgid "Lock feature %s"
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Features.php:64
-msgid "Manage Additional Features"
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:28
-msgid "Log settings updated."
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has "
+"write access to this folder."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1618
-#: ../../include/widgets.php:1628
-msgid "Logs"
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:85
-msgid "Clear"
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:91
-msgid "Debugging"
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level "
+"web folder"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:92
-msgid "Log file"
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:92
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
+"SSL certificate cannot be validated. Fix certificate or disable https access "
+"to this site."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Logs.php:93
-msgid "Log level"
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:69
-msgid "New Profile Field"
+#: ../../Zotlabs/Module/Setup.php:652
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "Field nickname"
+#: ../../Zotlabs/Module/Setup.php:653
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:70
-#: ../../Zotlabs/Module/Admin/Profs.php:90
-msgid "System name of field"
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:71
-#: ../../Zotlabs/Module/Admin/Profs.php:91
-msgid "Input type"
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"Providers are available that issue free certificates which are browser-valid."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Field Name"
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:72
-#: ../../Zotlabs/Module/Admin/Profs.php:92
-msgid "Label on profile pages"
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Help text"
+#: ../../Zotlabs/Module/Setup.php:665
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+"Test: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:73
-#: ../../Zotlabs/Module/Admin/Profs.php:93
-msgid "Additional info (optional)"
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:83
-msgid "Field definition not found"
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:89
-msgid "Edit Profile Field"
+#: ../../Zotlabs/Module/Setup.php:706 ../../addon/rendezvous/rendezvous.php:401
+#: ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1599
-msgid "Profile Fields"
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:148
-msgid "Basic Profile Fields"
+#: ../../Zotlabs/Module/Setup.php:747
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "Advanced Profile Fields"
+#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
+msgid "Continue"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:149
-msgid "(In addition to basic fields)"
+#: ../../Zotlabs/Module/Connect.php:90
+msgid "Premium Channel Setup"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:151
-msgid "All available fields"
+#: ../../Zotlabs/Module/Connect.php:92
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:152
-msgid "Custom Fields"
+#: ../../Zotlabs/Module/Connect.php:93
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Profs.php:156
-msgid "Create Custom Field"
+#: ../../Zotlabs/Module/Connect.php:95 ../../Zotlabs/Module/Connect.php:115
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:77
+#: ../../Zotlabs/Module/Connect.php:96
msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently "
-"insecure."
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:80
+#: ../../Zotlabs/Module/Connect.php:97 ../../Zotlabs/Module/Connect.php:118
msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
+"By continuing, I certify that I have complied with any instructions provided "
+"on this page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:81
-msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/"
-"<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
+#: ../../Zotlabs/Module/Connect.php:106
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:82
-msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
+#: ../../Zotlabs/Module/Connect.php:114
+msgid "Restricted or Premium Channel"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1594
-msgid "Security"
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid "Block public"
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:89
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:90
-msgid "Set \"Transport Security\" HTTP header"
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:91
-msgid "Set \"Content Security Policy\" HTTP header"
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid "Allowed email domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:92
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid "Not allowed email domains"
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:93
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid "Allow communications only from these sites"
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#, php-format
+msgid "Lock feature %s"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:94
-msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
+#: ../../Zotlabs/Module/Admin/Features.php:64
+msgid "Manage Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:95
-msgid "Block communications from these sites"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid "Allow communications only from these channels"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
+#, php-format
+msgid "Executing %s failed. Check system logs."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:96
-msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by default"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:97
-msgid "Block communications from these channels"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:98
-msgid "Only allow embeds from secure (SSL) websites and links."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "Allow unfiltered embedded HTML content only from these domains"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:99
-msgid "One site per line. By default embedded content is filtered."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Security.php:100
-msgid "Block embedded HTML from these domains"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3378
+msgid "Item not found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
-msgid "Disable"
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
msgstr ""
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
#: ../../Zotlabs/Module/Admin/Themes.php:95
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
+msgid "Disable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
msgid "Enable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1597
-msgid "Themes"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437 ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
msgid "Toggle"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:123
-#: ../../Zotlabs/Module/Admin/Plugins.php:339 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/widgets.php:699 ../../include/nav.php:225
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:203
msgid "Settings"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
msgid "Author: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
msgid "Maintainer: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:29
-#, php-format
-msgid "Password changed for account %d."
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:46
-msgid "Account settings updated."
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:61
-msgid "Account not found."
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:68
-msgid "Account Edit"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:69
-msgid "New Password"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:70
-msgid "New Password again"
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:71
-msgid "Technical skill level"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:72
-msgid "Account language (for emails)"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Account_edit.php:73
-msgid "Service class"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:348
+msgid "Install"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:348 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:36
@@ -2063,7 +2151,8 @@ msgid "Account '%s' unblocked"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1592
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr ""
@@ -2082,13 +2171,10 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:879
-#: ../../extend/addon/addon/redred/redred.php:107
-#: ../../extend/addon/addon/rtof/rtof.php:93
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
-#: ../../extend/addon/addon/openid/MysqlProvider.php:56
-#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2247
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2270
msgid "Email"
msgstr ""
@@ -2096,17 +2182,22 @@ msgstr ""
msgid "No registrations."
msgstr ""
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Accounts.php:172
msgid "Deny"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:174
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Block"
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:175
-#: ../../Zotlabs/Module/Connedit.php:602
+#: ../../Zotlabs/Module/Connedit.php:626
msgid "Unblock"
msgstr ""
@@ -2114,7 +2205,7 @@ msgstr ""
msgid "ID"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
msgid "All Channels"
msgstr ""
@@ -2146,6 +2237,37 @@ msgid ""
"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr ""
+
#: ../../Zotlabs/Module/Admin/Channels.php:31
#, php-format
msgid "%s channel censored/uncensored"
@@ -2196,7 +2318,8 @@ msgstr ""
msgid "Channel '%s' code disallowed"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1593
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr ""
@@ -2217,7 +2340,7 @@ msgid "Disallow Code"
msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1815
+#: ../../include/conversation.php:1751
msgid "Channel"
msgstr ""
@@ -2225,13 +2348,6 @@ msgstr ""
msgid "UID"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:882
-#: ../../Zotlabs/Module/Profiles.php:503
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2244,3848 +2360,3703 @@ msgid ""
"channel on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:19
-msgid "Update has been marked successful"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:29
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:32
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Dbsync.php:36
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:39
-#, php-format
-msgid "Update function %s could not be found."
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:55
-msgid "No failed updates."
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:59
-msgid "Failed Updates"
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:61
-msgid "Mark success (if update was manually applied)"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Dbsync.php:62
-msgid "Attempt to execute this update step automatically"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:133
+#: ../../Zotlabs/Module/Admin/Site.php:144
msgid "Site settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2934
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2923
msgid "Default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:169
-#: ../../Zotlabs/Module/Settings/Display.php:143
+#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:171
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "experimental"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:173
+#: ../../Zotlabs/Module/Admin/Site.php:192
msgid "unsupported"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:219
+#: ../../Zotlabs/Module/Admin/Site.php:238
msgid "Yes - with approval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site is not a public server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site has paid access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:246
msgid "My site has free access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:247
msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
-msgid "Basic/Minimal Social Networking"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
-msgid "Standard Configuration (default)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
-msgid "Professional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1591
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "File upload"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:263
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Policies"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:264
-#: ../../include/contact_widgets.php:16
+#: ../../Zotlabs/Module/Admin/Site.php:283 ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:268
-#: ../../extend/addon/addon/statusnet/statusnet.php:890
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
-msgid "Server Configuration/Role"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Site default technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Used to provide a member experience matched to technical comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Lock the technical skill level setting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Members can set their own technical comfort level by default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Banner/Logo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Administrator Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
-#: ../../Zotlabs/Module/Siteinfo.php:23
+#: ../../Zotlabs/Module/Admin/Site.php:297 ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "System language"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "System theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Mobile system theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Allow Feeds as Connections"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "(Heavy system resource usage)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Maximum image size"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Invitation only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Register text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Site homepage to show visitors (default: login box)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Preserve site homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Allowed friend domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Verify Email Addresses"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Force publish"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Import Public Streams"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Login on Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Enable context help"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid ""
"Display contextual help for the current page when the help button is pressed."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr ""
+
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Directory Server URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:322
msgid "Default directory server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:324
msgid "Proxy user"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:325
msgid "Proxy URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Network timeout"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:326
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid "Delivery interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:327
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid "Deliveries per process"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust "
"if necessary to tune system performance. Recommend: 1-5."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid "Poll interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:329
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid "Maximum Load Average"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:330
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "Expiration period in days for imported (grid/network) content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:331
msgid "0 for no expiration of imported content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
-#, php-format
-msgid "Plugin %s enabled."
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:432 ../../include/widgets.php:1596
-msgid "Plugins"
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Disabled - version incompatibility"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:406
-msgid "Enter the public git repository URL of the plugin repo."
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:407
-msgid "Plugin repo git URL"
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "Custom repo name"
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:408
-msgid "(optional)"
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:409
-msgid "Download Plugin Repo"
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:416
-msgid "Install new repo"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:417 ../../Zotlabs/Lib/Apps.php:348
-msgid "Install"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:418
-#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Wiki.php:263
-#: ../../Zotlabs/Module/Wiki.php:288
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
-msgid "Cancel"
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:440
-msgid "Manage Repos"
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:441
-msgid "Installed Plugin Repositories"
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:442
-msgid "Install a New Plugin Repository"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:448
-#: ../../Zotlabs/Module/Connedit.php:891
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:449
-msgid "Switch branch"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:35
-msgid "Queue Statistics"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Total Entries"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Priority"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Destination URL"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Mark hub permanently offline"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Empty queue for this hub"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Last known contact"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently "
+"insecure."
msgstr ""
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:225
-#, php-format
-msgid "Search results for: %s"
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/"
+"<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
-msgid "Layout Name"
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:128
-#: ../../Zotlabs/Module/Layouts.php:131
-msgid "Layout Description (Optional)"
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
msgstr ""
-#: ../../Zotlabs/Module/Editlayout.php:136
-msgid "Edit Layout"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
msgstr ""
-#: ../../Zotlabs/Module/Editwebpage.php:142
-msgid "Page link"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
msgstr ""
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:25
+#: ../../Zotlabs/Module/Admin/Security.php:92
msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
-"\"register\">register as a new $Projectname member</a> to continue."
-msgstr ""
-
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr ""
-
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1781
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/conversation.php:120 ../../include/text.php:1956
-msgid "photo"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1781
-#: ../../include/conversation.php:148 ../../include/text.php:1962
-msgid "status"
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:260
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
-#: ../../include/text.php:1959 ../../include/event.php:1000
-msgid "event"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1810
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by default"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
msgstr ""
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:894
+msgid "My Settings"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid "inherited"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:896
+msgid "Individual Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:221
-msgid "Privacy group is empty"
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:897
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can <strong>not</strong> change those settings here."
msgstr ""
-#: ../../Zotlabs/Module/Network.php:230
-msgid "Privacy group: "
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
msgstr ""
-#: ../../Zotlabs/Module/Network.php:256
-msgid "Invalid connection."
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2287
-msgid "Menus"
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
-msgid "Drop"
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:255
-#: ../../include/page_widgets.php:47
-msgid "Created"
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:48
-msgid "Edited"
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
+#: ../../Zotlabs/Module/Settings/Channel.php:482 ../../include/channel.php:1248
+msgid "Full Name:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
+#: ../../Zotlabs/Module/Settings/Channel.php:498
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:499
msgid ""
-"Please select another location to become primary before removing the primary "
-"location."
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:510 ../../Zotlabs/Module/Profiles.php:733
-#: ../../Zotlabs/Module/Events.php:475
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing "
-"your channel."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+#, php-format
+msgid "This website expires after %d days."
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1415
-msgid "Public Hubs"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:941 ../../include/conversation.php:1099
-msgid "Ratings"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
msgstr ""
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Wiki.php:165
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../include/page_widgets.php:42
-msgid "View"
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:82
-msgid "Could not access contact record."
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:112
-msgid "Could not locate selected profile."
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:257
-msgid "Connection updated."
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:259
-msgid "Failed to update connection record."
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:309
-msgid "is now connected to"
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:442
-msgid "Could not access address book record."
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:462
-msgid "Refresh failed - channel is currently unavailable."
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:477 ../../Zotlabs/Module/Connedit.php:486
-#: ../../Zotlabs/Module/Connedit.php:495 ../../Zotlabs/Module/Connedit.php:504
-#: ../../Zotlabs/Module/Connedit.php:517
-msgid "Unable to set address book parameters."
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:541
-msgid "Connection has been removed."
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:581 ../../Zotlabs/Lib/Apps.php:228
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:936 ../../include/conversation.php:1049
-#: ../../include/nav.php:103
-msgid "View Profile"
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:584
-#, php-format
-msgid "View %s's profile"
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:588
-msgid "Refresh Permissions"
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:591
-msgid "Fetch updated permissions"
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:595
-msgid "Recent Activity"
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:598
-msgid "View recent posts and comments"
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:605
-msgid "Block (or Unblock) all communications with this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:606
-msgid "This connection is blocked!"
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:610
-msgid "Unignore"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:613
-msgid "Ignore (or Unignore) all inbound communications from this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:614
-msgid "This connection is ignored!"
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:618
-msgid "Unarchive"
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:618
-msgid "Archive"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:621
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:622
-msgid "This connection is archived!"
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:626
-msgid "Unhide"
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:626
-msgid "Hide"
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:629
-msgid "Hide or Unhide this connection from your other connections"
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:630
-msgid "This connection is hidden!"
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:637
-msgid "Delete this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:559
+msgid ""
+"Also show new wall posts, private messages and connections under Notices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:648
-msgid "Open Individual Permissions section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:671
-msgid "Affinity"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:674
-msgid "Open Set Affinity section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:678 ../../include/widgets.php:540
-msgid "Me"
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:679 ../../include/widgets.php:541
-msgid "Family"
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:680
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/widgets.php:542
-#: ../../include/channel.php:408 ../../include/channel.php:409
-#: ../../include/channel.php:416
-msgid "Friends"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:681 ../../include/widgets.php:543
-msgid "Acquaintances"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:708
-msgid "Filter"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:711
-msgid "Open Custom Filter section by default"
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:748
-msgid "Approve this connection"
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:748
-msgid "Accept connection to allow communication"
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:753
-msgid "Set Affinity"
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:756
-msgid "Set Profile"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:759
-msgid "Set Affinity & Profile"
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#, php-format
+msgid "This channel is limited to %d tokens"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:817
-msgid "none"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:820 ../../include/widgets.php:675
-msgid "Connection Default Permissions"
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:820 ../../include/items.php:3932
-#, php-format
-msgid "Connection: %s"
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:821
-msgid "Apply these permissions automatically"
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:821
-msgid "Connection requests will be approved without your interaction"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:822
-msgid "Permission role"
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:823
-msgid "Add permission role"
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:829
-msgid "This connection's primary address is"
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:830
-msgid "Available locations:"
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:893
+msgid "Their Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:834
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:835
-msgid "Connection Tools"
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:837
-msgid "Slide to adjust your degree of friendship"
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:838 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:839
-msgid "Slide to adjust your rating"
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:840 ../../Zotlabs/Module/Connedit.php:845
-msgid "Optionally explain your rating"
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:842
-msgid "Custom Filter"
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:843
-msgid "Only import posts with this text"
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:843 ../../Zotlabs/Module/Connedit.php:844
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:844
-msgid "Do not import posts with this text"
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:846
-msgid "This information is public!"
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:851
-msgid "Connection Pending Approval"
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:854
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Settings/Permcats.php:107
-msgid "inherited"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:856
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:858
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:859
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Settings/Permcats.php:105
-msgid "My Settings"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:861
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Settings/Permcats.php:110
-msgid "Individual Permissions"
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:862
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Permcats.php:111
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can <strong>not</strong> change those settings here."
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:863
-msgid ""
-"Some permissions may be inherited from your channel's <a href=\"settings"
-"\"><strong>privacy settings</strong></a>, which have higher priority than "
-"individual settings. You can change those settings here but they wont have "
-"any impact unless the inherited setting changes."
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:864
-msgid "Last update:"
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:873
-msgid "Details"
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:876
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:877
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:878
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:880
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:881
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
+#: ../../Zotlabs/Module/Settings/Display.php:148
+#, php-format
+msgid "%s - (Experimental)"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:883
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:884
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../include/connections.php:894
-msgid "Mobile"
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:885
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../include/connections.php:895
-msgid "Home"
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:886
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../include/connections.php:898
-msgid "Work"
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:888
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
-msgid "Add Contact"
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:889
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:894
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:895
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:896
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid ""
+"The subjective page load time will be longer but the page will be ready when "
+"displayed"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:897
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:898
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:899
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:900 ../../Zotlabs/Module/Profiles.php:756
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-#: ../../extend/addon/addon/opensearch/opensearch.php:42
-msgid "$Projectname"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
msgstr ""
-#: ../../Zotlabs/Module/Home.php:92
-#, php-format
-msgid "Welcome to %s"
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
msgstr ""
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1836
-msgid "Photos"
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
msgstr ""
-#: ../../Zotlabs/Module/Apps.php:45 ../../include/widgets.php:102
-#: ../../include/nav.php:178
-msgid "Apps"
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:605
-msgid "l, F j"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:660
-#: ../../include/text.php:1764
-msgid "Link to Source"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Edit Event"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
-msgid "Create Event"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:691
-#: ../../include/channel.php:1370
-msgid "Export"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires this"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2310
-msgid "Import"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:700
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3899
-msgid "Privacy group not found."
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../Zotlabs/Module/Photos.php:751
+#: ../../Zotlabs/Module/Photos.php:1290 ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Module/Photos.php:757
+#: ../../Zotlabs/Module/Photos.php:1213 ../../Zotlabs/Lib/Apps.php:561
+#: ../../Zotlabs/Lib/Apps.php:639 ../../Zotlabs/Storage/Browser.php:163
+#: ../../Zotlabs/Widget/Album.php:84 ../../addon/cdav/Mod_Cdav.php:745
+#: ../../addon/cdav/Mod_Cdav.php:746 ../../addon/cdav/Mod_Cdav.php:753
+#: ../../include/conversation.php:1110
+msgid "Unknown"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../Zotlabs/Module/Photos.php:782
+#: ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
+#: ../../Zotlabs/Module/Embedphotos.php:157 ../../Zotlabs/Module/Photos.php:784
+#: ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
+#: ../../Zotlabs/Module/Thing.php:196
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:680 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152 ../../include/acl_selectors.php:218
+msgid "Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
+#: ../../Zotlabs/Module/Notify.php:57 ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
+#: ../../Zotlabs/Module/Notify.php:61 ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
msgstr ""
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
+#: ../../Zotlabs/Module/Import.php:144
+#, php-format
+msgid "Your service plan only allows %d channels."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
+#: ../../Zotlabs/Module/Import.php:492
+msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
+#: ../../Zotlabs/Module/Import.php:497
+msgid "Import Channel"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:194
-#, php-format
-msgid "%s element installation failed"
+#: ../../Zotlabs/Module/Import.php:498
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You "
+"may retrieve the channel identity from the old server/hub via the network or "
+"provide an export file."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:57
-msgid "Nothing to import."
+#: ../../Zotlabs/Module/Import.php:500
+msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:69
-#: ../../Zotlabs/Module/Import.php:84
-msgid "Unable to download data from old server"
+#: ../../Zotlabs/Module/Import.php:501
+msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:91
-msgid "Imported file is empty."
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Your old login email address"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:111
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old login password"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
+#: ../../Zotlabs/Module/Import.php:504
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be "
+"able to post from either location, but only one can be marked as the primary "
+"location for files, photos, and media."
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Make this hub my primary location"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:120
-msgid "Use this form to import existing posts and content from an export file."
+#: ../../Zotlabs/Module/Import.php:506
+msgid "Move this channel (disable all previous locations)"
msgstr ""
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:495
-msgid "File to Upload"
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Import a few months of posts if possible (limited by available memory"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
+#: ../../Zotlabs/Module/Import.php:508
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:813
-#: ../../Zotlabs/Module/Wiki.php:166 ../../Zotlabs/Module/Chat.php:255
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
-msgid "Create New"
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1982
+msgid "Remote Authentication"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:223
-msgid "Channel Manager"
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1983
+msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1984
+msgid "Authenticate"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2299
+msgid "Import"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:134
-#, php-format
-msgid "Your service plan only allows %d channels."
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:149
-msgid "No channel. Import failed."
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:467
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
-msgid "Import completed."
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:148 ../../Zotlabs/Module/Mail.php:287
+#: ../../Zotlabs/Module/Mail.php:424 ../../include/conversation.php:1228
+msgid "Insert web link"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:488
-msgid "You must be logged in to use this feature."
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:493
-msgid "Import Channel"
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:494
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You "
-"may retrieve the channel identity from the old server/hub via the network or "
-"provide an export file."
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:496
-msgid "Or provide the old server/hub details"
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:497
-msgid "Your old identity address (xyz@example.com)"
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:498
-msgid "Your old login email address"
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:499
-msgid "Your old login password"
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:500
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be "
-"able to post from either location, but only one can be marked as the primary "
-"location for files, photos, and media."
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:501
-msgid "Make this hub my primary location"
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:502
-msgid "Move this channel (disable all previous locations)"
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:503
-msgid "Import a few months of posts if possible (limited by available memory"
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:504
-msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
msgstr ""
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1657
+msgid "New"
msgstr ""
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:494
-msgid "(click to open/close)"
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
+#: ../../Zotlabs/Module/Connections.php:258
+#, php-format
+msgid "%1$s [%2$s]"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Ignore"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:181
+msgid "Connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
+#: ../../Zotlabs/Module/Viewsrc.php:46
+msgid "Source of Item"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
+#: ../../Zotlabs/Module/Removeaccount.php:35
+msgid ""
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:54
-msgid "App installed."
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:47
-msgid "Malformed app."
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Embed code"
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Edit App"
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Create App"
+#: ../../Zotlabs/Module/Photos.php:78
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Name of app"
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
+msgid "Album not found."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:121 ../../Zotlabs/Module/Appman.php:122
-#: ../../Zotlabs/Module/Profiles.php:744 ../../Zotlabs/Module/Profiles.php:748
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../include/datetime.php:259
-msgid "Required"
+#: ../../Zotlabs/Module/Photos.php:103
+msgid "Delete Album"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) of app"
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+msgid "Delete Photo"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:123 ../../Zotlabs/Module/Events.php:473
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
-msgid "Description"
+#: ../../Zotlabs/Module/Photos.php:501
+msgid "No photos selected"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "Photo icon URL"
+#: ../../Zotlabs/Module/Photos.php:550
+msgid "Access to this item is restricted."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:124
-msgid "80 x 80 pixels - optional"
+#: ../../Zotlabs/Module/Photos.php:591
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:125
-msgid "Categories (optional, comma separated list)"
+#: ../../Zotlabs/Module/Photos.php:594
+#, php-format
+msgid "%1$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:126
-msgid "Version ID"
+#: ../../Zotlabs/Module/Photos.php:636
+msgid "Upload Photos"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:127
-msgid "Price of app"
+#: ../../Zotlabs/Module/Photos.php:640
+msgid "Enter an album name"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:128
-msgid "Location (URL) to purchase app"
+#: ../../Zotlabs/Module/Photos.php:641
+msgid "or select an existing album (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
+#: ../../Zotlabs/Module/Photos.php:642
+msgid "Create a status post for this upload"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
+#: ../../Zotlabs/Module/Photos.php:643
+msgid "Caption (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
+#: ../../Zotlabs/Module/Photos.php:644
+msgid "Description (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
+#: ../../Zotlabs/Module/Photos.php:725
+msgid "Show Newest First"
msgstr ""
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
+#: ../../Zotlabs/Module/Photos.php:727
+msgid "Show Oldest First"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
+#: ../../Zotlabs/Module/Photos.php:832
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
-msgid "Mood"
+#: ../../Zotlabs/Module/Photos.php:834
+msgid "Photo not available"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
+#: ../../Zotlabs/Module/Photos.php:892
+msgid "Use as profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:38
-msgid "No more system notifications."
+#: ../../Zotlabs/Module/Photos.php:893
+msgid "Use as cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:42
-msgid "System Notifications"
+#: ../../Zotlabs/Module/Photos.php:900
+msgid "Private Photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
-#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:660
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../Zotlabs/Module/Photos.php:915
+msgid "View Full Size"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
+#: ../../Zotlabs/Module/Photos.php:997
+msgid "Edit photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
-msgid "Profile-"
+#: ../../Zotlabs/Module/Photos.php:999
+msgid "Rotate CW (right)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
-msgid "New profile created."
+#: ../../Zotlabs/Module/Photos.php:1000
+msgid "Rotate CCW (left)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:111
-msgid "Profile unavailable to clone."
+#: ../../Zotlabs/Module/Photos.php:1003
+msgid "Move photo to album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:146
-msgid "Profile unavailable to export."
+#: ../../Zotlabs/Module/Photos.php:1004
+msgid "Enter a new album name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:252
-msgid "Profile Name is required."
+#: ../../Zotlabs/Module/Photos.php:1005
+msgid "or select an existing one (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:460
-msgid "Marital Status"
+#: ../../Zotlabs/Module/Photos.php:1008
+msgid "Caption"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:464
-msgid "Romantic Partner"
+#: ../../Zotlabs/Module/Photos.php:1010
+msgid "Add a Tag"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:468 ../../Zotlabs/Module/Profiles.php:771
-msgid "Likes"
+#: ../../Zotlabs/Module/Photos.php:1018
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:472 ../../Zotlabs/Module/Profiles.php:772
-msgid "Dislikes"
+#: ../../Zotlabs/Module/Photos.php:1021
+msgid "Flag as adult in album view"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:779
-msgid "Work/Employment"
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:479
-msgid "Religion"
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+msgid "I don't like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:483
-msgid "Political Views"
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
+msgid "Please wait"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:487
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
-msgid "Gender"
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
+msgid "This is you"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:491
-msgid "Sexual Preference"
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+msgid "Comment"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:495
-msgid "Homepage"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:499
-msgid "Interests"
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+msgctxt "title"
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:595
-msgid "Profile updated."
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Agree"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:679
-msgid "Hide your connections list from viewers of this profile"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Disagree"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Edit Profile Details"
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+msgctxt "title"
+msgid "Abstain"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:723
-msgid "View this profile"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Attending"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:724 ../../Zotlabs/Module/Profiles.php:806
-#: ../../include/channel.php:1066
-msgid "Edit visibility"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Not attending"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:725
-msgid "Profile Tools"
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+msgctxt "title"
+msgid "Might attend"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Change cover photo"
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
+msgid "View all"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:727 ../../include/channel.php:1037
-msgid "Change profile photo"
-msgstr ""
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1898 ../../include/channel.php:1266
+#: ../../include/taxonomy.php:403
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../Zotlabs/Module/Profiles.php:728
-msgid "Create a new profile using these settings"
-msgstr ""
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1901
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Clone this profile"
+#: ../../Zotlabs/Module/Photos.php:1205
+msgid "Photo Tools"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:730
-msgid "Delete this profile"
+#: ../../Zotlabs/Module/Photos.php:1214
+msgid "In This Photo:"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:731
-msgid "Add profile things"
+#: ../../Zotlabs/Module/Photos.php:1219
+msgid "Map"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:732 ../../include/conversation.php:1715
-#: ../../include/widgets.php:105
-msgid "Personal"
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+msgctxt "noun"
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Relation"
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+msgctxt "noun"
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:735 ../../include/datetime.php:55
-msgid "Miscellaneous"
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../include/acl_selectors.php:220
+msgid "Close"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:737
-msgid "Import profile from file"
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:528
+msgid "Recent Photos"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:738
-msgid "Export profile to file"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "Your gender"
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Marital status"
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "Sexual preference"
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1845
+msgid "Wikis"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:744
-msgid "Profile name"
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:746
-msgid "This is your default profile."
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Create New"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:748
-msgid "Your full name"
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:749
-msgid "Title/Description"
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:752
-msgid "Street address"
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:753
-msgid "Locality/City"
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:754
-msgid "Region/State"
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:755
-msgid "Postal/Zip code"
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:761
-msgid "Who (if applicable)"
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:761
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:762
-msgid "Since (date)"
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:765
-msgid "Tell us about yourself"
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:766
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
-msgid "Homepage URL"
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:767
-msgid "Hometown"
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:768
-msgid "Political views"
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:769
-msgid "Religious views"
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:770
-msgid "Keywords used in directory listings"
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:770
-msgid "Example: fishing photography software"
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:773
-msgid "Musical interests"
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:774
-msgid "Books, literature"
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:775
-msgid "Television"
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:776
-msgid "Film/Dance/Culture/Entertainment"
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:777
-msgid "Hobbies/Interests"
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:778
-msgid "Love/Romance"
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:780
-msgid "School/Education"
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:781
-msgid "Contact information and social networks"
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:782
-msgid "My other channels"
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:802 ../../include/channel.php:1062
-msgid "Profile Image"
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:812 ../../include/channel.php:1044
-#: ../../include/nav.php:105
-msgid "Edit Profiles"
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
msgstr ""
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
msgstr ""
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
+#: ../../Zotlabs/Module/Pdledit.php:21
+msgid "Layout updated."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:86
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
+msgid "Edit System Page Description"
+msgstr ""
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
+#: ../../Zotlabs/Module/Pdledit.php:64
+msgid "Layout not found."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
+#: ../../Zotlabs/Module/Pdledit.php:70
+msgid "Module Name:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
+#: ../../Zotlabs/Module/Pdledit.php:71
+msgid "Layout Help"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
-msgid "Your message:"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:1042
+msgid "Poke"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:142
-msgid "1. Register at any $Projectname location (they are all inter-connected)"
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:646
+msgid "Profile Photos"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1972
-msgid "Administrator"
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:30
-msgid ""
-"Federated and decentralised networking and identity services provided by Zot"
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:32
-#, php-format
-msgid "Version %s"
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:33
-msgid "Project homepage"
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Developer homepage"
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:184
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:750
-msgid "Please see the file \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
+#: ../../Zotlabs/Module/Item.php:450
+msgid "Empty post discarded."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
+#: ../../Zotlabs/Module/Item.php:824
+msgid "Duplicate post suppressed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+#: ../../Zotlabs/Module/Item.php:954
+msgid "System error. Post not saved."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
+#: ../../Zotlabs/Module/Item.php:1084
+msgid "Unable to obtain post information from database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
+#: ../../Zotlabs/Module/Item.php:1091
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
+#: ../../Zotlabs/Module/Item.php:1098
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Page.php:131
msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
+"quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
+#: ../../Zotlabs/Module/Connedit.php:79
+msgid "Could not access contact record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
+#: ../../Zotlabs/Module/Connedit.php:109
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
+#: ../../Zotlabs/Module/Connedit.php:246
+msgid "Connection updated."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
+#: ../../Zotlabs/Module/Connedit.php:248
+msgid "Failed to update connection record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
+#: ../../Zotlabs/Module/Connedit.php:298
+msgid "is now connected to"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
+#: ../../Zotlabs/Module/Connedit.php:431
+msgid "Could not access address book record."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../Zotlabs/Module/Connedit.php:479
+msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
+#: ../../Zotlabs/Module/Connedit.php:494 ../../Zotlabs/Module/Connedit.php:503
+#: ../../Zotlabs/Module/Connedit.php:512 ../../Zotlabs/Module/Connedit.php:521
+#: ../../Zotlabs/Module/Connedit.php:534
+msgid "Unable to set address book parameters."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
+#: ../../Zotlabs/Module/Connedit.php:558
+msgid "Connection has been removed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
+#: ../../Zotlabs/Module/Connedit.php:598 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:102
+msgid "View Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
+#: ../../Zotlabs/Module/Connedit.php:601
+#, php-format
+msgid "View %s's profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
+#: ../../Zotlabs/Module/Connedit.php:605
+msgid "Refresh Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../Zotlabs/Module/Connedit.php:608
+msgid "Fetch updated permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
+#: ../../Zotlabs/Module/Connedit.php:612
+msgid "Refresh Photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "Fetch updated photo"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:454
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to "
-"upload is set to %s. You are allowed to upload up to %d files at once."
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Recent Activity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "View recent posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Block (or Unblock) all communications with this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "This connection is blocked!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Unignore"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid "Ignore (or Unignore) all inbound communications from this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "libCurl PHP module"
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "This connection is ignored!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:506
-msgid "GD graphics PHP module"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Unarchive"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:507
-msgid "OpenSSL PHP module"
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Archive"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:508
-msgid "PDO database PHP module"
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:509
-msgid "mb_string PHP module"
+#: ../../Zotlabs/Module/Connedit.php:646
+msgid "This connection is archived!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:510
-msgid "xml PHP module"
+#: ../../Zotlabs/Module/Connedit.php:650
+msgid "Unhide"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
-msgid "Apache mod_rewrite module"
+#: ../../Zotlabs/Module/Connedit.php:650
+msgid "Hide"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Hide or Unhide this connection from your other connections"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
-msgid "exec"
+#: ../../Zotlabs/Module/Connedit.php:654
+msgid "This connection is hidden!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520
-msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
+#: ../../Zotlabs/Module/Connedit.php:661
+msgid "Delete this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
-msgid "shell_exec"
+#: ../../Zotlabs/Module/Connedit.php:669
+msgid "Fetch Vcard"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
+#: ../../Zotlabs/Module/Connedit.php:672
+msgid "Fetch electronic calling card for this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:534
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:683
+msgid "Open Individual Permissions section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:538
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:542
-msgid "Error: openssl PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:709
+msgid "Open Set Affinity section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:546
-msgid "Error: PDO database PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:26
+msgid "Me"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:550
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../Zotlabs/Module/Connedit.php:714 ../../Zotlabs/Widget/Affinity.php:27
+msgid "Family"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:554
-msgid "Error: xml PHP module required for DAV but not installed."
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:29
+msgid "Acquaintances"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:572
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\" "
-"in the top folder of your web server and it is unable to do so."
+#: ../../Zotlabs/Module/Connedit.php:743
+msgid "Filter"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
+#: ../../Zotlabs/Module/Connedit.php:746
+msgid "Open Custom Filter section by default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:574
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Approve this connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:575
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation. "
-"Please see the file \"install/INSTALL.txt\" for instructions."
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Accept connection to allow communication"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:578
-msgid ".htconfig.php is writable"
+#: ../../Zotlabs/Module/Connedit.php:788
+msgid "Set Affinity"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:592
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
+#: ../../Zotlabs/Module/Connedit.php:791
+msgid "Set Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:593
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Set Affinity & Profile"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has "
-"write access to this folder."
+#: ../../Zotlabs/Module/Connedit.php:852
+msgid "none"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:595
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
+#: ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Widget/Settings_menu.php:107
+msgid "Connection Default Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Connedit.php:855 ../../include/items.php:3942
#, php-format
-msgid "%s is writable"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:614
-msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level "
-"web folder"
+msgid "Connection: %s"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:618
-msgid "store is writable"
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "Apply these permissions automatically"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access "
-"to this site."
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "Connection requests will be approved without your interaction"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:652
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
+#: ../../Zotlabs/Module/Connedit.php:857
+msgid "Permission role"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
+#: ../../Zotlabs/Module/Connedit.php:858
+msgid "Add permission role"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:654
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
+#: ../../Zotlabs/Module/Connedit.php:864
+msgid "This connection's primary address is"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:655
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
+#: ../../Zotlabs/Module/Connedit.php:865
+msgid "Available locations:"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:656
+#: ../../Zotlabs/Module/Connedit.php:869
msgid ""
-"Providers are available that issue free certificates which are browser-valid."
+"The permissions indicated on this page will be applied to all new "
+"connections."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:658
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
+#: ../../Zotlabs/Module/Connedit.php:870
+msgid "Connection Tools"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:660
-msgid "SSL certificate validation"
+#: ../../Zotlabs/Module/Connedit.php:872
+msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:666
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-"Test: "
+#: ../../Zotlabs/Module/Connedit.php:873 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:669
-msgid "Url rewrite is working"
+#: ../../Zotlabs/Module/Connedit.php:874
+msgid "Slide to adjust your rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:683
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
+#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:880
+msgid "Optionally explain your rating"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:707
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
-msgid "Errors encountered creating database tables."
+#: ../../Zotlabs/Module/Connedit.php:877
+msgid "Custom Filter"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:748
-msgid "<h1>What next</h1>"
+#: ../../Zotlabs/Module/Connedit.php:878
+msgid "Only import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:749
+#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:879
msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
-msgstr ""
-
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
-msgid "Mark all system notifications seen"
-msgstr ""
-
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:942 ../../include/conversation.php:1109
-msgid "Poke"
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
+#: ../../Zotlabs/Module/Connedit.php:879
+msgid "Do not import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "This information is public!"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
+#: ../../Zotlabs/Module/Connedit.php:886
+msgid "Connection Pending Approval"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
+#: ../../Zotlabs/Module/Connedit.php:891
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
+#: ../../Zotlabs/Module/Connedit.php:898
+msgid ""
+"Some permissions may be inherited from your channel's <a href=\"settings"
+"\"><strong>privacy settings</strong></a>, which have higher priority than "
+"individual settings. You can change those settings here but they wont have "
+"any impact unless the inherited setting changes."
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
+#: ../../Zotlabs/Module/Connedit.php:899
+msgid "Last update:"
msgstr ""
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
+#: ../../Zotlabs/Module/Connedit.php:908
+msgid "Details"
msgstr ""
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
+#: ../../Zotlabs/Module/Connedit.php:911 ../../addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
+#: ../../Zotlabs/Module/Connedit.php:912 ../../addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:450
-msgid "Empty post discarded."
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:492
-msgid "Executable content type not permitted to this channel."
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:842
-msgid "Duplicate post suppressed."
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:984
-msgid "System error. Post not saved."
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1114
-msgid "Unable to obtain post information from database."
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
+msgid "Mobile"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1121
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
+msgid "Home"
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1128
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
+#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
+msgid "Work"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
+#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149 ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
msgstr ""
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please "
-"leave this page unless you are comfortable with and knowledgeable about how "
-"to correctly use this feature."
+#: ../../Zotlabs/Module/Connedit.php:929 ../../addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
msgstr ""
-#: ../../Zotlabs/Module/Profile.php:78
-msgid "vcard"
+#: ../../Zotlabs/Module/Connedit.php:930 ../../addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2286
-msgid "Blocks"
+#: ../../Zotlabs/Module/Connedit.php:931 ../../addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:156
-msgid "Block Title"
+#: ../../Zotlabs/Module/Connedit.php:932 ../../addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2288
-msgid "Layouts"
+#: ../../Zotlabs/Module/Connedit.php:933 ../../addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:174 ../../include/help.php:53
-#: ../../include/help.php:59
-msgid "Help"
+#: ../../Zotlabs/Module/Connedit.php:934 ../../addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:185
-msgid "Comanche page description language help"
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:189
-msgid "Layout Description"
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:194
-msgid "Download PDL file"
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:156
-msgid "Website:"
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:159
-#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Rating (this information is public)"
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
msgstr ""
-#: ../../Zotlabs/Module/Rate.php:161
-msgid "Optionally explain your rating (this information is public)"
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:186
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:296
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:240
+#: ../../Zotlabs/Module/Mail.php:361 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Use Photo for Profile"
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:293
+#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload Profile Photo"
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
msgstr ""
-#: ../../Zotlabs/Module/Profile_photo.php:410
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
-msgid "Use"
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:110
-msgid "Event can not end before it has started."
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
-#: ../../Zotlabs/Module/Events.php:143
-msgid "Unable to generate preview."
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:119
-msgid "Event title and start time are required."
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
-msgid "Event not found."
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1774
+msgid "Photos"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1782
+msgid "Files"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Categories (comma-separated list)"
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Edit Category"
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:463
-msgid "Category"
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit start date and time"
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
-msgid "Finish date and time are not known or not relevant"
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Edit finish date and time"
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:469
-msgid "Finish date and time"
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
-msgid "Adjust for viewer timezone"
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2276
+msgid "Menus"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:471
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:473
-msgid "Edit Description"
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:475
-msgid "Edit Location"
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
-msgid "Permission settings"
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:489
-msgid "Timezone:"
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
msgstr ""
-#: ../../Zotlabs/Module/Events.php:494
-msgid "Advanced Options"
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:633
-msgid "Edit event"
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:635
-msgid "Delete event"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:669
-msgid "calendar"
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:695
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:696
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:697
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:731
-msgid "Event removed"
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2277
+msgid "Layouts"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:734
-msgid "Failed to remove event"
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:157 ../../include/nav.php:264
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
msgstr ""
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
msgstr ""
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1953
+msgid "comment"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
+#: ../../Zotlabs/Module/Tagger.php:95
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1367
-msgid "Profile"
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please "
+"leave this page unless you are comfortable with and knowledgeable about how "
+"to correctly use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
-msgid "You must be logged in to see this page."
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3909
+msgid "Privacy group not found."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
-#, php-format
-msgid "Site Member (%s)"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:68
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1740
-msgid "Password Reset"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your password has been reset as requested."
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Your new password is"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "Save or copy your new password - and then"
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid "click here to login"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
+msgid "Profile not found."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:96
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:117
-#, php-format
-msgid "Your password has changed at %s"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
+msgid "Profile-"
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Forgot your Password?"
+#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
+msgid "New profile created."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:131
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+#: ../../Zotlabs/Module/Profiles.php:111
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:132
-msgid "Email Address"
+#: ../../Zotlabs/Module/Profiles.php:146
+msgid "Profile unavailable to export."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:133
-msgid "Reset"
+#: ../../Zotlabs/Module/Profiles.php:252
+msgid "Profile Name is required."
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
+#: ../../Zotlabs/Module/Profiles.php:459
+msgid "Marital Status"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
+#: ../../Zotlabs/Module/Profiles.php:463
+msgid "Romantic Partner"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
+msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
+msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
+msgid "Work/Employment"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
+#: ../../Zotlabs/Module/Profiles.php:478
+msgid "Religion"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1991
-msgid "Remote Authentication"
+#: ../../Zotlabs/Module/Profiles.php:482
+msgid "Political Views"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1992
-msgid "Enter your channel address (e.g. channel@example.com)"
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../addon/openid/MysqlProvider.php:74
+msgid "Gender"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1993
-msgid "Authenticate"
+#: ../../Zotlabs/Module/Profiles.php:490
+msgid "Sexual Preference"
msgstr ""
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
+#: ../../Zotlabs/Module/Profiles.php:494
+msgid "Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:35
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
+#: ../../Zotlabs/Module/Profiles.php:498
+msgid "Interests"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid "Remove This Account"
+#: ../../Zotlabs/Module/Profiles.php:594
+msgid "Profile updated."
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "WARNING: "
+#: ../../Zotlabs/Module/Profiles.php:678
+msgid "Hide your connections list from viewers of this profile"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
+#: ../../Zotlabs/Module/Profiles.php:725
+msgid "Edit Profile Details"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This action is permanent and can not be undone!"
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "View this profile"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:59
-#: ../../Zotlabs/Module/Removeme.php:62
-msgid "Please enter your password for verification:"
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
+#: ../../include/channel.php:1064
+msgid "Edit visibility"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Profile Tools"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:60
-msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Change cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Removeaccount.php:61
-#: ../../Zotlabs/Module/Settings/Account.php:120
-msgid "Remove Account"
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1035
+msgid "Change profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:21
-msgid "Layout updated."
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Clone this profile"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
-msgid "Edit System Page Description"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Delete this profile"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:64
-msgid "Layout not found."
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Add profile things"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:70
-msgid "Module Name:"
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1648
+msgid "Personal"
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:71
-msgid "Layout Help"
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Relation"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Channel"
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
+msgid "Miscellaneous"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Import profile from file"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export Content"
+#: ../../Zotlabs/Module/Profiles.php:742
+msgid "Export profile to file"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:61
-msgid ""
-"Export your channel information and recent content to a JSON backup that can "
-"be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for "
-"this download to begin."
+#: ../../Zotlabs/Module/Profiles.php:743
+msgid "Your gender"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:63
-msgid "Export your posts from a given year."
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Marital status"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:65
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
+#: ../../Zotlabs/Module/Profiles.php:745
+msgid "Sexual preference"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:66
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a href=\"%1$s"
-"\">%2$s</a>"
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "Profile name"
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:67
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
+#: ../../Zotlabs/Module/Profiles.php:750
+msgid "This is your default profile."
msgstr ""
-#: ../../Zotlabs/Module/Uexport.php:68
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a href=\"%1$s\">"
-"%2$s</a> on any site containing your channel. For best results please import "
-"or restore these in date order (oldest first)."
+#: ../../Zotlabs/Module/Profiles.php:752
+msgid "Your full name"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:246
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../Zotlabs/Module/Directory.php:257
-msgid "Gender: "
+#: ../../Zotlabs/Module/Profiles.php:753
+msgid "Title/Description"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:259
-msgid "Status: "
+#: ../../Zotlabs/Module/Profiles.php:756
+msgid "Street address"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:261
-msgid "Homepage: "
+#: ../../Zotlabs/Module/Profiles.php:757
+msgid "Locality/City"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
-msgid "Age:"
+#: ../../Zotlabs/Module/Profiles.php:758
+msgid "Region/State"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:315 ../../include/markdown.php:561
-#: ../../include/channel.php:1134 ../../include/event.php:52
-#: ../../include/event.php:84
-msgid "Location:"
+#: ../../Zotlabs/Module/Profiles.php:759
+msgid "Postal/Zip code"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:321
-msgid "Description:"
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Who (if applicable)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
-msgid "Hometown:"
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
-msgid "About:"
+#: ../../Zotlabs/Module/Profiles.php:766
+msgid "Since (date)"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
-#: ../../include/connections.php:110 ../../include/conversation.php:938
-#: ../../include/conversation.php:1069 ../../include/widgets.php:148
-#: ../../include/widgets.php:185 ../../include/channel.php:1119
-msgid "Connect"
+#: ../../Zotlabs/Module/Profiles.php:769
+msgid "Tell us about yourself"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:330
-msgid "Public Forum:"
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:333
-msgid "Keywords: "
+#: ../../Zotlabs/Module/Profiles.php:771
+msgid "Hometown"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:336
-msgid "Don't suggest"
+#: ../../Zotlabs/Module/Profiles.php:772
+msgid "Political views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:338
-msgid "Common connections:"
+#: ../../Zotlabs/Module/Profiles.php:773
+msgid "Religious views"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Global Directory"
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Keywords used in directory listings"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:387
-msgid "Local Directory"
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:393
-msgid "Finding:"
+#: ../../Zotlabs/Module/Profiles.php:777
+msgid "Musical interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
+#: ../../Zotlabs/Module/Profiles.php:778
+msgid "Books, literature"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "next page"
+#: ../../Zotlabs/Module/Profiles.php:779
+msgid "Television"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "previous page"
+#: ../../Zotlabs/Module/Profiles.php:780
+msgid "Film/Dance/Culture/Entertainment"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Sort options"
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:782
+msgid "Love/Romance"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Reverse Alphabetic"
+#: ../../Zotlabs/Module/Profiles.php:784
+msgid "School/Education"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Newest to Oldest"
+#: ../../Zotlabs/Module/Profiles.php:785
+msgid "Contact information and social networks"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:403
-msgid "Oldest to Newest"
+#: ../../Zotlabs/Module/Profiles.php:786
+msgid "My other channels"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:420
-msgid "No entries (some entries may be hidden)."
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
msgstr ""
-#: ../../Zotlabs/Module/Chatsvc.php:131
-msgid "Away"
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1060
+msgid "Profile Image"
msgstr ""
-#: ../../Zotlabs/Module/Chatsvc.php:136
-msgid "Online"
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1042
+#: ../../include/nav.php:105
+msgid "Edit Profiles"
msgstr ""
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
+#: ../../Zotlabs/Module/Editwebpage.php:144
+msgid "Page link"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
+#: ../../Zotlabs/Module/Editwebpage.php:171
+msgid "Edit Webpage"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:201
+msgid "Channel Manager"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1889
-msgid "Webpages"
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
-msgid "Actions"
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
-msgid "Page Link"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:254
-msgid "Page Title"
+#: ../../Zotlabs/Module/Manage.php:172
+#, php-format
+msgid "%d new messages"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:284
-msgid "Invalid file type."
+#: ../../Zotlabs/Module/Manage.php:173
+#, php-format
+msgid "%d new introductions"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:296
-msgid "Error opening zip file"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:307
-msgid "Invalid folder path."
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:334
-msgid "No webpage elements detected."
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:409
-msgid "Import complete."
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:35
-msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1995
+msgid "Administrator"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Remove This Channel"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "This channel will be completely removed from the network. "
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
-msgid "Remove this channel and all its clones from the network"
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Siteinfo.php:30
msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr ""
-
-#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:558
-msgid "Remove Channel"
+"Federated and decentralised networking and identity services provided by Zot"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:29
-msgid "Profile Unavailable."
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:43
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
-msgid "Not found"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:67
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
-msgid "Invalid channel"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:158
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
-#: ../../include/conversation.php:1900
-msgid "Wikis"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:164
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
-msgid "Download"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:168
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
-msgid "Wiki name"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:169
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
-msgid "Content type"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:178
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
-msgid "Create a status post for this wiki"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:203
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
-msgid "Wiki not found"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1832
+msgid "Webpages"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:227
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
-msgid "Rename page"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:231
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
-msgid "Error retrieving page content"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:261
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
-msgid "Revision Comparison"
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:262
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
-msgid "Revert"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:266
-msgid "Short description of your changes (optional)"
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:273
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
-msgid "Source"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:281
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
-msgid "New page name"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:286
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
-#: ../../include/conversation.php:1299
-msgid "Embed image from photo albums"
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:287
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1393
-msgid "Embed an image from your albums"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:289
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
-#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
-msgid "OK"
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:290
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1335
-msgid "Choose images to embed"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:291
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1336
-msgid "Choose an album"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:292
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
-msgid "Choose a different album"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:293
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
-#: ../../include/conversation.php:1338
-msgid "Error getting album list"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:294
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1339
-msgid "Error getting photo link"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:295
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1340
-msgid "Error getting album"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:364
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
-msgid "Error creating wiki. Invalid name."
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:376
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
-msgid "Wiki created, but error creating Home page."
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:383
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
-msgid "Error creating wiki"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:395
-msgid "Wiki delete permission denied."
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:405
-msgid "Error deleting wiki"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:431
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
-msgid "New page created"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:546
-msgid "Cannot delete Home"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Current Revision"
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:610
-msgid "Selected Revision"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:660
-msgid "You must be authenticated."
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
msgstr ""
#: ../../Zotlabs/Module/Sources.php:37
@@ -6104,8 +6075,8 @@ msgstr ""
msgid "*"
msgstr ""
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:691
-#: ../../include/features.php:213
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
msgid "Channel Sources"
msgstr ""
@@ -6141,11 +6112,6 @@ msgid ""
"separated)"
msgstr ""
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-msgid "Optional"
-msgstr ""
-
#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
msgid "Source not found."
msgstr ""
@@ -6166,1013 +6132,1138 @@ msgstr ""
msgid "Unable to remove source."
msgstr ""
-#: ../../Zotlabs/Module/Subthread.php:118
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a href="
+"\"register\">register as a new $Projectname member</a> to continue."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:160
#, php-format
-msgid "%1$s is following %2$s's %3$s"
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Subthread.php:120
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:39
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:150
-msgid "Ignore/Hide"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
-msgid "post"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
-#: ../../include/text.php:1964
-msgid "comment"
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:95
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Features.php:45
-msgid "Additional Features"
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:34
-msgid "Name is required"
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:38
-msgid "Key and Secret are required"
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:86
-#: ../../Zotlabs/Module/Settings/Oauth.php:112
-#: ../../Zotlabs/Module/Settings/Oauth.php:148
-msgid "Add application"
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-msgid "Name of application"
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:116
-#: ../../extend/addon/addon/statusnet/statusnet.php:893
-#: ../../extend/addon/addon/twitter/twitter.php:775
-msgid "Consumer Key"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:90
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-msgid "Automatically generated - change if desired. Max length 20"
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1291
+msgid "Age:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:91
-#: ../../Zotlabs/Module/Settings/Oauth.php:117
-#: ../../extend/addon/addon/statusnet/statusnet.php:892
-#: ../../extend/addon/addon/twitter/twitter.php:776
-msgid "Consumer Secret"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
+#: ../../include/channel.php:1132 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-#: ../../Zotlabs/Module/Settings/Oauth.php:118
-msgid "Redirect"
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:92
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires this"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1307
+msgid "Hometown:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:93
-#: ../../Zotlabs/Module/Settings/Oauth.php:119
-msgid "Icon url"
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1315
+msgid "About:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:104
-msgid "Application not found."
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1117
+#: ../../include/connections.php:110
+msgid "Connect"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:147
-msgid "Connected Apps"
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:151
-msgid "Client key starts with"
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:152
-msgid "No name"
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Oauth.php:153
-msgid "Remove authorization"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:20
-msgid "Not valid email."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:23
-msgid "Protected email address. Cannot change to that email."
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:32
-msgid "System failure storing new email. Please try again."
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:40
-msgid "Technical skill level updated"
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:56
-msgid "Password verification failed."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:63
-msgid "Passwords do not match. Password unchanged."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:67
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:81
-msgid "Password changed."
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:83
-msgid "Password update failed. Please try again."
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:112
-msgid "Account Settings"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:113
-msgid "Current Password"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:114
-msgid "Enter New Password"
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Confirm New Password"
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:115
-msgid "Leave password fields blank unless changing"
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Your technical skill level"
+#: ../../Zotlabs/Module/Suggest.php:37
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:116
-msgid "Used to provide a member experience matched to your comfort level"
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+msgid "Ignore/Hide"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:467
-msgid "Email Address:"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Account.php:121
-msgid "Remove this account including all its channels"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:658
-msgid "Guest Access Tokens"
+#: ../../Zotlabs/Module/Mail.php:213
+msgid "Message recalled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
+#: ../../Zotlabs/Module/Mail.php:226
+msgid "Conversation removed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
+#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:362
+msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
+#: ../../Zotlabs/Module/Mail.php:269
+msgid "Requested channel is not in this network"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:20
-msgid "Affinity Slider settings updated."
+#: ../../Zotlabs/Module/Mail.php:277
+msgid "Send Private Message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:34
-msgid "No feature settings configured"
+#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:415
+msgid "To:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:41
-msgid "Default maximum affinity level"
+#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:417
+msgid "Subject:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:46
-msgid "Default minimum affinity level"
+#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:423
+#: ../../include/conversation.php:1323
+msgid "Attach file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:50
-msgid "Affinity Slider Settings"
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Send"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:60
-msgid "Feature/Addon Settings"
+#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:428
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:248
-#: ../../extend/addon/addon/logrot/logrot.php:54
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
-#: ../../extend/addon/addon/piwik/piwik.php:116
-#: ../../extend/addon/addon/twitter/twitter.php:766
-#: ../../extend/addon/addon/xmpp/xmpp.php:102
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:82
-msgid "Settings updated."
+#: ../../Zotlabs/Module/Mail.php:387
+msgid "Delete message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:309
-msgid "Nobody except yourself"
+#: ../../Zotlabs/Module/Mail.php:388
+msgid "Delivery report"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:310
-msgid "Only those you specifically allow"
+#: ../../Zotlabs/Module/Mail.php:389
+msgid "Recall message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:311
-msgid "Approved connections"
+#: ../../Zotlabs/Module/Mail.php:391
+msgid "Message has been recalled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:312
-msgid "Any connections"
+#: ../../Zotlabs/Module/Mail.php:408
+msgid "Delete Conversation"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:313
-msgid "Anybody on this website"
+#: ../../Zotlabs/Module/Mail.php:410
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:314
-msgid "Anybody in this network"
+#: ../../Zotlabs/Module/Mail.php:414
+msgid "Send Reply"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:315
-msgid "Anybody authenticated"
+#: ../../Zotlabs/Module/Mail.php:419
+#, php-format
+msgid "Your message for %s (%s):"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:316
-msgid "Anybody on the internet"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:392
-msgid "Publish your default profile in the network directory"
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:397
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:406
-msgid "Your channel address is"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:409
-msgid "Your files/photos are accessible via WebDAV at"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:458
-msgid "Channel Settings"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:465
-msgid "Basic Settings"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:466
-#: ../../include/channel.php:1255
-msgid "Full Name:"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:468
-msgid "Your Timezone:"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:469
-msgid "Default Post Location:"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:469
-msgid "Geographical location to display on your posts"
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:470
-msgid "Use Browser Location:"
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:472
-msgid "Adult Content"
+#: ../../Zotlabs/Module/Impel.php:181
+#, php-format
+msgid "%s element installed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:472
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
+#: ../../Zotlabs/Module/Impel.php:184
+#, php-format
+msgid "%s element installation failed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:474
-msgid "Security and Privacy Settings"
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:477
-msgid "Your permissions are already configured. Click to view/adjust"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:479
-msgid "Hide my online presence"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:479
-msgid "Prevents displaying in your profile that you are online"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:481
-msgid "Simple Privacy Settings:"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr ""
+
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr ""
+
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr ""
+
+#: ../../Zotlabs/Module/Register.php:55
msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
+"Please indicate acceptance of the Terms of Service. Registration failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr ""
+
+#: ../../Zotlabs/Module/Register.php:131
msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
+"Registration successful. Please check your email for validation instructions."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:484
-msgid "Private - <em>default private, never open or public</em>"
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:485
-msgid "Blocked - <em>default blocked to/from everybody</em>"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:487
-msgid "Allow others to tag your posts"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:487
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:489
-msgid "Channel Permission Limits"
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:491
-msgid "Expire other channel content after this many days"
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:491
-msgid "0 or blank to use the website limit."
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:491
+#: ../../Zotlabs/Module/Register.php:229
#, php-format
-msgid "This website expires after %d days."
+msgid "I am over 13 years of age and accept the %s for this website"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:491
-msgid "This website does not expire imported content."
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:491
-msgid "The website limit takes precedence if lower than your limit."
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:492
-msgid "Maximum Friend Requests/Day:"
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:492
-msgid "May reduce spam activity"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:493
-msgid "Default Access Control List (ACL)"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:495
-msgid "Use my default audience setting for the type of object published"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:502
-msgid "Channel permissions category:"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Maximum private messages per day from unknown people:"
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1612
+#: ../../include/nav.php:145
+msgid "Register"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
-msgid "Useful to reduce spamming"
+#: ../../Zotlabs/Module/Register.php:271
+msgid ""
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:511
-msgid "Notification Settings"
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:512
-msgid "By default post a status message when:"
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4286
+msgid "female"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:513
-msgid "accepting a friend request"
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4287
+#, php-format
+msgid "%1$s updated her %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:514
-msgid "joining a forum/community"
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4288
+msgid "male"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:515
-msgid "making an <em>interesting</em> profile change"
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4289
+#, php-format
+msgid "%1$s updated his %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:516
-msgid "Send a notification email when:"
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4291
+#, php-format
+msgid "%1$s updated their %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:517
-msgid "You receive a connection request"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1757
+msgid "cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:518
-msgid "Your connections are confirmed"
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:519
-msgid "Someone writes on your profile wall"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:520
-msgid "Someone writes a followup comment"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1764
+msgid "About"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:521
-msgid "You receive a private message"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:522
-msgid "You receive a friend suggestion"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:523
-msgid "You are tagged in a post"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:524
-msgid "You are poked/prodded/etc. in a post"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:526
-msgid "Someone likes your post/comment"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:529
-msgid "Show visual notifications including:"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-msgid "Unseen grid activity"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-msgid "Unseen channel activity"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-msgid "Unseen private messages"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Recommended"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-msgid "Upcoming events"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:535
-msgid "Events today"
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Upcoming birthdays"
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:536
-msgid "Not available in all themes"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:537
-msgid "System (personal) notifications"
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:538
-msgid "System info messages"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:539
-msgid "System critical alerts"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:540
-msgid "New connections"
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:541
-msgid "System Registrations"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:542
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Notify me of events this many days in advance"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:544
-msgid "Must be greater than 0"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-msgid "Advanced Account/Page Type Settings"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:551
-msgid "Change the behaviour of this account for special situations"
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
-msgid "Miscellaneous Settings"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-msgid "Default photo upload folder"
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:554
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "%Y - current year, %m - current month"
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-msgid "Default file upload folder"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:557
-msgid "Personal menu to display in your channel pages"
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:559
-msgid "Remove this channel."
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:560
-msgid "Firefox Share $Projectname provider"
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:561
-msgid "Start calendar week on monday"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:137
-msgid "No special theme for mobile devices"
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr ""
+
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr ""
+
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:140
+#: ../../Zotlabs/Module/Viewconnections.php:78
#, php-format
-msgid "%s - (Experimental)"
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:191
-msgid "Display Settings"
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:192
-msgid "Theme Settings"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:193
-msgid "Custom Theme Settings"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:194
-msgid "Content Settings"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:200
-msgid "Display Theme:"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:201
-msgid "Select scheme"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:203
-msgid "Mobile Theme:"
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid "Preload images before rendering the page"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:204
-msgid ""
-"The subjective page load time will be longer but the page will be ready when "
-"displayed"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:205
-msgid "Enable user zoom on mobile devices"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Update browser every xx seconds"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:206
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum number of conversations to load at any time:"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:207
-msgid "Maximum of 100 items"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:208
-msgid "Show emoticons (smilies) as images"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Manual conversation updates"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is on, turning this off may increase screen jumping"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:210
-msgid "Link post titles to source"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:211
-msgid "System Page Layout Editor - (advanced)"
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:214
-msgid "Use blog/list mode on channel page"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:214
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "(comments displayed separately)"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:215
-msgid "Use blog/list mode on grid page"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:216
-msgid "Channel page max height of content (in pixels)"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:216
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "click to expand content exceeding this height"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Display.php:217
-msgid "Grid page max height of content (in pixels)"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:37
-msgid "Permission category saved."
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:63
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr ""
+
+#: ../../Zotlabs/Module/Lostpass.php:68
msgid ""
-"Use this form to create permission rules for various classes of people or "
-"connections."
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:96 ../../include/widgets.php:666
-msgid "Permission Categories"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1639
+msgid "Password Reset"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Permcats.php:104
-msgid "Permission Name"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
+#: ../../Zotlabs/Module/Lostpass.php:131
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:186
+msgid "Mark all system notifications seen"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
-msgid "Select a profile"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Post an activity"
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
-msgid "Only sends to viewers of the applicable profile"
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
-msgid "Name of thing e.g. something"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
-msgid "URL of thing (optional)"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
-msgid "URL for photo of thing (optional)"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
msgstr ""
-#: ../../Zotlabs/Module/Thing.php:353
-msgid "Add Thing to your Profile"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:65
-msgid "Unable to lookup recipient."
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1631 ../../include/nav.php:113
+msgid "Login"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:72
-msgid "Unable to communicate with requested channel."
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:172
+msgid "Grid"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:79
-msgid "Cannot verify requested channel."
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1848
+#: ../../include/features.php:99
+msgid "Wiki"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:97
-msgid "Selected channel has private message restrictions. Send failed."
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:176
+msgid "Channel Home"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Messages"
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1793
+#: ../../include/conversation.php:1796 ../../include/nav.php:196
+msgid "Events"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:213
-msgid "Message recalled."
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:226
-msgid "Conversation removed."
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:188
+msgid "Mail"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1330
-msgid "Please enter a link URL:"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
-msgid "Expires YYYY-MM-DD HH:MM"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:269
-msgid "Requested channel is not in this network"
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:277
-msgid "Send Private Message"
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
-msgid "To:"
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
-msgid "Subject:"
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
-#: ../../include/conversation.php:1390
-msgid "Attach file"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:288
-msgid "Send"
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
-#: ../../include/conversation.php:1435
-msgid "Set expiration date"
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:743
-#: ../../include/conversation.php:1440
-msgid "Encrypt text"
+#: ../../Zotlabs/Lib/Apps.php:355
+msgid "Purchase"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delete message"
+#: ../../Zotlabs/Lib/Apps.php:359
+msgid "Undelete"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Delivery report"
+#: ../../Zotlabs/Lib/Apps.php:364
+msgid "Add to app-tray"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:377
-msgid "Recall message"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Remove from app-tray"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:379
-msgid "Message has been recalled."
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:396
-msgid "Delete Conversation"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:398
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:402
-msgid "Send Reply"
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:407
-#, php-format
-msgid "Your message for %s (%s):"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:31
+#: ../../Zotlabs/Lib/NativeWikiPage.php:72
+msgid "(No Title)"
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:65
-msgid "No connections."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:86
+msgid "Wiki page create failed."
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:78
-#, php-format
-msgid "Visit %s's profile [%s]"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:99
+msgid "Wiki not found."
msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:107
-msgid "View Connections"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Destination name already exists"
msgstr ""
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:136
+#: ../../Zotlabs/Lib/NativeWikiPage.php:331
+msgid "Page not found"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:166
+msgid "Error reading page content"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:322
+#: ../../Zotlabs/Lib/NativeWikiPage.php:370
+#: ../../Zotlabs/Lib/NativeWikiPage.php:437
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Error reading wiki"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:358
+msgid "Page update failed."
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:392
+msgid "Nothing deleted"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:458
+msgid "Compare: object not found."
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:464
+msgid "Page updated"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:231
-msgid "New Chatroom"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:467
+msgid "Untitled"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "Chatroom name"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:473
+msgid "Wiki resource_id required for git commit"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Expiration of chats (minutes)"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:529
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:249
+#: ../../Zotlabs/Lib/NativeWikiPage.php:567
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
#, php-format
-msgid "%1$s's Chatrooms"
+msgid "Any account on %s"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:254
-msgid "No chatrooms available"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:258
-msgid "Expiration"
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:259
-msgid "min"
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
msgstr ""
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
msgstr ""
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
+msgid ""
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
+msgid ""
+"This is your default setting for who can view your default channel profile"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
+msgid ""
+"This is your default setting for who can view your file storage and photos"
+msgstr ""
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
msgstr ""
#: ../../Zotlabs/Lib/Chatroom.php:27
@@ -7195,22 +7286,21 @@ msgstr ""
msgid "Room is full"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1924
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1947
msgid "$Projectname Notification"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1925
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1948
msgid "$projectname"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1927
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1950
msgid "Thank You,"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1929
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1952
#, php-format
msgid "%s Administrator"
msgstr ""
@@ -7417,192 +7507,139 @@ msgstr ""
msgid "commented on %s's post"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:34
-#: ../../include/acl_selectors.php:128
-msgid "Visible to your default audience"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:191
-msgid "Only me"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:108
-msgid "Public"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:109
-msgid "Anybody in the $Projectname network"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
#, php-format
-msgid "Any account on %s"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:111
-msgid "Any of my connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:112
-msgid "Only connections I specifically allow"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:113
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:114
-msgid "Any connections including those who haven't yet been approved"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:150
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:151
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:152
-msgid "This is your default setting for who can view your connections"
-msgstr ""
-
-#: ../../Zotlabs/Lib/PermissionDescription.php:153
-msgid ""
-"This is your default setting for who can view your file storage and photos"
+msgid "Update Error at %s"
msgstr ""
-#: ../../Zotlabs/Lib/PermissionDescription.php:154
-msgid "This is your default setting for the audience of your webpages"
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
msgid "Private Message"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
msgid "Select"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr ""
-
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I will not attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:157
+#: ../../Zotlabs/Lib/ThreadItem.php:158
msgid "I might attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I agree"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I disagree"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:167
+#: ../../Zotlabs/Lib/ThreadItem.php:168
msgid "I abstain"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:223
+#: ../../Zotlabs/Lib/ThreadItem.php:224
msgid "Add Star"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:224
+#: ../../Zotlabs/Lib/ThreadItem.php:225
msgid "Remove Star"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:225
+#: ../../Zotlabs/Lib/ThreadItem.php:226
msgid "Toggle Star Status"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:229
+#: ../../Zotlabs/Lib/ThreadItem.php:230
msgid "starred"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
msgid "Message signature validated"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
msgid "Message signature incorrect"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:248
+#: ../../Zotlabs/Lib/ThreadItem.php:249
msgid "Add Tag"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
msgid "like"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
msgid "dislike"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "Share This"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:273
+#: ../../Zotlabs/Lib/ThreadItem.php:274
msgid "share"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:282
+#: ../../Zotlabs/Lib/ThreadItem.php:283
msgid "Delivery Report"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:300
+#: ../../Zotlabs/Lib/ThreadItem.php:301
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Lib/ThreadItem.php:329 ../../Zotlabs/Lib/ThreadItem.php:330
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
#, php-format
msgid "View %s's profile - %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:333
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "to"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:336
msgid "Wall-to-Wall"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:337
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
#, php-format
msgid "from %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
#, php-format
msgid "last edited: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
#, php-format
msgid "Expires: %s"
msgstr ""
@@ -7623,3389 +7660,3074 @@ msgstr ""
msgid "Voting Options"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:383
-#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:385
msgid "Add to Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:393
+#: ../../Zotlabs/Lib/ThreadItem.php:394
msgid "Mark all seen"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
msgid "Bold"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
msgid "Italic"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
msgid "Underline"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
msgid "Quote"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
msgid "Code"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Image"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Insert Link"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:740
msgid "Video"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:213
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
+#: ../../Zotlabs/Zot/Auth.php:138
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please "
+"logout and retry."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
-#: ../../boot.php:1732
-msgid "Login"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
-msgid "Grid"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2687
+msgid "Collection"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
-#: ../../include/features.php:99
-msgid "Wiki"
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
-msgid "Channel Home"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
-#: ../../include/conversation.php:1856 ../../include/nav.php:218
-msgid "Events"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
-msgid "Directory"
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
-msgid "Mail"
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:236
-msgid "Chat"
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1595
-msgid "Features"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" "
+"href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:243
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:245
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:355
-msgid "Purchase"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:359
-msgid "Undelete"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWiki.php:126
-msgid "Wiki files deleted successfully"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:58
-msgctxt "permcat"
-msgid "default"
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:96
-msgctxt "permcat"
-msgid "follower"
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:100
-msgctxt "permcat"
-msgid "contributor"
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/Permcat.php:104
-msgctxt "permcat"
-msgid "publisher"
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:31
-#: ../../Zotlabs/Lib/NativeWikiPage.php:62
-msgid "(No Title)"
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:76
-msgid "Wiki page create failed."
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:89
-msgid "Wiki not found."
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:191
+msgid "Inbox"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:100
-msgid "Destination name already exists"
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:192
+msgid "Outbox"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:126
-#: ../../Zotlabs/Lib/NativeWikiPage.php:345
-msgid "Page not found"
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:193
+msgid "New Message"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:156
-msgid "Error reading page content"
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1807 ../../include/conversation.php:1810
+msgid "Chatrooms"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:338
-#: ../../Zotlabs/Lib/NativeWikiPage.php:383
-#: ../../Zotlabs/Lib/NativeWikiPage.php:450
-#: ../../Zotlabs/Lib/NativeWikiPage.php:491
-msgid "Error reading wiki"
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:371
-msgid "Page update failed."
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:405
-msgid "Nothing deleted"
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:471
-msgid "Compare: object not found."
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:477
-msgid "Page updated"
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:480
-msgid "Untitled"
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:486
-msgid "Wiki resource_id required for git commit"
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
msgstr ""
-#: ../../Zotlabs/Lib/NativeWikiPage.php:557
-#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
-#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
-msgid "Different viewers will see this text differently"
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
msgstr ""
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
-msgid "Flag Adult Photos"
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
msgstr ""
-#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:25
-msgid ""
-"Provide photo edit option to hide inappropriate photos from default album "
-"view"
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:44
-msgid ""
-"This is a fairly comprehensive and complete guitar chord dictionary which "
-"will list most of the available ways to play a certain chord, starting from "
-"the base of the fingerboard up to a few frets beyond the twelfth fret "
-"(beyond which everything repeats). A couple of non-standard tunings are "
-"provided for the benefit of slide players, etc."
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:46
-msgid ""
-"Chord names start with a root note (A-G) and may include sharps (#) and "
-"flats (b). This software will parse most of the standard naming conventions "
-"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:48
-msgid ""
-"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
-"E7b13b11 ..."
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:51
-msgid "Guitar Chords"
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:52
-msgid "The complete online chord dictionary"
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:57
-msgid "Tuning"
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:58
-msgid "Chord name: example: Em7"
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
msgstr ""
-#: ../../extend/addon/addon/chords/Mod_Chords.php:59
-msgid "Show for left handed stringing"
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
msgstr ""
-#: ../../extend/addon/addon/chords/chords.php:33
-msgid "Quick Reference"
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
msgstr ""
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
-msgid "No username found in import file."
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
msgstr ""
-#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
-#: ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:677
-msgid "Diaspora Protocol Settings updated."
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
-msgid "Enable the Diaspora protocol for this channel"
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
-msgid "Allow any Diaspora member to comment on your public posts"
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:704
-msgid "Prevent your hashtags from being redirected to other sites"
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:709
-msgid "Followed hashtags (comma separated, do not include the #)"
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
msgstr ""
-#: ../../extend/addon/addon/diaspora/diaspora.php:714
-msgid "Diaspora Protocol Settings"
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:94
-msgid "Hubzilla Directory Stats"
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:95
-msgid "Total Hubs"
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:97
-msgid "Hubzilla Hubs"
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:99
-msgid "Friendica Hubs"
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:101
-msgid "Diaspora Pods"
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:103
-msgid "Hubzilla Channels"
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:105
-msgid "Friendica Channels"
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:107
-msgid "Diaspora Channels"
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:211
+msgid "Admin"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:109
-msgid "Aged 35 and above"
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:111
-msgid "Aged 34 and under"
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:113
-msgid "Average Age"
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:115
-msgid "Known Chatrooms"
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:117
-msgid "Known Tags"
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
msgstr ""
-#: ../../extend/addon/addon/dirstats/dirstats.php:119
-msgid ""
-"Please note Diaspora and Friendica statistics are merely those **this "
-"directory** is aware of, and not all those known in the network. This also "
-"applies to chatrooms,"
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:21
-msgid "Project Servers and Resources"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:22
-msgid "Project Creator and Tech Lead"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:23
-msgid "Admin, developer, directorymin, support bloke"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:50
-msgid ""
-"And the hundreds of other people and organisations who helped make the "
-"Hubzilla possible."
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:53
-msgid ""
-"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
-"their time and expertise - and often paying out of pocket for services they "
-"share with others."
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:54
-msgid ""
-"There is no corporate funding and no ads, and we do not collect and sell "
-"your personal information. (We don't control your personal information - "
-"<strong>you do</strong>.)"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:55
-msgid ""
-"Help support our ground-breaking work in decentralisation, web identity, and "
-"privacy."
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:57
-msgid ""
-"Your donations keep servers and services running and also helps us to "
-"provide innovative new features and continued development."
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:60
-msgid "Donate"
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:62
-msgid ""
-"Choose a project, developer, or public hub to support with a one-time "
-"donation"
+#: ../../boot.php:1611
+msgid "Create an account to access services and applications"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:63
-msgid "Donate Now"
+#: ../../boot.php:1630 ../../include/nav.php:99 ../../include/nav.php:123
+msgid "Logout"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:64
-msgid ""
-"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
+#: ../../boot.php:1633
+msgid "Login/Email"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:65
-msgid ""
-"Please indicate if you would like your first name or full name (or nothing) "
-"to appear in our sponsor listing"
+#: ../../boot.php:1634
+msgid "Password"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:66
-msgid "Sponsor"
+#: ../../boot.php:1635
+msgid "Remember me"
msgstr ""
-#: ../../extend/addon/addon/donate/donate.php:69
-msgid "Special thanks to: "
+#: ../../boot.php:1638
+msgid "Forgot your password?"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:42
-msgid "Post to Dreamwidth"
+#: ../../boot.php:2176
+msgid "toggle mobile"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-msgid "Enable Dreamwidth Post Plugin"
+#: ../../boot.php:2329
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:77
-msgid "Dreamwidth username"
+#: ../../boot.php:2334
+msgid "Website SSL certificate is not valid. Please correct."
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:81
-msgid "Dreamwidth password"
+#: ../../boot.php:2452
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-msgid "Post to Dreamwidth by default"
+#: ../../boot.php:2457
+msgid "Cron/Scheduled tasks not running."
msgstr ""
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-msgid "Dreamwidth Post Settings"
+#: ../../boot.php:2458 ../../include/datetime.php:286
+msgid "never"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
-msgid "Flattr this!"
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:83
-msgid "Flattr widget settings updated."
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:100
-msgid "Flattr user"
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "URL of the Thing to flattr"
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:104
-msgid "If empty channel URL is used"
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "Title of the Thing to flattr"
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:108
-msgid "If empty \"channel name on The Hubzilla\" will be used"
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "Static or dynamic flattr button"
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "static"
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:112
-msgid "dynamic"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "Alignment of the widget"
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "left"
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:116
-msgid "right"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-msgid "Enable Flattr widget"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 87.5%, 14px"
msgstr ""
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-msgid "Flattr Widget Settings"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:118
-msgid "Contact not found."
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it "
-"has already been approved."
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:238
-msgid "Response from remote site was not understood."
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:247
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:252
-msgid "Unexpected response from remote site: "
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:261
-msgid "Confirmation completed successfully."
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:263
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:277
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:284
-msgid "Remote site reported: "
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:275
-msgid "Temporary failure. Please wait and try again."
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:282
-msgid "Introduction failed or was revoked."
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:428
-msgid "Unable to set contact photo."
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:485
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../addon/rendezvous/rendezvous.php:95 ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:570
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:580
-msgid "Our site encryption key is apparently messed up."
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid ""
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:591
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:612
-msgid "Contact record was not found for you on our site."
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid ""
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:626
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:646
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:657
-msgid "Unable to set your contact credentials on our system."
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:724
-msgid "Unable to update your contact profile details on our system"
+#: ../../addon/rendezvous/rendezvous.php:169
+msgid ""
+"Enter your name to join this rendezvous. To begin sharing your location with "
+"the other members, tap the GPS control. When your location is discovered, a "
+"red dot will appear and others will be able to see you on the map."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:751
-#: ../../extend/addon/addon/friendica/dfrn_request.php:749
-msgid "[Name Withheld]"
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:796
-#, php-format
-msgid "%1$s has joined %2$s"
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:103
-#: ../../extend/addon/addon/friendica/dfrn_poll.php:536
-#, php-format
-msgid "%1$s welcomes %2$s"
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:102
-msgid "This introduction has already been accepted."
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:123
-#: ../../extend/addon/addon/friendica/dfrn_request.php:528
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:128
-#: ../../extend/addon/addon/friendica/dfrn_request.php:533
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:130
-#: ../../extend/addon/addon/friendica/dfrn_request.php:535
-msgid "Warning: profile location has no profile photo."
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:133
-#: ../../extend/addon/addon/friendica/dfrn_request.php:538
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../extend/addon/addon/friendica/dfrn_request.php:180
-msgid "Introduction complete."
+#: ../../addon/rendezvous/rendezvous.php:180
+msgid ""
+"A proximity alert will be issued when this member is within a certain radius "
+"of you.<br><br>Enter a radius in meters (0 to disable):"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:224
-msgid "Unrecoverable protocol error."
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:252
-msgid "Profile unavailable."
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:277
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
+msgid ""
+"A proximity alert will be issued when you are within a certain radius of the "
+"marker location.<br><br>Enter a radius in meters (0 to disable):"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:278
-msgid "Spam protection measures have been invoked."
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:279
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:341
-msgid "Invalid locator"
+#: ../../addon/rendezvous/rendezvous.php:187
+msgid ""
+"Enter a note to be displayed when you are within the specified proximity..."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:350
-msgid "Invalid email address."
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:377
-msgid "This account has not been configured for email. Request failed."
+#: ../../addon/rendezvous/rendezvous.php:200
+msgid ""
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or "
+"share their own locations with the group."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:473
-msgid "Unable to resolve your name at the provided location."
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:486
-msgid "You have already introduced yourself here."
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:490
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:511
-msgid "Invalid profile URL."
+#: ../../addon/gnusoc/gnusoc.php:118
+msgid "GNU-Social Protocol Settings updated."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:517
-msgid "Disallowed profile URL."
+#: ../../addon/gnusoc/gnusoc.php:129
+msgid "Enable the GNU-Social protocol for this channel"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:587
-msgid "Failed to update contact record."
+#: ../../addon/gnusoc/gnusoc.php:133
+msgid "GNU-Social Protocol Settings"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:608
-msgid "Your introduction has been sent."
+#: ../../addon/gnusoc/gnusoc.php:323
+msgid "Follow"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:662
-msgid "Please login to confirm introduction."
+#: ../../addon/gnusoc/gnusoc.php:326
+#, php-format
+msgid "%1$s is now following %2$s"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:676
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:690
-#: ../../extend/addon/addon/friendica/dfrn_request.php:707
-msgid "Confirm"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:702
-msgid "Hide this contact"
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:705
-#, php-format
-msgid "Welcome home %s."
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:706
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:836
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:857
-#, php-format
+#: ../../addon/cdav/Mod_Cdav.php:770
msgid ""
-"If you are not yet a member of the free social web, <a href=\"%s/siteinfo"
-"\">follow this link to find a public Friendica site and join us today</a>."
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:862
-msgid "Friend/Connection Request"
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:863
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:864
-msgid "Please answer the following:"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#, php-format
-msgid "Does %s know you?"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:869
-msgid "Add a personal note:"
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2242 ../../include/network.php:2243
-msgid "Friendica"
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:872
-msgid "StatusNet/Federated Social Web"
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2248
-msgid "Diaspora"
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:874
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search "
-"bar."
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:875
-msgid "Your Identity Address:"
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr ""
-#: ../../extend/addon/addon/friendica/dfrn_request.php:878
-msgid "Submit Request"
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
-msgid "GNU-Social Protocol Settings updated."
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:124
-msgid "Enable the (experimental) GNU-Social protocol for this channel"
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
-msgid "GNU-Social Protocol Settings"
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
-msgid "Follow"
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
msgstr ""
-#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "%1$s is now following %2$s"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:91
-msgid "Friendica Photo Album Import"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:92
-msgid "This will import all your Friendica photo albums to this Red channel."
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:93
-msgid "Friendica Server base URL"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:94
-msgid "Friendica Login Username"
-msgstr ""
-
-#: ../../extend/addon/addon/frphotos/frphotos.php:95
-msgid "Friendica Login Password"
-msgstr ""
-
-#: ../../extend/addon/addon/hubwall/hubwall.php:19
-msgid "Send email to all members"
+msgid "Your CalDAV resources are located at %s "
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:33
+#: ../../addon/cdav/cdav.php:240
#, php-format
-msgid "$1%s Administrator"
-msgstr ""
-
-#: ../../extend/addon/addon/hubwall/hubwall.php:50
-#: ../../extend/addon/addon/mailtest/mailtest.php:50
-msgid "No recipients found."
+msgid "Your CardDAV resources are located at %s "
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:73
-#, php-format
-msgid "%1$d of %2$d messages sent."
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:81
-msgid "Send email to all hub members."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:92
-#: ../../extend/addon/addon/mailtest/mailtest.php:96
-msgid "Message subject"
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:93
-msgid "Sender Email address"
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
msgstr ""
-#: ../../extend/addon/addon/hubwall/hubwall.php:94
-msgid "Test mode (only send to hub administrator)"
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:42
-msgid "Post to Insanejournal"
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-msgid "Enable InsaneJournal Post Plugin"
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:81
-msgid "InsaneJournal password"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-msgid "Post to InsaneJournal by default"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-msgid "InsaneJournal Post Settings"
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
msgstr ""
-#: ../../extend/addon/addon/ijpost/ijpost.php:104
-msgid "Insane Journal Settings saved."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:45
-msgid "Channels to auto connect"
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:45
-#: ../../extend/addon/addon/irc/irc.php:49
-msgid "Comma separated list"
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:49
-#: ../../extend/addon/addon/irc/irc.php:96
-msgid "Popular Channels"
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:53
-msgid "IRC Settings"
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:69
-msgid "IRC settings saved."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
msgstr ""
-#: ../../extend/addon/addon/irc/irc.php:74
-msgid "IRC Chatroom"
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1139 ../../include/channel.php:1301
-msgid "Status:"
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-msgid "Activate addon"
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-msgid "Hide Jappixmini Chat-Widget from the webinterface"
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:318
-msgid "Jabber username"
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:324
-msgid "Jabber server"
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:330
-msgid "Jabber BOSH host URL"
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:337
-msgid "Jabber password"
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-msgid "Encrypt Jabber password with Hubzilla password"
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:347
-#: ../../extend/addon/addon/redred/redred.php:115
-msgid "Hubzilla password"
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-msgid "Approve subscription requests from Hubzilla contacts automatically"
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-msgid "Purge internal list of jabber addresses of contacts"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:364
-msgid "Configuration Help"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
msgstr ""
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-msgid "Jappix Mini Settings"
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:44
-msgid "Upload a file"
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:45
-msgid "Drop files here to upload"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:47
-msgid "Failed"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:315
-msgid "No files were uploaded."
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1046
+#: ../../include/nav.php:107
+msgid "Edit Profile"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:322
-msgid "Uploaded file is empty"
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:335
-msgid "Image exceeds size limit of "
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:347
-msgid "File has an invalid extension, it should be one of "
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
msgstr ""
-#: ../../extend/addon/addon/js_upload/js_upload.php:359
-msgid "Upload was cancelled, or server error encountered"
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
msgstr ""
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:61
-msgid "An account has been created for you."
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
msgstr ""
-#: ../../extend/addon/addon/ldapauth/ldapauth.php:68
-msgid "Authentication successful but rejected: account creation is disabled."
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:38
-msgid "Post to Libertree"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:73
-msgid "Libertree API token"
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:77
-msgid "Libertree site URL"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:81
-msgid "Post to Libertree by default"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:85
-msgid "Libertree Post Settings"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
msgstr ""
-#: ../../extend/addon/addon/libertree/libertree.php:99
-msgid "Libertree Settings saved."
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:42
-msgid "Post to LiveJournal"
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-msgid "Enable LiveJournal Post Plugin"
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:74
-msgid "LiveJournal username"
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:78
-msgid "LiveJournal password"
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-msgid "Post to LiveJournal by default"
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-msgid "LiveJournal Post Settings"
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
+msgid ""
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
msgstr ""
-#: ../../extend/addon/addon/ljpost/ljpost.php:101
-msgid "LiveJournal Settings saved."
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Logfile archive directory"
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:36
-msgid "Directory to store rotated logs"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:37
-msgid "Logfile size in bytes before rotating"
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
msgstr ""
-#: ../../extend/addon/addon/logrot/logrot.php:38
-msgid "Number of logfiles to retain"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Email notification hub"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:36
-msgid "Hostname"
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-msgid "Mailhost Settings"
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
msgstr ""
-#: ../../extend/addon/addon/mailhost/mailhost.php:54
-msgid "MAILHOST Settings saved."
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:19
-msgid "lonely"
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:20
-msgid "drunk"
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:21
-msgid "horny"
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:22
-msgid "stoned"
+#: ../../addon/nsfw/nsfw.php:80
+msgid ""
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and "
+"can thereby be used as a general purpose content filter."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:23
-msgid "fucked up"
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:24
-msgid "clusterfucked"
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:25
-msgid "crazy"
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:26
-msgid "hurt"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:27
-msgid "sleepy"
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:28
-msgid "grumpy"
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:29
-msgid "high"
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:30
-msgid "semi-conscious"
+#: ../../addon/nsfw/nsfw.php:211
+#, php-format
+msgid "%s - view"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:31
-msgid "in love"
+#: ../../addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:32
-msgid "in lust"
+#: ../../addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:33
-msgid "naked"
+#: ../../addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:34
-msgid "stinky"
+#: ../../addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:35
-msgid "sweaty"
+#: ../../addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:36
-msgid "bleeding out"
+#: ../../addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:37
-msgid "victorious"
+#: ../../addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:38
-msgid "defeated"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:39
-msgid "envious"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
msgstr ""
-#: ../../extend/addon/addon/moremoods/moremoods.php:40
-msgid "jealous"
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
-msgid "bitchslap"
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
-msgid "shag"
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:20
-msgid "shagged"
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
-msgid "patent"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:21
-msgid "patented"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
-msgid "hug"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:22
-msgid "hugged"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
-msgid "murder"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:23
-msgid "murdered"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
-msgid "worship"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:24
-msgid "worshipped"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
-msgid "kiss"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:25
-msgid "kissed"
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
-msgid "tempt"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:26
-msgid "tempted"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
-msgid "raise eyebrows at"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:27
-msgid "raised their eyebrows at"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
-msgid "insult"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:28
-msgid "insulted"
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
-msgid "praise"
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:29
-msgid "praised"
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
-msgid "be dubious of"
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:30
-msgid "was dubious of"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
-msgid "eat"
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:31
-msgid "ate"
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
-msgid "giggle and fawn at"
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:32
-msgid "giggled and fawned at"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
-msgid "doubt"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:33
-msgid "doubted"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
-msgid "glare"
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:34
-msgid "glared at"
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
-msgid "fuck"
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:35
-msgid "fucked"
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
-msgid "bonk"
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:36
-msgid "bonked"
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
-msgid "declare undying love for"
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
msgstr ""
-#: ../../extend/addon/addon/morepokes/morepokes.php:37
-msgid "declared undying love for"
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:46
-#: ../../extend/addon/addon/xmpp/xmpp.php:91
-msgid "Save Settings"
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
msgstr ""
-#: ../../extend/addon/addon/msgfooter/msgfooter.php:47
-msgid "text to include in all outgoing posts from this site"
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:42
-msgid "Federate"
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:56
-msgid "nofed Settings saved."
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:72
-msgid "Allow Federation Toggle"
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:76
-msgid "Federate posts by default"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
msgstr ""
-#: ../../extend/addon/addon/nofed/nofed.php:80
-msgid "NoFed Settings"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:125
-msgid "Nsabait Settings updated."
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-msgid "Enable NSAbait Plugin"
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
msgstr ""
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-msgid "NSAbait Settings"
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:80
-msgid ""
-"This plugin looks in posts for the words/text you specify below, and "
-"collapses any content containing those keywords so it is not displayed at "
-"inappropriate times, such as sexual innuendo that may be improper in a work "
-"setting. It is polite and recommended to tag any content containing nudity "
-"with #NSFW. This filter can also match any other word/text you specify, and "
-"can thereby be used as a general purpose content filter."
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-msgid "Enable Content filter"
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Comma separated list of keywords to hide"
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "Not Safe For Work Settings"
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-msgid "General Purpose Content Filter"
+#: ../../addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:110
-msgid "NSFW Settings saved."
+#: ../../addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:207
-msgid "Possible adult content"
+#: ../../addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
msgstr ""
-#: ../../extend/addon/addon/nsfw/nsfw.php:211
-#, php-format
-msgid "%s - click to open/close"
+#: ../../addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
-msgid "System defaults:"
+#: ../../addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "Preferred Clipart IDs"
+#: ../../addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
-msgid "List of preferred clipart ids. These will be shown first."
+#: ../../addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "Default Search Term"
+#: ../../addon/openid/openid.php:49
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
-msgid "The default search term. These will be shown second."
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Return After"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-msgid "Page to load after image selection."
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
-#: ../../include/channel.php:1048 ../../include/nav.php:107
-msgid "Edit Profile"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
-msgid "Profile List"
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Order of Preferred"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-msgid "Sort order of preferred clipart ids."
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
-msgid "Newest first"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
-msgid "As entered"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Order of other"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
-msgid "Sort order of other clipart ids."
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
-msgid "Most downloaded first"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
-msgid "Most liked first"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Preferred IDs Message"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
-msgid "Message to display above preferred results."
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Uploaded by: "
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
-msgid "Drawn by: "
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
-msgid "Or select from a free OpenClipart.org image:"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
-msgid "Search Term"
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
-msgid "Unknown error. Please try again later."
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:306
-msgid "Profile photo updated successfully."
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:146
-msgid "View Larger"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
-msgid "Tile Server URL"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:169
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
-"\">public tile servers</a>"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
-msgid "Nominatim (reverse geocoding) Server URL"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:170
+#: ../../addon/startpage/startpage.php:109
msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target="
-"\"_blank\">Nominatim servers</a>"
-msgstr ""
-
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
-msgid "Default zoom"
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:171
-msgid ""
-"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
-msgid "Include marker on map"
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslap"
msgstr ""
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:172
-msgid "Include a marker on the map."
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:43
-msgid "Message to display on every page on this server"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shag"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-msgid "Pageheader Settings"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shagged"
msgstr ""
-#: ../../extend/addon/addon/pageheader/pageheader.php:64
-msgid "pageheader Settings saved."
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patent"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:85
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patented"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:88
-#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can "
-"set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hug"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid "Piwik Base URL"
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hugged"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:96
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murder"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:97
-msgid "Site ID"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murdered"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:98
-msgid "Show opt-out cookie link?"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worship"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:99
-msgid "Asynchronous tracking"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worshipped"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "Enable frontend JavaScript error tracking"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kiss"
msgstr ""
-#: ../../extend/addon/addon/piwik/piwik.php:100
-msgid "This feature requires Piwik >= 2.2.0"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kissed"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:121
-msgid "Planets Settings updated."
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempt"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:153
-msgid "Enable Planets Plugin"
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempted"
msgstr ""
-#: ../../extend/addon/addon/planets/planets.php:157
-msgid "Planets Settings"
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:148
-msgid "You are now authenticated to pumpio."
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:149
-msgid "return to the featured settings page"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insult"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:163
-msgid "Post to Pump.io"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insulted"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Pump.io servername"
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praise"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:198
-msgid "Without \"http://\" or \"https://\""
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praised"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Pump.io username"
+#: ../../addon/morepokes/morepokes.php:30
+msgid "be dubious of"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:202
-msgid "Without the servername"
+#: ../../addon/morepokes/morepokes.php:30
+msgid "was dubious of"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:213
-msgid "You are not authenticated to pumpio"
+#: ../../addon/morepokes/morepokes.php:31
+msgid "eat"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:215
-msgid "(Re-)Authenticate your pump.io connection"
+#: ../../addon/morepokes/morepokes.php:31
+msgid "ate"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-msgid "Enable pump.io Post Plugin"
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-msgid "Post to pump.io by default"
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-msgid "Should posts be public"
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubt"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-msgid "Mirror all public posts"
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubted"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-msgid "Pump.io Post Settings"
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glare"
msgstr ""
-#: ../../extend/addon/addon/pumpio/pumpio.php:266
-msgid "PumpIO Settings saved."
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glared at"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:48
-msgid "QR code"
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fuck"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:63
-msgid "QR Generator"
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fucked"
msgstr ""
-#: ../../extend/addon/addon/qrator/qrator.php:64
-msgid "Enter some text"
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonk"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-msgid "Enable Rainbowtag"
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonked"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-msgid "Rainbowtag Settings"
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
msgstr ""
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:101
-msgid "Rainbowtag Settings saved."
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:97
-msgid "You're welcome."
+#: ../../addon/diaspora/diaspora.php:677
+msgid "Diaspora Protocol Settings updated."
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:98
-msgid "Ah shucks..."
+#: ../../addon/diaspora/diaspora.php:696
+msgid "Enable the Diaspora protocol for this channel"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:99
-msgid "Don't mention it."
+#: ../../addon/diaspora/diaspora.php:700
+msgid "Allow any Diaspora member to comment on your public posts"
msgstr ""
-#: ../../extend/addon/addon/randpost/randpost.php:100
-msgid "&lt;blush&gt;"
+#: ../../addon/diaspora/diaspora.php:704
+msgid "Prevent your hashtags from being redirected to other sites"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:119
-msgid "Redmatrix File Storage Import"
+#: ../../addon/diaspora/diaspora.php:709
+msgid "Followed hashtags (comma separated, do not include the #)"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:120
-msgid "This will import all your Redmatrix cloud files to this channel."
+#: ../../addon/diaspora/diaspora.php:714
+msgid "Diaspora Protocol Settings"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:121
-#: ../../extend/addon/addon/redphotos/redphotos.php:131
-msgid "Redmatrix Server base URL"
+#: ../../addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:122
-#: ../../extend/addon/addon/redphotos/redphotos.php:132
-msgid "Redmatrix Login Username"
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
+msgid "Unable to create a unique channel address. Import failed."
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfiles.php:123
-#: ../../extend/addon/addon/redphotos/redphotos.php:133
-msgid "Redmatrix Login Password"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
msgstr ""
-#: ../../extend/addon/addon/redfiles/redfilehelper.php:67
-msgid "file"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:106
-msgid "Photos imported"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:129
-msgid "Redmatrix Photo Album Import"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:130
-msgid "This will import all your Redmatrix photo albums to this channel."
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Import just this album"
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:134
-msgid "Leave blank to import all albums"
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "Maximum count to import"
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
msgstr ""
-#: ../../extend/addon/addon/redphotos/redphotos.php:135
-msgid "0 or blank to import all available"
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:45
-msgid "Post to Red"
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:60
-msgid "Channel is required."
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:76
-msgid "redred Settings saved."
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:95
-msgid "Allow posting to another Hubzilla Channel"
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:99
-msgid "Send public postings to Hubzilla channel by default"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:103
-msgid "Hubzilla API Path"
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:103
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "https://{sitename}/api"
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:107
-msgid "Hubzilla login name"
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:111
-msgid "Hubzilla channel name"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:111
-#: ../../extend/addon/addon/openid/MysqlProvider.php:54
-msgid "Nickname"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
msgstr ""
-#: ../../extend/addon/addon/redred/redred.php:119
-msgid "Hubzilla Crosspost Settings"
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:45
-msgid "Post to Friendica"
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:62
-msgid "rtof Settings saved."
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:81
-msgid "Allow posting to Friendica"
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:85
-msgid "Send public postings to Friendica by default"
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:89
-msgid "Friendica API Path"
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:93
-msgid "Friendica login name"
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:97
-msgid "Friendica password"
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
msgstr ""
-#: ../../extend/addon/addon/rtof/rtof.php:101
-msgid "Hubzilla to Friendica Post Settings"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
+#, php-format
+msgid "Reconnecting %d connections"
msgstr ""
-#: ../../extend/addon/addon/sendzid/sendzid.php:25
-msgid "Extended Identity Sharing"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
msgstr ""
-#: ../../extend/addon/addon/sendzid/sendzid.php:26
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
msgid ""
-"Share your identity with all websites on the internet. When disabled, "
-"identity is only shared with sites in the matrix."
-msgstr ""
-
-#: ../../extend/addon/addon/skeleton/skeleton.php:59
-msgid "Some setting"
-msgstr ""
-
-#: ../../extend/addon/addon/skeleton/skeleton.php:61
-msgid "A setting"
+"Use this form to re-establish Diaspora connections which were initially made "
+"from a different hub."
msgstr ""
-#: ../../extend/addon/addon/skeleton/skeleton.php:64
-msgid "Skeleton Settings"
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-msgid "Deactivate the feature"
+#: ../../addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-msgid "Hide the button and show the smilies directly."
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
msgstr ""
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-msgid "Smileybutton Settings"
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
+"\">public tile servers</a>"
msgstr ""
-#: ../../extend/addon/addon/startpage/startpage.php:109
-msgid "Page to load after login"
+#: ../../addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
msgstr ""
-#: ../../extend/addon/addon/startpage/startpage.php:109
+#: ../../addon/openstreetmap/openstreetmap.php:170
msgid ""
-"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
-"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
-"blank for default network page (grid)."
-msgstr ""
-
-#: ../../extend/addon/addon/startpage/startpage.php:113
-msgid "Startpage Settings"
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target="
+"\"_blank\">Nominatim servers</a>"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:143
-msgid "Post to GNU social"
+#: ../../addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:195
+#: ../../addon/openstreetmap/openstreetmap.php:171
msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-
-#: ../../extend/addon/addon/statusnet/statusnet.php:232
-msgid "We could not contact the GNU social API with the Path you entered."
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:266
-msgid "GNU social settings updated."
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:310
-msgid "Globally Available GNU social OAuthKeys"
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:312
-msgid ""
-"There are preconfigured OAuth key pairs for some GNU social servers "
-"available. If you are using one of them, please use these credentials.<br /"
-">If not feel free to connect to any other GNU social instance (see below)."
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:327
-msgid "Provide your own OAuth Credentials"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:329
-msgid ""
-"No consumer key pair for GNU social found. Register your Hubzilla Account as "
-"an desktop client on your GNU social account, copy the consumer key pair "
-"here and enter the API base root.<br />Before you register your own OAuth "
-"key pair ask the administrator if there is already a key pair for this "
-"Hubzilla installation at your favourite GNU social installation."
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:333
-msgid "OAuth Consumer Key"
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:337
-msgid "OAuth Consumer Secret"
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
-msgid "Base API Path"
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:341
-msgid "Remember the trailing /"
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:345
-msgid "GNU social application name"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:368
-msgid ""
-"To connect to your GNU social account click the button below to get a "
-"security code from GNU social which you have to copy into the input box "
-"below and submit the form. Only your <strong>public</strong> posts will be "
-"posted to GNU social."
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:370
-msgid "Log in with GNU social"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:373
-msgid "Copy the security code from GNU social here"
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:383
-msgid "Cancel Connection Process"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1137
+#: ../../include/channel.php:1294
+msgid "Status:"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:385
-msgid "Current GNU social API is"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-msgid "Cancel GNU social Connection"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:401
-#: ../../extend/addon/addon/twitter/twitter.php:232
-msgid "Currently connected to: "
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:406
-msgid ""
-"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to GNU social will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-msgid "Allow posting to GNU social"
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-msgid ""
-"If enabled your public postings can be posted to the associated GNU-social "
-"account"
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-msgid "Post to GNU social by default"
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-msgid ""
-"If enabled your public postings will be posted to the associated GNU-social "
-"account by default"
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:255
-msgid "Clear OAuth configuration"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-msgid "GNU social Post Settings"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:891
-msgid "API URL"
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
msgstr ""
-#: ../../extend/addon/addon/statusnet/statusnet.php:894
-msgid "Application name"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:110
+#: ../../addon/superblock/superblock.php:112
msgid "Currently blocked"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:112
+#: ../../addon/superblock/superblock.php:114
msgid "No channels currently blocked"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:118
+#: ../../addon/superblock/superblock.php:120
msgid "\"Superblock\" Settings"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:322
+#: ../../addon/superblock/superblock.php:345
msgid "Block Completely"
msgstr ""
-#: ../../extend/addon/addon/superblock/superblock.php:371
+#: ../../addon/superblock/superblock.php:394
msgid "superblock settings updated"
msgstr ""
-#: ../../extend/addon/addon/testdrive/testdrive.php:104
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
-
-#: ../../extend/addon/addon/testdrive/testdrive.php:105
-msgid "Your $Productname test account is about to expire."
-msgstr ""
-
-#: ../../extend/addon/addon/tictac/tictac.php:21
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr ""
-
-#: ../../extend/addon/addon/tictac/tictac.php:54
-msgid "3D Tic-Tac-Toe"
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:59
-msgid "New game"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:60
-msgid "New game with handicap"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:61
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:62
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:64
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+#: ../../addon/redred/redred.php:45
+msgid "Post to Red"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:183
-msgid "You go first..."
+#: ../../addon/redred/redred.php:60
+msgid "Channel is required."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:188
-msgid "I'm going first this time..."
+#: ../../addon/redred/redred.php:76
+msgid "redred Settings saved."
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:194
-msgid "You won!"
+#: ../../addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:200
-#: ../../extend/addon/addon/tictac/tictac.php:225
-msgid "\"Cat\" game!"
+#: ../../addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
msgstr ""
-#: ../../extend/addon/addon/tictac/tictac.php:223
-msgid "I won!"
+#: ../../addon/redred/redred.php:103
+msgid "Hubzilla API Path"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:75
-msgid "Edit your profile and change settings."
+#: ../../addon/redred/redred.php:107
+msgid "Hubzilla login name"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:76
-msgid "Click here to see activity from your connections."
+#: ../../addon/redred/redred.php:111
+msgid "Hubzilla channel name"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:77
-msgid "Click here to see your channel home."
+#: ../../addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:78
-msgid "You can access your private messages from here."
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:79
-msgid "Create new events here."
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:80
-msgid ""
-"You can accept new connections and change permissions for existing ones "
-"here. You can also e.g. create groups of contacts."
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:81
-msgid "System notifications will arrive here"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:82
-msgid "Search for content and users"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:83
-msgid "Browse for new contacts"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:84
-msgid "Launch installed apps"
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:85
-msgid "Looking for help? Click here."
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:86
-msgid ""
-"New events have occurred in your network. Click here to see what has "
-"happened!"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:87
-msgid "You have received a new private message. Click here to see from who!"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:88
-msgid "There are events this week. Click here too see which!"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:89
-msgid "You have received a new introduction. Click here to see who!"
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:90
+#: ../../addon/donate/donate.php:50
msgid ""
-"There is a new system notification. Click here to see what has happened!"
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:93
-msgid "Click here to share text, images, videos and sound."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:94
-msgid "You can write an optional title for your update (good for long posts)."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:95
-msgid "Entering some categories here makes it easier to find your post later."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:96
-msgid "Share photos, links, location, etc."
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:97
+#: ../../addon/donate/donate.php:53
msgid ""
-"Only want to share content for a while? Make it expire at a certain date."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:98
-msgid "You can password protect content."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:99
-msgid "Choose who you share with."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:101
-msgid "Click here when you are done."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:104
-msgid "Adjust from which channels posts should be displayed."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:105
-msgid "Only show posts from channels in the specified privacy group."
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:109
+#: ../../addon/donate/donate.php:54
msgid ""
-"Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:110
-msgid "Easily find posts in given category."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:111
-msgid "Easily find posts by date."
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:112
+#: ../../addon/donate/donate.php:55
msgid ""
-"Suggested users who have volounteered to be shown as suggestions, and who we "
-"think you might find interesting."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:113
-msgid "Here you see channels you have connected to."
-msgstr ""
-
-#: ../../extend/addon/addon/tour/tour.php:114
-msgid "Save your search so you can repeat it at a later date."
+"Help support our ground-breaking work in decentralisation, web identity, and "
+"privacy."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:117
+#: ../../addon/donate/donate.php:57
msgid ""
-"If you see this icon you can be sure that the sender is who it say it is. It "
-"is normal that it is not always possible to verify the sender, so the icon "
-"will be missing sometimes. There is usually no need to worry about that."
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:118
-msgid ""
-"Danger! It seems someone tried to forge a message! This message is not "
-"necessarily from who it says it is from!"
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
msgstr ""
-#: ../../extend/addon/addon/tour/tour.php:125
+#: ../../addon/donate/donate.php:62
msgid ""
-"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
-"pause it at any time and continue where you left off by reloading the page, "
-"or navigting to another page.</p><p>You can also advance by pressing the "
-"return key"
-msgstr ""
-
-#: ../../extend/addon/addon/twitter/twitter.php:99
-msgid "Post to Twitter"
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:154
-msgid "Twitter settings updated."
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:183
+#: ../../addon/donate/donate.php:64
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:205
+#: ../../addon/donate/donate.php:65
msgid ""
-"At this Hubzilla instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input "
-"box below and submit the form. Only your <strong>public</strong> posts will "
-"be posted to Twitter."
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:207
-msgid "Log in with Twitter"
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:210
-msgid "Copy the PIN from Twitter here"
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:237
+#: ../../addon/chords/Mod_Chords.php:44
msgid ""
-"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
-"details from unknown viewers?</em>) the link potentially included in public "
-"postings relayed to Twitter will lead the visitor to a blank page informing "
-"the visitor that the access to your profile has been restricted."
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:242
-msgid "Allow posting to Twitter"
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../addon/chords/Mod_Chords.php:48
msgid ""
-"If enabled your public postings can be posted to the associated Twitter "
-"account"
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid "Send public postings to Twitter by default"
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:246
-msgid ""
-"If enabled your public postings will be posted to the associated Twitter "
-"account by default"
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:264
-msgid "Twitter Post Settings"
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
msgstr ""
-#: ../../extend/addon/addon/twitter/twitter.php:773
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
-msgid "Submit Settings"
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:25
-msgid "Show Upload Limits"
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:27
-msgid "Hubzilla configured maximum size: "
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:28
-msgid "PHP upload_max_filesize: "
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
msgstr ""
-#: ../../extend/addon/addon/upload_limits/upload_limits.php:29
-msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:93
-msgid "Recent Channel/Profile Viewers"
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:98
-msgid "This plugin/addon has not been configured."
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:99
-#, php-format
-msgid "Please visit the Visage settings on %s"
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:99
-msgid "your feature settings page"
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:112
-msgid "No entries."
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:166
-msgid "Enable Visage Visitor Logging"
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
msgstr ""
-#: ../../extend/addon/addon/visage/visage.php:170
-msgid "Visage Settings"
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
msgstr ""
-#: ../../extend/addon/addon/wholikesme/wholikesme.php:29
-msgid "Who likes me?"
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:45
-msgid "Post to WordPress"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:82
-msgid "Enable WordPress Post Plugin"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:86
-msgid "WordPress username"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:90
-msgid "WordPress password"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:94
-msgid "WordPress API URL"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:95
-msgid "Typically https://your-blog.tld/xmlrpc.php"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:98
-msgid "WordPress blogid"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:99
-msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:105
-msgid "Post to WordPress by default"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:109
-msgid "Forward comments (requires hubzilla_wp plugin)"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:113
-msgid "WordPress Post Settings"
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
msgstr ""
-#: ../../extend/addon/addon/wppost/wppost.php:129
-msgid "Wordpress Settings saved."
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:31
-msgid "XMPP settings updated."
+#: ../../addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-msgid "Enable Chat"
+#: ../../addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:58
-msgid "Individual credentials"
+#: ../../addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:64
-msgid "Jabber BOSH server"
+#: ../../addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-msgid "XMPP Settings"
+#: ../../addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:92
-msgid "Jabber BOSH host"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br /"
+">If not feel free to connect to any other GNU social instance (see below)."
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
-msgid "Use central userbase"
+#: ../../addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../extend/addon/addon/xmpp/xmpp.php:93
+#: ../../addon/statusnet/statusnet.php:329
msgid ""
-"If enabled, members will automatically login to an ejabberd server that has "
-"to be installed on this machine with synchronized credentials via the "
-"\"auth_ejabberd.php\" script."
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/include/widgets.php:37
-msgid "Select Channel"
+"No consumer key pair for GNU social found. Register your Hubzilla Account as "
+"an desktop client on your GNU social account, copy the consumer key pair "
+"here and enter the API base root.<br />Before you register your own OAuth "
+"key pair ask the administrator if there is already a key pair for this "
+"Hubzilla installation at your favourite GNU social installation."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:42
-msgid "Read-write"
+#: ../../addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:43
-msgid "Read-only"
+#: ../../addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:116
-msgid "My Calendars"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Base API Path"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
+#: ../../addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
+#: ../../addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
+#: ../../addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
+#: ../../addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
+#: ../../addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:130
-msgid "Import calendar"
+#: ../../addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
+#: ../../addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
+msgid "Currently connected to: "
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
+#: ../../addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
+#: ../../addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
+#: ../../addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
+#: ../../addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
+#: ../../addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
+#: ../../addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
+#: ../../addon/statusnet/statusnet.php:891
+msgid "API URL"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
+#: ../../addon/statusnet/statusnet.php:894
+msgid "Application name"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:747
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:852
-msgid "List month"
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:853
-msgid "List week"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:854
-msgid "List day"
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:861
-msgid "More"
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:862
-msgid "Less"
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:897
+msgid "Requested channel is not available."
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
msgstr ""
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
+#: ../../addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
+#: ../../addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input "
+"box below and submit the form. Only your <strong>public</strong> posts will "
+"be posted to Twitter."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
+#: ../../addon/twitter/twitter.php:237
+msgid ""
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:272
-#: ../../include/connections.php:896
-msgid "Home, Voice"
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:273
-#: ../../include/connections.php:897
-msgid "Home, Fax"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:275
-#: ../../include/connections.php:899
-msgid "Work, Voice"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
msgstr ""
-#: ../../extend/addon/addon/cdav/cdav.php:276
-#: ../../include/connections.php:900
-msgid "Work, Fax"
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:430
-msgid "Invalid game."
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:436
-msgid "You are not a player in this game."
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:315
-msgid "You must be a local channel to create a game."
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:333
-msgid "You must select one opponent that is not yourself."
+#: ../../addon/piwik/piwik.php:88
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:336
-msgid "Creating new game..."
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:342
-msgid "You must select white or black."
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:349
-msgid "Error creating new game."
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:899
-msgid "Requested channel is not available."
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:392
-msgid "You must select a local channel /chess/channelname"
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
msgstr ""
-#: ../../extend/addon/addon/chess/chess.php:920
-msgid "Enable notifications"
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:51
-msgid "Your Webbie:"
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:54
-msgid "Fontsize (px):"
+#: ../../addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:68
-msgid "Link:"
+#: ../../addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:70
-msgid "Like us on Hubzilla"
+#: ../../addon/tour/tour.php:77
+msgid "Click here to see your channel home."
msgstr ""
-#: ../../extend/addon/addon/likebanner/likebanner.php:72
-msgid "Embed:"
+#: ../../addon/tour/tour.php:78
+msgid "You can access your private messages from here."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Id.php:85
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Male"
+#: ../../addon/tour/tour.php:79
+msgid "Create new events here."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Id.php:87
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-msgid "Female"
+#: ../../addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:52
-msgid "First Name"
+#: ../../addon/tour/tour.php:81
+msgid "System notifications will arrive here"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:53
-msgid "Last Name"
+#: ../../addon/tour/tour.php:82
+msgid "Search for content and users"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:55
-msgid "Full Name"
+#: ../../addon/tour/tour.php:83
+msgid "Browse for new contacts"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:61
-msgid "Profile Photo 16px"
+#: ../../addon/tour/tour.php:84
+msgid "Launch installed apps"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:62
-msgid "Profile Photo 32px"
+#: ../../addon/tour/tour.php:85
+msgid "Looking for help? Click here."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:63
-msgid "Profile Photo 48px"
+#: ../../addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:64
-msgid "Profile Photo 64px"
+#: ../../addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:65
-msgid "Profile Photo 80px"
+#: ../../addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:66
-msgid "Profile Photo 128px"
+#: ../../addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:67
-msgid "Timezone"
+#: ../../addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:70
-msgid "Birth Year"
+#: ../../addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:71
-msgid "Birth Month"
+#: ../../addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:72
-msgid "Birth Day"
+#: ../../addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
msgstr ""
-#: ../../extend/addon/addon/openid/MysqlProvider.php:73
-msgid "Birthdate"
+#: ../../addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
msgstr ""
-#: ../../extend/addon/addon/openid/openid.php:49
+#: ../../addon/tour/tour.php:97
msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
+"Only want to share content for a while? Make it expire at a certain date."
msgstr ""
-#: ../../extend/addon/addon/openid/openid.php:49
-msgid "The error message was:"
+#: ../../addon/tour/tour.php:98
+msgid "You can password protect content."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
+#: ../../addon/tour/tour.php:99
+msgid "Choose who you share with."
msgstr ""
-#: ../../extend/addon/addon/openid/Mod_Openid.php:188
-#: ../../include/auth.php:286
-msgid "Login failed."
+#: ../../addon/tour/tour.php:101
+msgid "Click here when you are done."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
+#: ../../addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
+#: ../../addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
msgstr ""
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:65
+#: ../../addon/tour/tour.php:109
msgid ""
-"Use this form to re-establish Diaspora connections which were initially made "
-"from a different hub."
-msgstr ""
-
-#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr ""
-
-#: ../../extend/addon/addon/mailtest/mailtest.php:19
-msgid "Send test email"
+"Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:66
-msgid "Mail sent."
+#: ../../addon/tour/tour.php:110
+msgid "Easily find posts in given category."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:68
-msgid "Sending of mail failed."
+#: ../../addon/tour/tour.php:111
+msgid "Easily find posts by date."
msgstr ""
-#: ../../extend/addon/addon/mailtest/mailtest.php:77
-msgid "Mail Test"
+#: ../../addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we "
+"think you might find interesting."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:57
-msgid "Errors encountered deleting database table "
+#: ../../addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
-msgid "Drop tables when uninstalling?"
+#: ../../addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:96
+#: ../../addon/tour/tour.php:117
msgid ""
-"If checked, the Rendezvous database tables will be deleted when the plugin "
-"is uninstalled."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
-msgid "Mapbox Access Token"
+"If you see this icon you can be sure that the sender is who it say it is. It "
+"is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:97
+#: ../../addon/tour/tour.php:118
msgid ""
-"If you enter a Mapbox access token, it will be used to retrieve map tiles "
-"from Mapbox instead of the default OpenStreetMap tile server."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
-msgid "Rendezvous"
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
+#: ../../addon/tour/tour.php:125
msgid ""
-"This identity has been deleted by another member due to inactivity. Please "
-"press the \"New identity\" button or refresh the page to register a new "
-"identity. You may use the same name."
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
-msgid "Welcome to Rendezvous!"
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
+#: ../../addon/sendzid/sendzid.php:26
msgid ""
-"Enter your name to join this rendezvous. To begin sharing your location with "
-"the other members, tap the GPS control. When your location is discovered, a "
-"red dot will appear and others will be able to see you on the map."
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
-msgid "Let's meet here"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
-msgid "New marker"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
-msgid "Edit marker"
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
-msgid "New identity"
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
-msgid "Delete marker"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
-msgid "Delete member"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
-msgid "Edit proximity alert"
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"A proximity alert will be issued when this member is within a certain radius "
-"of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
-msgid "distance"
-msgstr ""
-
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
-msgid "Proximity alert distance (meters)"
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+#: ../../addon/tictac/tictac.php:62
msgid ""
-"A proximity alert will be issued when you are within a certain radius of the "
-"marker location.<br><br>Enter a radius in meters (0 to disable):"
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
-msgid "Marker proximity alert"
+#: ../../addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
-msgid "Reminder note"
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
-msgid ""
-"Enter a note to be displayed when you are within the specified proximity..."
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
-msgid "Add new rendezvous"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
msgstr ""
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
-msgid ""
-"Create a new rendezvous and share the access link with those you wish to "
-"invite to the group. Those who open the link become members of the "
-"rendezvous. They can view other member locations, add markers to the map, or "
-"share their own locations with the group."
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:23
-msgid "Install Firefox Sharing Tools"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:34
-msgid "Share content from Firefox to $Projectname"
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
msgstr ""
-#: ../../extend/addon/addon/firefox/firefox.php:37
-msgid "Install Firefox Sharing Tools to this web browser"
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
-msgid "Error retrieving wiki"
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
-msgid "Error creating zip file export folder"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
-msgid "Error downloading wiki: "
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
-#: ../../include/widgets.php:970
-msgid "Wiki Pages"
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
-#: ../../include/widgets.php:976
-msgid "Add new page"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
-#: ../../include/widgets.php:977
-msgid "Page name"
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
msgstr ""
-#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
-#: ../../include/widgets.php:927
-msgid "Wiki List"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
msgstr ""
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-msgid "Enable the GNU-Social protocol for this channel"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1187
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1187
-msgctxt "opensearch"
-msgid "$Projectname"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
msgstr ""
-#: ../../extend/addon/addon/opensearch/opensearch.php:43
-msgid "Search $Projectname"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
msgstr ""
-#: ../../include/dba/dba_driver.php:187
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
msgstr ""
-#: ../../include/language.php:367 ../../include/text.php:1786
-msgid "default"
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
msgstr ""
-#: ../../include/language.php:380
-msgid "Select an alternate language"
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
msgstr ""
-#: ../../include/account.php:35
-msgid "Not a valid email address"
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
msgstr ""
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
msgstr ""
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
msgstr ""
-#: ../../include/account.php:75
-msgid "An invitation is required."
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
msgstr ""
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
msgstr ""
-#: ../../include/account.php:130
-msgid "Please enter the required information."
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
msgstr ""
-#: ../../include/account.php:198
-msgid "Failed to store account information."
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
msgstr ""
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
msgstr ""
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
msgstr ""
-#: ../../include/account.php:352
-msgid "your registration password"
+#: ../../addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
msgstr ""
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
+#: ../../addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
msgstr ""
-#: ../../include/account.php:431
-msgid "Account approved."
+#: ../../addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
msgstr ""
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
+#: ../../addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
msgstr ""
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
+#: ../../addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
msgstr ""
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
msgstr ""
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
+#: ../../addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
msgstr ""
-#: ../../include/acl_selectors.php:198
-msgid "Who can see this?"
+#: ../../addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
msgstr ""
-#: ../../include/acl_selectors.php:199
-msgid "Custom selection"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
msgstr ""
-#: ../../include/acl_selectors.php:200
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
-"the scope of \"Show\"."
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
msgstr ""
-#: ../../include/acl_selectors.php:201
-msgid "Show"
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
msgstr ""
-#: ../../include/acl_selectors.php:202
-msgid "Don't show"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
msgstr ""
-#: ../../include/acl_selectors.php:235
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These "
-"permissions set who is allowed to view the post."
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
msgstr ""
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/widgets.php:46 ../../include/widgets.php:469
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
msgstr ""
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
msgstr ""
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "have"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
msgstr ""
-#: ../../include/taxonomy.php:314
-msgid "has"
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "want"
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
msgstr ""
-#: ../../include/taxonomy.php:315
-msgid "wants"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
msgstr ""
-#: ../../include/taxonomy.php:316
-msgid "likes"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
msgstr ""
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
msgstr ""
-#: ../../include/markdown.php:444
-msgid "Attachments:"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
msgstr ""
-#: ../../include/markdown.php:539 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
msgstr ""
-#: ../../include/markdown.php:541
-msgid "$Projectname event notification:"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
msgstr ""
-#: ../../include/markdown.php:545 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
msgstr ""
-#: ../../include/markdown.php:553 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
+#: ../../addon/opensearch/opensearch.php:43
+msgid "Search $Projectname"
msgstr ""
-#: ../../include/datetime.php:147
-msgid "Birthday"
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
msgstr ""
-#: ../../include/datetime.php:149
-msgid "Age: "
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
msgstr ""
-#: ../../include/datetime.php:151
-msgid "YYYY-MM-DD or MM-DD"
+#: ../../addon/redfiles/redfilehelper.php:67
+msgid "file"
msgstr ""
-#: ../../include/datetime.php:286 ../../boot.php:2578
-msgid "never"
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
msgstr ""
-#: ../../include/datetime.php:292
-msgid "less than a second ago"
+#: ../../addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
msgstr ""
-#: ../../include/datetime.php:310
+#: ../../addon/hubwall/hubwall.php:73
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
+msgid "%1$d of %2$d messages sent."
msgstr ""
-#: ../../include/datetime.php:321
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:324
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:327
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:330
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:333
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:336
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/datetime.php:339
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr ""
-#: ../../include/datetime.php:576
-#, php-format
-msgid "%1$s's birthday"
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
msgstr ""
-#: ../../include/datetime.php:577
-#, php-format
-msgid "Happy Birthday %1$s"
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
msgstr ""
#: ../../include/selectors.php:30
@@ -11248,751 +10970,718 @@ msgstr ""
msgid "Ask me"
msgstr ""
-#: ../../include/connections.php:127
-msgid "New window"
-msgstr ""
-
-#: ../../include/connections.php:128
-msgid "Open the selected location in a different window or browser tab"
-msgstr ""
-
-#: ../../include/connections.php:246
-#, php-format
-msgid "User '%s' deleted"
-msgstr ""
-
-#: ../../include/conversation.php:204
+#: ../../include/conversation.php:200
#, php-format
msgid "%1$s is now connected with %2$s"
msgstr ""
-#: ../../include/conversation.php:239
+#: ../../include/conversation.php:235
#, php-format
msgid "%1$s poked %2$s"
msgstr ""
-#: ../../include/conversation.php:243 ../../include/text.php:1090
-#: ../../include/text.php:1095
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
msgid "poked"
msgstr ""
-#: ../../include/conversation.php:690
+#: ../../include/conversation.php:691
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
-#: ../../include/conversation.php:710
+#: ../../include/conversation.php:711
msgid "Categories:"
msgstr ""
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:712
msgid "Filed under:"
msgstr ""
-#: ../../include/conversation.php:736
+#: ../../include/conversation.php:737
msgid "View in context"
msgstr ""
-#: ../../include/conversation.php:832
+#: ../../include/conversation.php:834
msgid "remove"
msgstr ""
-#: ../../include/conversation.php:836 ../../include/nav.php:292
+#: ../../include/conversation.php:838 ../../include/nav.php:268
msgid "Loading..."
msgstr ""
-#: ../../include/conversation.php:837
+#: ../../include/conversation.php:839
msgid "Delete Selected Items"
msgstr ""
-#: ../../include/conversation.php:930 ../../include/conversation.php:972
+#: ../../include/conversation.php:882
msgid "View Source"
msgstr ""
-#: ../../include/conversation.php:931 ../../include/conversation.php:982
+#: ../../include/conversation.php:892
msgid "Follow Thread"
msgstr ""
-#: ../../include/conversation.php:932 ../../include/conversation.php:991
+#: ../../include/conversation.php:901
msgid "Unfollow Thread"
msgstr ""
-#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+#: ../../include/conversation.php:992
msgid "Activity/Posts"
msgstr ""
-#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+#: ../../include/conversation.php:1012
msgid "Edit Connection"
msgstr ""
-#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+#: ../../include/conversation.php:1022
msgid "Message"
msgstr ""
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s likes this."
msgstr ""
-#: ../../include/conversation.php:1223
+#: ../../include/conversation.php:1156
#, php-format
msgid "%s doesn't like this."
msgstr ""
-#: ../../include/conversation.php:1227
+#: ../../include/conversation.php:1160
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgid_plural "<span %1$s>%2$d people</span> like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1229
+#: ../../include/conversation.php:1162
#, php-format
msgid "<span %1$s>%2$d people</span> don't like this."
msgid_plural "<span %1$s>%2$d people</span> don't like this."
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1235
+#: ../../include/conversation.php:1168
msgid "and"
msgstr ""
-#: ../../include/conversation.php:1238
+#: ../../include/conversation.php:1171
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s like this."
msgstr ""
-#: ../../include/conversation.php:1239
+#: ../../include/conversation.php:1172
#, php-format
msgid "%s don't like this."
msgstr ""
-#: ../../include/conversation.php:1282
+#: ../../include/conversation.php:1215
msgid "Set your location"
msgstr ""
-#: ../../include/conversation.php:1283
+#: ../../include/conversation.php:1216
msgid "Clear browser location"
msgstr ""
-#: ../../include/conversation.php:1331
+#: ../../include/conversation.php:1264
msgid "Tag term:"
msgstr ""
-#: ../../include/conversation.php:1332
+#: ../../include/conversation.php:1265
msgid "Where are you right now?"
msgstr ""
-#: ../../include/conversation.php:1337
+#: ../../include/conversation.php:1270
msgid "Choose a different album..."
msgstr ""
-#: ../../include/conversation.php:1341
+#: ../../include/conversation.php:1274
msgid "Comments enabled"
msgstr ""
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1275
msgid "Comments disabled"
msgstr ""
-#: ../../include/conversation.php:1380
+#: ../../include/conversation.php:1313
msgid "Page link name"
msgstr ""
-#: ../../include/conversation.php:1383
+#: ../../include/conversation.php:1316
msgid "Post as"
msgstr ""
-#: ../../include/conversation.php:1397
+#: ../../include/conversation.php:1330
msgid "Toggle voting"
msgstr ""
-#: ../../include/conversation.php:1400
+#: ../../include/conversation.php:1333
msgid "Disable comments"
msgstr ""
-#: ../../include/conversation.php:1401
+#: ../../include/conversation.php:1334
msgid "Toggle comments"
msgstr ""
-#: ../../include/conversation.php:1409
+#: ../../include/conversation.php:1342
msgid "Categories (optional, comma-separated list)"
msgstr ""
-#: ../../include/conversation.php:1432
+#: ../../include/conversation.php:1365
msgid "Other networks and post services"
msgstr ""
-#: ../../include/conversation.php:1438
+#: ../../include/conversation.php:1371
msgid "Set publish date"
msgstr ""
-#: ../../include/conversation.php:1692
+#: ../../include/conversation.php:1625
msgid "Discover"
msgstr ""
-#: ../../include/conversation.php:1695
+#: ../../include/conversation.php:1628
msgid "Imported public streams"
msgstr ""
-#: ../../include/conversation.php:1700
+#: ../../include/conversation.php:1633
msgid "Commented Order"
msgstr ""
-#: ../../include/conversation.php:1703
+#: ../../include/conversation.php:1636
msgid "Sort by Comment Date"
msgstr ""
-#: ../../include/conversation.php:1707
+#: ../../include/conversation.php:1640
msgid "Posted Order"
msgstr ""
-#: ../../include/conversation.php:1710
+#: ../../include/conversation.php:1643
msgid "Sort by Post Date"
msgstr ""
-#: ../../include/conversation.php:1718
+#: ../../include/conversation.php:1651
msgid "Posts that mention or involve you"
msgstr ""
-#: ../../include/conversation.php:1727
+#: ../../include/conversation.php:1660
msgid "Activity Stream - by date"
msgstr ""
-#: ../../include/conversation.php:1733
+#: ../../include/conversation.php:1666
msgid "Starred"
msgstr ""
-#: ../../include/conversation.php:1736
+#: ../../include/conversation.php:1669
msgid "Favourite Posts"
msgstr ""
-#: ../../include/conversation.php:1743
+#: ../../include/conversation.php:1676
msgid "Spam"
msgstr ""
-#: ../../include/conversation.php:1746
+#: ../../include/conversation.php:1679
msgid "Posts flagged as SPAM"
msgstr ""
-#: ../../include/conversation.php:1818
+#: ../../include/conversation.php:1754
msgid "Status Messages and Posts"
msgstr ""
-#: ../../include/conversation.php:1830
+#: ../../include/conversation.php:1767
msgid "Profile Details"
msgstr ""
-#: ../../include/conversation.php:1839 ../../include/photos.php:515
+#: ../../include/conversation.php:1777 ../../include/photos.php:527
msgid "Photo Albums"
msgstr ""
-#: ../../include/conversation.php:1846
+#: ../../include/conversation.php:1785
msgid "Files and Storage"
msgstr ""
-#: ../../include/conversation.php:1866 ../../include/conversation.php:1869
-#: ../../include/widgets.php:902
-msgid "Chatrooms"
-msgstr ""
-
-#: ../../include/conversation.php:1879
+#: ../../include/conversation.php:1821
msgid "Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1882
+#: ../../include/conversation.php:1824
msgid "Saved Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1892
+#: ../../include/conversation.php:1835
msgid "View Webpages"
msgstr ""
-#: ../../include/conversation.php:1958
+#: ../../include/conversation.php:1904
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1961
+#: ../../include/conversation.php:1907
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1964
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1967
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1970
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1973
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/import.php:30
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr ""
-
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr ""
-
-#: ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
msgstr ""
-#: ../../include/import.php:1373
-msgid "Unable to import element \""
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
msgstr ""
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
msgstr ""
-#: ../../include/message.php:69
-msgid "No recipient provided."
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
msgstr ""
-#: ../../include/message.php:74
-msgid "[no subject]"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
msgstr ""
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
msgstr ""
-#: ../../include/security.php:117
-msgid "guest:"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
msgstr ""
-#: ../../include/security.php:532
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
msgstr ""
-#: ../../include/widgets.php:103
-msgid "System"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
msgstr ""
-#: ../../include/widgets.php:106
-msgid "New App"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
msgstr ""
-#: ../../include/widgets.php:107
-msgid "Edit Apps"
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
msgstr ""
-#: ../../include/widgets.php:155
-msgid "Suggestions"
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
msgstr ""
-#: ../../include/widgets.php:156
-msgid "See more..."
+#: ../../include/permissions.php:55
+msgid "Extremely advanced. Leave this alone unless you know what you are doing"
msgstr ""
-#: ../../include/widgets.php:176
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
msgstr ""
-#: ../../include/widgets.php:182
-msgid "Add New Connection"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
msgstr ""
-#: ../../include/widgets.php:183
-msgid "Enter channel address"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
msgstr ""
-#: ../../include/widgets.php:184
-msgid "Examples: bob@example.com, https://example.com/barbara"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
msgstr ""
-#: ../../include/widgets.php:200
-msgid "Notes"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
msgstr ""
-#: ../../include/widgets.php:276
-msgid "Remove term"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/widgets.php:284 ../../include/features.php:301
-msgid "Saved Searches"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
msgstr ""
-#: ../../include/widgets.php:285 ../../include/group.php:316
-msgid "add"
+#: ../../include/text.php:478
+msgid "prev"
msgstr ""
-#: ../../include/widgets.php:347 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
-msgid "Saved Folders"
+#: ../../include/text.php:480
+msgid "first"
msgstr ""
-#: ../../include/widgets.php:350 ../../include/widgets.php:472
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
+#: ../../include/text.php:509
+msgid "last"
msgstr ""
-#: ../../include/widgets.php:391
-msgid "Archives"
+#: ../../include/text.php:512
+msgid "next"
msgstr ""
-#: ../../include/widgets.php:563
-msgid "Refresh"
+#: ../../include/text.php:523
+msgid "older"
msgstr ""
-#: ../../include/widgets.php:603
-msgid "Account settings"
+#: ../../include/text.php:525
+msgid "newer"
msgstr ""
-#: ../../include/widgets.php:609
-msgid "Channel settings"
+#: ../../include/text.php:945
+msgid "No connections"
msgstr ""
-#: ../../include/widgets.php:618
-msgid "Additional features"
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
msgstr ""
-#: ../../include/widgets.php:625
-msgid "Feature/Addon settings"
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
msgstr ""
-#: ../../include/widgets.php:631
-msgid "Display settings"
+#: ../../include/text.php:1121
+msgid "ping"
msgstr ""
-#: ../../include/widgets.php:638
-msgid "Manage locations"
+#: ../../include/text.php:1121
+msgid "pinged"
msgstr ""
-#: ../../include/widgets.php:645
-msgid "Export channel"
+#: ../../include/text.php:1122
+msgid "prod"
msgstr ""
-#: ../../include/widgets.php:651
-msgid "Connected apps"
+#: ../../include/text.php:1122
+msgid "prodded"
msgstr ""
-#: ../../include/widgets.php:683
-msgid "Premium Channel Settings"
+#: ../../include/text.php:1123
+msgid "slap"
msgstr ""
-#: ../../include/widgets.php:712
-msgid "Private Mail Menu"
+#: ../../include/text.php:1123
+msgid "slapped"
msgstr ""
-#: ../../include/widgets.php:714
-msgid "Combined View"
+#: ../../include/text.php:1124
+msgid "finger"
msgstr ""
-#: ../../include/widgets.php:719 ../../include/nav.php:213
-msgid "Inbox"
+#: ../../include/text.php:1124
+msgid "fingered"
msgstr ""
-#: ../../include/widgets.php:724 ../../include/nav.php:214
-msgid "Outbox"
+#: ../../include/text.php:1125
+msgid "rebuff"
msgstr ""
-#: ../../include/widgets.php:729 ../../include/nav.php:215
-msgid "New Message"
+#: ../../include/text.php:1125
+msgid "rebuffed"
msgstr ""
-#: ../../include/widgets.php:746 ../../include/widgets.php:758
-msgid "Conversations"
+#: ../../include/text.php:1137
+msgid "happy"
msgstr ""
-#: ../../include/widgets.php:750
-msgid "Received Messages"
+#: ../../include/text.php:1138
+msgid "sad"
msgstr ""
-#: ../../include/widgets.php:754
-msgid "Sent Messages"
+#: ../../include/text.php:1139
+msgid "mellow"
msgstr ""
-#: ../../include/widgets.php:768
-msgid "No messages."
+#: ../../include/text.php:1140
+msgid "tired"
msgstr ""
-#: ../../include/widgets.php:786
-msgid "Delete conversation"
+#: ../../include/text.php:1141
+msgid "perky"
msgstr ""
-#: ../../include/widgets.php:812
-msgid "Events Tools"
+#: ../../include/text.php:1142
+msgid "angry"
msgstr ""
-#: ../../include/widgets.php:813
-msgid "Export Calendar"
+#: ../../include/text.php:1143
+msgid "stupefied"
msgstr ""
-#: ../../include/widgets.php:814
-msgid "Import Calendar"
+#: ../../include/text.php:1144
+msgid "puzzled"
msgstr ""
-#: ../../include/widgets.php:906
-msgid "Overview"
+#: ../../include/text.php:1145
+msgid "interested"
msgstr ""
-#: ../../include/widgets.php:913
-msgid "Chat Members"
+#: ../../include/text.php:1146
+msgid "bitter"
msgstr ""
-#: ../../include/widgets.php:991
-msgctxt "wiki_history"
-msgid "Message"
+#: ../../include/text.php:1147
+msgid "cheerful"
msgstr ""
-#: ../../include/widgets.php:1013
-msgid "Bookmarked Chatrooms"
+#: ../../include/text.php:1148
+msgid "alive"
msgstr ""
-#: ../../include/widgets.php:1044
-msgid "Suggested Chatrooms"
+#: ../../include/text.php:1149
+msgid "annoyed"
msgstr ""
-#: ../../include/widgets.php:1189 ../../include/widgets.php:1301
-msgid "photo/image"
+#: ../../include/text.php:1150
+msgid "anxious"
msgstr ""
-#: ../../include/widgets.php:1244
-msgid "Click to show more"
+#: ../../include/text.php:1151
+msgid "cranky"
msgstr ""
-#: ../../include/widgets.php:1395
-msgid "Rating Tools"
+#: ../../include/text.php:1152
+msgid "disturbed"
msgstr ""
-#: ../../include/widgets.php:1399 ../../include/widgets.php:1401
-msgid "Rate Me"
+#: ../../include/text.php:1153
+msgid "frustrated"
msgstr ""
-#: ../../include/widgets.php:1404
-msgid "View Ratings"
+#: ../../include/text.php:1154
+msgid "depressed"
msgstr ""
-#: ../../include/widgets.php:1497
-msgid "Forums"
+#: ../../include/text.php:1155
+msgid "motivated"
msgstr ""
-#: ../../include/widgets.php:1526
-msgid "Tasks"
+#: ../../include/text.php:1156
+msgid "relaxed"
msgstr ""
-#: ../../include/widgets.php:1592 ../../include/widgets.php:1630
-msgid "Member registrations waiting for confirmation"
+#: ../../include/text.php:1157
+msgid "surprised"
msgstr ""
-#: ../../include/widgets.php:1598
-msgid "Inspect queue"
+#: ../../include/text.php:1330 ../../include/js_strings.php:70
+msgid "Monday"
msgstr ""
-#: ../../include/widgets.php:1600
-msgid "DB updates"
+#: ../../include/text.php:1330 ../../include/js_strings.php:71
+msgid "Tuesday"
msgstr ""
-#: ../../include/widgets.php:1625 ../../include/nav.php:233
-msgid "Admin"
+#: ../../include/text.php:1330 ../../include/js_strings.php:72
+msgid "Wednesday"
msgstr ""
-#: ../../include/widgets.php:1626
-msgid "Plugin Features"
+#: ../../include/text.php:1330 ../../include/js_strings.php:73
+msgid "Thursday"
msgstr ""
-#: ../../include/zot.php:652
-msgid "Invalid data packet"
+#: ../../include/text.php:1330 ../../include/js_strings.php:74
+msgid "Friday"
msgstr ""
-#: ../../include/zot.php:668
-msgid "Unable to verify channel signature"
+#: ../../include/text.php:1330 ../../include/js_strings.php:75
+msgid "Saturday"
msgstr ""
-#: ../../include/zot.php:2319
-#, php-format
-msgid "Unable to verify site signature for %s"
+#: ../../include/text.php:1330 ../../include/js_strings.php:69
+msgid "Sunday"
msgstr ""
-#: ../../include/zot.php:3725
-msgid "invalid target signature"
+#: ../../include/text.php:1334 ../../include/js_strings.php:45
+msgid "January"
msgstr ""
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
+#: ../../include/text.php:1334 ../../include/js_strings.php:46
+msgid "February"
msgstr ""
-#: ../../include/channel.php:67
-msgid "Empty name"
+#: ../../include/text.php:1334 ../../include/js_strings.php:47
+msgid "March"
msgstr ""
-#: ../../include/channel.php:70
-msgid "Name too long"
+#: ../../include/text.php:1334 ../../include/js_strings.php:48
+msgid "April"
msgstr ""
-#: ../../include/channel.php:181
-msgid "No account identifier"
+#: ../../include/text.php:1334
+msgid "May"
msgstr ""
-#: ../../include/channel.php:193
-msgid "Nickname is required."
+#: ../../include/text.php:1334 ../../include/js_strings.php:50
+msgid "June"
msgstr ""
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
+#: ../../include/text.php:1334 ../../include/js_strings.php:51
+msgid "July"
msgstr ""
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
+#: ../../include/text.php:1334 ../../include/js_strings.php:52
+msgid "August"
msgstr ""
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
+#: ../../include/text.php:1334 ../../include/js_strings.php:53
+msgid "September"
msgstr ""
-#: ../../include/channel.php:344
-msgid "Default Profile"
+#: ../../include/text.php:1334 ../../include/js_strings.php:54
+msgid "October"
msgstr ""
-#: ../../include/channel.php:1045
-msgid "Create New Profile"
+#: ../../include/text.php:1334 ../../include/js_strings.php:55
+msgid "November"
msgstr ""
-#: ../../include/channel.php:1065
-msgid "Visible to everybody"
+#: ../../include/text.php:1334 ../../include/js_strings.php:56
+msgid "December"
msgstr ""
-#: ../../include/channel.php:1138 ../../include/channel.php:1257
-msgid "Gender:"
+#: ../../include/text.php:1411 ../../include/text.php:1415
+msgid "Unknown Attachment"
msgstr ""
-#: ../../include/channel.php:1140 ../../include/channel.php:1312
-msgid "Homepage:"
+#: ../../include/text.php:1417
+msgid "unknown"
msgstr ""
-#: ../../include/channel.php:1141
-msgid "Online Now"
+#: ../../include/text.php:1453
+msgid "remove category"
msgstr ""
-#: ../../include/channel.php:1262
-msgid "Like this channel"
+#: ../../include/text.php:1527
+msgid "remove from file"
msgstr ""
-#: ../../include/channel.php:1286
-msgid "j F, Y"
+#: ../../include/text.php:1789 ../../include/language.php:367
+msgid "default"
msgstr ""
-#: ../../include/channel.php:1287
-msgid "j F"
+#: ../../include/text.php:1797
+msgid "Page layout"
msgstr ""
-#: ../../include/channel.php:1294
-msgid "Birthday:"
+#: ../../include/text.php:1797
+msgid "You can create your own with the layouts tool"
msgstr ""
-#: ../../include/channel.php:1307
-#, php-format
-msgid "for %1$d %2$s"
+#: ../../include/text.php:1825
+msgid "Page content type"
msgstr ""
-#: ../../include/channel.php:1310
-msgid "Sexual Preference:"
+#: ../../include/text.php:1958
+msgid "activity"
msgstr ""
-#: ../../include/channel.php:1316
-msgid "Tags:"
+#: ../../include/text.php:2272
+msgid "Design Tools"
msgstr ""
-#: ../../include/channel.php:1318
-msgid "Political Views:"
+#: ../../include/text.php:2278
+msgid "Pages"
msgstr ""
-#: ../../include/channel.php:1320
-msgid "Religion:"
+#: ../../include/text.php:2300
+msgid "Import website..."
msgstr ""
-#: ../../include/channel.php:1324
-msgid "Hobbies/Interests:"
+#: ../../include/text.php:2301
+msgid "Select folder to import"
msgstr ""
-#: ../../include/channel.php:1326
-msgid "Likes:"
+#: ../../include/text.php:2302
+msgid "Import from a zipped folder:"
msgstr ""
-#: ../../include/channel.php:1328
-msgid "Dislikes:"
+#: ../../include/text.php:2303
+msgid "Import from cloud files:"
msgstr ""
-#: ../../include/channel.php:1330
-msgid "Contact information and Social Networks:"
+#: ../../include/text.php:2304
+msgid "/cloud/channel/path/to/folder"
msgstr ""
-#: ../../include/channel.php:1332
-msgid "My other channels:"
+#: ../../include/text.php:2305
+msgid "Enter path to website files"
msgstr ""
-#: ../../include/channel.php:1334
-msgid "Musical interests:"
+#: ../../include/text.php:2306
+msgid "Select folder"
msgstr ""
-#: ../../include/channel.php:1336
-msgid "Books, literature:"
+#: ../../include/text.php:2307
+msgid "Export website..."
msgstr ""
-#: ../../include/channel.php:1338
-msgid "Television:"
+#: ../../include/text.php:2308
+msgid "Export to a zip file"
msgstr ""
-#: ../../include/channel.php:1340
-msgid "Film/dance/culture/entertainment:"
+#: ../../include/text.php:2309
+msgid "website.zip"
msgstr ""
-#: ../../include/channel.php:1342
-msgid "Love/Romance:"
+#: ../../include/text.php:2310
+msgid "Enter a name for the zip file."
msgstr ""
-#: ../../include/channel.php:1344
-msgid "Work/employment:"
+#: ../../include/text.php:2311
+msgid "Export to cloud files"
msgstr ""
-#: ../../include/channel.php:1346
-msgid "School/education:"
+#: ../../include/text.php:2312
+msgid "/path/to/export/folder"
msgstr ""
-#: ../../include/channel.php:1369
-msgid "Like this thing"
+#: ../../include/text.php:2313
+msgid "Enter a path to a cloud files destination."
msgstr ""
-#: ../../include/page_widgets.php:7
-msgid "New Page"
+#: ../../include/text.php:2314
+msgid "Specify folder"
msgstr ""
#: ../../include/contact_widgets.php:11
@@ -12041,6 +11730,57 @@ msgstr[1] ""
msgid "show more"
msgstr ""
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr ""
+
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr ""
+
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
+msgstr ""
+
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr ""
+
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr ""
+
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr ""
+
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr ""
+
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr ""
+
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr ""
+
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr ""
+
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr ""
+
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr ""
+
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr ""
@@ -12181,55 +11921,11 @@ msgstr ""
msgid "timeago.numbers"
msgstr ""
-#: ../../include/js_strings.php:45 ../../include/text.php:1323
-msgid "January"
-msgstr ""
-
-#: ../../include/js_strings.php:46 ../../include/text.php:1323
-msgid "February"
-msgstr ""
-
-#: ../../include/js_strings.php:47 ../../include/text.php:1323
-msgid "March"
-msgstr ""
-
-#: ../../include/js_strings.php:48 ../../include/text.php:1323
-msgid "April"
-msgstr ""
-
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr ""
-#: ../../include/js_strings.php:50 ../../include/text.php:1323
-msgid "June"
-msgstr ""
-
-#: ../../include/js_strings.php:51 ../../include/text.php:1323
-msgid "July"
-msgstr ""
-
-#: ../../include/js_strings.php:52 ../../include/text.php:1323
-msgid "August"
-msgstr ""
-
-#: ../../include/js_strings.php:53 ../../include/text.php:1323
-msgid "September"
-msgstr ""
-
-#: ../../include/js_strings.php:54 ../../include/text.php:1323
-msgid "October"
-msgstr ""
-
-#: ../../include/js_strings.php:55 ../../include/text.php:1323
-msgid "November"
-msgstr ""
-
-#: ../../include/js_strings.php:56 ../../include/text.php:1323
-msgid "December"
-msgstr ""
-
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr ""
@@ -12279,34 +11975,6 @@ msgstr ""
msgid "Dec"
msgstr ""
-#: ../../include/js_strings.php:69 ../../include/text.php:1319
-msgid "Sunday"
-msgstr ""
-
-#: ../../include/js_strings.php:70 ../../include/text.php:1319
-msgid "Monday"
-msgstr ""
-
-#: ../../include/js_strings.php:71 ../../include/text.php:1319
-msgid "Tuesday"
-msgstr ""
-
-#: ../../include/js_strings.php:72 ../../include/text.php:1319
-msgid "Wednesday"
-msgstr ""
-
-#: ../../include/js_strings.php:73 ../../include/text.php:1319
-msgid "Thursday"
-msgstr ""
-
-#: ../../include/js_strings.php:74 ../../include/text.php:1319
-msgid "Friday"
-msgstr ""
-
-#: ../../include/js_strings.php:75 ../../include/text.php:1319
-msgid "Saturday"
-msgstr ""
-
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr ""
@@ -12360,633 +12028,449 @@ msgctxt "calendar"
msgid "All day"
msgstr ""
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
msgstr ""
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
+#: ../../include/message.php:67
+msgid "No recipient provided."
msgstr ""
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
+#: ../../include/message.php:72
+msgid "[no subject]"
msgstr ""
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
+#: ../../include/message.php:223
+msgid "Stored post could not be verified."
msgstr ""
-#: ../../include/attach.php:248 ../../include/attach.php:336
+#: ../../include/activities.php:41
+msgid " and "
+msgstr ""
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr ""
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr ""
+
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr ""
+
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr ""
+
+#: ../../include/attach.php:250 ../../include/attach.php:339
msgid "Item was not found."
msgstr ""
-#: ../../include/attach.php:497
+#: ../../include/attach.php:500
msgid "No source file."
msgstr ""
-#: ../../include/attach.php:519
+#: ../../include/attach.php:522
msgid "Cannot locate file to replace"
msgstr ""
-#: ../../include/attach.php:537
+#: ../../include/attach.php:540
msgid "Cannot locate file to revise/update"
msgstr ""
-#: ../../include/attach.php:668
+#: ../../include/attach.php:671
#, php-format
msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../include/attach.php:682
+#: ../../include/attach.php:685
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../include/attach.php:852
+#: ../../include/attach.php:855
msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../include/attach.php:865
+#: ../../include/attach.php:868
msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../include/attach.php:920 ../../include/attach.php:936
+#: ../../include/attach.php:923 ../../include/attach.php:939
msgid "Path not available."
msgstr ""
-#: ../../include/attach.php:982 ../../include/attach.php:1140
+#: ../../include/attach.php:988 ../../include/attach.php:1153
msgid "Empty pathname"
msgstr ""
-#: ../../include/attach.php:1008
+#: ../../include/attach.php:1014
msgid "duplicate filename or path"
msgstr ""
-#: ../../include/attach.php:1030
+#: ../../include/attach.php:1039
msgid "Path not found."
msgstr ""
-#: ../../include/attach.php:1094
+#: ../../include/attach.php:1107
msgid "mkdir failed."
msgstr ""
-#: ../../include/attach.php:1098
+#: ../../include/attach.php:1111
msgid "database storage failed."
msgstr ""
-#: ../../include/attach.php:1146
+#: ../../include/attach.php:1159
msgid "Empty path"
msgstr ""
-#: ../../include/network.php:733
-msgid "view full size"
-msgstr ""
-
-#: ../../include/network.php:1988
-msgid "No Subject"
-msgstr ""
-
-#: ../../include/network.php:2244
-msgid "OStatus"
-msgstr ""
-
-#: ../../include/network.php:2245
-msgid "GNU-Social"
-msgstr ""
-
-#: ../../include/network.php:2246
-msgid "RSS/Atom"
-msgstr ""
-
-#: ../../include/network.php:2249
-msgid "Facebook"
-msgstr ""
-
-#: ../../include/network.php:2250
-msgid "Zot"
-msgstr ""
-
-#: ../../include/network.php:2251
-msgid "LinkedIn"
-msgstr ""
-
-#: ../../include/network.php:2252
-msgid "XMPP/IM"
-msgstr ""
-
-#: ../../include/network.php:2253
-msgid "MySpace"
-msgstr ""
-
-#: ../../include/oembed.php:308
-msgid " by "
-msgstr ""
-
-#: ../../include/oembed.php:309
-msgid " on "
+#: ../../include/security.php:117
+msgid "guest:"
msgstr ""
-#: ../../include/oembed.php:338
-msgid "Embedded content"
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
msgstr ""
-#: ../../include/oembed.php:347
-msgid "Embedding disabled"
+#: ../../include/items.php:846 ../../include/items.php:893
+msgid "(Unknown)"
msgstr ""
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
+#: ../../include/items.php:1094
+msgid "Visible to anybody on the internet."
msgstr ""
-#: ../../include/photos.php:122
-msgid "Image file is empty."
+#: ../../include/items.php:1096
+msgid "Visible to you only."
msgstr ""
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
+#: ../../include/items.php:1098
+msgid "Visible to anybody in this network."
msgstr ""
-#: ../../include/photos.php:300
-msgid "a new photo"
+#: ../../include/items.php:1100
+msgid "Visible to anybody authenticated."
msgstr ""
-#: ../../include/photos.php:304
+#: ../../include/items.php:1102
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr ""
-
-#: ../../include/photos.php:519
-msgid "Upload New Photos"
-msgstr ""
-
-#: ../../include/text.php:460
-msgid "prev"
-msgstr ""
-
-#: ../../include/text.php:462
-msgid "first"
-msgstr ""
-
-#: ../../include/text.php:491
-msgid "last"
+msgid "Visible to anybody on %s."
msgstr ""
-#: ../../include/text.php:494
-msgid "next"
+#: ../../include/items.php:1104
+msgid "Visible to all connections."
msgstr ""
-#: ../../include/text.php:505
-msgid "older"
+#: ../../include/items.php:1106
+msgid "Visible to approved connections."
msgstr ""
-#: ../../include/text.php:507
-msgid "newer"
+#: ../../include/items.php:1108
+msgid "Visible to specific connections."
msgstr ""
-#: ../../include/text.php:920
-msgid "No connections"
+#: ../../include/items.php:3925
+msgid "Privacy group is empty."
msgstr ""
-#: ../../include/text.php:945
+#: ../../include/items.php:3932
#, php-format
-msgid "View all %s connections"
-msgstr ""
-
-#: ../../include/text.php:1090 ../../include/text.php:1095
-msgid "poke"
-msgstr ""
-
-#: ../../include/text.php:1096
-msgid "ping"
-msgstr ""
-
-#: ../../include/text.php:1096
-msgid "pinged"
-msgstr ""
-
-#: ../../include/text.php:1097
-msgid "prod"
-msgstr ""
-
-#: ../../include/text.php:1097
-msgid "prodded"
-msgstr ""
-
-#: ../../include/text.php:1098
-msgid "slap"
-msgstr ""
-
-#: ../../include/text.php:1098
-msgid "slapped"
-msgstr ""
-
-#: ../../include/text.php:1099
-msgid "finger"
-msgstr ""
-
-#: ../../include/text.php:1099
-msgid "fingered"
-msgstr ""
-
-#: ../../include/text.php:1100
-msgid "rebuff"
-msgstr ""
-
-#: ../../include/text.php:1100
-msgid "rebuffed"
-msgstr ""
-
-#: ../../include/text.php:1112
-msgid "happy"
-msgstr ""
-
-#: ../../include/text.php:1113
-msgid "sad"
-msgstr ""
-
-#: ../../include/text.php:1114
-msgid "mellow"
-msgstr ""
-
-#: ../../include/text.php:1115
-msgid "tired"
-msgstr ""
-
-#: ../../include/text.php:1116
-msgid "perky"
-msgstr ""
-
-#: ../../include/text.php:1117
-msgid "angry"
-msgstr ""
-
-#: ../../include/text.php:1118
-msgid "stupefied"
-msgstr ""
-
-#: ../../include/text.php:1119
-msgid "puzzled"
-msgstr ""
-
-#: ../../include/text.php:1120
-msgid "interested"
-msgstr ""
-
-#: ../../include/text.php:1121
-msgid "bitter"
-msgstr ""
-
-#: ../../include/text.php:1122
-msgid "cheerful"
-msgstr ""
-
-#: ../../include/text.php:1123
-msgid "alive"
-msgstr ""
-
-#: ../../include/text.php:1124
-msgid "annoyed"
-msgstr ""
-
-#: ../../include/text.php:1125
-msgid "anxious"
-msgstr ""
-
-#: ../../include/text.php:1126
-msgid "cranky"
-msgstr ""
-
-#: ../../include/text.php:1127
-msgid "disturbed"
-msgstr ""
-
-#: ../../include/text.php:1128
-msgid "frustrated"
-msgstr ""
-
-#: ../../include/text.php:1129
-msgid "depressed"
-msgstr ""
-
-#: ../../include/text.php:1130
-msgid "motivated"
-msgstr ""
-
-#: ../../include/text.php:1131
-msgid "relaxed"
-msgstr ""
-
-#: ../../include/text.php:1132
-msgid "surprised"
-msgstr ""
-
-#: ../../include/text.php:1323
-msgid "May"
-msgstr ""
-
-#: ../../include/text.php:1400 ../../include/text.php:1404
-msgid "Unknown Attachment"
-msgstr ""
-
-#: ../../include/text.php:1406
-msgid "unknown"
-msgstr ""
-
-#: ../../include/text.php:1442
-msgid "remove category"
-msgstr ""
-
-#: ../../include/text.php:1519
-msgid "remove from file"
-msgstr ""
-
-#: ../../include/text.php:1794
-msgid "Page layout"
-msgstr ""
-
-#: ../../include/text.php:1794
-msgid "You can create your own with the layouts tool"
+msgid "Privacy group: %s"
msgstr ""
-#: ../../include/text.php:1836
-msgid "Page content type"
+#: ../../include/items.php:3944
+msgid "Connection not found."
msgstr ""
-#: ../../include/text.php:1969
-msgid "activity"
+#: ../../include/items.php:4293
+msgid "profile photo"
msgstr ""
-#: ../../include/text.php:2283
-msgid "Design Tools"
+#: ../../include/items.php:4489
+#, php-format
+msgid "[Edited %s]"
msgstr ""
-#: ../../include/text.php:2289
-msgid "Pages"
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Post"
msgstr ""
-#: ../../include/text.php:2311
-msgid "Import website..."
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Comment"
msgstr ""
-#: ../../include/text.php:2312
-msgid "Select folder to import"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../include/text.php:2313
-msgid "Import from a zipped folder:"
+#: ../../include/channel.php:67
+msgid "Empty name"
msgstr ""
-#: ../../include/text.php:2314
-msgid "Import from cloud files:"
+#: ../../include/channel.php:70
+msgid "Name too long"
msgstr ""
-#: ../../include/text.php:2315
-msgid "/cloud/channel/path/to/folder"
+#: ../../include/channel.php:181
+msgid "No account identifier"
msgstr ""
-#: ../../include/text.php:2316
-msgid "Enter path to website files"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
msgstr ""
-#: ../../include/text.php:2317
-msgid "Select folder"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../include/text.php:2318
-msgid "Export website..."
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../include/text.php:2319
-msgid "Export to a zip file"
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../include/text.php:2320
-msgid "website.zip"
+#: ../../include/channel.php:342
+msgid "Default Profile"
msgstr ""
-#: ../../include/text.php:2321
-msgid "Enter a name for the zip file."
+#: ../../include/channel.php:1043
+msgid "Create New Profile"
msgstr ""
-#: ../../include/text.php:2322
-msgid "Export to cloud files"
+#: ../../include/channel.php:1063
+msgid "Visible to everybody"
msgstr ""
-#: ../../include/text.php:2323
-msgid "/path/to/export/folder"
+#: ../../include/channel.php:1136 ../../include/channel.php:1250
+msgid "Gender:"
msgstr ""
-#: ../../include/text.php:2324
-msgid "Enter a path to a cloud files destination."
+#: ../../include/channel.php:1138 ../../include/channel.php:1305
+msgid "Homepage:"
msgstr ""
-#: ../../include/text.php:2325
-msgid "Specify folder"
+#: ../../include/channel.php:1139
+msgid "Online Now"
msgstr ""
-#: ../../include/nav.php:88
-msgid "Remote authentication"
+#: ../../include/channel.php:1255
+msgid "Like this channel"
msgstr ""
-#: ../../include/nav.php:88
-msgid "Click to authenticate to your home hub"
+#: ../../include/channel.php:1279
+msgid "j F, Y"
msgstr ""
-#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1731
-msgid "Logout"
+#: ../../include/channel.php:1280
+msgid "j F"
msgstr ""
-#: ../../include/nav.php:99 ../../include/nav.php:140
-msgid "End this session"
+#: ../../include/channel.php:1287
+msgid "Birthday:"
msgstr ""
-#: ../../include/nav.php:103
-msgid "Your profile page"
+#: ../../include/channel.php:1300
+#, php-format
+msgid "for %1$d %2$s"
msgstr ""
-#: ../../include/nav.php:105
-msgid "Manage/Edit profiles"
+#: ../../include/channel.php:1303
+msgid "Sexual Preference:"
msgstr ""
-#: ../../include/nav.php:107
-msgid "Edit your profile"
+#: ../../include/channel.php:1309
+msgid "Tags:"
msgstr ""
-#: ../../include/nav.php:130
-msgid "Sign in"
+#: ../../include/channel.php:1311
+msgid "Political Views:"
msgstr ""
-#: ../../include/nav.php:155
-msgid "Get me home"
+#: ../../include/channel.php:1313
+msgid "Religion:"
msgstr ""
-#: ../../include/nav.php:157
-msgid "Log me out of this site"
+#: ../../include/channel.php:1317
+msgid "Hobbies/Interests:"
msgstr ""
-#: ../../include/nav.php:162
-msgid "Create an account"
+#: ../../include/channel.php:1319
+msgid "Likes:"
msgstr ""
-#: ../../include/nav.php:174
-msgid "Help and documentation"
+#: ../../include/channel.php:1321
+msgid "Dislikes:"
msgstr ""
-#: ../../include/nav.php:178
-msgid "Applications, utilities, links, games"
+#: ../../include/channel.php:1323
+msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../include/nav.php:180
-msgid "Search site @name, #tag, ?docs, content"
+#: ../../include/channel.php:1325
+msgid "My other channels:"
msgstr ""
-#: ../../include/nav.php:182
-msgid "Channel Directory"
+#: ../../include/channel.php:1327
+msgid "Musical interests:"
msgstr ""
-#: ../../include/nav.php:194
-msgid "Your grid"
+#: ../../include/channel.php:1329
+msgid "Books, literature:"
msgstr ""
-#: ../../include/nav.php:195
-msgid "View your network/grid"
+#: ../../include/channel.php:1331
+msgid "Television:"
msgstr ""
-#: ../../include/nav.php:196
-msgid "Mark all grid notifications seen"
+#: ../../include/channel.php:1333
+msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../include/nav.php:198
-msgid "Channel home"
+#: ../../include/channel.php:1335
+msgid "Love/Romance:"
msgstr ""
-#: ../../include/nav.php:199
-msgid "View your channel home"
+#: ../../include/channel.php:1337
+msgid "Work/employment:"
msgstr ""
-#: ../../include/nav.php:200
-msgid "Mark all channel notifications seen"
+#: ../../include/channel.php:1339
+msgid "School/education:"
msgstr ""
-#: ../../include/nav.php:206
-msgid "Notices"
+#: ../../include/channel.php:1362
+msgid "Like this thing"
msgstr ""
-#: ../../include/nav.php:206
-msgid "Notifications"
+#: ../../include/channel.php:2135
+#, php-format
+msgid "User '%s' deleted"
msgstr ""
-#: ../../include/nav.php:207
-msgid "View all notifications"
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
msgstr ""
-#: ../../include/nav.php:210
-msgid "Private mail"
+#: ../../include/event.php:1204
+msgid "Not specified"
msgstr ""
-#: ../../include/nav.php:211
-msgid "View your private messages"
+#: ../../include/event.php:1205
+msgid "Needs Action"
msgstr ""
-#: ../../include/nav.php:212
-msgid "Mark all private messages seen"
+#: ../../include/event.php:1206
+msgid "Completed"
msgstr ""
-#: ../../include/nav.php:218
-msgid "Event Calendar"
+#: ../../include/event.php:1207
+msgid "In Process"
msgstr ""
-#: ../../include/nav.php:219
-msgid "View events"
+#: ../../include/event.php:1208
+msgid "Cancelled"
msgstr ""
-#: ../../include/nav.php:220
-msgid "Mark all events seen"
+#: ../../include/network.php:756
+msgid "view full size"
msgstr ""
-#: ../../include/nav.php:223
-msgid "Manage Your Channels"
+#: ../../include/network.php:2011
+msgid "No Subject"
msgstr ""
-#: ../../include/nav.php:225
-msgid "Account/Channel Settings"
+#: ../../include/network.php:2265 ../../include/network.php:2266
+msgid "Friendica"
msgstr ""
-#: ../../include/nav.php:233
-msgid "Site Setup and Configuration"
+#: ../../include/network.php:2267
+msgid "OStatus"
msgstr ""
-#: ../../include/nav.php:288
-msgid "Documentation"
+#: ../../include/network.php:2268
+msgid "GNU-Social"
msgstr ""
-#: ../../include/nav.php:297
-msgid "@name, #tag, ?doc, content"
+#: ../../include/network.php:2269
+msgid "RSS/Atom"
msgstr ""
-#: ../../include/nav.php:298
-msgid "Please wait..."
+#: ../../include/network.php:2271
+msgid "Diaspora"
msgstr ""
-#: ../../include/auth.php:148
-msgid "Logged out."
+#: ../../include/network.php:2272
+msgid "Facebook"
msgstr ""
-#: ../../include/auth.php:275
-msgid "Failed authentication"
+#: ../../include/network.php:2273
+msgid "Zot"
msgstr ""
-#: ../../include/follow.php:26
-msgid "Channel is blocked on this site."
+#: ../../include/network.php:2274
+msgid "LinkedIn"
msgstr ""
-#: ../../include/follow.php:31
-msgid "Channel location missing."
+#: ../../include/network.php:2275
+msgid "XMPP/IM"
msgstr ""
-#: ../../include/follow.php:73
-msgid "Response from remote channel was incomplete."
+#: ../../include/network.php:2276
+msgid "MySpace"
msgstr ""
-#: ../../include/follow.php:90
-msgid "Channel was deleted and no longer exists."
+#: ../../include/page_widgets.php:7
+msgid "New Page"
msgstr ""
-#: ../../include/follow.php:140 ../../include/follow.php:175
-msgid "Protocol disabled."
+#: ../../include/language.php:380
+msgid "Select an alternate language"
msgstr ""
-#: ../../include/follow.php:163
-msgid "Channel discovery failed."
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
msgstr ""
-#: ../../include/follow.php:202
-msgid "Cannot connect to yourself."
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
msgstr ""
-#: ../../include/activities.php:41
-msgid " and "
+#: ../../include/acl_selectors.php:210
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit "
+"the scope of \"Show\"."
msgstr ""
-#: ../../include/activities.php:49
-msgid "public profile"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
msgstr ""
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
msgstr ""
-#: ../../include/activities.php:59
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "Visit %1$s's %2$s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These "
+"permissions set who is allowed to view the post."
msgstr ""
-#: ../../include/activities.php:62
+#: ../../include/dba/dba_driver.php:189
#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
@@ -13032,185 +12516,20 @@ msgstr ""
msgid "$1 wrote:"
msgstr ""
-#: ../../include/bookmarks.php:34
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr ""
-
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr ""
-
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr ""
-
-#: ../../include/group.php:289
-msgid "edit"
-msgstr ""
-
-#: ../../include/group.php:311 ../../include/features.php:292
-msgid "Privacy Groups"
-msgstr ""
-
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr ""
-
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr ""
-
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr ""
-
-#: ../../include/event.php:863
-msgid "This event has been added to your calendar."
-msgstr ""
-
-#: ../../include/event.php:1063
-msgid "Not specified"
-msgstr ""
-
-#: ../../include/event.php:1064
-msgid "Needs Action"
-msgstr ""
-
-#: ../../include/event.php:1065
-msgid "Completed"
-msgstr ""
-
-#: ../../include/event.php:1066
-msgid "In Process"
-msgstr ""
-
-#: ../../include/event.php:1067
-msgid "Cancelled"
-msgstr ""
-
-#: ../../include/items.php:841 ../../include/items.php:888
-msgid "(Unknown)"
-msgstr ""
-
-#: ../../include/items.php:1089
-msgid "Visible to anybody on the internet."
-msgstr ""
-
-#: ../../include/items.php:1091
-msgid "Visible to you only."
-msgstr ""
-
-#: ../../include/items.php:1093
-msgid "Visible to anybody in this network."
-msgstr ""
-
-#: ../../include/items.php:1095
-msgid "Visible to anybody authenticated."
-msgstr ""
-
-#: ../../include/items.php:1097
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr ""
-
-#: ../../include/items.php:1099
-msgid "Visible to all connections."
-msgstr ""
-
-#: ../../include/items.php:1101
-msgid "Visible to approved connections."
-msgstr ""
-
-#: ../../include/items.php:1103
-msgid "Visible to specific connections."
-msgstr ""
-
-#: ../../include/items.php:3915
-msgid "Privacy group is empty."
-msgstr ""
-
-#: ../../include/items.php:3922
-#, php-format
-msgid "Privacy group: %s"
-msgstr ""
-
-#: ../../include/items.php:3934
-msgid "Connection not found."
-msgstr ""
-
-#: ../../include/items.php:4283
-msgid "profile photo"
-msgstr ""
-
-#: ../../include/items.php:4479
-#, php-format
-msgid "[Edited %s]"
-msgstr ""
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Post"
-msgstr ""
-
-#: ../../include/items.php:4479
-msgctxt "edit_activity"
-msgid "Comment"
-msgstr ""
-
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr ""
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr ""
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr ""
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr ""
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr ""
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
+#: ../../include/oembed.php:308
+msgid " by "
msgstr ""
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
+#: ../../include/oembed.php:309
+msgid " on "
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
+#: ../../include/oembed.php:338
+msgid "Embedded content"
msgstr ""
-#: ../../include/permissions.php:55
-msgid "Extremely advanced. Leave this alone unless you know what you are doing"
+#: ../../include/oembed.php:347
+msgid "Embedding disabled"
msgstr ""
#: ../../include/features.php:58
@@ -13285,10 +12604,6 @@ msgstr ""
msgid "Provide chatrooms and chat services with access control."
msgstr ""
-#: ../../include/features.php:153
-msgid "Permission Groups"
-msgstr ""
-
#: ../../include/features.php:154
msgid "Provide alternate connection permission roles."
msgstr ""
@@ -13408,6 +12723,10 @@ msgstr ""
msgid "Ability to select posts by date ranges"
msgstr ""
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr ""
+
#: ../../include/features.php:293
msgid "Enable management and selection of privacy groups"
msgstr ""
@@ -13518,198 +12837,410 @@ msgid ""
"channel"
msgstr ""
-#: ../../include/help.php:31
-msgid "Help:"
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
msgstr ""
-#: ../../include/help.php:63
-msgid "Not Found"
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
msgstr ""
-#: ../../util/nconfig.php:34
-msgid "Source channel not found."
+#: ../../include/taxonomy.php:314
+msgid "have"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:9
-msgid "Focus (Hubzilla default)"
+#: ../../include/taxonomy.php:314
+msgid "has"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Theme settings"
+#: ../../include/taxonomy.php:315
+msgid "want"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Narrow navbar"
+#: ../../include/taxonomy.php:315
+msgid "wants"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar background color"
+#: ../../include/taxonomy.php:316
+msgid "likes"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar gradient top color"
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "Navigation bar gradient bottom color"
+#: ../../include/account.php:35
+msgid "Not a valid email address"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Navigation active button gradient top color"
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Navigation active button gradient bottom color"
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Navigation bar border color "
+#: ../../include/account.php:75
+msgid "An invitation is required."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Navigation bar icon color "
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Navigation bar active icon color "
+#: ../../include/account.php:130
+msgid "Please enter the required information."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "link color"
+#: ../../include/account.php:198
+msgid "Failed to store account information."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set font-color for banner"
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the background color"
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the background image"
+#: ../../include/account.php:352
+msgid "your registration password"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set the background color of items"
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set the background color of comments"
+#: ../../include/account.php:431
+msgid "Account approved."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set the border color of comments"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set the indent for comments"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set the basic color for item icons"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set the hover color for item icons"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Set font-size for the entire application"
+#: ../../include/datetime.php:147
+msgid "Birthday"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Example: 14px"
+#: ../../include/datetime.php:149
+msgid "Age: "
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set font-size for posts and comments"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set font-color for posts and comments"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set radius of corners"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:134
-msgid "Set shadow depth of photos"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Set maximum width of content region in pixel"
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:135
-msgid "Leave empty for default width"
+#: ../../include/nav.php:88
+msgid "Remote authentication"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:136
-msgid "Left align page content"
+#: ../../include/nav.php:88
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:137
-msgid "Set minimum opacity of nav bar - to hide it"
+#: ../../include/nav.php:99 ../../include/nav.php:123
+msgid "End this session"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:138
-msgid "Set size of conversation author photo"
+#: ../../include/nav.php:102
+msgid "Your profile page"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:139
-msgid "Set size of followup author photos"
+#: ../../include/nav.php:105
+msgid "Manage/Edit profiles"
msgstr ""
-#: ../../boot.php:1505
-#, php-format
-msgid "Update %s failed. See error logs."
+#: ../../include/nav.php:107
+msgid "Edit your profile"
msgstr ""
-#: ../../boot.php:1508
-#, php-format
-msgid "Update Error at %s"
+#: ../../include/nav.php:113
+msgid "Sign in"
msgstr ""
-#: ../../boot.php:1712
-msgid "Create an account to access services and applications"
+#: ../../include/nav.php:138
+msgid "Take me home"
msgstr ""
-#: ../../boot.php:1734
-msgid "Login/Email"
+#: ../../include/nav.php:140
+msgid "Log me out of this site"
msgstr ""
-#: ../../boot.php:1735
-msgid "Password"
+#: ../../include/nav.php:145
+msgid "Create an account"
msgstr ""
-#: ../../boot.php:1736
-msgid "Remember me"
+#: ../../include/nav.php:157
+msgid "Help and documentation"
msgstr ""
-#: ../../boot.php:1739
-msgid "Forgot your password?"
+#: ../../include/nav.php:160
+msgid "Search site @name, #tag, ?docs, content"
msgstr ""
-#: ../../boot.php:2300
-msgid "toggle mobile"
+#: ../../include/nav.php:172
+msgid "Your grid"
msgstr ""
-#: ../../boot.php:2455
-msgid "Website SSL certificate is not valid. Please correct."
+#: ../../include/nav.php:173
+msgid "View your network/grid"
+msgstr ""
+
+#: ../../include/nav.php:174
+msgid "Mark all grid notifications seen"
+msgstr ""
+
+#: ../../include/nav.php:176
+msgid "Channel home"
+msgstr ""
+
+#: ../../include/nav.php:177
+msgid "View your channel home"
+msgstr ""
+
+#: ../../include/nav.php:178
+msgid "Mark all channel notifications seen"
+msgstr ""
+
+#: ../../include/nav.php:184
+msgid "Notices"
+msgstr ""
+
+#: ../../include/nav.php:184
+msgid "Notifications"
+msgstr ""
+
+#: ../../include/nav.php:185
+msgid "View all notifications"
+msgstr ""
+
+#: ../../include/nav.php:188
+msgid "Private mail"
+msgstr ""
+
+#: ../../include/nav.php:189
+msgid "View your private messages"
+msgstr ""
+
+#: ../../include/nav.php:190
+msgid "Mark all private messages seen"
+msgstr ""
+
+#: ../../include/nav.php:196
+msgid "Event Calendar"
+msgstr ""
+
+#: ../../include/nav.php:197
+msgid "View events"
+msgstr ""
+
+#: ../../include/nav.php:198
+msgid "Mark all events seen"
+msgstr ""
+
+#: ../../include/nav.php:201
+msgid "Manage Your Channels"
+msgstr ""
+
+#: ../../include/nav.php:203
+msgid "Account/Channel Settings"
+msgstr ""
+
+#: ../../include/nav.php:211
+msgid "Site Setup and Configuration"
+msgstr ""
+
+#: ../../include/nav.php:273
+msgid "@name, #tag, ?doc, content"
+msgstr ""
+
+#: ../../include/nav.php:274
+msgid "Please wait..."
msgstr ""
-#: ../../boot.php:2458
+#: ../../include/nav.php:276
+msgid "Add Apps"
+msgstr ""
+
+#: ../../include/photos.php:115
#, php-format
-msgid "[hubzilla] Website SSL error for %s"
+msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../boot.php:2577
-msgid "Cron/Scheduled tasks not running."
+#: ../../include/photos.php:122
+msgid "Image file is empty."
msgstr ""
-#: ../../boot.php:2581
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
+msgstr ""
+
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr ""
+
+#: ../../include/photos.php:305
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr ""
+
+#: ../../include/photos.php:532
+msgid "Upload New Photos"
+msgstr ""
+
+#: ../../include/zot.php:649
+msgid "Invalid data packet"
+msgstr ""
+
+#: ../../include/zot.php:665
+msgid "Unable to verify channel signature"
+msgstr ""
+
+#: ../../include/zot.php:2316
#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
+msgid "Unable to verify site signature for %s"
+msgstr ""
+
+#: ../../include/zot.php:3722
+msgid "invalid target signature"
+msgstr ""
+
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr ""
+
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr ""
+
+#: ../../include/group.php:309
+msgid "edit"
+msgstr ""
+
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr ""
+
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr ""
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr ""
+
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr ""
+
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr ""
+
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr ""
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr ""
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr ""
+
+#: ../../include/help.php:65
+msgid "Not Found"
msgstr ""
diff --git a/util/pconfig b/util/pconfig
index 1847a5a81..36d894fb5 100755
--- a/util/pconfig
+++ b/util/pconfig
@@ -73,8 +73,10 @@ if($argc == 4) {
if($argc == 3) {
load_pconfig($argv[1],$argv[2]);
- foreach(App::$config[$argv[1]][$argv[2]] as $k => $x) {
- echo "pconfig[{$argv[1]}][{$argv[2]}][{$k}] = " . $x . "\n";
+ if(App::$config[$argv[1]][$argv[2]]) {
+ foreach(App::$config[$argv[1]][$argv[2]] as $k => $x) {
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$k}] = " . $x . "\n";
+ }
}
}
diff --git a/util/typo.php b/util/typo.php
index f9c9e5353..a8d363340 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -28,17 +28,18 @@
include_once($file);
}
- echo "Directory: include/RedDAV\n";
- $files = glob('include/RedDAV/*.php');
+ echo "Directory: include/photo\n";
+ $files = glob('include/photo/*.php');
foreach($files as $file) {
echo $file . "\n";
include_once($file);
}
+
echo "Directory: Zotlabs\n";
$files = glob('Zotlabs/*/*.php');
foreach($files as $file) {
- if(strpos($file,'SiteModule') === false) {
+ if((strpos($file,'SiteModule') === false) || (strpos($file,'SiteWidget') === false)) {
echo $file . "\n";
include_once($file);
}
@@ -51,21 +52,6 @@
include_once($file);
}
-
- echo "Directory: include/photo\n";
- $files = glob('include/photo/*.php');
- foreach($files as $file) {
- echo $file . "\n";
- include_once($file);
- }
-
-// echo "Directory: mod\n";
-// $files = glob('mod/*.php');
-// foreach($files as $file) {
-// echo $file . "\n";
-// include_once($file);
-// }
-
echo "Directory: addon\n";
$dirs = glob('addon/*');
@@ -93,6 +79,5 @@
foreach($files as $file) {
echo $file . "\n";
- passthru($phpath . ' util/typohelper.php ' . $file);
-// include_once($file);
+ passthru($phpath . ' util/typohelper.php ' . $file);
}
diff --git a/vendor/autoload.php b/vendor/autoload.php
index 063a1b7e1..8b4926c3d 100644
--- a/vendor/autoload.php
+++ b/vendor/autoload.php
@@ -2,6 +2,6 @@
// autoload.php @generated by Composer
-require_once __DIR__ . '/composer' . '/autoload_real.php';
+require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d::getLoader();
diff --git a/vendor/bshaffer/oauth2-server-php/CHANGELOG.md b/vendor/bshaffer/oauth2-server-php/CHANGELOG.md
new file mode 100644
index 000000000..4fddd72c9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/CHANGELOG.md
@@ -0,0 +1,182 @@
+CHANGELOG for 1.x
+=================
+
+This changelog references the relevant changes (bug and security fixes) done
+in 1.x minor versions.
+
+To see the files changed for a given bug, go to https://github.com/bshaffer/oauth2-server-php/issues/### where ### is the bug number
+To get the diff between two versions, go to https://github.com/bshaffer/oauth2-server-php/compare/v1.0...v1.1
+To get the diff for a specific change, go to https://github.com/bshaffer/oauth2-server-php/commit/XXX where XXX is the change hash
+
+* 1.9.0 (2016-01-06)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/788
+
+ * bug #645 - Allow null for client_secret
+ * bug #651 - Fix bug in isPublicClient of Cassandra Storage
+ * bug #670 - Bug in client's scope restriction
+ * bug #672 - Implemented method to override the password hashing algorithm
+ * bug #698 - Fix Token Response's Content-Type to application/json
+ * bug #729 - Ensures unsetAccessToken and unsetRefreshToken return a bool
+ * bug #749 - Fix UserClaims for CodeIdToken
+ * bug #784 - RFC6750 compatibility
+ * bug #776 - Fix "redirect_uri_mismatch" for URIs with encoded characters
+ * bug #759 - no access token supplied to resource controller results in empty request body
+ * bug #773 - Use OpenSSL random method before attempting Mcrypt's.
+ * bug #790 - Add mongo db
+
+* 1.8.0 (2015-09-18)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/643
+
+ * bug #594 - adds jti
+ * bug #598 - fixes lifetime configurations for JWTs
+ * bug #634 - fixes travis builds, upgrade to containers
+ * bug #586 - support for revoking tokens
+ * bug #636 - Adds FirebaseJWT bridge
+ * bug #639 - Mongo HHVM compatibility
+
+* 1.7.0 (2015-04-23)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/572
+
+ * bug #500 - PDO fetch mode changed from FETCH_BOTH to FETCH_ASSOC
+ * bug #508 - Case insensitive for Bearer token header name ba716d4
+ * bug #512 - validateRedirectUri is now public
+ * bug #530 - Add PublicKeyInterface, UserClaimsInterface to Cassandra Storage
+ * bug #505 - DynamoDB storage fixes
+ * bug #556 - adds "code id_token" return type to openid connect
+ * bug #563 - Include "issuer" config key for JwtAccessToken
+ * bug #564 - Fixes JWT vulnerability
+ * bug #571 - Added unset_refresh_token_after_use option
+
+* 1.6 (2015-01-16)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/496
+
+ * bug 437 - renames CryptoToken to JwtAccessToken / use_crypto_tokens to use_jwt_access_tokens
+ * bug 447 - Adds a Couchbase storage implementation
+ * bug 460 - Rename JWT claims to match spec
+ * bug 470 - order does not matter for multi-valued response types
+ * bug 471 - Make validateAuthorizeRequest available for POST in addition to GET
+ * bug 475 - Adds JTI table definitiion
+ * bug 481 - better randomness for generating access tokens
+ * bug 480 - Use hash_equals() for signature verification (prevents remote timing attacks)
+ * bugs 489, 491, 498 - misc other fixes
+
+* 1.5 (2014-08-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/446
+
+ * bug #399 - Add DynamoDB Support
+ * bug #404 - renamed error name for malformed/expired tokens
+ * bug #412 - Openid connect: fixes for claims with more than one scope / Add support for the prompt parameter ('consent' and 'none')
+ * bug #411 - fixes xml output
+ * bug #413 - fixes invalid format error
+ * bug #401 - fixes code standards / whitespace
+ * bug #354 - bundles PDO SQL with the library
+ * [BC] bug #397 - refresh tokens should not be encrypted
+ * bug #423 - makes "scope" optional for refresh token storage
+
+* 1.4 (2014-06-12)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/392
+
+ * bug #189 Storage\PDO - allows DSN string in constructor
+ * bug #233 Bearer Tokens - allows token in request body for PUT requests
+ * bug #346 Fixes open_basedir warning
+ * bug #351 Adds OpenID Connect support
+ * bug #355 Adds php 5.6 and HHVM to travis.ci testing
+ * [BC] bug #358 Adds `getQuerystringIdentifier()` to the GrantType interface
+ * bug #363 Encryption\JWT - Allows for subclassing JWT Headers
+ * bug #349 Bearer Tokens - adds requestHasToken method for when access tokens are optional
+ * bug #301 Encryption\JWT - fixes urlSafeB64Encode(): ensures newlines are replaced as expected
+ * bug #323 ResourceController - client_id is no longer required to be returned when calling getAccessToken
+ * bug #367 Storage\PDO - adds Postgres support
+ * bug #368 Access Tokens - use mcrypt_create_iv or openssl_random_pseudo_bytes to create token string
+ * bug #376 Request - allows case insensitive headers
+ * bug #384 Storage\PDO - can pass in PDO options in constructor of PDO storage
+ * misc fixes #361, #292, #373, #374, #379, #396
+* 1.3 (2014-02-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/325
+
+ * bug #311 adds cassandra storage
+ * bug #298 fixes response code for user credentials grant type
+ * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
+ * [BC] bug #320 pass client_id to getDefaultScope
+ * bug #324 better feedback when running tests
+ * bug #335 adds support for non-expiring refresh tokens
+ * bug #333 fixes Pdo storage for getClientKey
+ * bug #336 fixes Redis storage for expireAuthorizationCode
+
+* 1.3 (2014-02-27)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/325
+
+ * bug #311 adds cassandra storage
+ * bug #298 fixes response code for user credentials grant type
+ * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
+ * bug #320 pass client_id to getDefaultScope
+ * bug #324 better feedback when running tests
+ * bug #335 adds support for non-expiring refresh tokens
+ * bug #333 fixes Pdo storage for getClientKey
+ * bug #336 fixes Redis storage for expireAuthorizationCode
+
+* 1.2 (2014-01-03)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/288
+
+ * bug #285 changed response header from 200 to 401 when empty token received
+ * bug #286 adds documentation and links to spec for not including error messages when no token is supplied
+ * bug #280 ensures PHP warnings do not get thrown as a result of an invalid argument to $jwt->decode()
+ * bug #279 predis wrong number of arguments
+ * bug #277 Securing JS WebApp client secret w/ password grant type
+
+* 1.1 (2013-12-17)
+
+ PR: https://github.com/bshaffer/oauth2-server-php/pull/276
+
+ * bug #278 adds refresh token configuration to Server class
+ * bug #274 Supplying a null client_id and client_secret grants API access
+ * bug #244 [MongoStorage] More detailed implementation info
+ * bug #268 Implement jti for JWT Bearer tokens to prevent replay attacks.
+ * bug #266 Removing unused argument to getAccessTokenData
+ * bug #247 Make Bearer token type consistent
+ * bug #253 Fixing CryptoToken refresh token lifetime
+ * bug #246 refactors public key logic to be more intuitive
+ * bug #245 adds support for JSON crypto tokens
+ * bug #230 Remove unused columns in oauth_clients
+ * bug #215 makes Redis Scope Storage obey the same paradigm as PDO
+ * bug #228 removes scope group
+ * bug #227 squelches open basedir restriction error
+ * bug #223 Updated docblocks for RefreshTokenInterface.php
+ * bug #224 Adds protected properties
+ * bug #217 Implement ScopeInterface for PDO, Redis
+
+* 1.0 (2013-08-12)
+
+ * bug #203 Add redirect\_status_code config param for AuthorizeController
+ * bug #205 ensures unnecessary ? is not set when ** bug
+ * bug #204 Fixed call to LogicException
+ * bug #202 Add explode to checkRestrictedGrant in PDO Storage
+ * bug #197 adds support for 'false' default scope ** bug
+ * bug #192 reference errors and adds tests
+ * bug #194 makes some appropriate properties ** bug
+ * bug #191 passes config to HttpBasic
+ * bug #190 validates client credentials before ** bug
+ * bug #171 Fix wrong redirect following authorization step
+ * bug #187 client_id is now passed to getDefaultScope().
+ * bug #176 Require refresh_token in getRefreshToken response
+ * bug #174 make user\_id not required for refresh_token grant
+ * bug #173 Duplication in JwtBearer Grant
+ * bug #168 user\_id not required for authorization_code grant
+ * bug #133 hardens default security for user object
+ * bug #163 allows redirect\_uri on authorization_code to be NULL in docs example
+ * bug #162 adds getToken on ResourceController for convenience
+ * bug #161 fixes fatal error
+ * bug #163 Invalid redirect_uri handling
+ * bug #156 user\_id in OAuth2\_Storage_AuthorizationCodeInterface::getAuthorizationCode() response
+ * bug #157 Fix for extending access and refresh tokens
+ * bug #154 ResponseInterface: getParameter method is used in the library but not defined in the interface
+ * bug #148 Add more detail to examples in Readme.md
diff --git a/vendor/bshaffer/oauth2-server-php/LICENSE b/vendor/bshaffer/oauth2-server-php/LICENSE
new file mode 100644
index 000000000..d7ece8467
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2014 Brent Shaffer
+
+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.
diff --git a/vendor/bshaffer/oauth2-server-php/README.md b/vendor/bshaffer/oauth2-server-php/README.md
new file mode 100644
index 000000000..4ceda6cf9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/README.md
@@ -0,0 +1,8 @@
+oauth2-server-php
+=================
+
+[![Build Status](https://travis-ci.org/bshaffer/oauth2-server-php.svg?branch=develop)](https://travis-ci.org/bshaffer/oauth2-server-php)
+
+[![Total Downloads](https://poser.pugx.org/bshaffer/oauth2-server-php/downloads.png)](https://packagist.org/packages/bshaffer/oauth2-server-php)
+
+View the [complete documentation](http://bshaffer.github.io/oauth2-server-php-docs/) \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/composer.json b/vendor/bshaffer/oauth2-server-php/composer.json
new file mode 100644
index 000000000..561699f5e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "bshaffer/oauth2-server-php",
+ "description":"OAuth2 Server for PHP",
+ "keywords":["oauth","oauth2","auth"],
+ "type":"library",
+ "license":"MIT",
+ "authors":[
+ {
+ "name":"Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage":"http://brentertainment.com"
+ }
+ ],
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "autoload": {
+ "psr-0": { "OAuth2": "src/" }
+ },
+ "require":{
+ "php":">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master",
+ "mongodb/mongodb": "^1.1"
+ },
+ "suggest": {
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage",
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage"
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php
new file mode 100644
index 000000000..ecfb6ba75
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Autoloads OAuth2 classes
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ * @license MIT License
+ */
+class Autoloader
+{
+ private $dir;
+
+ public function __construct($dir = null)
+ {
+ if (is_null($dir)) {
+ $dir = dirname(__FILE__).'/..';
+ }
+ $this->dir = $dir;
+ }
+ /**
+ * Registers OAuth2\Autoloader as an SPL autoloader.
+ */
+ public static function register($dir = null)
+ {
+ ini_set('unserialize_callback_func', 'spl_autoload_call');
+ spl_autoload_register(array(new self($dir), 'autoload'));
+ }
+
+ /**
+ * Handles autoloading of classes.
+ *
+ * @param string $class A class name.
+ *
+ * @return boolean Returns true if the class has been loaded
+ */
+ public function autoload($class)
+ {
+ if (0 !== strpos($class, 'OAuth2')) {
+ return;
+ }
+
+ if (file_exists($file = $this->dir.'/'.str_replace('\\', '/', $class).'.php')) {
+ require $file;
+ }
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
new file mode 100644
index 000000000..29c7171b5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Client Assertion Types
+ */
+interface ClientAssertionTypeInterface
+{
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php
new file mode 100644
index 000000000..0ecb7e18d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace OAuth2\ClientAssertionType;
+
+use OAuth2\Storage\ClientCredentialsInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Validate a client via Http Basic authentication
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class HttpBasic implements ClientAssertionTypeInterface
+{
+ private $clientData;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\ClientCredentialsInterface $clientStorage REQUIRED Storage class for retrieving client credentials information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_credentials_in_request_body' => true, // whether to look for credentials in the POST body in addition to the Authorize HTTP Header
+ * 'allow_public_clients' => true // if true, "public clients" (clients without a secret) may be authenticated
+ * );
+ * </code>
+ */
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ ), $config);
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$clientData = $this->getClientCredentials($request, $response)) {
+ return false;
+ }
+
+ if (!isset($clientData['client_id'])) {
+ throw new \LogicException('the clientData array must have "client_id" set');
+ }
+
+ if (!isset($clientData['client_secret']) || $clientData['client_secret'] == '') {
+ if (!$this->config['allow_public_clients']) {
+ $response->setError(400, 'invalid_client', 'client credentials are required');
+
+ return false;
+ }
+
+ if (!$this->storage->isPublicClient($clientData['client_id'])) {
+ $response->setError(400, 'invalid_client', 'This client is invalid or must authenticate using a client secret');
+
+ return false;
+ }
+ } elseif ($this->storage->checkClientCredentials($clientData['client_id'], $clientData['client_secret']) === false) {
+ $response->setError(400, 'invalid_client', 'The client credentials are invalid');
+
+ return false;
+ }
+
+ $this->clientData = $clientData;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->clientData['client_id'];
+ }
+
+ /**
+ * Internal function used to get the client credentials from HTTP basic
+ * auth or POST data.
+ *
+ * According to the spec (draft 20), the client_id can be provided in
+ * the Basic Authorization header (recommended) or via GET/POST.
+ *
+ * @return
+ * A list containing the client identifier and password, for example
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED the client id
+ * "client_secret" => CLIENT_SECRET, // OPTIONAL the client secret (may be omitted for public clients)
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function getClientCredentials(RequestInterface $request, ResponseInterface $response = null)
+ {
+ if (!is_null($request->headers('PHP_AUTH_USER')) && !is_null($request->headers('PHP_AUTH_PW'))) {
+ return array('client_id' => $request->headers('PHP_AUTH_USER'), 'client_secret' => $request->headers('PHP_AUTH_PW'));
+ }
+
+ if ($this->config['allow_credentials_in_request_body']) {
+ // Using POST for HttpBasic authorization is not recommended, but is supported by specification
+ if (!is_null($request->request('client_id'))) {
+ /**
+ * client_secret can be null if the client's password is an empty string
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
+ */
+
+ return array('client_id' => $request->request('client_id'), 'client_secret' => $request->request('client_secret'));
+ }
+ }
+
+ if ($response) {
+ $message = $this->config['allow_credentials_in_request_body'] ? ' or body' : '';
+ $response->setError(400, 'invalid_client', 'Client credentials were not found in the headers'.$message);
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php
new file mode 100644
index 000000000..ea7f54a87
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php
@@ -0,0 +1,393 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\ClientInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController implements AuthorizeControllerInterface
+{
+ private $scope;
+ private $state;
+ private $client_id;
+ private $redirect_uri;
+ private $response_type;
+
+ protected $clientStorage;
+ protected $responseTypes;
+ protected $config;
+ protected $scopeUtil;
+
+ /**
+ * @param OAuth2\Storage\ClientInterface $clientStorage REQUIRED Instance of OAuth2\Storage\ClientInterface to retrieve client information
+ * @param array $responseTypes OPTIONAL Array of OAuth2\ResponseType\ResponseTypeInterface objects. Valid array
+ * keys are "code" and "token"
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'allow_implicit' => false, // if the controller should allow the "implicit" grant type
+ * 'enforce_state' => true // if the controller should require the "state" parameter
+ * 'require_exact_redirect_uri' => true, // if the controller should require an exact match on the "redirect_uri" parameter
+ * 'redirect_status_code' => 302, // HTTP status code to use for redirect responses
+ * );
+ * </code>
+ * @param OAuth2\ScopeInterface $scopeUtil OPTIONAL Instance of OAuth2\ScopeInterface to validate the requested scope
+ */
+ public function __construct(ClientInterface $clientStorage, array $responseTypes = array(), array $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->clientStorage = $clientStorage;
+ $this->responseTypes = $responseTypes;
+ $this->config = array_merge(array(
+ 'allow_implicit' => false,
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'redirect_status_code' => 302,
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ if (!is_bool($is_authorized)) {
+ throw new \InvalidArgumentException('Argument "is_authorized" must be a boolean. This method must know if the user has granted access to the client.');
+ }
+
+ // We repeat this, because we need to re-validate. The request could be POSTed
+ // by a 3rd-party (because we are not internally enforcing NONCEs, etc)
+ if (!$this->validateAuthorizeRequest($request, $response)) {
+ return;
+ }
+
+ // If no redirect_uri is passed in the request, use client's registered one
+ if (empty($this->redirect_uri)) {
+ $clientData = $this->clientStorage->getClientDetails($this->client_id);
+ $registered_redirect_uri = $clientData['redirect_uri'];
+ }
+
+ // the user declined access to the client's application
+ if ($is_authorized === false) {
+ $redirect_uri = $this->redirect_uri ?: $registered_redirect_uri;
+ $this->setNotAuthorizedResponse($request, $response, $redirect_uri, $user_id);
+
+ return;
+ }
+
+ // build the parameters to set in the redirect URI
+ if (!$params = $this->buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ $authResult = $this->responseTypes[$this->response_type]->getAuthorizeResponse($params, $user_id);
+
+ list($redirect_uri, $uri_params) = $authResult;
+
+ if (empty($redirect_uri) && !empty($registered_redirect_uri)) {
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ $uri = $this->buildUri($redirect_uri, $uri_params);
+
+ // return redirect response
+ $response->setRedirect($this->config['redirect_status_code'], $uri);
+ }
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $error = 'access_denied';
+ $error_message = 'The user denied access to your application';
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->state, $error, $error_message);
+ }
+
+ /*
+ * We have made this protected so this class can be extended to add/modify
+ * these parameters
+ */
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ // @TODO: we should be explicit with this in the future
+ $params = array(
+ 'scope' => $this->scope,
+ 'state' => $this->state,
+ 'client_id' => $this->client_id,
+ 'redirect_uri' => $this->redirect_uri,
+ 'response_type' => $this->response_type,
+ );
+
+ return $params;
+ }
+
+ /**
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool
+ */
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ // Make sure a valid client id was supplied (we can not redirect because we were unable to verify the URI)
+ if (!$client_id = $request->query('client_id', $request->request('client_id'))) {
+ // We don't have a good URI to use
+ $response->setError(400, 'invalid_client', "No client id supplied");
+
+ return false;
+ }
+
+ // Get client details
+ if (!$clientData = $this->clientStorage->getClientDetails($client_id)) {
+ $response->setError(400, 'invalid_client', 'The client id supplied is invalid');
+
+ return false;
+ }
+
+ $registered_redirect_uri = isset($clientData['redirect_uri']) ? $clientData['redirect_uri'] : '';
+
+ // Make sure a valid redirect_uri was supplied. If specified, it must match the clientData URI.
+ // @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ // @see http://tools.ietf.org/html/rfc6749#section-4.1.2.1
+ // @see http://tools.ietf.org/html/rfc6749#section-4.2.2.1
+ if ($supplied_redirect_uri = $request->query('redirect_uri', $request->request('redirect_uri'))) {
+ // validate there is no fragment supplied
+ $parts = parse_url($supplied_redirect_uri);
+ if (isset($parts['fragment']) && $parts['fragment']) {
+ $response->setError(400, 'invalid_uri', 'The redirect URI must not contain a fragment');
+
+ return false;
+ }
+
+ // validate against the registered redirect uri(s) if available
+ if ($registered_redirect_uri && !$this->validateRedirectUri($supplied_redirect_uri, $registered_redirect_uri)) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI provided is missing or does not match', '#section-3.1.2');
+
+ return false;
+ }
+ $redirect_uri = $supplied_redirect_uri;
+ } else {
+ // use the registered redirect_uri if none has been supplied, if possible
+ if (!$registered_redirect_uri) {
+ $response->setError(400, 'invalid_uri', 'No redirect URI was supplied or stored');
+
+ return false;
+ }
+
+ if (count(explode(' ', $registered_redirect_uri)) > 1) {
+ $response->setError(400, 'invalid_uri', 'A redirect URI must be supplied when multiple redirect URIs are registered', '#section-3.1.2.3');
+
+ return false;
+ }
+ $redirect_uri = $registered_redirect_uri;
+ }
+
+ // Select the redirect URI
+ $response_type = $request->query('response_type', $request->request('response_type'));
+
+ // for multiple-valued response types - make them alphabetical
+ if (false !== strpos($response_type, ' ')) {
+ $types = explode(' ', $response_type);
+ sort($types);
+ $response_type = ltrim(implode(' ', $types));
+ }
+
+ $state = $request->query('state', $request->request('state'));
+
+ // type and client_id are required
+ if (!$response_type || !in_array($response_type, $this->getValidResponseTypes())) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_request', 'Invalid or missing response type', null);
+
+ return false;
+ }
+
+ if ($response_type == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ if (!isset($this->responseTypes['code'])) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'authorization code grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'authorization_code')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ if ($this->responseTypes['code']->enforceRedirect() && !$redirect_uri) {
+ $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI is mandatory and was not supplied');
+
+ return false;
+ }
+ } else {
+ if (!$this->config['allow_implicit']) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'implicit grant type not supported', null);
+
+ return false;
+ }
+ if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'implicit')) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
+
+ return false;
+ }
+ }
+
+ // validate requested scope if it exists
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+
+ if ($requestedScope) {
+ // restrict scope by client specific scope if applicable,
+ // otherwise verify the scope exists
+ $clientScope = $this->clientStorage->getClientScope($client_id);
+ if ((empty($clientScope) && !$this->scopeUtil->scopeExists($requestedScope))
+ || (!empty($clientScope) && !$this->scopeUtil->checkScope($requestedScope, $clientScope))) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_scope', 'An unsupported scope was requested', null);
+
+ return false;
+ }
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($client_id);
+
+ if (false === $defaultScope) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_client', 'This application requires you specify a scope parameter', null);
+
+ return false;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ // Validate state parameter exists (if configured to enforce this)
+ if ($this->config['enforce_state'] && !$state) {
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, null, 'invalid_request', 'The state parameter is required');
+
+ return false;
+ }
+
+ // save the input data and return true
+ $this->scope = $requestedScope;
+ $this->state = $state;
+ $this->client_id = $client_id;
+ // Only save the SUPPLIED redirect URI (@see http://tools.ietf.org/html/rfc6749#section-4.1.3)
+ $this->redirect_uri = $supplied_redirect_uri;
+ $this->response_type = $response_type;
+
+ return true;
+ }
+
+ /**
+ * Build the absolute URI based on supplied URI and parameters.
+ *
+ * @param $uri An absolute URI.
+ * @param $params Parameters to be append as GET.
+ *
+ * @return
+ * An absolute URI with supplied parameters.
+ *
+ * @ingroup oauth2_section_4
+ */
+ private function buildUri($uri, $params)
+ {
+ $parse_url = parse_url($uri);
+
+ // Add our params to the parsed uri
+ foreach ($params as $k => $v) {
+ if (isset($parse_url[$k])) {
+ $parse_url[$k] .= "&" . http_build_query($v, '', '&');
+ } else {
+ $parse_url[$k] = http_build_query($v, '', '&');
+ }
+ }
+
+ // Put humpty dumpty back together
+ return
+ ((isset($parse_url["scheme"])) ? $parse_url["scheme"] . "://" : "")
+ . ((isset($parse_url["user"])) ? $parse_url["user"]
+ . ((isset($parse_url["pass"])) ? ":" . $parse_url["pass"] : "") . "@" : "")
+ . ((isset($parse_url["host"])) ? $parse_url["host"] : "")
+ . ((isset($parse_url["port"])) ? ":" . $parse_url["port"] : "")
+ . ((isset($parse_url["path"])) ? $parse_url["path"] : "")
+ . ((isset($parse_url["query"]) && !empty($parse_url['query'])) ? "?" . $parse_url["query"] : "")
+ . ((isset($parse_url["fragment"])) ? "#" . $parse_url["fragment"] : "")
+ ;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ );
+ }
+
+ /**
+ * Internal method for validating redirect URI supplied
+ *
+ * @param string $inputUri The submitted URI to be validated
+ * @param string $registeredUriString The allowed URI(s) to validate against. Can be a space-delimited string of URIs to
+ * allow for multiple URIs
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1.2
+ */
+ protected function validateRedirectUri($inputUri, $registeredUriString)
+ {
+ if (!$inputUri || !$registeredUriString) {
+ return false; // if either one is missing, assume INVALID
+ }
+
+ $registered_uris = preg_split('/\s+/', $registeredUriString);
+ foreach ($registered_uris as $registered_uri) {
+ if ($this->config['require_exact_redirect_uri']) {
+ // the input uri is validated against the registered uri using exact match
+ if (strcmp($inputUri, $registered_uri) === 0) {
+ return true;
+ }
+ } else {
+ $registered_uri_length = strlen($registered_uri);
+ if ($registered_uri_length === 0) {
+ return false;
+ }
+
+ // the input uri is validated against the registered uri using case-insensitive match of the initial string
+ // i.e. additional query parameters may be applied
+ if (strcasecmp(substr($inputUri, 0, $registered_uri_length), $registered_uri) === 0) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convenience methods to access the parameters derived from the validated request
+ */
+
+ public function getScope()
+ {
+ return $this->scope;
+ }
+
+ public function getState()
+ {
+ return $this->state;
+ }
+
+ public function getClientId()
+ {
+ return $this->client_id;
+ }
+
+ public function getRedirectUri()
+ {
+ return $this->redirect_uri;
+ }
+
+ public function getResponseType()
+ {
+ return $this->response_type;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..fa07ae8d2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a user should be authorized
+ * by an authorization server. As OAuth2 does not handle
+ * authorization directly, this controller ensures the request is valid, but
+ * requires the application to determine the value of $is_authorized
+ *
+ * ex:
+ * > $user_id = $this->somehowDetermineUserId();
+ * > $is_authorized = $this->somehowDetermineUserAuthorization();
+ * > $response = new OAuth2\Response();
+ * > $authorizeController->handleAuthorizeRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response,
+ * > $is_authorized,
+ * > $user_id);
+ * > $response->send();
+ *
+ */
+interface AuthorizeControllerInterface
+{
+ /**
+ * List of possible authentication response types.
+ * The "authorization_code" mechanism exclusively supports 'code'
+ * and the "implicit" mechanism exclusively supports 'token'.
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.1
+ */
+ const RESPONSE_TYPE_AUTHORIZATION_CODE = 'code';
+ const RESPONSE_TYPE_ACCESS_TOKEN = 'token';
+
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null);
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php
new file mode 100644
index 000000000..3cfaaaf12
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+use OAuth2\Scope;
+
+/**
+ * @see OAuth2\Controller\ResourceControllerInterface
+ */
+class ResourceController implements ResourceControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null)
+ {
+ $token = $this->getAccessTokenData($request, $response);
+
+ // Check if we have token data
+ if (is_null($token)) {
+ return false;
+ }
+
+ /**
+ * Check scope, if provided
+ * If token doesn't have a scope, it's null/empty, or it's insufficient, then throw 403
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($scope && (!isset($token["scope"]) || !$token["scope"] || !$this->scopeUtil->checkScope($scope, $token["scope"]))) {
+ $response->setError(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
+ $response->addHttpHeaders(array(
+ 'WWW-Authenticate' => sprintf('%s realm="%s", scope="%s", error="%s", error_description="%s"',
+ $this->tokenType->getTokenType(),
+ $this->config['www_realm'],
+ $scope,
+ $response->getParameter('error'),
+ $response->getParameter('error_description')
+ )
+ ));
+
+ return false;
+ }
+
+ // allow retrieval of the token
+ $this->token = $token;
+
+ return (bool) $token;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response)
+ {
+ // Get the token parameter
+ if ($token_param = $this->tokenType->getAccessTokenParameter($request, $response)) {
+ // Get the stored token data (from the implementing subclass)
+ // Check we have a well formed token
+ // Check token expiration (expires is a mandatory paramter)
+ if (!$token = $this->tokenStorage->getAccessToken($token_param)) {
+ $response->setError(401, 'invalid_token', 'The access token provided is invalid');
+ } elseif (!isset($token["expires"]) || !isset($token["client_id"])) {
+ $response->setError(401, 'malformed_token', 'Malformed token (missing "expires")');
+ } elseif (time() > $token["expires"]) {
+ $response->setError(401, 'invalid_token', 'The access token provided has expired');
+ } else {
+ return $token;
+ }
+ }
+
+ $authHeader = sprintf('%s realm="%s"', $this->tokenType->getTokenType(), $this->config['www_realm']);
+
+ if ($error = $response->getParameter('error')) {
+ $authHeader = sprintf('%s, error="%s"', $authHeader, $error);
+ if ($error_description = $response->getParameter('error_description')) {
+ $authHeader = sprintf('%s, error_description="%s"', $authHeader, $error_description);
+ }
+ }
+
+ $response->addHttpHeaders(array('WWW-Authenticate' => $authHeader));
+
+ return null;
+ }
+
+ // convenience method to allow retrieval of the token
+ public function getToken()
+ {
+ return $this->token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php
new file mode 100644
index 000000000..611421935
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a "resource" is requested.
+ * call verifyResourceRequest in order to determine if the request
+ * contains a valid token.
+ *
+ * ex:
+ * > if (!$resourceController->verifyResourceRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response())) {
+ * > $response->send(); // authorization failed
+ * > die();
+ * > }
+ * > return json_encode($resource); // valid token! Send the stuff!
+ *
+ */
+interface ResourceControllerInterface
+{
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null);
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php
new file mode 100644
index 000000000..5d2d731fe
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php
@@ -0,0 +1,295 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\ScopeInterface;
+use OAuth2\Scope;
+use OAuth2\Storage\ClientInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see \OAuth2\Controller\TokenControllerInterface
+ */
+class TokenController implements TokenControllerInterface
+{
+ /**
+ * @var AccessTokenInterface
+ */
+ protected $accessToken;
+
+ /**
+ * @var array
+ */
+ protected $grantTypes;
+
+ /**
+ * @var ClientAssertionTypeInterface
+ */
+ protected $clientAssertionType;
+
+ /**
+ * @var Scope|ScopeInterface
+ */
+ protected $scopeUtil;
+
+ /**
+ * @var ClientInterface
+ */
+ protected $clientStorage;
+
+ public function __construct(AccessTokenInterface $accessToken, ClientInterface $clientStorage, array $grantTypes = array(), ClientAssertionTypeInterface $clientAssertionType = null, ScopeInterface $scopeUtil = null)
+ {
+ if (is_null($clientAssertionType)) {
+ foreach ($grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ throw new \InvalidArgumentException('You must supply an instance of OAuth2\ClientAssertionType\ClientAssertionTypeInterface or only use grant types which implement OAuth2\ClientAssertionType\ClientAssertionTypeInterface');
+ }
+ }
+ }
+ $this->clientAssertionType = $clientAssertionType;
+ $this->accessToken = $accessToken;
+ $this->clientStorage = $clientStorage;
+ foreach ($grantTypes as $grantType) {
+ $this->addGrantType($grantType);
+ }
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($token = $this->grantAccessToken($request, $response)) {
+ // @see http://tools.ietf.org/html/rfc6749#section-5.1
+ // server MUST disable caching in headers when tokens are involved
+ $response->setStatusCode(200);
+ $response->addParameters($token);
+ $response->addHttpHeaders(array(
+ 'Cache-Control' => 'no-store',
+ 'Pragma' => 'no-cache',
+ 'Content-Type' => 'application/json'
+ ));
+ }
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * You can call your endpoint whatever you want.
+ *
+ * @param RequestInterface $request Request object to grant access token
+ * @param ResponseInterface $response
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when requesting an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ /**
+ * Determine grant type from request
+ * and validate the request for that grant type
+ */
+ if (!$grantTypeIdentifier = $request->request('grant_type')) {
+ $response->setError(400, 'invalid_request', 'The grant type was not specified in the request');
+
+ return null;
+ }
+
+ if (!isset($this->grantTypes[$grantTypeIdentifier])) {
+ /* TODO: If this is an OAuth2 supported grant type that we have chosen not to implement, throw a 501 Not Implemented instead */
+ $response->setError(400, 'unsupported_grant_type', sprintf('Grant type "%s" not supported', $grantTypeIdentifier));
+
+ return null;
+ }
+
+ $grantType = $this->grantTypes[$grantTypeIdentifier];
+
+ /**
+ * Retrieve the client information from the request
+ * ClientAssertionTypes allow for grant types which also assert the client data
+ * in which case ClientAssertion is handled in the validateRequest method
+ *
+ * @see OAuth2\GrantType\JWTBearer
+ * @see OAuth2\GrantType\ClientCredentials
+ */
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!$this->clientAssertionType->validateRequest($request, $response)) {
+ return null;
+ }
+ $clientId = $this->clientAssertionType->getClientId();
+ }
+
+ /**
+ * Retrieve the grant type information from the request
+ * The GrantTypeInterface object handles all validation
+ * If the object is an instance of ClientAssertionTypeInterface,
+ * That logic is handled here as well
+ */
+ if (!$grantType->validateRequest($request, $response)) {
+ return null;
+ }
+
+ if ($grantType instanceof ClientAssertionTypeInterface) {
+ $clientId = $grantType->getClientId();
+ } else {
+ // validate the Client ID (if applicable)
+ if (!is_null($storedClientId = $grantType->getClientId()) && $storedClientId != $clientId) {
+ $response->setError(400, 'invalid_grant', sprintf('%s doesn\'t exist or is invalid for the client', $grantTypeIdentifier));
+
+ return null;
+ }
+ }
+
+ /**
+ * Validate the client can use the requested grant type
+ */
+ if (!$this->clientStorage->checkRestrictedGrantType($clientId, $grantTypeIdentifier)) {
+ $response->setError(400, 'unauthorized_client', 'The grant type is unauthorized for this client_id');
+
+ return false;
+ }
+
+ /**
+ * Validate the scope of the token
+ *
+ * requestedScope - the scope specified in the token request
+ * availableScope - the scope associated with the grant type
+ * ex: in the case of the "Authorization Code" grant type,
+ * the scope is specified in the authorize request
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.3
+ */
+
+ $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
+ $availableScope = $grantType->getScope();
+
+ if ($requestedScope) {
+ // validate the requested scope
+ if ($availableScope) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $availableScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this request');
+
+ return null;
+ }
+ } else {
+ // validate the client has access to this scope
+ if ($clientScope = $this->clientStorage->getClientScope($clientId)) {
+ if (!$this->scopeUtil->checkScope($requestedScope, $clientScope)) {
+ $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this client');
+
+ return false;
+ }
+ } elseif (!$this->scopeUtil->scopeExists($requestedScope)) {
+ $response->setError(400, 'invalid_scope', 'An unsupported scope was requested');
+
+ return null;
+ }
+ }
+ } elseif ($availableScope) {
+ // use the scope associated with this grant type
+ $requestedScope = $availableScope;
+ } else {
+ // use a globally-defined default scope
+ $defaultScope = $this->scopeUtil->getDefaultScope($clientId);
+
+ // "false" means default scopes are not allowed
+ if (false === $defaultScope) {
+ $response->setError(400, 'invalid_scope', 'This application requires you specify a scope parameter');
+
+ return null;
+ }
+
+ $requestedScope = $defaultScope;
+ }
+
+ return $grantType->createAccessToken($this->accessToken, $clientId, $grantType->getUserId(), $requestedScope);
+ }
+
+ /**
+ * addGrantType
+ *
+ * @param GrantTypeInterface $grantType the grant type to add for the specified identifier
+ * @param string $identifier a string passed in as "grant_type" in the response that will call this grantType
+ */
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (is_null($identifier) || is_numeric($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+ }
+
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if ($this->revokeToken($request, $response)) {
+ $response->setStatusCode(200);
+ $response->addParameters(array('revoked' => true));
+ }
+ }
+
+ /**
+ * Revoke a refresh or access token. Returns true on success and when tokens are invalid
+ *
+ * Note: invalid tokens do not cause an error response since the client
+ * cannot handle such an error in a reasonable way. Moreover, the
+ * purpose of the revocation request, invalidating the particular token,
+ * is already achieved.
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return bool|null
+ */
+ public function revokeToken(RequestInterface $request, ResponseInterface $response)
+ {
+ if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
+ $response->setError(405, 'invalid_request', 'The request method must be POST when revoking an access token', '#section-3.2');
+ $response->addHttpHeaders(array('Allow' => 'POST'));
+
+ return null;
+ }
+
+ $token_type_hint = $request->request('token_type_hint');
+ if (!in_array($token_type_hint, array(null, 'access_token', 'refresh_token'), true)) {
+ $response->setError(400, 'invalid_request', 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+
+ return null;
+ }
+
+ $token = $request->request('token');
+ if ($token === null) {
+ $response->setError(400, 'invalid_request', 'Missing token parameter to revoke');
+
+ return null;
+ }
+
+ // @todo remove this check for v2.0
+ if (!method_exists($this->accessToken, 'revokeToken')) {
+ $class = get_class($this->accessToken);
+ throw new \RuntimeException("AccessToken {$class} does not implement required revokeToken method");
+ }
+
+ $this->accessToken->revokeToken($token, $token_type_hint);
+
+ return true;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php
new file mode 100644
index 000000000..72d72570f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when a token is being requested.
+ * it is called to handle all grant types the application supports.
+ * It also validates the client's credentials
+ *
+ * ex:
+ * > $tokenController->handleTokenRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response());
+ * > $response->send();
+ *
+ */
+interface TokenControllerInterface
+{
+ /**
+ * handleTokenRequest
+ *
+ * @param $request
+ * OAuth2\RequestInterface - The current http request
+ * @param $response
+ * OAuth2\ResponseInterface - An instance of OAuth2\ResponseInterface to contain the response data
+ *
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response);
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php
new file mode 100644
index 000000000..2d336c664
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+interface EncryptionInterface
+{
+ public function encode($payload, $key, $algorithm = null);
+ public function decode($payload, $key, $algorithm = null);
+ public function urlSafeB64Encode($data);
+ public function urlSafeB64Decode($b64);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php
new file mode 100644
index 000000000..1b527e0a0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * Bridge file to use the firebase/php-jwt package for JWT encoding and decoding.
+ * @author Francis Chuang <francis.chuang@gmail.com>
+ */
+class FirebaseJwt implements EncryptionInterface
+{
+ public function __construct()
+ {
+ if (!class_exists('\JWT')) {
+ throw new \ErrorException('firebase/php-jwt must be installed to use this feature. You can do this by running "composer require firebase/php-jwt"');
+ }
+ }
+
+ public function encode($payload, $key, $alg = 'HS256', $keyId = null)
+ {
+ return \JWT::encode($payload, $key, $alg, $keyId);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = null)
+ {
+ try {
+
+ //Maintain BC: Do not verify if no algorithms are passed in.
+ if (!$allowedAlgorithms) {
+ $key = null;
+ }
+
+ return (array)\JWT::decode($jwt, $key, $allowedAlgorithms);
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ return \JWT::urlsafeB64Encode($data);
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ return \JWT::urlsafeB64Decode($b64);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php
new file mode 100644
index 000000000..ee576e643
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+/**
+ * @link https://github.com/F21/jwt
+ * @author F21
+ */
+class Jwt implements EncryptionInterface
+{
+ public function encode($payload, $key, $algo = 'HS256')
+ {
+ $header = $this->generateJwtHeader($payload, $algo);
+
+ $segments = array(
+ $this->urlSafeB64Encode(json_encode($header)),
+ $this->urlSafeB64Encode(json_encode($payload))
+ );
+
+ $signing_input = implode('.', $segments);
+
+ $signature = $this->sign($signing_input, $key, $algo);
+ $segments[] = $this->urlsafeB64Encode($signature);
+
+ return implode('.', $segments);
+ }
+
+ public function decode($jwt, $key = null, $allowedAlgorithms = true)
+ {
+ if (!strpos($jwt, '.')) {
+ return false;
+ }
+
+ $tks = explode('.', $jwt);
+
+ if (count($tks) != 3) {
+ return false;
+ }
+
+ list($headb64, $payloadb64, $cryptob64) = $tks;
+
+ if (null === ($header = json_decode($this->urlSafeB64Decode($headb64), true))) {
+ return false;
+ }
+
+ if (null === $payload = json_decode($this->urlSafeB64Decode($payloadb64), true)) {
+ return false;
+ }
+
+ $sig = $this->urlSafeB64Decode($cryptob64);
+
+ if ((bool) $allowedAlgorithms) {
+ if (!isset($header['alg'])) {
+ return false;
+ }
+
+ // check if bool arg supplied here to maintain BC
+ if (is_array($allowedAlgorithms) && !in_array($header['alg'], $allowedAlgorithms)) {
+ return false;
+ }
+
+ if (!$this->verifySignature($sig, "$headb64.$payloadb64", $key, $header['alg'])) {
+ return false;
+ }
+ }
+
+ return $payload;
+ }
+
+ private function verifySignature($signature, $input, $key, $algo = 'HS256')
+ {
+ // use constants when possible, for HipHop support
+ switch ($algo) {
+ case'HS256':
+ case'HS384':
+ case'HS512':
+ return $this->hash_equals(
+ $this->sign($input, $key, $algo),
+ $signature
+ );
+
+ case 'RS256':
+ return openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256') === 1;
+
+ case 'RS384':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384') === 1;
+
+ case 'RS512':
+ return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512') === 1;
+
+ default:
+ throw new \InvalidArgumentException("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function sign($input, $key, $algo = 'HS256')
+ {
+ switch ($algo) {
+ case 'HS256':
+ return hash_hmac('sha256', $input, $key, true);
+
+ case 'HS384':
+ return hash_hmac('sha384', $input, $key, true);
+
+ case 'HS512':
+ return hash_hmac('sha512', $input, $key, true);
+
+ case 'RS256':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256');
+
+ case 'RS384':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384');
+
+ case 'RS512':
+ return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512');
+
+ default:
+ throw new \Exception("Unsupported or invalid signing algorithm.");
+ }
+ }
+
+ private function generateRSASignature($input, $key, $algo)
+ {
+ if (!openssl_sign($input, $signature, $key, $algo)) {
+ throw new \Exception("Unable to sign data.");
+ }
+
+ return $signature;
+ }
+
+ public function urlSafeB64Encode($data)
+ {
+ $b64 = base64_encode($data);
+ $b64 = str_replace(array('+', '/', "\r", "\n", '='),
+ array('-', '_'),
+ $b64);
+
+ return $b64;
+ }
+
+ public function urlSafeB64Decode($b64)
+ {
+ $b64 = str_replace(array('-', '_'),
+ array('+', '/'),
+ $b64);
+
+ return base64_decode($b64);
+ }
+
+ /**
+ * Override to create a custom header
+ */
+ protected function generateJwtHeader($payload, $algorithm)
+ {
+ return array(
+ 'typ' => 'JWT',
+ 'alg' => $algorithm,
+ );
+ }
+
+ protected function hash_equals($a, $b)
+ {
+ if (function_exists('hash_equals')) {
+ return hash_equals($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/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..cae9f787d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\AuthorizationCodeInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements GrantTypeInterface
+{
+ protected $storage;
+ protected $authCode;
+
+ /**
+ * @param \OAuth2\Storage\AuthorizationCodeInterface $storage REQUIRED Storage class for retrieving authorization code information
+ */
+ public function __construct(AuthorizationCodeInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'authorization_code';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request('code')) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "code" is required');
+
+ return false;
+ }
+
+ $code = $request->request('code');
+ if (!$authCode = $this->storage->getAuthorizationCode($code)) {
+ $response->setError(400, 'invalid_grant', 'Authorization code doesn\'t exist or is invalid for the client');
+
+ return false;
+ }
+
+ /*
+ * 4.1.3 - ensure that the "redirect_uri" parameter is present if the "redirect_uri" parameter was included in the initial authorization request
+ * @uri - http://tools.ietf.org/html/rfc6749#section-4.1.3
+ */
+ if (isset($authCode['redirect_uri']) && $authCode['redirect_uri']) {
+ if (!$request->request('redirect_uri') || urldecode($request->request('redirect_uri')) != urldecode($authCode['redirect_uri'])) {
+ $response->setError(400, 'redirect_uri_mismatch', "The redirect URI is missing or do not match", "#section-4.1.3");
+
+ return false;
+ }
+ }
+
+ if (!isset($authCode['expires'])) {
+ throw new \Exception('Storage must return authcode with a value for "expires"');
+ }
+
+ if ($authCode["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', "The authorization code has expired");
+
+ return false;
+ }
+
+ if (!isset($authCode['code'])) {
+ $authCode['code'] = $code; // used to expire the code after the access token is granted
+ }
+
+ $this->authCode = $authCode;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->authCode['client_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->authCode['scope']) ? $this->authCode['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ return isset($this->authCode['user_id']) ? $this->authCode['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope);
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php
new file mode 100644
index 000000000..f953e4e8d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\Storage\ClientCredentialsInterface;
+
+/**
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ *
+ * @see OAuth2\ClientAssertionType_HttpBasic
+ */
+class ClientCredentials extends HttpBasic implements GrantTypeInterface
+{
+ private $clientData;
+
+ public function __construct(ClientCredentialsInterface $storage, array $config = array())
+ {
+ /**
+ * The client credentials grant type MUST only be used by confidential clients
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4
+ */
+ $config['allow_public_clients'] = false;
+
+ parent::__construct($storage, $config);
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'client_credentials';
+ }
+
+ public function getScope()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['scope']) ? $this->clientData['scope'] : null;
+ }
+
+ public function getUserId()
+ {
+ $this->loadClientData();
+
+ return isset($this->clientData['user_id']) ? $this->clientData['user_id'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /**
+ * Client Credentials Grant does NOT include a refresh token
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.4.3
+ */
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+
+ private function loadClientData()
+ {
+ if (!$this->clientData) {
+ $this->clientData = $this->storage->getClientDetails($this->getClientId());
+ }
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php
new file mode 100644
index 000000000..98489e9c1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * Interface for all OAuth2 Grant Types
+ */
+interface GrantTypeInterface
+{
+ public function getQuerystringIdentifier();
+ public function validateRequest(RequestInterface $request, ResponseInterface $response);
+ public function getClientId();
+ public function getUserId();
+ public function getScope();
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php
new file mode 100644
index 000000000..bb11a6954
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php
@@ -0,0 +1,226 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\Storage\JwtBearerInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * The JWT bearer authorization grant implements JWT (JSON Web Tokens) as a grant type per the IETF draft.
+ *
+ * @see http://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-04#section-4
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtBearer implements GrantTypeInterface, ClientAssertionTypeInterface
+{
+ private $jwt;
+
+ protected $storage;
+ protected $audience;
+ protected $jwtUtil;
+ protected $allowedAlgorithms;
+
+ /**
+ * Creates an instance of the JWT bearer grant type.
+ *
+ * @param OAuth2\Storage\JWTBearerInterface|JwtBearerInterface $storage A valid storage interface that implements storage hooks for the JWT bearer grant type.
+ * @param string $audience The audience to validate the token against. This is usually the full URI of the OAuth token requests endpoint.
+ * @param EncryptionInterface|OAuth2\Encryption\JWT $jwtUtil OPTONAL The class used to decode, encode and verify JWTs.
+ * @param array $config
+ */
+ public function __construct(JwtBearerInterface $storage, $audience, EncryptionInterface $jwtUtil = null, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->audience = $audience;
+
+ if (is_null($jwtUtil)) {
+ $jwtUtil = new Jwt();
+ }
+
+ $this->config = array_merge(array(
+ 'allowed_algorithms' => array('RS256', 'RS384', 'RS512')
+ ), $config);
+
+ $this->jwtUtil = $jwtUtil;
+
+ $this->allowedAlgorithms = $this->config['allowed_algorithms'];
+ }
+
+ /**
+ * Returns the grant_type get parameter to identify the grant type request as JWT bearer authorization grant.
+ *
+ * @return
+ * The string identifier for grant_type.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getQuerystringIdentifier()
+ */
+ public function getQuerystringIdentifier()
+ {
+ return 'urn:ietf:params:oauth:grant-type:jwt-bearer';
+ }
+
+ /**
+ * Validates the data from the decoded JWT.
+ *
+ * @return
+ * TRUE if the JWT request is valid and can be decoded. Otherwise, FALSE is returned.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::getTokenData()
+ */
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("assertion")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "assertion" required');
+
+ return null;
+ }
+
+ // Store the undecoded JWT for later use
+ $undecodedJWT = $request->request('assertion');
+
+ // Decode the JWT
+ $jwt = $this->jwtUtil->decode($request->request('assertion'), null, false);
+
+ if (!$jwt) {
+ $response->setError(400, 'invalid_request', "JWT is malformed");
+
+ return null;
+ }
+
+ // ensure these properties contain a value
+ // @todo: throw malformed error for missing properties
+ $jwt = array_merge(array(
+ 'scope' => null,
+ 'iss' => null,
+ 'sub' => null,
+ 'aud' => null,
+ 'exp' => null,
+ 'nbf' => null,
+ 'iat' => null,
+ 'jti' => null,
+ 'typ' => null,
+ ), $jwt);
+
+ if (!isset($jwt['iss'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid subject (sub) provided");
+
+ return null;
+ }
+
+ if (!isset($jwt['exp'])) {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be present");
+
+ return null;
+ }
+
+ // Check expiration
+ if (ctype_digit($jwt['exp'])) {
+ if ($jwt['exp'] <= time()) {
+ $response->setError(400, 'invalid_grant', "JWT has expired");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Expiration (exp) time must be a unix time stamp");
+
+ return null;
+ }
+
+ // Check the not before time
+ if ($notBefore = $jwt['nbf']) {
+ if (ctype_digit($notBefore)) {
+ if ($notBefore > time()) {
+ $response->setError(400, 'invalid_grant', "JWT cannot be used before the Not Before (nbf) time");
+
+ return null;
+ }
+ } else {
+ $response->setError(400, 'invalid_grant', "Not Before (nbf) time must be a unix time stamp");
+
+ return null;
+ }
+ }
+
+ // Check the audience if required to match
+ if (!isset($jwt['aud']) || ($jwt['aud'] != $this->audience)) {
+ $response->setError(400, 'invalid_grant', "Invalid audience (aud)");
+
+ return null;
+ }
+
+ // Check the jti (nonce)
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-13#section-4.1.7
+ if (isset($jwt['jti'])) {
+ $jti = $this->storage->getJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+
+ //Reject if jti is used and jwt is still valid (exp parameter has not expired).
+ if ($jti && $jti['expires'] > time()) {
+ $response->setError(400, 'invalid_grant', "JSON Token Identifier (jti) has already been used");
+
+ return null;
+ } else {
+ $this->storage->setJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
+ }
+ }
+
+ // Get the iss's public key
+ // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06#section-4.1.1
+ if (!$key = $this->storage->getClientKey($jwt['iss'], $jwt['sub'])) {
+ $response->setError(400, 'invalid_grant', "Invalid issuer (iss) or subject (sub) provided");
+
+ return null;
+ }
+
+ // Verify the JWT
+ if (!$this->jwtUtil->decode($undecodedJWT, $key, $this->allowedAlgorithms)) {
+ $response->setError(400, 'invalid_grant', "JWT failed signature verification");
+
+ return null;
+ }
+
+ $this->jwt = $jwt;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->jwt['iss'];
+ }
+
+ public function getUserId()
+ {
+ return $this->jwt['sub'];
+ }
+
+ public function getScope()
+ {
+ return null;
+ }
+
+ /**
+ * Creates an access token that is NOT associated with a refresh token.
+ * If a subject (sub) the name of the user/account we are accessing data on behalf of.
+ *
+ * @see OAuth2\GrantType\GrantTypeInterface::createAccessToken()
+ */
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = false;
+
+ return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php
new file mode 100644
index 000000000..e55385222
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class RefreshToken implements GrantTypeInterface
+{
+ private $refreshToken;
+
+ protected $storage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\RefreshTokenInterface $storage REQUIRED Storage class for retrieving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'always_issue_new_refresh_token' => true, // whether to issue a new refresh token upon successful token request
+ * 'unset_refresh_token_after_use' => true // whether to unset the refresh token after after using
+ * );
+ * </code>
+ */
+ public function __construct(RefreshTokenInterface $storage, $config = array())
+ {
+ $this->config = array_merge(array(
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true
+ ), $config);
+
+ // to preserve B.C. with v1.6
+ // @see https://github.com/bshaffer/oauth2-server-php/pull/580
+ // @todo - remove in v2.0
+ if (isset($config['always_issue_new_refresh_token']) && !isset($config['unset_refresh_token_after_use'])) {
+ $this->config['unset_refresh_token_after_use'] = $config['always_issue_new_refresh_token'];
+ }
+
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'refresh_token';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("refresh_token")) {
+ $response->setError(400, 'invalid_request', 'Missing parameter: "refresh_token" is required');
+
+ return null;
+ }
+
+ if (!$refreshToken = $this->storage->getRefreshToken($request->request("refresh_token"))) {
+ $response->setError(400, 'invalid_grant', 'Invalid refresh token');
+
+ return null;
+ }
+
+ if ($refreshToken['expires'] > 0 && $refreshToken["expires"] < time()) {
+ $response->setError(400, 'invalid_grant', 'Refresh token has expired');
+
+ return null;
+ }
+
+ // store the refresh token locally so we can delete it when a new refresh token is generated
+ $this->refreshToken = $refreshToken;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return $this->refreshToken['client_id'];
+ }
+
+ public function getUserId()
+ {
+ return isset($this->refreshToken['user_id']) ? $this->refreshToken['user_id'] : null;
+ }
+
+ public function getScope()
+ {
+ return isset($this->refreshToken['scope']) ? $this->refreshToken['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ /*
+ * It is optional to force a new refresh token when a refresh token is used.
+ * However, if a new refresh token is issued, the old one MUST be expired
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ */
+ $issueNewRefreshToken = $this->config['always_issue_new_refresh_token'];
+ $unsetRefreshToken = $this->config['unset_refresh_token_after_use'];
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $issueNewRefreshToken);
+
+ if ($unsetRefreshToken) {
+ $this->storage->unsetRefreshToken($this->refreshToken['refresh_token']);
+ }
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php
new file mode 100644
index 000000000..f165538ba
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\UserCredentialsInterface;
+use OAuth2\ResponseType\AccessTokenInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class UserCredentials implements GrantTypeInterface
+{
+ private $userInfo;
+
+ protected $storage;
+
+ /**
+ * @param OAuth2\Storage\UserCredentialsInterface $storage REQUIRED Storage class for retrieving user credentials information
+ */
+ public function __construct(UserCredentialsInterface $storage)
+ {
+ $this->storage = $storage;
+ }
+
+ public function getQuerystringIdentifier()
+ {
+ return 'password';
+ }
+
+ public function validateRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$request->request("password") || !$request->request("username")) {
+ $response->setError(400, 'invalid_request', 'Missing parameters: "username" and "password" required');
+
+ return null;
+ }
+
+ if (!$this->storage->checkUserCredentials($request->request("username"), $request->request("password"))) {
+ $response->setError(401, 'invalid_grant', 'Invalid username and password combination');
+
+ return null;
+ }
+
+ $userInfo = $this->storage->getUserDetails($request->request("username"));
+
+ if (empty($userInfo)) {
+ $response->setError(400, 'invalid_grant', 'Unable to retrieve user information');
+
+ return null;
+ }
+
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException("you must set the user_id on the array returned by getUserDetails");
+ }
+
+ $this->userInfo = $userInfo;
+
+ return true;
+ }
+
+ public function getClientId()
+ {
+ return null;
+ }
+
+ public function getUserId()
+ {
+ return $this->userInfo['user_id'];
+ }
+
+ public function getScope()
+ {
+ return isset($this->userInfo['scope']) ? $this->userInfo['scope'] : null;
+ }
+
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ return $accessToken->createAccessToken($client_id, $user_id, $scope);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php
new file mode 100644
index 000000000..c9b5c6af7
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Controller\AuthorizeController as BaseAuthorizeController;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\AuthorizeControllerInterface
+ */
+class AuthorizeController extends BaseAuthorizeController implements AuthorizeControllerInterface
+{
+ private $nonce;
+
+ protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
+ {
+ $prompt = $request->query('prompt', 'consent');
+ if ($prompt == 'none') {
+ if (is_null($user_id)) {
+ $error = 'login_required';
+ $error_message = 'The user must log in';
+ } else {
+ $error = 'interaction_required';
+ $error_message = 'The user must grant access to your application';
+ }
+ } else {
+ $error = 'consent_required';
+ $error_message = 'The user denied access to your application';
+ }
+
+ $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->getState(), $error, $error_message);
+ }
+
+ protected function buildAuthorizeParameters($request, $response, $user_id)
+ {
+ if (!$params = parent::buildAuthorizeParameters($request, $response, $user_id)) {
+ return;
+ }
+
+ // Generate an id token if needed.
+ if ($this->needsIdToken($this->getScope()) && $this->getResponseType() == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
+ $params['id_token'] = $this->responseTypes['id_token']->createIdToken($this->getClientId(), $user_id, $this->nonce);
+ }
+
+ // add the nonce to return with the redirect URI
+ $params['nonce'] = $this->nonce;
+
+ return $params;
+ }
+
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!parent::validateAuthorizeRequest($request, $response)) {
+ return false;
+ }
+
+ $nonce = $request->query('nonce');
+
+ // Validate required nonce for "id_token" and "id_token token"
+ if (!$nonce && in_array($this->getResponseType(), array(self::RESPONSE_TYPE_ID_TOKEN, self::RESPONSE_TYPE_ID_TOKEN_TOKEN))) {
+ $response->setError(400, 'invalid_nonce', 'This application requires you specify a nonce parameter');
+
+ return false;
+ }
+
+ $this->nonce = $nonce;
+
+ return true;
+ }
+
+ protected function getValidResponseTypes()
+ {
+ return array(
+ self::RESPONSE_TYPE_ACCESS_TOKEN,
+ self::RESPONSE_TYPE_AUTHORIZATION_CODE,
+ self::RESPONSE_TYPE_ID_TOKEN,
+ self::RESPONSE_TYPE_ID_TOKEN_TOKEN,
+ self::RESPONSE_TYPE_CODE_ID_TOKEN,
+ );
+ }
+
+ /**
+ * Returns whether the current request needs to generate an id token.
+ *
+ * ID Tokens are a part of the OpenID Connect specification, so this
+ * method checks whether OpenID Connect is enabled in the server settings
+ * and whether the openid scope was requested.
+ *
+ * @param $request_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if an id token is needed, FALSE otherwise.
+ */
+ public function needsIdToken($request_scope)
+ {
+ // see if the "openid" scope exists in the requested scope
+ return $this->scopeUtil->checkScope('openid', $request_scope);
+ }
+
+ public function getNonce()
+ {
+ return $this->nonce;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
new file mode 100644
index 000000000..1e231d844
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+interface AuthorizeControllerInterface
+{
+ const RESPONSE_TYPE_ID_TOKEN = 'id_token';
+ const RESPONSE_TYPE_ID_TOKEN_TOKEN = 'id_token token';
+ const RESPONSE_TYPE_CODE_ID_TOKEN = 'code id_token';
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php
new file mode 100644
index 000000000..30cb942d0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Scope;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\Storage\AccessTokenInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\ScopeInterface;
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * @see OAuth2\Controller\UserInfoControllerInterface
+ */
+class UserInfoController extends ResourceController implements UserInfoControllerInterface
+{
+ private $token;
+
+ protected $tokenType;
+ protected $tokenStorage;
+ protected $userClaimsStorage;
+ protected $config;
+ protected $scopeUtil;
+
+ public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, UserClaimsInterface $userClaimsStorage, $config = array(), ScopeInterface $scopeUtil = null)
+ {
+ $this->tokenType = $tokenType;
+ $this->tokenStorage = $tokenStorage;
+ $this->userClaimsStorage = $userClaimsStorage;
+
+ $this->config = array_merge(array(
+ 'www_realm' => 'Service',
+ ), $config);
+
+ if (is_null($scopeUtil)) {
+ $scopeUtil = new Scope();
+ }
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response)
+ {
+ if (!$this->verifyResourceRequest($request, $response, 'openid')) {
+ return;
+ }
+
+ $token = $this->getToken();
+ $claims = $this->userClaimsStorage->getUserClaims($token['user_id'], $token['scope']);
+ // The sub Claim MUST always be returned in the UserInfo Response.
+ // http://openid.net/specs/openid-connect-core-1_0.html#UserInfoResponse
+ $claims += array(
+ 'sub' => $token['user_id'],
+ );
+ $response->addParameters($claims);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
new file mode 100644
index 000000000..a89049d49
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+ * This controller is called when the user claims for OpenID Connect's
+ * UserInfo endpoint should be returned.
+ *
+ * ex:
+ * > $response = new OAuth2\Response();
+ * > $userInfoController->handleUserInfoRequest(
+ * > OAuth2\Request::createFromGlobals(),
+ * > $response;
+ * > $response->send();
+ *
+ */
+interface UserInfoControllerInterface
+{
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
new file mode 100644
index 000000000..8ed1edc26
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\GrantType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\ResponseType\AccessTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode
+{
+ public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
+ {
+ $includeRefreshToken = true;
+ if (isset($this->authCode['id_token'])) {
+ // OpenID Connect requests include the refresh token only if the
+ // offline_access scope has been requested and granted.
+ $scopes = explode(' ', trim($scope));
+ $includeRefreshToken = in_array('offline_access', $scopes);
+ }
+
+ $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
+ if (isset($this->authCode['id_token'])) {
+ $token['id_token'] = $this->authCode['id_token'];
+ }
+
+ $this->storage->expireAuthorizationCode($this->authCode['code']);
+
+ return $token;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..8971954c5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCode as BaseAuthorizationCode;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode extends BaseAuthorizationCode implements AuthorizationCodeInterface
+{
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ parent::__construct($storage, $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null, 'id_token' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope'], $params['id_token']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param $id_token
+ * (optional) The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope, $id_token);
+
+ return $code;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..ea4779255
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id Client identifier related to the authorization code
+ * @param $user_id User ID associated with the authorization code
+ * @param $redirect_uri An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL Scopes to be stored in space-separated string.
+ * @param $id_token OPTIONAL The OpenID Connect id_token.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
new file mode 100644
index 000000000..ac7764d6c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+class CodeIdToken implements CodeIdTokenInterface
+{
+ protected $authCode;
+ protected $idToken;
+
+ public function __construct(AuthorizationCodeInterface $authCode, IdTokenInterface $idToken)
+ {
+ $this->authCode = $authCode;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->authCode->getAuthorizeResponse($params, $user_id);
+ $resultIdToken = $this->idToken->getAuthorizeResponse($params, $user_id);
+ $result[1]['query']['id_token'] = $resultIdToken[1]['fragment']['id_token'];
+
+ return $result;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
new file mode 100644
index 000000000..629adcca8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface CodeIdTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php
new file mode 100644
index 000000000..97777fbf2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+
+class IdToken implements IdTokenInterface
+{
+ protected $userClaimsStorage;
+ protected $publicKeyStorage;
+ protected $config;
+ protected $encryptionUtil;
+
+ public function __construct(UserClaimsInterface $userClaimsStorage, PublicKeyInterface $publicKeyStorage, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->userClaimsStorage = $userClaimsStorage;
+ $this->publicKeyStorage = $publicKeyStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+
+ if (!isset($config['issuer'])) {
+ throw new \LogicException('config parameter "issuer" must be set');
+ }
+ $this->config = array_merge(array(
+ 'id_lifetime' => 3600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $userInfo = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+ $params += array('scope' => null, 'state' => null, 'nonce' => null);
+
+ // create the id token.
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+ $userClaims = $this->userClaimsStorage->getUserClaims($user_id, $params['scope']);
+
+ $id_token = $this->createIdToken($params['client_id'], $userInfo, $params['nonce'], $userClaims, null);
+ $result["fragment"] = array('id_token' => $id_token);
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null)
+ {
+ // pull auth_time from user info if supplied
+ list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
+
+ $token = array(
+ 'iss' => $this->config['issuer'],
+ 'sub' => $user_id,
+ 'aud' => $client_id,
+ 'iat' => time(),
+ 'exp' => time() + $this->config['id_lifetime'],
+ 'auth_time' => $auth_time,
+ );
+
+ if ($nonce) {
+ $token['nonce'] = $nonce;
+ }
+
+ if ($userClaims) {
+ $token += $userClaims;
+ }
+
+ if ($access_token) {
+ $token['at_hash'] = $this->createAtHash($access_token, $client_id);
+ }
+
+ return $this->encodeToken($token, $client_id);
+ }
+
+ protected function createAtHash($access_token, $client_id = null)
+ {
+ // maps HS256 and RS256 to sha256, etc.
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+ $hash_algorithm = 'sha' . substr($algorithm, 2);
+ $hash = hash($hash_algorithm, $access_token, true);
+ $at_hash = substr($hash, 0, strlen($hash) / 2);
+
+ return $this->encryptionUtil->urlSafeB64Encode($at_hash);
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+
+ private function getUserIdAndAuthTime($userInfo)
+ {
+ $auth_time = null;
+
+ // support an array for user_id / auth_time
+ if (is_array($userInfo)) {
+ if (!isset($userInfo['user_id'])) {
+ throw new \LogicException('if $user_id argument is an array, user_id index must be set');
+ }
+
+ $auth_time = isset($userInfo['auth_time']) ? $userInfo['auth_time'] : null;
+ $user_id = $userInfo['user_id'];
+ } else {
+ $user_id = $userInfo;
+ }
+
+ if (is_null($auth_time)) {
+ $auth_time = time();
+ }
+
+ // userInfo is a scalar, and so this is the $user_id. Auth Time is null
+ return array($user_id, $auth_time);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
new file mode 100644
index 000000000..0bd2f8391
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Create the id token.
+ *
+ * If Authorization Code Flow is used, the id_token is generated when the
+ * authorization code is issued, and later returned from the token endpoint
+ * together with the access_token.
+ * If the Implicit Flow is used, the token and id_token are generated and
+ * returned together.
+ *
+ * @param string $client_id The client id.
+ * @param string $user_id The user id.
+ * @param string $nonce OPTIONAL The nonce.
+ * @param string $userClaims OPTIONAL Claims about the user.
+ * @param string $access_token OPTIONAL The access token, if known.
+ *
+ * @return string The ID Token represented as a JSON Web Token (JWT).
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken
+ */
+ public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
new file mode 100644
index 000000000..f0c59799b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\AccessTokenInterface;
+
+class IdTokenToken implements IdTokenTokenInterface
+{
+ protected $accessToken;
+ protected $idToken;
+
+ public function __construct(AccessTokenInterface $accessToken, IdTokenInterface $idToken)
+ {
+ $this->accessToken = $accessToken;
+ $this->idToken = $idToken;
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ $result = $this->accessToken->getAuthorizeResponse($params, $user_id);
+ $access_token = $result[1]['fragment']['access_token'];
+ $id_token = $this->idToken->createIdToken($params['client_id'], $user_id, $params['nonce'], null, $access_token);
+ $result[1]['fragment']['id_token'] = $id_token;
+
+ return $result;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
new file mode 100644
index 000000000..ac13e2032
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\ResponseType\ResponseTypeInterface;
+
+interface IdTokenTokenInterface extends ResponseTypeInterface
+{
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..51dd867ec
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
+{
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code authorization code to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param string $redirect_uri redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param string $id_token OPTIONAL the OpenID Connect id_token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
new file mode 100644
index 000000000..f230bef9e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user claims for the OpenID Connect id_token.
+ */
+interface UserClaimsInterface
+{
+ // valid scope values to pass into the user claims API call
+ const VALID_CLAIMS = 'profile email address phone';
+
+ // fields returned for the claims above
+ const PROFILE_CLAIM_VALUES = 'name family_name given_name middle_name nickname preferred_username profile picture website gender birthdate zoneinfo locale updated_at';
+ const EMAIL_CLAIM_VALUES = 'email email_verified';
+ const ADDRESS_CLAIM_VALUES = 'formatted street_address locality region postal_code country';
+ const PHONE_CLAIM_VALUES = 'phone_number phone_number_verified';
+
+ /**
+ * Return claims about the provided user id.
+ *
+ * Groups of claims are returned based on the requested scopes. No group
+ * is required, and no claim is required.
+ *
+ * @param $user_id
+ * The id of the user for which claims should be returned.
+ * @param $scope
+ * The requested scope.
+ * Scopes with matching claims: profile, email, address, phone.
+ *
+ * @return
+ * An array in the claim => value format.
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
+ */
+ public function getUserClaims($user_id, $scope);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php
new file mode 100644
index 000000000..c92cee821
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Request.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * OAuth2\Request
+ * This class is taken from the Symfony2 Framework and is part of the Symfony package.
+ * See Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Request implements RequestInterface
+{
+ public $attributes;
+ public $request;
+ public $query;
+ public $server;
+ public $files;
+ public $cookies;
+ public $headers;
+ public $content;
+
+ /**
+ * Constructor.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content, $headers);
+ }
+
+ /**
+ * Sets the parameters for this request.
+ *
+ * This method also re-initializes all properties.
+ *
+ * @param array $query The GET parameters
+ * @param array $request The POST parameters
+ * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+ * @param array $cookies The COOKIE parameters
+ * @param array $files The FILES parameters
+ * @param array $server The SERVER parameters
+ * @param string $content The raw body data
+ *
+ * @api
+ */
+ public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
+ {
+ $this->request = $request;
+ $this->query = $query;
+ $this->attributes = $attributes;
+ $this->cookies = $cookies;
+ $this->files = $files;
+ $this->server = $server;
+ $this->content = $content;
+ $this->headers = is_null($headers) ? $this->getHeadersFromServer($this->server) : $headers;
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function headers($name, $default = null)
+ {
+ $headers = array_change_key_case($this->headers);
+ $name = strtolower($name);
+
+ return isset($headers[$name]) ? $headers[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ /**
+ * Returns the request body content.
+ *
+ * @param Boolean $asResource If true, a resource will be returned
+ *
+ * @return string|resource The request body content or a resource to read the body stream.
+ */
+ public function getContent($asResource = false)
+ {
+ if (false === $this->content || (true === $asResource && null !== $this->content)) {
+ throw new \LogicException('getContent() can only be called once when using the resource return type.');
+ }
+
+ if (true === $asResource) {
+ $this->content = false;
+
+ return fopen('php://input', 'rb');
+ }
+
+ if (null === $this->content) {
+ $this->content = file_get_contents('php://input');
+ }
+
+ return $this->content;
+ }
+
+ private function getHeadersFromServer($server)
+ {
+ $headers = array();
+ foreach ($server as $key => $value) {
+ if (0 === strpos($key, 'HTTP_')) {
+ $headers[substr($key, 5)] = $value;
+ }
+ // CONTENT_* are not prefixed with HTTP_
+ elseif (in_array($key, array('CONTENT_LENGTH', 'CONTENT_MD5', 'CONTENT_TYPE'))) {
+ $headers[$key] = $value;
+ }
+ }
+
+ if (isset($server['PHP_AUTH_USER'])) {
+ $headers['PHP_AUTH_USER'] = $server['PHP_AUTH_USER'];
+ $headers['PHP_AUTH_PW'] = isset($server['PHP_AUTH_PW']) ? $server['PHP_AUTH_PW'] : '';
+ } else {
+ /*
+ * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
+ * For this workaround to work, add this line to your .htaccess file:
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ *
+ * A sample .htaccess file:
+ * RewriteEngine On
+ * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+ * RewriteCond %{REQUEST_FILENAME} !-f
+ * RewriteRule ^(.*)$ app.php [QSA,L]
+ */
+
+ $authorizationHeader = null;
+ if (isset($server['HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['HTTP_AUTHORIZATION'];
+ } elseif (isset($server['REDIRECT_HTTP_AUTHORIZATION'])) {
+ $authorizationHeader = $server['REDIRECT_HTTP_AUTHORIZATION'];
+ } elseif (function_exists('apache_request_headers')) {
+ $requestHeaders = (array) apache_request_headers();
+
+ // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
+ $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
+
+ if (isset($requestHeaders['Authorization'])) {
+ $authorizationHeader = trim($requestHeaders['Authorization']);
+ }
+ }
+
+ if (null !== $authorizationHeader) {
+ $headers['AUTHORIZATION'] = $authorizationHeader;
+ // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
+ if (0 === stripos($authorizationHeader, 'basic')) {
+ $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)));
+ if (count($exploded) == 2) {
+ list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
+ }
+ }
+ }
+ }
+
+ // PHP_AUTH_USER/PHP_AUTH_PW
+ if (isset($headers['PHP_AUTH_USER'])) {
+ $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Creates a new request with values from PHP's super globals.
+ *
+ * @return Request A new request
+ *
+ * @api
+ */
+ public static function createFromGlobals()
+ {
+ $class = get_called_class();
+ $request = new $class($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
+
+ $contentType = $request->server('CONTENT_TYPE', '');
+ $requestMethod = $request->server('REQUEST_METHOD', 'GET');
+ if (0 === strpos($contentType, 'application/x-www-form-urlencoded')
+ && in_array(strtoupper($requestMethod), array('PUT', 'DELETE'))
+ ) {
+ parse_str($request->getContent(), $data);
+ $request->request = $data;
+ } elseif (0 === strpos($contentType, 'application/json')
+ && in_array(strtoupper($requestMethod), array('POST', 'PUT', 'DELETE'))
+ ) {
+ $data = json_decode($request->getContent(), true);
+ $request->request = $data;
+ }
+
+ return $request;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php
new file mode 100644
index 000000000..8a70d5fad
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+interface RequestInterface
+{
+ public function query($name, $default = null);
+
+ public function request($name, $default = null);
+
+ public function server($name, $default = null);
+
+ public function headers($name, $default = null);
+
+ public function getAllQueryParameters();
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php
new file mode 100644
index 000000000..fc1e62a98
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Response.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Class to handle OAuth2 Responses in a graceful way. Use this interface
+ * to output the proper OAuth2 responses.
+ *
+ * @see OAuth2\ResponseInterface
+ *
+ * This class borrows heavily from the Symfony2 Framework and is part of the symfony package
+ * @see Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
+ */
+class Response implements ResponseInterface
+{
+ public $version;
+ protected $statusCode = 200;
+ protected $statusText;
+ protected $parameters = array();
+ protected $httpHeaders = array();
+
+ public static $statusTexts = array(
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authoritative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 307 => 'Temporary Redirect',
+ 400 => 'Bad Request',
+ 401 => 'Unauthorized',
+ 402 => 'Payment Required',
+ 403 => 'Forbidden',
+ 404 => 'Not Found',
+ 405 => 'Method Not Allowed',
+ 406 => 'Not Acceptable',
+ 407 => 'Proxy Authentication Required',
+ 408 => 'Request Timeout',
+ 409 => 'Conflict',
+ 410 => 'Gone',
+ 411 => 'Length Required',
+ 412 => 'Precondition Failed',
+ 413 => 'Request Entity Too Large',
+ 414 => 'Request-URI Too Long',
+ 415 => 'Unsupported Media Type',
+ 416 => 'Requested Range Not Satisfiable',
+ 417 => 'Expectation Failed',
+ 418 => 'I\'m a teapot',
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version Not Supported',
+ );
+
+ public function __construct($parameters = array(), $statusCode = 200, $headers = array())
+ {
+ $this->setParameters($parameters);
+ $this->setStatusCode($statusCode);
+ $this->setHttpHeaders($headers);
+ $this->version = '1.1';
+ }
+
+ /**
+ * Converts the response object to string containing all headers and the response content.
+ *
+ * @return string The response with headers and content
+ */
+ public function __toString()
+ {
+ $headers = array();
+ foreach ($this->httpHeaders as $name => $value) {
+ $headers[$name] = (array) $value;
+ }
+
+ return
+ sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
+ $this->getHttpHeadersAsString($headers)."\r\n".
+ $this->getResponseBody();
+ }
+
+ /**
+ * Returns the build header line.
+ *
+ * @param string $name The header name
+ * @param string $value The header value
+ *
+ * @return string The built header line
+ */
+ protected function buildHeader($name, $value)
+ {
+ return sprintf("%s: %s\n", $name, $value);
+ }
+
+ public function getStatusCode()
+ {
+ return $this->statusCode;
+ }
+
+ public function setStatusCode($statusCode, $text = null)
+ {
+ $this->statusCode = (int) $statusCode;
+ if ($this->isInvalid()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $statusCode));
+ }
+
+ $this->statusText = false === $text ? '' : (null === $text ? self::$statusTexts[$this->statusCode] : $text);
+ }
+
+ public function getStatusText()
+ {
+ return $this->statusText;
+ }
+
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+
+ public function setParameters(array $parameters)
+ {
+ $this->parameters = $parameters;
+ }
+
+ public function addParameters(array $parameters)
+ {
+ $this->parameters = array_merge($this->parameters, $parameters);
+ }
+
+ public function getParameter($name, $default = null)
+ {
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : $default;
+ }
+
+ public function setParameter($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+
+ public function setHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = $httpHeaders;
+ }
+
+ public function setHttpHeader($name, $value)
+ {
+ $this->httpHeaders[$name] = $value;
+ }
+
+ public function addHttpHeaders(array $httpHeaders)
+ {
+ $this->httpHeaders = array_merge($this->httpHeaders, $httpHeaders);
+ }
+
+ public function getHttpHeaders()
+ {
+ return $this->httpHeaders;
+ }
+
+ public function getHttpHeader($name, $default = null)
+ {
+ return isset($this->httpHeaders[$name]) ? $this->httpHeaders[$name] : $default;
+ }
+
+ public function getResponseBody($format = 'json')
+ {
+ switch ($format) {
+ case 'json':
+ return $this->parameters ? json_encode($this->parameters) : '';
+ case 'xml':
+ // this only works for single-level arrays
+ $xml = new \SimpleXMLElement('<response/>');
+ foreach ($this->parameters as $key => $param) {
+ $xml->addChild($key, $param);
+ }
+
+ return $xml->asXML();
+ }
+
+ throw new \InvalidArgumentException(sprintf('The format %s is not supported', $format));
+
+ }
+
+ public function send($format = 'json')
+ {
+ // headers have already been sent by the developer
+ if (headers_sent()) {
+ return;
+ }
+
+ switch ($format) {
+ case 'json':
+ $this->setHttpHeader('Content-Type', 'application/json');
+ break;
+ case 'xml':
+ $this->setHttpHeader('Content-Type', 'text/xml');
+ break;
+ }
+ // status
+ header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
+
+ foreach ($this->getHttpHeaders() as $name => $header) {
+ header(sprintf('%s: %s', $name, $header));
+ }
+ echo $this->getResponseBody($format);
+ }
+
+ public function setError($statusCode, $error, $errorDescription = null, $errorUri = null)
+ {
+ $parameters = array(
+ 'error' => $error,
+ 'error_description' => $errorDescription,
+ );
+
+ if (!is_null($errorUri)) {
+ if (strlen($errorUri) > 0 && $errorUri[0] == '#') {
+ // we are referencing an oauth bookmark (for brevity)
+ $errorUri = 'http://tools.ietf.org/html/rfc6749' . $errorUri;
+ }
+ $parameters['error_uri'] = $errorUri;
+ }
+
+ $httpHeaders = array(
+ 'Cache-Control' => 'no-store'
+ );
+
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+ $this->addHttpHeaders($httpHeaders);
+
+ if (!$this->isClientError() && !$this->isServerError()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not an error ("%s" given).', $statusCode));
+ }
+ }
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null)
+ {
+ if (empty($url)) {
+ throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
+ }
+
+ $parameters = array();
+
+ if (!is_null($state)) {
+ $parameters['state'] = $state;
+ }
+
+ if (!is_null($error)) {
+ $this->setError(400, $error, $errorDescription, $errorUri);
+ }
+ $this->setStatusCode($statusCode);
+ $this->addParameters($parameters);
+
+ if (count($this->parameters) > 0) {
+ // add parameters to URL redirection
+ $parts = parse_url($url);
+ $sep = isset($parts['query']) && count($parts['query']) > 0 ? '&' : '?';
+ $url .= $sep . http_build_query($this->parameters);
+ }
+
+ $this->addHttpHeaders(array('Location' => $url));
+
+ if (!$this->isRedirection()) {
+ throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $statusCode));
+ }
+ }
+
+ // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInvalid()
+ {
+ return $this->statusCode < 100 || $this->statusCode >= 600;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isInformational()
+ {
+ return $this->statusCode >= 100 && $this->statusCode < 200;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isSuccessful()
+ {
+ return $this->statusCode >= 200 && $this->statusCode < 300;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isRedirection()
+ {
+ return $this->statusCode >= 300 && $this->statusCode < 400;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isClientError()
+ {
+ return $this->statusCode >= 400 && $this->statusCode < 500;
+ }
+
+ /**
+ * @return Boolean
+ *
+ * @api
+ */
+ public function isServerError()
+ {
+ return $this->statusCode >= 500 && $this->statusCode < 600;
+ }
+
+ /*
+ * Functions from Symfony2 HttpFoundation - output pretty header
+ */
+ private function getHttpHeadersAsString($headers)
+ {
+ if (count($headers) == 0) {
+ return '';
+ }
+
+ $max = max(array_map('strlen', array_keys($headers))) + 1;
+ $content = '';
+ ksort($headers);
+ foreach ($headers as $name => $values) {
+ foreach ($values as $value) {
+ $content .= sprintf("%-{$max}s %s\r\n", $this->beautifyHeaderName($name).':', $value);
+ }
+ }
+
+ return $content;
+ }
+
+ private function beautifyHeaderName($name)
+ {
+ return preg_replace_callback('/\-(.)/', array($this, 'beautifyCallback'), ucfirst($name));
+ }
+
+ private function beautifyCallback($match)
+ {
+ return '-'.strtoupper($match[1]);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php
new file mode 100644
index 000000000..c99b5f7d1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace OAuth2;
+
+/**
+ * Interface which represents an object response. Meant to handle and display the proper OAuth2 Responses
+ * for errors and successes
+ *
+ * @see OAuth2\Response
+ */
+interface ResponseInterface
+{
+ public function addParameters(array $parameters);
+
+ public function addHttpHeaders(array $httpHeaders);
+
+ public function setStatusCode($statusCode);
+
+ public function setError($statusCode, $name, $description = null, $uri = null);
+
+ public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null);
+
+ public function getParameter($name);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php
new file mode 100644
index 000000000..98f51218f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php
@@ -0,0 +1,194 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AccessToken implements AccessTokenInterface
+{
+ protected $tokenStorage;
+ protected $refreshStorage;
+ protected $config;
+
+ /**
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage REQUIRED Storage class for saving access token information
+ * @param OAuth2\Storage\RefreshTokenInterface $refreshStorage OPTIONAL Storage class for saving refresh token information
+ * @param array $config OPTIONAL Configuration options for the server
+ * <code>
+ * $config = array(
+ * 'token_type' => 'bearer', // token type identifier
+ * 'access_lifetime' => 3600, // time before access token expires
+ * 'refresh_token_lifetime' => 1209600, // time before refresh token expires
+ * );
+ * </endcode>
+ */
+ public function __construct(AccessTokenStorageInterface $tokenStorage, RefreshTokenInterface $refreshStorage = null, array $config = array())
+ {
+ $this->tokenStorage = $tokenStorage;
+ $this->refreshStorage = $refreshStorage;
+
+ $this->config = array_merge(array(
+ 'token_type' => 'bearer',
+ 'access_lifetime' => 3600,
+ 'refresh_token_lifetime' => 1209600,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ /*
+ * a refresh token MUST NOT be included in the fragment
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2.2
+ */
+ $includeRefreshToken = false;
+ $result["fragment"] = $this->createAccessToken($params['client_id'], $user_id, $params['scope'], $includeRefreshToken);
+
+ if (isset($params['state'])) {
+ $result["fragment"]["state"] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ $token = array(
+ "access_token" => $this->generateAccessToken(),
+ "expires_in" => $this->config['access_lifetime'],
+ "token_type" => $this->config['token_type'],
+ "scope" => $scope
+ );
+
+ $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $token["refresh_token"] = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id, $expires, $scope);
+ }
+
+ return $token;
+ }
+
+ /**
+ * Generates an unique access token.
+ *
+ * Implementing classes may want to override this function to implement
+ * other access token generation schemes.
+ *
+ * @return
+ * An unique access token.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAccessToken()
+ {
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(20, MCRYPT_DEV_URANDOM);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ if (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 20);
+ if ($randomData !== false && strlen($randomData) === 20) {
+ return bin2hex($randomData);
+ }
+ }
+ // Last resort which you probably should just get rid of:
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+
+ return substr(hash('sha512', $randomData), 0, 40);
+ }
+
+ /**
+ * Generates an unique refresh token
+ *
+ * Implementing classes may want to override this function to implement
+ * other refresh token generation schemes.
+ *
+ * @return
+ * An unique refresh.
+ *
+ * @ingroup oauth2_section_4
+ * @see OAuth2::generateAccessToken()
+ */
+ protected function generateRefreshToken()
+ {
+ return $this->generateAccessToken(); // let's reuse the same scheme for token generation
+ }
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ * RFC7009 specifies that "If the server is unable to locate the token using
+ * the given hint, it MUST extend its search across all of its supported token types"
+ *
+ * @param $token
+ * @param null $tokenTypeHint
+ * @return boolean
+ */
+ public function revokeToken($token, $tokenTypeHint = null)
+ {
+ if ($tokenTypeHint == 'refresh_token') {
+ if ($this->refreshStorage && $revoked = $this->refreshStorage->unsetRefreshToken($token)) {
+ return true;
+ }
+ }
+
+ /** @TODO remove in v2 */
+ if (!method_exists($this->tokenStorage, 'unsetAccessToken')) {
+ throw new \RuntimeException(
+ sprintf('Token storage %s must implement unsetAccessToken method', get_class($this->tokenStorage)
+ ));
+ }
+
+ $revoked = $this->tokenStorage->unsetAccessToken($token);
+
+ // if a typehint is supplied and fails, try other storages
+ // @see https://tools.ietf.org/html/rfc7009#section-2.1
+ if (!$revoked && $tokenTypeHint != 'refresh_token') {
+ if ($this->refreshStorage) {
+ $revoked = $this->refreshStorage->unsetRefreshToken($token);
+ }
+ }
+
+ return $revoked;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php
new file mode 100644
index 000000000..4bd3928d8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface extends ResponseTypeInterface
+{
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id client identifier related to the access token.
+ * @param $user_id user ID associated with the access token
+ * @param $scope OPTONAL scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true);
+
+ /**
+ * Handle the revoking of refresh tokens, and access tokens if supported / desirable
+ *
+ * @param $token
+ * @param $tokenTypeHint
+ * @return mixed
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function revokeToken($token, $tokenTypeHint);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php
new file mode 100644
index 000000000..52aeb4be5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class AuthorizationCode implements AuthorizationCodeInterface
+{
+ protected $storage;
+ protected $config;
+
+ public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
+ {
+ $this->storage = $storage;
+ $this->config = array_merge(array(
+ 'enforce_redirect' => false,
+ 'auth_code_lifetime' => 30,
+ ), $config);
+ }
+
+ public function getAuthorizeResponse($params, $user_id = null)
+ {
+ // build the URL to redirect to
+ $result = array('query' => array());
+
+ $params += array('scope' => null, 'state' => null);
+
+ $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope']);
+
+ if (isset($params['state'])) {
+ $result['query']['state'] = $params['state'];
+ }
+
+ return array($params['redirect_uri'], $result);
+ }
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id
+ * Client identifier related to the authorization code
+ * @param $user_id
+ * User ID associated with the authorization code
+ * @param $redirect_uri
+ * An absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null)
+ {
+ $code = $this->generateAuthorizationCode();
+ $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope);
+
+ return $code;
+ }
+
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect()
+ {
+ return $this->config['enforce_redirect'];
+ }
+
+ /**
+ * Generates an unique auth code.
+ *
+ * Implementing classes may want to override this function to implement
+ * other auth code generation schemes.
+ *
+ * @return
+ * An unique auth code.
+ *
+ * @ingroup oauth2_section_4
+ */
+ protected function generateAuthorizationCode()
+ {
+ $tokenLen = 40;
+ if (function_exists('openssl_random_pseudo_bytes')) {
+ $randomData = openssl_random_pseudo_bytes(100);
+ } elseif (function_exists('mcrypt_create_iv')) {
+ $randomData = mcrypt_create_iv(100, MCRYPT_DEV_URANDOM);
+ } elseif (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
+ $randomData = file_get_contents('/dev/urandom', false, null, 0, 100) . uniqid(mt_rand(), true);
+ } else {
+ $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
+ }
+
+ return substr(hash('sha512', $randomData), 0, $tokenLen);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..df777e221
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface extends ResponseTypeInterface
+{
+ /**
+ * @return
+ * TRUE if the grant type requires a redirect_uri, FALSE if not
+ */
+ public function enforceRedirect();
+
+ /**
+ * Handle the creation of the authorization code.
+ *
+ * @param $client_id client identifier related to the authorization code
+ * @param $user_id user id associated with the authorization code
+ * @param $redirect_uri an absolute URI to which the authorization server will redirect the
+ * user-agent to when the end-user authorization step is completed.
+ * @param $scope OPTIONAL scopes to be stored in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @ingroup oauth2_section_4
+ */
+ public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php
new file mode 100644
index 000000000..3942fe41e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
+use OAuth2\Storage\RefreshTokenInterface;
+use OAuth2\Storage\PublicKeyInterface;
+use OAuth2\Storage\Memory;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken extends AccessToken
+{
+ protected $publicKeyStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param $config
+ * - store_encrypted_token_string (bool true)
+ * whether the entire encrypted string is stored,
+ * or just the token ID is stored
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage = null, AccessTokenStorageInterface $tokenStorage = null, RefreshTokenInterface $refreshStorage = null, array $config = array(), EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $config = array_merge(array(
+ 'store_encrypted_token_string' => true,
+ 'issuer' => ''
+ ), $config);
+ if (is_null($tokenStorage)) {
+ // a pass-thru, so we can call the parent constructor
+ $tokenStorage = new Memory();
+ }
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt();
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ parent::__construct($tokenStorage, $refreshStorage, $config);
+ }
+
+ /**
+ * Handle the creation of access token, also issue refresh token if supported / desirable.
+ *
+ * @param $client_id
+ * Client identifier related to the access token.
+ * @param $user_id
+ * User ID associated with the access token
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ * @param bool $includeRefreshToken
+ * If true, a new refresh_token will be added to the response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-5
+ * @ingroup oauth2_section_5
+ */
+ public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
+ {
+ // token to encrypt
+ $expires = time() + $this->config['access_lifetime'];
+ $id = $this->generateAccessToken();
+ $jwtAccessToken = array(
+ 'id' => $id, // for BC (see #591)
+ 'jti' => $id,
+ 'iss' => $this->config['issuer'],
+ 'aud' => $client_id,
+ 'sub' => $user_id,
+ 'exp' => $expires,
+ 'iat' => time(),
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Encode the token data into a single access_token string
+ */
+ $access_token = $this->encodeToken($jwtAccessToken, $client_id);
+
+ /*
+ * Save the token to a secondary storage. This is implemented on the
+ * OAuth2\Storage\JwtAccessToken side, and will not actually store anything,
+ * if no secondary storage has been supplied
+ */
+ $token_to_store = $this->config['store_encrypted_token_string'] ? $access_token : $jwtAccessToken['id'];
+ $this->tokenStorage->setAccessToken($token_to_store, $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
+
+ // token to return to the client
+ $token = array(
+ 'access_token' => $access_token,
+ 'expires_in' => $this->config['access_lifetime'],
+ 'token_type' => $this->config['token_type'],
+ 'scope' => $scope
+ );
+
+ /*
+ * Issue a refresh token also, if we support them
+ *
+ * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
+ * is supplied in the constructor
+ */
+ if ($includeRefreshToken && $this->refreshStorage) {
+ $refresh_token = $this->generateRefreshToken();
+ $expires = 0;
+ if ($this->config['refresh_token_lifetime'] > 0) {
+ $expires = time() + $this->config['refresh_token_lifetime'];
+ }
+ $this->refreshStorage->setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope);
+ $token['refresh_token'] = $refresh_token;
+ }
+
+ return $token;
+ }
+
+ protected function encodeToken(array $token, $client_id = null)
+ {
+ $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ return $this->encryptionUtil->encode($token, $private_key, $algorithm);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php
new file mode 100644
index 000000000..f8e26a5b0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+interface ResponseTypeInterface
+{
+ public function getAuthorizeResponse($params, $user_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php
new file mode 100644
index 000000000..c44350bfd
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Scope.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+* @see OAuth2\ScopeInterface
+*/
+class Scope implements ScopeInterface
+{
+ protected $storage;
+
+ /**
+ * @param mixed @storage
+ * Either an array of supported scopes, or an instance of OAuth2\Storage\ScopeInterface
+ */
+ public function __construct($storage = null)
+ {
+ if (is_null($storage) || is_array($storage)) {
+ $storage = new Memory((array) $storage);
+ }
+
+ if (!$storage instanceof ScopeStorageInterface) {
+ throw new \InvalidArgumentException("Argument 1 to OAuth2\Scope must be null, an array, or instance of OAuth2\Storage\ScopeInterface");
+ }
+
+ $this->storage = $storage;
+ }
+
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope)
+ {
+ $required_scope = explode(' ', trim($required_scope));
+ $available_scope = explode(' ', trim($available_scope));
+
+ return (count(array_diff($required_scope, $available_scope)) == 0);
+ }
+
+ /**
+ * Check if the provided scope exists in storage.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope)
+ {
+ // Check reserved scopes first.
+ $scope = explode(' ', trim($scope));
+ $reservedScope = $this->getReservedScopes();
+ $nonReservedScopes = array_diff($scope, $reservedScope);
+ if (count($nonReservedScopes) == 0) {
+ return true;
+ } else {
+ // Check the storage for non-reserved scopes.
+ $nonReservedScopes = implode(' ', $nonReservedScopes);
+
+ return $this->storage->scopeExists($nonReservedScopes);
+ }
+ }
+
+ public function getScopeFromRequest(RequestInterface $request)
+ {
+ // "scope" is valid if passed in either POST or QUERY
+ return $request->request('scope', $request->query('scope'));
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->storage->getDefaultScope($client_id);
+ }
+
+ /**
+ * Get reserved scopes needed by the server.
+ *
+ * In case OpenID Connect is used, these scopes must include:
+ * 'openid', offline_access'.
+ *
+ * @return
+ * An array of reserved scopes.
+ */
+ public function getReservedScopes()
+ {
+ return array('openid', 'offline_access');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php
new file mode 100644
index 000000000..5b60f9aee
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
+
+/**
+ * Class to handle scope implementation logic
+ *
+ * @see OAuth2\Storage\ScopeInterface
+ */
+interface ScopeInterface extends ScopeStorageInterface
+{
+ /**
+ * Check if everything in required scope is contained in available scope.
+ *
+ * @param $required_scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if everything in required scope is contained in available scope,
+ * and FALSE if it isn't.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-7
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function checkScope($required_scope, $available_scope);
+
+ /**
+ * Return scope info from request
+ *
+ * @param OAuth2\RequestInterface
+ * Request object to check
+ *
+ * @return
+ * string representation of requested scope
+ */
+ public function getScopeFromRequest(RequestInterface $request);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php
new file mode 100644
index 000000000..9cfcb83a5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Server.php
@@ -0,0 +1,879 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Controller\ResourceControllerInterface;
+use OAuth2\Controller\ResourceController;
+use OAuth2\OpenID\Controller\UserInfoControllerInterface;
+use OAuth2\OpenID\Controller\UserInfoController;
+use OAuth2\OpenID\Controller\AuthorizeController as OpenIDAuthorizeController;
+use OAuth2\OpenID\ResponseType\AuthorizationCode as OpenIDAuthorizationCodeResponseType;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+use OAuth2\OpenID\GrantType\AuthorizationCode as OpenIDAuthorizationCodeGrantType;
+use OAuth2\Controller\AuthorizeControllerInterface;
+use OAuth2\Controller\AuthorizeController;
+use OAuth2\Controller\TokenControllerInterface;
+use OAuth2\Controller\TokenController;
+use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
+use OAuth2\ClientAssertionType\HttpBasic;
+use OAuth2\ResponseType\ResponseTypeInterface;
+use OAuth2\ResponseType\AuthorizationCode as AuthorizationCodeResponseType;
+use OAuth2\ResponseType\AccessToken;
+use OAuth2\ResponseType\JwtAccessToken;
+use OAuth2\OpenID\ResponseType\CodeIdToken;
+use OAuth2\OpenID\ResponseType\IdToken;
+use OAuth2\OpenID\ResponseType\IdTokenToken;
+use OAuth2\TokenType\TokenTypeInterface;
+use OAuth2\TokenType\Bearer;
+use OAuth2\GrantType\GrantTypeInterface;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\Storage\JwtAccessTokenInterface;
+
+/**
+* Server class for OAuth2
+* This class serves as a convience class which wraps the other Controller classes
+*
+* @see OAuth2\Controller\ResourceController
+* @see OAuth2\Controller\AuthorizeController
+* @see OAuth2\Controller\TokenController
+*/
+class Server implements ResourceControllerInterface,
+ AuthorizeControllerInterface,
+ TokenControllerInterface,
+ UserInfoControllerInterface
+{
+ // misc properties
+ /**
+ * @var Response
+ */
+ protected $response;
+
+ /**
+ * @var array
+ */
+ protected $config;
+
+ /**
+ * @var array
+ */
+ protected $storages;
+
+ // servers
+ /**
+ * @var AuthorizeControllerInterface
+ */
+ protected $authorizeController;
+
+ /**
+ * @var TokenControllerInterface
+ */
+ protected $tokenController;
+
+ /**
+ * @var ResourceControllerInterface
+ */
+ protected $resourceController;
+
+ /**
+ * @var UserInfoControllerInterface
+ */
+ protected $userInfoController;
+
+ // config classes
+ protected $grantTypes;
+ protected $responseTypes;
+ protected $tokenType;
+
+ /**
+ * @var ScopeInterface
+ */
+ protected $scopeUtil;
+ protected $clientAssertionType;
+
+ protected $storageMap = array(
+ 'access_token' => 'OAuth2\Storage\AccessTokenInterface',
+ 'authorization_code' => 'OAuth2\Storage\AuthorizationCodeInterface',
+ 'client_credentials' => 'OAuth2\Storage\ClientCredentialsInterface',
+ 'client' => 'OAuth2\Storage\ClientInterface',
+ 'refresh_token' => 'OAuth2\Storage\RefreshTokenInterface',
+ 'user_credentials' => 'OAuth2\Storage\UserCredentialsInterface',
+ 'user_claims' => 'OAuth2\OpenID\Storage\UserClaimsInterface',
+ 'public_key' => 'OAuth2\Storage\PublicKeyInterface',
+ 'jwt_bearer' => 'OAuth2\Storage\JWTBearerInterface',
+ 'scope' => 'OAuth2\Storage\ScopeInterface',
+ );
+
+ protected $responseTypeMap = array(
+ 'token' => 'OAuth2\ResponseType\AccessTokenInterface',
+ 'code' => 'OAuth2\ResponseType\AuthorizationCodeInterface',
+ 'id_token' => 'OAuth2\OpenID\ResponseType\IdTokenInterface',
+ 'id_token token' => 'OAuth2\OpenID\ResponseType\IdTokenTokenInterface',
+ 'code id_token' => 'OAuth2\OpenID\ResponseType\CodeIdTokenInterface',
+ );
+
+ /**
+ * @param mixed $storage (array or OAuth2\Storage) - single object or array of objects implementing the
+ * required storage types (ClientCredentialsInterface and AccessTokenInterface as a minimum)
+ * @param array $config specify a different token lifetime, token header name, etc
+ * @param array $grantTypes An array of OAuth2\GrantType\GrantTypeInterface to use for granting access tokens
+ * @param array $responseTypes Response types to use. array keys should be "code" and and "token" for
+ * Access Token and Authorization Code response types
+ * @param \OAuth2\TokenType\TokenTypeInterface $tokenType The token type object to use. Valid token types are "bearer" and "mac"
+ * @param \OAuth2\ScopeInterface $scopeUtil The scope utility class to use to validate scope
+ * @param \OAuth2\ClientAssertionType\ClientAssertionTypeInterface $clientAssertionType The method in which to verify the client identity. Default is HttpBasic
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function __construct($storage = array(), array $config = array(), array $grantTypes = array(), array $responseTypes = array(), TokenTypeInterface $tokenType = null, ScopeInterface $scopeUtil = null, ClientAssertionTypeInterface $clientAssertionType = null)
+ {
+ $storage = is_array($storage) ? $storage : array($storage);
+ $this->storages = array();
+ foreach ($storage as $key => $service) {
+ $this->addStorage($service, $key);
+ }
+
+ // merge all config values. These get passed to our controller objects
+ $this->config = array_merge(array(
+ 'use_jwt_access_tokens' => false,
+ 'store_encrypted_token_string' => true,
+ 'use_openid_connect' => false,
+ 'id_lifetime' => 3600,
+ 'access_lifetime' => 3600,
+ 'www_realm' => 'Service',
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ 'enforce_state' => true,
+ 'require_exact_redirect_uri' => true,
+ 'allow_implicit' => false,
+ 'allow_credentials_in_request_body' => true,
+ 'allow_public_clients' => true,
+ 'always_issue_new_refresh_token' => false,
+ 'unset_refresh_token_after_use' => true,
+ ), $config);
+
+ foreach ($grantTypes as $key => $grantType) {
+ $this->addGrantType($grantType, $key);
+ }
+
+ foreach ($responseTypes as $key => $responseType) {
+ $this->addResponseType($responseType, $key);
+ }
+
+ $this->tokenType = $tokenType;
+ $this->scopeUtil = $scopeUtil;
+ $this->clientAssertionType = $clientAssertionType;
+
+ if ($this->config['use_openid_connect']) {
+ $this->validateOpenIdConnect();
+ }
+ }
+
+ public function getAuthorizeController()
+ {
+ if (is_null($this->authorizeController)) {
+ $this->authorizeController = $this->createDefaultAuthorizeController();
+ }
+
+ return $this->authorizeController;
+ }
+
+ public function getTokenController()
+ {
+ if (is_null($this->tokenController)) {
+ $this->tokenController = $this->createDefaultTokenController();
+ }
+
+ return $this->tokenController;
+ }
+
+ public function getResourceController()
+ {
+ if (is_null($this->resourceController)) {
+ $this->resourceController = $this->createDefaultResourceController();
+ }
+
+ return $this->resourceController;
+ }
+
+ public function getUserInfoController()
+ {
+ if (is_null($this->userInfoController)) {
+ $this->userInfoController = $this->createDefaultUserInfoController();
+ }
+
+ return $this->userInfoController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param AuthorizeControllerInterface $authorizeController
+ */
+ public function setAuthorizeController(AuthorizeControllerInterface $authorizeController)
+ {
+ $this->authorizeController = $authorizeController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param TokenControllerInterface $tokenController
+ */
+ public function setTokenController(TokenControllerInterface $tokenController)
+ {
+ $this->tokenController = $tokenController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param ResourceControllerInterface $resourceController
+ */
+ public function setResourceController(ResourceControllerInterface $resourceController)
+ {
+ $this->resourceController = $resourceController;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param UserInfoControllerInterface $userInfoController
+ */
+ public function setUserInfoController(UserInfoControllerInterface $userInfoController)
+ {
+ $this->userInfoController = $userInfoController;
+ }
+
+ /**
+ * Return claims about the authenticated end-user.
+ * This would be called from the "/UserInfo" endpoint as defined in the spec.
+ *
+ * @param $request - \OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - \OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or user claims (success)
+ *
+ * @return ResponseInterface
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
+ */
+ public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getUserInfoController()->handleUserInfoRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Grant or deny a requested access token.
+ * This would be called from the "/token" endpoint as defined in the spec.
+ * Obviously, you can call your endpoint whatever you want.
+ *
+ * @param $request - \OAuth2\RequestInterface
+ * Request object to grant access token
+ *
+ * @param $response - \OAuth2\ResponseInterface
+ * Response object containing error messages (failure) or access token (success)
+ *
+ * @return ResponseInterface
+ *
+ * @throws \InvalidArgumentException
+ * @throws \LogicException
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ * @see http://tools.ietf.org/html/rfc6749#section-10.6
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleTokenRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleTokenRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ public function grantAccessToken(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getTokenController()->grantAccessToken($request, $this->response);
+
+ return $value;
+ }
+
+ /**
+ * Handle a revoke token request
+ * This would be called from the "/revoke" endpoint as defined in the draft Token Revocation spec
+ *
+ * @see https://tools.ietf.org/html/rfc7009#section-2
+ *
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
+ * @return Response|ResponseInterface
+ */
+ public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $this->getTokenController()->handleRevokeRequest($request, $this->response);
+
+ return $this->response;
+ }
+
+ /**
+ * Redirect the user appropriately after approval.
+ *
+ * After the user has approved or denied the resource request the
+ * authorization server should call this function to redirect the user
+ * appropriately.
+ *
+ * @param $request
+ * The request should have the follow parameters set in the querystring:
+ * - response_type: The requested response: an access token, an
+ * authorization code, or both.
+ * - client_id: The client identifier as described in Section 2.
+ * - redirect_uri: An absolute URI to which the authorization server
+ * will redirect the user-agent to when the end-user authorization
+ * step is completed.
+ * - scope: (optional) The scope of the resource request expressed as a
+ * list of space-delimited strings.
+ * - state: (optional) An opaque value used by the client to maintain
+ * state between the request and callback.
+ * @param ResponseInterface $response
+ * @param $is_authorized
+ * TRUE or FALSE depending on whether the user authorized the access.
+ * @param $user_id
+ * Identifier of user who authorized the client
+ *
+ * @return Response
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
+ {
+ $this->response = $response;
+ $this->getAuthorizeController()->handleAuthorizeRequest($request, $this->response, $is_authorized, $user_id);
+
+ return $this->response;
+ }
+
+ /**
+ * Pull the authorization request data out of the HTTP request.
+ * - The redirect_uri is OPTIONAL as per draft 20. But your implementation can enforce it
+ * by setting $config['enforce_redirect'] to true.
+ * - The state is OPTIONAL but recommended to enforce CSRF. Draft 21 states, however, that
+ * CSRF protection is MANDATORY. You can enforce this by setting the $config['enforce_state'] to true.
+ *
+ * The draft specifies that the parameters should be retrieved from GET, override the Response
+ * object to change this
+ *
+ * @return
+ * The authorization parameters so the authorization server can prompt
+ * the user for approval if valid.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
+ * @see http://tools.ietf.org/html/rfc6749#section-10.12
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getAuthorizeController()->validateAuthorizeRequest($request, $this->response);
+
+ return $value;
+ }
+
+ public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response = null, $scope = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->verifyResourceRequest($request, $this->response, $scope);
+
+ return $value;
+ }
+
+ public function getAccessTokenData(RequestInterface $request, ResponseInterface $response = null)
+ {
+ $this->response = is_null($response) ? new Response() : $response;
+ $value = $this->getResourceController()->getAccessTokenData($request, $this->response);
+
+ return $value;
+ }
+
+ public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
+ {
+ if (!is_string($identifier)) {
+ $identifier = $grantType->getQuerystringIdentifier();
+ }
+
+ $this->grantTypes[$identifier] = $grantType;
+
+ // persist added grant type down to TokenController
+ if (!is_null($this->tokenController)) {
+ $this->getTokenController()->addGrantType($grantType, $identifier);
+ }
+ }
+
+ /**
+ * Set a storage object for the server
+ *
+ * @param $storage
+ * An object implementing one of the Storage interfaces
+ * @param $key
+ * If null, the storage is set to the key of each storage interface it implements
+ *
+ * @see storageMap
+ */
+ public function addStorage($storage, $key = null)
+ {
+ // if explicitly set to a valid key, do not "magically" set below
+ if (isset($this->storageMap[$key])) {
+ if (!is_null($storage) && !$storage instanceof $this->storageMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('storage of type "%s" must implement interface "%s"', $key, $this->storageMap[$key]));
+ }
+ $this->storages[$key] = $storage;
+
+ // special logic to handle "client" and "client_credentials" strangeness
+ if ($key === 'client' && !isset($this->storages['client_credentials'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientCredentialsInterface) {
+ $this->storages['client_credentials'] = $storage;
+ }
+ } elseif ($key === 'client_credentials' && !isset($this->storages['client'])) {
+ if ($storage instanceof \OAuth2\Storage\ClientInterface) {
+ $this->storages['client'] = $storage;
+ }
+ }
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown storage key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->storageMap))));
+ } else {
+ $set = false;
+ foreach ($this->storageMap as $type => $interface) {
+ if ($storage instanceof $interface) {
+ $this->storages[$type] = $storage;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('storage of class "%s" must implement one of [%s]', get_class($storage), implode(', ', $this->storageMap)));
+ }
+ }
+ }
+
+ public function addResponseType(ResponseTypeInterface $responseType, $key = null)
+ {
+ $key = $this->normalizeResponseType($key);
+
+ if (isset($this->responseTypeMap[$key])) {
+ if (!$responseType instanceof $this->responseTypeMap[$key]) {
+ throw new \InvalidArgumentException(sprintf('responseType of type "%s" must implement interface "%s"', $key, $this->responseTypeMap[$key]));
+ }
+ $this->responseTypes[$key] = $responseType;
+ } elseif (!is_null($key) && !is_numeric($key)) {
+ throw new \InvalidArgumentException(sprintf('unknown responseType key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->responseTypeMap))));
+ } else {
+ $set = false;
+ foreach ($this->responseTypeMap as $type => $interface) {
+ if ($responseType instanceof $interface) {
+ $this->responseTypes[$type] = $responseType;
+ $set = true;
+ }
+ }
+
+ if (!$set) {
+ throw new \InvalidArgumentException(sprintf('Unknown response type %s. Please implement one of [%s]', get_class($responseType), implode(', ', $this->responseTypeMap)));
+ }
+ }
+ }
+
+ public function getScopeUtil()
+ {
+ if (!$this->scopeUtil) {
+ $storage = isset($this->storages['scope']) ? $this->storages['scope'] : null;
+ $this->scopeUtil = new Scope($storage);
+ }
+
+ return $this->scopeUtil;
+ }
+
+ /**
+ * every getter deserves a setter
+ *
+ * @param ScopeInterface $scopeUtil
+ */
+ public function setScopeUtil($scopeUtil)
+ {
+ $this->scopeUtil = $scopeUtil;
+ }
+
+ protected function createDefaultAuthorizeController()
+ {
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException('You must supply a storage object implementing \OAuth2\Storage\ClientInterface to use the authorize server');
+ }
+ if (0 == count($this->responseTypes)) {
+ $this->responseTypes = $this->getDefaultResponseTypes();
+ }
+ if ($this->config['use_openid_connect'] && !isset($this->responseTypes['id_token'])) {
+ $this->responseTypes['id_token'] = $this->createDefaultIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $this->responseTypes['id_token token'] = $this->createDefaultIdTokenTokenResponseType();
+ }
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_implicit enforce_state require_exact_redirect_uri')));
+
+ if ($this->config['use_openid_connect']) {
+ return new OpenIDAuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ return new AuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultTokenController()
+ {
+ if (0 == count($this->grantTypes)) {
+ $this->grantTypes = $this->getDefaultGrantTypes();
+ }
+
+ if (is_null($this->clientAssertionType)) {
+ // see if HttpBasic assertion type is requred. If so, then create it from storage classes.
+ foreach ($this->grantTypes as $grantType) {
+ if (!$grantType instanceof ClientAssertionTypeInterface) {
+ if (!isset($this->storages['client_credentials'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\ClientCredentialsInterface to use the token server');
+ }
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_credentials_in_request_body allow_public_clients')));
+ $this->clientAssertionType = new HttpBasic($this->storages['client_credentials'], $config);
+ break;
+ }
+ }
+ }
+
+ if (!isset($this->storages['client'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the token server');
+ }
+
+ $accessTokenResponseType = $this->getAccessTokenResponseType();
+
+ return new TokenController($accessTokenResponseType, $this->storages['client'], $this->grantTypes, $this->clientAssertionType, $this->getScopeUtil());
+ }
+
+ protected function createDefaultResourceController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the resource server');
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new ResourceController($this->tokenType, $this->storages['access_token'], $config, $this->getScopeUtil());
+ }
+
+ protected function createDefaultUserInfoController()
+ {
+ if ($this->config['use_jwt_access_tokens']) {
+ // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
+ if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
+ $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
+ }
+ } elseif (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the UserInfo server');
+ }
+
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use the UserInfo server');
+ }
+
+ if (!$this->tokenType) {
+ $this->tokenType = $this->getDefaultTokenType();
+ }
+
+ $config = array_intersect_key($this->config, array('www_realm' => ''));
+
+ return new UserInfoController($this->tokenType, $this->storages['access_token'], $this->storages['user_claims'], $config, $this->getScopeUtil());
+ }
+
+ protected function getDefaultTokenType()
+ {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'token_param_name token_bearer_header_name')));
+
+ return new Bearer($config);
+ }
+
+ protected function getDefaultResponseTypes()
+ {
+ $responseTypes = array();
+
+ if ($this->config['allow_implicit']) {
+ $responseTypes['token'] = $this->getAccessTokenResponseType();
+ }
+
+ if ($this->config['use_openid_connect']) {
+ $responseTypes['id_token'] = $this->getIdTokenResponseType();
+ if ($this->config['allow_implicit']) {
+ $responseTypes['id_token token'] = $this->getIdTokenTokenResponseType();
+ }
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'enforce_redirect auth_code_lifetime')));
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException('Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when "use_openid_connect" is true');
+ }
+ $responseTypes['code'] = new OpenIDAuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ $responseTypes['code id_token'] = new CodeIdToken($responseTypes['code'], $responseTypes['id_token']);
+ } else {
+ $responseTypes['code'] = new AuthorizationCodeResponseType($this->storages['authorization_code'], $config);
+ }
+ }
+
+ if (count($responseTypes) == 0) {
+ throw new \LogicException('You must supply an array of response_types in the constructor or implement a OAuth2\Storage\AuthorizationCodeInterface storage object or set "allow_implicit" to true and implement a OAuth2\Storage\AccessTokenInterface storage object');
+ }
+
+ return $responseTypes;
+ }
+
+ protected function getDefaultGrantTypes()
+ {
+ $grantTypes = array();
+
+ if (isset($this->storages['user_credentials'])) {
+ $grantTypes['password'] = new UserCredentials($this->storages['user_credentials']);
+ }
+
+ if (isset($this->storages['client_credentials'])) {
+ $config = array_intersect_key($this->config, array('allow_credentials_in_request_body' => ''));
+ $grantTypes['client_credentials'] = new ClientCredentials($this->storages['client_credentials'], $config);
+ }
+
+ if (isset($this->storages['refresh_token'])) {
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'always_issue_new_refresh_token unset_refresh_token_after_use')));
+ $grantTypes['refresh_token'] = new RefreshToken($this->storages['refresh_token'], $config);
+ }
+
+ if (isset($this->storages['authorization_code'])) {
+ if ($this->config['use_openid_connect']) {
+ if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
+ throw new \LogicException('Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when "use_openid_connect" is true');
+ }
+ $grantTypes['authorization_code'] = new OpenIDAuthorizationCodeGrantType($this->storages['authorization_code']);
+ } else {
+ $grantTypes['authorization_code'] = new AuthorizationCode($this->storages['authorization_code']);
+ }
+ }
+
+ if (count($grantTypes) == 0) {
+ throw new \LogicException('Unable to build default grant types - You must supply an array of grant_types in the constructor');
+ }
+
+ return $grantTypes;
+ }
+
+ protected function getAccessTokenResponseType()
+ {
+ if (isset($this->responseTypes['token'])) {
+ return $this->responseTypes['token'];
+ }
+
+ if ($this->config['use_jwt_access_tokens']) {
+ return $this->createDefaultJwtAccessTokenResponseType();
+ }
+
+ return $this->createDefaultAccessTokenResponseType();
+ }
+
+ protected function getIdTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token'])) {
+ return $this->responseTypes['id_token'];
+ }
+
+ return $this->createDefaultIdTokenResponseType();
+ }
+
+ protected function getIdTokenTokenResponseType()
+ {
+ if (isset($this->responseTypes['id_token token'])) {
+ return $this->responseTypes['id_token token'];
+ }
+
+ return $this->createDefaultIdTokenTokenResponseType();
+ }
+
+ /**
+ * For Resource Controller
+ */
+ protected function createDefaultJwtAccessTokenStorage()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens');
+ }
+ $tokenStorage = null;
+ if (!empty($this->config['store_encrypted_token_string']) && isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+ // wrap the access token storage as required.
+ return new JwtAccessTokenStorage($this->storages['public_key'], $tokenStorage);
+ }
+
+ /**
+ * For Authorize and Token Controllers
+ */
+ protected function createDefaultJwtAccessTokenResponseType()
+ {
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens');
+ }
+
+ $tokenStorage = null;
+ if (isset($this->storages['access_token'])) {
+ $tokenStorage = $this->storages['access_token'];
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'store_encrypted_token_string issuer access_lifetime refresh_token_lifetime')));
+
+ return new JwtAccessToken($this->storages['public_key'], $tokenStorage, $refreshStorage, $config);
+ }
+
+ protected function createDefaultAccessTokenResponseType()
+ {
+ if (!isset($this->storages['access_token'])) {
+ throw new \LogicException('You must supply a response type implementing OAuth2\ResponseType\AccessTokenInterface, or a storage object implementing OAuth2\Storage\AccessTokenInterface to use the token server');
+ }
+
+ $refreshStorage = null;
+ if (isset($this->storages['refresh_token'])) {
+ $refreshStorage = $this->storages['refresh_token'];
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'access_lifetime refresh_token_lifetime')));
+ $config['token_type'] = $this->tokenType ? $this->tokenType->getTokenType() : $this->getDefaultTokenType()->getTokenType();
+
+ return new AccessToken($this->storages['access_token'], $refreshStorage, $config);
+ }
+
+ protected function createDefaultIdTokenResponseType()
+ {
+ if (!isset($this->storages['user_claims'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use openid connect');
+ }
+ if (!isset($this->storages['public_key'])) {
+ throw new \LogicException('You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use openid connect');
+ }
+
+ $config = array_intersect_key($this->config, array_flip(explode(' ', 'issuer id_lifetime')));
+
+ return new IdToken($this->storages['user_claims'], $this->storages['public_key'], $config);
+ }
+
+ protected function createDefaultIdTokenTokenResponseType()
+ {
+ return new IdTokenToken($this->getAccessTokenResponseType(), $this->getIdTokenResponseType());
+ }
+
+ protected function validateOpenIdConnect()
+ {
+ $authCodeGrant = $this->getGrantType('authorization_code');
+ if (!empty($authCodeGrant) && !$authCodeGrant instanceof OpenIDAuthorizationCodeGrantType) {
+ throw new \InvalidArgumentException('You have enabled OpenID Connect, but supplied a grant type that does not support it.');
+ }
+ }
+
+ protected function normalizeResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ if (!empty($name) && false !== strpos($name, ' ')) {
+ $types = explode(' ', $name);
+ sort($types);
+ $name = implode(' ', $types);
+ }
+
+ return $name;
+ }
+
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ public function getStorages()
+ {
+ return $this->storages;
+ }
+
+ public function getStorage($name)
+ {
+ return isset($this->storages[$name]) ? $this->storages[$name] : null;
+ }
+
+ public function getGrantTypes()
+ {
+ return $this->grantTypes;
+ }
+
+ public function getGrantType($name)
+ {
+ return isset($this->grantTypes[$name]) ? $this->grantTypes[$name] : null;
+ }
+
+ public function getResponseTypes()
+ {
+ return $this->responseTypes;
+ }
+
+ public function getResponseType($name)
+ {
+ // for multiple-valued response types - make them alphabetical
+ $name = $this->normalizeResponseType($name);
+
+ return isset($this->responseTypes[$name]) ? $this->responseTypes[$name] : null;
+ }
+
+ public function getTokenType()
+ {
+ return $this->tokenType;
+ }
+
+ public function getClientAssertionType()
+ {
+ return $this->clientAssertionType;
+ }
+
+ public function setConfig($name, $value)
+ {
+ $this->config[$name] = $value;
+ }
+
+ public function getConfig($name, $default = null)
+ {
+ return isset($this->config[$name]) ? $this->config[$name] : $default;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php
new file mode 100644
index 000000000..1819158af
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save access tokens
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AccessTokenInterface
+{
+ /**
+ * Look up the supplied oauth_token from storage.
+ *
+ * We need to retrieve access token data as we create and verify tokens.
+ *
+ * @param $oauth_token
+ * oauth_token to be check with.
+ *
+ * @return
+ * An associative array as below, and return NULL if the supplied oauth_token
+ * is invalid:
+ * - expires: Stored expiration in unix timestamp.
+ * - client_id: (optional) Stored client identifier.
+ * - user_id: (optional) Stored user identifier.
+ * - scope: (optional) Stored scope values in space-separated string.
+ * - id_token: (optional) Stored id_token (if "use_openid_connect" is true).
+ *
+ * @ingroup oauth2_section_7
+ */
+ public function getAccessToken($oauth_token);
+
+ /**
+ * Store the supplied access token values to storage.
+ *
+ * We need to store access token data as we create and verify tokens.
+ *
+ * @param $oauth_token oauth_token to be stored.
+ * @param $client_id client identifier to be stored.
+ * @param $user_id user identifier to be stored.
+ * @param int $expires expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire an access token.
+ *
+ * This is not explicitly required in the spec, but if defined in a draft RFC for token
+ * revoking (RFC 7009) https://tools.ietf.org/html/rfc7009
+ *
+ * @param $access_token
+ * Access token to be expired.
+ *
+ * @return BOOL true if an access token was unset, false if not
+ * @ingroup oauth2_section_6
+ *
+ * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
+ */
+ //public function unsetAccessToken($access_token);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php
new file mode 100644
index 000000000..edc7c70e5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save authorization codes for the "Authorization Code"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface AuthorizationCodeInterface
+{
+ /**
+ * The Authorization Code grant type supports a response type of "code".
+ *
+ * @var string
+ * @see http://tools.ietf.org/html/rfc6749#section-1.4.1
+ * @see http://tools.ietf.org/html/rfc6749#section-4.2
+ */
+ const RESPONSE_TYPE_CODE = "code";
+
+ /**
+ * Fetch authorization code data (probably the most common grant type).
+ *
+ * Retrieve the stored data for the given authorization code.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param $code
+ * Authorization code to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the code is invalid
+ * @code
+ * return array(
+ * "client_id" => CLIENT_ID, // REQUIRED Stored client identifier
+ * "user_id" => USER_ID, // REQUIRED Stored user identifier
+ * "expires" => EXPIRES, // REQUIRED Stored expiration in unix timestamp
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED Stored redirect URI
+ * "scope" => SCOPE, // OPTIONAL Stored scope values in space-separated string
+ * );
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getAuthorizationCode($code);
+
+ /**
+ * Take the provided authorization code values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getAuthCode().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
+ *
+ * @param string $code Authorization code to be stored.
+ * @param mixed $client_id Client identifier to be stored.
+ * @param mixed $user_id User identifier to be stored.
+ * @param string $redirect_uri Redirect URI(s) to be stored in a space-separated string.
+ * @param int $expires Expiration to be stored as a Unix timestamp.
+ * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null);
+
+ /**
+ * once an Authorization Code is used, it must be expired
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.2
+ *
+ * The client MUST NOT use the authorization code
+ * more than once. If an authorization code is used more than
+ * once, the authorization server MUST deny the request and SHOULD
+ * revoke (when possible) all tokens previously issued based on
+ * that authorization code
+ *
+ */
+ public function expireAuthorizationCode($code);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php
new file mode 100644
index 000000000..c5048c08d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php
@@ -0,0 +1,480 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use phpcassa\ColumnFamily;
+use phpcassa\ColumnSlice;
+use phpcassa\Connection\ConnectionPool;
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Cassandra storage for all storage types
+ *
+ * To use, install "thobbs/phpcassa" via composer
+ * <code>
+ * composer require thobbs/phpcassa:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the
+ * <code>
+ * $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_server', array('127.0.0.1:9160'));
+ * </code>
+ *
+ * Then, register the storage client:
+ * <code>
+ * $storage = new OAuth2\Storage\Cassandra($cassandra);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ *
+ * @see test/lib/OAuth2/Storage/Bootstrap::getCassandraStorage
+ */
+class Cassandra implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The cassandra client */
+ protected $cassandra;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Cassandra Storage! uses phpCassa
+ *
+ * @param \phpcassa\ConnectionPool $cassandra
+ * @param array $config
+ */
+ public function __construct($connection = array(), array $config = array())
+ {
+ if ($connection instanceof ConnectionPool) {
+ $this->cassandra = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Cassandra must be an instance of phpcassa\Connection\ConnectionPool or a configuration array');
+ }
+ $connection = array_merge(array(
+ 'keyspace' => 'oauth2',
+ 'servers' => null,
+ ), $connection);
+
+ $this->cassandra = new ConnectionPool($connection['keyspace'], $connection['servers']);
+ }
+
+ $this->config = array_merge(array(
+ // cassandra config
+ 'column_family' => 'auth',
+
+ // key names
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ 'public_key_key' => 'oauth_public_keys:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if (isset($this->cache[$key])) {
+ return $this->cache[$key];
+ }
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ try {
+ $value = $cf->get($key, new ColumnSlice("", ""));
+ $value = array_shift($value);
+ } catch (\cassandra\NotFoundException $e) {
+ return false;
+ }
+
+ return json_decode($value, true);
+ }
+
+ protected function setValue($key, $value, $expire = 0)
+ {
+ $this->cache[$key] = $value;
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ $str = json_encode($value);
+ if ($expire > 0) {
+ try {
+ $seconds = $expire - time();
+ // __data key set as C* requires a field, note: max TTL can only be 630720000 seconds
+ $cf->insert($key, array('__data' => $str), null, $seconds);
+ } catch (\Exception $e) {
+ return false;
+ }
+ } else {
+ try {
+ // __data key set as C* requires a field
+ $cf->insert($key, array('__data' => $str));
+ } catch (\Exception $e) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
+
+ if ($cf->get_count($key) > 0) {
+ try {
+ // __data key set as C* requires a field
+ $cf->remove($key, array('__data'));
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ $password = $this->hashPassword($password);
+
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ return $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ return $this->expireValue($this->config['access_token_key'] . $access_token);
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject ) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ /*ScopeInterface */
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('getJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs cassandra implementation.
+ throw new \Exception('setJti() for the Cassandra driver is currently unimplemented.');
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = '')
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+ $public_key = $this->getValue($this->config['public_key_key']);
+ if (is_array($public_key)) {
+ return $public_key['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ $userDetails = $this->getUserDetails($user_id);
+ if (!is_array($userDetails)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php
new file mode 100644
index 000000000..3318c6966
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify how the OAuth2 Server
+ * should verify client credentials
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientCredentialsInterface extends ClientInterface
+{
+
+ /**
+ * Make sure that the client credentials is valid.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $client_secret
+ * (optional) If a secret is required, check that they've given the right one.
+ *
+ * @return
+ * TRUE if the client credentials are valid, and MUST return FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-3.1
+ *
+ * @ingroup oauth2_section_3
+ */
+ public function checkClientCredentials($client_id, $client_secret = null);
+
+ /**
+ * Determine if the client is a "public" client, and therefore
+ * does not require passing credentials for certain grant types
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return
+ * TRUE if the client is public, and FALSE if it isn't.
+ * @endcode
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-2.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/257
+ *
+ * @ingroup oauth2_section_2
+ */
+ public function isPublicClient($client_id);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php
new file mode 100644
index 000000000..09a5bffc1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve client information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ClientInterface
+{
+ /**
+ * Get client details corresponding client_id.
+ *
+ * OAuth says we should store request URIs for each registered client.
+ * Implement this function to grab the stored URI for a given client id.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ *
+ * @return array
+ * Client details. The only mandatory key in the array is "redirect_uri".
+ * This function MUST return FALSE if the given client does not exist or is
+ * invalid. "redirect_uri" can be space-delimited to allow for multiple valid uris.
+ * <code>
+ * return array(
+ * "redirect_uri" => REDIRECT_URI, // REQUIRED redirect_uri registered for the client
+ * "client_id" => CLIENT_ID, // OPTIONAL the client id
+ * "grant_types" => GRANT_TYPES, // OPTIONAL an array of restricted grant types
+ * "user_id" => USER_ID, // OPTIONAL the user identifier associated with this client
+ * "scope" => SCOPE, // OPTIONAL the scopes allowed for this client
+ * );
+ * </code>
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function getClientDetails($client_id);
+
+ /**
+ * Get the scope associated with this client
+ *
+ * @return
+ * STRING the space-delineated scope list for the specified client_id
+ */
+ public function getClientScope($client_id);
+
+ /**
+ * Check restricted grant types of corresponding client identifier.
+ *
+ * If you want to restrict clients to certain grant types, override this
+ * function.
+ *
+ * @param $client_id
+ * Client identifier to be check with.
+ * @param $grant_type
+ * Grant type to be check with
+ *
+ * @return
+ * TRUE if the grant type is supported by this client identifier, and
+ * FALSE if it isn't.
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkRestrictedGrantType($client_id, $grant_type);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php
new file mode 100755
index 000000000..1eb55f027
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple Couchbase storage for all storage types
+ *
+ * This class should be extended or overridden as required
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Tom Park <tom@raucter.com>
+ */
+class CouchbaseDB implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \Couchbase) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection) || !is_array($connection['servers'])) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\CouchbaseDB must be an instance of Couchbase or a configuration array containing a server array');
+ }
+
+ $this->db = new \Couchbase($connection['servers'], (!isset($connection['username'])) ? '' : $connection['username'], (!isset($connection['password'])) ? '' : $connection['password'], $connection['bucket'], false);
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access couchbase item by type:
+ protected function getObjectByType($name,$id)
+ {
+ return json_decode($this->db->get($this->config[$name].'-'.$id),true);
+ }
+
+ // Helper function to set couchbase item by type:
+ protected function setObjectByType($name,$id,$array)
+ {
+ $array['type'] = $name;
+
+ return $this->db->set($this->config[$name].'-'.$id,json_encode($array));
+ }
+
+ // Helper function to delete couchbase item by type, wait for persist to at least 1 node
+ protected function deleteObjectByType($name,$id)
+ {
+ $this->db->delete($this->config[$name].'-'.$id,"",1);
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->getObjectByType('client_table',$client_id)) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->getObjectByType('client_table',$client_id)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->getObjectByType('client_table',$client_id);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ } else {
+ $this->setObjectByType('client_table',$client_id, array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ));
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->getObjectByType('access_token_table',$access_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ } else {
+ $this->setObjectByType('access_token_table',$access_token, array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ));
+ }
+
+ return true;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->getObjectByType('code_table',$code);
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->setObjectByType('code_table',$code, array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ } else {
+ $this->setObjectByType('code_table',$code,array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ));
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->deleteObjectByType('code_table',$code);
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->getObjectByType('refresh_token_table',$refresh_token);
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->setObjectByType('refresh_token_table',$refresh_token, array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $this->deleteObjectByType('refresh_token_table',$refresh_token);
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->getObjectByType('user_table',$username);
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ } else {
+ $this->setObjectByType('user_table',$username, array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ));
+
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getObjectByType('jwt_table',$client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('getJti() for the Couchbase driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs couchbase implementation.
+ throw new \Exception('setJti() for the Couchbase driver is currently unimplemented.');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php
new file mode 100644
index 000000000..8347ab258
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use Aws\DynamoDb\DynamoDbClient;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+/**
+ * DynamoDB storage for all storage types
+ *
+ * To use, install "aws/aws-sdk-php" via composer
+ * <code>
+ * composer require aws/aws-sdk-php:dev-master
+ * </code>
+ *
+ * Once this is done, instantiate the DynamoDB client
+ * <code>
+ * $storage = new OAuth2\Storage\Dynamodb(array("key" => "YOURKEY", "secret" => "YOURSECRET", "region" => "YOURREGION"));
+ * </code>
+ *
+ * Table :
+ * - oauth_access_tokens (primary hash key : access_token)
+ * - oauth_authorization_codes (primary hash key : authorization_code)
+ * - oauth_clients (primary hash key : client_id)
+ * - oauth_jwt (primary hash key : client_id, primary range key : subject)
+ * - oauth_public_keys (primary hash key : client_id)
+ * - oauth_refresh_tokens (primary hash key : refresh_token)
+ * - oauth_scopes (primary hash key : scope, secondary index : is_default-index hash key is_default)
+ * - oauth_users (primary hash key : username)
+ *
+ * @author Frederic AUGUSTE <frederic.auguste at gmail dot com>
+ */
+class DynamoDB implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $client;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!($connection instanceof DynamoDbClient)) {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ if (!array_key_exists("key",$connection) || !array_key_exists("secret",$connection) || !array_key_exists("region",$connection) ) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
+ }
+ $this->client = DynamoDbClient::factory(array(
+ 'key' => $connection["key"],
+ 'secret' => $connection["secret"],
+ 'region' =>$connection["region"]
+ ));
+ } else {
+ $this->client = $connection;
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ return $result->count()==1 && $result["Item"]["client_secret"]["S"] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+
+ if ($result->count()==0) {
+ return false ;
+ }
+
+ return empty($result["Item"]["client_secret"]);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['client_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $result = $this->dynamo2array($result);
+ foreach (array('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id') as $key => $val) {
+ if (!array_key_exists ($val, $result)) {
+ $result[$val] = null;
+ }
+ }
+
+ return $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $clientData = compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['client_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['access_token_table'],
+ "Key" => array('access_token' => array('S' => $access_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (array_key_exists ('expires', $token)) {
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('access_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['access_token_table'],
+ 'Key' => $this->client->formatAttributes(array("access_token" => $access_token)),
+ 'ReturnValues' => 'ALL_OLD',
+ ));
+
+ return null !== $result->get('Attributes');
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['code_table'],
+ "Key" => array('authorization_code' => array('S' => $code))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ if (!array_key_exists("id_token", $token )) {
+ $token['id_token'] = null;
+ }
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'id_token', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['code_table'],
+ 'Key' => $this->client->formatAttributes(array("authorization_code" => $code))
+ ));
+
+ return true;
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ if ($value == 'email_verified') {
+ $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
+ } else {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['refresh_token_table'],
+ "Key" => array('refresh_token' => array('S' => $refresh_token))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['expires'] = strtotime($token['expires']);
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $clientData = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->client->deleteItem(array(
+ 'TableName' => $this->config['refresh_token_table'],
+ 'Key' => $this->client->formatAttributes(array("refresh_token" => $refresh_token))
+ ));
+
+ return true;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['user_table'],
+ "Key" => array('username' => array('S' => $username))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+ $token['user_id'] = $username;
+
+ return $token;
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ $clientData = compact('username', 'password', 'first_name', 'last_name');
+ $clientData = array_filter($clientData, 'self::isNotEmpty');
+
+ $result = $this->client->putItem(array(
+ 'TableName' => $this->config['user_table'],
+ 'Item' => $this->client->formatAttributes($clientData)
+ ));
+
+ return true;
+
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $scope_query = array();
+ $count = 0;
+ foreach ($scope as $key => $val) {
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'Select' => 'COUNT',
+ 'KeyConditions' => array(
+ 'scope' => array(
+ 'AttributeValueList' => array(array('S' => $val)),
+ 'ComparisonOperator' => 'EQ'
+ )
+ )
+ ));
+ $count += $result['Count'];
+ }
+
+ return $count == count($scope);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+
+ $result = $this->client->query(array(
+ 'TableName' => $this->config['scope_table'],
+ 'IndexName' => 'is_default-index',
+ 'Select' => 'ALL_ATTRIBUTES',
+ 'KeyConditions' => array(
+ 'is_default' => array(
+ 'AttributeValueList' => array(array('S' => 'true')),
+ 'ComparisonOperator' => 'EQ',
+ ),
+ )
+ ));
+ $defaultScope = array();
+ if ($result->count() > 0) {
+ $array = $result->toArray();
+ foreach ($array["Items"] as $item) {
+ $defaultScope[] = $item['scope']['S'];
+ }
+
+ return empty($defaultScope) ? null : implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['jwt_table'],
+ "Key" => array('client_id' => array('S' => $client_id), 'subject' => array('S' => $subject))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO not use.
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = '0')
+ {
+
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['public_key'];
+
+ }
+
+ public function getPrivateKey($client_id = '0')
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return false ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $result = $this->client->getItem(array(
+ "TableName"=> $this->config['public_key_table'],
+ "Key" => array('client_id' => array('S' => $client_id))
+ ));
+ if ($result->count()==0) {
+ return 'RS256' ;
+ }
+ $token = $this->dynamo2array($result);
+
+ return $token['encryption_algorithm'];
+ }
+
+ /**
+ * Transform dynamodb resultset to an array.
+ * @param $dynamodbResult
+ * @return $array
+ */
+ private function dynamo2array($dynamodbResult)
+ {
+ $result = array();
+ foreach ($dynamodbResult["Item"] as $key => $val) {
+ $result[$key] = $val["S"];
+ $result[] = $val["S"];
+ }
+
+ return $result;
+ }
+
+ private static function isNotEmpty($value)
+ {
+ return null !== $value && '' !== $value;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php
new file mode 100644
index 000000000..75b49d301
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\EncryptionInterface;
+use OAuth2\Encryption\Jwt;
+
+/**
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class JwtAccessToken implements JwtAccessTokenInterface
+{
+ protected $publicKeyStorage;
+ protected $tokenStorage;
+ protected $encryptionUtil;
+
+ /**
+ * @param OAuth2\Encryption\PublicKeyInterface $publicKeyStorage the public key encryption to use
+ * @param OAuth2\Storage\AccessTokenInterface $tokenStorage OPTIONAL persist the access token to another storage. This is useful if
+ * you want to retain access token grant information somewhere, but
+ * is not necessary when using this grant type.
+ * @param OAuth2\Encryption\EncryptionInterface $encryptionUtil OPTIONAL class to use for "encode" and "decode" functions.
+ */
+ public function __construct(PublicKeyInterface $publicKeyStorage, AccessTokenInterface $tokenStorage = null, EncryptionInterface $encryptionUtil = null)
+ {
+ $this->publicKeyStorage = $publicKeyStorage;
+ $this->tokenStorage = $tokenStorage;
+ if (is_null($encryptionUtil)) {
+ $encryptionUtil = new Jwt;
+ }
+ $this->encryptionUtil = $encryptionUtil;
+ }
+
+ public function getAccessToken($oauth_token)
+ {
+ // just decode the token, don't verify
+ if (!$tokenData = $this->encryptionUtil->decode($oauth_token, null, false)) {
+ return false;
+ }
+
+ $client_id = isset($tokenData['aud']) ? $tokenData['aud'] : null;
+ $public_key = $this->publicKeyStorage->getPublicKey($client_id);
+ $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
+
+ // now that we have the client_id, verify the token
+ if (false === $this->encryptionUtil->decode($oauth_token, $public_key, array($algorithm))) {
+ return false;
+ }
+
+ // normalize the JWT claims to the format expected by other components in this library
+ return $this->convertJwtToOAuth2($tokenData);
+ }
+
+ public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope);
+ }
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if ($this->tokenStorage) {
+ return $this->tokenStorage->unsetAccessToken($access_token);
+ }
+ }
+
+
+ // converts a JWT access token into an OAuth2-friendly format
+ protected function convertJwtToOAuth2($tokenData)
+ {
+ $keyMapping = array(
+ 'aud' => 'client_id',
+ 'exp' => 'expires',
+ 'sub' => 'user_id'
+ );
+
+ foreach ($keyMapping as $jwtKey => $oauth2Key) {
+ if (isset($tokenData[$jwtKey])) {
+ $tokenData[$oauth2Key] = $tokenData[$jwtKey];
+ unset($tokenData[$jwtKey]);
+ }
+ }
+
+ return $tokenData;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php
new file mode 100644
index 000000000..3abb2aa2d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * No specific methods, but allows the library to check "instanceof"
+ * against interface rather than class
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtAccessTokenInterface extends AccessTokenInterface
+{
+
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php
new file mode 100644
index 000000000..c83aa72ea
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get the JWT key for clients
+ *
+ * @TODO consider extending ClientInterface, as this will almost always
+ * be the same storage as retrieving clientData
+ *
+ * @author F21
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface JwtBearerInterface
+{
+ /**
+ * Get the public key associated with a client_id
+ *
+ * @param $client_id
+ * Client identifier to be checked with.
+ *
+ * @return
+ * STRING Return the public key for the client_id if it exists, and MUST return FALSE if it doesn't.
+ */
+ public function getClientKey($client_id, $subject);
+
+ /**
+ * Get a jti (JSON token identifier) by matching against the client_id, subject, audience and expiration.
+ *
+ * @param $client_id
+ * Client identifier to match.
+ *
+ * @param $subject
+ * The subject to match.
+ *
+ * @param $audience
+ * The audience to match.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to match.
+ *
+ * @return
+ * An associative array as below, and return NULL if the jti does not exist.
+ * - issuer: Stored client identifier.
+ * - subject: Stored subject.
+ * - audience: Stored audience.
+ * - expires: Stored expiration in unix timestamp.
+ * - jti: The stored jti.
+ */
+ public function getJti($client_id, $subject, $audience, $expiration, $jti);
+
+ /**
+ * Store a used jti so that we can check against it to prevent replay attacks.
+ * @param $client_id
+ * Client identifier to insert.
+ *
+ * @param $subject
+ * The subject to insert.
+ *
+ * @param $audience
+ * The audience to insert.
+ *
+ * @param $expiration
+ * The expiration of the jti.
+ *
+ * @param $jti
+ * The jti to insert.
+ */
+ public function setJti($client_id, $subject, $audience, $expiration, $jti);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php
new file mode 100644
index 000000000..42d833ccb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php
@@ -0,0 +1,381 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple in-memory storage for all storage types
+ *
+ * NOTE: This class should never be used in production, and is
+ * a stub class for example use only
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Memory implements AuthorizationCodeInterface,
+ UserCredentialsInterface,
+ UserClaimsInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ public $authorizationCodes;
+ public $userCredentials;
+ public $clientCredentials;
+ public $refreshTokens;
+ public $accessTokens;
+ public $jwt;
+ public $jti;
+ public $supportedScopes;
+ public $defaultScope;
+ public $keys;
+
+ public function __construct($params = array())
+ {
+ $params = array_merge(array(
+ 'authorization_codes' => array(),
+ 'user_credentials' => array(),
+ 'client_credentials' => array(),
+ 'refresh_tokens' => array(),
+ 'access_tokens' => array(),
+ 'jwt' => array(),
+ 'jti' => array(),
+ 'default_scope' => null,
+ 'supported_scopes' => array(),
+ 'keys' => array(),
+ ), $params);
+
+ $this->authorizationCodes = $params['authorization_codes'];
+ $this->userCredentials = $params['user_credentials'];
+ $this->clientCredentials = $params['client_credentials'];
+ $this->refreshTokens = $params['refresh_tokens'];
+ $this->accessTokens = $params['access_tokens'];
+ $this->jwt = $params['jwt'];
+ $this->jti = $params['jti'];
+ $this->supportedScopes = $params['supported_scopes'];
+ $this->defaultScope = $params['default_scope'];
+ $this->keys = $params['keys'];
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ if (!isset($this->authorizationCodes[$code])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'authorization_code' => $code,
+ ), $this->authorizationCodes[$code]);
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ $this->authorizationCodes[$code] = compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function setAuthorizationCodes($authorization_codes)
+ {
+ $this->authorizationCodes = $authorization_codes;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ unset($this->authorizationCodes[$code]);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $userDetails = $this->getUserDetails($username);
+
+ return $userDetails && $userDetails['password'] && $userDetails['password'] === $password;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ $this->userCredentials[$username] = array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName,
+ );
+
+ return true;
+ }
+
+ public function getUserDetails($username)
+ {
+ if (!isset($this->userCredentials[$username])) {
+ return false;
+ }
+
+ return array_merge(array(
+ 'user_id' => $username,
+ 'password' => null,
+ 'first_name' => null,
+ 'last_name' => null,
+ ), $this->userCredentials[$username]);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ return isset($this->clientCredentials[$client_id]['client_secret']) && $this->clientCredentials[$client_id]['client_secret'] === $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ return empty($this->clientCredentials[$client_id]['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ if (!isset($this->clientCredentials[$client_id])) {
+ return false;
+ }
+
+ $clientDetails = array_merge(array(
+ 'client_id' => $client_id,
+ 'client_secret' => null,
+ 'redirect_uri' => null,
+ 'scope' => null,
+ ), $this->clientCredentials[$client_id]);
+
+ return $clientDetails;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ if (isset($this->clientCredentials[$client_id]['grant_types'])) {
+ $grant_types = explode(' ', $this->clientCredentials[$client_id]['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ $this->clientCredentials[$client_id] = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return isset($this->refreshTokens[$refresh_token]) ? $this->refreshTokens[$refresh_token] : false;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $this->refreshTokens[$refresh_token] = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ if (isset($this->refreshTokens[$refresh_token])) {
+ unset($this->refreshTokens[$refresh_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function setRefreshTokens($refresh_tokens)
+ {
+ $this->refreshTokens = $refresh_tokens;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return isset($this->accessTokens[$access_token]) ? $this->accessTokens[$access_token] : false;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null, $id_token = null)
+ {
+ $this->accessTokens[$access_token] = compact('access_token', 'client_id', 'user_id', 'expires', 'scope', 'id_token');
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ if (isset($this->accessTokens[$access_token])) {
+ unset($this->accessTokens[$access_token]);
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', trim($scope));
+
+ return (count(array_diff($scope, $this->supportedScopes)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ return $this->defaultScope;
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (isset($this->jwt[$client_id])) {
+ $jwt = $this->jwt[$client_id];
+ if ($jwt) {
+ if ($jwt["subject"] == $subject) {
+ return $jwt["key"];
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ foreach ($this->jti as $storedJti) {
+ if ($storedJti['issuer'] == $client_id && $storedJti['subject'] == $subject && $storedJti['audience'] == $audience && $storedJti['expires'] == $expires && $storedJti['jti'] == $jti) {
+ return array(
+ 'issuer' => $storedJti['issuer'],
+ 'subject' => $storedJti['subject'],
+ 'audience' => $storedJti['audience'],
+ 'expires' => $storedJti['expires'],
+ 'jti' => $storedJti['jti']
+ );
+ }
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $this->jti[] = array('issuer' => $client_id, 'subject' => $subject, 'audience' => $audience, 'expires' => $expires, 'jti' => $jti);
+ }
+
+ /*PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['public_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['public_key'])) {
+ return $this->keys['public_key'];
+ }
+
+ return false;
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if (isset($this->keys[$client_id])) {
+ return $this->keys[$client_id]['private_key'];
+ }
+
+ // use a global encryption pair
+ if (isset($this->keys['private_key'])) {
+ return $this->keys['private_key'];
+ }
+
+ return false;
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if (isset($this->keys[$client_id]['encryption_algorithm'])) {
+ return $this->keys[$client_id]['encryption_algorithm'];
+ }
+
+ // use a global encryption algorithm
+ if (isset($this->keys['encryption_algorithm'])) {
+ return $this->keys['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php
new file mode 100644
index 000000000..eea06e315
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php
@@ -0,0 +1,392 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple MongoDB storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Julien Chaumond <chaumond@gmail.com>
+ */
+class Mongo implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof \MongoDB) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB or a configuration array');
+ }
+ $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
+ $m = new \MongoClient($server);
+ $this->db = $m->{$connection['database']};
+ }
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'key_table' => 'oauth_keys',
+ 'jwt_table' => 'oauth_jwt',
+ ), $config);
+ }
+
+ // Helper function to access a MongoDB collection by `type`:
+ protected function collection($name)
+ {
+ return $this->db->{$this->config[$name]};
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return $result['client_secret'] == $client_secret;
+ }
+
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+ $this->collection('client_table')->update(
+ array('client_id' => $client_id),
+ array('$set' => array(
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ))
+ );
+ } else {
+ $client = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+ $this->collection('client_table')->insert($client);
+ }
+
+ return true;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $this->collection('access_token_table')->update(
+ array('access_token' => $access_token),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ))
+ );
+ } else {
+ $token = array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ );
+ $this->collection('access_token_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->collection('access_token_table')->remove(array(
+ 'access_token' => $access_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->collection('code_table')->findOne(array('authorization_code' => $code));
+
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $this->collection('code_table')->update(
+ array('authorization_code' => $code),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ))
+ );
+ } else {
+ $token = array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ );
+ $this->collection('code_table')->insert($token);
+ }
+
+ return true;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $this->collection('code_table')->remove(array('authorization_code' => $code));
+
+ return true;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->collection('refresh_token_table')->findOne(array('refresh_token' => $refresh_token));
+
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $token = array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ );
+ $this->collection('refresh_token_table')->insert($token);
+
+ return true;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->collection('refresh_token_table')->remove(array(
+ 'refresh_token' => $refresh_token
+ ), array('w' => 1));
+
+ return $result['n'] > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->collection('user_table')->findOne(array('username' => $username));
+
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $this->collection('user_table')->update(
+ array('username' => $username),
+ array('$set' => array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ))
+ );
+ } else {
+ $user = array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ );
+ $this->collection('user_table')->insert($user);
+ }
+
+ return true;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->collection('jwt_table')->findOne(array(
+ 'client_id' => $client_id,
+ 'subject' => $subject
+ ));
+
+ return is_null($result) ? false : $result['key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function getPublicKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['public_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['public_key'];
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['private_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['encryption_algorithm'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? 'RS256' : $result['encryption_algorithm'];
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php
new file mode 100644
index 000000000..64f740fc1
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php
@@ -0,0 +1,380 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use MongoDB\Client;
+use MongoDB\Database;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple MongoDB storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Julien Chaumond <chaumond@gmail.com>
+ */
+class MongoDB implements AuthorizationCodeInterface,
+ UserCredentialsInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ PublicKeyInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if ($connection instanceof Database) {
+ $this->db = $connection;
+ } else {
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB\Database or a configuration array');
+ }
+ $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
+ $m = new Client($server);
+ $this->db = $m->selectDatabase($connection['database']);
+ }
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'jti_table' => 'oauth_jti',
+ 'scope_table' => 'oauth_scopes',
+ 'key_table' => 'oauth_keys',
+ ), $config);
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return $result['client_secret'] == $client_secret;
+ }
+ return false;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
+ return false;
+ }
+ return empty($result['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
+ return is_null($result) ? false : $result;
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ if ($this->getClientDetails($client_id)) {
+ $result = $this->collection('client_table')->updateOne(
+ array('client_id' => $client_id),
+ array('$set' => array(
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $client = array(
+ 'client_id' => $client_id,
+ 'client_secret' => $client_secret,
+ 'redirect_uri' => $redirect_uri,
+ 'grant_types' => $grant_types,
+ 'scope' => $scope,
+ 'user_id' => $user_id,
+ );
+ $result = $this->collection('client_table')->insertOne($client);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+ return in_array($grant_type, $grant_types);
+ }
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
+ return is_null($token) ? false : $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $result = $this->collection('access_token_table')->updateOne(
+ array('access_token' => $access_token),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $token = array(
+ 'access_token' => $access_token,
+ 'client_id' => $client_id,
+ 'expires' => $expires,
+ 'user_id' => $user_id,
+ 'scope' => $scope
+ );
+ $result = $this->collection('access_token_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->collection('access_token_table')->deleteOne(array(
+ 'access_token' => $access_token
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $code = $this->collection('code_table')->findOne(array(
+ 'authorization_code' => $code
+ ));
+ return is_null($code) ? false : $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $result = $this->collection('code_table')->updateOne(
+ array('authorization_code' => $code),
+ array('$set' => array(
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ ))
+ );
+ return $result->getMatchedCount() > 0;
+ }
+ $token = array(
+ 'authorization_code' => $code,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'redirect_uri' => $redirect_uri,
+ 'expires' => $expires,
+ 'scope' => $scope,
+ 'id_token' => $id_token,
+ );
+ $result = $this->collection('code_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $result = $this->collection('code_table')->deleteOne(array(
+ 'authorization_code' => $code
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ if ($user = $this->getUser($username)) {
+ $user['user_id'] = $user['username'];
+ }
+ return $user;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $token = $this->collection('refresh_token_table')->findOne(array(
+ 'refresh_token' => $refresh_token
+ ));
+ return is_null($token) ? false : $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ $token = array(
+ 'refresh_token' => $refresh_token,
+ 'client_id' => $client_id,
+ 'user_id' => $user_id,
+ 'expires' => $expires,
+ 'scope' => $scope
+ );
+ $result = $this->collection('refresh_token_table')->insertOne($token);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->collection('refresh_token_table')->deleteOne(array(
+ 'refresh_token' => $refresh_token
+ ));
+ return $result->getDeletedCount() > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $password;
+ }
+
+ public function getUser($username)
+ {
+ $result = $this->collection('user_table')->findOne(array('username' => $username));
+ return is_null($result) ? false : $result;
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ if ($this->getUser($username)) {
+ $result = $this->collection('user_table')->updateOne(
+ array('username' => $username),
+ array('$set' => array(
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ ))
+ );
+
+ return $result->getMatchedCount() > 0;
+ }
+
+ $user = array(
+ 'username' => $username,
+ 'password' => $password,
+ 'first_name' => $firstName,
+ 'last_name' => $lastName
+ );
+ $result = $this->collection('user_table')->insertOne($user);
+ return $result->getInsertedCount() > 0;
+ }
+
+ public function getClientKey($client_id, $subject)
+ {
+ $result = $this->collection('jwt_table')->findOne(array(
+ 'client_id' => $client_id,
+ 'subject' => $subject
+ ));
+ return is_null($result) ? false : $result['key'];
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ //TODO: Needs mongodb implementation.
+ throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
+ }
+
+ public function getPublicKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['public_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['public_key'];
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['private_key'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? false : $result['private_key'];
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ if ($client_id) {
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => $client_id
+ ));
+ if ($result) {
+ return $result['encryption_algorithm'];
+ }
+ }
+
+ $result = $this->collection('key_table')->findOne(array(
+ 'client_id' => null
+ ));
+ return is_null($result) ? 'RS256' : $result['encryption_algorithm'];
+ }
+
+ // Helper function to access a MongoDB collection by `type`:
+ protected function collection($name)
+ {
+ return $this->db->{$this->config[$name]};
+ }
+} \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php
new file mode 100644
index 000000000..ae5107e29
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php
@@ -0,0 +1,553 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\UserClaimsInterface;
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * Simple PDO storage for all storage types
+ *
+ * NOTE: This class is meant to get users started
+ * quickly. If your application requires further
+ * customization, extend this class or create your own.
+ *
+ * NOTE: Passwords are stored in plaintext, which is never
+ * a good idea. Be sure to override this for your application
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+class Pdo implements
+ AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ PublicKeyInterface,
+ UserClaimsInterface,
+ OpenIDAuthorizationCodeInterface
+{
+ protected $db;
+ protected $config;
+
+ public function __construct($connection, $config = array())
+ {
+ if (!$connection instanceof \PDO) {
+ if (is_string($connection)) {
+ $connection = array('dsn' => $connection);
+ }
+ if (!is_array($connection)) {
+ throw new \InvalidArgumentException('First argument to OAuth2\Storage\Pdo must be an instance of PDO, a DSN string, or a configuration array');
+ }
+ if (!isset($connection['dsn'])) {
+ throw new \InvalidArgumentException('configuration array must contain "dsn"');
+ }
+ // merge optional parameters
+ $connection = array_merge(array(
+ 'username' => null,
+ 'password' => null,
+ 'options' => array(),
+ ), $connection);
+ $connection = new \PDO($connection['dsn'], $connection['username'], $connection['password'], $connection['options']);
+ }
+ $this->db = $connection;
+
+ // debugging
+ $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+
+ $this->config = array_merge(array(
+ 'client_table' => 'oauth_clients',
+ 'access_token_table' => 'oauth_access_tokens',
+ 'refresh_token_table' => 'oauth_refresh_tokens',
+ 'code_table' => 'oauth_authorization_codes',
+ 'user_table' => 'oauth_users',
+ 'jwt_table' => 'oauth_jwt',
+ 'jti_table' => 'oauth_jti',
+ 'scope_table' => 'oauth_scopes',
+ 'public_key_table' => 'oauth_public_keys',
+ ), $config);
+ }
+
+ /* OAuth2\Storage\ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+ $result = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ // make this extensible
+ return $result && $result['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ if (!$result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ return empty($result['client_secret']);
+ }
+
+ /* OAuth2\Storage\ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
+ $stmt->execute(compact('client_id'));
+
+ return $stmt->fetch(\PDO::FETCH_ASSOC);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ // if it exists, update it.
+ if ($this->getClientDetails($client_id)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_secret=:client_secret, redirect_uri=:redirect_uri, grant_types=:grant_types, scope=:scope, user_id=:user_id where client_id=:client_id', $this->config['client_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (client_id, client_secret, redirect_uri, grant_types, scope, user_id) VALUES (:client_id, :client_secret, :redirect_uri, :grant_types, :scope, :user_id)', $this->config['client_table']));
+ }
+
+ return $stmt->execute(compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id'));
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* OAuth2\Storage\AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where access_token = :access_token', $this->config['access_token_table']));
+
+ $token = $stmt->execute(compact('access_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAccessToken($access_token)) {
+ $stmt = $this->db->prepare(sprintf('UPDATE %s SET client_id=:client_id, expires=:expires, user_id=:user_id, scope=:scope where access_token=:access_token', $this->config['access_token_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (access_token, client_id, expires, user_id, scope) VALUES (:access_token, :client_id, :expires, :user_id, :scope)', $this->config['access_token_table']));
+ }
+
+ return $stmt->execute(compact('access_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE access_token = :access_token', $this->config['access_token_table']));
+
+ $stmt->execute(compact('access_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ /* OAuth2\Storage\AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * from %s where authorization_code = :code', $this->config['code_table']));
+ $stmt->execute(compact('code'));
+
+ if ($code = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert date string back to timestamp
+ $code['expires'] = strtotime($code['expires']);
+ }
+
+ return $code;
+ }
+
+ public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ if (func_num_args() > 6) {
+ // we are calling with an id token
+ return call_user_func_array(array($this, 'setAuthorizationCodeWithIdToken'), func_get_args());
+ }
+
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope'));
+ }
+
+ private function setAuthorizationCodeWithIdToken($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ // if it exists, update it.
+ if ($this->getAuthorizationCode($code)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope, id_token =:id_token where authorization_code=:code', $this->config['code_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope, id_token) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope, :id_token)', $this->config['code_table']));
+ }
+
+ return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'));
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE authorization_code = :code', $this->config['code_table']));
+
+ return $stmt->execute(compact('code'));
+ }
+
+ /* OAuth2\Storage\UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ if ($user = $this->getUser($username)) {
+ return $this->checkPassword($user, $password);
+ }
+
+ return false;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ /* UserClaimsInterface */
+ public function getUserClaims($user_id, $claims)
+ {
+ if (!$userDetails = $this->getUserDetails($user_id)) {
+ return false;
+ }
+
+ $claims = explode(' ', trim($claims));
+ $userClaims = array();
+
+ // for each requested claim, if the user has the claim, set it in the response
+ $validClaims = explode(' ', self::VALID_CLAIMS);
+ foreach ($validClaims as $validClaim) {
+ if (in_array($validClaim, $claims)) {
+ if ($validClaim == 'address') {
+ // address is an object with subfields
+ $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
+ } else {
+ $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
+ }
+ }
+ }
+
+ return $userClaims;
+ }
+
+ protected function getUserClaim($claim, $userDetails)
+ {
+ $userClaims = array();
+ $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
+ $claimValues = explode(' ', $claimValuesString);
+
+ foreach ($claimValues as $value) {
+ $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
+ }
+
+ return $userClaims;
+ }
+
+ /* OAuth2\Storage\RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT * FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $token = $stmt->execute(compact('refresh_token'));
+ if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ // convert expires to epoch time
+ $token['expires'] = strtotime($token['expires']);
+ }
+
+ return $token;
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ // convert expires to datestring
+ $expires = date('Y-m-d H:i:s', $expires);
+
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (refresh_token, client_id, user_id, expires, scope) VALUES (:refresh_token, :client_id, :user_id, :expires, :scope)', $this->config['refresh_token_table']));
+
+ return $stmt->execute(compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'));
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
+
+ $stmt->execute(compact('refresh_token'));
+
+ return $stmt->rowCount() > 0;
+ }
+
+ // plaintext passwords are bad! Override this for your application
+ protected function checkPassword($user, $password)
+ {
+ return $user['password'] == $this->hashPassword($password);
+ }
+
+ // use a secure hashing algorithm when storing passwords. Override this for your application
+ protected function hashPassword($password)
+ {
+ return sha1($password);
+ }
+
+ public function getUser($username)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * from %s where username=:username', $this->config['user_table']));
+ $stmt->execute(array('username' => $username));
+
+ if (!$userInfo = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $firstName = null, $lastName = null)
+ {
+ // do not store in plaintext
+ $password = $this->hashPassword($password);
+
+ // if it exists, update it.
+ if ($this->getUser($username)) {
+ $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET password=:password, first_name=:firstName, last_name=:lastName where username=:username', $this->config['user_table']));
+ } else {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (username, password, first_name, last_name) VALUES (:username, :password, :firstName, :lastName)', $this->config['user_table']));
+ }
+
+ return $stmt->execute(compact('username', 'password', 'firstName', 'lastName'));
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+ $whereIn = implode(',', array_fill(0, count($scope), '?'));
+ $stmt = $this->db->prepare(sprintf('SELECT count(scope) as count FROM %s WHERE scope IN (%s)', $this->config['scope_table'], $whereIn));
+ $stmt->execute($scope);
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['count'] == count($scope);
+ }
+
+ return false;
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ $stmt = $this->db->prepare(sprintf('SELECT scope FROM %s WHERE is_default=:is_default', $this->config['scope_table']));
+ $stmt->execute(array('is_default' => true));
+
+ if ($result = $stmt->fetchAll(\PDO::FETCH_ASSOC)) {
+ $defaultScope = array_map(function ($row) {
+ return $row['scope'];
+ }, $result);
+
+ return implode(' ', $defaultScope);
+ }
+
+ return null;
+ }
+
+ /* JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key from %s where client_id=:client_id AND subject=:subject', $this->config['jwt_table']));
+
+ $stmt->execute(array('client_id' => $client_id, 'subject' => $subject));
+
+ return $stmt->fetchColumn();
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE issuer=:client_id AND subject=:subject AND audience=:audience AND expires=:expires AND jti=:jti', $this->config['jti_table']));
+
+ $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return array(
+ 'issuer' => $result['issuer'],
+ 'subject' => $result['subject'],
+ 'audience' => $result['audience'],
+ 'expires' => $result['expires'],
+ 'jti' => $result['jti'],
+ );
+ }
+
+ return null;
+ }
+
+ public function setJti($client_id, $subject, $audience, $expires, $jti)
+ {
+ $stmt = $this->db->prepare(sprintf('INSERT INTO %s (issuer, subject, audience, expires, jti) VALUES (:client_id, :subject, :audience, :expires, :jti)', $this->config['jti_table']));
+
+ return $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
+ }
+
+ /* PublicKeyInterface */
+ public function getPublicKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT public_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['public_key'];
+ }
+ }
+
+ public function getPrivateKey($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT private_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['private_key'];
+ }
+ }
+
+ public function getEncryptionAlgorithm($client_id = null)
+ {
+ $stmt = $this->db->prepare($sql = sprintf('SELECT encryption_algorithm FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
+
+ $stmt->execute(compact('client_id'));
+ if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ return $result['encryption_algorithm'];
+ }
+
+ return 'RS256';
+ }
+
+ /**
+ * DDL to create OAuth2 database and tables for PDO storage
+ *
+ * @see https://github.com/dsquier/oauth2-server-php-mysql
+ */
+ public function getBuildSql($dbName = 'oauth2_server_php')
+ {
+ $sql = "
+ CREATE TABLE {$this->config['client_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ client_secret VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ grant_types VARCHAR(80),
+ scope VARCHAR(4000),
+ user_id VARCHAR(80),
+ PRIMARY KEY (client_id)
+ );
+
+ CREATE TABLE {$this->config['access_token_table']} (
+ access_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (access_token)
+ );
+
+ CREATE TABLE {$this->config['code_table']} (
+ authorization_code VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ redirect_uri VARCHAR(2000),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ id_token VARCHAR(1000),
+ PRIMARY KEY (authorization_code)
+ );
+
+ CREATE TABLE {$this->config['refresh_token_table']} (
+ refresh_token VARCHAR(40) NOT NULL,
+ client_id VARCHAR(80) NOT NULL,
+ user_id VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ scope VARCHAR(4000),
+ PRIMARY KEY (refresh_token)
+ );
+
+ CREATE TABLE {$this->config['user_table']} (
+ username VARCHAR(80),
+ password VARCHAR(80),
+ first_name VARCHAR(80),
+ last_name VARCHAR(80),
+ email VARCHAR(80),
+ email_verified BOOLEAN,
+ scope VARCHAR(4000)
+ );
+
+ CREATE TABLE {$this->config['scope_table']} (
+ scope VARCHAR(80) NOT NULL,
+ is_default BOOLEAN,
+ PRIMARY KEY (scope)
+ );
+
+ CREATE TABLE {$this->config['jwt_table']} (
+ client_id VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ public_key VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['jti_table']} (
+ issuer VARCHAR(80) NOT NULL,
+ subject VARCHAR(80),
+ audience VARCHAR(80),
+ expires TIMESTAMP NOT NULL,
+ jti VARCHAR(2000) NOT NULL
+ );
+
+ CREATE TABLE {$this->config['public_key_table']} (
+ client_id VARCHAR(80),
+ public_key VARCHAR(2000),
+ private_key VARCHAR(2000),
+ encryption_algorithm VARCHAR(100) DEFAULT 'RS256'
+ )
+";
+
+ return $sql;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php
new file mode 100644
index 000000000..108418d3a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get public/private key information
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface PublicKeyInterface
+{
+ public function getPublicKey($client_id = null);
+ public function getPrivateKey($client_id = null);
+ public function getEncryptionAlgorithm($client_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php
new file mode 100644
index 000000000..e6294e22d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php
@@ -0,0 +1,321 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
+
+/**
+ * redis storage for all storage types
+ *
+ * To use, install "predis/predis" via composer
+ *
+ * Register client:
+ * <code>
+ * $storage = new OAuth2\Storage\Redis($redis);
+ * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
+ * </code>
+ */
+class Redis implements AuthorizationCodeInterface,
+ AccessTokenInterface,
+ ClientCredentialsInterface,
+ UserCredentialsInterface,
+ RefreshTokenInterface,
+ JwtBearerInterface,
+ ScopeInterface,
+ OpenIDAuthorizationCodeInterface
+{
+
+ private $cache;
+
+ /* The redis client */
+ protected $redis;
+
+ /* Configuration array */
+ protected $config;
+
+ /**
+ * Redis Storage!
+ *
+ * @param \Predis\Client $redis
+ * @param array $config
+ */
+ public function __construct($redis, $config=array())
+ {
+ $this->redis = $redis;
+ $this->config = array_merge(array(
+ 'client_key' => 'oauth_clients:',
+ 'access_token_key' => 'oauth_access_tokens:',
+ 'refresh_token_key' => 'oauth_refresh_tokens:',
+ 'code_key' => 'oauth_authorization_codes:',
+ 'user_key' => 'oauth_users:',
+ 'jwt_key' => 'oauth_jwt:',
+ 'scope_key' => 'oauth_scopes:',
+ ), $config);
+ }
+
+ protected function getValue($key)
+ {
+ if ( isset($this->cache[$key]) ) {
+ return $this->cache[$key];
+ }
+ $value = $this->redis->get($key);
+ if ( isset($value) ) {
+ return json_decode($value, true);
+ } else {
+ return false;
+ }
+ }
+
+ protected function setValue($key, $value, $expire=0)
+ {
+ $this->cache[$key] = $value;
+ $str = json_encode($value);
+ if ($expire > 0) {
+ $seconds = $expire - time();
+ $ret = $this->redis->setex($key, $seconds, $str);
+ } else {
+ $ret = $this->redis->set($key, $str);
+ }
+
+ // check that the key was set properly
+ // if this fails, an exception will usually thrown, so this step isn't strictly necessary
+ return is_bool($ret) ? $ret : $ret->getPayload() == 'OK';
+ }
+
+ protected function expireValue($key)
+ {
+ unset($this->cache[$key]);
+
+ return $this->redis->del($key);
+ }
+
+ /* AuthorizationCodeInterface */
+ public function getAuthorizationCode($code)
+ {
+ return $this->getValue($this->config['code_key'] . $code);
+ }
+
+ public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
+ {
+ return $this->setValue(
+ $this->config['code_key'] . $authorization_code,
+ compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
+ $expires
+ );
+ }
+
+ public function expireAuthorizationCode($code)
+ {
+ $key = $this->config['code_key'] . $code;
+ unset($this->cache[$key]);
+
+ return $this->expireValue($key);
+ }
+
+ /* UserCredentialsInterface */
+ public function checkUserCredentials($username, $password)
+ {
+ $user = $this->getUserDetails($username);
+
+ return $user && $user['password'] === $password;
+ }
+
+ public function getUserDetails($username)
+ {
+ return $this->getUser($username);
+ }
+
+ public function getUser($username)
+ {
+ if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
+ return false;
+ }
+
+ // the default behavior is to use "username" as the user_id
+ return array_merge(array(
+ 'user_id' => $username,
+ ), $userInfo);
+ }
+
+ public function setUser($username, $password, $first_name = null, $last_name = null)
+ {
+ return $this->setValue(
+ $this->config['user_key'] . $username,
+ compact('username', 'password', 'first_name', 'last_name')
+ );
+ }
+
+ /* ClientCredentialsInterface */
+ public function checkClientCredentials($client_id, $client_secret = null)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return isset($client['client_secret'])
+ && $client['client_secret'] == $client_secret;
+ }
+
+ public function isPublicClient($client_id)
+ {
+ if (!$client = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ return empty($client['client_secret']);
+ }
+
+ /* ClientInterface */
+ public function getClientDetails($client_id)
+ {
+ return $this->getValue($this->config['client_key'] . $client_id);
+ }
+
+ public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
+ {
+ return $this->setValue(
+ $this->config['client_key'] . $client_id,
+ compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
+ );
+ }
+
+ public function checkRestrictedGrantType($client_id, $grant_type)
+ {
+ $details = $this->getClientDetails($client_id);
+ if (isset($details['grant_types'])) {
+ $grant_types = explode(' ', $details['grant_types']);
+
+ return in_array($grant_type, (array) $grant_types);
+ }
+
+ // if grant_types are not defined, then none are restricted
+ return true;
+ }
+
+ /* RefreshTokenInterface */
+ public function getRefreshToken($refresh_token)
+ {
+ return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
+ }
+
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['refresh_token_key'] . $refresh_token,
+ compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetRefreshToken($refresh_token)
+ {
+ $result = $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
+
+ return $result > 0;
+ }
+
+ /* AccessTokenInterface */
+ public function getAccessToken($access_token)
+ {
+ return $this->getValue($this->config['access_token_key'].$access_token);
+ }
+
+ public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
+ {
+ return $this->setValue(
+ $this->config['access_token_key'].$access_token,
+ compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
+ $expires
+ );
+ }
+
+ public function unsetAccessToken($access_token)
+ {
+ $result = $this->expireValue($this->config['access_token_key'] . $access_token);
+
+ return $result > 0;
+ }
+
+ /* ScopeInterface */
+ public function scopeExists($scope)
+ {
+ $scope = explode(' ', $scope);
+
+ $result = $this->getValue($this->config['scope_key'].'supported:global');
+
+ $supportedScope = explode(' ', (string) $result);
+
+ return (count(array_diff($scope, $supportedScope)) == 0);
+ }
+
+ public function getDefaultScope($client_id = null)
+ {
+ if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
+ $result = $this->getValue($this->config['scope_key'].'default:global');
+ }
+
+ return $result;
+ }
+
+ public function setScope($scope, $client_id = null, $type = 'supported')
+ {
+ if (!in_array($type, array('default', 'supported'))) {
+ throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
+ }
+
+ if (is_null($client_id)) {
+ $key = $this->config['scope_key'].$type.':global';
+ } else {
+ $key = $this->config['scope_key'].$type.':'.$client_id;
+ }
+
+ return $this->setValue($key, $scope);
+ }
+
+ /*JWTBearerInterface */
+ public function getClientKey($client_id, $subject)
+ {
+ if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
+ return false;
+ }
+
+ if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
+ return $jwt['key'];
+ }
+
+ return null;
+ }
+
+ public function setClientKey($client_id, $key, $subject = null)
+ {
+ return $this->setValue($this->config['jwt_key'] . $client_id, array(
+ 'key' => $key,
+ 'subject' => $subject
+ ));
+ }
+
+ public function getClientScope($client_id)
+ {
+ if (!$clientDetails = $this->getClientDetails($client_id)) {
+ return false;
+ }
+
+ if (isset($clientDetails['scope'])) {
+ return $clientDetails['scope'];
+ }
+
+ return null;
+ }
+
+ public function getJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('getJti() for the Redis driver is currently unimplemented.');
+ }
+
+ public function setJti($client_id, $subject, $audience, $expiration, $jti)
+ {
+ //TODO: Needs redis implementation.
+ throw new \Exception('setJti() for the Redis driver is currently unimplemented.');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php
new file mode 100644
index 000000000..e6407e440
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should get/save refresh tokens for the "Refresh Token"
+ * grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface RefreshTokenInterface
+{
+ /**
+ * Grant refresh access tokens.
+ *
+ * Retrieve the stored data for the given refresh token.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be check with.
+ *
+ * @return
+ * An associative array as below, and NULL if the refresh_token is
+ * invalid:
+ * - refresh_token: Refresh token identifier.
+ * - client_id: Client identifier.
+ * - user_id: User identifier.
+ * - expires: Expiration unix timestamp, or 0 if the token doesn't expire.
+ * - scope: (optional) Scope values in space-separated string.
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-6
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function getRefreshToken($refresh_token);
+
+ /**
+ * Take the provided refresh token values and store them somewhere.
+ *
+ * This function should be the storage counterpart to getRefreshToken().
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
+ *
+ * @param $refresh_token
+ * Refresh token to be stored.
+ * @param $client_id
+ * Client identifier to be stored.
+ * @param $user_id
+ * User identifier to be stored.
+ * @param $expires
+ * Expiration timestamp to be stored. 0 if the token doesn't expire.
+ * @param $scope
+ * (optional) Scopes to be stored in space-separated string.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null);
+
+ /**
+ * Expire a used refresh token.
+ *
+ * This is not explicitly required in the spec, but is almost implied.
+ * After granting a new refresh token, the old one is no longer useful and
+ * so should be forcibly expired in the data store so it can't be used again.
+ *
+ * If storage fails for some reason, we're not currently checking for
+ * any sort of success/failure, so you should bail out of the script
+ * and provide a descriptive fail message.
+ *
+ * @param $refresh_token
+ * Refresh token to be expired.
+ *
+ * @ingroup oauth2_section_6
+ */
+ public function unsetRefreshToken($refresh_token);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php
new file mode 100644
index 000000000..a8292269b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve data involving the relevent scopes associated
+ * with this implementation.
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface ScopeInterface
+{
+ /**
+ * Check if the provided scope exists.
+ *
+ * @param $scope
+ * A space-separated string of scopes.
+ *
+ * @return
+ * TRUE if it exists, FALSE otherwise.
+ */
+ public function scopeExists($scope);
+
+ /**
+ * The default scope to use in the event the client
+ * does not request one. By returning "false", a
+ * request_error is returned by the server to force a
+ * scope request by the client. By returning "null",
+ * opt out of requiring scopes
+ *
+ * @param $client_id
+ * An optional client id that can be used to return customized default scopes.
+ *
+ * @return
+ * string representation of default scope, null if
+ * scopes are not defined, or false to force scope
+ * request by the client
+ *
+ * ex:
+ * 'default'
+ * ex:
+ * null
+ */
+ public function getDefaultScope($client_id = null);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php
new file mode 100644
index 000000000..6e0fd7bad
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+ * Implement this interface to specify where the OAuth2 Server
+ * should retrieve user credentials for the
+ * "Resource Owner Password Credentials" grant type
+ *
+ * @author Brent Shaffer <bshafs at gmail dot com>
+ */
+interface UserCredentialsInterface
+{
+ /**
+ * Grant access tokens for basic user credentials.
+ *
+ * Check the supplied username and password for validity.
+ *
+ * You can also use the $client_id param to do any checks required based
+ * on a client, if you need that.
+ *
+ * Required for OAuth2::GRANT_TYPE_USER_CREDENTIALS.
+ *
+ * @param $username
+ * Username to be check with.
+ * @param $password
+ * Password to be check with.
+ *
+ * @return
+ * TRUE if the username and password are valid, and FALSE if it isn't.
+ * Moreover, if the username and password are valid, and you want to
+ *
+ * @see http://tools.ietf.org/html/rfc6749#section-4.3
+ *
+ * @ingroup oauth2_section_4
+ */
+ public function checkUserCredentials($username, $password);
+
+ /**
+ * @return
+ * ARRAY the associated "user_id" and optional "scope" values
+ * This function MUST return FALSE if the requested user does not exist or is
+ * invalid. "scope" is a space-separated list of restricted scopes.
+ * @code
+ * return array(
+ * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token
+ * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes
+ * );
+ * @endcode
+ */
+ public function getUserDetails($username);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php
new file mode 100644
index 000000000..8ac8596ac
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+*
+*/
+class Bearer implements TokenTypeInterface
+{
+ private $config;
+
+ public function __construct(array $config = array())
+ {
+ $this->config = array_merge(array(
+ 'token_param_name' => 'access_token',
+ 'token_bearer_header_name' => 'Bearer',
+ ), $config);
+ }
+
+ public function getTokenType()
+ {
+ return 'Bearer';
+ }
+
+ /**
+ * Check if the request has supplied token
+ *
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/349#issuecomment-37993588
+ */
+ public function requestHasToken(RequestInterface $request)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ // check the header, then the querystring, then the request body
+ return !empty($headers) || (bool) ($request->request($this->config['token_param_name'])) || (bool) ($request->query($this->config['token_param_name']));
+ }
+
+ /**
+ * This is a convenience function that can be used to get the token, which can then
+ * be passed to getAccessTokenData(). The constraints specified by the draft are
+ * attempted to be adheared to in this method.
+ *
+ * As per the Bearer spec (draft 8, section 2) - there are three ways for a client
+ * to specify the bearer token, in order of preference: Authorization Header,
+ * POST and GET.
+ *
+ * NB: Resource servers MUST accept tokens via the Authorization scheme
+ * (http://tools.ietf.org/html/rfc6750#section-2).
+ *
+ * @todo Should we enforce TLS/SSL in this function?
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-2.1
+ * @see http://tools.ietf.org/html/rfc6750#section-2.2
+ * @see http://tools.ietf.org/html/rfc6750#section-2.3
+ *
+ * Old Android version bug (at least with version 2.2)
+ * @see http://code.google.com/p/android/issues/detail?id=6684
+ *
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ $headers = $request->headers('AUTHORIZATION');
+
+ /**
+ * Ensure more than one method is not used for including an
+ * access token
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ $methodsUsed = !empty($headers) + (bool) ($request->query($this->config['token_param_name'])) + (bool) ($request->request($this->config['token_param_name']));
+ if ($methodsUsed > 1) {
+ $response->setError(400, 'invalid_request', 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+
+ return null;
+ }
+
+ /**
+ * If no authentication is provided, set the status code
+ * to 401 and return no other error information
+ *
+ * @see http://tools.ietf.org/html/rfc6750#section-3.1
+ */
+ if ($methodsUsed == 0) {
+ $response->setStatusCode(401);
+
+ return null;
+ }
+
+ // HEADER: Get the access token from the header
+ if (!empty($headers)) {
+ if (!preg_match('/' . $this->config['token_bearer_header_name'] . '\s(\S+)/i', $headers, $matches)) {
+ $response->setError(400, 'invalid_request', 'Malformed auth header');
+
+ return null;
+ }
+
+ return $matches[1];
+ }
+
+ if ($request->request($this->config['token_param_name'])) {
+ // // POST: Get the token from POST data
+ if (!in_array(strtolower($request->server('REQUEST_METHOD')), array('post', 'put'))) {
+ $response->setError(400, 'invalid_request', 'When putting the token in the body, the method must be POST or PUT', '#section-2.2');
+
+ return null;
+ }
+
+ $contentType = $request->server('CONTENT_TYPE');
+ if (false !== $pos = strpos($contentType, ';')) {
+ $contentType = substr($contentType, 0, $pos);
+ }
+
+ if ($contentType !== null && $contentType != 'application/x-www-form-urlencoded') {
+ // IETF specifies content-type. NB: Not all webservers populate this _SERVER variable
+ // @see http://tools.ietf.org/html/rfc6750#section-2.2
+ $response->setError(400, 'invalid_request', 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+
+ return null;
+ }
+
+ return $request->request($this->config['token_param_name']);
+ }
+
+ // GET method
+ return $request->query($this->config['token_param_name']);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php
new file mode 100644
index 000000000..fe6a86aa6
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+/**
+* This is not yet supported!
+*/
+class Mac implements TokenTypeInterface
+{
+ public function getTokenType()
+ {
+ return 'mac';
+ }
+
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
+ {
+ throw new \LogicException("Not supported");
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php
new file mode 100644
index 000000000..ad77d4a25
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\RequestInterface;
+use OAuth2\ResponseInterface;
+
+interface TokenTypeInterface
+{
+ /**
+ * Token type identification string
+ *
+ * ex: "bearer" or "mac"
+ */
+ public function getTokenType();
+
+ /**
+ * Retrieves the token string from the request object
+ */
+ public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response);
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php
new file mode 100644
index 000000000..5901bdc42
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/AutoloadTest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace OAuth2;
+
+class AutoloadTest extends \PHPUnit_Framework_TestCase
+{
+ public function testClassesExist()
+ {
+ // autoloader is called in test/bootstrap.php
+ $this->assertTrue(class_exists('OAuth2\Server'));
+ $this->assertTrue(class_exists('OAuth2\Request'));
+ $this->assertTrue(class_exists('OAuth2\Response'));
+ $this->assertTrue(class_exists('OAuth2\GrantType\UserCredentials'));
+ $this->assertTrue(interface_exists('OAuth2\Storage\AccessTokenInterface'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..3bfc760e4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,492 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Memory;
+use OAuth2\Scope;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request();
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'No client id supplied');
+ }
+
+ public function testInvalidClientIdResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Fake Client ID', // invalid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client id supplied is invalid');
+ }
+
+ public function testNoRedirectUriSuppliedOrStoredResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'No redirect URI was supplied or stored');
+ }
+
+ public function testNoResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testInvalidResponseTypeResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'invalid', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'Invalid or missing response type');
+ }
+
+ public function testRedirectUriFragmentResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com#fragment', // valid redirect URI
+ 'response_type' => 'code', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI must not contain a fragment');
+ }
+
+ public function testEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_request');
+ $this->assertEquals($query['error_description'], 'The state parameter is required');
+ }
+
+ public function testDoNotEnforceState()
+ {
+ $server = $this->getTestServer(array('enforce_state' => false));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testEnforceScope()
+ {
+ $server = $this->getTestServer();
+ $scopeStorage = new Memory(array('default_scope' => false, 'supported_scopes' => array('testscope')));
+ $server->setScopeUtil(new Scope($scopeStorage));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'invalid_client');
+ $this->assertEquals($query['error_description'], 'This application requires you specify a scope parameter');
+
+ $request->query['scope'] = 'testscope';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNotContains('error', $response->getHttpHeader('Location'));
+ }
+
+ public function testInvalidRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testInvalidRedirectUriApprovedByBuggyRegisteredUri()
+ {
+ $server = $this->getTestServer();
+ $server->setConfig('require_exact_redirect_uri', false);
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Buggy Redirect Uri', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
+ 'response_type' => 'code',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testNoRedirectUriWithMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'response_type' => 'code',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_uri');
+ $this->assertEquals($response->getParameter('error_description'), 'A redirect URI must be supplied when multiple redirect URIs are registered');
+ }
+
+ public function testRedirectUriWithValidRedirectUri()
+ {
+ $server = $this->getTestServer();
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => true));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
+ $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
+ }
+
+ public function testRedirectUriWithDifferentQueryAndExactMatchNotRequired()
+ {
+ $server = $this->getTestServer(array('require_exact_redirect_uri' => false));
+
+ // create a request with no "redirect_uri" in querystring
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
+ 'response_type' => 'code',
+ 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ public function testMultipleRedirectUris()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
+ 'redirect_uri' => 'http://brentertainment.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz'
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+
+ // call again with different (but still valid) redirect URI
+ $request->query['redirect_uri'] = 'http://morehazards.com';
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('code', $response->getHttpHeader('Location'));
+ }
+
+ /**
+ * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
+ * @see https://github.com/bshaffer/oauth2-server-php/issues/163
+ */
+ public function testNoRedirectUriSuppliedDoesNotRequireTokenRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertContains('state', $response->getHttpHeader('Location'));
+ $this->assertStringStartsWith('http://brentertainment.com?code=', $response->getHttpHeader('Location'));
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+
+ // call token endpoint with no redirect_uri supplied
+ $request = TestRequest::createPost(array(
+ 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
+ 'client_secret' => 'TestSecret2',
+ 'grant_type' => 'authorization_code',
+ 'code' => $query['code'],
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response(), true);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testCodeQueryParamIsSet()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no id_token was saved, since the openid scope wasn't requested
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(empty($code['id_token']));
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'code',
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // extra query param
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('query', $parts);
+ parse_str($parts['query'], $query);
+
+ $this->assertFalse(isset($parmas['fake']));
+ $this->assertArrayHasKey('state', $query);
+ $this->assertEquals($query['state'], 'test');
+ }
+
+ public function testSuccessfulOpenidConnectRequest()
+ {
+ $server = $this->getTestServer(array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'bojanz',
+ ));
+
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID',
+ 'redirect_uri' => 'http://adobe.com',
+ 'response_type' => 'code',
+ 'state' => 'xyz',
+ 'scope' => 'openid',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+ $this->assertFalse(isset($parts['fragment']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $query);
+ $this->assertNotNull($query);
+ $this->assertArrayHasKey('code', $query);
+
+ // ensure no error was returned
+ $this->assertFalse(isset($query['error']));
+ $this->assertFalse(isset($query['error_description']));
+
+ // confirm that the id_token has been created.
+ $storage = $server->getStorage('authorization_code');
+ $code = $storage->getAuthorizationCode($query['code']);
+ $this->assertTrue(!empty($code['id_token']));
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $controller = new AuthorizeController($storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php
new file mode 100644
index 000000000..b277514a5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/ResourceControllerTest.php
@@ -0,0 +1,176 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ResourceControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertEquals('', $response->getResponseBody());
+ }
+
+ public function testMalformedHeader()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'tH1s i5 B0gU5';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed auth header');
+ }
+
+ public function testMultipleTokensSubmitted()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->request['access_token'] = 'TEST';
+ $request->query['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
+ }
+
+ public function testInvalidRequestMethod()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'GET';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'When putting the token in the body, the method must be POST or PUT');
+ }
+
+ public function testInvalidContentType()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->server['REQUEST_METHOD'] = 'POST';
+ $request->server['CONTENT_TYPE'] = 'application/json';
+ $request->request['access_token'] = 'TEST';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testInvalidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer TESTTOKEN';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided is invalid');
+ }
+
+ public function testExpiredToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-expired';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_token');
+ $this->assertEquals($response->getParameter('error_description'), 'The access token provided has expired');
+ }
+
+ public function testOutOfScopeToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $scope = 'outofscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response(), $scope);
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 403);
+ $this->assertEquals($response->getParameter('error'), 'insufficient_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The request requires higher privileges than provided by the access token');
+
+ // verify the "scope" has been set in the "WWW-Authenticate" header
+ preg_match('/scope="(.*?)"/', $response->getHttpHeader('WWW-Authenticate'), $matches);
+ $this->assertEquals(2, count($matches));
+ $this->assertEquals($matches[1], 'outofscope');
+ }
+
+ public function testMalformedToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-malformed';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertFalse($allow);
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'malformed_token');
+ $this->assertEquals($response->getParameter('error_description'), 'Malformed token (missing "expires")');
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testValidTokenWithScopeParam()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
+ $request->query['scope'] = 'testscope';
+ $allow = $server->verifyResourceRequest($request, $response = new Response());
+ $this->assertTrue($allow);
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $controller = new ResourceController($tokenType, $storage);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php
new file mode 100644
index 000000000..4a217bd55
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Controller/TokenControllerTest.php
@@ -0,0 +1,289 @@
+<?php
+
+namespace OAuth2\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\GrantType\AuthorizationCode;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\Scope;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class TokenControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $server->handleTokenRequest(TestRequest::createPost(), $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The grant type was not specified in the request');
+ }
+
+ public function testInvalidGrantType()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'invalid_grant_type', // invalid grant type
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'unsupported_grant_type');
+ $this->assertEquals($response->getParameter('error_description'), 'Grant type "invalid_grant_type" not supported');
+ }
+
+ public function testNoClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'Client credentials were not found in the headers or body');
+ }
+
+ public function testNoClientSecretWithConfidentialClient()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ public function testNoClientSecretWithEmptySecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-empty-secret',
+ 'client_id' => 'Test Client ID Empty Secret', // valid client id
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ }
+
+ public function testInvalidClientId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Fake Client ID', // invalid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testInvalidClientSecret()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'Fake Client Secret', // invalid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidTokenResponse()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testValidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope1 clientscope2'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertEquals('clientscope1 clientscope2', $response->getParameter('scope'));
+ }
+
+ public function testInvalidClientIdScope()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'code' => 'testcode-with-scope',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'clientscope3'
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testEnforceScope()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ $scope = new Scope(array(
+ 'default_scope' => false,
+ 'supported_scopes' => array('testscope')
+ ));
+ $server->setScopeUtil($scope);
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $response = $server->handleTokenRequest($request);
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'This application requires you specify a scope parameter');
+ }
+
+ public function testCanReceiveAccessTokenUsingPasswordGrantTypeWithoutClientSecret()
+ {
+ // add the test parameters in memory
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID For Password Grant', // valid client id
+ 'username' => 'johndoe', // valid username
+ 'password' => 'password', // valid password for username
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertNotNull($response->getParameter('expires_in'));
+ $this->assertNotNull($response->getParameter('token_type'));
+ }
+
+ public function testInvalidTokenTypeHintForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'foo',
+ 'token' => 'sometoken'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Token type hint must be either \'access_token\' or \'refresh_token\'');
+ }
+
+ public function testMissingTokenForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = TestRequest::createPost(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing token parameter to revoke');
+ }
+
+ public function testInvalidRequestMethodForRevoke()
+ {
+ $server = $this->getTestServer();
+
+ $request = new TestRequest();
+ $request->setQuery(array(
+ 'token_type_hint' => 'access_token'
+ ));
+
+ $server->handleRevokeRequest($request, $response = new Response());
+ $this->assertTrue($response instanceof Response);
+ $this->assertEquals(405, $response->getStatusCode(), var_export($response, 1));
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when revoking an access token');
+ }
+
+ public function testCreateController()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $accessToken = new \OAuth2\ResponseType\AccessToken($storage);
+ $controller = new TokenController($accessToken, $storage);
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php
new file mode 100644
index 000000000..d34136767
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/FirebaseJwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class FirebaseJwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new FirebaseJwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php
new file mode 100644
index 000000000..214eebac8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Encryption/JwtTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Encryption;
+
+use OAuth2\Storage\Bootstrap;
+
+class JwtTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testJwtUtil($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
+
+ // test BC behaviour of trusting the algorithm in the header
+ $payload = $jwtUtil->decode($encoded, $client_key);
+ $this->assertEquals($params, $payload);
+
+ // test BC behaviour of not verifying by passing false
+ $payload = $jwtUtil->decode($encoded, $client_key, false);
+ $this->assertEquals($params, $payload);
+
+ // test the new restricted algorithms header
+ $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
+ $this->assertEquals($params, $payload);
+ }
+
+ public function testInvalidJwt()
+ {
+ $jwtUtil = new Jwt();
+
+ $this->assertFalse($jwtUtil->decode('goob'));
+ $this->assertFalse($jwtUtil->decode('go.o.b'));
+ }
+
+ /** @dataProvider provideClientCredentials */
+ public function testInvalidJwtHeader($client_id, $client_key)
+ {
+ $jwtUtil = new Jwt();
+
+ $params = array(
+ 'iss' => $client_id,
+ 'exp' => time() + 1000,
+ 'iat' => time(),
+ 'sub' => 'testuser@ourdomain.com',
+ 'aud' => 'http://myapp.com/oauth/auth',
+ 'scope' => null,
+ );
+
+ // testing for algorithm tampering when only RSA256 signing is allowed
+ // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
+ $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
+
+ $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
+
+ $this->assertFalse($payload);
+ }
+
+ public function provideClientCredentials()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $client_id = 'Test Client ID';
+ $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
+
+ return array(
+ array($client_id, $client_key),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..356b8e53c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "code" is required');
+ }
+
+ public function testInvalidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'InvalidCode', // invalid authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testCodeCannotBeUsedTwice()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNotNull($response->getParameter('access_token'));
+
+ // try to use the same code again
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
+ }
+
+ public function testExpiredCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-expired', // expired authorization code
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'The authorization code has expired');
+ }
+
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidRedirectUri()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://brentertainment.com/voil%C3%A0', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-redirect-uri', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCodeNoScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1 scope2');
+ }
+
+ public function testValidCodeSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidCodeLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCodeDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidCodeInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-with-scope', // valid code
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'code' => 'testcode', // valid code
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'authorization_code doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php
new file mode 100644
index 000000000..f0d46ccb3
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ClientCredentialsTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ClientCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInvalidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'FakeSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertNull($token['scope']);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidCredentialsInHeader()
+ {
+ // create with HTTP_AUTHORIZATION in header
+ $server = $this->getTestServer();
+ $headers = array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('Test Client ID:TestSecret'), 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+
+ // create using PHP Authorization Globals
+ $headers = array('PHP_AUTH_USER' => 'Test Client ID', 'PHP_AUTH_PW' => 'TestSecret', 'REQUEST_METHOD' => 'POST');
+ $params = array('grant_type' => 'client_credentials');
+ $request = new Request(array(), $params, array(), array(), array(), $headers);
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInRequest()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testValidCredentialsInQuerystring()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertNotNull($token['access_token']);
+ }
+
+ public function testClientUserIdIsSetInAccessToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Client ID With User ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ // verify the user_id was associated with the token
+ $storage = $server->getStorage('client');
+ $token = $storage->getAccessToken($token['access_token']);
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertEquals($token['user_id'], 'brent@brentertainment.com');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php
new file mode 100644
index 000000000..a47aae3e8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/ImplicitTest.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class ImplicitTest extends \PHPUnit_Framework_TestCase
+{
+ public function testImplicitNotAllowedResponse()
+ {
+ $server = $this->getTestServer();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // invalid response type
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'unsupported_response_type');
+ $this->assertEquals($query['error_description'], 'implicit grant type not supported');
+ }
+
+ public function testUserDeniesAccessResponse()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), false);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ parse_str($parts['query'], $query);
+
+ $this->assertEquals($query['error'], 'access_denied');
+ $this->assertEquals($query['error_description'], 'The user denied access to your application');
+ }
+
+ public function testSuccessfulRequestFragmentParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'xyz',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+
+ $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
+ $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('access_token', $params);
+ $this->assertArrayHasKey('expires_in', $params);
+ $this->assertArrayHasKey('token_type', $params);
+ }
+
+ public function testSuccessfulRequestReturnsStateParameter()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ public function testSuccessfulRequestStripsExtraParameters()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com?fake=something', // valid redirect URI
+ 'response_type' => 'token', // valid response type
+ 'state' => 'test', // valid state string (just needs to be passed back to us)
+ 'fake' => 'something', // add extra param to querystring
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNull($response->getParameter('error_description'));
+
+ $location = $response->getHttpHeader('Location');
+ $parts = parse_url($location);
+ $this->assertFalse(isset($parts['fake']));
+ $this->assertArrayHasKey('fragment', $parts);
+ parse_str($parts['fragment'], $params);
+
+ $this->assertFalse(isset($params['fake']));
+ $this->assertArrayHasKey('state', $params);
+ $this->assertEquals($params['state'], 'test');
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php
new file mode 100644
index 000000000..0a6c4b827
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/JwtBearerTest.php
@@ -0,0 +1,360 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+use OAuth2\Encryption\Jwt;
+
+class JwtBearerTest extends \PHPUnit_Framework_TestCase
+{
+ private $privateKey;
+
+ public function setUp()
+ {
+ $this->privateKey = <<<EOD
+-----BEGIN RSA PRIVATE KEY-----
+MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
+nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
+IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
+AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
+kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
+3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
+R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
+l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
+zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
+PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
+QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
+niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
+suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
+-----END RSA PRIVATE KEY-----
+EOD;
+ }
+
+ public function testMalformedJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break it
+ $jwt = $this->getJWT();
+ $jwt = substr_replace($jwt, 'broken', 3, 6);
+
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT is malformed');
+ }
+
+ public function testBrokenSignature()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get the jwt and break signature
+ $jwt = $this->getJWT() . 'notSupposeToBeHere';
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT failed signature verification');
+ }
+
+ public function testExpiredJWT()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT(1234);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT has expired');
+ }
+
+ public function testBadExp()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get an expired JWT
+ $jwt = $this->getJWT('badtimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Expiration (exp) time must be a unix time stamp');
+ }
+
+ public function testNoAssert()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Do not pass the assert (JWT)
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "assertion" required');
+ }
+
+ public function testNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a future NBF
+ $jwt = $this->getJWT(null, time() + 10000);
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JWT cannot be used before the Not Before (nbf) time');
+ }
+
+ public function testBadNotBefore()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ ));
+
+ //Get a non timestamp nbf
+ $jwt = $this->getJWT(null, 'notatimestamp');
+ $request->request['assertion'] = $jwt;
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Not Before (nbf) time must be a unix time stamp');
+ }
+
+ public function testNonMatchingAudience()
+ {
+ $server = $this->getTestServer('http://google.com/oauth/o/auth');
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid audience (aud)');
+ }
+
+ public function testBadClientID()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'bad_client_id'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testBadSubject()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'anotheruser@ourdomain,com'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testMissingKey()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Missing Key Cli,nt'),
+ ));
+
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
+ }
+
+ public function testValidJwt()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(), // valid assertion
+ ));
+
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidJwtWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidJwtInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
+ 'scope' => 'invalid-scope', // invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testValidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(null, null, 'testuser@ourdomain.com', 'Test Client ID', 'unused_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testInvalidJti()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'used_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ public function testJtiReplayAttack()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
+ 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'totally_new_jti'), // valid assertion with invalid scope
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+
+ //Replay the same request
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
+ }
+
+ /**
+ * Generates a JWT
+ * @param $exp The expiration date. If the current time is greater than the exp, the JWT is invalid.
+ * @param $nbf The "not before" time. If the current time is less than the nbf, the JWT is invalid.
+ * @param $sub The subject we are acting on behalf of. This could be the email address of the user in the system.
+ * @param $iss The issuer, usually the client_id.
+ * @return string
+ */
+ private function getJWT($exp = null, $nbf = null, $sub = null, $iss = 'Test Client ID', $jti = null)
+ {
+ if (!$exp) {
+ $exp = time() + 1000;
+ }
+
+ if (!$sub) {
+ $sub = "testuser@ourdomain.com";
+ }
+
+ $params = array(
+ 'iss' => $iss,
+ 'exp' => $exp,
+ 'iat' => time(),
+ 'sub' => $sub,
+ 'aud' => 'http://myapp.com/oauth/auth',
+ );
+
+ if ($nbf) {
+ $params['nbf'] = $nbf;
+ }
+
+ if ($jti) {
+ $params['jti'] = $jti;
+ }
+
+ $jwtUtil = new Jwt();
+
+ return $jwtUtil->encode($params, $this->privateKey, 'RS256');
+ }
+
+ private function getTestServer($audience = 'http://myapp.com/oauth/auth')
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new JwtBearer($storage, $audience, new Jwt()));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php
new file mode 100644
index 000000000..a458aad8a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/RefreshTokenTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class RefreshTokenTest extends \PHPUnit_Framework_TestCase
+{
+ private $storage;
+
+ public function testNoRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "refresh_token" is required');
+ }
+
+ public function testInvalidRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'fake-token', // invalid refresh token
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid refresh token');
+ }
+
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => true)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $this->storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ public function testValidRefreshTokenDoesNotUnsetToken()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array(
+ 'always_issue_new_refresh_token' => true,
+ 'unset_refresh_token_after_use' => false,
+ )));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenWithNoRefreshTokenInResponse()
+ {
+ $server = $this->getTestServer();
+ $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => false)));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertFalse(isset($token['refresh_token']), 'refresh token should not be returned');
+
+ $used_token = $this->storage->getRefreshToken('test-refreshtoken');
+ $this->assertNotNull($used_token, 'the refresh token used is still valid');
+ }
+
+ public function testValidRefreshTokenSameScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope2 scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope2 scope1');
+ }
+
+ public function testValidRefreshTokenLessScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope1',
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidRefreshTokenDifferentScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'scope3',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidRefreshTokenInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
+ }
+
+ public function testValidClientDifferentRefreshToken()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Some Other Client', // valid client id
+ 'client_secret' => 'TestSecret3', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'refresh_token doesn\'t exist or is invalid for the client');
+ }
+
+ private function getTestServer()
+ {
+ $this->storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($this->storage);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php
new file mode 100644
index 000000000..18943d055
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/GrantType/UserCredentialsTest.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace OAuth2\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class UserCredentialsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'password' => 'testpass', // valid password
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testNoPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ ));
+ $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
+ }
+
+ public function testInvalidUsername()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'fake-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testInvalidPassword()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'fakepass', // invalid password
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 401);
+ $this->assertEquals($response->getParameter('error'), 'invalid_grant');
+ $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
+ }
+
+ public function testValidCredentials()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testValidCredentialsWithScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'scope1', // valid scope
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('scope', $token);
+ $this->assertEquals($token['scope'], 'scope1');
+ }
+
+ public function testValidCredentialsInvalidScope()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ 'scope' => 'invalid-scope',
+ ));
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_scope');
+ $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
+ }
+
+ public function testNoSecretWithPublicClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID Empty Secret', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ }
+
+ public function testNoSecretWithConfidentialClient()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid public client
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ $token = $server->grantAccessToken($request, $response = new Response());
+
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_client');
+ $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage);
+ $server->addGrantType(new UserCredentials($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
new file mode 100644
index 000000000..46de936d8
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test valid id_token request
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('id_token', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayNotHasKey('access_token', $query);
+ $this->assertArrayNotHasKey('expires_in', $query);
+ $this->assertArrayNotHasKey('token_type', $query);
+
+ // Test valid token id_token request
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types, order does not matter
+ $request->query['response_type'] = 'token id_token';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+
+ // assert that with multiple-valued response types with extra spaces do not matter
+ $request->query['response_type'] = ' token id_token ';
+ $server->handleAuthorizeRequest($request, $response, true);
+
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['fragment'], $query);
+
+ $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
+ $this->assertEquals($query['state'], 'af0ifjsldkj');
+
+ $this->assertArrayHasKey('access_token', $query);
+ $this->assertArrayHasKey('expires_in', $query);
+ $this->assertArrayHasKey('token_type', $query);
+ $this->assertArrayHasKey('state', $query);
+ $this->assertArrayHasKey('id_token', $query);
+ }
+
+ public function testMissingNonce()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'xyz',
+ ));
+
+ // Test missing nonce for 'id_token' response type
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+
+ // Test missing nonce for 'id_token token' response type
+ $request->query['response_type'] = 'id_token token';
+ $server->handleAuthorizeRequest($request, $response, true);
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'invalid_nonce');
+ $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
+ }
+
+ public function testNotGrantedApplication()
+ {
+ $server = $this->getTestServer();
+
+ $response = new Response();
+ $request = new Request(array(
+ 'client_id' => 'Test Client ID', // valid client id
+ 'redirect_uri' => 'http://adobe.com', // valid redirect URI
+ 'response_type' => 'id_token',
+ 'state' => 'af0ifjsldkj',
+ 'nonce' => 'n-0S6_WzA2Mj',
+ ));
+
+ // Test not approved application
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'consent_required');
+ $this->assertEquals($params['error_description'], 'The user denied access to your application');
+
+ // Test not approved application with prompt parameter
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false);
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'login_required');
+ $this->assertEquals($params['error_description'], 'The user must log in');
+
+ // Test not approved application with user_id set
+ $request->query['prompt'] = 'none';
+ $server->handleAuthorizeRequest($request, $response, false, 'some-user-id');
+
+ $params = $response->getParameters();
+
+ $this->assertEquals($params['error'], 'interaction_required');
+ $this->assertEquals($params['error_description'], 'The user must grant access to your application');
+ }
+
+ public function testNeedsIdToken()
+ {
+ $server = $this->getTestServer();
+ $authorize = $server->getAuthorizeController();
+
+ $this->assertTrue($authorize->needsIdToken('openid'));
+ $this->assertTrue($authorize->needsIdToken('openid profile'));
+ $this->assertFalse($authorize->needsIdToken(''));
+ $this->assertFalse($authorize->needsIdToken('some-scope'));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'phpunit',
+ 'allow_implicit' => true
+ );
+
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
new file mode 100644
index 000000000..b1b687077
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace OAuth2\OpenID\Controller;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+
+class UserInfoControllerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateController()
+ {
+ $tokenType = new \OAuth2\TokenType\Bearer();
+ $storage = new \OAuth2\Storage\Memory();
+ $controller = new UserInfoController($tokenType, $storage, $storage);
+
+ $response = new Response();
+ $controller->handleUserInfoRequest(new Request(), $response);
+ $this->assertEquals(401, $response->getStatusCode());
+ }
+
+ public function testValidToken()
+ {
+ $server = $this->getTestServer();
+ $request = Request::createFromGlobals();
+ $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-openid-connect';
+ $response = new Response();
+
+ $server->handleUserInfoRequest($request, $response);
+ $parameters = $response->getParameters();
+ $this->assertEquals($parameters['sub'], 'testuser');
+ $this->assertEquals($parameters['email'], 'testuser@test.com');
+ $this->assertEquals($parameters['email_verified'], true);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
new file mode 100644
index 000000000..776002d1e
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace OAuth2\OpenID\GrantType;
+
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Server;
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidCode()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+
+ // this is only true if "offline_access" was requested
+ $this->assertFalse(isset($token['refresh_token']));
+ }
+
+ public function testOfflineAccess()
+ {
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'code' => 'testcode-openid', // valid code
+ 'scope' => 'offline_access', // valid code
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('id_token', $token);
+ $this->assertEquals('test_id_token', $token['id_token']);
+ $this->assertTrue(isset($token['refresh_token']));
+ }
+
+ private function getTestServer()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('use_openid_connect' => true));
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
new file mode 100644
index 000000000..b0311434a
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+
+class CodeIdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+
+ // only exists if an access token was granted along with the id_token
+ $this->assertArrayNotHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ public function testUserClaimsWithUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+ $this->assertNotNull($claims['email']);
+ $this->assertNotNull($claims['email_verified']);
+ }
+
+ public function testUserClaimsWithoutUserId()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+
+ $request = new Request(array(
+ 'response_type' => 'code id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $userId = null;
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('query', $parts);
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['query'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('code', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayNotHasKey('email', $claims);
+ $this->assertArrayNotHasKey('email_verified', $claims);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ 'allow_implicit' => true,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $responseTypes = array(
+ 'code' => $code = new AuthorizationCode($memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'code id_token' => new CodeIdToken($code, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
new file mode 100644
index 000000000..e772f6be4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\Encryption\Jwt;
+
+class IdTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidateAuthorizeRequest()
+ {
+ $query = array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ );
+
+ // attempt to do the request without a nonce.
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+
+ // Add a nonce and retry.
+ $query['nonce'] = 'test';
+ $request = new Request($query);
+ $valid = $server->validateAuthorizeRequest($request, $response = new Response());
+ $this->assertTrue($valid);
+ }
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $user_id = 'testuser';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+ $this->validateIdToken($params['id_token']);
+ }
+
+ public function testPassInAuthTime()
+ {
+ $server = $this->getTestServer(array('allow_implicit' => true));
+ $request = new Request(array(
+ 'response_type' => 'id_token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid email',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ // test with a scalar user id
+ $user_id = 'testuser123';
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($user_id, $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+
+ // test with an array of user info
+ $userInfo = array(
+ 'user_id' => 'testuser1234',
+ 'auth_time' => date('Y-m-d H:i:s', strtotime('20 minutes ago')
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true, $userInfo);
+
+ list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
+
+ $this->assertTrue(is_array($payload));
+ $this->assertArrayHasKey('sub', $payload);
+ $this->assertEquals($userInfo['user_id'], $payload['sub']);
+ $this->assertArrayHasKey('auth_time', $payload);
+ $this->assertEquals($userInfo['auth_time'], $payload['auth_time']);
+ }
+
+ private function extractTokenDataFromResponse(Response $response)
+ {
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayNotHasKey('access_token', $params);
+
+ list($headb64, $payloadb64, $signature) = explode('.', $params['id_token']);
+
+ $jwt = new Jwt();
+ $header = json_decode($jwt->urlSafeB64Decode($headb64), true);
+ $payload = json_decode($jwt->urlSafeB64Decode($payloadb64), true);
+
+ return array($header, $payload, $signature);
+ }
+
+ private function validateIdToken($id_token)
+ {
+ $parts = explode('.', $id_token);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('email', $claims);
+ $this->assertArrayHasKey('email_verified', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $this->assertEquals($claims['email'], 'testuser@test.com');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $memoryStorage->supportedScopes[] = 'email';
+ $storage = array(
+ 'client' => $memoryStorage,
+ 'scope' => $memoryStorage,
+ );
+ $responseTypes = array(
+ 'id_token' => new IdToken($memoryStorage, $memoryStorage, $config),
+ );
+
+ $server = new Server($storage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
new file mode 100644
index 000000000..bc564d37b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace OAuth2\OpenID\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Request;
+use OAuth2\Response;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\ResponseType\AccessToken;
+
+class IdTokenTokenTest extends \PHPUnit_Framework_TestCase
+{
+
+ public function testHandleAuthorizeRequest()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer(array('allow_implicit' => true));
+
+ $request = new Request(array(
+ 'response_type' => 'id_token token',
+ 'redirect_uri' => 'http://adobe.com',
+ 'client_id' => 'Test Client ID',
+ 'scope' => 'openid',
+ 'state' => 'test',
+ 'nonce' => 'test',
+ ));
+
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ $this->assertEquals($response->getStatusCode(), 302);
+ $location = $response->getHttpHeader('Location');
+ $this->assertNotContains('error', $location);
+
+ $parts = parse_url($location);
+ $this->assertArrayHasKey('fragment', $parts);
+ $this->assertFalse(isset($parts['query']));
+
+ // assert fragment is in "application/x-www-form-urlencoded" format
+ parse_str($parts['fragment'], $params);
+ $this->assertNotNull($params);
+ $this->assertArrayHasKey('id_token', $params);
+ $this->assertArrayHasKey('access_token', $params);
+
+ // validate ID Token
+ $parts = explode('.', $params['id_token']);
+ foreach ($parts as &$part) {
+ // Each part is a base64url encoded json string.
+ $part = str_replace(array('-', '_'), array('+', '/'), $part);
+ $part = base64_decode($part);
+ $part = json_decode($part, true);
+ }
+ list($header, $claims, $signature) = $parts;
+
+ $this->assertArrayHasKey('iss', $claims);
+ $this->assertArrayHasKey('sub', $claims);
+ $this->assertArrayHasKey('aud', $claims);
+ $this->assertArrayHasKey('iat', $claims);
+ $this->assertArrayHasKey('exp', $claims);
+ $this->assertArrayHasKey('auth_time', $claims);
+ $this->assertArrayHasKey('nonce', $claims);
+ $this->assertArrayHasKey('at_hash', $claims);
+
+ $this->assertEquals($claims['iss'], 'test');
+ $this->assertEquals($claims['aud'], 'Test Client ID');
+ $this->assertEquals($claims['nonce'], 'test');
+ $duration = $claims['exp'] - $claims['iat'];
+ $this->assertEquals($duration, 3600);
+ }
+
+ private function getTestServer($config = array())
+ {
+ $config += array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'test',
+ 'id_lifetime' => 3600,
+ );
+
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $responseTypes = array(
+ 'token' => $token = new AccessToken($memoryStorage, $memoryStorage),
+ 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
+ 'id_token token' => new IdTokenToken($token, $idToken),
+ );
+
+ $server = new Server($memoryStorage, $config, array(), $responseTypes);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..bdfb085e3
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCreateAuthorizationCode($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof AuthorizationCodeInterface) {
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // change existing code
+ $expires = time() + 42;
+ $new_id_token = 'fake_id_token-2';
+ $success = $storage->setAuthorizationCode('new-openid-code', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires, $scope, $new_id_token);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('new-openid-code');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'new-openid-code');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+ $this->assertEquals($code['id_token'], $new_id_token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testRemoveIdTokenFromAuthorizationCode($storage)
+ {
+ // add new code
+ $expires = time() + 20;
+ $scope = null;
+ $id_token = 'fake_id_token_to_remove';
+ $authcode = 'new-openid-code-'.rand();
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
+ $this->assertTrue($success);
+
+ // verify params were set
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], $id_token);
+
+ // remove the id_token
+ $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, null);
+
+ // verify the "id_token" is now null
+ $code = $storage->getAuthorizationCode($authcode);
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('id_token', $code);
+ $this->assertEquals($code['id_token'], null);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php
new file mode 100644
index 000000000..840f6c566
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/OpenID/Storage/UserClaimsTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\OpenID\Storage;
+
+use OAuth2\Storage\BaseTest;
+use OAuth2\Storage\NullStorage;
+
+class UserClaimsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetUserClaims($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof UserClaimsInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // invalid user
+ $claims = $storage->getUserClaims('fake-user', '');
+ $this->assertFalse($claims);
+
+ // valid user (no scope)
+ $claims = $storage->getUserClaims('testuser', '');
+
+ /* assert the decoded token is the same */
+ $this->assertFalse(isset($claims['email']));
+
+ // valid user
+ $claims = $storage->getUserClaims('testuser', 'email');
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($claims['email'], "testuser@test.com");
+ $this->assertEquals($claims['email_verified'], true);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php
new file mode 100644
index 000000000..10db3215c
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/RequestTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\GrantType\AuthorizationCode;
+
+class RequestTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRequestOverride()
+ {
+ $request = new TestRequest();
+ $server = $this->getTestServer();
+
+ // Smoke test for override request class
+ // $server->handleTokenRequest($request, $response = new Response());
+ // $this->assertInstanceOf('Response', $response);
+ // $server->handleAuthorizeRequest($request, $response = new Response(), true);
+ // $this->assertInstanceOf('Response', $response);
+ // $response = $server->verifyResourceRequest($request, $response = new Response());
+ // $this->assertTrue(is_bool($response));
+
+ /*** make some valid requests ***/
+
+ // Valid Token Request
+ $request->setPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' => 'Test Client ID',
+ 'client_secret' => 'TestSecret',
+ 'code' => 'testcode',
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertEquals($response->getStatusCode(), 200);
+ $this->assertNull($response->getParameter('error'));
+ $this->assertNotNUll($response->getParameter('access_token'));
+ }
+
+ public function testHeadersReturnsValueByKey()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('AUTHORIZATION'));
+ }
+
+ public function testHeadersReturnsDefaultIfHeaderNotPresent()
+ {
+ $request = new Request();
+
+ $this->assertEquals('Bearer', $request->headers('AUTHORIZATION', 'Bearer'));
+ }
+
+ public function testHeadersIsCaseInsensitive()
+ {
+ $request = new Request(
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array(),
+ array('AUTHORIZATION' => 'Basic secret')
+ );
+
+ $this->assertEquals('Basic secret', $request->headers('Authorization'));
+ }
+
+ public function testRequestReturnsPostParamIfNoQueryParamAvailable()
+ {
+ $request = new Request(
+ array(),
+ array('client_id' => 'correct')
+ );
+
+ $this->assertEquals('correct', $request->query('client_id', $request->request('client_id')));
+ }
+
+ private function getTestServer($config = array())
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, $config);
+
+ // Add the two types supported for authorization grant
+ $server->addGrantType(new AuthorizationCode($storage));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php
new file mode 100644
index 000000000..b8149005d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace OAuth2;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRenderAsXml()
+ {
+ $response = new Response(array(
+ 'foo' => 'bar',
+ 'halland' => 'oates',
+ ));
+
+ $string = $response->getResponseBody('xml');
+ $this->assertContains('<response><foo>bar</foo><halland>oates</halland></response>', $string);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php
new file mode 100644
index 000000000..0ed1c82fc
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/AccessTokenTest.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Storage\Memory;
+
+class AccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testRevokeAccessTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'access_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithoutTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithRefreshTokenTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'refresh_token');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeAccessTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'access_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
+ $accessToken = new AccessToken($tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getAccessToken('revoke'));
+ }
+
+ public function testRevokeRefreshTokenWithBogusTypeHint()
+ {
+ $tokenStorage = new Memory(array(
+ 'refresh_tokens' => array(
+ 'revoke' => array('mytoken'),
+ ),
+ ));
+
+ $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
+ $accessToken = new AccessToken(new Memory, $tokenStorage);
+ $accessToken->revokeToken('revoke', 'foo');
+ $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php
new file mode 100644
index 000000000..51b01a927
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ResponseType/JwtAccessTokenTest.php
@@ -0,0 +1,160 @@
+<?php
+
+namespace OAuth2\ResponseType;
+
+use OAuth2\Server;
+use OAuth2\Response;
+use OAuth2\Request\TestRequest;
+use OAuth2\Storage\Bootstrap;
+use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
+use OAuth2\GrantType\ClientCredentials;
+use OAuth2\GrantType\UserCredentials;
+use OAuth2\GrantType\RefreshToken;
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCreateAccessToken()
+ {
+ $server = $this->getTestServer();
+ $jwtResponseType = $server->getResponseType('token');
+
+ $accessToken = $jwtResponseType->createAccessToken('Test Client ID', 123, 'test', false);
+ $jwt = new Jwt;
+ $decodedAccessToken = $jwt->decode($accessToken['access_token'], null, false);
+
+ $this->assertArrayHasKey('id', $decodedAccessToken);
+ $this->assertArrayHasKey('jti', $decodedAccessToken);
+ $this->assertArrayHasKey('iss', $decodedAccessToken);
+ $this->assertArrayHasKey('aud', $decodedAccessToken);
+ $this->assertArrayHasKey('exp', $decodedAccessToken);
+ $this->assertArrayHasKey('iat', $decodedAccessToken);
+ $this->assertArrayHasKey('token_type', $decodedAccessToken);
+ $this->assertArrayHasKey('scope', $decodedAccessToken);
+
+ $this->assertEquals('https://api.example.com', $decodedAccessToken['iss']);
+ $this->assertEquals('Test Client ID', $decodedAccessToken['aud']);
+ $this->assertEquals(123, $decodedAccessToken['sub']);
+ $delta = $decodedAccessToken['exp'] - $decodedAccessToken['iat'];
+ $this->assertEquals(3600, $delta);
+ $this->assertEquals($decodedAccessToken['id'], $decodedAccessToken['jti']);
+ }
+
+ public function testGrantJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+
+ $this->assertNotNull($response->getParameter('access_token'));
+ $this->assertEquals(2, substr_count($response->getParameter('access_token'), '.'));
+ }
+
+ public function testAccessResourceWithJwtAccessToken()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ $this->assertTrue($server->verifyResourceRequest($request));
+ }
+
+ public function testAccessResourceWithJwtAccessTokenUsingSecondaryStorage()
+ {
+ // add the test parameters in memory
+ $server = $this->getTestServer();
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'client_credentials', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ ));
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+
+ // make a call to the resource server using the crypto token
+ $request = TestRequest::createPost(array(
+ 'access_token' => $JwtAccessToken,
+ ));
+
+ // create a resource server with the "memory" storage from the grant server
+ $resourceServer = new Server($server->getStorage('client_credentials'));
+
+ $this->assertTrue($resourceServer->verifyResourceRequest($request));
+ }
+
+ public function testJwtAccessTokenWithRefreshToken()
+ {
+ $server = $this->getTestServer();
+
+ // add "UserCredentials" grant type and "JwtAccessToken" response type
+ // and ensure "JwtAccessToken" response type has "RefreshToken" storage
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $server->addGrantType(new UserCredentials($memoryStorage));
+ $server->addGrantType(new RefreshToken($memoryStorage));
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, $memoryStorage), 'token');
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'password', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'username' => 'test-username', // valid username
+ 'password' => 'testpass', // valid password
+ ));
+
+ // make the call to grant a crypto token
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
+ $this->assertNotNull($refreshToken = $response->getParameter('refresh_token'));
+
+ // decode token and make sure refresh_token isn't set
+ list($header, $payload, $signature) = explode('.', $JwtAccessToken);
+ $decodedToken = json_decode(base64_decode($payload), true);
+ $this->assertFalse(array_key_exists('refresh_token', $decodedToken));
+
+ // use the refresh token to get another access token
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token',
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => $refreshToken,
+ ));
+
+ $server->handleTokenRequest($request, $response = new Response());
+ $this->assertNotNull($response->getParameter('access_token'));
+ }
+
+ private function getTestServer()
+ {
+ $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
+
+ $storage = array(
+ 'access_token' => new JwtAccessTokenStorage($memoryStorage),
+ 'client' => $memoryStorage,
+ 'client_credentials' => $memoryStorage,
+ );
+ $server = new Server($storage);
+ $server->addGrantType(new ClientCredentials($memoryStorage));
+
+ // make the "token" response type a JwtAccessToken
+ $config = array('issuer' => 'https://api.example.com');
+ $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, null, $config));
+
+ return $server;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php
new file mode 100644
index 000000000..99f9cf6eb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ScopeTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Storage\Memory;
+
+class ScopeTest extends \PHPUnit_Framework_TestCase
+{
+ public function testCheckScope()
+ {
+ $scopeUtil = new Scope();
+
+ $this->assertFalse($scopeUtil->checkScope('invalid', 'list of scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid', 'valid and-some other-scopes'));
+ $this->assertTrue($scopeUtil->checkScope('valid another-valid', 'valid another-valid and-some other-scopes'));
+ // all scopes must match
+ $this->assertFalse($scopeUtil->checkScope('valid invalid', 'valid and-some other-scopes'));
+ $this->assertFalse($scopeUtil->checkScope('valid valid2 invalid', 'valid valid2 and-some other-scopes'));
+ }
+
+ public function testScopeStorage()
+ {
+ $scopeUtil = new Scope();
+ $this->assertEquals($scopeUtil->getDefaultScope(), null);
+
+ $scopeUtil = new Scope(array(
+ 'default_scope' => 'default',
+ 'supported_scopes' => array('this', 'that', 'another'),
+ ));
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'default');
+ $this->assertTrue($scopeUtil->scopeExists('this that another', 'client_id'));
+
+ $memoryStorage = new Memory(array(
+ 'default_scope' => 'base',
+ 'supported_scopes' => array('only-this-one'),
+ ));
+ $scopeUtil = new Scope($memoryStorage);
+
+ $this->assertEquals($scopeUtil->getDefaultScope(), 'base');
+ $this->assertTrue($scopeUtil->scopeExists('only-this-one', 'client_id'));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php
new file mode 100644
index 000000000..747e120f5
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/ServerTest.php
@@ -0,0 +1,684 @@
+<?php
+
+namespace OAuth2;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\ResponseType\AuthorizationCode;
+use OAuth2\Storage\Bootstrap;
+
+class ServerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testGetAuthorizeControllerWithNoClientStorageThrowsException()
+ {
+ // must set Client Storage
+ $server = new Server();
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetAuthorizeControllerWithNoAccessTokenStorageThrowsException()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->getAuthorizeController();
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeResponseType()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException allow_implicit
+ **/
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorageThrowsException()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorage()
+ {
+ // must set AuthorizationCode or AccessToken / implicit
+ $server = new Server(array(), array('allow_implicit' => true));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeStorage()
+ {
+ // must set AccessToken or AuthorizationCode
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\AuthorizationCodeInterface'));
+
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testGetTokenControllerWithGrantTypeStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientCredentialsInterface
+ **/
+ public function testGetTokenControllerWithNoClientCredentialsStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\UserCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetTokenControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerWithAccessTokenAndClientCredentialsStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->getTokenController();
+ }
+
+ public function testGetTokenControllerAccessTokenStorageAndClientCredentialsStorageAndGrantTypes()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addGrantType($this->getMockBuilder('OAuth2\GrantType\AuthorizationCode')->disableOriginalConstructor()->getMock());
+ $server->getTokenController();
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testGetResourceControllerWithNoAccessTokenStorageThrowsException()
+ {
+ $server = new Server();
+ $server->getResourceController();
+ }
+
+ public function testGetResourceControllerWithAccessTokenStorage()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
+ $server->getResourceController();
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AccessTokenInterface
+ **/
+ public function testAddingStorageWithInvalidClass()
+ {
+ $server = new Server();
+ $server->addStorage(new \StdClass());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException access_token
+ **/
+ public function testAddingStorageWithInvalidKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'nonexistant_storage');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\Storage\AuthorizationCodeInterface
+ **/
+ public function testAddingStorageWithInvalidKeyStorageCombination()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'authorization_code');
+ }
+
+ public function testAddingStorageWithValidKeyOnlySetsThatKey()
+ {
+ $server = new Server();
+ $server->addStorage($this->getMock('OAuth2\Storage\Memory'), 'access_token');
+
+ $reflection = new \ReflectionClass($server);
+ $prop = $reflection->getProperty('storages');
+ $prop->setAccessible(true);
+
+ $storages = $prop->getValue($server); // get the private "storages" property
+
+ $this->assertEquals(1, count($storages));
+ $this->assertTrue(isset($storages['access_token']));
+ $this->assertFalse(isset($storages['authorization_code']));
+ }
+
+ public function testAddingClientStorageSetsClientCredentialsStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddStorageWithNullValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server($memory);
+ $server->addStorage(null, 'refresh_token');
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testNewServerWithNullStorageValue()
+ {
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server = new Server(array(
+ 'client_credentials' => $memory,
+ 'refresh_token' => null,
+ ));
+
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertNotNull($client_credentials);
+ $this->assertEquals($client_credentials, $memory);
+
+ $refresh_token = $server->getStorage('refresh_token');
+
+ $this->assertNull($refresh_token);
+ }
+
+ public function testAddingClientCredentialsStorageSetsClientStorageByDefault()
+ {
+ $server = new Server();
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+
+ $this->assertNotNull($client);
+ $this->assertEquals($client, $memory);
+ }
+
+ public function testSettingClientStorageByDefaultDoesNotOverrideSetStorage()
+ {
+ $server = new Server();
+ $pdo = $this->getMockBuilder('OAuth2\Storage\Pdo')
+ ->disableOriginalConstructor()->getMock();
+
+ $memory = $this->getMock('OAuth2\Storage\Memory');
+
+ $server->addStorage($pdo, 'client');
+ $server->addStorage($memory, 'client_credentials');
+
+ $client = $server->getStorage('client');
+ $client_credentials = $server->getStorage('client_credentials');
+
+ $this->assertEquals($client, $pdo);
+ $this->assertEquals($client_credentials, $memory);
+ }
+
+ public function testAddingResponseType()
+ {
+ $storage = $this->getMock('OAuth2\Storage\Memory');
+ $storage
+ ->expects($this->any())
+ ->method('getClientDetails')
+ ->will($this->returnValue(array('client_id' => 'some_client')));
+ $storage
+ ->expects($this->any())
+ ->method('checkRestrictedGrantType')
+ ->will($this->returnValue(true));
+
+ // add with the "code" key explicitly set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server();
+ $server->addStorage($storage);
+ $server->addResponseType($codeType);
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+
+ // add with the "code" key not set
+ $codeType = new AuthorizationCode($storage);
+ $server = new Server(array($storage), array(), array(), array($codeType));
+ $request = new Request(array(
+ 'response_type' => 'code',
+ 'client_id' => 'some_client',
+ 'redirect_uri' => 'http://example.com',
+ 'state' => 'xyx',
+ ));
+ $server->handleAuthorizeRequest($request, $response = new Response(), true);
+
+ // the response is successful
+ $this->assertEquals($response->getStatusCode(), 302);
+ $parts = parse_url($response->getHttpHeader('Location'));
+ parse_str($parts['query'], $query);
+ $this->assertTrue(isset($query['code']));
+ $this->assertFalse(isset($query['error']));
+ }
+
+ public function testCustomClientAssertionType()
+ {
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'authorization_code',
+ 'client_id' =>'Test Client ID',
+ 'code' => 'testcode',
+ ));
+ // verify the mock clientAssertionType was called as expected
+ $clientAssertionType = $this->getMock('OAuth2\ClientAssertionType\ClientAssertionTypeInterface', array('validateRequest', 'getClientId'));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('validateRequest')
+ ->will($this->returnValue(true));
+ $clientAssertionType
+ ->expects($this->once())
+ ->method('getClientId')
+ ->will($this->returnValue('Test Client ID'));
+
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(), array(), array(), null, null, $clientAssertionType);
+ $server->handleTokenRequest($request, $response = new Response());
+ }
+
+ public function testHttpBasicConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server(array($storage), array(
+ 'allow_credentials_in_request_body' => false,
+ 'allow_public_clients' => false
+ ));
+ $server->getTokenController();
+ $httpBasic = $server->getClientAssertionType();
+
+ $reflection = new \ReflectionClass($httpBasic);
+ $prop = $reflection->getProperty('config');
+ $prop->setAccessible(true);
+
+ $config = $prop->getValue($httpBasic); // get the private "config" property
+
+ $this->assertEquals($config['allow_credentials_in_request_body'], false);
+ $this->assertEquals($config['allow_public_clients'], false);
+ }
+
+ public function testRefreshTokenConfig()
+ {
+ // create mock storage
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server1 = new Server(array($storage));
+ $server2 = new Server(array($storage), array('always_issue_new_refresh_token' => true, 'unset_refresh_token_after_use' => false));
+
+ $server1->getTokenController();
+ $refreshToken1 = $server1->getGrantType('refresh_token');
+
+ $server2->getTokenController();
+ $refreshToken2 = $server2->getGrantType('refresh_token');
+
+ $reflection1 = new \ReflectionClass($refreshToken1);
+ $prop1 = $reflection1->getProperty('config');
+ $prop1->setAccessible(true);
+
+ $reflection2 = new \ReflectionClass($refreshToken2);
+ $prop2 = $reflection2->getProperty('config');
+ $prop2->setAccessible(true);
+
+ // get the private "config" property
+ $config1 = $prop1->getValue($refreshToken1);
+ $config2 = $prop2->getValue($refreshToken2);
+
+ $this->assertEquals($config1['always_issue_new_refresh_token'], false);
+ $this->assertEquals($config2['always_issue_new_refresh_token'], true);
+
+ $this->assertEquals($config1['unset_refresh_token_after_use'], true);
+ $this->assertEquals($config2['unset_refresh_token_after_use'], false);
+ }
+
+ /**
+ * Test setting "always_issue_new_refresh_token" on a server level
+ *
+ * @see test/OAuth2/GrantType/RefreshTokenTest::testValidRefreshTokenWithNewRefreshTokenInResponse
+ **/
+ public function testValidRefreshTokenWithNewRefreshTokenInResponse()
+ {
+ $storage = Bootstrap::getInstance()->getMemoryStorage();
+ $server = new Server($storage, array('always_issue_new_refresh_token' => true));
+
+ $request = TestRequest::createPost(array(
+ 'grant_type' => 'refresh_token', // valid grant type
+ 'client_id' => 'Test Client ID', // valid client id
+ 'client_secret' => 'TestSecret', // valid client secret
+ 'refresh_token' => 'test-refreshtoken', // valid refresh token
+ ));
+ $token = $server->grantAccessToken($request, new Response());
+ $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
+
+ $refresh_token = $storage->getRefreshToken($token['refresh_token']);
+ $this->assertNotNull($refresh_token);
+ $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
+ $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
+ $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
+ $used_token = $storage->getRefreshToken('test-refreshtoken');
+ $this->assertFalse($used_token, 'the refresh token used is no longer valid');
+ }
+
+ /**
+ * @expectedException InvalidArgumentException OAuth2\ResponseType\AuthorizationCodeInterface
+ **/
+ public function testAddingUnknownResponseTypeThrowsException()
+ {
+ $server = new Server();
+ $server->addResponseType($this->getMock('OAuth2\ResponseType\ResponseTypeInterface'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\PublicKeyInterface
+ **/
+ public function testUsingJwtAccessTokensWithoutPublicKeyStorageThrowsException()
+ {
+ $server = new Server(array(), array('use_jwt_access_tokens' => true));
+ $server->addGrantType($this->getMock('OAuth2\GrantType\GrantTypeInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+ $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
+
+ $server->getTokenController();
+ }
+
+ public function testUsingJustJwtAccessTokenStorageWithResourceControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+
+ $this->assertNotNull($server->getResourceController());
+ $this->assertInstanceOf('OAuth2\Storage\PublicKeyInterface', $server->getStorage('public_key'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\Storage\ClientInterface
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithAuthorizeControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+ }
+
+ /**
+ * @expectedException LogicException grant_types
+ **/
+ public function testUsingJustJwtAccessTokenStorageWithTokenControllerThrowsException()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
+ $server->getTokenController();
+ }
+
+ public function testUsingJwtAccessTokenAndClientStorageWithAuthorizeControllerIsOkay()
+ {
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server(array($pubkey, $client), array('use_jwt_access_tokens' => true, 'allow_implicit' => true));
+ $this->assertNotNull($server->getAuthorizeController());
+
+ $this->assertInstanceOf('OAuth2\ResponseType\JwtAccessToken', $server->getResponseType('token'));
+ }
+
+ /**
+ * @expectedException LogicException UserClaims
+ **/
+ public function testUsingOpenIDConnectWithoutUserClaimsThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $server = new Server($client, array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException PublicKeyInterface
+ **/
+ public function testUsingOpenIDConnectWithoutPublicKeyThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OPenID\Storage\UserClaimsInterface');
+ $server = new Server(array($client, $userclaims), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ /**
+ * @expectedException LogicException issuer
+ **/
+ public function testUsingOpenIDConnectWithoutIssuerThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array('use_openid_connect' => true));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithIssuerPublicKeyAndUserClaimsIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertNull($server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\ResponseType\AccessTokenInterface
+ **/
+ public function testUsingOpenIDConnectWithAllowImplicitWithoutTokenStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndUseJwtAccessTokensIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ 'use_jwt_access_tokens' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenStorageIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey, $token), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenResponseTypeIsOkay()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ // $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $server = new Server(array($client, $userclaims, $pubkey), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy',
+ 'allow_implicit' => true,
+ ));
+
+ $token = $this->getMock('OAuth2\ResponseType\AccessTokenInterface');
+ $server->addResponseType($token, 'token');
+
+ $server->getAuthorizeController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
+ $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
+ }
+
+ /**
+ * @expectedException LogicException OAuth2\OpenID\Storage\AuthorizationCodeInterface
+ **/
+ public function testUsingOpenIDConnectWithAuthorizationCodeStorageThrowsException()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testUsingOpenIDConnectWithOpenIDAuthorizationCodeStorageCreatesOpenIDAuthorizationCodeGrantType()
+ {
+ $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
+ $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
+ $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
+ $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
+ $authcode = $this->getMock('OAuth2\OpenID\Storage\AuthorizationCodeInterface');
+
+ $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
+ 'use_openid_connect' => true,
+ 'issuer' => 'someguy'
+ ));
+
+ $server->getTokenController();
+
+ $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
+ }
+
+ public function testMultipleValuedResponseTypeOrderDoesntMatter()
+ {
+ $responseType = $this->getMock('OAuth2\OpenID\ResponseType\IdTokenTokenInterface');
+ $server = new Server(array(), array(), array(), array(
+ 'token id_token' => $responseType,
+ ));
+
+ $this->assertEquals($responseType, $server->getResponseType('id_token token'));
+ }
+
+ public function testAddGrantTypeWithoutKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')));
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKey()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 'ac');
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('ac', key($grantTypes));
+ }
+
+ public function testAddGrantTypeWithKeyNotString()
+ {
+ $server = new Server();
+ $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 42);
+
+ $grantTypes = $server->getGrantTypes();
+ $this->assertEquals('authorization_code', key($grantTypes));
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php
new file mode 100644
index 000000000..b34e0bfc0
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AccessTokenTest.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // change existing token
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID2', 'SOMEOTHERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getAccessToken('newtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('access_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['access_token'], 'newtoken');
+ $this->assertEquals($token['client_id'], 'client ID2');
+ $this->assertEquals($token['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 42;
+ $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEOTHERID', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setAccessToken('revokabletoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ // assert unsetAccessToken returns true
+ $result = $storage->unsetAccessToken('revokabletoken');
+ $this->assertTrue($result);
+
+ // assert token we unset does not exist
+ $token = $storage->getAccessToken('revokabletoken');
+ $this->assertFalse($token);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testUnsetAccessTokenReturnsFalse(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to unset does not exist
+ $token = $storage->getAccessToken('nonexistanttoken');
+ $this->assertFalse($token);
+
+ // assert unsetAccessToken returns false
+ $result = $storage->unsetAccessToken('nonexistanttoken');
+ $this->assertFalse($result);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php
new file mode 100644
index 000000000..2d901b501
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/AuthorizationCodeTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class AuthorizationCodeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAuthorizationCode('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAuthorizationCode('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSetAuthorizationCode(AuthorizationCodeInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert code we are about to add does not exist
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertFalse($code);
+
+ // add new code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID');
+ $this->assertEquals($code['user_id'], 'SOMEUSERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.com');
+ $this->assertEquals($code['expires'], $expires);
+
+ // change existing code
+ $expires = time() + 42;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires);
+ $this->assertTrue($success);
+
+ $code = $storage->getAuthorizationCode('newcode');
+ $this->assertNotNull($code);
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertArrayHasKey('client_id', $code);
+ $this->assertArrayHasKey('user_id', $code);
+ $this->assertArrayHasKey('redirect_uri', $code);
+ $this->assertArrayHasKey('expires', $code);
+ $this->assertEquals($code['authorization_code'], 'newcode');
+ $this->assertEquals($code['client_id'], 'client ID2');
+ $this->assertEquals($code['user_id'], 'SOMEOTHERID');
+ $this->assertEquals($code['redirect_uri'], 'http://example.org');
+ $this->assertEquals($code['expires'], $expires);
+
+ // add new code with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, '');
+ $this->assertTrue($success);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testExpireAccessToken(AccessTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a valid code
+ $expires = time() + 20;
+ $success = $storage->setAuthorizationCode('code-to-expire', 'client ID', 'SOMEUSERID', 'http://example.com', time() + 20);
+ $this->assertTrue($success);
+
+ // verify the new code exists
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertNotNull($code);
+
+ $this->assertArrayHasKey('authorization_code', $code);
+ $this->assertEquals($code['authorization_code'], 'code-to-expire');
+
+ // now expire the code and ensure it's no longer available
+ $storage->expireAuthorizationCode('code-to-expire');
+ $code = $storage->getAuthorizationCode('code-to-expire');
+ $this->assertFalse($code);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php
new file mode 100644
index 000000000..15289af30
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientCredentialsTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckClientCredentials(ClientCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $pass = $storage->checkClientCredentials('fakeclient', 'testpass');
+ $this->assertFalse($pass);
+
+ // invalid password
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'invalidcredentials');
+ $this->assertFalse($pass);
+
+ // valid credentials
+ $pass = $storage->checkClientCredentials('oauth_test_client', 'testpass');
+ $this->assertTrue($pass);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php
new file mode 100644
index 000000000..6a5cc0b49
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ClientTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class ClientTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientDetails(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getClientDetails('fakeclient');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getClientDetails('oauth_test_client');
+ $this->assertNotNull($details);
+ $this->assertArrayHasKey('client_id', $details);
+ $this->assertArrayHasKey('client_secret', $details);
+ $this->assertArrayHasKey('redirect_uri', $details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testCheckRestrictedGrantType(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // Check invalid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'authorization_code');
+ $this->assertFalse($pass);
+
+ // Check valid
+ $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'implicit');
+ $this->assertTrue($pass);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetAccessToken(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $details = $storage->getAccessToken('faketoken');
+ $this->assertFalse($details);
+
+ // valid client_id
+ $details = $storage->getAccessToken('testtoken');
+ $this->assertNotNull($details);
+ }
+
+ /** @dataProvider provideStorage */
+ public function testIsPublicClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $publicClientId = 'public-client-'.rand();
+ $confidentialClientId = 'confidential-client-'.rand();
+
+ // create a new client
+ $success1 = $storage->setClientDetails($publicClientId, '');
+ $success2 = $storage->setClientDetails($confidentialClientId, 'some-secret');
+ $this->assertTrue($success1);
+ $this->assertTrue($success2);
+
+ // assert isPublicClient for both
+ $this->assertTrue($storage->isPublicClient($publicClientId));
+ $this->assertFalse($storage->isPublicClient($confidentialClientId));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testSaveClient(ClientInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ $clientId = 'some-client-'.rand();
+
+ // create a new client
+ $success = $storage->setClientDetails($clientId, 'somesecret', 'http://test.com', 'client_credentials', 'clientscope1', 'brent@brentertainment.com');
+ $this->assertTrue($success);
+
+ // valid client_id
+ $details = $storage->getClientDetails($clientId);
+ $this->assertEquals($details['client_secret'], 'somesecret');
+ $this->assertEquals($details['redirect_uri'], 'http://test.com');
+ $this->assertEquals($details['grant_types'], 'client_credentials');
+ $this->assertEquals($details['scope'], 'clientscope1');
+ $this->assertEquals($details['user_id'], 'brent@brentertainment.com');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php
new file mode 100644
index 000000000..2147f0914
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/DynamoDBTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class DynamoDBTest extends BaseTest
+{
+ public function testGetDefaultScope()
+ {
+ $client = $this->getMockBuilder('\Aws\DynamoDb\DynamoDbClient')
+ ->disableOriginalConstructor()
+ ->setMethods(array('query'))
+ ->getMock();
+
+ $return = $this->getMockBuilder('\Guzzle\Service\Resource\Model')
+ ->setMethods(array('count', 'toArray'))
+ ->getMock();
+
+ $data = array(
+ 'Items' => array(),
+ 'Count' => 0,
+ 'ScannedCount'=> 0
+ );
+
+ $return->expects($this->once())
+ ->method('count')
+ ->will($this->returnValue(count($data)));
+
+ $return->expects($this->once())
+ ->method('toArray')
+ ->will($this->returnValue($data));
+
+ // should return null default scope if none is set in database
+ $client->expects($this->once())
+ ->method('query')
+ ->will($this->returnValue($return));
+
+ $storage = new DynamoDB($client);
+ $this->assertNull($storage->getDefaultScope());
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php
new file mode 100644
index 000000000..a6acbea1f
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtAccessTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Encryption\Jwt;
+
+class JwtAccessTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if (!$storage instanceof PublicKey) {
+ // incompatible storage
+ return;
+ }
+
+ $crypto = new jwtAccessToken($storage);
+
+ $publicKeyStorage = Bootstrap::getInstance()->getMemoryStorage();
+ $encryptionUtil = new Jwt();
+
+ $jwtAccessToken = array(
+ 'access_token' => rand(),
+ 'expires' => time() + 100,
+ 'scope' => 'foo',
+ );
+
+ $token = $encryptionUtil->encode($jwtAccessToken, $storage->getPrivateKey(), $storage->getEncryptionAlgorithm());
+
+ $this->assertNotNull($token);
+
+ $tokenData = $crypto->getAccessToken($token);
+
+ $this->assertTrue(is_array($tokenData));
+
+ /* assert the decoded token is the same */
+ $this->assertEquals($tokenData['access_token'], $jwtAccessToken['access_token']);
+ $this->assertEquals($tokenData['expires'], $jwtAccessToken['expires']);
+ $this->assertEquals($tokenData['scope'], $jwtAccessToken['scope']);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php
new file mode 100644
index 000000000..d0ab9b899
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/JwtBearerTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class JwtBearerTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testGetClientKey(JwtBearerInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // nonexistant client_id
+ $key = $storage->getClientKey('this-is-not-real', 'nor-is-this');
+ $this->assertFalse($key);
+
+ // valid client_id and subject
+ $key = $storage->getClientKey('oauth_test_client', 'test_subject');
+ $this->assertNotNull($key);
+ $this->assertEquals($key, Bootstrap::getInstance()->getTestPublicKey());
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php
new file mode 100644
index 000000000..57eb39072
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PdoTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PdoTest extends BaseTest
+{
+ public function testCreatePdoStorageUsingPdoClass()
+ {
+ $pdo = new \PDO(sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($pdo);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingDSN()
+ {
+ $dsn = sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir());
+ $storage = new Pdo($dsn);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ public function testCreatePdoStorageUsingConfig()
+ {
+ $config = array('dsn' => sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
+ $storage = new Pdo($config);
+
+ $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException dsn
+ */
+ public function testCreatePdoStorageWithoutDSNThrowsException()
+ {
+ $config = array('username' => 'brent', 'password' => 'brentisaballer');
+ $storage = new Pdo($config);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php
new file mode 100644
index 000000000..f85195870
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/PublicKeyTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class PublicKeyTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetAccessToken($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof PublicKeyInterface) {
+ // incompatible storage
+ return;
+ }
+
+ $configDir = Bootstrap::getInstance()->getConfigDir();
+ $globalPublicKey = file_get_contents($configDir.'/keys/id_rsa.pub');
+ $globalPrivateKey = file_get_contents($configDir.'/keys/id_rsa');
+
+ /* assert values from storage */
+ $this->assertEquals($storage->getPublicKey(), $globalPublicKey);
+ $this->assertEquals($storage->getPrivateKey(), $globalPrivateKey);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php
new file mode 100644
index 000000000..314c93195
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/RefreshTokenTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class RefreshTokenTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testSetRefreshToken(RefreshTokenInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // assert token we are about to add does not exist
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertFalse($token);
+
+ // add new token
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken', 'client ID', 'SOMEUSERID', $expires);
+ $this->assertTrue($success);
+
+ $token = $storage->getRefreshToken('refreshtoken');
+ $this->assertNotNull($token);
+ $this->assertArrayHasKey('refresh_token', $token);
+ $this->assertArrayHasKey('client_id', $token);
+ $this->assertArrayHasKey('user_id', $token);
+ $this->assertArrayHasKey('expires', $token);
+ $this->assertEquals($token['refresh_token'], 'refreshtoken');
+ $this->assertEquals($token['client_id'], 'client ID');
+ $this->assertEquals($token['user_id'], 'SOMEUSERID');
+ $this->assertEquals($token['expires'], $expires);
+
+ // add token with scope having an empty string value
+ $expires = time() + 20;
+ $success = $storage->setRefreshToken('refreshtoken2', 'client ID', 'SOMEUSERID', $expires, '');
+ $this->assertTrue($success);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php
new file mode 100644
index 000000000..fd1edeb93
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/ScopeTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace OAuth2\Storage;
+
+use OAuth2\Scope;
+
+class ScopeTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testScopeExists($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ //Test getting scopes
+ $scopeUtil = new Scope($storage);
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1'));
+ $this->assertTrue($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3'));
+ $this->assertFalse($scopeUtil->scopeExists('fakescope'));
+ $this->assertFalse($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3 fakescope'));
+ }
+
+ /** @dataProvider provideStorage */
+ public function testGetDefaultScope($storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ if (!$storage instanceof ScopeInterface) {
+ // incompatible storage
+ return;
+ }
+
+ // test getting default scope
+ $scopeUtil = new Scope($storage);
+ $expected = explode(' ', $scopeUtil->getDefaultScope());
+ $actual = explode(' ', 'defaultscope1 defaultscope2');
+ sort($expected);
+ sort($actual);
+ $this->assertEquals($expected, $actual);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php
new file mode 100644
index 000000000..65655a6b2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/Storage/UserCredentialsTest.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class UserCredentialsTest extends BaseTest
+{
+ /** @dataProvider provideStorage */
+ public function testCheckUserCredentials(UserCredentialsInterface $storage)
+ {
+ if ($storage instanceof NullStorage) {
+ $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
+
+ return;
+ }
+
+ // create a new user for testing
+ $success = $storage->setUser('testusername', 'testpass', 'Test', 'User');
+ $this->assertTrue($success);
+
+ // correct credentials
+ $this->assertTrue($storage->checkUserCredentials('testusername', 'testpass'));
+ // invalid password
+ $this->assertFalse($storage->checkUserCredentials('testusername', 'fakepass'));
+ // invalid username
+ $this->assertFalse($storage->checkUserCredentials('fakeusername', 'testpass'));
+
+ // invalid username
+ $this->assertFalse($storage->getUserDetails('fakeusername'));
+
+ // ensure all properties are set
+ $user = $storage->getUserDetails('testusername');
+ $this->assertTrue($user !== false);
+ $this->assertArrayHasKey('user_id', $user);
+ $this->assertArrayHasKey('first_name', $user);
+ $this->assertArrayHasKey('last_name', $user);
+ $this->assertEquals($user['user_id'], 'testusername');
+ $this->assertEquals($user['first_name'], 'Test');
+ $this->assertEquals($user['last_name'], 'User');
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php b/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php
new file mode 100644
index 000000000..a2e000e22
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/OAuth2/TokenType/BearerTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace OAuth2\TokenType;
+
+use OAuth2\Request\TestRequest;
+use OAuth2\Response;
+
+class BearerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testValidContentTypeWithCharset()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals($param, 'ThisIsMyAccessToken');
+ }
+
+ public function testInvalidContentType()
+ {
+ $bearer = new Bearer();
+ $request = TestRequest::createPost(array(
+ 'access_token' => 'ThisIsMyAccessToken'
+ ));
+ $request->server['CONTENT_TYPE'] = 'application/json; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertNull($param);
+ $this->assertEquals($response->getStatusCode(), 400);
+ $this->assertEquals($response->getParameter('error'), 'invalid_request');
+ $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
+ }
+
+ public function testValidRequestUsingAuthorizationHeader()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->headers['AUTHORIZATION'] = 'Bearer MyToken';
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+
+ public function testValidRequestUsingAuthorizationHeaderCaseInsensitive()
+ {
+ $bearer = new Bearer();
+ $request = new TestRequest();
+ $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
+ $request->headers['Authorization'] = 'Bearer MyToken';
+
+ $param = $bearer->getAccessTokenParameter($request, $response = new Response());
+ $this->assertEquals('MyToken', $param);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/bootstrap.php b/vendor/bshaffer/oauth2-server-php/test/bootstrap.php
new file mode 100644
index 000000000..0a4af0716
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/bootstrap.php
@@ -0,0 +1,12 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/cleanup.php b/vendor/bshaffer/oauth2-server-php/test/cleanup.php
new file mode 100644
index 000000000..8663a901b
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/cleanup.php
@@ -0,0 +1,15 @@
+<?php
+
+require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
+OAuth2\Autoloader::register();
+
+// register test classes
+OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
+
+// register vendors if possible
+if (file_exists(__DIR__.'/../vendor/autoload.php')) {
+ require_once(__DIR__.'/../vendor/autoload.php');
+}
+
+// remove the dynamoDB database that was created for this build
+OAuth2\Storage\Bootstrap::getInstance()->cleanupTravisDynamoDb();
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa
new file mode 100644
index 000000000..e8b9eff2d
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV
+8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN
+QDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB
+AoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA
++WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w
+C6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb
+oaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56
+1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0
+CPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg
+VHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr
+uxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo
+cj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA
+HoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R
+-----END RSA PRIVATE KEY----- \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub
new file mode 100644
index 000000000..1ac15f5eb
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/keys/id_rsa.pub
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL
+MAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe
+Fw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw
+CQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf
+MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs
+NjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw
+izIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu
+Be+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K
+vCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh
+dGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD
+lM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl
+aViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL
+FRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/vendor/bshaffer/oauth2-server-php/test/config/storage.json b/vendor/bshaffer/oauth2-server-php/test/config/storage.json
new file mode 100644
index 000000000..52d3f2399
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/config/storage.json
@@ -0,0 +1,188 @@
+{
+ "authorization_codes": {
+ "testcode": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "IDTOKEN"
+ },
+ "testcode-with-scope": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "scope": "scope1 scope2"
+ },
+ "testcode-expired": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "1356998400"
+ },
+ "testcode-empty-secret": {
+ "client_id": "Test Client ID Empty Secret",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999"
+ },
+ "testcode-openid": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "",
+ "expires": "9999999999",
+ "id_token": "test_id_token"
+ },
+ "testcode-redirect-uri": {
+ "client_id": "Test Client ID",
+ "user_id": "",
+ "redirect_uri": "http://brentertainment.com/voil%C3%A0",
+ "expires": "9999999999",
+ "id_token": "IDTOKEN"
+ }
+ },
+ "client_credentials" : {
+ "Test Client ID": {
+ "client_secret": "TestSecret"
+ },
+ "Test Client ID with Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": "http://brentertainment.com"
+ },
+ "Test Client ID with Buggy Redirect Uri": {
+ "client_secret": "TestSecret2",
+ "redirect_uri": " http://brentertainment.com"
+ },
+ "Test Client ID with Multiple Redirect Uris": {
+ "client_secret": "TestSecret3",
+ "redirect_uri": "http://brentertainment.com http://morehazards.com"
+ },
+ "Test Client ID with Redirect Uri Parts": {
+ "client_secret": "TestSecret4",
+ "redirect_uri": "http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true"
+ },
+ "Test Some Other Client": {
+ "client_secret": "TestSecret3"
+ },
+ "Test Client ID Empty Secret": {
+ "client_secret": ""
+ },
+ "Test Client ID For Password Grant": {
+ "grant_types": "password",
+ "client_secret": ""
+ },
+ "Client ID With User ID": {
+ "client_secret": "TestSecret",
+ "user_id": "brent@brentertainment.com"
+ },
+ "oauth_test_client": {
+ "client_secret": "testpass",
+ "grant_types": "implicit password"
+ }
+ },
+ "user_credentials" : {
+ "test-username": {
+ "password": "testpass"
+ },
+ "testusername": {
+ "password": "testpass"
+ },
+ "testuser": {
+ "password": "password",
+ "email": "testuser@test.com",
+ "email_verified": true
+ },
+ "johndoe": {
+ "password": "password"
+ }
+ },
+ "refresh_tokens" : {
+ "test-refreshtoken": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": null
+ },
+ "test-refreshtoken-with-scope": {
+ "refresh_token": "test-refreshtoken",
+ "client_id": "Test Client ID",
+ "user_id": "test-username",
+ "expires": 0,
+ "scope": "scope1 scope2"
+ }
+ },
+ "access_tokens" : {
+ "accesstoken-expired": {
+ "access_token": "accesstoken-expired",
+ "client_id": "Test Client ID",
+ "expires": 1234567,
+ "scope": null
+ },
+ "accesstoken-scope": {
+ "access_token": "accesstoken-scope",
+ "client_id": "Test Client ID",
+ "expires": 99999999900,
+ "scope": "testscope"
+ },
+ "accesstoken-openid-connect": {
+ "access_token": "accesstoken-openid-connect",
+ "client_id": "Test Client ID",
+ "user_id": "testuser",
+ "expires": 99999999900,
+ "scope": "openid email"
+ },
+ "accesstoken-malformed": {
+ "access_token": "accesstoken-mallformed",
+ "expires": 99999999900,
+ "scope": "testscope"
+ }
+ },
+ "jwt": {
+ "Test Client ID": {
+ "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5/SxVlE8gnpFqCxgl2wjhzY7u\ncEi00s0kUg3xp7lVEvgLgYcAnHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1o\nwR0p4d9pOaJK07d01+RzoQLOIQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8\nUlvdRKBxriRnlP3qJQIDAQAB\n-----END PUBLIC KEY-----",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Test Client ID PHP-5.2": {
+ "key": "mysecretkey",
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "Missing Key Client PHP-5.2": {
+ "key": null,
+ "subject": "testuser@ourdomain.com"
+ },
+ "oauth_test_client": {
+ "key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "subject": "test_subject"
+ }
+ },
+ "jti": [
+ {
+ "issuer": "Test Client ID",
+ "subject": "testuser@ourdomain.com",
+ "audience": "http://myapp.com/oauth/auth",
+ "expires": 99999999900,
+ "jti": "used_jti"
+ }
+ ],
+ "supported_scopes" : [
+ "scope1",
+ "scope2",
+ "scope3",
+ "clientscope1",
+ "clientscope2",
+ "clientscope3",
+ "supportedscope1",
+ "supportedscope2",
+ "supportedscope3",
+ "supportedscope4"
+ ],
+ "keys": {
+ "public_key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
+ "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV\n8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN\nQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB\nAoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA\n+WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w\nC6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb\noaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56\n1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0\nCPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg\nVHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr\nuxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo\ncj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA\nHoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R\n-----END RSA PRIVATE KEY-----"
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php
new file mode 100644
index 000000000..7bbce28a4
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Request/TestRequest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace OAuth2\Request;
+
+use OAuth2\Request;
+use OAuth2\RequestInterface;
+
+/**
+*
+*/
+class TestRequest extends Request implements RequestInterface
+{
+ public $query, $request, $server, $headers;
+
+ public function __construct()
+ {
+ $this->query = $_GET;
+ $this->request = $_POST;
+ $this->server = $_SERVER;
+ $this->headers = array();
+ }
+
+ public function query($name, $default = null)
+ {
+ return isset($this->query[$name]) ? $this->query[$name] : $default;
+ }
+
+ public function request($name, $default = null)
+ {
+ return isset($this->request[$name]) ? $this->request[$name] : $default;
+ }
+
+ public function server($name, $default = null)
+ {
+ return isset($this->server[$name]) ? $this->server[$name] : $default;
+ }
+
+ public function getAllQueryParameters()
+ {
+ return $this->query;
+ }
+
+ public function setQuery(array $query)
+ {
+ $this->query = $query;
+ }
+
+ public function setPost(array $params)
+ {
+ $this->server['REQUEST_METHOD'] = 'POST';
+ $this->request = $params;
+ }
+
+ public static function createPost(array $params = array())
+ {
+ $request = new self();
+ $request->setPost($params);
+
+ return $request;
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php
new file mode 100755
index 000000000..f0b1274a2
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/BaseTest.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace OAuth2\Storage;
+
+abstract class BaseTest extends \PHPUnit_Framework_TestCase
+{
+ public function provideStorage()
+ {
+ $memory = Bootstrap::getInstance()->getMemoryStorage();
+ $sqlite = Bootstrap::getInstance()->getSqlitePdo();
+ $mysql = Bootstrap::getInstance()->getMysqlPdo();
+ $postgres = Bootstrap::getInstance()->getPostgresPdo();
+ $mongo = Bootstrap::getInstance()->getMongo();
+ $mongoDb = Bootstrap::getInstance()->getMongoDB();
+ $redis = Bootstrap::getInstance()->getRedisStorage();
+ $cassandra = Bootstrap::getInstance()->getCassandraStorage();
+ $dynamodb = Bootstrap::getInstance()->getDynamoDbStorage();
+ $couchbase = Bootstrap::getInstance()->getCouchbase();
+
+ /* hack until we can fix "default_scope" dependencies in other tests */
+ $memory->defaultScope = 'defaultscope1 defaultscope2';
+
+ return array(
+ array($memory),
+ array($sqlite),
+ array($mysql),
+ array($postgres),
+ array($mongo),
+ array($mongoDb),
+ array($redis),
+ array($cassandra),
+ array($dynamodb),
+ array($couchbase),
+ );
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php
new file mode 100755
index 000000000..3d7bdd4e9
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/Bootstrap.php
@@ -0,0 +1,967 @@
+<?php
+
+namespace OAuth2\Storage;
+
+class Bootstrap
+{
+ const DYNAMODB_PHP_VERSION = 'none';
+
+ protected static $instance;
+ private $mysql;
+ private $sqlite;
+ private $postgres;
+ private $mongo;
+ private $mongoDb;
+ private $redis;
+ private $cassandra;
+ private $configDir;
+ private $dynamodb;
+ private $couchbase;
+
+ public function __construct()
+ {
+ $this->configDir = __DIR__.'/../../../config';
+ }
+
+ public static function getInstance()
+ {
+ if (!self::$instance) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
+
+ public function getSqlitePdo()
+ {
+ if (!$this->sqlite) {
+ $this->removeSqliteDb();
+ $pdo = new \PDO(sprintf('sqlite://%s', $this->getSqliteDir()));
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->createSqliteDb($pdo);
+
+ $this->sqlite = new Pdo($pdo);
+ }
+
+ return $this->sqlite;
+ }
+
+ public function getPostgresPdo()
+ {
+ if (!$this->postgres) {
+ if (in_array('pgsql', \PDO::getAvailableDrivers())) {
+ $this->removePostgresDb();
+ $this->createPostgresDb();
+ if ($pdo = $this->getPostgresDriver()) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->populatePostgresDb($pdo);
+ $this->postgres = new Pdo($pdo);
+ }
+ } else {
+ $this->postgres = new NullStorage('Postgres', 'Missing postgres PDO extension.');
+ }
+ }
+
+ return $this->postgres;
+ }
+
+ public function getPostgresDriver()
+ {
+ try {
+ $pdo = new \PDO('pgsql:host=localhost;dbname=oauth2_server_php', 'postgres');
+
+ return $pdo;
+ } catch (\PDOException $e) {
+ $this->postgres = new NullStorage('Postgres', $e->getMessage());
+ }
+ }
+
+ public function getMemoryStorage()
+ {
+ return new Memory(json_decode(file_get_contents($this->configDir. '/storage.json'), true));
+ }
+
+ public function getRedisStorage()
+ {
+ if (!$this->redis) {
+ if (class_exists('Predis\Client')) {
+ $redis = new \Predis\Client();
+ if ($this->testRedisConnection($redis)) {
+ $redis->flushdb();
+ $this->redis = new Redis($redis);
+ $this->createRedisDb($this->redis);
+ } else {
+ $this->redis = new NullStorage('Redis', 'Unable to connect to redis server on port 6379');
+ }
+ } else {
+ $this->redis = new NullStorage('Redis', 'Missing redis library. Please run "composer.phar require predis/predis:dev-master"');
+ }
+ }
+
+ return $this->redis;
+ }
+
+ private function testRedisConnection(\Predis\Client $redis)
+ {
+ try {
+ $redis->connect();
+ } catch (\Predis\CommunicationException $exception) {
+ // we were unable to connect to the redis server
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getMysqlPdo()
+ {
+ if (!$this->mysql) {
+ $pdo = null;
+ try {
+ $pdo = new \PDO('mysql:host=localhost;', 'root');
+ } catch (\PDOException $e) {
+ $this->mysql = new NullStorage('MySQL', 'Unable to connect to MySQL on root@localhost');
+ }
+
+ if ($pdo) {
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+ $this->removeMysqlDb($pdo);
+ $this->createMysqlDb($pdo);
+
+ $this->mysql = new Pdo($pdo);
+ }
+ }
+
+ return $this->mysql;
+ }
+
+ public function getMongo()
+ {
+ if (!$this->mongo) {
+ if (class_exists('MongoClient')) {
+ $mongo = new \MongoClient('mongodb://localhost:27017', array('connect' => false));
+ if ($this->testMongoConnection($mongo)) {
+ $db = $mongo->oauth2_server_php_legacy;
+ $this->removeMongo($db);
+ $this->createMongo($db);
+
+ $this->mongo = new Mongo($db);
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Unable to connect to mongo server on "localhost:27017"');
+ }
+ } else {
+ $this->mongo = new NullStorage('Mongo', 'Missing mongo php extension. Please install mongo.so');
+ }
+ }
+
+ return $this->mongo;
+ }
+
+ public function getMongoDb()
+ {
+ if (!$this->mongoDb) {
+ if (class_exists('MongoDB\Client')) {
+ $mongoDb = new \MongoDB\Client('mongodb://localhost:27017');
+ if ($this->testMongoDBConnection($mongoDb)) {
+ $db = $mongoDb->oauth2_server_php;
+ $this->removeMongoDb($db);
+ $this->createMongoDb($db);
+
+ $this->mongoDb = new MongoDB($db);
+ } else {
+ $this->mongoDb = new NullStorage('MongoDB', 'Unable to connect to mongo server on "localhost:27017"');
+ }
+ } else {
+ $this->mongoDb = new NullStorage('MongoDB', 'Missing MongoDB php extension. Please install mongodb.so');
+ }
+ }
+
+ return $this->mongoDb;
+ }
+
+ private function testMongoConnection(\MongoClient $mongo)
+ {
+ try {
+ $mongo->connect();
+ } catch (\MongoConnectionException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private function testMongoDBConnection(\MongoDB\Client $mongo)
+ {
+ return true;
+ }
+
+ public function getCouchbase()
+ {
+ if (!$this->couchbase) {
+ if ($this->getEnvVar('SKIP_COUCHBASE_TESTS')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Skipping Couchbase tests');
+ } elseif (!class_exists('Couchbase')) {
+ $this->couchbase = new NullStorage('Couchbase', 'Missing Couchbase php extension. Please install couchbase.so');
+ } else {
+ // round-about way to make sure couchbase is working
+ // this is required because it throws a "floating point exception" otherwise
+ $code = "new \Couchbase(array('localhost:8091'), '', '', 'auth', false);";
+ $exec = sprintf('php -r "%s"', $code);
+ $ret = exec($exec, $test, $var);
+ if ($ret != 0) {
+ $couchbase = new \Couchbase(array('localhost:8091'), '', '', 'auth', false);
+ if ($this->testCouchbaseConnection($couchbase)) {
+ $this->clearCouchbase($couchbase);
+ $this->createCouchbaseDB($couchbase);
+
+ $this->couchbase = new CouchbaseDB($couchbase);
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Unable to connect to Couchbase server on "localhost:8091"');
+ }
+ } else {
+ $this->couchbase = new NullStorage('Couchbase', 'Error while trying to connect to Couchbase');
+ }
+ }
+ }
+
+ return $this->couchbase;
+ }
+
+ private function testCouchbaseConnection(\Couchbase $couchbase)
+ {
+ try {
+ if (count($couchbase->getServers()) > 0) {
+ return true;
+ }
+ } catch (\CouchbaseException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public function getCassandraStorage()
+ {
+ if (!$this->cassandra) {
+ if (class_exists('phpcassa\ColumnFamily')) {
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ if ($this->testCassandraConnection($cassandra)) {
+ $this->removeCassandraDb();
+ $this->cassandra = new Cassandra($cassandra);
+ $this->createCassandraDb($this->cassandra);
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Unable to connect to cassandra server on "127.0.0.1:9160"');
+ }
+ } else {
+ $this->cassandra = new NullStorage('Cassandra', 'Missing cassandra library. Please run "composer.phar require thobbs/phpcassa:dev-master"');
+ }
+ }
+
+ return $this->cassandra;
+ }
+
+ private function testCassandraConnection(\phpcassa\Connection\ConnectionPool $cassandra)
+ {
+ try {
+ new \phpcassa\SystemManager('localhost:9160');
+ } catch (\Exception $e) {
+ return false;
+ }
+
+ return true;
+ }
+
+ private function removeCassandraDb()
+ {
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ try {
+ $sys->drop_keyspace('oauth2_test');
+ } catch (\cassandra\InvalidRequestException $e) {
+
+ }
+ }
+
+ private function createCassandraDb(Cassandra $storage)
+ {
+ // create the cassandra keyspace and column family
+ $sys = new \phpcassa\SystemManager('localhost:9160');
+
+ $sys->create_keyspace('oauth2_test', array(
+ "strategy_class" => \phpcassa\Schema\StrategyClass::SIMPLE_STRATEGY,
+ "strategy_options" => array('replication_factor' => '1')
+ ));
+
+ $sys->create_column_family('oauth2_test', 'auth');
+ $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
+ $cf = new \phpcassa\ColumnFamily($cassandra, 'auth');
+
+ // populate the data
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+
+ $cf->insert("oauth_public_keys:ClientID_One", array('__data' => json_encode(array("public_key" => "client_1_public", "private_key" => "client_1_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:ClientID_Two", array('__data' => json_encode(array("public_key" => "client_2_public", "private_key" => "client_2_private", "encryption_algorithm" => "RS256"))));
+ $cf->insert("oauth_public_keys:", array('__data' => json_encode(array("public_key" => $this->getTestPublicKey(), "private_key" => $this->getTestPrivateKey(), "encryption_algorithm" => "RS256"))));
+
+ $cf->insert("oauth_users:testuser", array('__data' =>json_encode(array("password" => "password", "email" => "testuser@test.com", "email_verified" => true))));
+
+ }
+
+ private function createSqliteDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeSqliteDb()
+ {
+ if (file_exists($this->getSqliteDir())) {
+ unlink($this->getSqliteDir());
+ }
+ }
+
+ private function createMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('CREATE DATABASE oauth2_server_php');
+ $pdo->exec('USE oauth2_server_php');
+ $this->runPdoSql($pdo);
+ }
+
+ private function removeMysqlDb(\PDO $pdo)
+ {
+ $pdo->exec('DROP DATABASE IF EXISTS oauth2_server_php');
+ }
+
+ private function createPostgresDb()
+ {
+ if (!`psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='postgres'"`) {
+ `createuser -s -r postgres`;
+ }
+
+ `createdb -O postgres oauth2_server_php`;
+ }
+
+ private function populatePostgresDb(\PDO $pdo)
+ {
+ $this->runPdoSql($pdo);
+ }
+
+ private function removePostgresDb()
+ {
+ if (trim(`psql -l | grep oauth2_server_php | wc -l`)) {
+ `dropdb oauth2_server_php`;
+ }
+ }
+
+ public function runPdoSql(\PDO $pdo)
+ {
+ $storage = new Pdo($pdo);
+ foreach (explode(';', $storage->getBuildSql()) as $statement) {
+ $result = $pdo->exec($statement);
+ }
+
+ // set up scopes
+ $sql = 'INSERT INTO oauth_scopes (scope) VALUES (?)';
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $pdo->prepare($sql)->execute(array($supportedScope));
+ }
+
+ $sql = 'INSERT INTO oauth_scopes (scope, is_default) VALUES (?, ?)';
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $pdo->prepare($sql)->execute(array($defaultScope, true));
+ }
+
+ // set up clients
+ $sql = 'INSERT INTO oauth_clients (client_id, client_secret, scope, grant_types) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('Test Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('Test Client ID 2', 'TestSecret', 'clientscope1 clientscope2 clientscope3', null));
+ $pdo->prepare($sql)->execute(array('Test Default Scope Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'testpass', null, 'implicit password'));
+
+ // set up misc
+ $sql = 'INSERT INTO oauth_access_tokens (access_token, client_id, expires, user_id) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testtoken', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), null));
+ $pdo->prepare($sql)->execute(array('accesstoken-openid-connect', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), 'testuser'));
+
+ $sql = 'INSERT INTO oauth_authorization_codes (authorization_code, client_id, expires) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testcode', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour'))));
+
+ $sql = 'INSERT INTO oauth_users (username, password, email, email_verified) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('testuser', 'password', 'testuser@test.com', true));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('ClientID_One', 'client_1_public', 'client_1_private', 'RS256'));
+ $pdo->prepare($sql)->execute(array('ClientID_Two', 'client_2_public', 'client_2_private', 'RS256'));
+
+ $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
+ $pdo->prepare($sql)->execute(array(null, $this->getTestPublicKey(), $this->getTestPrivateKey(), 'RS256'));
+
+ $sql = 'INSERT INTO oauth_jwt (client_id, subject, public_key) VALUES (?, ?, ?)';
+ $pdo->prepare($sql)->execute(array('oauth_test_client', 'test_subject', $this->getTestPublicKey()));
+ }
+
+ public function getSqliteDir()
+ {
+ return $this->configDir. '/test.sqlite';
+ }
+
+ public function getConfigDir()
+ {
+ return $this->configDir;
+ }
+
+ private function createCouchbaseDB(\Couchbase $db)
+ {
+ $db->set('oauth_clients-oauth_test_client',json_encode(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ )));
+
+ $db->set('oauth_access_tokens-testtoken',json_encode(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_authorization_codes-testcode',json_encode(array(
+ 'access_token' => "testcode",
+ 'client_id' => "Some Client"
+ )));
+
+ $db->set('oauth_users-testuser',json_encode(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ )));
+
+ $db->set('oauth_jwt-oauth_test_client',json_encode(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ )));
+ }
+
+ private function clearCouchbase(\Couchbase $cb)
+ {
+ $cb->delete('oauth_authorization_codes-new-openid-code');
+ $cb->delete('oauth_access_tokens-newtoken');
+ $cb->delete('oauth_authorization_codes-newcode');
+ $cb->delete('oauth_refresh_tokens-refreshtoken');
+ }
+
+ private function createMongo(\MongoDB $db)
+ {
+ $db->oauth_clients->insert(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ ));
+
+ $db->oauth_access_tokens->insert(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_authorization_codes->insert(array(
+ 'authorization_code' => "testcode",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_users->insert(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ ));
+
+ $db->oauth_keys->insert(array(
+ 'client_id' => null,
+ 'public_key' => $this->getTestPublicKey(),
+ 'private_key' => $this->getTestPrivateKey(),
+ 'encryption_algorithm' => 'RS256'
+ ));
+
+ $db->oauth_jwt->insert(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ ));
+ }
+
+ public function removeMongo(\MongoDB $db)
+ {
+ $db->drop();
+ }
+
+ private function createMongoDB(\MongoDB\Database $db)
+ {
+ $db->oauth_clients->insertOne(array(
+ 'client_id' => "oauth_test_client",
+ 'client_secret' => "testpass",
+ 'redirect_uri' => "http://example.com",
+ 'grant_types' => 'implicit password'
+ ));
+
+ $db->oauth_access_tokens->insertOne(array(
+ 'access_token' => "testtoken",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_authorization_codes->insertOne(array(
+ 'authorization_code' => "testcode",
+ 'client_id' => "Some Client"
+ ));
+
+ $db->oauth_users->insertOne(array(
+ 'username' => 'testuser',
+ 'password' => 'password',
+ 'email' => 'testuser@test.com',
+ 'email_verified' => true,
+ ));
+
+ $db->oauth_keys->insertOne(array(
+ 'client_id' => null,
+ 'public_key' => $this->getTestPublicKey(),
+ 'private_key' => $this->getTestPrivateKey(),
+ 'encryption_algorithm' => 'RS256'
+ ));
+
+ $db->oauth_jwt->insertOne(array(
+ 'client_id' => 'oauth_test_client',
+ 'key' => $this->getTestPublicKey(),
+ 'subject' => 'test_subject',
+ ));
+ }
+
+ public function removeMongoDB(\MongoDB\Database $db)
+ {
+ $db->drop();
+ }
+
+ private function createRedisDb(Redis $storage)
+ {
+ $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
+ $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
+ $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
+ $storage->setUser("testuser", "password");
+
+ $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
+ $storage->setScope('defaultscope1 defaultscope2', null, 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
+ $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
+
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
+ $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
+
+ $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
+ $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
+
+ $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
+ }
+
+ public function getTestPublicKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa.pub');
+ }
+
+ private function getTestPrivateKey()
+ {
+ return file_get_contents(__DIR__.'/../../../config/keys/id_rsa');
+ }
+
+ public function getDynamoDbStorage()
+ {
+ if (!$this->dynamodb) {
+ // only run once per travis build
+ if (true == $this->getEnvVar('TRAVIS')) {
+ if (self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Skipping for travis.ci - only run once per build');
+
+ return;
+ }
+ }
+ if (class_exists('\Aws\DynamoDb\DynamoDbClient')) {
+ if ($client = $this->getDynamoDbClient()) {
+ // travis runs a unique set of tables per build, to avoid conflict
+ $prefix = '';
+ if ($build_id = $this->getEnvVar('TRAVIS_JOB_NUMBER')) {
+ $prefix = sprintf('build_%s_', $build_id);
+ } else {
+ if (!$this->deleteDynamoDb($client, $prefix, true)) {
+ return $this->dynamodb = new NullStorage('DynamoDb', 'Timed out while waiting for DynamoDB deletion (30 seconds)');
+ }
+ }
+ $this->createDynamoDb($client, $prefix);
+ $this->populateDynamoDb($client, $prefix);
+ $config = array(
+ 'client_table' => $prefix.'oauth_clients',
+ 'access_token_table' => $prefix.'oauth_access_tokens',
+ 'refresh_token_table' => $prefix.'oauth_refresh_tokens',
+ 'code_table' => $prefix.'oauth_authorization_codes',
+ 'user_table' => $prefix.'oauth_users',
+ 'jwt_table' => $prefix.'oauth_jwt',
+ 'scope_table' => $prefix.'oauth_scopes',
+ 'public_key_table' => $prefix.'oauth_public_keys',
+ );
+ $this->dynamodb = new DynamoDB($client, $config);
+ } elseif (!$this->dynamodb) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'unable to connect to DynamoDB');
+ }
+ } else {
+ $this->dynamodb = new NullStorage('DynamoDb', 'Missing DynamoDB library. Please run "composer.phar require aws/aws-sdk-php:dev-master');
+ }
+ }
+
+ return $this->dynamodb;
+ }
+
+ private function getDynamoDbClient()
+ {
+ $config = array();
+ // check for environment variables
+ if (($key = $this->getEnvVar('AWS_ACCESS_KEY_ID')) && ($secret = $this->getEnvVar('AWS_SECRET_KEY'))) {
+ $config['key'] = $key;
+ $config['secret'] = $secret;
+ } else {
+ // fall back on ~/.aws/credentials file
+ // @see http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#credential-profiles
+ if (!file_exists($this->getEnvVar('HOME') . '/.aws/credentials')) {
+ $this->dynamodb = new NullStorage('DynamoDb', 'No aws credentials file found, and no AWS_ACCESS_KEY_ID or AWS_SECRET_KEY environment variable set');
+
+ return;
+ }
+
+ // set profile in AWS_PROFILE environment variable, defaults to "default"
+ $config['profile'] = $this->getEnvVar('AWS_PROFILE', 'default');
+ }
+
+ // set region in AWS_REGION environment variable, defaults to "us-east-1"
+ $config['region'] = $this->getEnvVar('AWS_REGION', \Aws\Common\Enum\Region::US_EAST_1);
+
+ return \Aws\DynamoDb\DynamoDbClient::factory($config);
+ }
+
+ private function deleteDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null, $waitForDeletion = false)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+
+ // Delete all table.
+ foreach ($tablesList as $key => $table) {
+ try {
+ $client->deleteTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ }
+ }
+
+ // Wait for deleting
+ if ($waitForDeletion) {
+ $retries = 5;
+ $nbTableDeleted = 0;
+ while ($nbTableDeleted != $nbTables) {
+ $nbTableDeleted = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableDeleted++;
+ }
+ }
+ if ($nbTableDeleted != $nbTables) {
+ if ($retries < 0) {
+ // we are tired of waiting
+ return false;
+ }
+ sleep(5);
+ echo "Sleeping 5 seconds for DynamoDB ($retries more retries)...\n";
+ $retries--;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ private function createDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null)
+ {
+ $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
+ $nbTables = count($tablesList);
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'access_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'access_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'authorization_code','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'authorization_code','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S'),
+ array('AttributeName' => 'subject','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(
+ array('AttributeName' => 'client_id','KeyType' => 'HASH'),
+ array('AttributeName' => 'subject','KeyType' => 'RANGE')
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'client_id','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_refresh_tokens',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'refresh_token','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'refresh_token','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'AttributeDefinitions' => array(
+ array('AttributeName' => 'scope','AttributeType' => 'S'),
+ array('AttributeName' => 'is_default','AttributeType' => 'S')
+ ),
+ 'KeySchema' => array(array('AttributeName' => 'scope','KeyType' => 'HASH')),
+ 'GlobalSecondaryIndexes' => array(
+ array(
+ 'IndexName' => 'is_default-index',
+ 'KeySchema' => array(array('AttributeName' => 'is_default', 'KeyType' => 'HASH')),
+ 'Projection' => array('ProjectionType' => 'ALL'),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ),
+ ),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ $client->createTable(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'AttributeDefinitions' => array(array('AttributeName' => 'username','AttributeType' => 'S')),
+ 'KeySchema' => array(array('AttributeName' => 'username','KeyType' => 'HASH')),
+ 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
+ ));
+
+ // Wait for creation
+ $nbTableCreated = 0;
+ while ($nbTableCreated != $nbTables) {
+ $nbTableCreated = 0;
+ foreach ($tablesList as $key => $table) {
+ try {
+ $result = $client->describeTable(array('TableName' => $prefix.$table));
+ if ($result['Table']['TableStatus'] == 'ACTIVE') {
+ $nbTableCreated++;
+ }
+ } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
+ // Table does not exist : nothing to do
+ $nbTableCreated++;
+ }
+ }
+ if ($nbTableCreated != $nbTables) {
+ sleep(1);
+ }
+ }
+ }
+
+ private function populateDynamoDb($client, $prefix = null)
+ {
+ // set up scopes
+ foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $supportedScope))
+ ));
+ }
+
+ foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_scopes',
+ 'Item' => array('scope' => array('S' => $defaultScope), 'is_default' => array('S' => "true"))
+ ));
+ }
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Client ID 2'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2 clientscope3')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'Test Default Scope Client ID'),
+ 'client_secret' => array('S' => 'TestSecret'),
+ 'scope' => array('S' => 'clientscope1 clientscope2')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_clients',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'client_secret' => array('S' => 'testpass'),
+ 'grant_types' => array('S' => 'implicit password')
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'testtoken'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_access_tokens',
+ 'Item' => array(
+ 'access_token' => array('S' => 'accesstoken-openid-connect'),
+ 'client_id' => array('S' => 'Some Client'),
+ 'user_id' => array('S' => 'testuser'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_authorization_codes',
+ 'Item' => array(
+ 'authorization_code' => array('S' => 'testcode'),
+ 'client_id' => array('S' => 'Some Client'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_users',
+ 'Item' => array(
+ 'username' => array('S' => 'testuser'),
+ 'password' => array('S' => 'password'),
+ 'email' => array('S' => 'testuser@test.com'),
+ 'email_verified' => array('S' => 'true'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_One'),
+ 'public_key' => array('S' => 'client_1_public'),
+ 'private_key' => array('S' => 'client_1_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => 'ClientID_Two'),
+ 'public_key' => array('S' => 'client_2_public'),
+ 'private_key' => array('S' => 'client_2_private'),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_public_keys',
+ 'Item' => array(
+ 'client_id' => array('S' => '0'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ 'private_key' => array('S' => $this->getTestPrivateKey()),
+ 'encryption_algorithm' => array('S' => 'RS256'),
+ )
+ ));
+
+ $client->putItem(array(
+ 'TableName' => $prefix.'oauth_jwt',
+ 'Item' => array(
+ 'client_id' => array('S' => 'oauth_test_client'),
+ 'subject' => array('S' => 'test_subject'),
+ 'public_key' => array('S' => $this->getTestPublicKey()),
+ )
+ ));
+ }
+
+ public function cleanupTravisDynamoDb($prefix = null)
+ {
+ if (is_null($prefix)) {
+ // skip this when not applicable
+ if (!$this->getEnvVar('TRAVIS') || self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
+ return;
+ }
+
+ $prefix = sprintf('build_%s_', $this->getEnvVar('TRAVIS_JOB_NUMBER'));
+ }
+
+ $client = $this->getDynamoDbClient();
+ $this->deleteDynamoDb($client, $prefix);
+ }
+
+ private function getEnvVar($var, $default = null)
+ {
+ return isset($_SERVER[$var]) ? $_SERVER[$var] : (getenv($var) ?: $default);
+ }
+}
diff --git a/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php
new file mode 100644
index 000000000..6caa62068
--- /dev/null
+++ b/vendor/bshaffer/oauth2-server-php/test/lib/OAuth2/Storage/NullStorage.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace OAuth2\Storage;
+
+/**
+*
+*/
+class NullStorage extends Memory
+{
+ private $name;
+ private $description;
+
+ public function __construct($name, $description = null)
+ {
+ $this->name = $name;
+ $this->description = $description;
+ }
+
+ public function __toString()
+ {
+ return $this->name;
+ }
+
+ public function getMessage()
+ {
+ if ($this->description) {
+ return $this->description;
+ }
+
+ return $this->name;
+ }
+}
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index ac67d302a..2c72175e7 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -55,6 +55,7 @@ class ClassLoader
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
+ private $apcuPrefix;
public function getPrefixes()
{
@@ -272,6 +273,26 @@ class ClassLoader
}
/**
+ * 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
@@ -313,11 +334,6 @@ class ClassLoader
*/
public function findFile($class)
{
- // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
- if ('\\' == $class[0]) {
- $class = substr($class, 1);
- }
-
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
@@ -325,6 +341,12 @@ class ClassLoader
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');
@@ -333,6 +355,10 @@ class ClassLoader
$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;
@@ -348,9 +374,13 @@ class ClassLoader
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
- foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
- if (0 === strpos($class, $prefix)) {
- foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath.'\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ $length = $this->prefixLengthsPsr4[$first][$search];
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
index 1a2812488..f27399a04 100644
--- a/vendor/composer/LICENSE
+++ b/vendor/composer/LICENSE
@@ -1,5 +1,5 @@
-Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+Copyright (c) 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
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 54b09f68b..cd774eb7c 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,7 +6,315 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'HTMLPurifier' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
+ 'HTMLPurifier_Arborize' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
+ 'HTMLPurifier_AttrCollections' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
+ 'HTMLPurifier_AttrDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php',
+ 'HTMLPurifier_AttrDef_CSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php',
+ 'HTMLPurifier_AttrDef_CSS_AlphaValue' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php',
+ 'HTMLPurifier_AttrDef_CSS_Background' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php',
+ 'HTMLPurifier_AttrDef_CSS_BackgroundPosition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php',
+ 'HTMLPurifier_AttrDef_CSS_Border' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php',
+ 'HTMLPurifier_AttrDef_CSS_Color' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php',
+ 'HTMLPurifier_AttrDef_CSS_Composite' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php',
+ 'HTMLPurifier_AttrDef_CSS_DenyElementDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Filter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php',
+ 'HTMLPurifier_AttrDef_CSS_Font' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php',
+ 'HTMLPurifier_AttrDef_CSS_FontFamily' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php',
+ 'HTMLPurifier_AttrDef_CSS_Ident' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php',
+ 'HTMLPurifier_AttrDef_CSS_ImportantDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php',
+ 'HTMLPurifier_AttrDef_CSS_ListStyle' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php',
+ 'HTMLPurifier_AttrDef_CSS_Multiple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
+ 'HTMLPurifier_AttrDef_CSS_Number' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
+ 'HTMLPurifier_AttrDef_CSS_Percentage' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
+ 'HTMLPurifier_AttrDef_CSS_TextDecoration' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
+ 'HTMLPurifier_AttrDef_CSS_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
+ 'HTMLPurifier_AttrDef_Clone' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
+ 'HTMLPurifier_AttrDef_Enum' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php',
+ 'HTMLPurifier_AttrDef_HTML_Bool' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php',
+ 'HTMLPurifier_AttrDef_HTML_Class' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php',
+ 'HTMLPurifier_AttrDef_HTML_Color' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php',
+ 'HTMLPurifier_AttrDef_HTML_FrameTarget' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php',
+ 'HTMLPurifier_AttrDef_HTML_ID' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php',
+ 'HTMLPurifier_AttrDef_HTML_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php',
+ 'HTMLPurifier_AttrDef_HTML_LinkTypes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php',
+ 'HTMLPurifier_AttrDef_HTML_MultiLength' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php',
+ 'HTMLPurifier_AttrDef_HTML_Nmtokens' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php',
+ 'HTMLPurifier_AttrDef_HTML_Pixels' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php',
+ 'HTMLPurifier_AttrDef_Integer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php',
+ 'HTMLPurifier_AttrDef_Lang' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php',
+ 'HTMLPurifier_AttrDef_Switch' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php',
+ 'HTMLPurifier_AttrDef_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php',
+ 'HTMLPurifier_AttrDef_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php',
+ 'HTMLPurifier_AttrDef_URI_Email' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php',
+ 'HTMLPurifier_AttrDef_URI_Email_SimpleCheck' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php',
+ 'HTMLPurifier_AttrDef_URI_Host' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php',
+ 'HTMLPurifier_AttrDef_URI_IPv4' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php',
+ 'HTMLPurifier_AttrDef_URI_IPv6' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php',
+ 'HTMLPurifier_AttrTransform' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php',
+ 'HTMLPurifier_AttrTransform_Background' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php',
+ 'HTMLPurifier_AttrTransform_BdoDir' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php',
+ 'HTMLPurifier_AttrTransform_BgColor' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php',
+ 'HTMLPurifier_AttrTransform_BoolToCSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php',
+ 'HTMLPurifier_AttrTransform_Border' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php',
+ 'HTMLPurifier_AttrTransform_EnumToCSS' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php',
+ 'HTMLPurifier_AttrTransform_ImgRequired' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php',
+ 'HTMLPurifier_AttrTransform_ImgSpace' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php',
+ 'HTMLPurifier_AttrTransform_Input' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php',
+ 'HTMLPurifier_AttrTransform_Lang' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php',
+ 'HTMLPurifier_AttrTransform_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php',
+ 'HTMLPurifier_AttrTransform_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php',
+ 'HTMLPurifier_AttrTransform_NameSync' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php',
+ 'HTMLPurifier_AttrTransform_Nofollow' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php',
+ 'HTMLPurifier_AttrTransform_SafeEmbed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php',
+ 'HTMLPurifier_AttrTransform_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php',
+ 'HTMLPurifier_AttrTransform_SafeParam' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php',
+ 'HTMLPurifier_AttrTransform_ScriptRequired' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php',
+ 'HTMLPurifier_AttrTransform_TargetBlank' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php',
+ 'HTMLPurifier_AttrTransform_TargetNoopener' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php',
+ 'HTMLPurifier_AttrTransform_TargetNoreferrer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php',
+ 'HTMLPurifier_AttrTransform_Textarea' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php',
+ 'HTMLPurifier_AttrTypes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php',
+ 'HTMLPurifier_AttrValidator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php',
+ 'HTMLPurifier_Bootstrap' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php',
+ 'HTMLPurifier_CSSDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php',
+ 'HTMLPurifier_ChildDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php',
+ 'HTMLPurifier_ChildDef_Chameleon' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php',
+ 'HTMLPurifier_ChildDef_Custom' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php',
+ 'HTMLPurifier_ChildDef_Empty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php',
+ 'HTMLPurifier_ChildDef_List' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php',
+ 'HTMLPurifier_ChildDef_Optional' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php',
+ 'HTMLPurifier_ChildDef_Required' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php',
+ 'HTMLPurifier_ChildDef_StrictBlockquote' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php',
+ 'HTMLPurifier_ChildDef_Table' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php',
+ 'HTMLPurifier_Config' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Config.php',
+ 'HTMLPurifier_ConfigSchema' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_ConfigSchema' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_Xml' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php',
+ 'HTMLPurifier_ConfigSchema_Exception' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php',
+ 'HTMLPurifier_ConfigSchema_Interchange' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php',
+ 'HTMLPurifier_ConfigSchema_InterchangeBuilder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Directive' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Id' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php',
+ 'HTMLPurifier_ConfigSchema_Validator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php',
+ 'HTMLPurifier_ConfigSchema_ValidatorAtom' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php',
+ 'HTMLPurifier_ContentSets' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php',
+ 'HTMLPurifier_Context' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Context.php',
+ 'HTMLPurifier_Definition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php',
+ 'HTMLPurifier_DefinitionCache' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php',
+ 'HTMLPurifier_DefinitionCacheFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php',
+ 'HTMLPurifier_DefinitionCache_Decorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Cleanup' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Memory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php',
+ 'HTMLPurifier_DefinitionCache_Null' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php',
+ 'HTMLPurifier_DefinitionCache_Serializer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php',
+ 'HTMLPurifier_Doctype' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php',
+ 'HTMLPurifier_DoctypeRegistry' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php',
+ 'HTMLPurifier_ElementDef' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php',
+ 'HTMLPurifier_Encoder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php',
+ 'HTMLPurifier_EntityLookup' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php',
+ 'HTMLPurifier_EntityParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php',
+ 'HTMLPurifier_ErrorCollector' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php',
+ 'HTMLPurifier_ErrorStruct' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php',
+ 'HTMLPurifier_Exception' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php',
+ 'HTMLPurifier_Filter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php',
+ 'HTMLPurifier_Filter_ExtractStyleBlocks' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php',
+ 'HTMLPurifier_Filter_YouTube' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php',
+ 'HTMLPurifier_Generator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php',
+ 'HTMLPurifier_HTMLDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php',
+ 'HTMLPurifier_HTMLModule' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php',
+ 'HTMLPurifier_HTMLModuleManager' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php',
+ 'HTMLPurifier_HTMLModule_Bdo' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php',
+ 'HTMLPurifier_HTMLModule_CommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Edit' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php',
+ 'HTMLPurifier_HTMLModule_Forms' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php',
+ 'HTMLPurifier_HTMLModule_Hypertext' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php',
+ 'HTMLPurifier_HTMLModule_Iframe' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php',
+ 'HTMLPurifier_HTMLModule_Image' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php',
+ 'HTMLPurifier_HTMLModule_Legacy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php',
+ 'HTMLPurifier_HTMLModule_List' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php',
+ 'HTMLPurifier_HTMLModule_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php',
+ 'HTMLPurifier_HTMLModule_Nofollow' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php',
+ 'HTMLPurifier_HTMLModule_NonXMLCommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Object' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php',
+ 'HTMLPurifier_HTMLModule_Presentation' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php',
+ 'HTMLPurifier_HTMLModule_Proprietary' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Ruby' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php',
+ 'HTMLPurifier_HTMLModule_SafeEmbed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php',
+ 'HTMLPurifier_HTMLModule_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php',
+ 'HTMLPurifier_HTMLModule_SafeScripting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php',
+ 'HTMLPurifier_HTMLModule_Scripting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php',
+ 'HTMLPurifier_HTMLModule_StyleAttribute' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php',
+ 'HTMLPurifier_HTMLModule_Tables' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php',
+ 'HTMLPurifier_HTMLModule_Target' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php',
+ 'HTMLPurifier_HTMLModule_TargetBlank' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php',
+ 'HTMLPurifier_HTMLModule_TargetNoopener' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php',
+ 'HTMLPurifier_HTMLModule_TargetNoreferrer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php',
+ 'HTMLPurifier_HTMLModule_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php',
+ 'HTMLPurifier_HTMLModule_Tidy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Name' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Proprietary' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Strict' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Transitional' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTML' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php',
+ 'HTMLPurifier_HTMLModule_XMLCommonAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php',
+ 'HTMLPurifier_IDAccumulator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php',
+ 'HTMLPurifier_Injector' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php',
+ 'HTMLPurifier_Injector_AutoParagraph' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php',
+ 'HTMLPurifier_Injector_DisplayLinkURI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php',
+ 'HTMLPurifier_Injector_Linkify' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php',
+ 'HTMLPurifier_Injector_PurifierLinkify' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php',
+ 'HTMLPurifier_Injector_RemoveEmpty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php',
+ 'HTMLPurifier_Injector_RemoveSpansWithoutAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php',
+ 'HTMLPurifier_Injector_SafeObject' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php',
+ 'HTMLPurifier_Language' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Language.php',
+ 'HTMLPurifier_LanguageFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php',
+ 'HTMLPurifier_Language_en_x_test' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php',
+ 'HTMLPurifier_Length' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Length.php',
+ 'HTMLPurifier_Lexer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php',
+ 'HTMLPurifier_Lexer_DOMLex' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php',
+ 'HTMLPurifier_Lexer_DirectLex' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php',
+ 'HTMLPurifier_Lexer_PH5P' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier_Node' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node.php',
+ 'HTMLPurifier_Node_Comment' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php',
+ 'HTMLPurifier_Node_Element' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php',
+ 'HTMLPurifier_Node_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php',
+ 'HTMLPurifier_PercentEncoder' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php',
+ 'HTMLPurifier_Printer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php',
+ 'HTMLPurifier_Printer_CSSDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php',
+ 'HTMLPurifier_Printer_ConfigForm' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_bool' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_default' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_HTMLDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php',
+ 'HTMLPurifier_PropertyList' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php',
+ 'HTMLPurifier_PropertyListIterator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php',
+ 'HTMLPurifier_Queue' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php',
+ 'HTMLPurifier_Strategy' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php',
+ 'HTMLPurifier_Strategy_Composite' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php',
+ 'HTMLPurifier_Strategy_Core' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php',
+ 'HTMLPurifier_Strategy_FixNesting' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php',
+ 'HTMLPurifier_Strategy_MakeWellFormed' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php',
+ 'HTMLPurifier_Strategy_RemoveForeignElements' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php',
+ 'HTMLPurifier_Strategy_ValidateAttributes' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php',
+ 'HTMLPurifier_StringHash' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php',
+ 'HTMLPurifier_StringHashParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php',
+ 'HTMLPurifier_TagTransform' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php',
+ 'HTMLPurifier_TagTransform_Font' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php',
+ 'HTMLPurifier_TagTransform_Simple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php',
+ 'HTMLPurifier_Token' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token.php',
+ 'HTMLPurifier_TokenFactory' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php',
+ 'HTMLPurifier_Token_Comment' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php',
+ 'HTMLPurifier_Token_Empty' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php',
+ 'HTMLPurifier_Token_End' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php',
+ 'HTMLPurifier_Token_Start' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php',
+ 'HTMLPurifier_Token_Tag' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php',
+ 'HTMLPurifier_Token_Text' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php',
+ 'HTMLPurifier_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URI.php',
+ 'HTMLPurifier_URIDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php',
+ 'HTMLPurifier_URIFilter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php',
+ 'HTMLPurifier_URIFilter_DisableExternal' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php',
+ 'HTMLPurifier_URIFilter_DisableExternalResources' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php',
+ 'HTMLPurifier_URIFilter_DisableResources' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php',
+ 'HTMLPurifier_URIFilter_HostBlacklist' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php',
+ 'HTMLPurifier_URIFilter_MakeAbsolute' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php',
+ 'HTMLPurifier_URIFilter_Munge' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php',
+ 'HTMLPurifier_URIFilter_SafeIframe' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php',
+ 'HTMLPurifier_URIParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php',
+ 'HTMLPurifier_URIScheme' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php',
+ 'HTMLPurifier_URISchemeRegistry' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php',
+ 'HTMLPurifier_URIScheme_data' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php',
+ 'HTMLPurifier_URIScheme_file' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php',
+ 'HTMLPurifier_URIScheme_ftp' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php',
+ 'HTMLPurifier_URIScheme_http' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php',
+ 'HTMLPurifier_URIScheme_https' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php',
+ 'HTMLPurifier_URIScheme_mailto' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php',
+ 'HTMLPurifier_URIScheme_news' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php',
+ 'HTMLPurifier_URIScheme_nntp' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php',
+ 'HTMLPurifier_URIScheme_tel' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php',
+ 'HTMLPurifier_UnitConverter' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php',
+ 'HTMLPurifier_VarParser' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php',
+ 'HTMLPurifier_VarParserException' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php',
+ 'HTMLPurifier_VarParser_Flexible' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php',
+ 'HTMLPurifier_VarParser_Native' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
+ 'HTMLPurifier_Zipper' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => $baseDir . '/include/Import/Importer.php',
+ 'Markdownify\\Converter' => $vendorDir . '/pixel418/markdownify/src/Converter.php',
+ 'Markdownify\\ConverterExtra' => $vendorDir . '/pixel418/markdownify/src/ConverterExtra.php',
+ 'Markdownify\\Parser' => $vendorDir . '/pixel418/markdownify/src/Parser.php',
+ 'Michelf\\Markdown' => $vendorDir . '/michelf/php-markdown/Michelf/Markdown.php',
+ 'Michelf\\MarkdownExtra' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
+ 'Michelf\\MarkdownInterface' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
+ 'OAuth2\\Autoloader' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php',
+ 'OAuth2\\ClientAssertionType\\ClientAssertionTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php',
+ 'OAuth2\\ClientAssertionType\\HttpBasic' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php',
+ 'OAuth2\\Controller\\AuthorizeController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php',
+ 'OAuth2\\Controller\\AuthorizeControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\Controller\\ResourceController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php',
+ 'OAuth2\\Controller\\ResourceControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php',
+ 'OAuth2\\Controller\\TokenController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php',
+ 'OAuth2\\Controller\\TokenControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php',
+ 'OAuth2\\Encryption\\EncryptionInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php',
+ 'OAuth2\\Encryption\\FirebaseJwt' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php',
+ 'OAuth2\\Encryption\\Jwt' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php',
+ 'OAuth2\\GrantType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php',
+ 'OAuth2\\GrantType\\ClientCredentials' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php',
+ 'OAuth2\\GrantType\\GrantTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php',
+ 'OAuth2\\GrantType\\JwtBearer' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php',
+ 'OAuth2\\GrantType\\RefreshToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php',
+ 'OAuth2\\GrantType\\UserCredentials' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoController' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoControllerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php',
+ 'OAuth2\\OpenID\\GrantType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php',
+ 'OAuth2\\OpenID\\Storage\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\Storage\\UserClaimsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php',
+ 'OAuth2\\Request' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Request.php',
+ 'OAuth2\\RequestInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php',
+ 'OAuth2\\Response' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Response.php',
+ 'OAuth2\\ResponseInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php',
+ 'OAuth2\\ResponseType\\AccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php',
+ 'OAuth2\\ResponseType\\AccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php',
+ 'OAuth2\\ResponseType\\AuthorizationCode' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\ResponseType\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\ResponseType\\JwtAccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php',
+ 'OAuth2\\ResponseType\\ResponseTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php',
+ 'OAuth2\\Scope' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Scope.php',
+ 'OAuth2\\ScopeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php',
+ 'OAuth2\\Server' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Server.php',
+ 'OAuth2\\Storage\\AccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php',
+ 'OAuth2\\Storage\\AuthorizationCodeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\Storage\\Cassandra' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php',
+ 'OAuth2\\Storage\\ClientCredentialsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php',
+ 'OAuth2\\Storage\\ClientInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php',
+ 'OAuth2\\Storage\\CouchbaseDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php',
+ 'OAuth2\\Storage\\DynamoDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php',
+ 'OAuth2\\Storage\\JwtAccessToken' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php',
+ 'OAuth2\\Storage\\JwtAccessTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php',
+ 'OAuth2\\Storage\\JwtBearerInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php',
+ 'OAuth2\\Storage\\Memory' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php',
+ 'OAuth2\\Storage\\Mongo' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php',
+ 'OAuth2\\Storage\\MongoDB' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php',
+ 'OAuth2\\Storage\\Pdo' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php',
+ 'OAuth2\\Storage\\PublicKeyInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php',
+ 'OAuth2\\Storage\\Redis' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php',
+ 'OAuth2\\Storage\\RefreshTokenInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php',
+ 'OAuth2\\Storage\\ScopeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php',
+ 'OAuth2\\Storage\\UserCredentialsInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php',
+ 'OAuth2\\TokenType\\Bearer' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php',
+ 'OAuth2\\TokenType\\Mac' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php',
+ 'OAuth2\\TokenType\\TokenTypeInterface' => $vendorDir . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php',
'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/Psr/Log/AbstractLogger.php',
'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/Psr/Log/InvalidArgumentException.php',
'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/Psr/Log/LogLevel.php',
@@ -15,6 +323,8 @@ return array(
'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
'Sabre\\CalDAV\\Backend\\AbstractBackend' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php',
'Sabre\\CalDAV\\Backend\\BackendInterface' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/BackendInterface.php',
'Sabre\\CalDAV\\Backend\\NotificationSupport' => $vendorDir . '/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php',
@@ -357,6 +667,7 @@ return array(
'Zotlabs\\Access\\PermissionLimits' => $baseDir . '/Zotlabs/Access/PermissionLimits.php',
'Zotlabs\\Access\\PermissionRoles' => $baseDir . '/Zotlabs/Access/PermissionRoles.php',
'Zotlabs\\Access\\Permissions' => $baseDir . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Addon' => $baseDir . '/Zotlabs/Daemon/Addon.php',
'Zotlabs\\Daemon\\Checksites' => $baseDir . '/Zotlabs/Daemon/Checksites.php',
'Zotlabs\\Daemon\\Cli_suggest' => $baseDir . '/Zotlabs/Daemon/Cli_suggest.php',
'Zotlabs\\Daemon\\Cron' => $baseDir . '/Zotlabs/Daemon/Cron.php',
@@ -391,7 +702,10 @@ return array(
'Zotlabs\\Lib\\Enotify' => $baseDir . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => $baseDir . '/Zotlabs/Lib/ExtendedZip.php',
'Zotlabs\\Lib\\IConfig' => $baseDir . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\NativeWiki' => $baseDir . '/Zotlabs/Lib/NativeWiki.php',
+ 'Zotlabs\\Lib\\NativeWikiPage' => $baseDir . '/Zotlabs/Lib/NativeWikiPage.php',
'Zotlabs\\Lib\\PConfig' => $baseDir . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\Permcat' => $baseDir . '/Zotlabs/Lib/Permcat.php',
'Zotlabs\\Lib\\PermissionDescription' => $baseDir . '/Zotlabs/Lib/PermissionDescription.php',
'Zotlabs\\Lib\\ProtoDriver' => $baseDir . '/Zotlabs/Lib/ProtoDriver.php',
'Zotlabs\\Lib\\SuperCurl' => $baseDir . '/Zotlabs/Lib/SuperCurl.php',
@@ -478,7 +792,6 @@ return array(
'Zotlabs\\Module\\Magic' => $baseDir . '/Zotlabs/Module/Magic.php',
'Zotlabs\\Module\\Mail' => $baseDir . '/Zotlabs/Module/Mail.php',
'Zotlabs\\Module\\Manage' => $baseDir . '/Zotlabs/Module/Manage.php',
- 'Zotlabs\\Module\\Match' => $baseDir . '/Zotlabs/Module/Match.php',
'Zotlabs\\Module\\Menu' => $baseDir . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => $baseDir . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => $baseDir . '/Zotlabs/Module/Mitem.php',
@@ -496,6 +809,7 @@ return array(
'Zotlabs\\Module\\Page' => $baseDir . '/Zotlabs/Module/Page.php',
'Zotlabs\\Module\\Pconfig' => $baseDir . '/Zotlabs/Module/Pconfig.php',
'Zotlabs\\Module\\Pdledit' => $baseDir . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Permcat' => $baseDir . '/Zotlabs/Module/Permcat.php',
'Zotlabs\\Module\\Photo' => $baseDir . '/Zotlabs/Module/Photo.php',
'Zotlabs\\Module\\Photos' => $baseDir . '/Zotlabs/Module/Photos.php',
'Zotlabs\\Module\\Ping' => $baseDir . '/Zotlabs/Module/Ping.php',
@@ -525,7 +839,6 @@ return array(
'Zotlabs\\Module\\Removeme' => $baseDir . '/Zotlabs/Module/Removeme.php',
'Zotlabs\\Module\\Rmagic' => $baseDir . '/Zotlabs/Module/Rmagic.php',
'Zotlabs\\Module\\Rpost' => $baseDir . '/Zotlabs/Module/Rpost.php',
- 'Zotlabs\\Module\\Rsd_xml' => $baseDir . '/Zotlabs/Module/Rsd_xml.php',
'Zotlabs\\Module\\Search' => $baseDir . '/Zotlabs/Module/Search.php',
'Zotlabs\\Module\\Search_ac' => $baseDir . '/Zotlabs/Module/Search_ac.php',
'Zotlabs\\Module\\Service_limits' => $baseDir . '/Zotlabs/Module/Service_limits.php',
@@ -536,6 +849,7 @@ return array(
'Zotlabs\\Module\\Settings\\Featured' => $baseDir . '/Zotlabs/Module/Settings/Featured.php',
'Zotlabs\\Module\\Settings\\Features' => $baseDir . '/Zotlabs/Module/Settings/Features.php',
'Zotlabs\\Module\\Settings\\Oauth' => $baseDir . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Permcats' => $baseDir . '/Zotlabs/Module/Settings/Permcats.php',
'Zotlabs\\Module\\Settings\\Tokens' => $baseDir . '/Zotlabs/Module/Settings/Tokens.php',
'Zotlabs\\Module\\Setup' => $baseDir . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => $baseDir . '/Zotlabs/Module/Share.php',
@@ -596,6 +910,7 @@ return array(
'Zotlabs\\Text\\Tagadelic' => $baseDir . '/Zotlabs/Text/Tagadelic.php',
'Zotlabs\\Web\\CheckJS' => $baseDir . '/Zotlabs/Web/CheckJS.php',
'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HttpMeta' => $baseDir . '/Zotlabs/Web/HttpMeta.php',
'Zotlabs\\Web\\Router' => $baseDir . '/Zotlabs/Web/Router.php',
'Zotlabs\\Web\\Session' => $baseDir . '/Zotlabs/Web/Session.php',
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index a78cbe6fb..bbe6fd553 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -13,4 +13,5 @@ return array(
'3569eecfeed3bcf0bad3c998a494ecb8' => $vendorDir . '/sabre/xml/lib/Deserializer/functions.php',
'93aa591bc4ca510c520999e34229ee79' => $vendorDir . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => $vendorDir . '/sabre/http/lib/functions.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index b7fc0125d..dfcde5bf4 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -6,4 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'OAuth2' => array($vendorDir . '/bshaffer/oauth2-server-php/src'),
+ 'Michelf' => array($vendorDir . '/michelf/php-markdown'),
+ 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index e8ea2ed78..00a183cc1 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir);
return array(
'Zotlabs\\' => array($baseDir . '/Zotlabs'),
+ 'Test\\Markdownify\\' => array($vendorDir . '/pixel418/markdownify/test'),
'Sabre\\Xml\\' => array($vendorDir . '/sabre/xml/lib'),
'Sabre\\VObject\\' => array($vendorDir . '/sabre/vobject/lib'),
'Sabre\\Uri\\' => array($vendorDir . '/sabre/uri/lib'),
@@ -17,5 +18,6 @@ return array(
'Sabre\\CardDAV\\' => array($vendorDir . '/sabre/dav/lib/CardDAV'),
'Sabre\\CalDAV\\' => array($vendorDir . '/sabre/dav/lib/CalDAV'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
+ 'Markdownify\\' => array($vendorDir . '/pixel418/markdownify/src'),
'Hubzilla\\' => array($baseDir . '/include'),
);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
index 24b45085d..bcae78e29 100644
--- a/vendor/composer/autoload_real.php
+++ b/vendor/composer/autoload_real.php
@@ -23,7 +23,7 @@ class ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader'));
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 7f2551665..026276b2f 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -14,6 +14,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'3569eecfeed3bcf0bad3c998a494ecb8' => __DIR__ . '/..' . '/sabre/xml/lib/Deserializer/functions.php',
'93aa591bc4ca510c520999e34229ee79' => __DIR__ . '/..' . '/sabre/xml/lib/Serializer/functions.php',
'ebdb698ed4152ae445614b69b5e4bb6a' => __DIR__ . '/..' . '/sabre/http/lib/functions.php',
+ '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
);
public static $prefixLengthsPsr4 = array (
@@ -21,6 +22,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Zotlabs\\' => 8,
),
+ 'T' =>
+ array (
+ 'Test\\Markdownify\\' => 17,
+ ),
'S' =>
array (
'Sabre\\Xml\\' => 10,
@@ -37,6 +42,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Psr\\Log\\' => 8,
),
+ 'M' =>
+ array (
+ 'Markdownify\\' => 12,
+ ),
'H' =>
array (
'Hubzilla\\' => 9,
@@ -48,6 +57,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/../..' . '/Zotlabs',
),
+ 'Test\\Markdownify\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/pixel418/markdownify/test',
+ ),
'Sabre\\Xml\\' =>
array (
0 => __DIR__ . '/..' . '/sabre/xml/lib',
@@ -88,14 +101,350 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
+ 'Markdownify\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/pixel418/markdownify/src',
+ ),
'Hubzilla\\' =>
array (
0 => __DIR__ . '/../..' . '/include',
),
);
+ public static $prefixesPsr0 = array (
+ 'O' =>
+ array (
+ 'OAuth2' =>
+ array (
+ 0 => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src',
+ ),
+ ),
+ 'M' =>
+ array (
+ 'Michelf' =>
+ array (
+ 0 => __DIR__ . '/..' . '/michelf/php-markdown',
+ ),
+ ),
+ 'H' =>
+ array (
+ 'HTMLPurifier' =>
+ array (
+ 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library',
+ ),
+ ),
+ );
+
public static $classMap = array (
+ 'HTMLPurifier' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.php',
+ 'HTMLPurifier_Arborize' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php',
+ 'HTMLPurifier_AttrCollections' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php',
+ 'HTMLPurifier_AttrDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php',
+ 'HTMLPurifier_AttrDef_CSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php',
+ 'HTMLPurifier_AttrDef_CSS_AlphaValue' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php',
+ 'HTMLPurifier_AttrDef_CSS_Background' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php',
+ 'HTMLPurifier_AttrDef_CSS_BackgroundPosition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php',
+ 'HTMLPurifier_AttrDef_CSS_Border' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php',
+ 'HTMLPurifier_AttrDef_CSS_Color' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php',
+ 'HTMLPurifier_AttrDef_CSS_Composite' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php',
+ 'HTMLPurifier_AttrDef_CSS_DenyElementDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Filter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php',
+ 'HTMLPurifier_AttrDef_CSS_Font' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php',
+ 'HTMLPurifier_AttrDef_CSS_FontFamily' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php',
+ 'HTMLPurifier_AttrDef_CSS_Ident' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php',
+ 'HTMLPurifier_AttrDef_CSS_ImportantDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php',
+ 'HTMLPurifier_AttrDef_CSS_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php',
+ 'HTMLPurifier_AttrDef_CSS_ListStyle' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php',
+ 'HTMLPurifier_AttrDef_CSS_Multiple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
+ 'HTMLPurifier_AttrDef_CSS_Number' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
+ 'HTMLPurifier_AttrDef_CSS_Percentage' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
+ 'HTMLPurifier_AttrDef_CSS_TextDecoration' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
+ 'HTMLPurifier_AttrDef_CSS_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
+ 'HTMLPurifier_AttrDef_Clone' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
+ 'HTMLPurifier_AttrDef_Enum' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php',
+ 'HTMLPurifier_AttrDef_HTML_Bool' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php',
+ 'HTMLPurifier_AttrDef_HTML_Class' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php',
+ 'HTMLPurifier_AttrDef_HTML_Color' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php',
+ 'HTMLPurifier_AttrDef_HTML_FrameTarget' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php',
+ 'HTMLPurifier_AttrDef_HTML_ID' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php',
+ 'HTMLPurifier_AttrDef_HTML_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php',
+ 'HTMLPurifier_AttrDef_HTML_LinkTypes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php',
+ 'HTMLPurifier_AttrDef_HTML_MultiLength' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php',
+ 'HTMLPurifier_AttrDef_HTML_Nmtokens' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php',
+ 'HTMLPurifier_AttrDef_HTML_Pixels' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php',
+ 'HTMLPurifier_AttrDef_Integer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php',
+ 'HTMLPurifier_AttrDef_Lang' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php',
+ 'HTMLPurifier_AttrDef_Switch' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php',
+ 'HTMLPurifier_AttrDef_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php',
+ 'HTMLPurifier_AttrDef_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php',
+ 'HTMLPurifier_AttrDef_URI_Email' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php',
+ 'HTMLPurifier_AttrDef_URI_Email_SimpleCheck' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php',
+ 'HTMLPurifier_AttrDef_URI_Host' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php',
+ 'HTMLPurifier_AttrDef_URI_IPv4' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php',
+ 'HTMLPurifier_AttrDef_URI_IPv6' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php',
+ 'HTMLPurifier_AttrTransform' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php',
+ 'HTMLPurifier_AttrTransform_Background' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php',
+ 'HTMLPurifier_AttrTransform_BdoDir' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php',
+ 'HTMLPurifier_AttrTransform_BgColor' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php',
+ 'HTMLPurifier_AttrTransform_BoolToCSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php',
+ 'HTMLPurifier_AttrTransform_Border' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php',
+ 'HTMLPurifier_AttrTransform_EnumToCSS' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php',
+ 'HTMLPurifier_AttrTransform_ImgRequired' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php',
+ 'HTMLPurifier_AttrTransform_ImgSpace' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php',
+ 'HTMLPurifier_AttrTransform_Input' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php',
+ 'HTMLPurifier_AttrTransform_Lang' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php',
+ 'HTMLPurifier_AttrTransform_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php',
+ 'HTMLPurifier_AttrTransform_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php',
+ 'HTMLPurifier_AttrTransform_NameSync' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php',
+ 'HTMLPurifier_AttrTransform_Nofollow' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php',
+ 'HTMLPurifier_AttrTransform_SafeEmbed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php',
+ 'HTMLPurifier_AttrTransform_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php',
+ 'HTMLPurifier_AttrTransform_SafeParam' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php',
+ 'HTMLPurifier_AttrTransform_ScriptRequired' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php',
+ 'HTMLPurifier_AttrTransform_TargetBlank' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php',
+ 'HTMLPurifier_AttrTransform_TargetNoopener' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php',
+ 'HTMLPurifier_AttrTransform_TargetNoreferrer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php',
+ 'HTMLPurifier_AttrTransform_Textarea' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php',
+ 'HTMLPurifier_AttrTypes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php',
+ 'HTMLPurifier_AttrValidator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php',
+ 'HTMLPurifier_Bootstrap' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php',
+ 'HTMLPurifier_CSSDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php',
+ 'HTMLPurifier_ChildDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php',
+ 'HTMLPurifier_ChildDef_Chameleon' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php',
+ 'HTMLPurifier_ChildDef_Custom' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php',
+ 'HTMLPurifier_ChildDef_Empty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php',
+ 'HTMLPurifier_ChildDef_List' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php',
+ 'HTMLPurifier_ChildDef_Optional' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php',
+ 'HTMLPurifier_ChildDef_Required' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php',
+ 'HTMLPurifier_ChildDef_StrictBlockquote' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php',
+ 'HTMLPurifier_ChildDef_Table' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php',
+ 'HTMLPurifier_Config' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Config.php',
+ 'HTMLPurifier_ConfigSchema' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_ConfigSchema' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php',
+ 'HTMLPurifier_ConfigSchema_Builder_Xml' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php',
+ 'HTMLPurifier_ConfigSchema_Exception' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php',
+ 'HTMLPurifier_ConfigSchema_Interchange' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php',
+ 'HTMLPurifier_ConfigSchema_InterchangeBuilder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Directive' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php',
+ 'HTMLPurifier_ConfigSchema_Interchange_Id' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php',
+ 'HTMLPurifier_ConfigSchema_Validator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php',
+ 'HTMLPurifier_ConfigSchema_ValidatorAtom' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php',
+ 'HTMLPurifier_ContentSets' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php',
+ 'HTMLPurifier_Context' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Context.php',
+ 'HTMLPurifier_Definition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php',
+ 'HTMLPurifier_DefinitionCache' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php',
+ 'HTMLPurifier_DefinitionCacheFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php',
+ 'HTMLPurifier_DefinitionCache_Decorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Cleanup' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php',
+ 'HTMLPurifier_DefinitionCache_Decorator_Memory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php',
+ 'HTMLPurifier_DefinitionCache_Null' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php',
+ 'HTMLPurifier_DefinitionCache_Serializer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php',
+ 'HTMLPurifier_Doctype' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php',
+ 'HTMLPurifier_DoctypeRegistry' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php',
+ 'HTMLPurifier_ElementDef' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php',
+ 'HTMLPurifier_Encoder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php',
+ 'HTMLPurifier_EntityLookup' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php',
+ 'HTMLPurifier_EntityParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php',
+ 'HTMLPurifier_ErrorCollector' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php',
+ 'HTMLPurifier_ErrorStruct' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php',
+ 'HTMLPurifier_Exception' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php',
+ 'HTMLPurifier_Filter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php',
+ 'HTMLPurifier_Filter_ExtractStyleBlocks' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php',
+ 'HTMLPurifier_Filter_YouTube' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php',
+ 'HTMLPurifier_Generator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php',
+ 'HTMLPurifier_HTMLDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php',
+ 'HTMLPurifier_HTMLModule' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php',
+ 'HTMLPurifier_HTMLModuleManager' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php',
+ 'HTMLPurifier_HTMLModule_Bdo' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php',
+ 'HTMLPurifier_HTMLModule_CommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Edit' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php',
+ 'HTMLPurifier_HTMLModule_Forms' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php',
+ 'HTMLPurifier_HTMLModule_Hypertext' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php',
+ 'HTMLPurifier_HTMLModule_Iframe' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php',
+ 'HTMLPurifier_HTMLModule_Image' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php',
+ 'HTMLPurifier_HTMLModule_Legacy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php',
+ 'HTMLPurifier_HTMLModule_List' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php',
+ 'HTMLPurifier_HTMLModule_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php',
+ 'HTMLPurifier_HTMLModule_Nofollow' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php',
+ 'HTMLPurifier_HTMLModule_NonXMLCommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php',
+ 'HTMLPurifier_HTMLModule_Object' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php',
+ 'HTMLPurifier_HTMLModule_Presentation' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php',
+ 'HTMLPurifier_HTMLModule_Proprietary' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Ruby' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php',
+ 'HTMLPurifier_HTMLModule_SafeEmbed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php',
+ 'HTMLPurifier_HTMLModule_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php',
+ 'HTMLPurifier_HTMLModule_SafeScripting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php',
+ 'HTMLPurifier_HTMLModule_Scripting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php',
+ 'HTMLPurifier_HTMLModule_StyleAttribute' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php',
+ 'HTMLPurifier_HTMLModule_Tables' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php',
+ 'HTMLPurifier_HTMLModule_Target' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php',
+ 'HTMLPurifier_HTMLModule_TargetBlank' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php',
+ 'HTMLPurifier_HTMLModule_TargetNoopener' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php',
+ 'HTMLPurifier_HTMLModule_TargetNoreferrer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php',
+ 'HTMLPurifier_HTMLModule_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php',
+ 'HTMLPurifier_HTMLModule_Tidy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Name' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Proprietary' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Strict' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php',
+ 'HTMLPurifier_HTMLModule_Tidy_Transitional' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTML' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php',
+ 'HTMLPurifier_HTMLModule_Tidy_XHTMLAndHTML4' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php',
+ 'HTMLPurifier_HTMLModule_XMLCommonAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php',
+ 'HTMLPurifier_IDAccumulator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php',
+ 'HTMLPurifier_Injector' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php',
+ 'HTMLPurifier_Injector_AutoParagraph' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php',
+ 'HTMLPurifier_Injector_DisplayLinkURI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php',
+ 'HTMLPurifier_Injector_Linkify' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php',
+ 'HTMLPurifier_Injector_PurifierLinkify' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php',
+ 'HTMLPurifier_Injector_RemoveEmpty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php',
+ 'HTMLPurifier_Injector_RemoveSpansWithoutAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php',
+ 'HTMLPurifier_Injector_SafeObject' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php',
+ 'HTMLPurifier_Language' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Language.php',
+ 'HTMLPurifier_LanguageFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php',
+ 'HTMLPurifier_Language_en_x_test' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php',
+ 'HTMLPurifier_Length' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Length.php',
+ 'HTMLPurifier_Lexer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php',
+ 'HTMLPurifier_Lexer_DOMLex' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php',
+ 'HTMLPurifier_Lexer_DirectLex' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php',
+ 'HTMLPurifier_Lexer_PH5P' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier_Node' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node.php',
+ 'HTMLPurifier_Node_Comment' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php',
+ 'HTMLPurifier_Node_Element' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php',
+ 'HTMLPurifier_Node_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php',
+ 'HTMLPurifier_PercentEncoder' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php',
+ 'HTMLPurifier_Printer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php',
+ 'HTMLPurifier_Printer_CSSDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php',
+ 'HTMLPurifier_Printer_ConfigForm' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_bool' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_ConfigForm_default' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php',
+ 'HTMLPurifier_Printer_HTMLDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php',
+ 'HTMLPurifier_PropertyList' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php',
+ 'HTMLPurifier_PropertyListIterator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php',
+ 'HTMLPurifier_Queue' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php',
+ 'HTMLPurifier_Strategy' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php',
+ 'HTMLPurifier_Strategy_Composite' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php',
+ 'HTMLPurifier_Strategy_Core' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php',
+ 'HTMLPurifier_Strategy_FixNesting' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php',
+ 'HTMLPurifier_Strategy_MakeWellFormed' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php',
+ 'HTMLPurifier_Strategy_RemoveForeignElements' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php',
+ 'HTMLPurifier_Strategy_ValidateAttributes' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php',
+ 'HTMLPurifier_StringHash' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php',
+ 'HTMLPurifier_StringHashParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php',
+ 'HTMLPurifier_TagTransform' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php',
+ 'HTMLPurifier_TagTransform_Font' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php',
+ 'HTMLPurifier_TagTransform_Simple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php',
+ 'HTMLPurifier_Token' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token.php',
+ 'HTMLPurifier_TokenFactory' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php',
+ 'HTMLPurifier_Token_Comment' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php',
+ 'HTMLPurifier_Token_Empty' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php',
+ 'HTMLPurifier_Token_End' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php',
+ 'HTMLPurifier_Token_Start' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php',
+ 'HTMLPurifier_Token_Tag' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php',
+ 'HTMLPurifier_Token_Text' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php',
+ 'HTMLPurifier_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URI.php',
+ 'HTMLPurifier_URIDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php',
+ 'HTMLPurifier_URIFilter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php',
+ 'HTMLPurifier_URIFilter_DisableExternal' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php',
+ 'HTMLPurifier_URIFilter_DisableExternalResources' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php',
+ 'HTMLPurifier_URIFilter_DisableResources' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php',
+ 'HTMLPurifier_URIFilter_HostBlacklist' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php',
+ 'HTMLPurifier_URIFilter_MakeAbsolute' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php',
+ 'HTMLPurifier_URIFilter_Munge' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php',
+ 'HTMLPurifier_URIFilter_SafeIframe' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php',
+ 'HTMLPurifier_URIParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php',
+ 'HTMLPurifier_URIScheme' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php',
+ 'HTMLPurifier_URISchemeRegistry' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php',
+ 'HTMLPurifier_URIScheme_data' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php',
+ 'HTMLPurifier_URIScheme_file' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php',
+ 'HTMLPurifier_URIScheme_ftp' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php',
+ 'HTMLPurifier_URIScheme_http' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php',
+ 'HTMLPurifier_URIScheme_https' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php',
+ 'HTMLPurifier_URIScheme_mailto' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php',
+ 'HTMLPurifier_URIScheme_news' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php',
+ 'HTMLPurifier_URIScheme_nntp' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php',
+ 'HTMLPurifier_URIScheme_tel' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php',
+ 'HTMLPurifier_UnitConverter' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php',
+ 'HTMLPurifier_VarParser' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php',
+ 'HTMLPurifier_VarParserException' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php',
+ 'HTMLPurifier_VarParser_Flexible' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php',
+ 'HTMLPurifier_VarParser_Native' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
+ 'HTMLPurifier_Zipper' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => __DIR__ . '/../..' . '/include/Import/Importer.php',
+ 'Markdownify\\Converter' => __DIR__ . '/..' . '/pixel418/markdownify/src/Converter.php',
+ 'Markdownify\\ConverterExtra' => __DIR__ . '/..' . '/pixel418/markdownify/src/ConverterExtra.php',
+ 'Markdownify\\Parser' => __DIR__ . '/..' . '/pixel418/markdownify/src/Parser.php',
+ 'Michelf\\Markdown' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/Markdown.php',
+ 'Michelf\\MarkdownExtra' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
+ 'Michelf\\MarkdownInterface' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
+ 'OAuth2\\Autoloader' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Autoloader.php',
+ 'OAuth2\\ClientAssertionType\\ClientAssertionTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php',
+ 'OAuth2\\ClientAssertionType\\HttpBasic' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ClientAssertionType/HttpBasic.php',
+ 'OAuth2\\Controller\\AuthorizeController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeController.php',
+ 'OAuth2\\Controller\\AuthorizeControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\Controller\\ResourceController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceController.php',
+ 'OAuth2\\Controller\\ResourceControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/ResourceControllerInterface.php',
+ 'OAuth2\\Controller\\TokenController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenController.php',
+ 'OAuth2\\Controller\\TokenControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Controller/TokenControllerInterface.php',
+ 'OAuth2\\Encryption\\EncryptionInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/EncryptionInterface.php',
+ 'OAuth2\\Encryption\\FirebaseJwt' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/FirebaseJwt.php',
+ 'OAuth2\\Encryption\\Jwt' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Encryption/Jwt.php',
+ 'OAuth2\\GrantType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/AuthorizationCode.php',
+ 'OAuth2\\GrantType\\ClientCredentials' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/ClientCredentials.php',
+ 'OAuth2\\GrantType\\GrantTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/GrantTypeInterface.php',
+ 'OAuth2\\GrantType\\JwtBearer' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/JwtBearer.php',
+ 'OAuth2\\GrantType\\RefreshToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/RefreshToken.php',
+ 'OAuth2\\GrantType\\UserCredentials' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/GrantType/UserCredentials.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeController.php',
+ 'OAuth2\\OpenID\\Controller\\AuthorizeControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoController' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoController.php',
+ 'OAuth2\\OpenID\\Controller\\UserInfoControllerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php',
+ 'OAuth2\\OpenID\\GrantType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/GrantType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\OpenID\\ResponseType\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\CodeIdTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenToken.php',
+ 'OAuth2\\OpenID\\ResponseType\\IdTokenTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php',
+ 'OAuth2\\OpenID\\Storage\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\OpenID\\Storage\\UserClaimsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/OpenID/Storage/UserClaimsInterface.php',
+ 'OAuth2\\Request' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Request.php',
+ 'OAuth2\\RequestInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/RequestInterface.php',
+ 'OAuth2\\Response' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Response.php',
+ 'OAuth2\\ResponseInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseInterface.php',
+ 'OAuth2\\ResponseType\\AccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessToken.php',
+ 'OAuth2\\ResponseType\\AccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AccessTokenInterface.php',
+ 'OAuth2\\ResponseType\\AuthorizationCode' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCode.php',
+ 'OAuth2\\ResponseType\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/AuthorizationCodeInterface.php',
+ 'OAuth2\\ResponseType\\JwtAccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/JwtAccessToken.php',
+ 'OAuth2\\ResponseType\\ResponseTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ResponseType/ResponseTypeInterface.php',
+ 'OAuth2\\Scope' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Scope.php',
+ 'OAuth2\\ScopeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/ScopeInterface.php',
+ 'OAuth2\\Server' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Server.php',
+ 'OAuth2\\Storage\\AccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AccessTokenInterface.php',
+ 'OAuth2\\Storage\\AuthorizationCodeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/AuthorizationCodeInterface.php',
+ 'OAuth2\\Storage\\Cassandra' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Cassandra.php',
+ 'OAuth2\\Storage\\ClientCredentialsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientCredentialsInterface.php',
+ 'OAuth2\\Storage\\ClientInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ClientInterface.php',
+ 'OAuth2\\Storage\\CouchbaseDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/CouchbaseDB.php',
+ 'OAuth2\\Storage\\DynamoDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/DynamoDB.php',
+ 'OAuth2\\Storage\\JwtAccessToken' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessToken.php',
+ 'OAuth2\\Storage\\JwtAccessTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtAccessTokenInterface.php',
+ 'OAuth2\\Storage\\JwtBearerInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/JwtBearerInterface.php',
+ 'OAuth2\\Storage\\Memory' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Memory.php',
+ 'OAuth2\\Storage\\Mongo' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Mongo.php',
+ 'OAuth2\\Storage\\MongoDB' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/MongoDB.php',
+ 'OAuth2\\Storage\\Pdo' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Pdo.php',
+ 'OAuth2\\Storage\\PublicKeyInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/PublicKeyInterface.php',
+ 'OAuth2\\Storage\\Redis' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/Redis.php',
+ 'OAuth2\\Storage\\RefreshTokenInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/RefreshTokenInterface.php',
+ 'OAuth2\\Storage\\ScopeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/ScopeInterface.php',
+ 'OAuth2\\Storage\\UserCredentialsInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/Storage/UserCredentialsInterface.php',
+ 'OAuth2\\TokenType\\Bearer' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Bearer.php',
+ 'OAuth2\\TokenType\\Mac' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/Mac.php',
+ 'OAuth2\\TokenType\\TokenTypeInterface' => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src/OAuth2/TokenType/TokenTypeInterface.php',
'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/AbstractLogger.php',
'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/Psr/Log/InvalidArgumentException.php',
'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/Psr/Log/LogLevel.php',
@@ -104,6 +453,8 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
+ 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
+ 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
'Sabre\\CalDAV\\Backend\\AbstractBackend' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php',
'Sabre\\CalDAV\\Backend\\BackendInterface' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/BackendInterface.php',
'Sabre\\CalDAV\\Backend\\NotificationSupport' => __DIR__ . '/..' . '/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php',
@@ -446,6 +797,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Access\\PermissionLimits' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionLimits.php',
'Zotlabs\\Access\\PermissionRoles' => __DIR__ . '/../..' . '/Zotlabs/Access/PermissionRoles.php',
'Zotlabs\\Access\\Permissions' => __DIR__ . '/../..' . '/Zotlabs/Access/Permissions.php',
+ 'Zotlabs\\Daemon\\Addon' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Addon.php',
'Zotlabs\\Daemon\\Checksites' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Checksites.php',
'Zotlabs\\Daemon\\Cli_suggest' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cli_suggest.php',
'Zotlabs\\Daemon\\Cron' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cron.php',
@@ -480,7 +832,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Lib\\Enotify' => __DIR__ . '/../..' . '/Zotlabs/Lib/Enotify.php',
'Zotlabs\\Lib\\ExtendedZip' => __DIR__ . '/../..' . '/Zotlabs/Lib/ExtendedZip.php',
'Zotlabs\\Lib\\IConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/IConfig.php',
+ 'Zotlabs\\Lib\\NativeWiki' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWiki.php',
+ 'Zotlabs\\Lib\\NativeWikiPage' => __DIR__ . '/../..' . '/Zotlabs/Lib/NativeWikiPage.php',
'Zotlabs\\Lib\\PConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/PConfig.php',
+ 'Zotlabs\\Lib\\Permcat' => __DIR__ . '/../..' . '/Zotlabs/Lib/Permcat.php',
'Zotlabs\\Lib\\PermissionDescription' => __DIR__ . '/../..' . '/Zotlabs/Lib/PermissionDescription.php',
'Zotlabs\\Lib\\ProtoDriver' => __DIR__ . '/../..' . '/Zotlabs/Lib/ProtoDriver.php',
'Zotlabs\\Lib\\SuperCurl' => __DIR__ . '/../..' . '/Zotlabs/Lib/SuperCurl.php',
@@ -539,7 +894,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Events' => __DIR__ . '/../..' . '/Zotlabs/Module/Events.php',
'Zotlabs\\Module\\Fbrowser' => __DIR__ . '/../..' . '/Zotlabs/Module/Fbrowser.php',
'Zotlabs\\Module\\Feed' => __DIR__ . '/../..' . '/Zotlabs/Module/Feed.php',
- 'Zotlabs\\Module\\Ffsapi' => __DIR__ . '/../..' . '/Zotlabs/Module/Ffsapi.php',
'Zotlabs\\Module\\Fhublocs' => __DIR__ . '/../..' . '/Zotlabs/Module/Fhublocs.php',
'Zotlabs\\Module\\File_upload' => __DIR__ . '/../..' . '/Zotlabs/Module/File_upload.php',
'Zotlabs\\Module\\Filer' => __DIR__ . '/../..' . '/Zotlabs/Module/Filer.php',
@@ -568,7 +922,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Magic' => __DIR__ . '/../..' . '/Zotlabs/Module/Magic.php',
'Zotlabs\\Module\\Mail' => __DIR__ . '/../..' . '/Zotlabs/Module/Mail.php',
'Zotlabs\\Module\\Manage' => __DIR__ . '/../..' . '/Zotlabs/Module/Manage.php',
- 'Zotlabs\\Module\\Match' => __DIR__ . '/../..' . '/Zotlabs/Module/Match.php',
'Zotlabs\\Module\\Menu' => __DIR__ . '/../..' . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => __DIR__ . '/../..' . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => __DIR__ . '/../..' . '/Zotlabs/Module/Mitem.php',
@@ -583,10 +936,10 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Oep' => __DIR__ . '/../..' . '/Zotlabs/Module/Oep.php',
'Zotlabs\\Module\\Oexchange' => __DIR__ . '/../..' . '/Zotlabs/Module/Oexchange.php',
'Zotlabs\\Module\\Online' => __DIR__ . '/../..' . '/Zotlabs/Module/Online.php',
- 'Zotlabs\\Module\\Opensearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Opensearch.php',
'Zotlabs\\Module\\Page' => __DIR__ . '/../..' . '/Zotlabs/Module/Page.php',
'Zotlabs\\Module\\Pconfig' => __DIR__ . '/../..' . '/Zotlabs/Module/Pconfig.php',
'Zotlabs\\Module\\Pdledit' => __DIR__ . '/../..' . '/Zotlabs/Module/Pdledit.php',
+ 'Zotlabs\\Module\\Permcat' => __DIR__ . '/../..' . '/Zotlabs/Module/Permcat.php',
'Zotlabs\\Module\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Photo.php',
'Zotlabs\\Module\\Photos' => __DIR__ . '/../..' . '/Zotlabs/Module/Photos.php',
'Zotlabs\\Module\\Ping' => __DIR__ . '/../..' . '/Zotlabs/Module/Ping.php',
@@ -616,7 +969,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Removeme' => __DIR__ . '/../..' . '/Zotlabs/Module/Removeme.php',
'Zotlabs\\Module\\Rmagic' => __DIR__ . '/../..' . '/Zotlabs/Module/Rmagic.php',
'Zotlabs\\Module\\Rpost' => __DIR__ . '/../..' . '/Zotlabs/Module/Rpost.php',
- 'Zotlabs\\Module\\Rsd_xml' => __DIR__ . '/../..' . '/Zotlabs/Module/Rsd_xml.php',
'Zotlabs\\Module\\Search' => __DIR__ . '/../..' . '/Zotlabs/Module/Search.php',
'Zotlabs\\Module\\Search_ac' => __DIR__ . '/../..' . '/Zotlabs/Module/Search_ac.php',
'Zotlabs\\Module\\Service_limits' => __DIR__ . '/../..' . '/Zotlabs/Module/Service_limits.php',
@@ -627,6 +979,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Settings\\Featured' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Featured.php',
'Zotlabs\\Module\\Settings\\Features' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Features.php',
'Zotlabs\\Module\\Settings\\Oauth' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Oauth.php',
+ 'Zotlabs\\Module\\Settings\\Permcats' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Permcats.php',
'Zotlabs\\Module\\Settings\\Tokens' => __DIR__ . '/../..' . '/Zotlabs/Module/Settings/Tokens.php',
'Zotlabs\\Module\\Setup' => __DIR__ . '/../..' . '/Zotlabs/Module/Setup.php',
'Zotlabs\\Module\\Share' => __DIR__ . '/../..' . '/Zotlabs/Module/Share.php',
@@ -687,6 +1040,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Text\\Tagadelic' => __DIR__ . '/../..' . '/Zotlabs/Text/Tagadelic.php',
'Zotlabs\\Web\\CheckJS' => __DIR__ . '/../..' . '/Zotlabs/Web/CheckJS.php',
'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php',
+ 'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php',
'Zotlabs\\Web\\HttpMeta' => __DIR__ . '/../..' . '/Zotlabs/Web/HttpMeta.php',
'Zotlabs\\Web\\Router' => __DIR__ . '/../..' . '/Zotlabs/Web/Router.php',
'Zotlabs\\Web\\Session' => __DIR__ . '/../..' . '/Zotlabs/Web/Session.php',
@@ -707,6 +1061,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixDirsPsr4;
+ $loader->prefixesPsr0 = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$prefixesPsr0;
$loader->classMap = ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::$classMap;
}, null, ClassLoader::class);
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 88acfc40c..3a70e56c8 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -21,7 +21,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~0.0.1"
},
- "time": "2016-03-08 02:29:27",
+ "time": "2016-03-08T02:29:27+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -79,7 +79,7 @@
"suggest": {
"hoa/bench": "If you would like to run the benchmark scripts"
},
- "time": "2016-07-15 19:52:17",
+ "time": "2016-07-15T19:52:17+00:00",
"bin": [
"bin/vobject",
"bin/generate_vcards"
@@ -173,7 +173,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~0.0.4"
},
- "time": "2015-11-05 20:14:39",
+ "time": "2015-11-05T20:14:39+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -238,7 +238,7 @@
"suggest": {
"ext-curl": " to make http requests with the Client class"
},
- "time": "2016-01-06 23:00:08",
+ "time": "2016-01-06T23:00:08+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -310,7 +310,7 @@
"ext-curl": "*",
"ext-pdo": "*"
},
- "time": "2016-06-28 02:44:05",
+ "time": "2016-06-28T02:44:05+00:00",
"bin": [
"bin/sabredav",
"bin/naturalselection"
@@ -379,7 +379,7 @@
"phpunit/phpunit": "*",
"sabre/cs": "~1.0.0"
},
- "time": "2016-10-09 22:57:52",
+ "time": "2016-10-09T22:57:52+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -435,7 +435,7 @@
"require": {
"php": ">=5.3.0"
},
- "time": "2016-10-10 12:19:37",
+ "time": "2016-10-10T12:19:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -465,5 +465,223 @@
"psr",
"psr-3"
]
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
+ "version_normalized": "1.7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-29T18:58:20+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Michelf": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": [
+ "markdown"
+ ]
+ },
+ {
+ "name": "pixel418/markdownify",
+ "version": "v2.2.1",
+ "version_normalized": "2.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Elephant418/Markdownify.git",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
+ "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "time": "2016-09-21T13:01:43+00:00",
+ "type": "lib",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "description": "The HTML to Markdown converter for PHP ",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "keywords": [
+ "markdown",
+ "markdownify"
+ ]
+ },
+ {
+ "name": "bshaffer/oauth2-server-php",
+ "version": "v1.9.0",
+ "version_normalized": "1.9.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bshaffer/oauth2-server-php.git",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "mongodb/mongodb": "^1.1",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage"
+ },
+ "time": "2017-01-06T23:20:00+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "OAuth2": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage": "http://brentertainment.com"
+ }
+ ],
+ "description": "OAuth2 Server for PHP",
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "keywords": [
+ "auth",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "ezyang/htmlpurifier",
+ "version": "v4.9.2",
+ "version_normalized": "4.9.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ezyang/htmlpurifier.git",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "time": "2017-03-13T06:30:53+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "HTMLPurifier": "library/"
+ },
+ "files": [
+ "library/HTMLPurifier.composer.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "description": "Standards compliant HTML filter written in PHP",
+ "homepage": "http://htmlpurifier.org/",
+ "keywords": [
+ "html"
+ ]
}
]
diff --git a/library/htmlpurifier-4.6.0-lite/CREDITS b/vendor/ezyang/htmlpurifier/CREDITS
index 7921b45af..7921b45af 100644
--- a/library/htmlpurifier-4.6.0-lite/CREDITS
+++ b/vendor/ezyang/htmlpurifier/CREDITS
diff --git a/vendor/ezyang/htmlpurifier/INSTALL b/vendor/ezyang/htmlpurifier/INSTALL
new file mode 100644
index 000000000..e6dd02afa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL
@@ -0,0 +1,373 @@
+
+Install
+ How to install HTML Purifier
+
+HTML Purifier is designed to run out of the box, so actually using the
+library is extremely easy. (Although... if you were looking for a
+step-by-step installation GUI, you've downloaded the wrong software!)
+
+While the impatient can get going immediately with some of the sample
+code at the bottom of this library, it's well worth reading this entire
+document--most of the other documentation assumes that you are familiar
+with these contents.
+
+
+---------------------------------------------------------------------------
+1. Compatibility
+
+HTML Purifier is PHP 5 and PHP 7, and is actively tested from PHP 5.0.5
+and up. It has no core dependencies with other libraries.
+
+These optional extensions can enhance the capabilities of HTML Purifier:
+
+ * iconv : Converts text to and from non-UTF-8 encodings
+ * bcmath : Used for unit conversion and imagecrash protection
+ * tidy : Used for pretty-printing HTML
+
+These optional libraries can enhance the capabilities of HTML Purifier:
+
+ * CSSTidy : Clean CSS stylesheets using %Core.ExtractStyleBlocks
+ Note: You should use the modernized fork of CSSTidy available
+ at https://github.com/Cerdic/CSSTidy
+ * Net_IDNA2 (PEAR) : IRI support using %Core.EnableIDNA
+ Note: This is not necessary for PHP 5.3 or later
+
+---------------------------------------------------------------------------
+2. Reconnaissance
+
+A big plus of HTML Purifier is its inerrant support of standards, so
+your web-pages should be standards-compliant. (They should also use
+semantic markup, but that's another issue altogether, one HTML Purifier
+cannot fix without reading your mind.)
+
+HTML Purifier can process these doctypes:
+
+* XHTML 1.0 Transitional (default)
+* XHTML 1.0 Strict
+* HTML 4.01 Transitional
+* HTML 4.01 Strict
+* XHTML 1.1
+
+...and these character encodings:
+
+* UTF-8 (default)
+* Any encoding iconv supports (with crippled internationalization support)
+
+These defaults reflect what my choices would be if I were authoring an
+HTML document, however, what you choose depends on the nature of your
+codebase. If you don't know what doctype you are using, you can determine
+the doctype from this identifier at the top of your source code:
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+...and the character encoding from this code:
+
+ <meta http-equiv="Content-type" content="text/html;charset=ENCODING">
+
+If the character encoding declaration is missing, STOP NOW, and
+read 'docs/enduser-utf8.html' (web accessible at
+http://htmlpurifier.org/docs/enduser-utf8.html). In fact, even if it is
+present, read this document anyway, as many websites specify their
+document's character encoding incorrectly.
+
+
+---------------------------------------------------------------------------
+3. Including the library
+
+The procedure is quite simple:
+
+ require_once '/path/to/library/HTMLPurifier.auto.php';
+
+This will setup an autoloader, so the library's files are only included
+when you use them.
+
+Only the contents in the library/ folder are necessary, so you can remove
+everything else when using HTML Purifier in a production environment.
+
+If you installed HTML Purifier via PEAR, all you need to do is:
+
+ require_once 'HTMLPurifier.auto.php';
+
+Please note that the usual PEAR practice of including just the classes you
+want will not work with HTML Purifier's autoloading scheme.
+
+Advanced users, read on; other users can skip to section 4.
+
+Autoload compatibility
+----------------------
+
+ HTML Purifier attempts to be as smart as possible when registering an
+ autoloader, but there are some cases where you will need to change
+ your own code to accomodate HTML Purifier. These are those cases:
+
+ PHP VERSION IS LESS THAN 5.1.2, AND YOU'VE DEFINED __autoload
+ Because spl_autoload_register() doesn't exist in early versions
+ of PHP 5, HTML Purifier has no way of adding itself to the autoload
+ stack. Modify your __autoload function to test
+ HTMLPurifier_Bootstrap::autoload($class)
+
+ For example, suppose your autoload function looks like this:
+
+ function __autoload($class) {
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ A modified version with HTML Purifier would look like this:
+
+ function __autoload($class) {
+ if (HTMLPurifier_Bootstrap::autoload($class)) return true;
+ require str_replace('_', '/', $class) . '.php';
+ return true;
+ }
+
+ Note that there *is* some custom behavior in our autoloader; the
+ original autoloader in our example would work for 99% of the time,
+ but would fail when including language files.
+
+ AN __autoload FUNCTION IS DECLARED AFTER OUR AUTOLOADER IS REGISTERED
+ spl_autoload_register() has the curious behavior of disabling
+ the existing __autoload() handler. Users need to explicitly
+ spl_autoload_register('__autoload'). Because we use SPL when it
+ is available, __autoload() will ALWAYS be disabled. If __autoload()
+ is declared before HTML Purifier is loaded, this is not a problem:
+ HTML Purifier will register the function for you. But if it is
+ declared afterwards, it will mysteriously not work. This
+ snippet of code (after your autoloader is defined) will fix it:
+
+ spl_autoload_register('__autoload')
+
+ Users should also be on guard if they use a version of PHP previous
+ to 5.1.2 without an autoloader--HTML Purifier will define __autoload()
+ for you, which can collide with an autoloader that was added by *you*
+ later.
+
+
+For better performance
+----------------------
+
+ Opcode caches, which greatly speed up PHP initialization for scripts
+ with large amounts of code (HTML Purifier included), don't like
+ autoloaders. We offer an include file that includes all of HTML Purifier's
+ files in one go in an opcode cache friendly manner:
+
+ // If /path/to/library isn't already in your include path, uncomment
+ // the below line:
+ // require '/path/to/library/HTMLPurifier.path.php';
+
+ require 'HTMLPurifier.includes.php';
+
+ Optional components still need to be included--you'll know if you try to
+ use a feature and you get a class doesn't exists error! The autoloader
+ can be used in conjunction with this approach to catch classes that are
+ missing. Simply add this afterwards:
+
+ require 'HTMLPurifier.autoload.php';
+
+Standalone version
+------------------
+
+ HTML Purifier has a standalone distribution; you can also generate
+ a standalone file from the full version by running the script
+ maintenance/generate-standalone.php . The standalone version has the
+ benefit of having most of its code in one file, so parsing is much
+ faster and the library is easier to manage.
+
+ If HTMLPurifier.standalone.php exists in the library directory, you
+ can use it like this:
+
+ require '/path/to/HTMLPurifier.standalone.php';
+
+ This is equivalent to including HTMLPurifier.includes.php, except that
+ the contents of standalone/ will be added to your path. To override this
+ behavior, specify a new HTMLPURIFIER_PREFIX where standalone files can
+ be found (usually, this will be one directory up, the "true" library
+ directory in full distributions). Don't forget to set your path too!
+
+ The autoloader can be added to the end to ensure the classes are
+ loaded when necessary; otherwise you can manually include them.
+ To use the autoloader, use this:
+
+ require 'HTMLPurifier.autoload.php';
+
+For advanced users
+------------------
+
+ HTMLPurifier.auto.php performs a number of operations that can be done
+ individually. These are:
+
+ HTMLPurifier.path.php
+ Puts /path/to/library in the include path. For high performance,
+ this should be done in php.ini.
+
+ HTMLPurifier.autoload.php
+ Registers our autoload handler HTMLPurifier_Bootstrap::autoload($class).
+
+ You can do these operations by yourself--in fact, you must modify your own
+ autoload handler if you are using a version of PHP earlier than PHP 5.1.2
+ (See "Autoload compatibility" above).
+
+
+---------------------------------------------------------------------------
+4. Configuration
+
+HTML Purifier is designed to run out-of-the-box, but occasionally HTML
+Purifier needs to be told what to do. If you answer no to any of these
+questions, read on; otherwise, you can skip to the next section (or, if you're
+into configuring things just for the heck of it, skip to 4.3).
+
+* Am I using UTF-8?
+* Am I using XHTML 1.0 Transitional?
+
+If you answered no to any of these questions, instantiate a configuration
+object and read on:
+
+ $config = HTMLPurifier_Config::createDefault();
+
+
+4.1. Setting a different character encoding
+
+You really shouldn't use any other encoding except UTF-8, especially if you
+plan to support multilingual websites (read section three for more details).
+However, switching to UTF-8 is not always immediately feasible, so we can
+adapt.
+
+HTML Purifier uses iconv to support other character encodings, as such,
+any encoding that iconv supports <http://www.gnu.org/software/libiconv/>
+HTML Purifier supports with this code:
+
+ $config->set('Core.Encoding', /* put your encoding here */);
+
+An example usage for Latin-1 websites (the most common encoding for English
+websites):
+
+ $config->set('Core.Encoding', 'ISO-8859-1');
+
+Note that HTML Purifier's support for non-Unicode encodings is crippled by the
+fact that any character not supported by that encoding will be silently
+dropped, EVEN if it is ampersand escaped. If you want to work around
+this, you are welcome to read docs/enduser-utf8.html for a fix,
+but please be cognizant of the issues the "solution" creates (for this
+reason, I do not include the solution in this document).
+
+
+4.2. Setting a different doctype
+
+For those of you using HTML 4.01 Transitional, you can disable
+XHTML output like this:
+
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional');
+
+Other supported doctypes include:
+
+ * HTML 4.01 Strict
+ * HTML 4.01 Transitional
+ * XHTML 1.0 Strict
+ * XHTML 1.0 Transitional
+ * XHTML 1.1
+
+
+4.3. Other settings
+
+There are more configuration directives which can be read about
+here: <http://htmlpurifier.org/live/configdoc/plain.html> They're a bit boring,
+but they can help out for those of you who like to exert maximum control over
+your code. Some of the more interesting ones are configurable at the
+demo <http://htmlpurifier.org/demo.php> and are well worth looking into
+for your own system.
+
+For example, you can fine tune allowed elements and attributes, convert
+relative URLs to absolute ones, and even autoparagraph input text! These
+are, respectively, %HTML.Allowed, %URI.MakeAbsolute and %URI.Base, and
+%AutoFormat.AutoParagraph. The %Namespace.Directive naming convention
+translates to:
+
+ $config->set('Namespace.Directive', $value);
+
+E.g.
+
+ $config->set('HTML.Allowed', 'p,b,a[href],i');
+ $config->set('URI.Base', 'http://www.example.com');
+ $config->set('URI.MakeAbsolute', true);
+ $config->set('AutoFormat.AutoParagraph', true);
+
+
+---------------------------------------------------------------------------
+5. Caching
+
+HTML Purifier generates some cache files (generally one or two) to speed up
+its execution. For maximum performance, make sure that
+library/HTMLPurifier/DefinitionCache/Serializer is writeable by the webserver.
+
+If you are in the library/ folder of HTML Purifier, you can set the
+appropriate permissions using:
+
+ chmod -R 0755 HTMLPurifier/DefinitionCache/Serializer
+
+If the above command doesn't work, you may need to assign write permissions
+to group:
+
+ chmod -R 0775 HTMLPurifier/DefinitionCache/Serializer
+
+You can also chmod files via your FTP client; this option
+is usually accessible by right clicking the corresponding directory and
+then selecting "chmod" or "file permissions".
+
+Starting with 2.0.1, HTML Purifier will generate friendly error messages
+that will tell you exactly what you have to chmod the directory to, if in doubt,
+follow its advice.
+
+If you are unable or unwilling to give write permissions to the cache
+directory, you can either disable the cache (and suffer a performance
+hit):
+
+ $config->set('Core.DefinitionCache', null);
+
+Or move the cache directory somewhere else (no trailing slash):
+
+ $config->set('Cache.SerializerPath', '/home/user/absolute/path');
+
+
+---------------------------------------------------------------------------
+6. Using the code
+
+The interface is mind-numbingly simple:
+
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify( $dirty_html );
+
+That's it! For more examples, check out docs/examples/ (they aren't very
+different though). Also, docs/enduser-slow.html gives advice on what to
+do if HTML Purifier is slowing down your application.
+
+
+---------------------------------------------------------------------------
+7. Quick install
+
+First, make sure library/HTMLPurifier/DefinitionCache/Serializer is
+writable by the webserver (see Section 5: Caching above for details).
+If your website is in UTF-8 and XHTML Transitional, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $purifier = new HTMLPurifier($config);
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+If your website is in a different encoding or doctype, use this code:
+
+<?php
+ require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Core.Encoding', 'ISO-8859-1'); // replace with your encoding
+ $config->set('HTML.Doctype', 'HTML 4.01 Transitional'); // replace with your doctype
+ $purifier = new HTMLPurifier($config);
+
+ $clean_html = $purifier->purify($dirty_html);
+?>
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8 b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
new file mode 100644
index 000000000..95164abba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/INSTALL.fr.utf8
@@ -0,0 +1,60 @@
+
+Installation
+ Comment installer HTML Purifier
+
+Attention : Ce document est encodé en UTF-8, si les lettres avec des accents
+ne s'affichent pas, prenez un meilleur éditeur de texte.
+
+L'installation de HTML Purifier est très simple, parce qu'il n'a pas besoin
+de configuration. Pour les utilisateurs impatients, le code se trouve dans le
+pied de page, mais je recommande de lire le document.
+
+1. Compatibilité
+
+HTML Purifier fonctionne avec PHP 5. PHP 5.0.5 est la dernière version testée.
+Il ne dépend pas d'autres librairies.
+
+Les extensions optionnelles sont iconv (généralement déjà installée) et tidy
+(répendue aussi). Si vous utilisez UTF-8 et que vous ne voulez pas l'indentation,
+vous pouvez utiliser HTML Purifier sans ces extensions.
+
+
+2. Inclure la librairie
+
+Quand vous devez l'utilisez, incluez le :
+
+ require_once('/path/to/library/HTMLPurifier.auto.php');
+
+Ne pas l'inclure si ce n'est pas nécessaire, car HTML Purifier est lourd.
+
+HTML Purifier utilise "autoload". Si vous avez défini la fonction __autoload,
+vous devez ajouter cette fonction :
+
+ spl_autoload_register('__autoload')
+
+Plus d'informations dans le document "INSTALL".
+
+3. Installation rapide
+
+Si votre site Web est en UTF-8 et XHTML Transitional, utilisez :
+
+<?php
+ require_once('/path/to/htmlpurifier/library/HTMLPurifier.auto.php');
+ $purificateur = new HTMLPurifier();
+ $html_propre = $purificateur->purify($html_a_purifier);
+?>
+
+Sinon, utilisez :
+
+<?php
+ require_once('/path/to/html/purifier/library/HTMLPurifier.auto.load');
+ $config = $HTMLPurifier_Config::createDefault();
+ $config->set('Core', 'Encoding', 'ISO-8859-1'); //Remplacez par votre
+ encodage
+ $config->set('Core', 'XHTML', true); //Remplacer par false si HTML 4.01
+ $purificateur = new HTMLPurifier($config);
+ $html_propre = $purificateur->purify($html_a_purifier);
+?>
+
+
+ vim: et sw=4 sts=4
diff --git a/library/htmlpurifier-4.6.0-lite/LICENSE b/vendor/ezyang/htmlpurifier/LICENSE
index 8c88a20d4..8c88a20d4 100644
--- a/library/htmlpurifier-4.6.0-lite/LICENSE
+++ b/vendor/ezyang/htmlpurifier/LICENSE
diff --git a/vendor/ezyang/htmlpurifier/NEWS b/vendor/ezyang/htmlpurifier/NEWS
new file mode 100644
index 000000000..82ebedf3e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/NEWS
@@ -0,0 +1,1168 @@
+NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+4.9.2, released 2017-03-12
+- Fixes PHP 5.3 compatibility
+- Fix breakage when decoding decimal entities. Thanks @rybakit (#129)
+
+4.9.1, released 2017-03-08
+! %URI.DefaultScheme can now be set to null, in which case
+ all relative paths are removed.
+! New CSS properties: min-width, max-width, min-height, max-height (#94)
+! Transparency (rgba) and hsl/hsla supported where color CSS is present.
+ Thanks @fxbt for contributing the patch. (#118)
+- When idn_to_ascii is defined, we might accept malformed
+ hostnames. Apply validation to the result in such cases.
+- Close directory when done in Serializer DefinitionCache (#100)
+- Deleted some asserts to avoid linters from choking (#97)
+- Rework Serializer cache behavior to avoid chmod'ing if possible (#32)
+- Embedded semicolons in strings in CSS are now handled correctly!
+- We accidentally dropped certain Unicode characters if there was
+ one or more invalid characters. This has been fixed, thanks
+ to mpyw <ryosuke_i_628@yahoo.co.jp>
+- Fix for "Don't truncate upon encountering </div> when using DOMLex"
+ caused a regression with HTML 4.01 Strict parsing with libxml 2.9.1
+ (and maybe later versions, but known OK with libxml 2.9.4). The
+ fix is to go about handling truncation a bit more cleverly so that
+ we can wrap with divs (sidestepping the bug) but slurping out the
+ rest of the text in case it ran off the end. (#78)
+- Fix PREG_BACKTRACK_LIMIT_ERROR in HTMLPurifier_Filter_ExtractStyle.
+ Thanks @breathbath for contributing the report and fix (#120)
+- Fix entity decoding algorithm to be more conservative about
+ decoding entities that are missing trailing semicolon.
+ To get old behavior, set %Core.LegacyEntityDecoder to true.
+ (#119)
+- Workaround libxml bug when HTML tags are embedded inside
+ script tags. To disable workaround set %Core.AggressivelyRemoveScript
+ to false. (#83)
+# By default, when a link has a target attribute associated
+ with it, we now also add rel="noopener" in order to
+ prevent the new window from being able to overwrite
+ the original frame. To disable this protection,
+ set %HTML.TargetNoopener to FALSE.
+
+4.9.0 was cut on Git but never properly released; when we did the
+real release we decided to skip this version number.
+
+4.8.0, released 2016-07-16
+# By default, when a link has a target attribute associated
+ with it, we now also add rel="noreferrer" in order to
+ prevent the new window from being able to overwrite
+ the original frame. To disable this protection,
+ set %HTML.TargetNoreferrer to FALSE.
+! Full PHP 7 compatibility, the test suite is ALL GO.
+! %CSS.AllowDuplicates permits duplicate CSS properties.
+! Support for 'tel' URIs.
+! Partial support for 'border-radius' properties when %CSS.AllowProprietary is true.
+ The slash syntax, i.e., 'border-radius: 2em 1em 4em / 0.5em 3em' is not
+ yet supported.
+! %Attr.ID.HTML5 turns on HTML5-style ID handling.
+- alt truncation could result in malformed UTF-8 sequence. Don't
+ truncate. Thanks Brandon Farber for reporting.
+- Linkify regex is smarter, based off of Gruber's regex.
+- IDNA supported natively on PHP 5.3 and later.
+- Non all-numeric top-level names (e.g., foo.1f, 1f) are now
+ allowed.
+- Minor bounds error fix to squash a PHP 7 notice.
+- Support non-/tmp temporary directories for data:// validation
+- Give a better error message when a user attempts to allow
+ ul/ol without allowing li.
+- On some versions of PHP, the Serializer DefinitionCache could
+ infinite loop when the directory exists but is not listable. (#49)
+- Don't match for <body> inside comments with
+ %Core.ConvertDocumentToFragment. (#67)
+- SafeObject is now less case sensitive. (#57)
+- AutoFormat.RemoveEmpty.Predicate now correctly renders in
+ web form. (#85)
+
+4.7.0, released 2015-08-04
+# opacity is now considered a "tricky" CSS property rather than a
+ proprietary one.
+! %AutoFormat.RemoveEmpty.Predicate for specifying exactly when
+ an element should be considered "empty" (maybe preserve if it
+ has attributes), and modify iframe support so that the iframe
+ is removed if it is missing a src attribute. Thanks meeva for
+ reporting.
+- Don't truncate upon encountering </div> when using DOMLex. Thanks
+ Myrto Christina for finally convincing me to fix this.
+- Update YouTube filter for new code.
+- Fix parsing of rgb() values with spaces in them for 'border'
+ attribute.
+- Don't remove foo="" attributes if foo is a boolean attribute. Thanks
+ valME for reporting.
+
+4.6.0, released 2013-11-30
+# Secure URI munge hashing algorithm has changed to hash_hmac("sha256", $url, $secret).
+ Please update any verification scripts you may have.
+# URI parsing algorithm was made more strict, so only prefixes which
+ looks like schemes will actually be schemes. Thanks
+ Michael Gusev <mgusev@sugarcrm.com> for fixing.
+# %Core.EscapeInvalidChildren is no longer supported, and no longer does
+ anything.
+! New directive %Core.AllowHostnameUnderscore which allows underscores
+ in hostnames.
+- Eliminate quadratic behavior in DOMLex by using a proper queue.
+ Thanks Ole Laursen for noticing this.
+- Rewritten MakeWellFormed/FixNesting implementation eliminates quadratic
+ behavior in the rest of the purificaiton pipeline. Thanks Chedburn
+ Networks for sponsoring this work.
+- Made Linkify URL parser a bit less permissive, so that non-breaking
+ spaces and commas are not included as part of URL. Thanks nAS for fixing.
+- Fix some bad interactions with %HTML.Allowed and injectors. Thanks
+ David Hirtz for reporting.
+- Fix infinite loop in DirectLex. Thanks Ashar Javed (@soaj1664ashar)
+ for reporting.
+
+4.5.0, released 2013-02-17
+# Fix bug where stacked attribute transforms clobber each other;
+ this also means it's no longer possible to override attribute
+ transforms in later modules. No internal code was using this
+ but this may break some clients.
+# We now use SHA-1 to identify cached definitions, instead of MD5.
+! Support display:inline-block
+! Support for more white-space CSS values.
+! Permit underscores in font families
+! Support for page-break-* CSS3 properties when proprietary properties
+ are enabled.
+! New directive %Core.DisableExcludes; can be set to 'true' to turn off
+ SGML excludes checking. If HTML Purifier is removing too much text
+ and you don't care about full standards compliance, try setting this to
+ 'true'.
+- Use prepend for SPL autoloading on PHP 5.3 and later.
+- Fix bug with nofollow transform when pre-existing rel exists.
+- Fix bug where background:url() always gets lower-cased
+ (but not background-image:url())
+- Fix bug with non lower-case color names in HTML
+- Fix bug where data URI validation doesn't remove temporary files.
+ Thanks Javier Marín Ros <javiermarinros@gmail.com> for reporting.
+- Don't remove certain empty tags on RemoveEmpty.
+
+4.4.0, released 2012-01-18
+# Removed PEARSax3 handler.
+# URI.Munge now munges URIs inside the same host that go from https
+ to http. Reported by Neike Taika-Tessaro.
+# Core.EscapeNonASCIICharacters now always transforms entities to
+ entities, even if target encoding is UTF-8.
+# Tighten up selector validation in ExtractStyleBlocks.
+ Non-syntactically valid selectors are now rejected, along with
+ some of the more obscure ones such as attribute selectors, the
+ :lang pseudoselector, and anything not in CSS2.1. Furthermore,
+ ID and class selectors now work properly with the relevant
+ configuration attributes. Also, mute errors when parsing CSS
+ with CSS Tidy. Reported by Mario Heiderich and Norman Hippert.
+! Added support for 'scope' attribute on tables.
+! Added %HTML.TargetBlank, which adds target="blank" to all outgoing links.
+! Properly handle sub-lists directly nested inside of lists in
+ a standards compliant way, by moving them into the preceding <li>
+! Added %HTML.AllowedComments and %HTML.AllowedCommentsRegexp for
+ limited allowed comments in untrusted situations.
+! Implement iframes, and allow them to be used in untrusted mode with
+ %HTML.SafeIframe and %URI.SafeIframeRegexp. Thanks Bradley M. Froehle
+ <brad.froehle@gmail.com> for submitting an initial version of the patch.
+! The Forms module now works properly for transitional doctypes.
+! Added support for internationalized domain names. You need the PEAR
+ Net_IDNA2 module to be in your path; if it is installed, ensure the
+ class can be loaded and then set %Core.EnableIDNA to true.
+- Color keywords are now case insensitive. Thanks Yzmir Ramirez
+ <yramirez-htmlpurifier@adicio.com> for reporting.
+- Explicitly initialize anonModule variable to null.
+- Do not duplicate nofollow if already present. Thanks 178
+ for reporting.
+- Do not add nofollow if hostname matches our current host. Thanks 178
+ for reporting, and Neike Taika-Tessaro for helping diagnose.
+- Do not unset parser variable; this fixes intermittent serialization
+ problems. Thanks Neike Taika-Tessaro for reporting, bill
+ <10010tiger@gmail.com> for diagnosing.
+- Fix iconv truncation bug, where non-UTF-8 target encodings see
+ output truncated after around 8000 characters. Thanks Jörg Ludwig
+ <joerg.ludwig@iserv.eu> for reporting.
+- Fix broken table content model for XHTML1.1 (and also earlier
+ versions, although the W3C validator doesn't catch those violations).
+ Thanks GlitchMr <glitch.mr@gmail.com> for reporting.
+
+4.3.0, released 2011-03-27
+# Fixed broken caching of customized raw definitions, but requires an
+ API change. The old API still works but will emit a warning,
+ see http://htmlpurifier.org/docs/enduser-customize.html#optimized
+ for how to upgrade your code.
+# Protect against Internet Explorer innerHTML behavior by specially
+ treating attributes with backticks but no angled brackets, quotes or
+ spaces. This constitutes a slight semantic change, which can be
+ reverted using %Output.FixInnerHTML. Reported by Neike Taika-Tessaro
+ and Mario Heiderich.
+# Protect against cssText/innerHTML by restricting allowed characters
+ used in fonts further than mandated by the specification and encoding
+ some extra special characters in URLs. Reported by Neike
+ Taika-Tessaro and Mario Heiderich.
+! Added %HTML.Nofollow to add rel="nofollow" to external links.
+! More types of SPL autoloaders allowed on later versions of PHP.
+! Implementations for position, top, left, right, bottom, z-index
+ when %CSS.Trusted is on.
+! Add %Cache.SerializerPermissions option for custom serializer
+ directory/file permissions
+! Fix longstanding bug in Flash support for non-IE browsers, and
+ allow more wmode attributes.
+! Add %CSS.AllowedFonts to restrict permissible font names.
+- Switch to an iterative traversal of the DOM, which prevents us
+ from running out of stack space for deeply nested documents.
+ Thanks Maxim Krizhanovsky for contributing a patch.
+- Make removal of conditional IE comments ungreedy; thanks Bernd
+ for reporting.
+- Escape CDATA before removing Internet Explorer comments.
+- Fix removal of id attributes under certain conditions by ensuring
+ armor attributes are preserved when recreating tags.
+- Check if schema.ser was corrupted.
+- Check if zend.ze1_compatibility_mode is on, and error out if it is.
+ This safety check is only done for HTMLPurifier.auto.php; if you
+ are using standalone or the specialized includes files, you're
+ expected to know what you're doing.
+- Stop repeatedly writing the cache file after I'm done customizing a
+ raw definition. Reported by ajh.
+- Switch to using require_once in the Bootstrap to work around bad
+ interaction with Zend Debugger and APC. Reported by Antonio Parraga.
+- Fix URI handling when hostname is missing but scheme is present.
+ Reported by Neike Taika-Tessaro.
+- Fix missing numeric entities on DirectLex; thanks Neike Taika-Tessaro
+ for reporting.
+- Fix harmless notice from indexing into empty string. Thanks Matthijs
+ Kooijman <matthijs@stdin.nl> for reporting.
+- Don't autoclose no parent elements are able to support the element
+ that triggered the autoclose. In particular fixes strange behavior
+ of stray <li> tags. Thanks pkuliga@gmail.com for reporting and
+ Neike Taika-Tessaro <pinkgothic@gmail.com> for debugging assistance.
+
+4.2.0, released 2010-09-15
+! Added %Core.RemoveProcessingInstructions, which lets you remove
+ <? ... ?> statements.
+! Added %URI.DisableResources functionality; the directive originally
+ did nothing. Thanks David Rothstein for reporting.
+! Add documentation about configuration directive types.
+! Add %CSS.ForbiddenProperties configuration directive.
+! Add %HTML.FlashAllowFullScreen to permit embedded Flash objects
+ to utilize full-screen mode.
+! Add optional support for the <code>file</code> URI scheme, enable
+ by explicitly setting %URI.AllowedSchemes.
+! Add %Core.NormalizeNewlines options to allow turning off newline
+ normalization.
+- Fix improper handling of Internet Explorer conditional comments
+ by parser. Thanks zmonteca for reporting.
+- Fix missing attributes bug when running on Mac Snow Leopard and APC.
+ Thanks sidepodcast for the fix.
+- Warn if an element is allowed, but an attribute it requires is
+ not allowed.
+
+4.1.1, released 2010-05-31
+- Fix undefined index warnings in maintenance scripts.
+- Fix bug in DirectLex for parsing elements with a single attribute
+ with entities.
+- Rewrite CSS output logic for font-family and url(). Thanks Mario
+ Heiderich <mario.heiderich@googlemail.com> for reporting and Takeshi
+ Terada <t-terada@violet.plala.or.jp> for suggesting the fix.
+- Emit an error for CollectErrors if a body is extracted
+- Fix bug where in background-position for center keyword handling.
+- Fix infinite loop when a wrapper element is inserted in a context
+ where it's not allowed. Thanks Lars <lars@renoz.dk> for reporting.
+- Remove +x bit and shebang from index.php; only supported mode is to
+ explicitly call it with php.
+- Make test script less chatty when log_errors is on.
+
+4.1.0, released 2010-04-26
+! Support proprietary height attribute on table element
+! Support YouTube slideshows that contain /cp/ in their URL.
+! Support for data: URI scheme; not enabled by default, add it using
+ %URI.AllowedSchemes
+! Support flashvars when using %HTML.SafeObject and %HTML.SafeEmbed.
+! Support for Internet Explorer compatibility with %HTML.SafeObject
+ using %Output.FlashCompat.
+! Handle <ol><ol> properly, by inserting the necessary <li> tag.
+- Always quote the insides of url(...) in CSS.
+
+4.0.0, released 2009-07-07
+# APIs for ConfigSchema subsystem have substantially changed. See
+ docs/dev-config-bcbreaks.txt for details; in essence, anything that
+ had both namespace and directive now have a single unified key.
+# Some configuration directives were renamed, specifically:
+ %AutoFormatParam.PurifierLinkifyDocURL -> %AutoFormat.PurifierLinkify.DocURL
+ %FilterParam.ExtractStyleBlocksEscaping -> %Filter.ExtractStyleBlocks.Escaping
+ %FilterParam.ExtractStyleBlocksScope -> %Filter.ExtractStyleBlocks.Scope
+ %FilterParam.ExtractStyleBlocksTidyImpl -> %Filter.ExtractStyleBlocks.TidyImpl
+ As usual, the old directive names will still work, but will throw E_NOTICE
+ errors.
+# The allowed values for class have been relaxed to allow all of CDATA for
+ doctypes that are not XHTML 1.1 or XHTML 2.0. For old behavior, set
+ %Attr.ClassUseCDATA to false.
+# Instead of appending the content model to an old content model, a blank
+ element will replace the old content model. You can use #SUPER to get
+ the old content model.
+! More robust support for name="" and id=""
+! HTMLPurifier_Config::inherit($config) allows you to inherit one
+ configuration, and have changes to that configuration be propagated
+ to all of its children.
+! Implement %HTML.Attr.Name.UseCDATA, which relaxes validation rules on
+ the name attribute when set. Use with care. Thanks Ian Cook for
+ sponsoring.
+! Implement %AutoFormat.RemoveEmpty.RemoveNbsp, which removes empty
+ tags that contain non-breaking spaces as well other whitespace. You
+ can also modify which tags should have &nbsp; maintained with
+ %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.
+! Implement %Attr.AllowedClasses, which allows administrators to restrict
+ classes users can use to a specified finite set of classes, and
+ %Attr.ForbiddenClasses, which is the logical inverse.
+! You can now maintain your own configuration schema directories by
+ creating a config-schema.php file or passing an extra argument. Check
+ docs/dev-config-schema.html for more details.
+! Added HTMLPurifier_Config->serialize() method, which lets you save away
+ your configuration in a compact serial file, which you can unserialize
+ and use directly without having to go through the overhead of setup.
+- Fix bug where URIDefinition would not get cleared if it's directives got
+ changed.
+- Fix fatal error in HTMLPurifier_Encoder on certain platforms (probably NetBSD 5.0)
+- Fix bug in Linkify autoformatter involving <a><span>http://foo</span></a>
+- Make %URI.Munge not apply to links that have the same host as your host.
+- Prevent stray </body> tag from truncating output, if a second </body>
+ is present.
+. Created script maintenance/rename-config.php for renaming a configuration
+ directive while maintaining its alias. This script does not change source code.
+. Implement namespace locking for definition construction, to prevent
+ bugs where a directive is used for definition construction but is not
+ used to construct the cache hash.
+
+3.3.0, released 2009-02-16
+! Implement CSS property 'overflow' when %CSS.AllowTricky is true.
+! Implement generic property list classess
+- Fix bug with testEncodingSupportsASCII() algorithm when iconv() implementation
+ does not do the "right thing" with characters not supported in the output
+ set.
+- Spellcheck UTF-8: The Secret To Character Encoding
+- Fix improper removal of the contents of elements with only whitespace. Thanks
+ Eric Wald for reporting.
+- Fix broken test suite in versions of PHP without spl_autoload_register()
+- Fix degenerate case with YouTube filter involving double hyphens.
+ Thanks Pierre Attar for reporting.
+- Fix YouTube rendering problem on certain versions of Firefox.
+- Fix CSSDefinition Printer problems with decorators
+- Add text parameter to unit tests, forces text output
+. Add verbose mode to command line test runner, use (--verbose)
+. Turn on unit tests for UnitConverter
+. Fix missing version number in configuration %Attr.DefaultImageAlt (added 3.2.0)
+. Fix newline errors that caused spurious failures when CRLF HTML Purifier was
+ tested on Linux.
+. Removed trailing whitespace from all text files, see
+ remote-trailing-whitespace.php maintenance script.
+. Convert configuration to use property list backend.
+
+3.2.0, released 2008-10-31
+# Using %Core.CollectErrors forces line number/column tracking on, whereas
+ previously you could theoretically turn it off.
+# HTMLPurifier_Injector->notifyEnd() is formally deprecated. Please
+ use handleEnd() instead.
+! %Output.AttrSort for when you need your attributes in alphabetical order to
+ deal with a bug in FCKEditor. Requested by frank farmer.
+! Enable HTML comments when %HTML.Trusted is on. Requested by Waldo Jaquith.
+! Proper support for name attribute. It is now allowed and equivalent to the id
+ attribute in a and img tags, and is only converted to id when %HTML.TidyLevel
+ is heavy (for all doctypes).
+! %AutoFormat.RemoveEmpty to remove some empty tags from documents. Please don't
+ use on hand-written HTML.
+! Add error-cases for unsupported elements in MakeWellFormed. This enables
+ the strategy to be used, standalone, on untrusted input.
+! %Core.AggressivelyFixLt is on by default. This causes more sensible
+ processing of left angled brackets in smileys and other whatnot.
+! Test scripts now have a 'type' parameter, which lets you say 'htmlpurifier',
+ 'phpt', 'vtest', etc. in order to only execute those tests. This supercedes
+ the --only-phpt parameter, although for backwards-compatibility the flag
+ will still work.
+! AutoParagraph auto-formatter will now preserve double-newlines upon output.
+ Users who are not performing inbound filtering, this may seem a little
+ useless, but as a bonus, the test suite and handling of edge cases is also
+ improved.
+! Experimental implementation of forms for %HTML.Trusted
+! Track column numbers when maintain line numbers is on
+! Proprietary 'background' attribute on table-related elements converted into
+ corresponding CSS. Thanks Fusemail for sponsoring this feature!
+! Add forward(), forwardUntilEndToken(), backward() and current() to Injector
+ supertype.
+! HTMLPurifier_Injector->handleEnd() permits modification to end tokens. The
+ time of operation varies slightly from notifyEnd() as *all* end tokens are
+ processed by the injector before they are subject to the well-formedness rules.
+! %Attr.DefaultImageAlt allows overriding default behavior of setting alt to
+ basename of image when not present.
+! %AutoFormat.DisplayLinkURI neuters <a> tags into plain text URLs.
+- Fix two bugs in %URI.MakeAbsolute; one involving empty paths in base URLs,
+ the other involving an undefined $is_folder error.
+- Throw error when %Core.Encoding is set to a spurious value. Previously,
+ this errored silently and returned false.
+- Redirected stderr to stdout for flush error output.
+- %URI.DisableExternal will now use the host in %URI.Base if %URI.Host is not
+ available.
+- Do not re-munge URL if the output URL has the same host as the input URL.
+ Requested by Chris.
+- Fix error in documentation regarding %Filter.ExtractStyleBlocks
+- Prevent <![CDATA[<body></body>]]> from triggering %Core.ConvertDocumentToFragment
+- Fix bug with inline elements in blockquotes conflicting with strict doctype
+- Detect if HTML support is disabled for DOM by checking for loadHTML() method.
+- Fix bug where dots and double-dots in absolute URLs without hostname were
+ not collapsed by URIFilter_MakeAbsolute.
+- Fix bug with anonymous modules operating on SafeEmbed or SafeObject elements
+ by reordering their addition.
+- Will now throw exception on many error conditions during lexer creation; also
+ throw an exception when MaintainLineNumbers is true, but a non-tracksLineNumbers
+ is being used.
+- Detect if domxml extension is loaded, and use DirectLEx accordingly.
+- Improve handling of big numbers with floating point arithmetic in UnitConverter.
+ Reported by David Morton.
+. Strategy_MakeWellFormed now operates in-place, saving memory and allowing
+ for more interesting filter-backtracking
+. New HTMLPurifier_Injector->rewind() functionality, allows injectors to rewind
+ index to reprocess tokens.
+. StringHashParser now allows for multiline sections with "empty" content;
+ previously the section would remain undefined.
+. Added --quick option to multitest.php, which tests only the most recent
+ release for each series.
+. Added --distro option to multitest.php, which accepts either 'normal' or
+ 'standalone'. This supercedes --exclude-normal and --exclude-standalone
+
+3.1.1, released 2008-06-19
+# %URI.Munge now, by default, does not munge resources (for example, <img src="">)
+ In order to enable this again, please set %URI.MungeResources to true.
+! More robust imagecrash protection with height/width CSS with %CSS.MaxImgLength,
+ and height/width HTML with %HTML.MaxImgLength.
+! %URI.MungeSecretKey for secure URI munging. Thanks Chris
+ for sponsoring this feature. Check out the corresponding documentation
+ for details. (Att Nightly testers: The API for this feature changed before
+ the general release. Namely, rename your directives %URI.SecureMungeSecretKey =>
+ %URI.MungeSecretKey and and %URI.SecureMunge => %URI.Munge)
+! Implemented post URI filtering. Set member variable $post to true to set
+ a URIFilter as such.
+! Allow modules to define injectors via $info_injector. Injectors are
+ automatically disabled if injector's needed elements are not found.
+! Support for "safe" objects added, use %HTML.SafeObject and %HTML.SafeEmbed.
+ Thanks Chris for sponsoring. If you've been using ad hoc code from the
+ forums, PLEASE use this instead.
+! Added substitutions for %e, %n, %a and %p in %URI.Munge (in order,
+ embedded, tag name, attribute name, CSS property name). See %URI.Munge
+ for more details. Requested by Jochem Blok.
+- Disable percent height/width attributes for img.
+- AttrValidator operations are now atomic; updates to attributes are not
+ manifest in token until end of operations. This prevents naughty internal
+ code from directly modifying CurrentToken when they're not supposed to.
+ This semantics change was requested by frank farmer.
+- Percent encoding checks enabled for URI query and fragment
+- Fix stray backslashes in font-family; CSS Unicode character escapes are
+ now properly resolved (although *only* in font-family). Thanks Takeshi Terada
+ for reporting.
+- Improve parseCDATA algorithm to take into account newline normalization
+- Account for browser confusion between Yen character and backslash in
+ Shift_JIS encoding. This fix generalizes to any other encoding which is not
+ a strict superset of printable ASCII. Thanks Takeshi Terada for reporting.
+- Fix missing configuration parameter in Generator calls. Thanks vs for the
+ partial patch.
+- Improved adherence to Unicode by checking for non-character codepoints.
+ Thanks Geoffrey Sneddon for reporting. This may result in degraded
+ performance for extremely large inputs.
+- Allow CSS property-value pair ''text-decoration: none''. Thanks Jochem Blok
+ for reporting.
+. Added HTMLPurifier_UnitConverter and HTMLPurifier_Length for convenient
+ handling of CSS-style lengths. HTMLPurifier_AttrDef_CSS_Length now uses
+ this class.
+. API of HTMLPurifier_AttrDef_CSS_Length changed from __construct($disable_negative)
+ to __construct($min, $max). __construct(true) is equivalent to
+ __construct('0').
+. Added HTMLPurifier_AttrDef_Switch class
+. Rename HTMLPurifier_HTMLModule_Tidy->construct() to setup() and bubble method
+ up inheritance hierarchy to HTMLPurifier_HTMLModule. All HTMLModules
+ get this called with the configuration object. All modules now
+ use this rather than __construct(), although legacy code using constructors
+ will still work--the new format, however, lets modules access the
+ configuration object for HTML namespace dependant tweaks.
+. AttrDef_HTML_Pixels now takes a single construction parameter, pixels.
+. ConfigSchema data-structure heavily optimized; on average it uses a third
+ the memory it did previously. The interface has changed accordingly,
+ consult changes to HTMLPurifier_Config for details.
+. Variable parsing types now are magic integers instead of strings
+. Added benchmark for ConfigSchema
+. HTMLPurifier_Generator requires $config and $context parameters. If you
+ don't know what they should be, use HTMLPurifier_Config::createDefault()
+ and new HTMLPurifier_Context().
+. Printers now properly distinguish between output configuration, and
+ target configuration. This is not applicable to scripts using
+ the Printers for HTML Purifier related tasks.
+. HTML/CSS Printers must be primed with prepareGenerator($gen_config), otherwise
+ fatal errors will ensue.
+. URIFilter->prepare can return false in order to abort loading of the filter
+. Factory for AttrDef_URI implemented, URI#embedded to indicate URI that embeds
+ an external resource.
+. %URI.Munge functionality factored out into a post-filter class.
+. Added CurrentCSSProperty context variable during CSS validation
+
+3.1.0, released 2008-05-18
+# Unnecessary references to objects (vestiges of PHP4) removed from method
+ signatures. The following methods do not need references when assigning from
+ them and will result in E_STRICT errors if you try:
+ + HTMLPurifier_Config->get*Definition() [* = HTML, CSS]
+ + HTMLPurifier_ConfigSchema::instance()
+ + HTMLPurifier_DefinitionCacheFactory::instance()
+ + HTMLPurifier_DefinitionCacheFactory->create()
+ + HTMLPurifier_DoctypeRegistry->register()
+ + HTMLPurifier_DoctypeRegistry->get()
+ + HTMLPurifier_HTMLModule->addElement()
+ + HTMLPurifier_HTMLModule->addBlankElement()
+ + HTMLPurifier_LanguageFactory::instance()
+# Printer_ConfigForm's get*() functions were static-ified
+# %HTML.ForbiddenAttributes requires attribute declarations to be in the
+ form of tag@attr, NOT tag.attr (which will throw an error and won't do
+ anything). This is for forwards compatibility with XML; you'd do best
+ to migrate an %HTML.AllowedAttributes directives to this syntax too.
+! Allow index to be false for config from form creation
+! Added HTMLPurifier::VERSION constant
+! Commas, not dashes, used for serializer IDs. This change is forwards-compatible
+ and allows for version numbers like "3.1.0-dev".
+! %HTML.Allowed deals gracefully with whitespace anywhere, anytime!
+! HTML Purifier's URI handling is a lot more robust, with much stricter
+ validation checks and better percent encoding handling. Thanks Gareth Heyes
+ for indicating security vulnerabilities from lax percent encoding.
+! Bootstrap autoloader deals more robustly with classes that don't exist,
+ preventing class_exists($class, true) from barfing.
+- InterchangeBuilder now alphabetizes its lists
+- Validation error in configdoc output fixed
+- Iconv and other encoding errors muted even with custom error handlers that
+ do not honor error_reporting
+- Add protection against imagecrash attack with CSS height/width
+- HTMLPurifier::instance() created for consistency, is equivalent to getInstance()
+- Fixed and revamped broken ConfigForm smoketest
+- Bug with bool/null fields in Printer_ConfigForm fixed
+- Bug with global forbidden attributes fixed
+- Improved error messages for allowed and forbidden HTML elements and attributes
+- Missing (or null) in configdoc documentation restored
+- If DOM throws and exception during parsing with PH5P (occurs in newer versions
+ of DOM), HTML Purifier punts to DirectLex
+- Fatal error with unserialization of ScriptRequired
+- Created directories are now chmod'ed properly
+- Fixed bug with fallback languages in LanguageFactory
+- Standalone testing setup properly with autoload
+. Out-of-date documentation revised
+. UTF-8 encoding check optimization as suggested by Diego
+. HTMLPurifier_Error removed in favor of exceptions
+. More copy() function removed; should use clone instead
+. More extensive unit tests for HTMLDefinition
+. assertPurification moved to central harness
+. HTMLPurifier_Generator accepts $config and $context parameters during
+ instantiation, not runtime
+. Double-quotes outside of attribute values are now unescaped
+
+3.1.0rc1, released 2008-04-22
+# Autoload support added. Internal require_once's removed in favor of an
+ explicit require list or autoloading. To use HTML Purifier,
+ you must now either use HTMLPurifier.auto.php
+ or HTMLPurifier.includes.php; setting the include path and including
+ HTMLPurifier.php is insufficient--in such cases include HTMLPurifier.autoload.php
+ as well to register our autoload handler (or modify your autoload function
+ to check HTMLPurifier_Bootstrap::getPath($class)). You can also use
+ HTMLPurifier.safe-includes.php for a less performance friendly but more
+ user-friendly library load.
+# HTMLPurifier_ConfigSchema static functions are officially deprecated. Schema
+ information is stored in the ConfigSchema directory, and the
+ maintenance/generate-schema-cache.php generates the schema.ser file, which
+ is now instantiated. Support for userland schema changes coming soon!
+# HTMLPurifier_Config will now throw E_USER_NOTICE when you use a directive
+ alias; to get rid of these errors just modify your configuration to use
+ the new directive name.
+# HTMLPurifier->addFilter is deprecated; built-in filters can now be
+ enabled using %Filter.$filter_name or by setting your own filters using
+ %Filter.Custom
+# Directive-level safety properties superceded in favor of module-level
+ safety. Internal method HTMLModule->addElement() has changed, although
+ the externally visible HTMLDefinition->addElement has *not* changed.
+! Extra utility classes for testing and non-library operations can
+ be found in extras/. Specifically, these are FSTools and ConfigDoc.
+ You may find a use for these in your own project, but right now they
+ are highly experimental and volatile.
+! Integration with PHPT allows for automated smoketests
+! Limited support for proprietary HTML elements, namely <marquee>, sponsored
+ by Chris. You can enable them with %HTML.Proprietary if your client
+ demands them.
+! Support for !important CSS cascade modifier. By default, this will be stripped
+ from CSS, but you can enable it using %CSS.AllowImportant
+! Support for display and visibility CSS properties added, set %CSS.AllowTricky
+ to true to use them.
+! HTML Purifier now has its own Exception hierarchy under HTMLPurifier_Exception.
+ Developer error (not enduser error) can cause these to be triggered.
+! Experimental kses() wrapper introduced with HTMLPurifier.kses.php
+! Finally %CSS.AllowedProperties for tweaking allowed CSS properties without
+ mucking around with HTMLPurifier_CSSDefinition
+! ConfigDoc output has been enhanced with version and deprecation info.
+! %HTML.ForbiddenAttributes and %HTML.ForbiddenElements implemented.
+- Autoclose now operates iteratively, i.e. <span><span><div> now has
+ both span tags closed.
+- Various HTMLPurifier_Config convenience functions now accept another parameter
+ $schema which defines what HTMLPurifier_ConfigSchema to use besides the
+ global default.
+- Fix bug with trusted script handling in libxml versions later than 2.6.28.
+- Fix bug in ExtractStyleBlocks with comments in style tags
+- Fix bug in comment parsing for DirectLex
+- Flush output now displayed when in command line mode for unit tester
+- Fix bug with rgb(0, 1, 2) color syntax with spaces inside shorthand syntax
+- HTMLPurifier_HTMLDefinition->addAttribute can now be called multiple times
+ on the same element without emitting errors.
+- Fixed fatal error in PH5P lexer with invalid tag names
+. Plugins now get their own changelogs according to project conventions.
+. Convert tokens to use instanceof, reducing memory footprint and
+ improving comparison speed.
+. Dry runs now supported in SimpleTest; testing facilities improved
+. Bootstrap class added for handling autoloading functionality
+. Implemented recursive glob at FSTools->globr
+. ConfigSchema now has instance methods for all corresponding define*
+ static methods.
+. A couple of new historical maintenance scripts were added.
+. HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php split into two files
+. tests/index.php can now be run from any directory.
+. HTMLPurifier_Token subclasses split into seperate files
+. HTMLPURIFIER_PREFIX now is defined in Bootstrap.php, NOT HTMLPurifier.php
+. HTMLPURIFIER_PREFIX can now be defined outside of HTML Purifier
+. New --php=php flag added, allows PHP executable to be specified (command
+ line only!)
+. htmlpurifier_add_test() preferred method to translate test files in to
+ classes, because it handles PHPT files too.
+. Debugger class is deprecated and will be removed soon.
+. Command line argument parsing for testing scripts revamped, now --opt value
+ format is supported.
+. Smoketests now cleanup after magic quotes
+. Generator now can output comments (however, comments are still stripped
+ from HTML Purifier output)
+. HTMLPurifier_ConfigSchema->validate() deprecated in favor of
+ HTMLPurifier_VarParser->parse()
+. Integers auto-cast into float type by VarParser.
+. HTMLPURIFIER_STRICT removed; no validation is performed on runtime, only
+ during cache generation
+. Reordered script calls in maintenance/flush.php
+. Command line scripts now honor exit codes
+. When --flush fails in unit testers, abort tests and print message
+. Improved documentation in docs/dev-flush.html about the maintenance scripts
+. copy() methods removed in favor of clone keyword
+
+3.0.0, released 2008-01-06
+# HTML Purifier is PHP 5 only! The 2.1.x branch will be maintained
+ until PHP 4 is completely deprecated, but no new features will be added
+ to it.
+ + Visibility declarations added
+ + Constructor methods renamed to __construct()
+ + PHP4 reference cruft removed (in progress)
+! CSS properties are now case-insensitive
+! DefinitionCacheFactory now can register new implementations
+! New HTMLPurifier_Filter_ExtractStyleBlocks for extracting <style> from
+ documents and cleaning their contents up. Requires the CSSTidy library
+ <http://csstidy.sourceforge.net/>. You can access the blocks with the
+ 'StyleBlocks' Context variable ($purifier->context->get('StyleBlocks')).
+ The output CSS can also be "scoped" for a specific element, use:
+ %Filter.ExtractStyleBlocksScope
+! Experimental support for some proprietary CSS attributes allowed:
+ opacity (and all of the browser-specific equivalents) and scrollbar colors.
+ Enable by setting %CSS.Proprietary to true.
+- Colors missing # but in hex form will be corrected
+- CSS Number algorithm improved
+- Unit testing and multi-testing now on steroids: command lines,
+ XML output, and other goodies now added.
+. Unit tests for Injector improved
+. New classes:
+ + HTMLPurifier_AttrDef_CSS_AlphaValue
+ + HTMLPurifier_AttrDef_CSS_Filter
+. Multitest now has a file docblock
+
+2.1.3, released 2007-11-05
+! tests/multitest.php allows you to test multiple versions by running
+ tests/index.php through multiple interpreters using `phpv` shell
+ script (you must provide this script!)
+- Fixed poor include ordering for Email URI AttrDefs, causes fatal errors
+ on some systems.
+- Injector algorithm further refined: off-by-one error regarding skip
+ counts for dormant injectors fixed
+- Corrective blockquote definition now enabled for HTML 4.01 Strict
+- Fatal error when <img> tag (or any other element with required attributes)
+ has 'id' attribute fixed, thanks NykO18 for reporting
+- Fix warning emitted when a non-supported URI scheme is passed to the
+ MakeAbsolute URIFilter, thanks NykO18 (again)
+- Further refine AutoParagraph injector. Behavior inside of elements
+ allowing paragraph tags clarified: only inline content delimeted by
+ double newlines (not block elements) are paragraphed.
+- Buggy treatment of end tags of elements that have required attributes
+ fixed (does not manifest on default tag-set)
+- Spurious internal content reorganization error suppressed
+- HTMLDefinition->addElement now returns a reference to the created
+ element object, as implied by the documentation
+- Phorum mod's HTML Purifier help message expanded (unreleased elsewhere)
+- Fix a theoretical class of infinite loops from DirectLex reported
+ by Nate Abele
+- Work around unnecessary DOMElement type-cast in PH5P that caused errors
+ in PHP 5.1
+- Work around PHP 4 SimpleTest lack-of-error complaining for one-time-only
+ HTMLDefinition errors, this may indicate problems with error-collecting
+ facilities in PHP 5
+- Make ErrorCollectorEMock work in both PHP 4 and PHP 5
+- Make PH5P work with PHP 5.0 by removing unnecessary array parameter typedef
+. %Core.AcceptFullDocuments renamed to %Core.ConvertDocumentToFragment
+ to better communicate its purpose
+. Error unit tests can now specify the expectation of no errors. Future
+ iterations of the harness will be extremely strict about what errors
+ are allowed
+. Extend Injector hooks to allow for more powerful injector routines
+. HTMLDefinition->addBlankElement created, as according to the HTMLModule
+ method
+. Doxygen configuration file updated, with minor improvements
+. Test runner now checks for similarly named files in conf/ directory too.
+. Minor cosmetic change to flush-definition-cache.php: trailing newline is
+ outputted
+. Maintenance script for generating PH5P patch added, original PH5P source
+ file also added under version control
+. Full unit test runner script title made more descriptive with PHP version
+. Updated INSTALL file to state that 4.3.7 is the earliest version we
+ are actively testing
+
+2.1.2, released 2007-09-03
+! Implemented Object module for trusted users
+! Implemented experimental HTML5 parsing mode using PH5P. To use, add
+ this to your code:
+ require_once 'HTMLPurifier/Lexer/PH5P.php';
+ $config->set('Core', 'LexerImpl', 'PH5P');
+ Note that this Lexer introduces some classes not in the HTMLPurifier
+ namespace. Also, this is PHP5 only.
+! CSS property border-spacing implemented
+- Fix non-visible parsing error in DirectLex with empty tags that have
+ slashes inside attribute values.
+- Fix typo in CSS definition: border-collapse:seperate; was incorrectly
+ accepted as valid CSS. Usually non-visible, because this styling is the
+ default for tables in most browsers. Thanks Brett Zamir for pointing
+ this out.
+- Fix validation errors in configuration form
+- Hammer out a bunch of edge-case bugs in the standalone distribution
+- Inclusion reflection removed from URISchemeRegistry; you must manually
+ include any new schema files you wish to use
+- Numerous typo fixes in documentation thanks to Brett Zamir
+. Unit test refactoring for one logical test per test function
+. Config and context parameters in ComplexHarness deprecated: instead, edit
+ the $config and $context member variables
+. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't
+ really make a difference, but is good for completeness sake
+. merge-library.php script refactored for greater code reusability and
+ PHP4 compatibility
+
+2.1.1, released 2007-08-04
+- Fix show-stopper bug in %URI.MakeAbsolute functionality
+- Fix PHP4 syntax error in standalone version
+. Add prefix directory to include path for standalone, this prevents
+ other installations from clobbering the standalone's URI schemes
+. Single test methods can be invoked by prefixing with __only
+
+2.1.0, released 2007-08-02
+# flush-htmldefinition-cache.php superseded in favor of a generic
+ flush-definition-cache.php script, you can clear a specific cache
+ by passing its name as a parameter to the script
+! Phorum mod implemented for HTML Purifier
+! With %Core.AggressivelyFixLt, <3 and similar emoticons no longer
+ trigger HTML removal in PHP5 (DOMLex). This directive is not necessary
+ for PHP4 (DirectLex).
+! Standalone file now available, which greatly reduces the amount of
+ includes (although there are still a few files that reside in the
+ standalone folder)
+! Relative URIs can now be transformed into their absolute equivalents
+ using %URI.Base and %URI.MakeAbsolute
+! Ruby implemented for XHTML 1.1
+! You can now define custom URI filtering behavior, see enduser-uri-filter.html
+ for more details
+! UTF-8 font names now supported in CSS
+- AutoFormatters emit friendly error messages if tags or attributes they
+ need are not allowed
+- ConfigForm's compactification of directive names is now configurable
+- AutoParagraph autoformatter algorithm refined after field-testing
+- XHTML 1.1 now applies XHTML 1.0 Strict cleanup routines, namely
+ blockquote wrapping
+- Contents of <style> tags removed by default when tags are removed
+. HTMLPurifier_Config->getSerial() implemented, this is extremely useful
+ for output cache invalidation
+. ConfigForm printer now can retrieve CSS and JS files as strings, in
+ case HTML Purifier's directory is not publically accessible
+. Introduce new text/itext configuration directive values: these represent
+ longer strings that would be more appropriately edited with a textarea
+. Allow newlines to act as separators for lists, hashes, lookups and
+ %HTML.Allowed
+. ConfigForm generates textareas instead of text inputs for lists, hashes,
+ lookups, text and itext fields
+. Hidden element content removal genericized: %Core.HiddenElements can
+ be used to customize this behavior, by default <script> and <style> are
+ hidden
+. Added HTMLPURIFIER_PREFIX constant, should be used instead of dirname(__FILE__)
+. Custom ChildDef added to default include list
+. URIScheme reflection improved: will not attempt to include file if class
+ already exists. May clobber autoload, so I need to keep an eye on it
+. ConfigSchema heavily optimized, will only collect information and validate
+ definitions when HTMLPURIFIER_SCHEMA_STRICT is true.
+. AttrDef_URI unit tests and implementation refactored
+. benchmarks/ directory now protected from public view with .htaccess file;
+ run the tests via command line
+. URI scheme is munged off if there is no authority and the scheme is the
+ default one
+. All unit tests inherit from HTMLPurifier_Harness, not UnitTestCase
+. Interface for URIScheme changed
+. Generic URI object to hold components of URI added, most systems involved
+ in URI validation have been migrated to use it
+. Custom filtering for URIs factored out to URIDefinition interface for
+ maximum extensibility
+
+2.0.1, released 2007-06-27
+! Tag auto-closing now based on a ChildDef heuristic rather than a
+ manually set auto_close array; some behavior may change
+! Experimental AutoFormat functionality added: auto-paragraph and
+ linkify your HTML input by setting %AutoFormat.AutoParagraph and
+ %AutoFormat.Linkify to true
+! Newlines normalized internally, and then converted back to the
+ value of PHP_EOL. If this is not desired, set your newline format
+ using %Output.Newline.
+! Beta error collection, messages are implemented for the most generic
+ cases involving Lexing or Strategies
+- Clean up special case code for <script> tags
+- Reorder includes for DefinitionCache decorators, fixes a possible
+ missing class error
+- Fixed bug where manually modified definitions were not saved via cache
+ (mostly harmless, except for the fact that it would be a little slower)
+- Configuration objects with different serials do not clobber each
+ others when revision numbers are unequal
+- Improve Serializer DefinitionCache directory permissions checks
+- DefinitionCache no longer throws errors when it encounters old
+ serial files that do not conform to the current style
+- Stray xmlns attributes removed from configuration documentation
+- configForm.php smoketest no longer has XSS vulnerability due to
+ unescaped print_r output
+- Printer adheres to configuration's directives on output format
+- Fix improperly named form field in ConfigForm printer
+. Rewire some test-cases to swallow errors rather than expect them
+. HTMLDefinition printer updated with some of the new attributes
+. DefinitionCache keys reordered to reflect precedence: version number,
+ hash, then revision number
+. %Core.DefinitionCache renamed to %Cache.DefinitionImpl
+. Interlinking in configuration documentation added using
+ Injector_PurifierLinkify
+. Directives now keep track of aliases to themselves
+. Error collector now requires a severity to be passed, use PHP's internal
+ error constants for this
+. HTMLPurifier_Config::getAllowedDirectivesForForm implemented, allows
+ much easier selective embedding of configuration values
+. Doctype objects now accept public and system DTD identifiers
+. %HTML.Doctype is now constrained by specific values, to specify a custom
+ doctype use new %HTML.CustomDoctype
+. ConfigForm truncates long directives to keep the form small, and does
+ not re-output namespaces
+
+2.0.0, released 2007-06-20
+# Completely refactored HTMLModuleManager, decentralizing safety
+ information
+# Transform modules changed to Tidy modules, which offer more flexibility
+ and better modularization
+# Configuration object now finalizes itself when a read operation is
+ performed on it, ensuring that its internal state stays consistent.
+ To revert this behavior, you can set the $autoFinalize member variable
+ off, but it's not recommended.
+# New compact syntax for AttrDef objects that can be used to instantiate
+ new objects via make()
+# Definitions (esp. HTMLDefinition) are now cached for a significant
+ performance boost. You can disable caching by setting %Core.DefinitionCache
+ to null. You CANNOT edit raw definitions without setting the corresponding
+ DefinitionID directive (%HTML.DefinitionID for HTMLDefinition).
+# Contents between <script> tags are now completely removed if <script>
+ is not allowed
+# Prototype-declarations for Lexer removed in favor of configuration
+ determination of Lexer implementations.
+! HTML Purifier now works in PHP 4.3.2.
+! Configuration form-editing API makes tweaking HTMLPurifier_Config a
+ breeze!
+! Configuration directives that accept hashes now allow new string
+ format: key1:value1,key2:value2
+! ConfigDoc now factored into OOP design
+! All deprecated elements now natively supported
+! Implement TinyMCE styled whitelist specification format in
+ %HTML.Allowed
+! Config object gives more friendly error messages when things go wrong
+! Advanced API implemented: easy functions for creating elements (addElement)
+ and attributes (addAttribute) on HTMLDefinition
+! Add native support for required attributes
+- Deprecated and removed EnableRedundantUTF8Cleaning. It didn't even work!
+- DOMLex will not emit errors when a custom error handler that does not
+ honor error_reporting is used
+- StrictBlockquote child definition refrains from wrapping whitespace
+ in tags now.
+- Bug resulting from tag transforms to non-allowed elements fixed
+- ChildDef_Custom's regex generation has been improved, removing several
+ false positives
+. Unit test for ElementDef created, ElementDef behavior modified to
+ be more flexible
+. Added convenience functions for HTMLModule constructors
+. AttrTypes now has accessor functions that should be used instead
+ of directly manipulating info
+. TagTransform_Center deprecated in favor of generic TagTransform_Simple
+. Add extra protection in AttrDef_URI against phantom Schemes
+. Doctype object added to HTMLDefinition which describes certain aspects
+ of the operational document type
+. Lexer is now pre-emptively included, with a conditional include for the
+ PHP5 only version.
+. HTMLDefinition and CSSDefinition have a common parent class: Definition.
+. DirectLex can now track line-numbers
+. Preliminary error collector is in place, although no code actually reports
+ errors yet
+. Factor out most of ValidateAttributes to new AttrValidator class
+
+1.6.1, released 2007-05-05
+! Support for more deprecated attributes via transformations:
+ + hspace and vspace in img
+ + size and noshade in hr
+ + nowrap in td
+ + clear in br
+ + align in caption, table, img and hr
+ + type in ul, ol and li
+! DirectLex now preserves text in which a < bracket is followed by
+ a non-alphanumeric character. This means that certain emoticons
+ are now preserved.
+! %Core.RemoveInvalidImg is now operational, when set to false invalid
+ images will hang around with an empty src
+! target attribute in a tag supported, use %Attr.AllowedFrameTargets
+ to enable
+! CSS property white-space now allows nowrap (supported in all modern
+ browsers) but not others (which have spotty browser implementations)
+! XHTML 1.1 mode now sort-of works without any fatal errors, and
+ lang is now moved over to xml:lang.
+! Attribute transformation smoketest available at smoketests/attrTransform.php
+! Transformation of font's size attribute now handles super-large numbers
+- Possibly fatal bug with __autoload() fixed in module manager
+- Invert HTMLModuleManager->addModule() processing order to check
+ prefixes first and then the literal module
+- Empty strings get converted to empty arrays instead of arrays with
+ an empty string in them.
+- Merging in attribute lists now works.
+. Demo script removed: it has been added to the website's repository
+. Basic.php script modified to work out of the box
+. Refactor AttrTransform classes to reduce duplication
+. AttrTransform_TextAlign axed in favor of a more general
+ AttrTransform_EnumToCSS, refer to HTMLModule/TransformToStrict.php to
+ see how the new equivalent is implemented
+. Unit tests now use exclusively assertIdentical
+
+1.6.0, released 2007-04-01
+! Support for most common deprecated attributes via transformations:
+ + bgcolor in td, th, tr and table
+ + border in img
+ + name in a and img
+ + width in td, th and hr
+ + height in td, th
+! Support for CSS attribute 'height' added
+! Support for rel and rev attributes in a tags added, use %Attr.AllowedRel
+ and %Attr.AllowedRev to activate
+- You can define ID blacklists using regular expressions via
+ %Attr.IDBlacklistRegexp
+- Error messages are emitted when you attempt to "allow" elements or
+ attributes that HTML Purifier does not support
+- Fix segfault in unit test. The problem is not very reproduceable and
+ I don't know what causes it, but a six line patch fixed it.
+
+1.5.0, released 2007-03-23
+! Added a rudimentary I18N and L10N system modeled off MediaWiki. It
+ doesn't actually do anything yet, but keep your eyes peeled.
+! docs/enduser-utf8.html explains how to use UTF-8 and HTML Purifier
+! Newly structured HTMLDefinition modeled off of XHTML 1.1 modules.
+ I am loathe to release beta quality APIs, but this is exactly that;
+ don't use the internal interfaces if you're not willing to do migration
+ later on.
+- Allow 'x' subtag in language codes
+- Fixed buggy chameleon-support for ins and del
+. Added support for IDREF attributes (i.e. for)
+. Renamed HTMLPurifier_AttrDef_Class to HTMLPurifier_AttrDef_Nmtokens
+. Removed context variable ParentType, replaced with IsInline, which
+ is false when you're not inline and an integer of the parent that
+ caused you to become inline when you are (so possibly zero)
+. Removed ElementDef->type in favor of ElementDef->descendants_are_inline
+ and HTMLDefinition->content_sets
+. StrictBlockquote now reports what elements its supposed to allow,
+ rather than what it does allow
+. Removed HTMLDefinition->info_flow_elements in favor of
+ HTMLDefinition->content_sets['Flow']
+. Removed redundant "exclusionary" definitions from DTD roster
+. StrictBlockquote now requires a construction parameter as if it
+ were an Required ChildDef, this is the "real" set of allowed elements
+. AttrDef partitioned into HTML, CSS and URI segments
+. Modify Youtube filter regexp to be multiline
+. Require both PHP5 and DOM extension in order to use DOMLex, fixes
+ some edge cases where a DOMDocument class exists in a PHP4 environment
+ due to DOM XML extension.
+
+1.4.1, released 2007-01-21
+! docs/enduser-youtube.html updated according to new functionality
+- YouTube IDs can have underscores and dashes
+
+1.4.0, released 2007-01-21
+! Implemented list-style-image, URIs now allowed in list-style
+! Implemented background-image, background-repeat, background-attachment
+ and background-position CSS properties. Shorthand property background
+ supports all of these properties.
+! Configuration documentation looks nicer
+! Added %Core.EscapeNonASCIICharacters to workaround loss of Unicode
+ characters while %Core.Encoding is set to a non-UTF-8 encoding.
+! Support for configuration directive aliases added
+! Config object can now be instantiated from ini files
+! YouTube preservation code added to the core, with two lines of code
+ you can add it as a filter to your code. See smoketests/preserveYouTube.php
+ for sample code.
+! Moved SLOW to docs/enduser-slow.html and added code examples
+- Replaced version check with functionality check for DOM (thanks Stephen
+ Khoo)
+. Added smoketest 'all.php', which loads all other smoketests via frames
+. Implemented AttrDef_CSSURI for url(http://google.com) style declarations
+. Added convenient single test selector form on test runner
+
+1.3.2, released 2006-12-25
+! HTMLPurifier object now accepts configuration arrays, no need to manually
+ instantiate a configuration object
+! Context object now accessible to outside
+! Added enduser-youtube.html, explains how to embed YouTube videos. See
+ also corresponding smoketest preserveYouTube.php.
+! Added purifyArray(), which takes a list of HTML and purifies it all
+! Added static member variable $version to HTML Purifier with PHP-compatible
+ version number string.
+- Fixed fatal error thrown by upper-cased language attributes
+- printDefinition.php: added labels, added better clarification
+. HTMLPurifier_Config::create() added, takes mixed variable and converts into
+ a HTMLPurifier_Config object.
+
+1.3.1, released 2006-12-06
+! Added HTMLPurifier.func.php stub for a convenient function to call the library
+- Fixed bug in RemoveInvalidImg code that caused all images to be dropped
+ (thanks to .mario for reporting this)
+. Standardized all attribute handling variables to attr, made it plural
+
+1.3.0, released 2006-11-26
+# Invalid images are now removed, rather than replaced with a dud
+ <img src="" alt="Invalid image" />. Previous behavior can be restored
+ with new directive %Core.RemoveInvalidImg set to false.
+! (X)HTML Strict now supported
+ + Transparently handles inline elements in block context (blockquote)
+! Added GET method to demo for easier validation, added 50kb max input size
+! New directive %HTML.BlockWrapper, for block-ifying inline elements
+! New directive %HTML.Parent, allows you to only allow inline content
+! New directives %HTML.AllowedElements and %HTML.AllowedAttributes to let
+ users narrow the set of allowed tags
+! <li value="4"> and <ul start="2"> now allowed in loose mode
+! New directives %URI.DisableExternalResources and %URI.DisableResources
+! New directive %Attr.DisableURI, which eliminates all hyperlinking
+! New directive %URI.Munge, munges URI so you can use some sort of redirector
+ service to avoid PageRank leaks or warn users that they are exiting your site.
+! Added spiffy new smoketest printDefinition.php, which lets you twiddle with
+ the configuration settings and see how the internal rules are affected.
+! New directive %URI.HostBlacklist for blocking links to bad hosts.
+ xssAttacks.php smoketest updated accordingly.
+- Added missing type to ChildDef_Chameleon
+- Remove Tidy option from demo if there is not Tidy available
+. ChildDef_Required guards against empty tags
+. Lookup table HTMLDefinition->info_flow_elements added
+. Added peace-of-mind variable initialization to Strategy_FixNesting
+. Added HTMLPurifier->info_parent_def, parent child processing made special
+. Added internal documents briefly summarizing future progression of HTML
+. HTMLPurifier_Config->getBatch($namespace) added
+. More lenient casting to bool from string in HTMLPurifier_ConfigSchema
+. Refactored ChildDef classes into their own files
+
+1.2.0, released 2006-11-19
+# ID attributes now disabled by default. New directives:
+ + %HTML.EnableAttrID - restores old behavior by allowing IDs
+ + %Attr.IDPrefix - %Attr.IDBlacklist alternative that munges all user IDs
+ so that they don't collide with your IDs
+ + %Attr.IDPrefixLocal - Same as above, but for when there are multiple
+ instances of user content on the page
+ + Profuse documentation on how to use these available in docs/enduser-id.txt
+! Added MODx plugin <http://modxcms.com/forums/index.php/topic,6604.0.html>
+! Added percent encoding normalization
+! XSS attacks smoketest given facelift
+! Configuration documentation now has table of contents
+! Added %URI.DisableExternal, which prevents links to external websites. You
+ can also use %URI.Host to permit absolute linking to subdomains
+! Non-accessible resources (ex. mailto) blocked from embedded URIs (img src)
+- Type variable in HTMLDefinition was not being set properly, fixed
+- Documentation updated
+ + TODO added request Phalanger
+ + TODO added request Native compression
+ + TODO added request Remove redundant tags
+ + TODO added possible plaintext formatter for HTML Purifier documentation
+ + Updated ConfigDoc TODO
+ + Improved inline comments in AttrDef/Class.php, AttrDef/CSS.php
+ and AttrDef/Host.php
+ + Revamped documentation into HTML, along with misc updates
+- HTMLPurifier_Context doesn't throw a variable reference error if you attempt
+ to retrieve a non-existent variable
+. Switched to purify()-wide Context object registry
+. Refactored unit tests to minimize duplication
+. XSS attack sheet updated
+. configdoc.xml now has xml:space attached to default value nodes
+. Allow configuration directives to permit null values
+. Cleaned up test-cases to remove unnecessary swallowErrors()
+
+1.1.2, released 2006-09-30
+! Add HTMLPurifier.auto.php stub file that configures include_path
+- Documentation updated
+ + INSTALL document rewritten
+ + TODO added semi-lossy conversion
+ + API Doxygen docs' file exclusions updated
+ + Added notes on HTML versus XML attribute whitespace handling
+ + Noted that HTMLPurifier_ChildDef_Custom isn't being used
+ + Noted that config object's definitions are cached versions
+- Fixed lack of attribute parsing in HTMLPurifier_Lexer_PEARSax3
+- ftp:// URIs now have their typecodes checked
+- Hooked up HTMLPurifier_ChildDef_Custom's unit tests (they weren't being run)
+. Line endings standardized throughout project (svn:eol-style standardized)
+. Refactored parseData() to general Lexer class
+. Tester named "HTML Purifier" not "HTMLPurifier"
+
+1.1.1, released 2006-09-24
+! Configuration option to optionally Tidy up output for indentation to make up
+ for dropped whitespace by DOMLex (pretty-printing for the entire application
+ should be done by a page-wide Tidy)
+- Various documentation updates
+- Fixed parse error in configuration documentation script
+- Fixed fatal error in benchmark scripts, slightly augmented
+- As far as possible, whitespace is preserved in-between table children
+- Sample test-settings.php file included
+
+1.1.0, released 2006-09-16
+! Directive documentation generation using XSLT
+! XHTML can now be turned off, output becomes <br>
+- Made URI validator more forgiving: will ignore leading and trailing
+ quotes, apostrophes and less than or greater than signs.
+- Enforce alphanumeric namespace and directive names for configuration.
+- Table child definition made more flexible, will fix up poorly ordered elements
+. Renamed ConfigDef to ConfigSchema
+
+1.0.1, released 2006-09-04
+- Fixed slight bug in DOMLex attribute parsing
+- Fixed rejection of case-insensitive configuration values when there is a
+ set of allowed values. This manifested in %Core.Encoding.
+- Fixed rejection of inline style declarations that had lots of extra
+ space in them. This manifested in TinyMCE.
+
+1.0.0, released 2006-09-01
+! Shorthand CSS properties implemented: font, border, background, list-style
+! Basic color keywords translated into hexadecimal values
+! Table CSS properties implemented
+! Support for charsets other than UTF-8 (defined by iconv)
+! Malformed UTF-8 and non-SGML character detection and cleaning implemented
+- Fixed broken numeric entity conversion
+- API documentation completed
+. (HTML|CSS)Definition de-singleton-ized
+
+1.0.0beta, released 2006-08-16
+! First public release, most functionality implemented. Notable omissions are:
+ + Shorthand CSS properties
+ + Table CSS properties
+ + Deprecated attribute transformations
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/README.md b/vendor/ezyang/htmlpurifier/README.md
new file mode 100644
index 000000000..b321f2b69
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/README.md
@@ -0,0 +1,29 @@
+HTML Purifier [![Build Status](https://secure.travis-ci.org/ezyang/htmlpurifier.svg?branch=master)](http://travis-ci.org/ezyang/htmlpurifier)
+=============
+
+HTML Purifier is an HTML filtering solution that uses a unique combination
+of robust whitelists and agressive parsing to ensure that not only are
+XSS attacks thwarted, but the resulting HTML is standards compliant.
+
+HTML Purifier is oriented towards richly formatted documents from
+untrusted sources that require CSS and a full tag-set. This library can
+be configured to accept a more restrictive set of tags, but it won't be
+as efficient as more bare-bones parsers. It will, however, do the job
+right, which may be more important.
+
+Places to go:
+
+* See INSTALL for a quick installation guide
+* See docs/ for developer-oriented documentation, code examples and
+ an in-depth installation guide.
+* See WYSIWYG for information on editors like TinyMCE and FCKeditor
+
+HTML Purifier can be found on the web at: [http://htmlpurifier.org/](http://htmlpurifier.org/)
+
+## Installation
+
+Package available on [Composer](https://packagist.org/packages/ezyang/htmlpurifier).
+
+If you're using Composer to manage dependencies, you can use
+
+ $ composer require "ezyang/htmlpurifier": "dev-master"
diff --git a/vendor/ezyang/htmlpurifier/TODO b/vendor/ezyang/htmlpurifier/TODO
new file mode 100644
index 000000000..1afb33cbf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/TODO
@@ -0,0 +1,150 @@
+
+TODO List
+
+= KEY ====================
+ # Flagship
+ - Regular
+ ? Maybe I'll Do It
+==========================
+
+If no interest is expressed for a feature that may require a considerable
+amount of effort to implement, it may get endlessly delayed. Do not be
+afraid to cast your vote for the next feature to be implemented!
+
+Things to do as soon as possible:
+
+ - http://htmlpurifier.org/phorum/read.php?3,5560,6307#msg-6307
+ - Think about allowing explicit order of operations hooks for transforms
+ - Fix "<.<" bug (trailing < is removed if not EOD)
+ - Build in better internal state dumps and debugging tools for remote
+ debugging
+ - Allowed/Allowed* have strange interactions when both set
+ ? Transform lone embeds into object tags
+ - Deprecated config options that emit warnings when you set them (with'
+ a way of muting the warning if you really want to)
+ - Make HTML.Trusted work with Output.FlashCompat
+ - HTML.Trusted and HTML.SafeObject have funny interaction; general
+ problem is what to do when a module "supersedes" another
+ (see also tables and basic tables.) This is a little dicier
+ because HTML.SafeObject has some extra functionality that
+ trusted might find useful. See http://htmlpurifier.org/phorum/read.php?3,5762,6100
+
+FUTURE VERSIONS
+---------------
+
+4.9 release [OMG CONFIG PONIES]
+ ! Fix Printer. It's from the old days when we didn't have decent XML classes
+ ! Factor demo.php into a set of Printer classes, and then create a stub
+ file for users here (inside the actual HTML Purifier library)
+ - Fix error handling with form construction
+ - Do encoding validation in Printers, or at least, where user data comes in
+ - Config: Add examples to everything (make built-in which also automatically
+ gives output)
+ - Add "register" field to config schemas to eliminate dependence on
+ naming conventions (try to remember why we ultimately decided on tihs)
+
+5.0 release [HTML 5]
+ # Swap out code to use html5lib tokenizer and tree-builder
+ ! Allow turning off of FixNesting and required attribute insertion
+
+5.1 release [It's All About Trust] (floating)
+ # Implement untrusted, dangerous elements/attributes
+ # Implement IDREF support (harder than it seems, since you cannot have
+ IDREFs to non-existent IDs)
+ - Implement <area> (client and server side image maps are blocking
+ on IDREF support)
+ # Frameset XHTML 1.0 and HTML 4.01 doctypes
+ - Figure out how to simultaneously set %CSS.Trusted and %HTML.Trusted (?)
+
+5.2 release [Error'ed]
+ # Error logging for filtering/cleanup procedures
+ # Additional support for poorly written HTML
+ - Microsoft Word HTML cleaning (i.e. MsoNormal, but research essential!)
+ - Friendly strict handling of <address> (block -> <br>)
+ - XSS-attempt detection--certain errors are flagged XSS-like
+ - Append something to duplicate IDs so they're still usable (impl. note: the
+ dupe detector would also need to detect the suffix as well)
+
+6.0 release [Beyond HTML]
+ # Legit token based CSS parsing (will require revamping almost every
+ AttrDef class). Probably will use CSSTidy
+ # More control over allowed CSS properties using a modularization
+ # IRI support (this includes IDN)
+ - Standardize token armor for all areas of processing
+
+7.0 release [To XML and Beyond]
+ - Extended HTML capabilities based on namespacing and tag transforms (COMPLEX)
+ - Hooks for adding custom processors to custom namespaced tags and
+ attributes, offer default implementation
+ - Lots of documentation and samples
+
+Ongoing
+ - More refactoring to take advantage of PHP5's facilities
+ - Refactor unit tests into lots of test methods
+ - Plugins for major CMSes (COMPLEX)
+ - phpBB
+ - Also, a FAQ for extension writers with HTML Purifier
+
+AutoFormat
+ - Smileys
+ - Syntax highlighting (with GeSHi) with <pre> and possibly <?php
+ - Look at http://drupal.org/project/Modules/category/63 for ideas
+
+Neat feature related
+ ! Support exporting configuration, so users can easily tweak settings
+ in the demo, and then copy-paste into their own setup
+ - Advanced URI filtering schemes (see docs/proposal-new-directives.txt)
+ - Allow scoped="scoped" attribute in <style> tags; may be troublesome
+ because regular CSS has no way of uniquely identifying nodes, so we'd
+ have to generate IDs
+ - Explain how to use HTML Purifier in non-PHP languages / create
+ a simple command line stub (or complicated?)
+ - Fixes for Firefox's inability to handle COL alignment props (Bug 915)
+ - Automatically add non-breaking spaces to empty table cells when
+ empty-cells:show is applied to have compatibility with Internet Explorer
+ - Table of Contents generation (XHTML Compiler might be reusable). May also
+ be out-of-band information.
+ - Full set of color keywords. Also, a way to add onto them without
+ finalizing the configuration object.
+ - Write a var_export and memcached DefinitionCache - Denis
+ - Built-in support for target="_blank" on all external links
+ - Convert RTL/LTR override characters to <bdo> tags, or vice versa on demand.
+ Also, enable disabling of directionality
+ ? Externalize inline CSS to promote clean HTML, proposed by Sander Tekelenburg
+ ? Remove redundant tags, ex. <u><u>Underlined</u></u>. Implementation notes:
+ 1. Analyzing which tags to remove duplicants
+ 2. Ensure attributes are merged into the parent tag
+ 3. Extend the tag exclusion system to specify whether or not the
+ contents should be dropped or not (currently, there's code that could do
+ something like this if it didn't drop the inner text too.)
+ ? Make AutoParagraph also support paragraph-izing double <br> tags, and not
+ just double newlines. This is kind of tough to do in the current framework,
+ though, and might be reasonably approximated by search replacing double <br>s
+ with newlines before running it through HTML Purifier.
+
+Maintenance related (slightly boring)
+ # CHMOD install script for PEAR installs
+ ! Factor out command line parser into its own class, and unit test it
+ - Reduce size of internal data-structures (esp. HTMLDefinition)
+ - Allow merging configurations. Thus,
+ a -> b -> default
+ c -> d -> default
+ becomes
+ a -> b -> c -> d -> default
+ Maybe allow more fine-grained tuning of this behavior. Alternatively,
+ encourage people to use short plist depths before building them up.
+ - Time PHPT tests
+
+ChildDef related (very boring)
+ - Abstract ChildDef_BlockQuote to work with all elements that only
+ allow blocks in them, required or optional
+ - Implement lenient <ruby> child validation
+
+Wontfix
+ - Non-lossy smart alternate character encoding transformations (unless
+ patch provided)
+ - Pretty-printing HTML: users can use Tidy on the output on entire page
+ - Native content compression, whitespace stripping: use gzip if this is
+ really important
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/VERSION b/vendor/ezyang/htmlpurifier/VERSION
new file mode 100644
index 000000000..b550c72a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/VERSION
@@ -0,0 +1 @@
+4.9.2 \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/WHATSNEW b/vendor/ezyang/htmlpurifier/WHATSNEW
new file mode 100644
index 000000000..b435e664b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WHATSNEW
@@ -0,0 +1,12 @@
+HTML Purifier 4.9.x is a maintenance release, collecting a year
+of accumulated bug fixes plus a few new features. New features
+include support for min/max-width/height CSS, and rgba/hsl/hsla
+in color specifications. Major bugfixes include improvements
+in the Serializer cache to avoid chmod'ing directories, better
+entity decoding (we won't accidentally encode entities that occur
+in URLs) and rel="noopener" on links with target attributes,
+to prevent them from overwriting the original frame.
+
+4.9.0 was skipped due to a packaging problem; 4.9.2 fixes two
+major regressions in PHP 5.3 support and entity decoding; no
+other functional changes were applied.
diff --git a/vendor/ezyang/htmlpurifier/WYSIWYG b/vendor/ezyang/htmlpurifier/WYSIWYG
new file mode 100644
index 000000000..c518aacdd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/WYSIWYG
@@ -0,0 +1,20 @@
+
+WYSIWYG - What You See Is What You Get
+ HTML Purifier: A Pretty Good Fit for TinyMCE and FCKeditor
+
+Javascript-based WYSIWYG editors, simply stated, are quite amazing. But I've
+always been wary about using them due to security issues: they handle the
+client-side magic, but once you've been served a piping hot load of unfiltered
+HTML, what should be done then? In some situations, you can serve it uncleaned,
+since you only offer these facilities to trusted(?) authors.
+
+Unfortunantely, for blog comments and anonymous input, BBCode, Textile and
+other markup languages still reign supreme. Put simply: filtering HTML is
+hard work, and these WYSIWYG authors don't offer anything to alleviate that
+trouble. Therein lies the solution:
+
+HTML Purifier is perfect for filtering pure-HTML input from WYSIWYG editors.
+
+Enough said.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/composer.json b/vendor/ezyang/htmlpurifier/composer.json
new file mode 100644
index 000000000..80fee3db3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/composer.json
@@ -0,0 +1,25 @@
+{
+ "name": "ezyang/htmlpurifier",
+ "description": "Standards compliant HTML filter written in PHP",
+ "type": "library",
+ "keywords": ["html"],
+ "homepage": "http://htmlpurifier.org/",
+ "license": "LGPL",
+ "authors": [
+ {
+ "name": "Edward Z. Yang",
+ "email": "admin@htmlpurifier.org",
+ "homepage": "http://ezyang.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.2"
+ },
+ "require-dev": {
+ "simpletest/simpletest": "^1.1"
+ },
+ "autoload": {
+ "psr-0": { "HTMLPurifier": "library/" },
+ "files": ["library/HTMLPurifier.composer.php"]
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
new file mode 100644
index 000000000..1cfec5d76
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/ConfigDoc/HTMLXSLTProcessor.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Decorator/extender XSLT processor specifically for HTML documents.
+ */
+class ConfigDoc_HTMLXSLTProcessor
+{
+
+ /**
+ * Instance of XSLTProcessor
+ */
+ protected $xsltProcessor;
+
+ public function __construct($proc = false)
+ {
+ if ($proc === false) $proc = new XSLTProcessor();
+ $this->xsltProcessor = $proc;
+ }
+
+ /**
+ * @note Allows a string $xsl filename to be passed
+ */
+ public function importStylesheet($xsl)
+ {
+ if (is_string($xsl)) {
+ $xsl_file = $xsl;
+ $xsl = new DOMDocument();
+ $xsl->load($xsl_file);
+ }
+ return $this->xsltProcessor->importStylesheet($xsl);
+ }
+
+ /**
+ * Transforms an XML file into compatible XHTML based on the stylesheet
+ * @param $xml XML DOM tree, or string filename
+ * @return string HTML output
+ * @todo Rename to transformToXHTML, as transformToHTML is misleading
+ */
+ public function transformToHTML($xml)
+ {
+ if (is_string($xml)) {
+ $dom = new DOMDocument();
+ $dom->load($xml);
+ } else {
+ $dom = $xml;
+ }
+ $out = $this->xsltProcessor->transformToXML($dom);
+
+ // fudges for HTML backwards compatibility
+ // assumes that document is XHTML
+ $out = str_replace('/>', ' />', $out); // <br /> not <br/>
+ $out = str_replace(' xmlns=""', '', $out); // rm unnecessary xmlns
+
+ if (class_exists('Tidy')) {
+ // cleanup output
+ $config = array(
+ 'indent' => true,
+ 'output-xhtml' => true,
+ 'wrap' => 80
+ );
+ $tidy = new Tidy;
+ $tidy->parseString($out, $config, 'utf8');
+ $tidy->cleanRepair();
+ $out = (string) $tidy;
+ }
+
+ return $out;
+ }
+
+ /**
+ * Bulk sets parameters for the XSL stylesheet
+ * @param array $options Associative array of options to set
+ */
+ public function setParameters($options)
+ {
+ foreach ($options as $name => $value) {
+ $this->xsltProcessor->setParameter('', $name, $value);
+ }
+ }
+
+ /**
+ * Forward any other calls to the XSLT processor
+ */
+ public function __call($name, $arguments)
+ {
+ call_user_func_array(array($this->xsltProcessor, $name), $arguments);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools.php b/vendor/ezyang/htmlpurifier/extras/FSTools.php
new file mode 100644
index 000000000..ce0076316
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools.php
@@ -0,0 +1,164 @@
+<?php
+
+/**
+ * Filesystem tools not provided by default; can recursively create, copy
+ * and delete folders. Some template methods are provided for extensibility.
+ *
+ * @note This class must be instantiated to be used, although it does
+ * not maintain state.
+ */
+class FSTools
+{
+
+ private static $singleton;
+
+ /**
+ * Returns a global instance of FSTools
+ */
+ public static function singleton()
+ {
+ if (empty(FSTools::$singleton)) FSTools::$singleton = new FSTools();
+ return FSTools::$singleton;
+ }
+
+ /**
+ * Sets our global singleton to something else; useful for overloading
+ * functions.
+ */
+ public static function setSingleton($singleton)
+ {
+ FSTools::$singleton = $singleton;
+ }
+
+ /**
+ * Recursively creates a directory
+ * @param string $folder Name of folder to create
+ * @note Adapted from the PHP manual comment 76612
+ */
+ public function mkdirr($folder)
+ {
+ $folders = preg_split("#[\\\\/]#", $folder);
+ $base = '';
+ for($i = 0, $c = count($folders); $i < $c; $i++) {
+ if(empty($folders[$i])) {
+ if (!$i) {
+ // special case for root level
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ continue;
+ }
+ $base .= $folders[$i];
+ if(!is_dir($base)){
+ $this->mkdir($base);
+ }
+ $base .= DIRECTORY_SEPARATOR;
+ }
+ }
+
+ /**
+ * Copy a file, or recursively copy a folder and its contents; modified
+ * so that copied files, if PHP, have includes removed
+ * @note Adapted from http://aidanlister.com/repos/v/function.copyr.php
+ */
+ public function copyr($source, $dest)
+ {
+ // Simple copy for a file
+ if (is_file($source)) {
+ return $this->copy($source, $dest);
+ }
+ // Make destination directory
+ if (!is_dir($dest)) {
+ $this->mkdir($dest);
+ }
+ // Loop through the folder
+ $dir = $this->dir($source);
+ while ( false !== ($entry = $dir->read()) ) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ if (!$this->copyable($entry)) {
+ continue;
+ }
+ // Deep copy directories
+ if ($dest !== "$source/$entry") {
+ $this->copyr("$source/$entry", "$dest/$entry");
+ }
+ }
+ // Clean up
+ $dir->close();
+ return true;
+ }
+
+ /**
+ * Overloadable function that tests a filename for copyability. By
+ * default, everything should be copied; you can restrict things to
+ * ignore hidden files, unreadable files, etc. This function
+ * applies to copyr().
+ */
+ public function copyable($file)
+ {
+ return true;
+ }
+
+ /**
+ * Delete a file, or a folder and its contents
+ * @note Adapted from http://aidanlister.com/repos/v/function.rmdirr.php
+ */
+ public function rmdirr($dirname)
+ {
+ // Sanity check
+ if (!$this->file_exists($dirname)) {
+ return false;
+ }
+
+ // Simple delete for a file
+ if ($this->is_file($dirname) || $this->is_link($dirname)) {
+ return $this->unlink($dirname);
+ }
+
+ // Loop through the folder
+ $dir = $this->dir($dirname);
+ while (false !== $entry = $dir->read()) {
+ // Skip pointers
+ if ($entry == '.' || $entry == '..') {
+ continue;
+ }
+ // Recurse
+ $this->rmdirr($dirname . DIRECTORY_SEPARATOR . $entry);
+ }
+
+ // Clean up
+ $dir->close();
+ return $this->rmdir($dirname);
+ }
+
+ /**
+ * Recursively globs a directory.
+ */
+ public function globr($dir, $pattern, $flags = NULL)
+ {
+ $files = $this->glob("$dir/$pattern", $flags);
+ if ($files === false) $files = array();
+ $sub_dirs = $this->glob("$dir/*", GLOB_ONLYDIR);
+ if ($sub_dirs === false) $sub_dirs = array();
+ foreach ($sub_dirs as $sub_dir) {
+ $sub_files = $this->globr($sub_dir, $pattern, $flags);
+ $files = array_merge($files, $sub_files);
+ }
+ return $files;
+ }
+
+ /**
+ * Allows for PHP functions to be called and be stubbed.
+ * @warning This function will not work for functions that need
+ * to pass references; manually define a stub function for those.
+ */
+ public function __call($name, $args)
+ {
+ return call_user_func_array($name, $args);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/FSTools/File.php b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
new file mode 100644
index 000000000..6453a7a45
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/FSTools/File.php
@@ -0,0 +1,141 @@
+<?php
+
+/**
+ * Represents a file in the filesystem
+ *
+ * @warning Be sure to distinguish between get() and write() versus
+ * read() and put(), the former operates on the entire file, while
+ * the latter operates on a handle.
+ */
+class FSTools_File
+{
+
+ /** Filename of file this object represents */
+ protected $name;
+
+ /** Handle for the file */
+ protected $handle = false;
+
+ /** Instance of FSTools for interfacing with filesystem */
+ protected $fs;
+
+ /**
+ * Filename of file you wish to instantiate.
+ * @note This file need not exist
+ */
+ public function __construct($name, $fs = false)
+ {
+ $this->name = $name;
+ $this->fs = $fs ? $fs : FSTools::singleton();
+ }
+
+ /** Returns the filename of the file. */
+ public function getName() {return $this->name;}
+
+ /** Returns directory of the file without trailing slash */
+ public function getDirectory() {return $this->fs->dirname($this->name);}
+
+ /**
+ * Retrieves the contents of a file
+ * @todo Throw an exception if file doesn't exist
+ */
+ public function get()
+ {
+ return $this->fs->file_get_contents($this->name);
+ }
+
+ /** Writes contents to a file, creates new file if necessary */
+ public function write($contents)
+ {
+ return $this->fs->file_put_contents($this->name, $contents);
+ }
+
+ /** Deletes the file */
+ public function delete()
+ {
+ return $this->fs->unlink($this->name);
+ }
+
+ /** Returns true if file exists and is a file. */
+ public function exists()
+ {
+ return $this->fs->is_file($this->name);
+ }
+
+ /** Returns last file modification time */
+ public function getMTime()
+ {
+ return $this->fs->filemtime($this->name);
+ }
+
+ /**
+ * Chmod a file
+ * @note We ignore errors because of some weird owner trickery due
+ * to SVN duality
+ */
+ public function chmod($octal_code)
+ {
+ return @$this->fs->chmod($this->name, $octal_code);
+ }
+
+ /** Opens file's handle */
+ public function open($mode)
+ {
+ if ($this->handle) $this->close();
+ $this->handle = $this->fs->fopen($this->name, $mode);
+ return true;
+ }
+
+ /** Closes file's handle */
+ public function close()
+ {
+ if (!$this->handle) return false;
+ $status = $this->fs->fclose($this->handle);
+ $this->handle = false;
+ return $status;
+ }
+
+ /** Retrieves a line from an open file, with optional max length $length */
+ public function getLine($length = null)
+ {
+ if (!$this->handle) $this->open('r');
+ if ($length === null) return $this->fs->fgets($this->handle);
+ else return $this->fs->fgets($this->handle, $length);
+ }
+
+ /** Retrieves a character from an open file */
+ public function getChar()
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fgetc($this->handle);
+ }
+
+ /** Retrieves an $length bytes of data from an open data */
+ public function read($length)
+ {
+ if (!$this->handle) $this->open('r');
+ return $this->fs->fread($this->handle, $length);
+ }
+
+ /** Writes to an open file */
+ public function put($string)
+ {
+ if (!$this->handle) $this->open('a');
+ return $this->fs->fwrite($this->handle, $string);
+ }
+
+ /** Returns TRUE if the end of the file has been reached */
+ public function eof()
+ {
+ if (!$this->handle) return true;
+ return $this->fs->feof($this->handle);
+ }
+
+ public function __destruct()
+ {
+ if ($this->handle) $this->close();
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
new file mode 100644
index 000000000..4016d8afd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.auto.php
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * This is a stub include that automatically configures the include path.
+ */
+
+set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path() );
+require_once 'HTMLPurifierExtras.php';
+require_once 'HTMLPurifierExtras.autoload.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
new file mode 100644
index 000000000..de4a8aaaf
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.autoload.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Convenience file that registers autoload handler for HTML Purifier.
+ *
+ * @warning
+ * This autoloader does not contain the compatibility code seen in
+ * HTMLPurifier_Bootstrap; the user is expected to make any necessary
+ * changes to use this library.
+ */
+
+if (function_exists('spl_autoload_register')) {
+ spl_autoload_register(array('HTMLPurifierExtras', 'autoload'));
+ if (function_exists('__autoload')) {
+ // Be polite and ensure that userland autoload gets retained
+ spl_autoload_register('__autoload');
+ }
+} elseif (!function_exists('__autoload')) {
+ function __autoload($class)
+ {
+ return HTMLPurifierExtras::autoload($class);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
new file mode 100644
index 000000000..35c2ca7e7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/HTMLPurifierExtras.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Meta-class for HTML Purifier's extra class hierarchies, similar to
+ * HTMLPurifier_Bootstrap.
+ */
+class HTMLPurifierExtras
+{
+
+ public static function autoload($class)
+ {
+ $path = HTMLPurifierExtras::getPath($class);
+ if (!$path) return false;
+ require $path;
+ return true;
+ }
+
+ public static function getPath($class)
+ {
+ if (
+ strncmp('FSTools', $class, 7) !== 0 &&
+ strncmp('ConfigDoc', $class, 9) !== 0
+ ) return false;
+ // Custom implementations can go here
+ // Standard implementation:
+ return str_replace('_', '/', $class) . '.php';
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/extras/README b/vendor/ezyang/htmlpurifier/extras/README
new file mode 100644
index 000000000..4bfece79e
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/extras/README
@@ -0,0 +1,32 @@
+
+HTML Purifier Extras
+ The Method Behind The Madness!
+
+The extras/ folder in HTML Purifier contains--you guessed it--extra things
+for HTML Purifier. Specifically, these are two extra libraries called
+FSTools and ConfigSchema. They're extra for a reason: you don't need them
+if you're using HTML Purifier for normal usage: filtering HTML. However,
+if you're a developer, and would like to test HTML Purifier, or need to
+use one of HTML Purifier's maintenance scripts, chances are they'll need
+these libraries. Who knows: maybe you'll find them useful too!
+
+Here are the libraries:
+
+
+FSTools
+-------
+
+Short for File System Tools, this is a poor-man's object-oriented wrapper for
+the filesystem. It currently consists of two classes:
+
+- FSTools: This is a singleton that contains a manner of useful functions
+ such as recursive glob, directory removal, etc, as well as the ability
+ to call arbitrary native PHP functions through it like $FS->fopen(...).
+ This makes it a lot simpler to mock these filesystem calls for unit testing.
+
+- FSTools_File: This object represents a single file, and has almost any
+ method imaginable one would need.
+
+Check the files themselves for more information.
+
+ vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier.auto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
index 1960c399f..1960c399f 100644
--- a/library/HTMLPurifier.auto.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php
diff --git a/library/HTMLPurifier.autoload.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
index c3ea67e81..c3ea67e81 100644
--- a/library/HTMLPurifier.autoload.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
new file mode 100644
index 000000000..52acc56b0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php
@@ -0,0 +1,4 @@
+<?php
+if (!defined('HTMLPURIFIER_PREFIX')) {
+ define('HTMLPURIFIER_PREFIX', dirname(__FILE__));
+}
diff --git a/library/HTMLPurifier.func.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
index 64b140bec..64b140bec 100644
--- a/library/HTMLPurifier.func.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
new file mode 100644
index 000000000..7779fe34d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
@@ -0,0 +1,234 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version 4.9.2
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+require 'HTMLPurifier.php';
+require 'HTMLPurifier/Arborize.php';
+require 'HTMLPurifier/AttrCollections.php';
+require 'HTMLPurifier/AttrDef.php';
+require 'HTMLPurifier/AttrTransform.php';
+require 'HTMLPurifier/AttrTypes.php';
+require 'HTMLPurifier/AttrValidator.php';
+require 'HTMLPurifier/Bootstrap.php';
+require 'HTMLPurifier/Definition.php';
+require 'HTMLPurifier/CSSDefinition.php';
+require 'HTMLPurifier/ChildDef.php';
+require 'HTMLPurifier/Config.php';
+require 'HTMLPurifier/ConfigSchema.php';
+require 'HTMLPurifier/ContentSets.php';
+require 'HTMLPurifier/Context.php';
+require 'HTMLPurifier/DefinitionCache.php';
+require 'HTMLPurifier/DefinitionCacheFactory.php';
+require 'HTMLPurifier/Doctype.php';
+require 'HTMLPurifier/DoctypeRegistry.php';
+require 'HTMLPurifier/ElementDef.php';
+require 'HTMLPurifier/Encoder.php';
+require 'HTMLPurifier/EntityLookup.php';
+require 'HTMLPurifier/EntityParser.php';
+require 'HTMLPurifier/ErrorCollector.php';
+require 'HTMLPurifier/ErrorStruct.php';
+require 'HTMLPurifier/Exception.php';
+require 'HTMLPurifier/Filter.php';
+require 'HTMLPurifier/Generator.php';
+require 'HTMLPurifier/HTMLDefinition.php';
+require 'HTMLPurifier/HTMLModule.php';
+require 'HTMLPurifier/HTMLModuleManager.php';
+require 'HTMLPurifier/IDAccumulator.php';
+require 'HTMLPurifier/Injector.php';
+require 'HTMLPurifier/Language.php';
+require 'HTMLPurifier/LanguageFactory.php';
+require 'HTMLPurifier/Length.php';
+require 'HTMLPurifier/Lexer.php';
+require 'HTMLPurifier/Node.php';
+require 'HTMLPurifier/PercentEncoder.php';
+require 'HTMLPurifier/PropertyList.php';
+require 'HTMLPurifier/PropertyListIterator.php';
+require 'HTMLPurifier/Queue.php';
+require 'HTMLPurifier/Strategy.php';
+require 'HTMLPurifier/StringHash.php';
+require 'HTMLPurifier/StringHashParser.php';
+require 'HTMLPurifier/TagTransform.php';
+require 'HTMLPurifier/Token.php';
+require 'HTMLPurifier/TokenFactory.php';
+require 'HTMLPurifier/URI.php';
+require 'HTMLPurifier/URIDefinition.php';
+require 'HTMLPurifier/URIFilter.php';
+require 'HTMLPurifier/URIParser.php';
+require 'HTMLPurifier/URIScheme.php';
+require 'HTMLPurifier/URISchemeRegistry.php';
+require 'HTMLPurifier/UnitConverter.php';
+require 'HTMLPurifier/VarParser.php';
+require 'HTMLPurifier/VarParserException.php';
+require 'HTMLPurifier/Zipper.php';
+require 'HTMLPurifier/AttrDef/CSS.php';
+require 'HTMLPurifier/AttrDef/Clone.php';
+require 'HTMLPurifier/AttrDef/Enum.php';
+require 'HTMLPurifier/AttrDef/Integer.php';
+require 'HTMLPurifier/AttrDef/Lang.php';
+require 'HTMLPurifier/AttrDef/Switch.php';
+require 'HTMLPurifier/AttrDef/Text.php';
+require 'HTMLPurifier/AttrDef/URI.php';
+require 'HTMLPurifier/AttrDef/CSS/Number.php';
+require 'HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require 'HTMLPurifier/AttrDef/CSS/Background.php';
+require 'HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require 'HTMLPurifier/AttrDef/CSS/Border.php';
+require 'HTMLPurifier/AttrDef/CSS/Color.php';
+require 'HTMLPurifier/AttrDef/CSS/Composite.php';
+require 'HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Filter.php';
+require 'HTMLPurifier/AttrDef/CSS/Font.php';
+require 'HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require 'HTMLPurifier/AttrDef/CSS/Ident.php';
+require 'HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require 'HTMLPurifier/AttrDef/CSS/Length.php';
+require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
+require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
+require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require 'HTMLPurifier/AttrDef/CSS/URI.php';
+require 'HTMLPurifier/AttrDef/HTML/Bool.php';
+require 'HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require 'HTMLPurifier/AttrDef/HTML/Class.php';
+require 'HTMLPurifier/AttrDef/HTML/Color.php';
+require 'HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require 'HTMLPurifier/AttrDef/HTML/ID.php';
+require 'HTMLPurifier/AttrDef/HTML/Pixels.php';
+require 'HTMLPurifier/AttrDef/HTML/Length.php';
+require 'HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require 'HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require 'HTMLPurifier/AttrDef/URI/Email.php';
+require 'HTMLPurifier/AttrDef/URI/Host.php';
+require 'HTMLPurifier/AttrDef/URI/IPv4.php';
+require 'HTMLPurifier/AttrDef/URI/IPv6.php';
+require 'HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require 'HTMLPurifier/AttrTransform/Background.php';
+require 'HTMLPurifier/AttrTransform/BdoDir.php';
+require 'HTMLPurifier/AttrTransform/BgColor.php';
+require 'HTMLPurifier/AttrTransform/BoolToCSS.php';
+require 'HTMLPurifier/AttrTransform/Border.php';
+require 'HTMLPurifier/AttrTransform/EnumToCSS.php';
+require 'HTMLPurifier/AttrTransform/ImgRequired.php';
+require 'HTMLPurifier/AttrTransform/ImgSpace.php';
+require 'HTMLPurifier/AttrTransform/Input.php';
+require 'HTMLPurifier/AttrTransform/Lang.php';
+require 'HTMLPurifier/AttrTransform/Length.php';
+require 'HTMLPurifier/AttrTransform/Name.php';
+require 'HTMLPurifier/AttrTransform/NameSync.php';
+require 'HTMLPurifier/AttrTransform/Nofollow.php';
+require 'HTMLPurifier/AttrTransform/SafeEmbed.php';
+require 'HTMLPurifier/AttrTransform/SafeObject.php';
+require 'HTMLPurifier/AttrTransform/SafeParam.php';
+require 'HTMLPurifier/AttrTransform/ScriptRequired.php';
+require 'HTMLPurifier/AttrTransform/TargetBlank.php';
+require 'HTMLPurifier/AttrTransform/TargetNoopener.php';
+require 'HTMLPurifier/AttrTransform/TargetNoreferrer.php';
+require 'HTMLPurifier/AttrTransform/Textarea.php';
+require 'HTMLPurifier/ChildDef/Chameleon.php';
+require 'HTMLPurifier/ChildDef/Custom.php';
+require 'HTMLPurifier/ChildDef/Empty.php';
+require 'HTMLPurifier/ChildDef/List.php';
+require 'HTMLPurifier/ChildDef/Required.php';
+require 'HTMLPurifier/ChildDef/Optional.php';
+require 'HTMLPurifier/ChildDef/StrictBlockquote.php';
+require 'HTMLPurifier/ChildDef/Table.php';
+require 'HTMLPurifier/DefinitionCache/Decorator.php';
+require 'HTMLPurifier/DefinitionCache/Null.php';
+require 'HTMLPurifier/DefinitionCache/Serializer.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require 'HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require 'HTMLPurifier/HTMLModule/Bdo.php';
+require 'HTMLPurifier/HTMLModule/CommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Edit.php';
+require 'HTMLPurifier/HTMLModule/Forms.php';
+require 'HTMLPurifier/HTMLModule/Hypertext.php';
+require 'HTMLPurifier/HTMLModule/Iframe.php';
+require 'HTMLPurifier/HTMLModule/Image.php';
+require 'HTMLPurifier/HTMLModule/Legacy.php';
+require 'HTMLPurifier/HTMLModule/List.php';
+require 'HTMLPurifier/HTMLModule/Name.php';
+require 'HTMLPurifier/HTMLModule/Nofollow.php';
+require 'HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Object.php';
+require 'HTMLPurifier/HTMLModule/Presentation.php';
+require 'HTMLPurifier/HTMLModule/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Ruby.php';
+require 'HTMLPurifier/HTMLModule/SafeEmbed.php';
+require 'HTMLPurifier/HTMLModule/SafeObject.php';
+require 'HTMLPurifier/HTMLModule/SafeScripting.php';
+require 'HTMLPurifier/HTMLModule/Scripting.php';
+require 'HTMLPurifier/HTMLModule/StyleAttribute.php';
+require 'HTMLPurifier/HTMLModule/Tables.php';
+require 'HTMLPurifier/HTMLModule/Target.php';
+require 'HTMLPurifier/HTMLModule/TargetBlank.php';
+require 'HTMLPurifier/HTMLModule/TargetNoopener.php';
+require 'HTMLPurifier/HTMLModule/TargetNoreferrer.php';
+require 'HTMLPurifier/HTMLModule/Text.php';
+require 'HTMLPurifier/HTMLModule/Tidy.php';
+require 'HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Name.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require 'HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require 'HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require 'HTMLPurifier/Injector/AutoParagraph.php';
+require 'HTMLPurifier/Injector/DisplayLinkURI.php';
+require 'HTMLPurifier/Injector/Linkify.php';
+require 'HTMLPurifier/Injector/PurifierLinkify.php';
+require 'HTMLPurifier/Injector/RemoveEmpty.php';
+require 'HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require 'HTMLPurifier/Injector/SafeObject.php';
+require 'HTMLPurifier/Lexer/DOMLex.php';
+require 'HTMLPurifier/Lexer/DirectLex.php';
+require 'HTMLPurifier/Node/Comment.php';
+require 'HTMLPurifier/Node/Element.php';
+require 'HTMLPurifier/Node/Text.php';
+require 'HTMLPurifier/Strategy/Composite.php';
+require 'HTMLPurifier/Strategy/Core.php';
+require 'HTMLPurifier/Strategy/FixNesting.php';
+require 'HTMLPurifier/Strategy/MakeWellFormed.php';
+require 'HTMLPurifier/Strategy/RemoveForeignElements.php';
+require 'HTMLPurifier/Strategy/ValidateAttributes.php';
+require 'HTMLPurifier/TagTransform/Font.php';
+require 'HTMLPurifier/TagTransform/Simple.php';
+require 'HTMLPurifier/Token/Comment.php';
+require 'HTMLPurifier/Token/Tag.php';
+require 'HTMLPurifier/Token/Empty.php';
+require 'HTMLPurifier/Token/End.php';
+require 'HTMLPurifier/Token/Start.php';
+require 'HTMLPurifier/Token/Text.php';
+require 'HTMLPurifier/URIFilter/DisableExternal.php';
+require 'HTMLPurifier/URIFilter/DisableExternalResources.php';
+require 'HTMLPurifier/URIFilter/DisableResources.php';
+require 'HTMLPurifier/URIFilter/HostBlacklist.php';
+require 'HTMLPurifier/URIFilter/MakeAbsolute.php';
+require 'HTMLPurifier/URIFilter/Munge.php';
+require 'HTMLPurifier/URIFilter/SafeIframe.php';
+require 'HTMLPurifier/URIScheme/data.php';
+require 'HTMLPurifier/URIScheme/file.php';
+require 'HTMLPurifier/URIScheme/ftp.php';
+require 'HTMLPurifier/URIScheme/http.php';
+require 'HTMLPurifier/URIScheme/https.php';
+require 'HTMLPurifier/URIScheme/mailto.php';
+require 'HTMLPurifier/URIScheme/news.php';
+require 'HTMLPurifier/URIScheme/nntp.php';
+require 'HTMLPurifier/URIScheme/tel.php';
+require 'HTMLPurifier/VarParser/Flexible.php';
+require 'HTMLPurifier/VarParser/Native.php';
diff --git a/library/HTMLPurifier.kses.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
index 752290077..752290077 100644
--- a/library/HTMLPurifier.kses.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php
diff --git a/library/HTMLPurifier.path.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
index 39b1b6531..39b1b6531 100644
--- a/library/HTMLPurifier.path.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
new file mode 100644
index 000000000..9c539e225
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
@@ -0,0 +1,292 @@
+<?php
+
+/*! @mainpage
+ *
+ * HTML Purifier is an HTML filter that will take an arbitrary snippet of
+ * HTML and rigorously test, validate and filter it into a version that
+ * is safe for output onto webpages. It achieves this by:
+ *
+ * -# Lexing (parsing into tokens) the document,
+ * -# Executing various strategies on the tokens:
+ * -# Removing all elements not in the whitelist,
+ * -# Making the tokens well-formed,
+ * -# Fixing the nesting of the nodes, and
+ * -# Validating attributes of the nodes; and
+ * -# Generating HTML from the purified tokens.
+ *
+ * However, most users will only need to interface with the HTMLPurifier
+ * and HTMLPurifier_Config.
+ */
+
+/*
+ HTML Purifier 4.9.2 - Standards Compliant HTML Filtering
+ Copyright (C) 2006-2008 Edward Z. Yang
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * Facade that coordinates HTML Purifier's subsystems in order to purify HTML.
+ *
+ * @note There are several points in which configuration can be specified
+ * for HTML Purifier. The precedence of these (from lowest to
+ * highest) is as follows:
+ * -# Instance: new HTMLPurifier($config)
+ * -# Invocation: purify($html, $config)
+ * These configurations are entirely independent of each other and
+ * are *not* merged (this behavior may change in the future).
+ *
+ * @todo We need an easier way to inject strategies using the configuration
+ * object.
+ */
+class HTMLPurifier
+{
+
+ /**
+ * Version of HTML Purifier.
+ * @type string
+ */
+ public $version = '4.9.2';
+
+ /**
+ * Constant with version of HTML Purifier.
+ */
+ const VERSION = '4.9.2';
+
+ /**
+ * Global configuration object.
+ * @type HTMLPurifier_Config
+ */
+ public $config;
+
+ /**
+ * Array of extra filter objects to run on HTML,
+ * for backwards compatibility.
+ * @type HTMLPurifier_Filter[]
+ */
+ private $filters = array();
+
+ /**
+ * Single instance of HTML Purifier.
+ * @type HTMLPurifier
+ */
+ private static $instance;
+
+ /**
+ * @type HTMLPurifier_Strategy_Core
+ */
+ protected $strategy;
+
+ /**
+ * @type HTMLPurifier_Generator
+ */
+ protected $generator;
+
+ /**
+ * Resultant context of last run purification.
+ * Is an array of contexts if the last called method was purifyArray().
+ * @type HTMLPurifier_Context
+ */
+ public $context;
+
+ /**
+ * Initializes the purifier.
+ *
+ * @param HTMLPurifier_Config|mixed $config Optional HTMLPurifier_Config object
+ * for all instances of the purifier, if omitted, a default
+ * configuration is supplied (which can be overridden on a
+ * per-use basis).
+ * The parameter can also be any type that
+ * HTMLPurifier_Config::create() supports.
+ */
+ public function __construct($config = null)
+ {
+ $this->config = HTMLPurifier_Config::create($config);
+ $this->strategy = new HTMLPurifier_Strategy_Core();
+ }
+
+ /**
+ * Adds a filter to process the output. First come first serve
+ *
+ * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object
+ */
+ public function addFilter($filter)
+ {
+ trigger_error(
+ 'HTMLPurifier->addFilter() is deprecated, use configuration directives' .
+ ' in the Filter namespace or Filter.Custom',
+ E_USER_WARNING
+ );
+ $this->filters[] = $filter;
+ }
+
+ /**
+ * Filters an HTML snippet/document to be XSS-free and standards-compliant.
+ *
+ * @param string $html String of HTML to purify
+ * @param HTMLPurifier_Config $config Config object for this operation,
+ * if omitted, defaults to the config object specified during this
+ * object's construction. The parameter can also be any type
+ * that HTMLPurifier_Config::create() supports.
+ *
+ * @return string Purified HTML
+ */
+ public function purify($html, $config = null)
+ {
+ // :TODO: make the config merge in, instead of replace
+ $config = $config ? HTMLPurifier_Config::create($config) : $this->config;
+
+ // implementation is partially environment dependant, partially
+ // configuration dependant
+ $lexer = HTMLPurifier_Lexer::create($config);
+
+ $context = new HTMLPurifier_Context();
+
+ // setup HTML generator
+ $this->generator = new HTMLPurifier_Generator($config, $context);
+ $context->register('Generator', $this->generator);
+
+ // set up global context variables
+ if ($config->get('Core.CollectErrors')) {
+ // may get moved out if other facilities use it
+ $language_factory = HTMLPurifier_LanguageFactory::instance();
+ $language = $language_factory->create($config, $context);
+ $context->register('Locale', $language);
+
+ $error_collector = new HTMLPurifier_ErrorCollector($context);
+ $context->register('ErrorCollector', $error_collector);
+ }
+
+ // setup id_accumulator context, necessary due to the fact that
+ // AttrValidator can be called from many places
+ $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context);
+ $context->register('IDAccumulator', $id_accumulator);
+
+ $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context);
+
+ // setup filters
+ $filter_flags = $config->getBatch('Filter');
+ $custom_filters = $filter_flags['Custom'];
+ unset($filter_flags['Custom']);
+ $filters = array();
+ foreach ($filter_flags as $filter => $flag) {
+ if (!$flag) {
+ continue;
+ }
+ if (strpos($filter, '.') !== false) {
+ continue;
+ }
+ $class = "HTMLPurifier_Filter_$filter";
+ $filters[] = new $class;
+ }
+ foreach ($custom_filters as $filter) {
+ // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat
+ $filters[] = $filter;
+ }
+ $filters = array_merge($filters, $this->filters);
+ // maybe prepare(), but later
+
+ for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) {
+ $html = $filters[$i]->preFilter($html, $config, $context);
+ }
+
+ // purified HTML
+ $html =
+ $this->generator->generateFromTokens(
+ // list of tokens
+ $this->strategy->execute(
+ // list of un-purified tokens
+ $lexer->tokenizeHTML(
+ // un-purified HTML
+ $html,
+ $config,
+ $context
+ ),
+ $config,
+ $context
+ )
+ );
+
+ for ($i = $filter_size - 1; $i >= 0; $i--) {
+ $html = $filters[$i]->postFilter($html, $config, $context);
+ }
+
+ $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context);
+ $this->context =& $context;
+ return $html;
+ }
+
+ /**
+ * Filters an array of HTML snippets
+ *
+ * @param string[] $array_of_html Array of html snippets
+ * @param HTMLPurifier_Config $config Optional config object for this operation.
+ * See HTMLPurifier::purify() for more details.
+ *
+ * @return string[] Array of purified HTML
+ */
+ public function purifyArray($array_of_html, $config = null)
+ {
+ $context_array = array();
+ foreach ($array_of_html as $key => $html) {
+ $array_of_html[$key] = $this->purify($html, $config);
+ $context_array[$key] = $this->context;
+ }
+ $this->context = $context_array;
+ return $array_of_html;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ */
+ public static function instance($prototype = null)
+ {
+ if (!self::$instance || $prototype) {
+ if ($prototype instanceof HTMLPurifier) {
+ self::$instance = $prototype;
+ } elseif ($prototype) {
+ self::$instance = new HTMLPurifier($prototype);
+ } else {
+ self::$instance = new HTMLPurifier();
+ }
+ }
+ return self::$instance;
+ }
+
+ /**
+ * Singleton for enforcing just one HTML Purifier in your system
+ *
+ * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype
+ * HTMLPurifier instance to overload singleton with,
+ * or HTMLPurifier_Config instance to configure the
+ * generated version with.
+ *
+ * @return HTMLPurifier
+ * @note Backwards compatibility, see instance()
+ */
+ public static function getInstance($prototype = null)
+ {
+ return HTMLPurifier::instance($prototype);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
new file mode 100644
index 000000000..a3261f8a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php
@@ -0,0 +1,228 @@
+<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+$__dir = dirname(__FILE__);
+
+require_once $__dir . '/HTMLPurifier.php';
+require_once $__dir . '/HTMLPurifier/Arborize.php';
+require_once $__dir . '/HTMLPurifier/AttrCollections.php';
+require_once $__dir . '/HTMLPurifier/AttrDef.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform.php';
+require_once $__dir . '/HTMLPurifier/AttrTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrValidator.php';
+require_once $__dir . '/HTMLPurifier/Bootstrap.php';
+require_once $__dir . '/HTMLPurifier/Definition.php';
+require_once $__dir . '/HTMLPurifier/CSSDefinition.php';
+require_once $__dir . '/HTMLPurifier/ChildDef.php';
+require_once $__dir . '/HTMLPurifier/Config.php';
+require_once $__dir . '/HTMLPurifier/ConfigSchema.php';
+require_once $__dir . '/HTMLPurifier/ContentSets.php';
+require_once $__dir . '/HTMLPurifier/Context.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCacheFactory.php';
+require_once $__dir . '/HTMLPurifier/Doctype.php';
+require_once $__dir . '/HTMLPurifier/DoctypeRegistry.php';
+require_once $__dir . '/HTMLPurifier/ElementDef.php';
+require_once $__dir . '/HTMLPurifier/Encoder.php';
+require_once $__dir . '/HTMLPurifier/EntityLookup.php';
+require_once $__dir . '/HTMLPurifier/EntityParser.php';
+require_once $__dir . '/HTMLPurifier/ErrorCollector.php';
+require_once $__dir . '/HTMLPurifier/ErrorStruct.php';
+require_once $__dir . '/HTMLPurifier/Exception.php';
+require_once $__dir . '/HTMLPurifier/Filter.php';
+require_once $__dir . '/HTMLPurifier/Generator.php';
+require_once $__dir . '/HTMLPurifier/HTMLDefinition.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule.php';
+require_once $__dir . '/HTMLPurifier/HTMLModuleManager.php';
+require_once $__dir . '/HTMLPurifier/IDAccumulator.php';
+require_once $__dir . '/HTMLPurifier/Injector.php';
+require_once $__dir . '/HTMLPurifier/Language.php';
+require_once $__dir . '/HTMLPurifier/LanguageFactory.php';
+require_once $__dir . '/HTMLPurifier/Length.php';
+require_once $__dir . '/HTMLPurifier/Lexer.php';
+require_once $__dir . '/HTMLPurifier/Node.php';
+require_once $__dir . '/HTMLPurifier/PercentEncoder.php';
+require_once $__dir . '/HTMLPurifier/PropertyList.php';
+require_once $__dir . '/HTMLPurifier/PropertyListIterator.php';
+require_once $__dir . '/HTMLPurifier/Queue.php';
+require_once $__dir . '/HTMLPurifier/Strategy.php';
+require_once $__dir . '/HTMLPurifier/StringHash.php';
+require_once $__dir . '/HTMLPurifier/StringHashParser.php';
+require_once $__dir . '/HTMLPurifier/TagTransform.php';
+require_once $__dir . '/HTMLPurifier/Token.php';
+require_once $__dir . '/HTMLPurifier/TokenFactory.php';
+require_once $__dir . '/HTMLPurifier/URI.php';
+require_once $__dir . '/HTMLPurifier/URIDefinition.php';
+require_once $__dir . '/HTMLPurifier/URIFilter.php';
+require_once $__dir . '/HTMLPurifier/URIParser.php';
+require_once $__dir . '/HTMLPurifier/URIScheme.php';
+require_once $__dir . '/HTMLPurifier/URISchemeRegistry.php';
+require_once $__dir . '/HTMLPurifier/UnitConverter.php';
+require_once $__dir . '/HTMLPurifier/VarParser.php';
+require_once $__dir . '/HTMLPurifier/VarParserException.php';
+require_once $__dir . '/HTMLPurifier/Zipper.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Clone.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Enum.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Integer.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Switch.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/Text.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Number.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/AlphaValue.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Composite.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Filter.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Font.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/FontFamily.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ident.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Nmtokens.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Class.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Color.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/FrameTarget.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/ID.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Pixels.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/LinkTypes.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/HTML/MultiLength.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Host.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv4.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/IPv6.php';
+require_once $__dir . '/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Background.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BdoDir.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BgColor.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/BoolToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Border.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/EnumToCSS.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ImgSpace.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Input.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Lang.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Length.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Name.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/NameSync.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/SafeParam.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/ScriptRequired.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoopener.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/TargetNoreferrer.php';
+require_once $__dir . '/HTMLPurifier/AttrTransform/Textarea.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Chameleon.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Custom.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Empty.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/List.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Required.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Optional.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/StrictBlockquote.php';
+require_once $__dir . '/HTMLPurifier/ChildDef/Table.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Null.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Serializer.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php';
+require_once $__dir . '/HTMLPurifier/DefinitionCache/Decorator/Memory.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Bdo.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/CommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Edit.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Forms.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Hypertext.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Iframe.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Image.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Legacy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/List.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Nofollow.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Object.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Presentation.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Ruby.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeEmbed.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/SafeScripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Scripting.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/StyleAttribute.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tables.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Target.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetBlank.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoopener.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/TargetNoreferrer.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Text.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/XMLCommonAttributes.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Name.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Proprietary.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Strict.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/Transitional.php';
+require_once $__dir . '/HTMLPurifier/HTMLModule/Tidy/XHTML.php';
+require_once $__dir . '/HTMLPurifier/Injector/AutoParagraph.php';
+require_once $__dir . '/HTMLPurifier/Injector/DisplayLinkURI.php';
+require_once $__dir . '/HTMLPurifier/Injector/Linkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/PurifierLinkify.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveEmpty.php';
+require_once $__dir . '/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php';
+require_once $__dir . '/HTMLPurifier/Injector/SafeObject.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DOMLex.php';
+require_once $__dir . '/HTMLPurifier/Lexer/DirectLex.php';
+require_once $__dir . '/HTMLPurifier/Node/Comment.php';
+require_once $__dir . '/HTMLPurifier/Node/Element.php';
+require_once $__dir . '/HTMLPurifier/Node/Text.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Composite.php';
+require_once $__dir . '/HTMLPurifier/Strategy/Core.php';
+require_once $__dir . '/HTMLPurifier/Strategy/FixNesting.php';
+require_once $__dir . '/HTMLPurifier/Strategy/MakeWellFormed.php';
+require_once $__dir . '/HTMLPurifier/Strategy/RemoveForeignElements.php';
+require_once $__dir . '/HTMLPurifier/Strategy/ValidateAttributes.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Font.php';
+require_once $__dir . '/HTMLPurifier/TagTransform/Simple.php';
+require_once $__dir . '/HTMLPurifier/Token/Comment.php';
+require_once $__dir . '/HTMLPurifier/Token/Tag.php';
+require_once $__dir . '/HTMLPurifier/Token/Empty.php';
+require_once $__dir . '/HTMLPurifier/Token/End.php';
+require_once $__dir . '/HTMLPurifier/Token/Start.php';
+require_once $__dir . '/HTMLPurifier/Token/Text.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternal.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableExternalResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/DisableResources.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/HostBlacklist.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/MakeAbsolute.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/Munge.php';
+require_once $__dir . '/HTMLPurifier/URIFilter/SafeIframe.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/data.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/file.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/ftp.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/http.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/https.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/mailto.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/news.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/nntp.php';
+require_once $__dir . '/HTMLPurifier/URIScheme/tel.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Flexible.php';
+require_once $__dir . '/HTMLPurifier/VarParser/Native.php';
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
new file mode 100644
index 000000000..d2e9d22a2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Converts a stream of HTMLPurifier_Token into an HTMLPurifier_Node,
+ * and back again.
+ *
+ * @note This transformation is not an equivalence. We mutate the input
+ * token stream to make it so; see all [MUT] markers in code.
+ */
+class HTMLPurifier_Arborize
+{
+ public static function arborize($tokens, $config, $context) {
+ $definition = $config->getHTMLDefinition();
+ $parent = new HTMLPurifier_Token_Start($definition->info_parent);
+ $stack = array($parent->toNode());
+ foreach ($tokens as $token) {
+ $token->skip = null; // [MUT]
+ $token->carryover = null; // [MUT]
+ if ($token instanceof HTMLPurifier_Token_End) {
+ $token->start = null; // [MUT]
+ $r = array_pop($stack);
+ //assert($r->name === $token->name);
+ //assert(empty($token->attr));
+ $r->endCol = $token->col;
+ $r->endLine = $token->line;
+ $r->endArmor = $token->armor;
+ continue;
+ }
+ $node = $token->toNode();
+ $stack[count($stack)-1]->children[] = $node;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $stack[] = $node;
+ }
+ }
+ //assert(count($stack) == 1);
+ return $stack[0];
+ }
+
+ public static function flatten($node, $config, $context) {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingTokens = array();
+ $tokens = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ list($start, $end) = $node->toTokenPair();
+ if ($level > 0) {
+ $tokens[] = $start;
+ }
+ if ($end !== NULL) {
+ $closingTokens[$level][] = $end;
+ }
+ if ($node instanceof HTMLPurifier_Node_Element) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->children as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingTokens[$level])) {
+ while ($token = array_pop($closingTokens[$level])) {
+ $tokens[] = $token;
+ }
+ }
+ } while ($level > 0);
+ return $tokens;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
new file mode 100644
index 000000000..c7b17cf14
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * Defines common attribute collections that modules reference
+ */
+
+class HTMLPurifier_AttrCollections
+{
+
+ /**
+ * Associative array of attribute collections, indexed by name.
+ * @type array
+ */
+ public $info = array();
+
+ /**
+ * Performs all expansions on internal data for use by other inclusions
+ * It also collects all attribute collection extensions from
+ * modules
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ * @param HTMLPurifier_HTMLModule[] $modules Hash array of HTMLPurifier_HTMLModule members
+ */
+ public function __construct($attr_types, $modules)
+ {
+ $this->doConstruct($attr_types, $modules);
+ }
+
+ public function doConstruct($attr_types, $modules)
+ {
+ // load extensions from the modules
+ foreach ($modules as $module) {
+ foreach ($module->attr_collections as $coll_i => $coll) {
+ if (!isset($this->info[$coll_i])) {
+ $this->info[$coll_i] = array();
+ }
+ foreach ($coll as $attr_i => $attr) {
+ if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) {
+ // merge in includes
+ $this->info[$coll_i][$attr_i] = array_merge(
+ $this->info[$coll_i][$attr_i],
+ $attr
+ );
+ continue;
+ }
+ $this->info[$coll_i][$attr_i] = $attr;
+ }
+ }
+ }
+ // perform internal expansions and inclusions
+ foreach ($this->info as $name => $attr) {
+ // merge attribute collections that include others
+ $this->performInclusions($this->info[$name]);
+ // replace string identifiers with actual attribute objects
+ $this->expandIdentifiers($this->info[$name], $attr_types);
+ }
+ }
+
+ /**
+ * Takes a reference to an attribute associative array and performs
+ * all inclusions specified by the zero index.
+ * @param array &$attr Reference to attribute array
+ */
+ public function performInclusions(&$attr)
+ {
+ if (!isset($attr[0])) {
+ return;
+ }
+ $merge = $attr[0];
+ $seen = array(); // recursion guard
+ // loop through all the inclusions
+ for ($i = 0; isset($merge[$i]); $i++) {
+ if (isset($seen[$merge[$i]])) {
+ continue;
+ }
+ $seen[$merge[$i]] = true;
+ // foreach attribute of the inclusion, copy it over
+ if (!isset($this->info[$merge[$i]])) {
+ continue;
+ }
+ foreach ($this->info[$merge[$i]] as $key => $value) {
+ if (isset($attr[$key])) {
+ continue;
+ } // also catches more inclusions
+ $attr[$key] = $value;
+ }
+ if (isset($this->info[$merge[$i]][0])) {
+ // recursion
+ $merge = array_merge($merge, $this->info[$merge[$i]][0]);
+ }
+ }
+ unset($attr[0]);
+ }
+
+ /**
+ * Expands all string identifiers in an attribute array by replacing
+ * them with the appropriate values inside HTMLPurifier_AttrTypes
+ * @param array &$attr Reference to attribute array
+ * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance
+ */
+ public function expandIdentifiers(&$attr, $attr_types)
+ {
+ // because foreach will process new elements we add, make sure we
+ // skip duplicates
+ $processed = array();
+
+ foreach ($attr as $def_i => $def) {
+ // skip inclusions
+ if ($def_i === 0) {
+ continue;
+ }
+
+ if (isset($processed[$def_i])) {
+ continue;
+ }
+
+ // determine whether or not attribute is required
+ if ($required = (strpos($def_i, '*') !== false)) {
+ // rename the definition
+ unset($attr[$def_i]);
+ $def_i = trim($def_i, '*');
+ $attr[$def_i] = $def;
+ }
+
+ $processed[$def_i] = true;
+
+ // if we've already got a literal object, move on
+ if (is_object($def)) {
+ // preserve previous required
+ $attr[$def_i]->required = ($required || $attr[$def_i]->required);
+ continue;
+ }
+
+ if ($def === false) {
+ unset($attr[$def_i]);
+ continue;
+ }
+
+ if ($t = $attr_types->get($def)) {
+ $attr[$def_i] = $t;
+ $attr[$def_i]->required = $required;
+ } else {
+ unset($attr[$def_i]);
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
new file mode 100644
index 000000000..739646fa7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php
@@ -0,0 +1,144 @@
+<?php
+
+/**
+ * Base class for all validating attribute definitions.
+ *
+ * This family of classes forms the core for not only HTML attribute validation,
+ * but also any sort of string that needs to be validated or cleaned (which
+ * means CSS properties and composite definitions are defined here too).
+ * Besides defining (through code) what precisely makes the string valid,
+ * subclasses are also responsible for cleaning the code if possible.
+ */
+
+abstract class HTMLPurifier_AttrDef
+{
+
+ /**
+ * Tells us whether or not an HTML attribute is minimized.
+ * Has no meaning in other contexts.
+ * @type bool
+ */
+ public $minimized = false;
+
+ /**
+ * Tells us whether or not an HTML attribute is required.
+ * Has no meaning in other contexts
+ * @type bool
+ */
+ public $required = false;
+
+ /**
+ * Validates and cleans passed string according to a definition.
+ *
+ * @param string $string String to be validated and cleaned.
+ * @param HTMLPurifier_Config $config Mandatory HTMLPurifier_Config object.
+ * @param HTMLPurifier_Context $context Mandatory HTMLPurifier_Context object.
+ */
+ abstract public function validate($string, $config, $context);
+
+ /**
+ * Convenience method that parses a string as if it were CDATA.
+ *
+ * This method process a string in the manner specified at
+ * <http://www.w3.org/TR/html4/types.html#h-6.2> by removing
+ * leading and trailing whitespace, ignoring line feeds, and replacing
+ * carriage returns and tabs with spaces. While most useful for HTML
+ * attributes specified as CDATA, it can also be applied to most CSS
+ * values.
+ *
+ * @note This method is not entirely standards compliant, as trim() removes
+ * more types of whitespace than specified in the spec. In practice,
+ * this is rarely a problem, as those extra characters usually have
+ * already been removed by HTMLPurifier_Encoder.
+ *
+ * @warning This processing is inconsistent with XML's whitespace handling
+ * as specified by section 3.3.3 and referenced XHTML 1.0 section
+ * 4.7. However, note that we are NOT necessarily
+ * parsing XML, thus, this behavior may still be correct. We
+ * assume that newlines have been normalized.
+ */
+ public function parseCDATA($string)
+ {
+ $string = trim($string);
+ $string = str_replace(array("\n", "\t", "\r"), ' ', $string);
+ return $string;
+ }
+
+ /**
+ * Factory method for creating this class from a string.
+ * @param string $string String construction info
+ * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string
+ */
+ public function make($string)
+ {
+ // default implementation, return a flyweight of this object.
+ // If $string has an effect on the returned object (i.e. you
+ // need to overload this method), it is best
+ // to clone or instantiate new copies. (Instantiation is safer.)
+ return $this;
+ }
+
+ /**
+ * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work
+ * properly. THIS IS A HACK!
+ * @param string $string a CSS colour definition
+ * @return string
+ */
+ protected function mungeRgb($string)
+ {
+ $p = '\s*(\d+(\.\d+)?([%]?))\s*';
+
+ if (preg_match('/(rgba|hsla)\(/', $string)) {
+ return preg_replace('/(rgba|hsla)\('.$p.','.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8,\11)', $string);
+ }
+
+ return preg_replace('/(rgb|hsl)\('.$p.','.$p.','.$p.'\)/', '\1(\2,\5,\8)', $string);
+ }
+
+ /**
+ * Parses a possibly escaped CSS string and returns the "pure"
+ * version of it.
+ */
+ protected function expandCSSEscape($string)
+ {
+ // flexibly parse it
+ $ret = '';
+ for ($i = 0, $c = strlen($string); $i < $c; $i++) {
+ if ($string[$i] === '\\') {
+ $i++;
+ if ($i >= $c) {
+ $ret .= '\\';
+ break;
+ }
+ if (ctype_xdigit($string[$i])) {
+ $code = $string[$i];
+ for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) {
+ if (!ctype_xdigit($string[$i])) {
+ break;
+ }
+ $code .= $string[$i];
+ }
+ // We have to be extremely careful when adding
+ // new characters, to make sure we're not breaking
+ // the encoding.
+ $char = HTMLPurifier_Encoder::unichr(hexdec($code));
+ if (HTMLPurifier_Encoder::cleanUTF8($char) === '') {
+ continue;
+ }
+ $ret .= $char;
+ if ($i < $c && trim($string[$i]) !== '') {
+ $i--;
+ }
+ continue;
+ }
+ if ($string[$i] === "\n") {
+ continue;
+ }
+ }
+ $ret .= $string[$i];
+ }
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
new file mode 100644
index 000000000..ad2cb90ad
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Validates the HTML attribute style, otherwise known as CSS.
+ * @note We don't implement the whole CSS specification, so it might be
+ * difficult to reuse this component in the context of validating
+ * actual stylesheet declarations.
+ * @note If we were really serious about validating the CSS, we would
+ * tokenize the styles and then parse the tokens. Obviously, we
+ * are not doing that. Doing that could seriously harm performance,
+ * but would make these components a lot more viable for a CSS
+ * filtering solution.
+ */
+class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @param string $css
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($css, $config, $context)
+ {
+ $css = $this->parseCDATA($css);
+
+ $definition = $config->getCSSDefinition();
+ $allow_duplicates = $config->get("CSS.AllowDuplicates");
+
+
+ // According to the CSS2.1 spec, the places where a
+ // non-delimiting semicolon can appear are in strings
+ // escape sequences. So here is some dumb hack to
+ // handle quotes.
+ $len = strlen($css);
+ $accum = "";
+ $declarations = array();
+ $quoted = false;
+ for ($i = 0; $i < $len; $i++) {
+ $c = strcspn($css, ";'\"", $i);
+ $accum .= substr($css, $i, $c);
+ $i += $c;
+ if ($i == $len) break;
+ $d = $css[$i];
+ if ($quoted) {
+ $accum .= $d;
+ if ($d == $quoted) {
+ $quoted = false;
+ }
+ } else {
+ if ($d == ";") {
+ $declarations[] = $accum;
+ $accum = "";
+ } else {
+ $accum .= $d;
+ $quoted = $d;
+ }
+ }
+ }
+ if ($accum != "") $declarations[] = $accum;
+
+ $propvalues = array();
+ $new_declarations = '';
+
+ /**
+ * Name of the current CSS property being validated.
+ */
+ $property = false;
+ $context->register('CurrentCSSProperty', $property);
+
+ foreach ($declarations as $declaration) {
+ if (!$declaration) {
+ continue;
+ }
+ if (!strpos($declaration, ':')) {
+ continue;
+ }
+ list($property, $value) = explode(':', $declaration, 2);
+ $property = trim($property);
+ $value = trim($value);
+ $ok = false;
+ do {
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ if (ctype_lower($property)) {
+ break;
+ }
+ $property = strtolower($property);
+ if (isset($definition->info[$property])) {
+ $ok = true;
+ break;
+ }
+ } while (0);
+ if (!$ok) {
+ continue;
+ }
+ // inefficient call, since the validator will do this again
+ if (strtolower(trim($value)) !== 'inherit') {
+ // inherit works for everything (but only on the base property)
+ $result = $definition->info[$property]->validate(
+ $value,
+ $config,
+ $context
+ );
+ } else {
+ $result = 'inherit';
+ }
+ if ($result === false) {
+ continue;
+ }
+ if ($allow_duplicates) {
+ $new_declarations .= "$property:$result;";
+ } else {
+ $propvalues[$property] = $result;
+ }
+ }
+
+ $context->destroy('CurrentCSSProperty');
+
+ // procedure does not write the new CSS simultaneously, so it's
+ // slightly inefficient, but it's the only way of getting rid of
+ // duplicates. Perhaps config to optimize it, but not now.
+
+ foreach ($propvalues as $prop => $value) {
+ $new_declarations .= "$prop:$value;";
+ }
+
+ return $new_declarations ? $new_declarations : false;
+
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
index af2b83dff..af2b83dff 100644
--- a/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
index 7f1ea3b0f..7f1ea3b0f 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Background.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
index 4580ef5a9..4580ef5a9 100644
--- a/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
index 16243ba1e..16243ba1e 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Border.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
new file mode 100644
index 000000000..d7287a00c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * Validates Color as defined by CSS.
+ */
+class HTMLPurifier_AttrDef_CSS_Color extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_AlphaValue
+ */
+ protected $alpha;
+
+ public function __construct()
+ {
+ $this->alpha = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ }
+
+ /**
+ * @param string $color
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($color, $config, $context)
+ {
+ static $colors = null;
+ if ($colors === null) {
+ $colors = $config->get('Core.ColorKeywords');
+ }
+
+ $color = trim($color);
+ if ($color === '') {
+ return false;
+ }
+
+ $lower = strtolower($color);
+ if (isset($colors[$lower])) {
+ return $colors[$lower];
+ }
+
+ if (preg_match('#(rgb|rgba|hsl|hsla)\(#', $color, $matches) === 1) {
+ $length = strlen($color);
+ if (strpos($color, ')') !== $length - 1) {
+ return false;
+ }
+
+ // get used function : rgb, rgba, hsl or hsla
+ $function = $matches[1];
+
+ $parameters_size = 3;
+ $alpha_channel = false;
+ if (substr($function, -1) === 'a') {
+ $parameters_size = 4;
+ $alpha_channel = true;
+ }
+
+ /*
+ * Allowed types for values :
+ * parameter_position => [type => max_value]
+ */
+ $allowed_types = array(
+ 1 => array('percentage' => 100, 'integer' => 255),
+ 2 => array('percentage' => 100, 'integer' => 255),
+ 3 => array('percentage' => 100, 'integer' => 255),
+ );
+ $allow_different_types = false;
+
+ if (strpos($function, 'hsl') !== false) {
+ $allowed_types = array(
+ 1 => array('integer' => 360),
+ 2 => array('percentage' => 100),
+ 3 => array('percentage' => 100),
+ );
+ $allow_different_types = true;
+ }
+
+ $values = trim(str_replace($function, '', $color), ' ()');
+
+ $parts = explode(',', $values);
+ if (count($parts) !== $parameters_size) {
+ return false;
+ }
+
+ $type = false;
+ $new_parts = array();
+ $i = 0;
+
+ foreach ($parts as $part) {
+ $i++;
+ $part = trim($part);
+
+ if ($part === '') {
+ return false;
+ }
+
+ // different check for alpha channel
+ if ($alpha_channel === true && $i === count($parts)) {
+ $result = $this->alpha->validate($part, $config, $context);
+
+ if ($result === false) {
+ return false;
+ }
+
+ $new_parts[] = (string)$result;
+ continue;
+ }
+
+ if (substr($part, -1) === '%') {
+ $current_type = 'percentage';
+ } else {
+ $current_type = 'integer';
+ }
+
+ if (!array_key_exists($current_type, $allowed_types[$i])) {
+ return false;
+ }
+
+ if (!$type) {
+ $type = $current_type;
+ }
+
+ if ($allow_different_types === false && $type != $current_type) {
+ return false;
+ }
+
+ $max_value = $allowed_types[$i][$current_type];
+
+ if ($current_type == 'integer') {
+ // Return value between range 0 -> $max_value
+ $new_parts[] = (int)max(min($part, $max_value), 0);
+ } elseif ($current_type == 'percentage') {
+ $new_parts[] = (float)max(min(rtrim($part, '%'), $max_value), 0) . '%';
+ }
+ }
+
+ $new_values = implode(',', $new_parts);
+
+ $color = $function . '(' . $new_values . ')';
+ } else {
+ // hexadecimal handling
+ if ($color[0] === '#') {
+ $hex = substr($color, 1);
+ } else {
+ $hex = $color;
+ $color = '#' . $color;
+ }
+ $length = strlen($hex);
+ if ($length !== 3 && $length !== 6) {
+ return false;
+ }
+ if (!ctype_xdigit($hex)) {
+ return false;
+ }
+ }
+ return $color;
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
index 9c1750554..9c1750554 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Composite.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
index 9d77cc9aa..9d77cc9aa 100644
--- a/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
index bde4c3301..bde4c3301 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Filter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
index 579b97ef1..579b97ef1 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Font.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/FontFamily.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
index 74e24c881..74e24c881 100644
--- a/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Ident.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
index 973002c17..973002c17 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Ident.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
index ffc989fe8..ffc989fe8 100644
--- a/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
index f12453a04..f12453a04 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/ListStyle.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
index e74d42654..e74d42654 100644
--- a/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
new file mode 100644
index 000000000..e707f871c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Framework class for strings that involve multiple values.
+ *
+ * Certain CSS properties such as border-width and margin allow multiple
+ * lengths to be specified. This class can take a vanilla border-width
+ * definition and multiply it, usually into a max of four.
+ *
+ * @note Even though the CSS specification isn't clear about it, inherit
+ * can only be used alone: it will never manifest as part of a multi
+ * shorthand declaration. Thus, this class does not allow inherit.
+ */
+class HTMLPurifier_AttrDef_CSS_Multiple extends HTMLPurifier_AttrDef
+{
+ /**
+ * Instance of component definition to defer validation to.
+ * @type HTMLPurifier_AttrDef
+ * @todo Make protected
+ */
+ public $single;
+
+ /**
+ * Max number of values allowed.
+ * @todo Make protected
+ */
+ public $max;
+
+ /**
+ * @param HTMLPurifier_AttrDef $single HTMLPurifier_AttrDef to multiply
+ * @param int $max Max number of values allowed (usually four)
+ */
+ public function __construct($single, $max = 4)
+ {
+ $this->single = $single;
+ $this->max = $max;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $string = $this->mungeRgb($this->parseCDATA($string));
+ if ($string === '') {
+ return false;
+ }
+ $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n
+ $length = count($parts);
+ $final = '';
+ for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) {
+ if (ctype_space($parts[$i])) {
+ continue;
+ }
+ $result = $this->single->validate($parts[$i], $config, $context);
+ if ($result !== false) {
+ $final .= $result . ' ';
+ $num++;
+ }
+ }
+ if ($final === '') {
+ return false;
+ }
+ return rtrim($final);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/CSS/Number.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
index 8edc159e7..8edc159e7 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Number.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/Percentage.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
index f0f25c50a..f0f25c50a 100644
--- a/library/HTMLPurifier/AttrDef/CSS/Percentage.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php
diff --git a/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
index 5fd4b7f7b..5fd4b7f7b 100644
--- a/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
new file mode 100644
index 000000000..6617acace
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * Validates a URI in CSS syntax, which uses url('http://example.com')
+ * @note While theoretically speaking a URI in a CSS document could
+ * be non-embedded, as of CSS2 there is no such usage so we're
+ * generalizing it. This may need to be changed in the future.
+ * @warning Since HTMLPurifier_AttrDef_CSS blindly uses semicolons as
+ * the separator, you cannot put a literal semicolon in
+ * in the URI. Try percent encoding it, in that case.
+ */
+class HTMLPurifier_AttrDef_CSS_URI extends HTMLPurifier_AttrDef_URI
+{
+
+ public function __construct()
+ {
+ parent::__construct(true); // always embedded
+ }
+
+ /**
+ * @param string $uri_string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($uri_string, $config, $context)
+ {
+ // parse the URI out of the string and then pass it onto
+ // the parent object
+
+ $uri_string = $this->parseCDATA($uri_string);
+ if (strpos($uri_string, 'url(') !== 0) {
+ return false;
+ }
+ $uri_string = substr($uri_string, 4);
+ if (strlen($uri_string) == 0) {
+ return false;
+ }
+ $new_length = strlen($uri_string) - 1;
+ if ($uri_string[$new_length] != ')') {
+ return false;
+ }
+ $uri = trim(substr($uri_string, 0, $new_length));
+
+ if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) {
+ $quote = $uri[0];
+ $new_length = strlen($uri) - 1;
+ if ($uri[$new_length] !== $quote) {
+ return false;
+ }
+ $uri = substr($uri, 1, $new_length - 1);
+ }
+
+ $uri = $this->expandCSSEscape($uri);
+
+ $result = parent::validate($uri, $config, $context);
+
+ if ($result === false) {
+ return false;
+ }
+
+ // extra sanity check; should have been done by URI
+ $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result);
+
+ // suspicious characters are ()'; we're going to percent encode
+ // them for safety.
+ $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result);
+
+ // there's an extra bug where ampersands lose their escaping on
+ // an innerHTML cycle, so a very unlucky query parameter could
+ // then change the meaning of the URL. Unfortunately, there's
+ // not much we can do about that...
+ return "url(\"$result\")";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/Clone.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
index 6698a00c0..6698a00c0 100644
--- a/library/HTMLPurifier/AttrDef/Clone.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php
diff --git a/library/HTMLPurifier/AttrDef/Enum.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
index 8abda7f6e..8abda7f6e 100644
--- a/library/HTMLPurifier/AttrDef/Enum.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
new file mode 100644
index 000000000..dea15d2cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * Validates a boolean attribute
+ */
+class HTMLPurifier_AttrDef_HTML_Bool extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * @type bool
+ */
+ protected $name;
+
+ /**
+ * @type bool
+ */
+ public $minimized = true;
+
+ /**
+ * @param bool $name
+ */
+ public function __construct($name = false)
+ {
+ $this->name = $name;
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ return $this->name;
+ }
+
+ /**
+ * @param string $string Name of attribute
+ * @return HTMLPurifier_AttrDef_HTML_Bool
+ */
+ public function make($string)
+ {
+ return new HTMLPurifier_AttrDef_HTML_Bool($string);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Class.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
index d5013488f..d5013488f 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Class.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Color.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
index 946ebb782..946ebb782 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Color.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
index d79ba12b3..d79ba12b3 100644
--- a/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
new file mode 100644
index 000000000..4ba45610f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * Validates the HTML attribute ID.
+ * @warning Even though this is the id processor, it
+ * will ignore the directive Attr:IDBlacklist, since it will only
+ * go according to the ID accumulator. Since the accumulator is
+ * automatically generated, it will have already absorbed the
+ * blacklist. If you're hacking around, make sure you use load()!
+ */
+
+class HTMLPurifier_AttrDef_HTML_ID extends HTMLPurifier_AttrDef
+{
+
+ // selector is NOT a valid thing to use for IDREFs, because IDREFs
+ // *must* target IDs that exist, whereas selector #ids do not.
+
+ /**
+ * Determines whether or not we're validating an ID in a CSS
+ * selector context.
+ * @type bool
+ */
+ protected $selector;
+
+ /**
+ * @param bool $selector
+ */
+ public function __construct($selector = false)
+ {
+ $this->selector = $selector;
+ }
+
+ /**
+ * @param string $id
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($id, $config, $context)
+ {
+ if (!$this->selector && !$config->get('Attr.EnableID')) {
+ return false;
+ }
+
+ $id = trim($id); // trim it first
+
+ if ($id === '') {
+ return false;
+ }
+
+ $prefix = $config->get('Attr.IDPrefix');
+ if ($prefix !== '') {
+ $prefix .= $config->get('Attr.IDPrefixLocal');
+ // prevent re-appending the prefix
+ if (strpos($id, $prefix) !== 0) {
+ $id = $prefix . $id;
+ }
+ } elseif ($config->get('Attr.IDPrefixLocal') !== '') {
+ trigger_error(
+ '%Attr.IDPrefixLocal cannot be used unless ' .
+ '%Attr.IDPrefix is set',
+ E_USER_WARNING
+ );
+ }
+
+ if (!$this->selector) {
+ $id_accumulator =& $context->get('IDAccumulator');
+ if (isset($id_accumulator->ids[$id])) {
+ return false;
+ }
+ }
+
+ // we purposely avoid using regex, hopefully this is faster
+
+ if ($config->get('Attr.ID.HTML5') === true) {
+ if (preg_match('/[\t\n\x0b\x0c ]/', $id)) {
+ return false;
+ }
+ } else {
+ if (ctype_alpha($id)) {
+ // OK
+ } else {
+ if (!ctype_alpha(@$id[0])) {
+ return false;
+ }
+ // primitive style of regexps, I suppose
+ $trim = trim(
+ $id,
+ 'A..Za..z0..9:-._'
+ );
+ if ($trim !== '') {
+ return false;
+ }
+ }
+ }
+
+ $regexp = $config->get('Attr.IDBlacklistRegexp');
+ if ($regexp && preg_match($regexp, $id)) {
+ return false;
+ }
+
+ if (!$this->selector) {
+ $id_accumulator->add($id);
+ }
+
+ // if no change was made to the ID, return the result
+ // else, return the new id if stripping whitespace made it
+ // valid, or return false.
+ return $id;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/HTML/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
index 1c4006fbb..1c4006fbb 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
index 63fa04c15..63fa04c15 100644
--- a/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/MultiLength.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
index bbb20f2f8..bbb20f2f8 100644
--- a/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
index f79683b4f..f79683b4f 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php
diff --git a/library/HTMLPurifier/AttrDef/HTML/Pixels.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
index a1d019e09..a1d019e09 100644
--- a/library/HTMLPurifier/AttrDef/HTML/Pixels.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php
diff --git a/library/HTMLPurifier/AttrDef/Integer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
index 400e707d2..400e707d2 100644
--- a/library/HTMLPurifier/AttrDef/Integer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php
diff --git a/library/HTMLPurifier/AttrDef/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
index 2a55cea64..2a55cea64 100644
--- a/library/HTMLPurifier/AttrDef/Lang.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php
diff --git a/library/HTMLPurifier/AttrDef/Switch.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
index c7eb3199a..c7eb3199a 100644
--- a/library/HTMLPurifier/AttrDef/Switch.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php
diff --git a/library/HTMLPurifier/AttrDef/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
index 4553a4ea9..4553a4ea9 100644
--- a/library/HTMLPurifier/AttrDef/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php
diff --git a/library/HTMLPurifier/AttrDef/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
index c1cd89772..c1cd89772 100644
--- a/library/HTMLPurifier/AttrDef/URI.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php
diff --git a/library/HTMLPurifier/AttrDef/URI/Email.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
index daf32b764..daf32b764 100644
--- a/library/HTMLPurifier/AttrDef/URI/Email.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php
diff --git a/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
index 52c0d5968..52c0d5968 100644
--- a/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
new file mode 100644
index 000000000..3b4d18674
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * Validates a host according to the IPv4, IPv6 and DNS (future) specifications.
+ */
+class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
+{
+
+ /**
+ * IPv4 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv4
+ */
+ protected $ipv4;
+
+ /**
+ * IPv6 sub-validator.
+ * @type HTMLPurifier_AttrDef_URI_IPv6
+ */
+ protected $ipv6;
+
+ public function __construct()
+ {
+ $this->ipv4 = new HTMLPurifier_AttrDef_URI_IPv4();
+ $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6();
+ }
+
+ /**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+ public function validate($string, $config, $context)
+ {
+ $length = strlen($string);
+ // empty hostname is OK; it's usually semantically equivalent:
+ // the default host as defined by a URI scheme is used:
+ //
+ // If the URI scheme defines a default for host, then that
+ // default applies when the host subcomponent is undefined
+ // or when the registered name is empty (zero length).
+ if ($string === '') {
+ return '';
+ }
+ if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') {
+ //IPv6
+ $ip = substr($string, 1, $length - 2);
+ $valid = $this->ipv6->validate($ip, $config, $context);
+ if ($valid === false) {
+ return false;
+ }
+ return '[' . $valid . ']';
+ }
+
+ // need to do checks on unusual encodings too
+ $ipv4 = $this->ipv4->validate($string, $config, $context);
+ if ($ipv4 !== false) {
+ return $ipv4;
+ }
+
+ // A regular domain name.
+
+ // This doesn't match I18N domain names, but we don't have proper IRI support,
+ // so force users to insert Punycode.
+
+ // There is not a good sense in which underscores should be
+ // allowed, since it's technically not! (And if you go as
+ // far to allow everything as specified by the DNS spec...
+ // well, that's literally everything, modulo some space limits
+ // for the components and the overall name (which, by the way,
+ // we are NOT checking!). So we (arbitrarily) decide this:
+ // let's allow underscores wherever we would have allowed
+ // hyphens, if they are enabled. This is a pretty good match
+ // for browser behavior, for example, a large number of browsers
+ // cannot handle foo_.example.com, but foo_bar.example.com is
+ // fairly well supported.
+ $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
+
+ // Based off of RFC 1738, but amended so that
+ // as per RFC 3696, the top label need only not be all numeric.
+ // The productions describing this are:
+ $a = '[a-z]'; // alpha
+ $an = '[a-z0-9]'; // alphanum
+ $and = "[a-z0-9-$underscore]"; // alphanum | "-"
+ // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ $domainlabel = "$an(?:$and*$an)?";
+ // AMENDED as per RFC 3696
+ // toplabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ // side condition: not all numeric
+ $toplabel = "$an(?:$and*$an)?";
+ // hostname = *( domainlabel "." ) toplabel [ "." ]
+ if (preg_match("/^(?:$domainlabel\.)*($toplabel)\.?$/i", $string, $matches)) {
+ if (!ctype_digit($matches[1])) {
+ return $string;
+ }
+ }
+
+ // PHP 5.3 and later support this functionality natively
+ if (function_exists('idn_to_ascii')) {
+ $string = idn_to_ascii($string);
+
+ // If we have Net_IDNA2 support, we can support IRIs by
+ // punycoding them. (This is the most portable thing to do,
+ // since otherwise we have to assume browsers support
+ } elseif ($config->get('Core.EnableIDNA')) {
+ $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
+ // we need to encode each period separately
+ $parts = explode('.', $string);
+ try {
+ $new_parts = array();
+ foreach ($parts as $part) {
+ $encodable = false;
+ for ($i = 0, $c = strlen($part); $i < $c; $i++) {
+ if (ord($part[$i]) > 0x7a) {
+ $encodable = true;
+ break;
+ }
+ }
+ if (!$encodable) {
+ $new_parts[] = $part;
+ } else {
+ $new_parts[] = $idna->encode($part);
+ }
+ }
+ $string = implode('.', $new_parts);
+ } catch (Exception $e) {
+ // XXX error reporting
+ }
+ }
+ // Try again
+ if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) {
+ return $string;
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrDef/URI/IPv4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
index 30ac16c9e..30ac16c9e 100644
--- a/library/HTMLPurifier/AttrDef/URI/IPv4.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php
diff --git a/library/HTMLPurifier/AttrDef/URI/IPv6.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
index f243793ee..f243793ee 100644
--- a/library/HTMLPurifier/AttrDef/URI/IPv6.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php
diff --git a/library/HTMLPurifier/AttrTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
index b428331f1..b428331f1 100644
--- a/library/HTMLPurifier/AttrTransform.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php
diff --git a/library/HTMLPurifier/AttrTransform/Background.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
index 2f72869a5..2f72869a5 100644
--- a/library/HTMLPurifier/AttrTransform/Background.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php
diff --git a/library/HTMLPurifier/AttrTransform/BdoDir.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
index d66c04a5b..d66c04a5b 100644
--- a/library/HTMLPurifier/AttrTransform/BdoDir.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php
diff --git a/library/HTMLPurifier/AttrTransform/BgColor.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
index 0f51fd2ce..0f51fd2ce 100644
--- a/library/HTMLPurifier/AttrTransform/BgColor.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php
diff --git a/library/HTMLPurifier/AttrTransform/BoolToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
index f25cd0195..f25cd0195 100644
--- a/library/HTMLPurifier/AttrTransform/BoolToCSS.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php
diff --git a/library/HTMLPurifier/AttrTransform/Border.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
index 057dc017f..057dc017f 100644
--- a/library/HTMLPurifier/AttrTransform/Border.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php
diff --git a/library/HTMLPurifier/AttrTransform/EnumToCSS.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
index 7ccd0e3fb..7ccd0e3fb 100644
--- a/library/HTMLPurifier/AttrTransform/EnumToCSS.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
new file mode 100644
index 000000000..235ebb34b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php
@@ -0,0 +1,47 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Transform that supplies default values for the src and alt attributes
+ * in img tags, as well as prevents the img tag from being removed
+ * because of a missing alt tag. This needs to be registered as both
+ * a pre and post attribute transform.
+ */
+class HTMLPurifier_AttrTransform_ImgRequired extends HTMLPurifier_AttrTransform
+{
+
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ $src = true;
+ if (!isset($attr['src'])) {
+ if ($config->get('Core.RemoveInvalidImg')) {
+ return $attr;
+ }
+ $attr['src'] = $config->get('Attr.DefaultInvalidImage');
+ $src = false;
+ }
+
+ if (!isset($attr['alt'])) {
+ if ($src) {
+ $alt = $config->get('Attr.DefaultImageAlt');
+ if ($alt === null) {
+ $attr['alt'] = basename($attr['src']);
+ } else {
+ $attr['alt'] = $alt;
+ }
+ } else {
+ $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt');
+ }
+ }
+ return $attr;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/AttrTransform/ImgSpace.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
index 350b3358f..350b3358f 100644
--- a/library/HTMLPurifier/AttrTransform/ImgSpace.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php
diff --git a/library/HTMLPurifier/AttrTransform/Input.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
index 3ab47ed8c..3ab47ed8c 100644
--- a/library/HTMLPurifier/AttrTransform/Input.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php
diff --git a/library/HTMLPurifier/AttrTransform/Lang.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
index 5b0aff0e4..5b0aff0e4 100644
--- a/library/HTMLPurifier/AttrTransform/Lang.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php
diff --git a/library/HTMLPurifier/AttrTransform/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
index 853f33549..853f33549 100644
--- a/library/HTMLPurifier/AttrTransform/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php
diff --git a/library/HTMLPurifier/AttrTransform/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
index 63cce6837..63cce6837 100644
--- a/library/HTMLPurifier/AttrTransform/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php
diff --git a/library/HTMLPurifier/AttrTransform/NameSync.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
index 36079b786..36079b786 100644
--- a/library/HTMLPurifier/AttrTransform/NameSync.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php
diff --git a/library/HTMLPurifier/AttrTransform/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
index 1057ebee1..1057ebee1 100644
--- a/library/HTMLPurifier/AttrTransform/Nofollow.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
index 231c81a3f..231c81a3f 100644
--- a/library/HTMLPurifier/AttrTransform/SafeEmbed.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
index d1f3a4d2e..d1f3a4d2e 100644
--- a/library/HTMLPurifier/AttrTransform/SafeObject.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php
diff --git a/library/HTMLPurifier/AttrTransform/SafeParam.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
index 1143b4b49..1143b4b49 100644
--- a/library/HTMLPurifier/AttrTransform/SafeParam.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php
diff --git a/library/HTMLPurifier/AttrTransform/ScriptRequired.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
index b7057bbf8..b7057bbf8 100644
--- a/library/HTMLPurifier/AttrTransform/ScriptRequired.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php
diff --git a/library/HTMLPurifier/AttrTransform/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
index dd63ea89c..dd63ea89c 100644
--- a/library/HTMLPurifier/AttrTransform/TargetBlank.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php
new file mode 100644
index 000000000..1db3c6c09
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php
@@ -0,0 +1,37 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds rel="noopener" to any links which target a different window
+ * than the current one. This is used to prevent malicious websites
+ * from silently replacing the original window, which could be used
+ * to do phishing.
+ * This transform is controlled by %HTML.TargetNoopener.
+ */
+class HTMLPurifier_AttrTransform_TargetNoopener extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (isset($attr['rel'])) {
+ $rels = explode(' ', $attr['rel']);
+ } else {
+ $rels = array();
+ }
+ if (isset($attr['target']) && !in_array('noopener', $rels)) {
+ $rels[] = 'noopener';
+ }
+ if (!empty($rels) || isset($attr['rel'])) {
+ $attr['rel'] = implode(' ', $rels);
+ }
+
+ return $attr;
+ }
+}
+
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php
new file mode 100644
index 000000000..587dc2e07
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php
@@ -0,0 +1,37 @@
+<?php
+
+// must be called POST validation
+
+/**
+ * Adds rel="noreferrer" to any links which target a different window
+ * than the current one. This is used to prevent malicious websites
+ * from silently replacing the original window, which could be used
+ * to do phishing.
+ * This transform is controlled by %HTML.TargetNoreferrer.
+ */
+class HTMLPurifier_AttrTransform_TargetNoreferrer extends HTMLPurifier_AttrTransform
+{
+ /**
+ * @param array $attr
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function transform($attr, $config, $context)
+ {
+ if (isset($attr['rel'])) {
+ $rels = explode(' ', $attr['rel']);
+ } else {
+ $rels = array();
+ }
+ if (isset($attr['target']) && !in_array('noreferrer', $rels)) {
+ $rels[] = 'noreferrer';
+ }
+ if (!empty($rels) || isset($attr['rel'])) {
+ $attr['rel'] = implode(' ', $rels);
+ }
+
+ return $attr;
+ }
+}
+
diff --git a/library/HTMLPurifier/AttrTransform/Textarea.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
index 6a9f33a0c..6a9f33a0c 100644
--- a/library/HTMLPurifier/AttrTransform/Textarea.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php
diff --git a/library/HTMLPurifier/AttrTypes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
index 3b70520b6..3b70520b6 100644
--- a/library/HTMLPurifier/AttrTypes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php
diff --git a/library/HTMLPurifier/AttrValidator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
index f97dc93ed..f97dc93ed 100644
--- a/library/HTMLPurifier/AttrValidator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php
diff --git a/library/HTMLPurifier/Bootstrap.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
index 707122bb2..707122bb2 100644
--- a/library/HTMLPurifier/Bootstrap.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
new file mode 100644
index 000000000..47dfd1f66
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php
@@ -0,0 +1,491 @@
+<?php
+
+/**
+ * Defines allowed CSS attributes and what their values are.
+ * @see HTMLPurifier_HTMLDefinition
+ */
+class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
+{
+
+ public $type = 'CSS';
+
+ /**
+ * Assoc array of attribute name to definition object.
+ * @type HTMLPurifier_AttrDef[]
+ */
+ public $info = array();
+
+ /**
+ * Constructs the info array. The meat of this class.
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetup($config)
+ {
+ $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
+ array('left', 'right', 'center', 'justify'),
+ false
+ );
+
+ $border_style =
+ $this->info['border-bottom-style'] =
+ $this->info['border-right-style'] =
+ $this->info['border-left-style'] =
+ $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'none',
+ 'hidden',
+ 'dotted',
+ 'dashed',
+ 'solid',
+ 'double',
+ 'groove',
+ 'ridge',
+ 'inset',
+ 'outset'
+ ),
+ false
+ );
+
+ $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
+
+ $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right', 'both'),
+ false
+ );
+ $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
+ array('none', 'left', 'right'),
+ false
+ );
+ $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'italic', 'oblique'),
+ false
+ );
+ $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
+ array('normal', 'small-caps'),
+ false
+ );
+
+ $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('none')),
+ new HTMLPurifier_AttrDef_CSS_URI()
+ )
+ );
+
+ $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
+ array('inside', 'outside'),
+ false
+ );
+ $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'disc',
+ 'circle',
+ 'square',
+ 'decimal',
+ 'lower-roman',
+ 'upper-roman',
+ 'lower-alpha',
+ 'upper-alpha',
+ 'none'
+ ),
+ false
+ );
+ $this->info['list-style-image'] = $uri_or_none;
+
+ $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
+
+ $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
+ array('capitalize', 'uppercase', 'lowercase', 'none'),
+ false
+ );
+ $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ $this->info['background-image'] = $uri_or_none;
+ $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
+ array('repeat', 'repeat-x', 'repeat-y', 'no-repeat')
+ );
+ $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
+ array('scroll', 'fixed')
+ );
+ $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
+
+ $border_color =
+ $this->info['border-top-color'] =
+ $this->info['border-bottom-color'] =
+ $this->info['border-left-color'] =
+ $this->info['border-right-color'] =
+ $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('transparent')),
+ new HTMLPurifier_AttrDef_CSS_Color()
+ )
+ );
+
+ $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
+
+ $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color);
+
+ $border_width =
+ $this->info['border-top-width'] =
+ $this->info['border-bottom-width'] =
+ $this->info['border-left-width'] =
+ $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')),
+ new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
+ )
+ );
+
+ $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
+
+ $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'xx-small',
+ 'x-small',
+ 'small',
+ 'medium',
+ 'large',
+ 'x-large',
+ 'xx-large',
+ 'larger',
+ 'smaller'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_CSS_Length()
+ )
+ );
+
+ $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(array('normal')),
+ new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $margin =
+ $this->info['margin-top'] =
+ $this->info['margin-bottom'] =
+ $this->info['margin-left'] =
+ $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+
+ $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
+
+ // non-negative
+ $padding =
+ $this->info['padding-top'] =
+ $this->info['padding-bottom'] =
+ $this->info['padding-left'] =
+ $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true)
+ )
+ );
+
+ $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
+
+ $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0'),
+ new HTMLPurifier_AttrDef_CSS_Percentage(true),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ );
+ $max = $config->get('CSS.MaxImgLength');
+
+ $this->info['min-width'] =
+ $this->info['max-width'] =
+ $this->info['min-height'] =
+ $this->info['max-height'] =
+ $this->info['width'] =
+ $this->info['height'] =
+ $max === null ?
+ $trusted_wh :
+ new HTMLPurifier_AttrDef_Switch(
+ 'img',
+ // For img tags:
+ new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length('0', $max),
+ new HTMLPurifier_AttrDef_Enum(array('auto'))
+ )
+ ),
+ // For everyone else:
+ $trusted_wh
+ );
+
+ $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
+
+ $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
+
+ // this could use specialized code
+ $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'normal',
+ 'bold',
+ 'bolder',
+ 'lighter',
+ '100',
+ '200',
+ '300',
+ '400',
+ '500',
+ '600',
+ '700',
+ '800',
+ '900'
+ ),
+ false
+ );
+
+ // MUST be called after other font properties, as it references
+ // a CSSDefinition object
+ $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config);
+
+ // same here
+ $this->info['border'] =
+ $this->info['border-bottom'] =
+ $this->info['border-top'] =
+ $this->info['border-left'] =
+ $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
+
+ $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
+ array('collapse', 'separate')
+ );
+
+ $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
+ array('top', 'bottom')
+ );
+
+ $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
+ array('auto', 'fixed')
+ );
+
+ $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'baseline',
+ 'sub',
+ 'super',
+ 'top',
+ 'text-top',
+ 'middle',
+ 'bottom',
+ 'text-bottom'
+ )
+ ),
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage()
+ )
+ );
+
+ $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
+
+ // These CSS properties don't work on many browsers, but we live
+ // in THE FUTURE!
+ $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
+ array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line')
+ );
+
+ if ($config->get('CSS.Proprietary')) {
+ $this->doSetupProprietary($config);
+ }
+
+ if ($config->get('CSS.AllowTricky')) {
+ $this->doSetupTricky($config);
+ }
+
+ if ($config->get('CSS.Trusted')) {
+ $this->doSetupTrusted($config);
+ }
+
+ $allow_important = $config->get('CSS.AllowImportant');
+ // wrap all attr-defs with decorator that handles !important
+ foreach ($this->info as $k => $v) {
+ $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important);
+ }
+
+ $this->setupConfigStuff($config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupProprietary($config)
+ {
+ // Internet Explorer only scrollbar colors
+ $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+ $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
+
+ // vendor specific prefixes of opacity
+ $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+
+ // only opacity, for now
+ $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
+
+ // more CSS3
+ $this->info['page-break-after'] =
+ $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'auto',
+ 'always',
+ 'avoid',
+ 'left',
+ 'right'
+ )
+ );
+ $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
+
+ $border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
+ new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
+ ));
+
+ $this->info['border-top-left-radius'] =
+ $this->info['border-top-right-radius'] =
+ $this->info['border-bottom-right-radius'] =
+ $this->info['border-bottom-left-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 2);
+ // TODO: support SLASH syntax
+ $this->info['border-radius'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_radius, 4);
+
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTricky($config)
+ {
+ $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'inline',
+ 'block',
+ 'list-item',
+ 'run-in',
+ 'compact',
+ 'marker',
+ 'table',
+ 'inline-block',
+ 'inline-table',
+ 'table-row-group',
+ 'table-header-group',
+ 'table-footer-group',
+ 'table-row',
+ 'table-column-group',
+ 'table-column',
+ 'table-cell',
+ 'table-caption',
+ 'none'
+ )
+ );
+ $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
+ array('visible', 'hidden', 'collapse')
+ );
+ $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll'));
+ $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ protected function doSetupTrusted($config)
+ {
+ $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
+ array('static', 'relative', 'absolute', 'fixed')
+ );
+ $this->info['top'] =
+ $this->info['left'] =
+ $this->info['right'] =
+ $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_CSS_Length(),
+ new HTMLPurifier_AttrDef_CSS_Percentage(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
+ array(
+ new HTMLPurifier_AttrDef_Integer(),
+ new HTMLPurifier_AttrDef_Enum(array('auto')),
+ )
+ );
+ }
+
+ /**
+ * Performs extra config-based processing. Based off of
+ * HTMLPurifier_HTMLDefinition.
+ * @param HTMLPurifier_Config $config
+ * @todo Refactor duplicate elements into common class (probably using
+ * composition, not inheritance).
+ */
+ protected function setupConfigStuff($config)
+ {
+ // setup allowed elements
+ $support = "(for information on implementing this, see the " .
+ "support forums) ";
+ $allowed_properties = $config->get('CSS.AllowedProperties');
+ if ($allowed_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (!isset($allowed_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ unset($allowed_properties[$name]);
+ }
+ // emit errors
+ foreach ($allowed_properties as $name => $d) {
+ // :TODO: Is this htmlspecialchars() call really necessary?
+ $name = htmlspecialchars($name);
+ trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING);
+ }
+ }
+
+ $forbidden_properties = $config->get('CSS.ForbiddenProperties');
+ if ($forbidden_properties !== null) {
+ foreach ($this->info as $name => $d) {
+ if (isset($forbidden_properties[$name])) {
+ unset($this->info[$name]);
+ }
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
index 8eb17b82e..8eb17b82e 100644
--- a/library/HTMLPurifier/ChildDef.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php
diff --git a/library/HTMLPurifier/ChildDef/Chameleon.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
index 7439be26b..7439be26b 100644
--- a/library/HTMLPurifier/ChildDef/Chameleon.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php
diff --git a/library/HTMLPurifier/ChildDef/Custom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
index 128132e96..128132e96 100644
--- a/library/HTMLPurifier/ChildDef/Custom.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php
diff --git a/library/HTMLPurifier/ChildDef/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
index a8a6cbdd2..a8a6cbdd2 100644
--- a/library/HTMLPurifier/ChildDef/Empty.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
new file mode 100644
index 000000000..5a53a4b49
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * Definition for list containers ul and ol.
+ *
+ * What does this do? The big thing is to handle ol/ul at the top
+ * level of list nodes, which should be handled specially by /folding/
+ * them into the previous list node. We generally shouldn't ever
+ * see other disallowed elements, because the autoclose behavior
+ * in MakeWellFormed handles it.
+ */
+class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type string
+ */
+ public $type = 'list';
+ /**
+ * @type array
+ */
+ // lying a little bit, so that we can handle ul and ol ourselves
+ // XXX: This whole business with 'wrap' is all a bit unsatisfactory
+ public $elements = array('li' => true, 'ul' => true, 'ol' => true);
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ // Flag for subclasses
+ $this->whitespace = false;
+
+ // if there are no tokens, delete parent node
+ if (empty($children)) {
+ return false;
+ }
+
+ // if li is not allowed, delete parent node
+ if (!isset($config->getHTMLDefinition()->info['li'])) {
+ trigger_error("Cannot allow ul/ol without allowing li", E_USER_WARNING);
+ return false;
+ }
+
+ // the new set of children
+ $result = array();
+
+ // a little sanity check to make sure it's not ALL whitespace
+ $all_whitespace = true;
+
+ $current_li = false;
+
+ foreach ($children as $node) {
+ if (!empty($node->is_whitespace)) {
+ $result[] = $node;
+ continue;
+ }
+ $all_whitespace = false; // phew, we're not talking about whitespace
+
+ if ($node->name === 'li') {
+ // good
+ $current_li = $node;
+ $result[] = $node;
+ } else {
+ // we want to tuck this into the previous li
+ // Invariant: we expect the node to be ol/ul
+ // ToDo: Make this more robust in the case of not ol/ul
+ // by distinguishing between existing li and li created
+ // to handle non-list elements; non-list elements should
+ // not be appended to an existing li; only li created
+ // for non-list. This distinction is not currently made.
+ if ($current_li === false) {
+ $current_li = new HTMLPurifier_Node_Element('li');
+ $result[] = $current_li;
+ }
+ $current_li->children[] = $node;
+ $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo
+ }
+ }
+ if (empty($result)) {
+ return false;
+ }
+ if ($all_whitespace) {
+ return false;
+ }
+ return $result;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ChildDef/Optional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
index b9468063b..b9468063b 100644
--- a/library/HTMLPurifier/ChildDef/Optional.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php
diff --git a/library/HTMLPurifier/ChildDef/Required.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
index 0d1c8f5f3..0d1c8f5f3 100644
--- a/library/HTMLPurifier/ChildDef/Required.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php
diff --git a/library/HTMLPurifier/ChildDef/StrictBlockquote.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
index 3270a46e1..3270a46e1 100644
--- a/library/HTMLPurifier/ChildDef/StrictBlockquote.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
new file mode 100644
index 000000000..cb6b3e6cd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php
@@ -0,0 +1,224 @@
+<?php
+
+/**
+ * Definition for tables. The general idea is to extract out all of the
+ * essential bits, and then reconstruct it later.
+ *
+ * This is a bit confusing, because the DTDs and the W3C
+ * validators seem to disagree on the appropriate definition. The
+ * DTD claims:
+ *
+ * (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)
+ *
+ * But actually, the HTML4 spec then has this to say:
+ *
+ * The TBODY start tag is always required except when the table
+ * contains only one table body and no table head or foot sections.
+ * The TBODY end tag may always be safely omitted.
+ *
+ * So the DTD is kind of wrong. The validator is, unfortunately, kind
+ * of on crack.
+ *
+ * The definition changed again in XHTML1.1; and in my opinion, this
+ * formulation makes the most sense.
+ *
+ * caption?, ( col* | colgroup* ), (( thead?, tfoot?, tbody+ ) | ( tr+ ))
+ *
+ * Essentially, we have two modes: thead/tfoot/tbody mode, and tr mode.
+ * If we encounter a thead, tfoot or tbody, we are placed in the former
+ * mode, and we *must* wrap any stray tr segments with a tbody. But if
+ * we don't run into any of them, just have tr tags is OK.
+ */
+class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
+{
+ /**
+ * @type bool
+ */
+ public $allow_empty = false;
+
+ /**
+ * @type string
+ */
+ public $type = 'table';
+
+ /**
+ * @type array
+ */
+ public $elements = array(
+ 'tr' => true,
+ 'tbody' => true,
+ 'thead' => true,
+ 'tfoot' => true,
+ 'caption' => true,
+ 'colgroup' => true,
+ 'col' => true
+ );
+
+ public function __construct()
+ {
+ }
+
+ /**
+ * @param array $children
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array
+ */
+ public function validateChildren($children, $config, $context)
+ {
+ if (empty($children)) {
+ return false;
+ }
+
+ // only one of these elements is allowed in a table
+ $caption = false;
+ $thead = false;
+ $tfoot = false;
+
+ // whitespace
+ $initial_ws = array();
+ $after_caption_ws = array();
+ $after_thead_ws = array();
+ $after_tfoot_ws = array();
+
+ // as many of these as you want
+ $cols = array();
+ $content = array();
+
+ $tbody_mode = false; // if true, then we need to wrap any stray
+ // <tr>s with a <tbody>.
+
+ $ws_accum =& $initial_ws;
+
+ foreach ($children as $node) {
+ if ($node instanceof HTMLPurifier_Node_Comment) {
+ $ws_accum[] = $node;
+ continue;
+ }
+ switch ($node->name) {
+ case 'tbody':
+ $tbody_mode = true;
+ // fall through
+ case 'tr':
+ $content[] = $node;
+ $ws_accum =& $content;
+ break;
+ case 'caption':
+ // there can only be one caption!
+ if ($caption !== false) break;
+ $caption = $node;
+ $ws_accum =& $after_caption_ws;
+ break;
+ case 'thead':
+ $tbody_mode = true;
+ // XXX This breaks rendering properties with
+ // Firefox, which never floats a <thead> to
+ // the top. Ever. (Our scheme will float the
+ // first <thead> to the top.) So maybe
+ // <thead>s that are not first should be
+ // turned into <tbody>? Very tricky, indeed.
+ if ($thead === false) {
+ $thead = $node;
+ $ws_accum =& $after_thead_ws;
+ } else {
+ // Oops, there's a second one! What
+ // should we do? Current behavior is to
+ // transmutate the first and last entries into
+ // tbody tags, and then put into content.
+ // Maybe a better idea is to *attach
+ // it* to the existing thead or tfoot?
+ // We don't do this, because Firefox
+ // doesn't float an extra tfoot to the
+ // bottom like it does for the first one.
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'tfoot':
+ // see above for some aveats
+ $tbody_mode = true;
+ if ($tfoot === false) {
+ $tfoot = $node;
+ $ws_accum =& $after_tfoot_ws;
+ } else {
+ $node->name = 'tbody';
+ $content[] = $node;
+ $ws_accum =& $content;
+ }
+ break;
+ case 'colgroup':
+ case 'col':
+ $cols[] = $node;
+ $ws_accum =& $cols;
+ break;
+ case '#PCDATA':
+ // How is whitespace handled? We treat is as sticky to
+ // the *end* of the previous element. So all of the
+ // nonsense we have worked on is to keep things
+ // together.
+ if (!empty($node->is_whitespace)) {
+ $ws_accum[] = $node;
+ }
+ break;
+ }
+ }
+
+ if (empty($content)) {
+ return false;
+ }
+
+ $ret = $initial_ws;
+ if ($caption !== false) {
+ $ret[] = $caption;
+ $ret = array_merge($ret, $after_caption_ws);
+ }
+ if ($cols !== false) {
+ $ret = array_merge($ret, $cols);
+ }
+ if ($thead !== false) {
+ $ret[] = $thead;
+ $ret = array_merge($ret, $after_thead_ws);
+ }
+ if ($tfoot !== false) {
+ $ret[] = $tfoot;
+ $ret = array_merge($ret, $after_tfoot_ws);
+ }
+
+ if ($tbody_mode) {
+ // we have to shuffle tr into tbody
+ $current_tr_tbody = null;
+
+ foreach($content as $node) {
+ switch ($node->name) {
+ case 'tbody':
+ $current_tr_tbody = null;
+ $ret[] = $node;
+ break;
+ case 'tr':
+ if ($current_tr_tbody === null) {
+ $current_tr_tbody = new HTMLPurifier_Node_Element('tbody');
+ $ret[] = $current_tr_tbody;
+ }
+ $current_tr_tbody->children[] = $node;
+ break;
+ case '#PCDATA':
+ //assert($node->is_whitespace);
+ if ($current_tr_tbody === null) {
+ $ret[] = $node;
+ } else {
+ $current_tr_tbody->children[] = $node;
+ }
+ break;
+ }
+ }
+ } else {
+ $ret = array_merge($ret, $content);
+ }
+
+ return $ret;
+
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
new file mode 100644
index 000000000..69e6d2765
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
@@ -0,0 +1,920 @@
+<?php
+
+/**
+ * Configuration object that triggers customizable behavior.
+ *
+ * @warning This class is strongly defined: that means that the class
+ * will fail if an undefined directive is retrieved or set.
+ *
+ * @note Many classes that could (although many times don't) use the
+ * configuration object make it a mandatory parameter. This is
+ * because a configuration object should always be forwarded,
+ * otherwise, you run the risk of missing a parameter and then
+ * being stumped when a configuration directive doesn't work.
+ *
+ * @todo Reconsider some of the public member variables
+ */
+class HTMLPurifier_Config
+{
+
+ /**
+ * HTML Purifier's version
+ * @type string
+ */
+ public $version = '4.9.2';
+
+ /**
+ * Whether or not to automatically finalize
+ * the object if a read operation is done.
+ * @type bool
+ */
+ public $autoFinalize = true;
+
+ // protected member variables
+
+ /**
+ * Namespace indexed array of serials for specific namespaces.
+ * @see getSerial() for more info.
+ * @type string[]
+ */
+ protected $serials = array();
+
+ /**
+ * Serial for entire configuration object.
+ * @type string
+ */
+ protected $serial;
+
+ /**
+ * Parser for variables.
+ * @type HTMLPurifier_VarParser_Flexible
+ */
+ protected $parser = null;
+
+ /**
+ * Reference HTMLPurifier_ConfigSchema for value checking.
+ * @type HTMLPurifier_ConfigSchema
+ * @note This is public for introspective purposes. Please don't
+ * abuse!
+ */
+ public $def;
+
+ /**
+ * Indexed array of definitions.
+ * @type HTMLPurifier_Definition[]
+ */
+ protected $definitions;
+
+ /**
+ * Whether or not config is finalized.
+ * @type bool
+ */
+ protected $finalized = false;
+
+ /**
+ * Property list containing configuration directives.
+ * @type array
+ */
+ protected $plist;
+
+ /**
+ * Whether or not a set is taking place due to an alias lookup.
+ * @type bool
+ */
+ private $aliasMode;
+
+ /**
+ * Set to false if you do not want line and file numbers in errors.
+ * (useful when unit testing). This will also compress some errors
+ * and exceptions.
+ * @type bool
+ */
+ public $chatty = true;
+
+ /**
+ * Current lock; only gets to this namespace are allowed.
+ * @type string
+ */
+ private $lock;
+
+ /**
+ * Constructor
+ * @param HTMLPurifier_ConfigSchema $definition ConfigSchema that defines
+ * what directives are allowed.
+ * @param HTMLPurifier_PropertyList $parent
+ */
+ public function __construct($definition, $parent = null)
+ {
+ $parent = $parent ? $parent : $definition->defaultPlist;
+ $this->plist = new HTMLPurifier_PropertyList($parent);
+ $this->def = $definition; // keep a copy around for checking
+ $this->parser = new HTMLPurifier_VarParser_Flexible();
+ }
+
+ /**
+ * Convenience constructor that creates a config object based on a mixed var
+ * @param mixed $config Variable that defines the state of the config
+ * object. Can be: a HTMLPurifier_Config() object,
+ * an array of directives based on loadArray(),
+ * or a string filename of an ini file.
+ * @param HTMLPurifier_ConfigSchema $schema Schema object
+ * @return HTMLPurifier_Config Configured object
+ */
+ public static function create($config, $schema = null)
+ {
+ if ($config instanceof HTMLPurifier_Config) {
+ // pass-through
+ return $config;
+ }
+ if (!$schema) {
+ $ret = HTMLPurifier_Config::createDefault();
+ } else {
+ $ret = new HTMLPurifier_Config($schema);
+ }
+ if (is_string($config)) {
+ $ret->loadIni($config);
+ } elseif (is_array($config)) $ret->loadArray($config);
+ return $ret;
+ }
+
+ /**
+ * Creates a new config object that inherits from a previous one.
+ * @param HTMLPurifier_Config $config Configuration object to inherit from.
+ * @return HTMLPurifier_Config object with $config as its parent.
+ */
+ public static function inherit(HTMLPurifier_Config $config)
+ {
+ return new HTMLPurifier_Config($config->def, $config->plist);
+ }
+
+ /**
+ * Convenience constructor that creates a default configuration object.
+ * @return HTMLPurifier_Config default object.
+ */
+ public static function createDefault()
+ {
+ $definition = HTMLPurifier_ConfigSchema::instance();
+ $config = new HTMLPurifier_Config($definition);
+ return $config;
+ }
+
+ /**
+ * Retrieves a value from the configuration.
+ *
+ * @param string $key String key
+ * @param mixed $a
+ *
+ * @return mixed
+ */
+ public function get($key, $a = null)
+ {
+ if ($a !== null) {
+ $this->triggerError(
+ "Using deprecated API: use \$config->get('$key.$a') instead",
+ E_USER_WARNING
+ );
+ $key = "$key.$a";
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ if (!isset($this->def->info[$key])) {
+ // can't add % due to SimpleTest bug
+ $this->triggerError(
+ 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (isset($this->def->info[$key]->isAlias)) {
+ $d = $this->def->info[$key];
+ $this->triggerError(
+ 'Cannot get value from aliased directive, use real name ' . $d->key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ if ($this->lock) {
+ list($ns) = explode('.', $key);
+ if ($ns !== $this->lock) {
+ $this->triggerError(
+ 'Cannot get value of namespace ' . $ns . ' when lock for ' .
+ $this->lock .
+ ' is active, this probably indicates a Definition setup method ' .
+ 'is accessing directives that are not within its namespace',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ return $this->plist->get($key);
+ }
+
+ /**
+ * Retrieves an array of directives to values from a given namespace
+ *
+ * @param string $namespace String namespace
+ *
+ * @return array
+ */
+ public function getBatch($namespace)
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $full = $this->getAll();
+ if (!isset($full[$namespace])) {
+ $this->triggerError(
+ 'Cannot retrieve undefined namespace ' .
+ htmlspecialchars($namespace),
+ E_USER_WARNING
+ );
+ return;
+ }
+ return $full[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature of a segment of the configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @param string $namespace Namespace to get serial for
+ *
+ * @return string
+ * @note Revision is handled specially and is removed from the batch
+ * before processing!
+ */
+ public function getBatchSerial($namespace)
+ {
+ if (empty($this->serials[$namespace])) {
+ $batch = $this->getBatch($namespace);
+ unset($batch['DefinitionRev']);
+ $this->serials[$namespace] = sha1(serialize($batch));
+ }
+ return $this->serials[$namespace];
+ }
+
+ /**
+ * Returns a SHA-1 signature for the entire configuration object
+ * that uniquely identifies that particular configuration
+ *
+ * @return string
+ */
+ public function getSerial()
+ {
+ if (empty($this->serial)) {
+ $this->serial = sha1(serialize($this->getAll()));
+ }
+ return $this->serial;
+ }
+
+ /**
+ * Retrieves all directives, organized by namespace
+ *
+ * @warning This is a pretty inefficient function, avoid if you can
+ */
+ public function getAll()
+ {
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ $ret = array();
+ foreach ($this->plist->squash() as $name => $value) {
+ list($ns, $key) = explode('.', $name, 2);
+ $ret[$ns][$key] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Sets a value to configuration.
+ *
+ * @param string $key key
+ * @param mixed $value value
+ * @param mixed $a
+ */
+ public function set($key, $value, $a = null)
+ {
+ if (strpos($key, '.') === false) {
+ $namespace = $key;
+ $directive = $value;
+ $value = $a;
+ $key = "$key.$directive";
+ $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE);
+ } else {
+ list($namespace) = explode('.', $key);
+ }
+ if ($this->isFinalized('Cannot set directive after finalization')) {
+ return;
+ }
+ if (!isset($this->def->info[$key])) {
+ $this->triggerError(
+ 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value',
+ E_USER_WARNING
+ );
+ return;
+ }
+ $def = $this->def->info[$key];
+
+ if (isset($def->isAlias)) {
+ if ($this->aliasMode) {
+ $this->triggerError(
+ 'Double-aliases not allowed, please fix '.
+ 'ConfigSchema bug with' . $key,
+ E_USER_ERROR
+ );
+ return;
+ }
+ $this->aliasMode = true;
+ $this->set($def->key, $value);
+ $this->aliasMode = false;
+ $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE);
+ return;
+ }
+
+ // Raw type might be negative when using the fully optimized form
+ // of stdclass, which indicates allow_null == true
+ $rtype = is_int($def) ? $def : $def->type;
+ if ($rtype < 0) {
+ $type = -$rtype;
+ $allow_null = true;
+ } else {
+ $type = $rtype;
+ $allow_null = isset($def->allow_null);
+ }
+
+ try {
+ $value = $this->parser->parse($value, $type, $allow_null);
+ } catch (HTMLPurifier_VarParserException $e) {
+ $this->triggerError(
+ 'Value for ' . $key . ' is of invalid type, should be ' .
+ HTMLPurifier_VarParser::getTypeName($type),
+ E_USER_WARNING
+ );
+ return;
+ }
+ if (is_string($value) && is_object($def)) {
+ // resolve value alias if defined
+ if (isset($def->aliases[$value])) {
+ $value = $def->aliases[$value];
+ }
+ // check to see if the value is allowed
+ if (isset($def->allowed) && !isset($def->allowed[$value])) {
+ $this->triggerError(
+ 'Value not supported, valid values are: ' .
+ $this->_listify($def->allowed),
+ E_USER_WARNING
+ );
+ return;
+ }
+ }
+ $this->plist->set($key, $value);
+
+ // reset definitions if the directives they depend on changed
+ // this is a very costly process, so it's discouraged
+ // with finalization
+ if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') {
+ $this->definitions[$namespace] = null;
+ }
+
+ $this->serials[$namespace] = false;
+ }
+
+ /**
+ * Convenience function for error reporting
+ *
+ * @param array $lookup
+ *
+ * @return string
+ */
+ private function _listify($lookup)
+ {
+ $list = array();
+ foreach ($lookup as $name => $b) {
+ $list[] = $name;
+ }
+ return implode(', ', $list);
+ }
+
+ /**
+ * Retrieves object reference to the HTML definition.
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawHTMLDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_HTMLDefinition
+ */
+ public function getHTMLDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('HTML', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the CSS definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawCSSDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_CSSDefinition
+ */
+ public function getCSSDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('CSS', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves object reference to the URI definition
+ *
+ * @param bool $raw Return a copy that has not been setup yet. Must be
+ * called before it's been setup, otherwise won't work.
+ * @param bool $optimized If true, this method may return null, to
+ * indicate that a cached version of the modified
+ * definition object is available and no further edits
+ * are necessary. Consider using
+ * maybeGetRawURIDefinition, which is more explicitly
+ * named, instead.
+ *
+ * @return HTMLPurifier_URIDefinition
+ */
+ public function getURIDefinition($raw = false, $optimized = false)
+ {
+ return $this->getDefinition('URI', $raw, $optimized);
+ }
+
+ /**
+ * Retrieves a definition
+ *
+ * @param string $type Type of definition: HTML, CSS, etc
+ * @param bool $raw Whether or not definition should be returned raw
+ * @param bool $optimized Only has an effect when $raw is true. Whether
+ * or not to return null if the result is already present in
+ * the cache. This is off by default for backwards
+ * compatibility reasons, but you need to do things this
+ * way in order to ensure that caching is done properly.
+ * Check out enduser-customize.html for more details.
+ * We probably won't ever change this default, as much as the
+ * maybe semantics is the "right thing to do."
+ *
+ * @throws HTMLPurifier_Exception
+ * @return HTMLPurifier_Definition
+ */
+ public function getDefinition($type, $raw = false, $optimized = false)
+ {
+ if ($optimized && !$raw) {
+ throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false");
+ }
+ if (!$this->finalized) {
+ $this->autoFinalize();
+ }
+ // temporarily suspend locks, so we can handle recursive definition calls
+ $lock = $this->lock;
+ $this->lock = null;
+ $factory = HTMLPurifier_DefinitionCacheFactory::instance();
+ $cache = $factory->create($type, $this);
+ $this->lock = $lock;
+ if (!$raw) {
+ // full definition
+ // ---------------
+ // check if definition is in memory
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ // check if the definition is setup
+ if ($def->setup) {
+ return $def;
+ } else {
+ $def->setup($this);
+ if ($def->optimized) {
+ $cache->add($def, $this);
+ }
+ return $def;
+ }
+ }
+ // check if definition is in cache
+ $def = $cache->get($this);
+ if ($def) {
+ // definition in cache, save to memory and return it
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ // set it up
+ $this->lock = $type;
+ $def->setup($this);
+ $this->lock = null;
+ // save in cache
+ $cache->add($def, $this);
+ // return it
+ return $def;
+ } else {
+ // raw definition
+ // --------------
+ // check preconditions
+ $def = null;
+ if ($optimized) {
+ if (is_null($this->get($type . '.DefinitionID'))) {
+ // fatally error out if definition ID not set
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw version without specifying %$type.DefinitionID"
+ );
+ }
+ }
+ if (!empty($this->definitions[$type])) {
+ $def = $this->definitions[$type];
+ if ($def->setup && !$optimized) {
+ $extra = $this->chatty ?
+ " (try moving this code block earlier in your initialization)" :
+ "";
+ throw new HTMLPurifier_Exception(
+ "Cannot retrieve raw definition after it has already been setup" .
+ $extra
+ );
+ }
+ if ($def->optimized === null) {
+ $extra = $this->chatty ? " (try flushing your cache)" : "";
+ throw new HTMLPurifier_Exception(
+ "Optimization status of definition is unknown" . $extra
+ );
+ }
+ if ($def->optimized !== $optimized) {
+ $msg = $optimized ? "optimized" : "unoptimized";
+ $extra = $this->chatty ?
+ " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)"
+ : "";
+ throw new HTMLPurifier_Exception(
+ "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra
+ );
+ }
+ }
+ // check if definition was in memory
+ if ($def) {
+ if ($def->setup) {
+ // invariant: $optimized === true (checked above)
+ return null;
+ } else {
+ return $def;
+ }
+ }
+ // if optimized, check if definition was in cache
+ // (because we do the memory check first, this formulation
+ // is prone to cache slamming, but I think
+ // guaranteeing that either /all/ of the raw
+ // setup code or /none/ of it is run is more important.)
+ if ($optimized) {
+ // This code path only gets run once; once we put
+ // something in $definitions (which is guaranteed by the
+ // trailing code), we always short-circuit above.
+ $def = $cache->get($this);
+ if ($def) {
+ // save the full definition for later, but don't
+ // return it yet
+ $this->definitions[$type] = $def;
+ return null;
+ }
+ }
+ // check invariants for creation
+ if (!$optimized) {
+ if (!is_null($this->get($type . '.DefinitionID'))) {
+ if ($this->chatty) {
+ $this->triggerError(
+ 'Due to a documentation error in previous version of HTML Purifier, your ' .
+ 'definitions are not being cached. If this is OK, you can remove the ' .
+ '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' .
+ 'modify your code to use maybeGetRawDefinition, and test if the returned ' .
+ 'value is null before making any edits (if it is null, that means that a ' .
+ 'cached version is available, and no raw operations are necessary). See ' .
+ '<a href="http://htmlpurifier.org/docs/enduser-customize.html#optimized">' .
+ 'Customize</a> for more details',
+ E_USER_WARNING
+ );
+ } else {
+ $this->triggerError(
+ "Useless DefinitionID declaration",
+ E_USER_WARNING
+ );
+ }
+ }
+ }
+ // initialize it
+ $def = $this->initDefinition($type);
+ $def->optimized = $optimized;
+ return $def;
+ }
+ throw new HTMLPurifier_Exception("The impossible happened!");
+ }
+
+ /**
+ * Initialise definition
+ *
+ * @param string $type What type of definition to create
+ *
+ * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition
+ * @throws HTMLPurifier_Exception
+ */
+ private function initDefinition($type)
+ {
+ // quick checks failed, let's create the object
+ if ($type == 'HTML') {
+ $def = new HTMLPurifier_HTMLDefinition();
+ } elseif ($type == 'CSS') {
+ $def = new HTMLPurifier_CSSDefinition();
+ } elseif ($type == 'URI') {
+ $def = new HTMLPurifier_URIDefinition();
+ } else {
+ throw new HTMLPurifier_Exception(
+ "Definition of $type type not supported"
+ );
+ }
+ $this->definitions[$type] = $def;
+ return $def;
+ }
+
+ public function maybeGetRawDefinition($name)
+ {
+ return $this->getDefinition($name, true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_HTMLDefinition
+ */
+ public function maybeGetRawHTMLDefinition()
+ {
+ return $this->getDefinition('HTML', true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_CSSDefinition
+ */
+ public function maybeGetRawCSSDefinition()
+ {
+ return $this->getDefinition('CSS', true, true);
+ }
+
+ /**
+ * @return HTMLPurifier_URIDefinition
+ */
+ public function maybeGetRawURIDefinition()
+ {
+ return $this->getDefinition('URI', true, true);
+ }
+
+ /**
+ * Loads configuration values from an array with the following structure:
+ * Namespace.Directive => Value
+ *
+ * @param array $config_array Configuration associative array
+ */
+ public function loadArray($config_array)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ foreach ($config_array as $key => $value) {
+ $key = str_replace('_', '.', $key);
+ if (strpos($key, '.') !== false) {
+ $this->set($key, $value);
+ } else {
+ $namespace = $key;
+ $namespace_values = $value;
+ foreach ($namespace_values as $directive => $value2) {
+ $this->set($namespace .'.'. $directive, $value2);
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns a list of array(namespace, directive) for all directives
+ * that are allowed in a web-form context as per an allowed
+ * namespaces/directives list.
+ *
+ * @param array $allowed List of allowed namespaces/directives
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function getAllowedDirectivesForForm($allowed, $schema = null)
+ {
+ if (!$schema) {
+ $schema = HTMLPurifier_ConfigSchema::instance();
+ }
+ if ($allowed !== true) {
+ if (is_string($allowed)) {
+ $allowed = array($allowed);
+ }
+ $allowed_ns = array();
+ $allowed_directives = array();
+ $blacklisted_directives = array();
+ foreach ($allowed as $ns_or_directive) {
+ if (strpos($ns_or_directive, '.') !== false) {
+ // directive
+ if ($ns_or_directive[0] == '-') {
+ $blacklisted_directives[substr($ns_or_directive, 1)] = true;
+ } else {
+ $allowed_directives[$ns_or_directive] = true;
+ }
+ } else {
+ // namespace
+ $allowed_ns[$ns_or_directive] = true;
+ }
+ }
+ }
+ $ret = array();
+ foreach ($schema->info as $key => $def) {
+ list($ns, $directive) = explode('.', $key, 2);
+ if ($allowed !== true) {
+ if (isset($blacklisted_directives["$ns.$directive"])) {
+ continue;
+ }
+ if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) {
+ continue;
+ }
+ }
+ if (isset($def->isAlias)) {
+ continue;
+ }
+ if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') {
+ continue;
+ }
+ $ret[] = array($ns, $directive);
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from $_GET/$_POST that were posted
+ * via ConfigForm
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return mixed
+ */
+ public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema);
+ $config = HTMLPurifier_Config::create($ret, $schema);
+ return $config;
+ }
+
+ /**
+ * Merges in configuration values from $_GET/$_POST to object. NOT STATIC.
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ */
+ public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true)
+ {
+ $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def);
+ $this->loadArray($ret);
+ }
+
+ /**
+ * Prepares an array from a form into something usable for the more
+ * strict parts of HTMLPurifier_Config
+ *
+ * @param array $array $_GET or $_POST array to import
+ * @param string|bool $index Index/name that the config variables are in
+ * @param array|bool $allowed List of allowed namespaces/directives
+ * @param bool $mq_fix Boolean whether or not to enable magic quotes fix
+ * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy
+ *
+ * @return array
+ */
+ public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null)
+ {
+ if ($index !== false) {
+ $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array();
+ }
+ $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc();
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema);
+ $ret = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $skey = "$ns.$directive";
+ if (!empty($array["Null_$skey"])) {
+ $ret[$ns][$directive] = null;
+ continue;
+ }
+ if (!isset($array[$skey])) {
+ continue;
+ }
+ $value = $mq ? stripslashes($array[$skey]) : $array[$skey];
+ $ret[$ns][$directive] = $value;
+ }
+ return $ret;
+ }
+
+ /**
+ * Loads configuration values from an ini file
+ *
+ * @param string $filename Name of ini file
+ */
+ public function loadIni($filename)
+ {
+ if ($this->isFinalized('Cannot load directives after finalization')) {
+ return;
+ }
+ $array = parse_ini_file($filename, true);
+ $this->loadArray($array);
+ }
+
+ /**
+ * Checks whether or not the configuration object is finalized.
+ *
+ * @param string|bool $error String error message, or false for no error
+ *
+ * @return bool
+ */
+ public function isFinalized($error = false)
+ {
+ if ($this->finalized && $error) {
+ $this->triggerError($error, E_USER_ERROR);
+ }
+ return $this->finalized;
+ }
+
+ /**
+ * Finalizes configuration only if auto finalize is on and not
+ * already finalized
+ */
+ public function autoFinalize()
+ {
+ if ($this->autoFinalize) {
+ $this->finalize();
+ } else {
+ $this->plist->squash(true);
+ }
+ }
+
+ /**
+ * Finalizes a configuration object, prohibiting further change
+ */
+ public function finalize()
+ {
+ $this->finalized = true;
+ $this->parser = null;
+ }
+
+ /**
+ * Produces a nicely formatted error message by supplying the
+ * stack frame information OUTSIDE of HTMLPurifier_Config.
+ *
+ * @param string $msg An error message
+ * @param int $no An error number
+ */
+ protected function triggerError($msg, $no)
+ {
+ // determine previous stack frame
+ $extra = '';
+ if ($this->chatty) {
+ $trace = debug_backtrace();
+ // zip(tail(trace), trace) -- but PHP is not Haskell har har
+ for ($i = 0, $c = count($trace); $i < $c - 1; $i++) {
+ // XXX this is not correct on some versions of HTML Purifier
+ if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') {
+ continue;
+ }
+ $frame = $trace[$i];
+ $extra = " invoked on line {$frame['line']} in file {$frame['file']}";
+ break;
+ }
+ }
+ trigger_error($msg . $extra, $no);
+ }
+
+ /**
+ * Returns a serialized form of the configuration object that can
+ * be reconstituted.
+ *
+ * @return string
+ */
+ public function serialize()
+ {
+ $this->getDefinition('HTML');
+ $this->getDefinition('CSS');
+ $this->getDefinition('URI');
+ return serialize($this);
+ }
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
index bfbb0f92f..bfbb0f92f 100644
--- a/library/HTMLPurifier/ConfigSchema.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
diff --git a/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
index d5906cd46..d5906cd46 100644
--- a/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php
diff --git a/library/HTMLPurifier/ConfigSchema/Builder/Xml.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
index 5fa56f7dd..5fa56f7dd 100644
--- a/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php
diff --git a/library/HTMLPurifier/ConfigSchema/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
index 2671516c5..2671516c5 100644
--- a/library/HTMLPurifier/ConfigSchema/Exception.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
index 0e08ae8fe..0e08ae8fe 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
index 127a39a67..127a39a67 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php
diff --git a/library/HTMLPurifier/ConfigSchema/Interchange/Id.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
index 126f09d95..126f09d95 100644
--- a/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php
diff --git a/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
index 655e6dd1b..655e6dd1b 100644
--- a/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php
diff --git a/library/HTMLPurifier/ConfigSchema/Validator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
index fb3127788..fb3127788 100644
--- a/library/HTMLPurifier/ConfigSchema/Validator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php
diff --git a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
index c9aa3644a..c9aa3644a 100644
--- a/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
new file mode 100644
index 000000000..371e948f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema.ser
Binary files differ
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
index 0517fed0a..0517fed0a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
index 249edd647..249edd647 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
index 9a8fa6a2e..9a8fa6a2e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
index b01788348..b01788348 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
index e774b823b..e774b823b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
index 533165e17..533165e17 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
index 9eb7e3846..9eb7e3846 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
index 2f17bf477..2f17bf477 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
index 52654b53a..52654b53a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
index 6440d2103..6440d2103 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
index f31d226f5..f31d226f5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt
new file mode 100644
index 000000000..735d4b7a1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt
@@ -0,0 +1,10 @@
+Attr.ID.HTML5
+TYPE: bool/null
+DEFAULT: null
+VERSION: 4.8.0
+--DESCRIPTION--
+In HTML5, restrictions on the format of the id attribute have been significantly
+relaxed, such that any string is valid so long as it contains no spaces and
+is at least one character. In lieu of a general HTML5 compatibility flag,
+set this configuration directive to true to use the relaxed rules.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
index 5f2b5e3d2..5f2b5e3d2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
index 6f5824586..6f5824586 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
index cc49d43fd..cc49d43fd 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
index 2c5924a7a..2c5924a7a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
index d5caa1bb9..d5caa1bb9 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
index 2a476481a..2a476481a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
index 663064a34..663064a34 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
index 3a48ba960..3a48ba960 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
index db58b1346..db58b1346 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
index 7996488be..7996488be 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt
new file mode 100644
index 000000000..6367fe23c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt
@@ -0,0 +1,14 @@
+AutoFormat.RemoveEmpty.Predicate
+TYPE: hash
+VERSION: 4.7.0
+DEFAULT: array('colgroup' => array(), 'th' => array(), 'td' => array(), 'iframe' => array('src'))
+--DESCRIPTION--
+<p>
+ Given that an element has no contents, it will be removed by default, unless
+ this predicate dictates otherwise. The predicate can either be an associative
+ map from tag name to list of attributes that must be present for the element
+ to be considered preserved: thus, the default always preserves <code>colgroup</code>,
+ <code>th</code> and <code>td</code>, and also <code>iframe</code> if it
+ has a <code>src</code>.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
index 35c393b4e..35c393b4e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
index ca17eb1dc..ca17eb1dc 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
index 34657ba47..34657ba47 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
index dde990ab2..dde990ab2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt
new file mode 100644
index 000000000..4d054b1f0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt
@@ -0,0 +1,11 @@
+CSS.AllowDuplicates
+TYPE: bool
+DEFAULT: false
+VERSION: 4.8.0
+--DESCRIPTION--
+<p>
+ By default, HTML Purifier removes duplicate CSS properties,
+ like <code>color:red; color:blue</code>. If this is set to
+ true, duplicate properties are allowed.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
index b324608f7..b324608f7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
index 748be0eec..748be0eec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
index 3fd465406..3fd465406 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
index 460112ebe..460112ebe 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
index 5cb7dda3b..5cb7dda3b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
index f1f5c5f12..f1f5c5f12 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
index 7a3291470..7a3291470 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
index 148eedb8b..148eedb8b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
index e733a61e8..e733a61e8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
index c486724c8..c486724c8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
index 54036507d..54036507d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
new file mode 100644
index 000000000..2e0cc8104
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt
@@ -0,0 +1,16 @@
+Cache.SerializerPermissions
+TYPE: int/null
+VERSION: 4.3.0
+DEFAULT: 0755
+--DESCRIPTION--
+
+<p>
+ Directory permissions of the files and directories created inside
+ the DefinitionCache/Serializer or other custom serializer path.
+</p>
+<p>
+ In HTML Purifier 4.8.0, this also supports <code>NULL</code>,
+ which means that no chmod'ing or directory creation shall
+ occur.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
index 568cbf3b3..568cbf3b3 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt
new file mode 100644
index 000000000..b2b6ab149
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt
@@ -0,0 +1,16 @@
+Core.AggressivelyRemoveScript
+TYPE: bool
+VERSION: 4.9.0
+DEFAULT: true
+--DESCRIPTION--
+<p>
+ This directive enables aggressive pre-filter removal of
+ script tags. This is not necessary for security,
+ but it can help work around a bug in libxml where embedded
+ HTML elements inside script sections cause the parser to
+ choke. To revert to pre-4.9.0 behavior, set this to false.
+ This directive has no effect if %Core.Trusted is true,
+ %Core.RemoveScriptContents is false, or %Core.HiddenElements
+ does not contain script.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
index 2c910cc7d..2c910cc7d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
index d7317911f..d7317911f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
index c572c14ec..c572c14ec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
index 64b114fce..64b114fce 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
index 36f16e07e..36f16e07e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
index 1cd4c2c96..1cd4c2c96 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
index ce243c35d..ce243c35d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
index 8bfb47c3a..8bfb47c3a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
index a3881be75..a3881be75 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
index a7a5b249b..a7a5b249b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
index abb499948..abb499948 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
index 915391edb..915391edb 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
index 233fca14f..233fca14f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.Language.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt
new file mode 100644
index 000000000..392b43649
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt
@@ -0,0 +1,36 @@
+Core.LegacyEntityDecoder
+TYPE: bool
+VERSION: 4.9.0
+DEFAULT: false
+--DESCRIPTION--
+<p>
+ Prior to HTML Purifier 4.9.0, entities were decoded by performing
+ a global search replace for all entities whose decoded versions
+ did not have special meanings under HTML, and replaced them with
+ their decoded versions. We would match all entities, even if they did
+ not have a trailing semicolon, but only if there weren't any trailing
+ alphanumeric characters.
+</p>
+<table>
+<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
+<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yena</td><td>&amp;yena</td><td>&amp;yena</td></tr>
+<tr><td>&amp;yen=</td><td>&yen;=</td><td>&yen;=</td></tr>
+</table>
+<p>
+ In HTML Purifier 4.9.0, we changed the behavior of entity parsing
+ to match entities that had missing trailing semicolons in less
+ cases, to more closely match HTML5 parsing behavior:
+</p>
+<table>
+<tr><th>Original</th><th>Text</th><th>Attribute</th></tr>
+<tr><td>&amp;yen;</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yen</td><td>&yen;</td><td>&yen;</td></tr>
+<tr><td>&amp;yena</td><td>&yen;a</td><td>&amp;yena</td></tr>
+<tr><td>&amp;yen=</td><td>&yen;=</td><td>&amp;yen=</td></tr>
+</table>
+<p>
+ This flag reverts back to pre-HTML Purifier 4.9.0 behavior.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
index 8983e2cca..8983e2cca 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
index eb841a759..eb841a759 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
index d77f5360d..d77f5360d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
index 4070c2a0d..4070c2a0d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
index 3397d9f71..3397d9f71 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
index a4cd966df..a4cd966df 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
index 3db50ef20..3db50ef20 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
index 16829bcda..16829bcda 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
index 7f95f54d1..7f95f54d1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
index 6c231b2d7..6c231b2d7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
index 078d08741..078d08741 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
index 321eaa2d8..321eaa2d8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
index 0b2c106da..0b2c106da 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
index fcf093f17..fcf093f17 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
index 140e21423..140e21423 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
index f22e977d4..f22e977d4 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
index 1d3fa7907..1d3fa7907 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
index 5a59a55c0..5a59a55c0 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
index 151fb7b82..151fb7b82 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
index 45ae469ec..45ae469ec 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
index 524618879..524618879 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
new file mode 100644
index 000000000..6ed70b599
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt
@@ -0,0 +1,9 @@
+HTML.CustomDoctype
+TYPE: string/null
+VERSION: 2.0.1
+DEFAULT: NULL
+--DESCRIPTION--
+
+A custom doctype for power-users who defined their own document
+type. This directive only applies when %HTML.Doctype is blank.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
index 103db754a..103db754a 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
index 229ae0267..229ae0267 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
index 9dab497f2..9dab497f2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
index 7878dc0bf..7878dc0bf 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
index 57358f9ba..57358f9ba 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
index 93a53e14f..93a53e14f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
index e424c386e..e424c386e 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
index 700b30924..700b30924 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
index 62e8e160c..62e8e160c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
index dfb720496..dfb720496 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
index cdda09a4c..cdda09a4c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
index 5eb6ec2b5..5eb6ec2b5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
index ceb342e22..ceb342e22 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
index 5ebc7a19d..5ebc7a19d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
index a8b1de56b..a8b1de56b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
index 587a16778..587a16778 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt
new file mode 100644
index 000000000..dd514c0de
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt
@@ -0,0 +1,10 @@
+--# vim: et sw=4 sts=4
+HTML.TargetNoopener
+TYPE: bool
+VERSION: 4.8.0
+DEFAULT: TRUE
+--DESCRIPTION--
+If enabled, noopener rel attributes are added to links which have
+a target attribute associated with them. This prevents malicious
+destinations from overwriting the original window.
+--# vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt
new file mode 100644
index 000000000..cb5a0b0e5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt
@@ -0,0 +1,9 @@
+HTML.TargetNoreferrer
+TYPE: bool
+VERSION: 4.8.0
+DEFAULT: TRUE
+--DESCRIPTION--
+If enabled, noreferrer rel attributes are added to links which have
+a target attribute associated with them. This prevents malicious
+destinations from overwriting the original window.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
index b4c271b7f..b4c271b7f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
index 4186ccd0d..4186ccd0d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
index 996762bd1..996762bd1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
index 1db9237e9..1db9237e9 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
index 2a47e384f..2a47e384f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
index 08921fde7..08921fde7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
index d6f0d9f29..d6f0d9f29 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
index 93398e859..93398e859 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
index 79f8ad82c..79f8ad82c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
index 232b02362..232b02362 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
index 06bab00a0..06bab00a0 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
index 071bc0295..071bc0295 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
new file mode 100644
index 000000000..eb97307e2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt
@@ -0,0 +1,18 @@
+URI.AllowedSchemes
+TYPE: lookup
+--DEFAULT--
+array (
+ 'http' => true,
+ 'https' => true,
+ 'mailto' => true,
+ 'ftp' => true,
+ 'nntp' => true,
+ 'news' => true,
+ 'tel' => true,
+)
+--DESCRIPTION--
+Whitelist that defines the schemes that a URI is allowed to have. This
+prevents XSS attacks from using pseudo-schemes like javascript or mocha.
+There is also support for the <code>data</code> and <code>file</code>
+URI schemes, but they are not enabled by default.
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
index 876f0680c..876f0680c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Base.txt
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
new file mode 100644
index 000000000..834bc08c0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt
@@ -0,0 +1,15 @@
+URI.DefaultScheme
+TYPE: string/null
+DEFAULT: 'http'
+--DESCRIPTION--
+
+<p>
+ Defines through what scheme the output will be served, in order to
+ select the proper object validator when no scheme information is present.
+</p>
+
+<p>
+ Starting with HTML Purifier 4.9.0, the default scheme can be null, in
+ which case we reject all URIs which do not have explicit schemes.
+</p>
+--# vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
index f05312ba8..f05312ba8 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
index 80cfea93f..80cfea93f 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
index 71ce025a2..71ce025a2 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
index 13c122c8c..13c122c8c 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
index abcc1efd6..abcc1efd6 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
index f891de499..f891de499 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
index ee83b121d..ee83b121d 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Host.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
index 0b6df7625..0b6df7625 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
index 4214900a5..4214900a5 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
index 58c81dcc4..58c81dcc4 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
index 6fce0fdc3..6fce0fdc3 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
index 1e17c1d46..1e17c1d46 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
index 23331a4e7..23331a4e7 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
index 79084832b..79084832b 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt
diff --git a/library/HTMLPurifier/ConfigSchema/schema/info.ini b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
index 5de4505e1..5de4505e1 100644
--- a/library/HTMLPurifier/ConfigSchema/schema/info.ini
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/schema/info.ini
diff --git a/library/HTMLPurifier/ContentSets.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
index 543e3f8f1..543e3f8f1 100644
--- a/library/HTMLPurifier/ContentSets.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php
diff --git a/library/HTMLPurifier/Context.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
index 00e509c85..00e509c85 100644
--- a/library/HTMLPurifier/Context.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php
diff --git a/library/HTMLPurifier/Definition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
index bc6d43364..bc6d43364 100644
--- a/library/HTMLPurifier/Definition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
new file mode 100644
index 000000000..9aa8ff354
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * Abstract class representing Definition cache managers that implements
+ * useful common methods and is a factory.
+ * @todo Create a separate maintenance file advanced users can use to
+ * cache their custom HTMLDefinition, which can be loaded
+ * via a configuration directive
+ * @todo Implement memcached
+ */
+abstract class HTMLPurifier_DefinitionCache
+{
+ /**
+ * @type string
+ */
+ public $type;
+
+ /**
+ * @param string $type Type of definition objects this instance of the
+ * cache will handle.
+ */
+ public function __construct($type)
+ {
+ $this->type = $type;
+ }
+
+ /**
+ * Generates a unique identifier for a particular configuration
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config
+ * @return string
+ */
+ public function generateKey($config)
+ {
+ return $config->version . ',' . // possibly replace with function calls
+ $config->getBatchSerial($this->type) . ',' .
+ $config->get($this->type . '.DefinitionRev');
+ }
+
+ /**
+ * Tests whether or not a key is old with respect to the configuration's
+ * version and revision number.
+ * @param string $key Key to test
+ * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against
+ * @return bool
+ */
+ public function isOld($key, $config)
+ {
+ if (substr_count($key, ',') < 2) {
+ return true;
+ }
+ list($version, $hash, $revision) = explode(',', $key, 3);
+ $compare = version_compare($version, $config->version);
+ // version mismatch, is always old
+ if ($compare != 0) {
+ return true;
+ }
+ // versions match, ids match, check revision number
+ if ($hash == $config->getBatchSerial($this->type) &&
+ $revision < $config->get($this->type . '.DefinitionRev')) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Checks if a definition's type jives with the cache's type
+ * @note Throws an error on failure
+ * @param HTMLPurifier_Definition $def Definition object to check
+ * @return bool true if good, false if not
+ */
+ public function checkDefType($def)
+ {
+ if ($def->type !== $this->type) {
+ trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}");
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Adds a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function add($def, $config);
+
+ /**
+ * Unconditionally saves a definition object to the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function set($def, $config);
+
+ /**
+ * Replace an object in the cache
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function replace($def, $config);
+
+ /**
+ * Retrieves a definition object from the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function get($config);
+
+ /**
+ * Removes a definition object to the cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function remove($config);
+
+ /**
+ * Clears all objects from cache
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function flush($config);
+
+ /**
+ * Clears all expired (older version or revision) objects from cache
+ * @note Be careful implementing this method as flush. Flush must
+ * not interfere with other Definition types, and cleanup()
+ * should not be repeatedly called by userland code.
+ * @param HTMLPurifier_Config $config
+ */
+ abstract public function cleanup($config);
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
index b57a51b6c..b57a51b6c 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
index 4991777ce..4991777ce 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
index d529dce48..d529dce48 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php
diff --git a/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
index b1fec8d36..b1fec8d36 100644
--- a/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Template.php.in
diff --git a/library/HTMLPurifier/DefinitionCache/Null.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
index d9a75ce22..d9a75ce22 100644
--- a/library/HTMLPurifier/DefinitionCache/Null.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
new file mode 100644
index 000000000..952e48d47
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php
@@ -0,0 +1,306 @@
+<?php
+
+class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCache
+{
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function add($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function set($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Definition $def
+ * @param HTMLPurifier_Config $config
+ * @return int|bool
+ */
+ public function replace($def, $config)
+ {
+ if (!$this->checkDefType($def)) {
+ return;
+ }
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ return $this->_write($file, serialize($def), $config);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool|HTMLPurifier_Config
+ */
+ public function get($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unserialize(file_get_contents($file));
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function remove($config)
+ {
+ $file = $this->generateFilePath($config);
+ if (!file_exists($file)) {
+ return false;
+ }
+ return unlink($file);
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function flush($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ // Apparently, on some versions of PHP, readdir will return
+ // an empty string if you pass an invalid argument to readdir.
+ // So you need this test. See #49.
+ if (false === $dh) {
+ return false;
+ }
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ unlink($dir . '/' . $filename);
+ }
+ closedir($dh);
+ return true;
+ }
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @return bool
+ */
+ public function cleanup($config)
+ {
+ if (!$this->_prepareDir($config)) {
+ return false;
+ }
+ $dir = $this->generateDirectoryPath($config);
+ $dh = opendir($dir);
+ // See #49 (and above).
+ if (false === $dh) {
+ return false;
+ }
+ while (false !== ($filename = readdir($dh))) {
+ if (empty($filename)) {
+ continue;
+ }
+ if ($filename[0] === '.') {
+ continue;
+ }
+ $key = substr($filename, 0, strlen($filename) - 4);
+ if ($this->isOld($key, $config)) {
+ unlink($dir . '/' . $filename);
+ }
+ }
+ closedir($dh);
+ return true;
+ }
+
+ /**
+ * Generates the file path to the serial file corresponding to
+ * the configuration and definition name
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @todo Make protected
+ */
+ public function generateFilePath($config)
+ {
+ $key = $this->generateKey($config);
+ return $this->generateDirectoryPath($config) . '/' . $key . '.ser';
+ }
+
+ /**
+ * Generates the path to the directory contain this cache's serial files
+ * @param HTMLPurifier_Config $config
+ * @return string
+ * @note No trailing slash
+ * @todo Make protected
+ */
+ public function generateDirectoryPath($config)
+ {
+ $base = $this->generateBaseDirectoryPath($config);
+ return $base . '/' . $this->type;
+ }
+
+ /**
+ * Generates path to base directory that contains all definition type
+ * serials
+ * @param HTMLPurifier_Config $config
+ * @return mixed|string
+ * @todo Make protected
+ */
+ public function generateBaseDirectoryPath($config)
+ {
+ $base = $config->get('Cache.SerializerPath');
+ $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base;
+ return $base;
+ }
+
+ /**
+ * Convenience wrapper function for file_put_contents
+ * @param string $file File name to write to
+ * @param string $data Data to write into file
+ * @param HTMLPurifier_Config $config
+ * @return int|bool Number of bytes written if success, or false if failure.
+ */
+ private function _write($file, $data, $config)
+ {
+ $result = file_put_contents($file, $data);
+ if ($result !== false) {
+ // set permissions of the new file (no execute)
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if ($chmod !== null) {
+ chmod($file, $chmod & 0666);
+ }
+ }
+ return $result;
+ }
+
+ /**
+ * Prepares the directory that this type stores the serials in
+ * @param HTMLPurifier_Config $config
+ * @return bool True if successful
+ */
+ private function _prepareDir($config)
+ {
+ $directory = $this->generateDirectoryPath($config);
+ $chmod = $config->get('Cache.SerializerPermissions');
+ if ($chmod === null) {
+ // TODO: This races
+ if (is_dir($directory)) return true;
+ return mkdir($directory);
+ }
+ if (!is_dir($directory)) {
+ $base = $this->generateBaseDirectoryPath($config);
+ if (!is_dir($base)) {
+ trigger_error(
+ 'Base directory ' . $base . ' does not exist,
+ please create or change using %Cache.SerializerPath',
+ E_USER_WARNING
+ );
+ return false;
+ } elseif (!$this->_testPermissions($base, $chmod)) {
+ return false;
+ }
+ if (!mkdir($directory, $chmod)) {
+ trigger_error(
+ 'Could not create directory ' . $directory . '',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ if (!$this->_testPermissions($directory, $chmod)) {
+ return false;
+ }
+ } elseif (!$this->_testPermissions($directory, $chmod)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Tests permissions on a directory and throws out friendly
+ * error messages and attempts to chmod it itself if possible
+ * @param string $dir Directory path
+ * @param int $chmod Permissions
+ * @return bool True if directory is writable
+ */
+ private function _testPermissions($dir, $chmod)
+ {
+ // early abort, if it is writable, everything is hunky-dory
+ if (is_writable($dir)) {
+ return true;
+ }
+ if (!is_dir($dir)) {
+ // generally, you'll want to handle this beforehand
+ // so a more specific error message can be given
+ trigger_error(
+ 'Directory ' . $dir . ' does not exist',
+ E_USER_WARNING
+ );
+ return false;
+ }
+ if (function_exists('posix_getuid') && $chmod !== null) {
+ // POSIX system, we can give more specific advice
+ if (fileowner($dir) === posix_getuid()) {
+ // we can chmod it ourselves
+ $chmod = $chmod | 0700;
+ if (chmod($dir, $chmod)) {
+ return true;
+ }
+ } elseif (filegroup($dir) === posix_getgid()) {
+ $chmod = $chmod | 0070;
+ } else {
+ // PHP's probably running as nobody, so we'll
+ // need to give global permissions
+ $chmod = $chmod | 0777;
+ }
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please chmod to ' . decoct($chmod),
+ E_USER_WARNING
+ );
+ } else {
+ // generic error message
+ trigger_error(
+ 'Directory ' . $dir . ' not writable, ' .
+ 'please alter file permissions',
+ E_USER_WARNING
+ );
+ }
+ return false;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/DefinitionCache/Serializer/README b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
index 2e35c1c3d..2e35c1c3d 100644..100755
--- a/library/HTMLPurifier/DefinitionCache/Serializer/README
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer/README
diff --git a/library/HTMLPurifier/DefinitionCacheFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
index fd1cc9be4..fd1cc9be4 100644
--- a/library/HTMLPurifier/DefinitionCacheFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php
diff --git a/library/HTMLPurifier/Doctype.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
index 4acd06e5b..4acd06e5b 100644
--- a/library/HTMLPurifier/Doctype.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php
diff --git a/library/HTMLPurifier/DoctypeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
index acc1d64a6..acc1d64a6 100644
--- a/library/HTMLPurifier/DoctypeRegistry.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php
diff --git a/library/HTMLPurifier/ElementDef.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
index d5311cedc..d5311cedc 100644
--- a/library/HTMLPurifier/ElementDef.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
new file mode 100644
index 000000000..b94f17542
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php
@@ -0,0 +1,617 @@
+<?php
+
+/**
+ * A UTF-8 specific character encoder that handles cleaning and transforming.
+ * @note All functions in this class should be static.
+ */
+class HTMLPurifier_Encoder
+{
+
+ /**
+ * Constructor throws fatal error if you attempt to instantiate class
+ */
+ private function __construct()
+ {
+ trigger_error('Cannot instantiate encoder, call methods statically', E_USER_ERROR);
+ }
+
+ /**
+ * Error-handler that mutes errors, alternative to shut-up operator.
+ */
+ public static function muteErrorHandler()
+ {
+ }
+
+ /**
+ * iconv wrapper which mutes errors, but doesn't work around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @return string
+ */
+ public static function unsafeIconv($in, $out, $text)
+ {
+ set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler'));
+ $r = iconv($in, $out, $text);
+ restore_error_handler();
+ return $r;
+ }
+
+ /**
+ * iconv wrapper which mutes errors and works around bugs.
+ * @param string $in Input encoding
+ * @param string $out Output encoding
+ * @param string $text The text to convert
+ * @param int $max_chunk_size
+ * @return string
+ */
+ public static function iconv($in, $out, $text, $max_chunk_size = 8000)
+ {
+ $code = self::testIconvTruncateBug();
+ if ($code == self::ICONV_OK) {
+ return self::unsafeIconv($in, $out, $text);
+ } elseif ($code == self::ICONV_TRUNCATES) {
+ // we can only work around this if the input character set
+ // is utf-8
+ if ($in == 'utf-8') {
+ if ($max_chunk_size < 4) {
+ trigger_error('max_chunk_size is too small', E_USER_WARNING);
+ return false;
+ }
+ // split into 8000 byte chunks, but be careful to handle
+ // multibyte boundaries properly
+ if (($c = strlen($text)) <= $max_chunk_size) {
+ return self::unsafeIconv($in, $out, $text);
+ }
+ $r = '';
+ $i = 0;
+ while (true) {
+ if ($i + $max_chunk_size >= $c) {
+ $r .= self::unsafeIconv($in, $out, substr($text, $i));
+ break;
+ }
+ // wibble the boundary
+ if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) {
+ $chunk_size = $max_chunk_size;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) {
+ $chunk_size = $max_chunk_size - 1;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) {
+ $chunk_size = $max_chunk_size - 2;
+ } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) {
+ $chunk_size = $max_chunk_size - 3;
+ } else {
+ return false; // rather confusing UTF-8...
+ }
+ $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths
+ $r .= self::unsafeIconv($in, $out, $chunk);
+ $i += $chunk_size;
+ }
+ return $r;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Cleans a UTF-8 string for well-formedness and SGML validity
+ *
+ * It will parse according to UTF-8 and return a valid UTF8 string, with
+ * non-SGML codepoints excluded.
+ *
+ * Specifically, it will permit:
+ * \x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}
+ * Source: https://www.w3.org/TR/REC-xml/#NT-Char
+ * Arguably this function should be modernized to the HTML5 set
+ * of allowed characters:
+ * https://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
+ * which simultaneously expand and restrict the set of allowed characters.
+ *
+ * @param string $str The string to clean
+ * @param bool $force_php
+ * @return string
+ *
+ * @note Just for reference, the non-SGML code points are 0 to 31 and
+ * 127 to 159, inclusive. However, we allow code points 9, 10
+ * and 13, which are the tab, line feed and carriage return
+ * respectively. 128 and above the code points map to multibyte
+ * UTF-8 representations.
+ *
+ * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and
+ * hsivonen@iki.fi at <http://iki.fi/hsivonen/php-utf8/> under the
+ * LGPL license. Notes on what changed are inside, but in general,
+ * the original code transformed UTF-8 text into an array of integer
+ * Unicode codepoints. Understandably, transforming that back to
+ * a string would be somewhat expensive, so the function was modded to
+ * directly operate on the string. However, this discourages code
+ * reuse, and the logic enumerated here would be useful for any
+ * function that needs to be able to understand UTF-8 characters.
+ * As of right now, only smart lossless character encoding converters
+ * would need that, and I'm probably not going to implement them.
+ */
+ public static function cleanUTF8($str, $force_php = false)
+ {
+ // UTF-8 validity is checked since PHP 4.3.5
+ // This is an optimization: if the string is already valid UTF-8, no
+ // need to do PHP stuff. 99% of the time, this will be the case.
+ if (preg_match(
+ '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du',
+ $str
+ )) {
+ return $str;
+ }
+
+ $mState = 0; // cached expected number of octets after the current octet
+ // until the beginning of the next UTF8 character sequence
+ $mUcs4 = 0; // cached Unicode character
+ $mBytes = 1; // cached expected number of octets in the current sequence
+
+ // original code involved an $out that was an array of Unicode
+ // codepoints. Instead of having to convert back into UTF-8, we've
+ // decided to directly append valid UTF-8 characters onto a string
+ // $out once they're done. $char accumulates raw bytes, while $mUcs4
+ // turns into the Unicode code point, so there's some redundancy.
+
+ $out = '';
+ $char = '';
+
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $in = ord($str{$i});
+ $char .= $str[$i]; // append byte to char
+ if (0 == $mState) {
+ // When mState is zero we expect either a US-ASCII character
+ // or a multi-octet sequence.
+ if (0 == (0x80 & ($in))) {
+ // US-ASCII, pass straight through.
+ if (($in <= 31 || $in == 127) &&
+ !($in == 9 || $in == 13 || $in == 10) // save \r\t\n
+ ) {
+ // control characters, remove
+ } else {
+ $out .= $char;
+ }
+ // reset
+ $char = '';
+ $mBytes = 1;
+ } elseif (0xC0 == (0xE0 & ($in))) {
+ // First octet of 2 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x1F) << 6;
+ $mState = 1;
+ $mBytes = 2;
+ } elseif (0xE0 == (0xF0 & ($in))) {
+ // First octet of 3 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x0F) << 12;
+ $mState = 2;
+ $mBytes = 3;
+ } elseif (0xF0 == (0xF8 & ($in))) {
+ // First octet of 4 octet sequence
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x07) << 18;
+ $mState = 3;
+ $mBytes = 4;
+ } elseif (0xF8 == (0xFC & ($in))) {
+ // First octet of 5 octet sequence.
+ //
+ // This is illegal because the encoded codepoint must be
+ // either:
+ // (a) not the shortest form or
+ // (b) outside the Unicode range of 0-0x10FFFF.
+ // Rather than trying to resynchronize, we will carry on
+ // until the end of the sequence and let the later error
+ // handling code catch it.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 0x03) << 24;
+ $mState = 4;
+ $mBytes = 5;
+ } elseif (0xFC == (0xFE & ($in))) {
+ // First octet of 6 octet sequence, see comments for 5
+ // octet sequence.
+ $mUcs4 = ($in);
+ $mUcs4 = ($mUcs4 & 1) << 30;
+ $mState = 5;
+ $mBytes = 6;
+ } else {
+ // Current octet is neither in the US-ASCII range nor a
+ // legal first octet of a multi-octet sequence.
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // When mState is non-zero, we expect a continuation of the
+ // multi-octet sequence
+ if (0x80 == (0xC0 & ($in))) {
+ // Legal continuation.
+ $shift = ($mState - 1) * 6;
+ $tmp = $in;
+ $tmp = ($tmp & 0x0000003F) << $shift;
+ $mUcs4 |= $tmp;
+
+ if (0 == --$mState) {
+ // End of the multi-octet sequence. mUcs4 now contains
+ // the final Unicode codepoint to be output
+
+ // Check for illegal sequences and codepoints.
+
+ // From Unicode 3.1, non-shortest form is illegal
+ if (((2 == $mBytes) && ($mUcs4 < 0x0080)) ||
+ ((3 == $mBytes) && ($mUcs4 < 0x0800)) ||
+ ((4 == $mBytes) && ($mUcs4 < 0x10000)) ||
+ (4 < $mBytes) ||
+ // From Unicode 3.2, surrogate characters = illegal
+ (($mUcs4 & 0xFFFFF800) == 0xD800) ||
+ // Codepoints outside the Unicode range are illegal
+ ($mUcs4 > 0x10FFFF)
+ ) {
+
+ } elseif (0xFEFF != $mUcs4 && // omit BOM
+ // check for valid Char unicode codepoints
+ (
+ 0x9 == $mUcs4 ||
+ 0xA == $mUcs4 ||
+ 0xD == $mUcs4 ||
+ (0x20 <= $mUcs4 && 0x7E >= $mUcs4) ||
+ // 7F-9F is not strictly prohibited by XML,
+ // but it is non-SGML, and thus we don't allow it
+ (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) ||
+ (0xE000 <= $mUcs4 && 0xFFFD >= $mUcs4) ||
+ (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4)
+ )
+ ) {
+ $out .= $char;
+ }
+ // initialize UTF8 cache (reset)
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char = '';
+ }
+ } else {
+ // ((0xC0 & (*in) != 0x80) && (mState != 0))
+ // Incomplete multi-octet sequence.
+ // used to result in complete fail, but we'll reset
+ $mState = 0;
+ $mUcs4 = 0;
+ $mBytes = 1;
+ $char ='';
+ }
+ }
+ }
+ return $out;
+ }
+
+ /**
+ * Translates a Unicode codepoint into its corresponding UTF-8 character.
+ * @note Based on Feyd's function at
+ * <http://forums.devnetwork.net/viewtopic.php?p=191404#191404>,
+ * which is in public domain.
+ * @note While we're going to do code point parsing anyway, a good
+ * optimization would be to refuse to translate code points that
+ * are non-SGML characters. However, this could lead to duplication.
+ * @note This is very similar to the unichr function in
+ * maintenance/generate-entity-file.php (although this is superior,
+ * due to its sanity checks).
+ */
+
+ // +----------+----------+----------+----------+
+ // | 33222222 | 22221111 | 111111 | |
+ // | 10987654 | 32109876 | 54321098 | 76543210 | bit
+ // +----------+----------+----------+----------+
+ // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F
+ // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF
+ // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF
+ // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF
+ // +----------+----------+----------+----------+
+ // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF)
+ // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes
+ // +----------+----------+----------+----------+
+
+ public static function unichr($code)
+ {
+ if ($code > 1114111 or $code < 0 or
+ ($code >= 55296 and $code <= 57343) ) {
+ // bits are set outside the "valid" range as defined
+ // by UNICODE 4.1.0
+ return '';
+ }
+
+ $x = $y = $z = $w = 0;
+ if ($code < 128) {
+ // regular ASCII character
+ $x = $code;
+ } else {
+ // set up bits for UTF-8
+ $x = ($code & 63) | 128;
+ if ($code < 2048) {
+ $y = (($code & 2047) >> 6) | 192;
+ } else {
+ $y = (($code & 4032) >> 6) | 128;
+ if ($code < 65536) {
+ $z = (($code >> 12) & 15) | 224;
+ } else {
+ $z = (($code >> 12) & 63) | 128;
+ $w = (($code >> 18) & 7) | 240;
+ }
+ }
+ }
+ // set up the actual character
+ $ret = '';
+ if ($w) {
+ $ret .= chr($w);
+ }
+ if ($z) {
+ $ret .= chr($z);
+ }
+ if ($y) {
+ $ret .= chr($y);
+ }
+ $ret .= chr($x);
+
+ return $ret;
+ }
+
+ /**
+ * @return bool
+ */
+ public static function iconvAvailable()
+ {
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE;
+ }
+ return $iconv;
+ }
+
+ /**
+ * Convert a string to UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public static function convertToUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // unaffected by bugs, since UTF-8 support all characters
+ $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str);
+ if ($str === false) {
+ // $encoding is not a valid encoding
+ trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR);
+ return '';
+ }
+ // If the string is bjorked by Shift_JIS or a similar encoding
+ // that doesn't support all of ASCII, convert the naughty
+ // characters to their true byte-wise ASCII/UTF-8 equivalents.
+ $str = strtr($str, self::testEncodingSupportsASCII($encoding));
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_encode($str);
+ return $str;
+ }
+ $bug = HTMLPurifier_Encoder::testIconvTruncateBug();
+ if ($bug == self::ICONV_OK) {
+ trigger_error('Encoding not supported, please install iconv', E_USER_ERROR);
+ } else {
+ trigger_error(
+ 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' .
+ 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541',
+ E_USER_ERROR
+ );
+ }
+ }
+
+ /**
+ * Converts a string from UTF-8 based on configuration.
+ * @param string $str The string to convert
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @note Currently, this is a lossy conversion, with unexpressable
+ * characters being omitted.
+ */
+ public static function convertFromUTF8($str, $config, $context)
+ {
+ $encoding = $config->get('Core.Encoding');
+ if ($escape = $config->get('Core.EscapeNonASCIICharacters')) {
+ $str = self::convertToASCIIDumbLossless($str);
+ }
+ if ($encoding === 'utf-8') {
+ return $str;
+ }
+ static $iconv = null;
+ if ($iconv === null) {
+ $iconv = self::iconvAvailable();
+ }
+ if ($iconv && !$config->get('Test.ForceNoIconv')) {
+ // Undo our previous fix in convertToUTF8, otherwise iconv will barf
+ $ascii_fix = self::testEncodingSupportsASCII($encoding);
+ if (!$escape && !empty($ascii_fix)) {
+ $clear_fix = array();
+ foreach ($ascii_fix as $utf8 => $native) {
+ $clear_fix[$utf8] = '';
+ }
+ $str = strtr($str, $clear_fix);
+ }
+ $str = strtr($str, array_flip($ascii_fix));
+ // Normal stuff
+ $str = self::iconv('utf-8', $encoding . '//IGNORE', $str);
+ return $str;
+ } elseif ($encoding === 'iso-8859-1') {
+ $str = utf8_decode($str);
+ return $str;
+ }
+ trigger_error('Encoding not supported', E_USER_ERROR);
+ // You might be tempted to assume that the ASCII representation
+ // might be OK, however, this is *not* universally true over all
+ // encodings. So we take the conservative route here, rather
+ // than forcibly turn on %Core.EscapeNonASCIICharacters
+ }
+
+ /**
+ * Lossless (character-wise) conversion of HTML to ASCII
+ * @param string $str UTF-8 string to be converted to ASCII
+ * @return string ASCII encoded string with non-ASCII character entity-ized
+ * @warning Adapted from MediaWiki, claiming fair use: this is a common
+ * algorithm. If you disagree with this license fudgery,
+ * implement it yourself.
+ * @note Uses decimal numeric entities since they are best supported.
+ * @note This is a DUMB function: it has no concept of keeping
+ * character entities that the projected character encoding
+ * can allow. We could possibly implement a smart version
+ * but that would require it to also know which Unicode
+ * codepoints the charset supported (not an easy task).
+ * @note Sort of with cleanUTF8() but it assumes that $str is
+ * well-formed UTF-8
+ */
+ public static function convertToASCIIDumbLossless($str)
+ {
+ $bytesleft = 0;
+ $result = '';
+ $working = 0;
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $bytevalue = ord($str[$i]);
+ if ($bytevalue <= 0x7F) { //0xxx xxxx
+ $result .= chr($bytevalue);
+ $bytesleft = 0;
+ } elseif ($bytevalue <= 0xBF) { //10xx xxxx
+ $working = $working << 6;
+ $working += ($bytevalue & 0x3F);
+ $bytesleft--;
+ if ($bytesleft <= 0) {
+ $result .= "&#" . $working . ";";
+ }
+ } elseif ($bytevalue <= 0xDF) { //110x xxxx
+ $working = $bytevalue & 0x1F;
+ $bytesleft = 1;
+ } elseif ($bytevalue <= 0xEF) { //1110 xxxx
+ $working = $bytevalue & 0x0F;
+ $bytesleft = 2;
+ } else { //1111 0xxx
+ $working = $bytevalue & 0x07;
+ $bytesleft = 3;
+ }
+ }
+ return $result;
+ }
+
+ /** No bugs detected in iconv. */
+ const ICONV_OK = 0;
+
+ /** Iconv truncates output if converting from UTF-8 to another
+ * character set with //IGNORE, and a non-encodable character is found */
+ const ICONV_TRUNCATES = 1;
+
+ /** Iconv does not support //IGNORE, making it unusable for
+ * transcoding purposes */
+ const ICONV_UNUSABLE = 2;
+
+ /**
+ * glibc iconv has a known bug where it doesn't handle the magic
+ * //IGNORE stanza correctly. In particular, rather than ignore
+ * characters, it will return an EILSEQ after consuming some number
+ * of characters, and expect you to restart iconv as if it were
+ * an E2BIG. Old versions of PHP did not respect the errno, and
+ * returned the fragment, so as a result you would see iconv
+ * mysteriously truncating output. We can work around this by
+ * manually chopping our input into segments of about 8000
+ * characters, as long as PHP ignores the error code. If PHP starts
+ * paying attention to the error code, iconv becomes unusable.
+ *
+ * @return int Error code indicating severity of bug.
+ */
+ public static function testIconvTruncateBug()
+ {
+ static $code = null;
+ if ($code === null) {
+ // better not use iconv, otherwise infinite loop!
+ $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000));
+ if ($r === false) {
+ $code = self::ICONV_UNUSABLE;
+ } elseif (($c = strlen($r)) < 9000) {
+ $code = self::ICONV_TRUNCATES;
+ } elseif ($c > 9000) {
+ trigger_error(
+ 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' .
+ 'include your iconv version as per phpversion()',
+ E_USER_ERROR
+ );
+ } else {
+ $code = self::ICONV_OK;
+ }
+ }
+ return $code;
+ }
+
+ /**
+ * This expensive function tests whether or not a given character
+ * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will
+ * fail this test, and require special processing. Variable width
+ * encodings shouldn't ever fail.
+ *
+ * @param string $encoding Encoding name to test, as per iconv format
+ * @param bool $bypass Whether or not to bypass the precompiled arrays.
+ * @return Array of UTF-8 characters to their corresponding ASCII,
+ * which can be used to "undo" any overzealous iconv action.
+ */
+ public static function testEncodingSupportsASCII($encoding, $bypass = false)
+ {
+ // All calls to iconv here are unsafe, proof by case analysis:
+ // If ICONV_OK, no difference.
+ // If ICONV_TRUNCATE, all calls involve one character inputs,
+ // so bug is not triggered.
+ // If ICONV_UNUSABLE, this call is irrelevant
+ static $encodings = array();
+ if (!$bypass) {
+ if (isset($encodings[$encoding])) {
+ return $encodings[$encoding];
+ }
+ $lenc = strtolower($encoding);
+ switch ($lenc) {
+ case 'shift_jis':
+ return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~');
+ case 'johab':
+ return array("\xE2\x82\xA9" => '\\');
+ }
+ if (strpos($lenc, 'iso-8859-') === 0) {
+ return array();
+ }
+ }
+ $ret = array();
+ if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) {
+ return false;
+ }
+ for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars
+ $c = chr($i); // UTF-8 char
+ $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion
+ if ($r === '' ||
+ // This line is needed for iconv implementations that do not
+ // omit characters that do not exist in the target character set
+ ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c)
+ ) {
+ // Reverse engineer: what's the UTF-8 equiv of this byte
+ // sequence? This assumes that there's no variable width
+ // encoding that doesn't support ASCII.
+ $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c;
+ }
+ }
+ $encodings[$encoding] = $ret;
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/EntityLookup.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
index f12ff13a3..f12ff13a3 100644
--- a/library/HTMLPurifier/EntityLookup.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php
diff --git a/library/HTMLPurifier/EntityLookup/entities.ser b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
index e8b08128b..e8b08128b 100644
--- a/library/HTMLPurifier/EntityLookup/entities.ser
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup/entities.ser
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
new file mode 100644
index 000000000..c372b5a6a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php
@@ -0,0 +1,285 @@
+<?php
+
+// if want to implement error collecting here, we'll need to use some sort
+// of global data (probably trigger_error) because it's impossible to pass
+// $config or $context to the callback functions.
+
+/**
+ * Handles referencing and derefencing character entities
+ */
+class HTMLPurifier_EntityParser
+{
+
+ /**
+ * Reference to entity lookup table.
+ * @type HTMLPurifier_EntityLookup
+ */
+ protected $_entity_lookup;
+
+ /**
+ * Callback regex string for entities in text.
+ * @type string
+ */
+ protected $_textEntitiesRegex;
+
+ /**
+ * Callback regex string for entities in attributes.
+ * @type string
+ */
+ protected $_attrEntitiesRegex;
+
+ /**
+ * Tests if the beginning of a string is a semi-optional regex
+ */
+ protected $_semiOptionalPrefixRegex;
+
+ public function __construct() {
+ // From
+ // http://stackoverflow.com/questions/15532252/why-is-reg-being-rendered-as-without-the-bounding-semicolon
+ $semi_optional = "quot|QUOT|lt|LT|gt|GT|amp|AMP|AElig|Aacute|Acirc|Agrave|Aring|Atilde|Auml|COPY|Ccedil|ETH|Eacute|Ecirc|Egrave|Euml|Iacute|Icirc|Igrave|Iuml|Ntilde|Oacute|Ocirc|Ograve|Oslash|Otilde|Ouml|REG|THORN|Uacute|Ucirc|Ugrave|Uuml|Yacute|aacute|acirc|acute|aelig|agrave|aring|atilde|auml|brvbar|ccedil|cedil|cent|copy|curren|deg|divide|eacute|ecirc|egrave|eth|euml|frac12|frac14|frac34|iacute|icirc|iexcl|igrave|iquest|iuml|laquo|macr|micro|middot|nbsp|not|ntilde|oacute|ocirc|ograve|ordf|ordm|oslash|otilde|ouml|para|plusmn|pound|raquo|reg|sect|shy|sup1|sup2|sup3|szlig|thorn|times|uacute|ucirc|ugrave|uml|uuml|yacute|yen|yuml";
+
+ // NB: three empty captures to put the fourth match in the right
+ // place
+ $this->_semiOptionalPrefixRegex = "/&()()()($semi_optional)/";
+
+ $this->_textEntitiesRegex =
+ '/&(?:'.
+ // hex
+ '[#]x([a-fA-F0-9]+);?|'.
+ // dec
+ '[#]0*(\d+);?|'.
+ // string (mandatory semicolon)
+ // NB: order matters: match semicolon preferentially
+ '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
+ // string (optional semicolon)
+ "($semi_optional)".
+ ')/';
+
+ $this->_attrEntitiesRegex =
+ '/&(?:'.
+ // hex
+ '[#]x([a-fA-F0-9]+);?|'.
+ // dec
+ '[#]0*(\d+);?|'.
+ // string (mandatory semicolon)
+ // NB: order matters: match semicolon preferentially
+ '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
+ // string (optional semicolon)
+ // don't match if trailing is equals or alphanumeric (URL
+ // like)
+ "($semi_optional)(?![=;A-Za-z0-9])".
+ ')/';
+
+ }
+
+ /**
+ * Substitute entities with the parsed equivalents. Use this on
+ * textual data in an HTML document (as opposed to attributes.)
+ *
+ * @param string $string String to have entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteTextEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_textEntitiesRegex,
+ array($this, 'entityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Substitute entities with the parsed equivalents. Use this on
+ * attribute contents in documents.
+ *
+ * @param string $string String to have entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteAttrEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_attrEntitiesRegex,
+ array($this, 'entityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteNonSpecialEntities() that does the work.
+ *
+ * @param array $matches PCRE matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+
+ protected function entityCallback($matches)
+ {
+ $entity = $matches[0];
+ $hex_part = @$matches[1];
+ $dec_part = @$matches[2];
+ $named_part = empty($matches[3]) ? @$matches[4] : $matches[3];
+ if ($hex_part !== NULL && $hex_part !== "") {
+ return HTMLPurifier_Encoder::unichr(hexdec($hex_part));
+ } elseif ($dec_part !== NULL && $dec_part !== "") {
+ return HTMLPurifier_Encoder::unichr((int) $dec_part);
+ } else {
+ if (!$this->_entity_lookup) {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+ if (isset($this->_entity_lookup->table[$named_part])) {
+ return $this->_entity_lookup->table[$named_part];
+ } else {
+ // exact match didn't match anything, so test if
+ // any of the semicolon optional match the prefix.
+ // Test that this is an EXACT match is important to
+ // prevent infinite loop
+ if (!empty($matches[3])) {
+ return preg_replace_callback(
+ $this->_semiOptionalPrefixRegex,
+ array($this, 'entityCallback'),
+ $entity
+ );
+ }
+ return $entity;
+ }
+ }
+ }
+
+ // LEGACY CODE BELOW
+
+ /**
+ * Callback regex string for parsing entities.
+ * @type string
+ */
+ protected $_substituteEntitiesRegex =
+ '/&(?:[#]x([a-fA-F0-9]+)|[#]0*(\d+)|([A-Za-z_:][A-Za-z0-9.\-_:]*));?/';
+ // 1. hex 2. dec 3. string (XML style)
+
+ /**
+ * Decimal to parsed string conversion table for special entities.
+ * @type array
+ */
+ protected $_special_dec2str =
+ array(
+ 34 => '"',
+ 38 => '&',
+ 39 => "'",
+ 60 => '<',
+ 62 => '>'
+ );
+
+ /**
+ * Stripped entity names to decimal conversion table for special entities.
+ * @type array
+ */
+ protected $_special_ent2dec =
+ array(
+ 'quot' => 34,
+ 'amp' => 38,
+ 'lt' => 60,
+ 'gt' => 62
+ );
+
+ /**
+ * Substitutes non-special entities with their parsed equivalents. Since
+ * running this whenever you have parsed character is t3h 5uck, we run
+ * it before everything else.
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteNonSpecialEntities($string)
+ {
+ // it will try to detect missing semicolons, but don't rely on it
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'nonSpecialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteNonSpecialEntities() that does the work.
+ *
+ * @param array $matches PCRE matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+
+ protected function nonSpecialEntityCallback($matches)
+ {
+ // replaces all but big five
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ // abort for special characters
+ if (isset($this->_special_dec2str[$code])) {
+ return $entity;
+ }
+ return HTMLPurifier_Encoder::unichr($code);
+ } else {
+ if (isset($this->_special_ent2dec[$matches[3]])) {
+ return $entity;
+ }
+ if (!$this->_entity_lookup) {
+ $this->_entity_lookup = HTMLPurifier_EntityLookup::instance();
+ }
+ if (isset($this->_entity_lookup->table[$matches[3]])) {
+ return $this->_entity_lookup->table[$matches[3]];
+ } else {
+ return $entity;
+ }
+ }
+ }
+
+ /**
+ * Substitutes only special entities with their parsed equivalents.
+ *
+ * @notice We try to avoid calling this function because otherwise, it
+ * would have to be called a lot (for every parsed section).
+ *
+ * @param string $string String to have non-special entities parsed.
+ * @return string Parsed string.
+ */
+ public function substituteSpecialEntities($string)
+ {
+ return preg_replace_callback(
+ $this->_substituteEntitiesRegex,
+ array($this, 'specialEntityCallback'),
+ $string
+ );
+ }
+
+ /**
+ * Callback function for substituteSpecialEntities() that does the work.
+ *
+ * This callback has same syntax as nonSpecialEntityCallback().
+ *
+ * @param array $matches PCRE-style matches array, with 0 the entire match, and
+ * either index 1, 2 or 3 set with a hex value, dec value,
+ * or string (respectively).
+ * @return string Replacement string.
+ */
+ protected function specialEntityCallback($matches)
+ {
+ $entity = $matches[0];
+ $is_num = (@$matches[0][1] === '#');
+ if ($is_num) {
+ $is_hex = (@$entity[2] === 'x');
+ $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2];
+ return isset($this->_special_dec2str[$int]) ?
+ $this->_special_dec2str[$int] :
+ $entity;
+ } else {
+ return isset($this->_special_ent2dec[$matches[3]]) ?
+ $this->_special_dec2str[$this->_special_ent2dec[$matches[3]]] :
+ $entity;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/ErrorCollector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
index d47e3f2e2..d47e3f2e2 100644
--- a/library/HTMLPurifier/ErrorCollector.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php
diff --git a/library/HTMLPurifier/ErrorStruct.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
index cf869d321..cf869d321 100644
--- a/library/HTMLPurifier/ErrorStruct.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php
diff --git a/library/HTMLPurifier/Exception.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
index be85b4c56..be85b4c56 100644
--- a/library/HTMLPurifier/Exception.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php
diff --git a/library/HTMLPurifier/Filter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
index c1f41ee16..c1f41ee16 100644
--- a/library/HTMLPurifier/Filter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
new file mode 100644
index 000000000..66f70b0fc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php
@@ -0,0 +1,341 @@
+<?php
+
+// why is this a top level function? Because PHP 5.2.0 doesn't seem to
+// understand how to interpret this filter if it's a static method.
+// It's all really silly, but if we go this route it might be reasonable
+// to coalesce all of these methods into one.
+function htmlpurifier_filter_extractstyleblocks_muteerrorhandler()
+{
+}
+
+/**
+ * This filter extracts <style> blocks from input HTML, cleans them up
+ * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks')
+ * so they can be used elsewhere in the document.
+ *
+ * @note
+ * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for
+ * sample usage.
+ *
+ * @note
+ * This filter can also be used on stylesheets not included in the
+ * document--something purists would probably prefer. Just directly
+ * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS()
+ */
+class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
+{
+ /**
+ * @type string
+ */
+ public $name = 'ExtractStyleBlocks';
+
+ /**
+ * @type array
+ */
+ private $_styleMatches = array();
+
+ /**
+ * @type csstidy
+ */
+ private $_tidy;
+
+ /**
+ * @type HTMLPurifier_AttrDef_HTML_ID
+ */
+ private $_id_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_CSS_Ident
+ */
+ private $_class_attrdef;
+
+ /**
+ * @type HTMLPurifier_AttrDef_Enum
+ */
+ private $_enum_attrdef;
+
+ public function __construct()
+ {
+ $this->_tidy = new csstidy();
+ $this->_tidy->set_cfg('lowercase_s', false);
+ $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true);
+ $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident();
+ $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum(
+ array(
+ 'first-child',
+ 'link',
+ 'visited',
+ 'active',
+ 'hover',
+ 'focus'
+ )
+ );
+ }
+
+ /**
+ * Save the contents of CSS blocks to style matches
+ * @param array $matches preg_replace style $matches array
+ */
+ protected function styleCallback($matches)
+ {
+ $this->_styleMatches[] = $matches[1];
+ }
+
+ /**
+ * Removes inline <style> tags from HTML, saves them for later use
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Extend to indicate non-text/css style blocks
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $tidy = $config->get('Filter.ExtractStyleBlocks.TidyImpl');
+ if ($tidy !== null) {
+ $this->_tidy = $tidy;
+ }
+ // NB: this must be NON-greedy because if we have
+ // <style>foo</style> <style>bar</style>
+ // we must not grab foo</style> <style>bar
+ $html = preg_replace_callback('#<style(?:\s.*)?>(.*)<\/style>#isU', array($this, 'styleCallback'), $html);
+ $style_blocks = $this->_styleMatches;
+ $this->_styleMatches = array(); // reset
+ $context->register('StyleBlocks', $style_blocks); // $context must not be reused
+ if ($this->_tidy) {
+ foreach ($style_blocks as &$style) {
+ $style = $this->cleanCSS($style, $config, $context);
+ }
+ }
+ return $html;
+ }
+
+ /**
+ * Takes CSS (the stuff found in <style>) and cleans it.
+ * @warning Requires CSSTidy <http://csstidy.sourceforge.net/>
+ * @param string $css CSS styling to clean
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @throws HTMLPurifier_Exception
+ * @return string Cleaned CSS
+ */
+ public function cleanCSS($css, $config, $context)
+ {
+ // prepare scope
+ $scope = $config->get('Filter.ExtractStyleBlocks.Scope');
+ if ($scope !== null) {
+ $scopes = array_map('trim', explode(',', $scope));
+ } else {
+ $scopes = array();
+ }
+ // remove comments from CSS
+ $css = trim($css);
+ if (strncmp('<!--', $css, 4) === 0) {
+ $css = substr($css, 4);
+ }
+ if (strlen($css) > 3 && substr($css, -3) == '-->') {
+ $css = substr($css, 0, -3);
+ }
+ $css = trim($css);
+ set_error_handler('htmlpurifier_filter_extractstyleblocks_muteerrorhandler');
+ $this->_tidy->parse($css);
+ restore_error_handler();
+ $css_definition = $config->getDefinition('CSS');
+ $html_definition = $config->getDefinition('HTML');
+ $new_css = array();
+ foreach ($this->_tidy->css as $k => $decls) {
+ // $decls are all CSS declarations inside an @ selector
+ $new_decls = array();
+ foreach ($decls as $selector => $style) {
+ $selector = trim($selector);
+ if ($selector === '') {
+ continue;
+ } // should not happen
+ // Parse the selector
+ // Here is the relevant part of the CSS grammar:
+ //
+ // ruleset
+ // : selector [ ',' S* selector ]* '{' ...
+ // selector
+ // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
+ // combinator
+ // : '+' S*
+ // : '>' S*
+ // simple_selector
+ // : element_name [ HASH | class | attrib | pseudo ]*
+ // | [ HASH | class | attrib | pseudo ]+
+ // element_name
+ // : IDENT | '*'
+ // ;
+ // class
+ // : '.' IDENT
+ // ;
+ // attrib
+ // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
+ // [ IDENT | STRING ] S* ]? ']'
+ // ;
+ // pseudo
+ // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
+ // ;
+ //
+ // For reference, here are the relevant tokens:
+ //
+ // HASH #{name}
+ // IDENT {ident}
+ // INCLUDES ==
+ // DASHMATCH |=
+ // STRING {string}
+ // FUNCTION {ident}\(
+ //
+ // And the lexical scanner tokens
+ //
+ // name {nmchar}+
+ // nmchar [_a-z0-9-]|{nonascii}|{escape}
+ // nonascii [\240-\377]
+ // escape {unicode}|\\[^\r\n\f0-9a-f]
+ // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
+ // ident -?{nmstart}{nmchar*}
+ // nmstart [_a-z]|{nonascii}|{escape}
+ // string {string1}|{string2}
+ // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
+ // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
+ //
+ // We'll implement a subset (in order to reduce attack
+ // surface); in particular:
+ //
+ // - No Unicode support
+ // - No escapes support
+ // - No string support (by proxy no attrib support)
+ // - element_name is matched against allowed
+ // elements (some people might find this
+ // annoying...)
+ // - Pseudo-elements one of :first-child, :link,
+ // :visited, :active, :hover, :focus
+
+ // handle ruleset
+ $selectors = array_map('trim', explode(',', $selector));
+ $new_selectors = array();
+ foreach ($selectors as $sel) {
+ // split on +, > and spaces
+ $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
+ // even indices are chunks, odd indices are
+ // delimiters
+ $nsel = null;
+ $delim = null; // guaranteed to be non-null after
+ // two loop iterations
+ for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
+ $x = $basic_selectors[$i];
+ if ($i % 2) {
+ // delimiter
+ if ($x === ' ') {
+ $delim = ' ';
+ } else {
+ $delim = ' ' . $x . ' ';
+ }
+ } else {
+ // simple selector
+ $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
+ $sdelim = null;
+ $nx = null;
+ for ($j = 0, $cc = count($components); $j < $cc; $j++) {
+ $y = $components[$j];
+ if ($j === 0) {
+ if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
+ $nx = $y;
+ } else {
+ // $nx stays null; this matters
+ // if we don't manage to find
+ // any valid selector content,
+ // in which case we ignore the
+ // outer $delim
+ }
+ } elseif ($j % 2) {
+ // set delimiter
+ $sdelim = $y;
+ } else {
+ $attrdef = null;
+ if ($sdelim === '#') {
+ $attrdef = $this->_id_attrdef;
+ } elseif ($sdelim === '.') {
+ $attrdef = $this->_class_attrdef;
+ } elseif ($sdelim === ':') {
+ $attrdef = $this->_enum_attrdef;
+ } else {
+ throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
+ }
+ $r = $attrdef->validate($y, $config, $context);
+ if ($r !== false) {
+ if ($r !== true) {
+ $y = $r;
+ }
+ if ($nx === null) {
+ $nx = '';
+ }
+ $nx .= $sdelim . $y;
+ }
+ }
+ }
+ if ($nx !== null) {
+ if ($nsel === null) {
+ $nsel = $nx;
+ } else {
+ $nsel .= $delim . $nx;
+ }
+ } else {
+ // delimiters to the left of invalid
+ // basic selector ignored
+ }
+ }
+ }
+ if ($nsel !== null) {
+ if (!empty($scopes)) {
+ foreach ($scopes as $s) {
+ $new_selectors[] = "$s $nsel";
+ }
+ } else {
+ $new_selectors[] = $nsel;
+ }
+ }
+ }
+ if (empty($new_selectors)) {
+ continue;
+ }
+ $selector = implode(', ', $new_selectors);
+ foreach ($style as $name => $value) {
+ if (!isset($css_definition->info[$name])) {
+ unset($style[$name]);
+ continue;
+ }
+ $def = $css_definition->info[$name];
+ $ret = $def->validate($value, $config, $context);
+ if ($ret === false) {
+ unset($style[$name]);
+ } else {
+ $style[$name] = $ret;
+ }
+ }
+ $new_decls[$selector] = $style;
+ }
+ $new_css[$k] = $new_decls;
+ }
+ // remove stuff that shouldn't be used, could be reenabled
+ // after security risks are analyzed
+ $this->_tidy->css = $new_css;
+ $this->_tidy->import = array();
+ $this->_tidy->charset = null;
+ $this->_tidy->namespace = null;
+ $css = $this->_tidy->print->plain();
+ // we are going to escape any special characters <>& to ensure
+ // that no funny business occurs (i.e. </style> in a font-family prop).
+ if ($config->get('Filter.ExtractStyleBlocks.Escaping')) {
+ $css = str_replace(
+ array('<', '>', '&'),
+ array('\3C ', '\3E ', '\26 '),
+ $css
+ );
+ }
+ return $css;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
new file mode 100644
index 000000000..276d8362f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php
@@ -0,0 +1,65 @@
+<?php
+
+class HTMLPurifier_Filter_YouTube extends HTMLPurifier_Filter
+{
+
+ /**
+ * @type string
+ */
+ public $name = 'YouTube';
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function preFilter($html, $config, $context)
+ {
+ $pre_regex = '#<object[^>]+>.+?' .
+ '(?:http:)?//www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s';
+ $pre_replace = '<span class="youtube-embed">\1</span>';
+ return preg_replace($pre_regex, $pre_replace, $html);
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ public function postFilter($html, $config, $context)
+ {
+ $post_regex = '#<span class="youtube-embed">((?:v|cp)/[A-Za-z0-9\-_=]+)</span>#';
+ return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html);
+ }
+
+ /**
+ * @param $url
+ * @return string
+ */
+ protected function armorUrl($url)
+ {
+ return str_replace('--', '-&#45;', $url);
+ }
+
+ /**
+ * @param array $matches
+ * @return string
+ */
+ protected function postFilterCallback($matches)
+ {
+ $url = $this->armorUrl($matches[1]);
+ return '<object width="425" height="350" type="application/x-shockwave-flash" ' .
+ 'data="//www.youtube.com/' . $url . '">' .
+ '<param name="movie" value="//www.youtube.com/' . $url . '"></param>' .
+ '<!--[if IE]>' .
+ '<embed src="//www.youtube.com/' . $url . '"' .
+ 'type="application/x-shockwave-flash"' .
+ 'wmode="transparent" width="425" height="350" />' .
+ '<![endif]-->' .
+ '</object>';
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Generator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
index 6fb568714..6fb568714 100644
--- a/library/HTMLPurifier/Generator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
diff --git a/library/HTMLPurifier/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
index 9b7b334dd..9b7b334dd 100644
--- a/library/HTMLPurifier/HTMLDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php
diff --git a/library/HTMLPurifier/HTMLModule.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
index bb3a9230b..bb3a9230b 100644
--- a/library/HTMLPurifier/HTMLModule.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php
diff --git a/library/HTMLPurifier/HTMLModule/Bdo.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
index 1e67c790d..1e67c790d 100644
--- a/library/HTMLPurifier/HTMLModule/Bdo.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php
diff --git a/library/HTMLPurifier/HTMLModule/CommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
index a96ab1bef..a96ab1bef 100644
--- a/library/HTMLPurifier/HTMLModule/CommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php
diff --git a/library/HTMLPurifier/HTMLModule/Edit.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
index a9042a357..a9042a357 100644
--- a/library/HTMLPurifier/HTMLModule/Edit.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php
diff --git a/library/HTMLPurifier/HTMLModule/Forms.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
index 6f7ddbc05..6f7ddbc05 100644
--- a/library/HTMLPurifier/HTMLModule/Forms.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php
diff --git a/library/HTMLPurifier/HTMLModule/Hypertext.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
index 72d7a31e6..72d7a31e6 100644
--- a/library/HTMLPurifier/HTMLModule/Hypertext.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php
diff --git a/library/HTMLPurifier/HTMLModule/Iframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
index f7e7c91c0..f7e7c91c0 100644
--- a/library/HTMLPurifier/HTMLModule/Iframe.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php
diff --git a/library/HTMLPurifier/HTMLModule/Image.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
index 0f5fdb3ba..0f5fdb3ba 100644
--- a/library/HTMLPurifier/HTMLModule/Image.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php
diff --git a/library/HTMLPurifier/HTMLModule/Legacy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
index 86b529957..86b529957 100644
--- a/library/HTMLPurifier/HTMLModule/Legacy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php
diff --git a/library/HTMLPurifier/HTMLModule/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
index 7a20ff701..7a20ff701 100644
--- a/library/HTMLPurifier/HTMLModule/List.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php
diff --git a/library/HTMLPurifier/HTMLModule/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
index 60c054515..60c054515 100644
--- a/library/HTMLPurifier/HTMLModule/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php
diff --git a/library/HTMLPurifier/HTMLModule/Nofollow.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
index dc9410a89..dc9410a89 100644
--- a/library/HTMLPurifier/HTMLModule/Nofollow.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php
diff --git a/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
index da722253a..da722253a 100644
--- a/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php
diff --git a/library/HTMLPurifier/HTMLModule/Object.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
index 2f9efc5c8..2f9efc5c8 100644
--- a/library/HTMLPurifier/HTMLModule/Object.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php
diff --git a/library/HTMLPurifier/HTMLModule/Presentation.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
index 6458ce9d8..6458ce9d8 100644
--- a/library/HTMLPurifier/HTMLModule/Presentation.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php
diff --git a/library/HTMLPurifier/HTMLModule/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
index 5ee3c8e67..5ee3c8e67 100644
--- a/library/HTMLPurifier/HTMLModule/Proprietary.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php
diff --git a/library/HTMLPurifier/HTMLModule/Ruby.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
index a0d48924d..a0d48924d 100644
--- a/library/HTMLPurifier/HTMLModule/Ruby.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeEmbed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
index 04e6689ea..04e6689ea 100644
--- a/library/HTMLPurifier/HTMLModule/SafeEmbed.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
index 1297f80a3..1297f80a3 100644
--- a/library/HTMLPurifier/HTMLModule/SafeObject.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php
diff --git a/library/HTMLPurifier/HTMLModule/SafeScripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
index 0330cd97f..0330cd97f 100644
--- a/library/HTMLPurifier/HTMLModule/SafeScripting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php
diff --git a/library/HTMLPurifier/HTMLModule/Scripting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
index 8b28a7b7e..8b28a7b7e 100644
--- a/library/HTMLPurifier/HTMLModule/Scripting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php
diff --git a/library/HTMLPurifier/HTMLModule/StyleAttribute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
index 497b832ae..497b832ae 100644
--- a/library/HTMLPurifier/HTMLModule/StyleAttribute.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php
diff --git a/library/HTMLPurifier/HTMLModule/Tables.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
index 8a0b3b461..8a0b3b461 100644
--- a/library/HTMLPurifier/HTMLModule/Tables.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php
diff --git a/library/HTMLPurifier/HTMLModule/Target.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
index b188ac936..b188ac936 100644
--- a/library/HTMLPurifier/HTMLModule/Target.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php
diff --git a/library/HTMLPurifier/HTMLModule/TargetBlank.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
index 58ccc6894..58ccc6894 100644
--- a/library/HTMLPurifier/HTMLModule/TargetBlank.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php
new file mode 100644
index 000000000..b967ff566
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Module adds the target-based noopener attribute transformation to a tags. It
+ * is enabled by HTML.TargetNoopener
+ */
+class HTMLPurifier_HTMLModule_TargetNoopener extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'TargetNoopener';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config) {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoopener();
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php
new file mode 100644
index 000000000..32484d601
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Module adds the target-based noreferrer attribute transformation to a tags. It
+ * is enabled by HTML.TargetNoreferrer
+ */
+class HTMLPurifier_HTMLModule_TargetNoreferrer extends HTMLPurifier_HTMLModule
+{
+ /**
+ * @type string
+ */
+ public $name = 'TargetNoreferrer';
+
+ /**
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config) {
+ $a = $this->addBlankElement('a');
+ $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetNoreferrer();
+ }
+}
diff --git a/library/HTMLPurifier/HTMLModule/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
index 7a65e0048..7a65e0048 100644
--- a/library/HTMLPurifier/HTMLModule/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
index 08aa23247..08aa23247 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Name.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
index a995161b2..a995161b2 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Name.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
index 332643821..332643821 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Strict.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
index 803c44fab..803c44fab 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
index c095ad974..c095ad974 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
index 3ecddc434..3ecddc434 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php
diff --git a/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
index c4f16a4dc..c4f16a4dc 100644
--- a/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php
diff --git a/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
index 01dbe9deb..01dbe9deb 100644
--- a/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
new file mode 100644
index 000000000..38c058fe2
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php
@@ -0,0 +1,467 @@
+<?php
+
+class HTMLPurifier_HTMLModuleManager
+{
+
+ /**
+ * @type HTMLPurifier_DoctypeRegistry
+ */
+ public $doctypes;
+
+ /**
+ * Instance of current doctype.
+ * @type string
+ */
+ public $doctype;
+
+ /**
+ * @type HTMLPurifier_AttrTypes
+ */
+ public $attrTypes;
+
+ /**
+ * Active instances of modules for the specified doctype are
+ * indexed, by name, in this array.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $modules = array();
+
+ /**
+ * Array of recognized HTMLPurifier_HTMLModule instances,
+ * indexed by module's class name. This array is usually lazy loaded, but a
+ * user can overload a module by pre-emptively registering it.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $registeredModules = array();
+
+ /**
+ * List of extra modules that were added by the user
+ * using addModule(). These get unconditionally merged into the current doctype, whatever
+ * it may be.
+ * @type HTMLPurifier_HTMLModule[]
+ */
+ public $userModules = array();
+
+ /**
+ * Associative array of element name to list of modules that have
+ * definitions for the element; this array is dynamically filled.
+ * @type array
+ */
+ public $elementLookup = array();
+
+ /**
+ * List of prefixes we should use for registering small names.
+ * @type array
+ */
+ public $prefixes = array('HTMLPurifier_HTMLModule_');
+
+ /**
+ * @type HTMLPurifier_ContentSets
+ */
+ public $contentSets;
+
+ /**
+ * @type HTMLPurifier_AttrCollections
+ */
+ public $attrCollections;
+
+ /**
+ * If set to true, unsafe elements and attributes will be allowed.
+ * @type bool
+ */
+ public $trusted = false;
+
+ public function __construct()
+ {
+ // editable internal objects
+ $this->attrTypes = new HTMLPurifier_AttrTypes();
+ $this->doctypes = new HTMLPurifier_DoctypeRegistry();
+
+ // setup basic modules
+ $common = array(
+ 'CommonAttributes', 'Text', 'Hypertext', 'List',
+ 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image',
+ 'StyleAttribute',
+ // Unsafe:
+ 'Scripting', 'Object', 'Forms',
+ // Sorta legacy, but present in strict:
+ 'Name',
+ );
+ $transitional = array('Legacy', 'Target', 'Iframe');
+ $xml = array('XMLCommonAttributes');
+ $non_xml = array('NonXMLCommonAttributes');
+
+ // setup basic doctypes
+ $this->doctypes->register(
+ 'HTML 4.01 Transitional',
+ false,
+ array_merge($common, $transitional, $non_xml),
+ array('Tidy_Transitional', 'Tidy_Proprietary'),
+ array(),
+ '-//W3C//DTD HTML 4.01 Transitional//EN',
+ 'http://www.w3.org/TR/html4/loose.dtd'
+ );
+
+ $this->doctypes->register(
+ 'HTML 4.01 Strict',
+ false,
+ array_merge($common, $non_xml),
+ array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD HTML 4.01//EN',
+ 'http://www.w3.org/TR/html4/strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Transitional',
+ true,
+ array_merge($common, $transitional, $xml, $non_xml),
+ array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Transitional//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.0 Strict',
+ true,
+ array_merge($common, $xml, $non_xml),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'),
+ array(),
+ '-//W3C//DTD XHTML 1.0 Strict//EN',
+ 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
+ );
+
+ $this->doctypes->register(
+ 'XHTML 1.1',
+ true,
+ // Iframe is a real XHTML 1.1 module, despite being
+ // "transitional"!
+ array_merge($common, $xml, array('Ruby', 'Iframe')),
+ array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1
+ array(),
+ '-//W3C//DTD XHTML 1.1//EN',
+ 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'
+ );
+
+ }
+
+ /**
+ * Registers a module to the recognized module list, useful for
+ * overloading pre-existing modules.
+ * @param $module Mixed: string module name, with or without
+ * HTMLPurifier_HTMLModule prefix, or instance of
+ * subclass of HTMLPurifier_HTMLModule.
+ * @param $overload Boolean whether or not to overload previous modules.
+ * If this is not set, and you do overload a module,
+ * HTML Purifier will complain with a warning.
+ * @note This function will not call autoload, you must instantiate
+ * (and thus invoke) autoload outside the method.
+ * @note If a string is passed as a module name, different variants
+ * will be tested in this order:
+ * - Check for HTMLPurifier_HTMLModule_$name
+ * - Check all prefixes with $name in order they were added
+ * - Check for literal object name
+ * - Throw fatal error
+ * If your object name collides with an internal class, specify
+ * your module manually. All modules must have been included
+ * externally: registerModule will not perform inclusions for you!
+ */
+ public function registerModule($module, $overload = false)
+ {
+ if (is_string($module)) {
+ // attempt to load the module
+ $original_module = $module;
+ $ok = false;
+ foreach ($this->prefixes as $prefix) {
+ $module = $prefix . $original_module;
+ if (class_exists($module)) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) {
+ $module = $original_module;
+ if (!class_exists($module)) {
+ trigger_error(
+ $original_module . ' module does not exist',
+ E_USER_ERROR
+ );
+ return;
+ }
+ }
+ $module = new $module();
+ }
+ if (empty($module->name)) {
+ trigger_error('Module instance of ' . get_class($module) . ' must have name');
+ return;
+ }
+ if (!$overload && isset($this->registeredModules[$module->name])) {
+ trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING);
+ }
+ $this->registeredModules[$module->name] = $module;
+ }
+
+ /**
+ * Adds a module to the current doctype by first registering it,
+ * and then tacking it on to the active doctype
+ */
+ public function addModule($module)
+ {
+ $this->registerModule($module);
+ if (is_object($module)) {
+ $module = $module->name;
+ }
+ $this->userModules[] = $module;
+ }
+
+ /**
+ * Adds a class prefix that registerModule() will use to resolve a
+ * string name to a concrete class
+ */
+ public function addPrefix($prefix)
+ {
+ $this->prefixes[] = $prefix;
+ }
+
+ /**
+ * Performs processing on modules, after being called you may
+ * use getElement() and getElements()
+ * @param HTMLPurifier_Config $config
+ */
+ public function setup($config)
+ {
+ $this->trusted = $config->get('HTML.Trusted');
+
+ // generate
+ $this->doctype = $this->doctypes->make($config);
+ $modules = $this->doctype->modules;
+
+ // take out the default modules that aren't allowed
+ $lookup = $config->get('HTML.AllowedModules');
+ $special_cases = $config->get('HTML.CoreModules');
+
+ if (is_array($lookup)) {
+ foreach ($modules as $k => $m) {
+ if (isset($special_cases[$m])) {
+ continue;
+ }
+ if (!isset($lookup[$m])) {
+ unset($modules[$k]);
+ }
+ }
+ }
+
+ // custom modules
+ if ($config->get('HTML.Proprietary')) {
+ $modules[] = 'Proprietary';
+ }
+ if ($config->get('HTML.SafeObject')) {
+ $modules[] = 'SafeObject';
+ }
+ if ($config->get('HTML.SafeEmbed')) {
+ $modules[] = 'SafeEmbed';
+ }
+ if ($config->get('HTML.SafeScripting') !== array()) {
+ $modules[] = 'SafeScripting';
+ }
+ if ($config->get('HTML.Nofollow')) {
+ $modules[] = 'Nofollow';
+ }
+ if ($config->get('HTML.TargetBlank')) {
+ $modules[] = 'TargetBlank';
+ }
+ // NB: HTML.TargetNoreferrer and HTML.TargetNoopener must be AFTER HTML.TargetBlank
+ // so that its post-attr-transform gets run afterwards.
+ if ($config->get('HTML.TargetNoreferrer')) {
+ $modules[] = 'TargetNoreferrer';
+ }
+ if ($config->get('HTML.TargetNoopener')) {
+ $modules[] = 'TargetNoopener';
+ }
+
+ // merge in custom modules
+ $modules = array_merge($modules, $this->userModules);
+
+ foreach ($modules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ foreach ($this->doctype->tidyModules as $module) {
+ $this->processModule($module);
+ $this->modules[$module]->setup($config);
+ }
+
+ // prepare any injectors
+ foreach ($this->modules as $module) {
+ $n = array();
+ foreach ($module->info_injector as $injector) {
+ if (!is_object($injector)) {
+ $class = "HTMLPurifier_Injector_$injector";
+ $injector = new $class;
+ }
+ $n[$injector->name] = $injector;
+ }
+ $module->info_injector = $n;
+ }
+
+ // setup lookup table based on all valid modules
+ foreach ($this->modules as $module) {
+ foreach ($module->info as $name => $def) {
+ if (!isset($this->elementLookup[$name])) {
+ $this->elementLookup[$name] = array();
+ }
+ $this->elementLookup[$name][] = $module->name;
+ }
+ }
+
+ // note the different choice
+ $this->contentSets = new HTMLPurifier_ContentSets(
+ // content set assembly deals with all possible modules,
+ // not just ones deemed to be "safe"
+ $this->modules
+ );
+ $this->attrCollections = new HTMLPurifier_AttrCollections(
+ $this->attrTypes,
+ // there is no way to directly disable a global attribute,
+ // but using AllowedAttributes or simply not including
+ // the module in your custom doctype should be sufficient
+ $this->modules
+ );
+ }
+
+ /**
+ * Takes a module and adds it to the active module collection,
+ * registering it if necessary.
+ */
+ public function processModule($module)
+ {
+ if (!isset($this->registeredModules[$module]) || is_object($module)) {
+ $this->registerModule($module);
+ }
+ $this->modules[$module] = $this->registeredModules[$module];
+ }
+
+ /**
+ * Retrieves merged element definitions.
+ * @return Array of HTMLPurifier_ElementDef
+ */
+ public function getElements()
+ {
+ $elements = array();
+ foreach ($this->modules as $module) {
+ if (!$this->trusted && !$module->safe) {
+ continue;
+ }
+ foreach ($module->info as $name => $v) {
+ if (isset($elements[$name])) {
+ continue;
+ }
+ $elements[$name] = $this->getElement($name);
+ }
+ }
+
+ // remove dud elements, this happens when an element that
+ // appeared to be safe actually wasn't
+ foreach ($elements as $n => $v) {
+ if ($v === false) {
+ unset($elements[$n]);
+ }
+ }
+
+ return $elements;
+
+ }
+
+ /**
+ * Retrieves a single merged element definition
+ * @param string $name Name of element
+ * @param bool $trusted Boolean trusted overriding parameter: set to true
+ * if you want the full version of an element
+ * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef
+ * @note You may notice that modules are getting iterated over twice (once
+ * in getElements() and once here). This
+ * is because
+ */
+ public function getElement($name, $trusted = null)
+ {
+ if (!isset($this->elementLookup[$name])) {
+ return false;
+ }
+
+ // setup global state variables
+ $def = false;
+ if ($trusted === null) {
+ $trusted = $this->trusted;
+ }
+
+ // iterate through each module that has registered itself to this
+ // element
+ foreach ($this->elementLookup[$name] as $module_name) {
+ $module = $this->modules[$module_name];
+
+ // refuse to create/merge from a module that is deemed unsafe--
+ // pretend the module doesn't exist--when trusted mode is not on.
+ if (!$trusted && !$module->safe) {
+ continue;
+ }
+
+ // clone is used because, ideally speaking, the original
+ // definition should not be modified. Usually, this will
+ // make no difference, but for consistency's sake
+ $new_def = clone $module->info[$name];
+
+ if (!$def && $new_def->standalone) {
+ $def = $new_def;
+ } elseif ($def) {
+ // This will occur even if $new_def is standalone. In practice,
+ // this will usually result in a full replacement.
+ $def->mergeIn($new_def);
+ } else {
+ // :TODO:
+ // non-standalone definitions that don't have a standalone
+ // to merge into could be deferred to the end
+ // HOWEVER, it is perfectly valid for a non-standalone
+ // definition to lack a standalone definition, even
+ // after all processing: this allows us to safely
+ // specify extra attributes for elements that may not be
+ // enabled all in one place. In particular, this might
+ // be the case for trusted elements. WARNING: care must
+ // be taken that the /extra/ definitions are all safe.
+ continue;
+ }
+
+ // attribute value expansions
+ $this->attrCollections->performInclusions($def->attr);
+ $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes);
+
+ // descendants_are_inline, for ChildDef_Chameleon
+ if (is_string($def->content_model) &&
+ strpos($def->content_model, 'Inline') !== false) {
+ if ($name != 'del' && $name != 'ins') {
+ // this is for you, ins/del
+ $def->descendants_are_inline = true;
+ }
+ }
+
+ $this->contentSets->generateChildDef($def, $module);
+ }
+
+ // This can occur if there is a blank definition, but no base to
+ // mix it in with
+ if (!$def) {
+ return false;
+ }
+
+ // add information on required attributes
+ foreach ($def->attr as $attr_name => $attr_def) {
+ if ($attr_def->required) {
+ $def->required_attr[] = $attr_name;
+ }
+ }
+ return $def;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/IDAccumulator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
index 65c902c07..65c902c07 100644
--- a/library/HTMLPurifier/IDAccumulator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php
diff --git a/library/HTMLPurifier/Injector.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
index 5060eef9e..5060eef9e 100644
--- a/library/HTMLPurifier/Injector.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php
diff --git a/library/HTMLPurifier/Injector/AutoParagraph.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
index 4afdd128d..4afdd128d 100644
--- a/library/HTMLPurifier/Injector/AutoParagraph.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php
diff --git a/library/HTMLPurifier/Injector/DisplayLinkURI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
index c19b1bc27..c19b1bc27 100644
--- a/library/HTMLPurifier/Injector/DisplayLinkURI.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
new file mode 100644
index 000000000..74f83eaa7
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * Injector that converts http, https and ftp text URLs to actual links.
+ */
+class HTMLPurifier_Injector_Linkify extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'Linkify';
+
+ /**
+ * @type array
+ */
+ public $needed = array('a' => array('href'));
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleText(&$token)
+ {
+ if (!$this->allowsElement('a')) {
+ return;
+ }
+
+ if (strpos($token->data, '://') === false) {
+ // our really quick heuristic failed, abort
+ // this may not work so well if we want to match things like
+ // "google.com", but then again, most people don't
+ return;
+ }
+
+ // there is/are URL(s). Let's split the string.
+ // We use this regex:
+ // https://gist.github.com/gruber/249502
+ // but with @cscott's backtracking fix and also
+ // the Unicode characters un-Unicodified.
+ $bits = preg_split(
+ '/\\b((?:[a-z][\\w\\-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\))+(?:\\((?:[^\\s()<>]|(?:\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\x{00ab}\x{00bb}\x{201c}\x{201d}\x{2018}\x{2019}]))/iu',
+ $token->data, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+
+ $token = array();
+
+ // $i = index
+ // $c = count
+ // $l = is link
+ for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) {
+ if (!$l) {
+ if ($bits[$i] === '') {
+ continue;
+ }
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ } else {
+ $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i]));
+ $token[] = new HTMLPurifier_Token_Text($bits[$i]);
+ $token[] = new HTMLPurifier_Token_End('a');
+ }
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/PurifierLinkify.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
index cb9046f33..cb9046f33 100644
--- a/library/HTMLPurifier/Injector/PurifierLinkify.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
new file mode 100644
index 000000000..0ebc477c6
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php
@@ -0,0 +1,112 @@
+<?php
+
+class HTMLPurifier_Injector_RemoveEmpty extends HTMLPurifier_Injector
+{
+ /**
+ * @type HTMLPurifier_Context
+ */
+ private $context;
+
+ /**
+ * @type HTMLPurifier_Config
+ */
+ private $config;
+
+ /**
+ * @type HTMLPurifier_AttrValidator
+ */
+ private $attrValidator;
+
+ /**
+ * @type bool
+ */
+ private $removeNbsp;
+
+ /**
+ * @type bool
+ */
+ private $removeNbspExceptions;
+
+ /**
+ * Cached contents of %AutoFormat.RemoveEmpty.Predicate
+ * @type array
+ */
+ private $exclude;
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ $this->config = $config;
+ $this->context = $context;
+ $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp');
+ $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions');
+ $this->exclude = $config->get('AutoFormat.RemoveEmpty.Predicate');
+ foreach ($this->exclude as $key => $attrs) {
+ if (!is_array($attrs)) {
+ // HACK, see HTMLPurifier/Printer/ConfigForm.php
+ $this->exclude[$key] = explode(';', $attrs);
+ }
+ }
+ $this->attrValidator = new HTMLPurifier_AttrValidator();
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if (!$token instanceof HTMLPurifier_Token_Start) {
+ return;
+ }
+ $next = false;
+ $deleted = 1; // the current tag
+ for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) {
+ $next = $this->inputZipper->back[$i];
+ if ($next instanceof HTMLPurifier_Token_Text) {
+ if ($next->is_whitespace) {
+ continue;
+ }
+ if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) {
+ $plain = str_replace("\xC2\xA0", "", $next->data);
+ $isWsOrNbsp = $plain === '' || ctype_space($plain);
+ if ($isWsOrNbsp) {
+ continue;
+ }
+ }
+ }
+ break;
+ }
+ if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) {
+ $this->attrValidator->validateToken($token, $this->config, $this->context);
+ $token->armor['ValidateAttributes'] = true;
+ if (isset($this->exclude[$token->name])) {
+ $r = true;
+ foreach ($this->exclude[$token->name] as $elem) {
+ if (!isset($token->attr[$elem])) $r = false;
+ }
+ if ($r) return;
+ }
+ if (isset($token->attr['id']) || isset($token->attr['name'])) {
+ return;
+ }
+ $token = $deleted + 1;
+ for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) {
+ $prev = $this->inputZipper->front[$b];
+ if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) {
+ continue;
+ }
+ break;
+ }
+ // This is safe because we removed the token that triggered this.
+ $this->rewindOffset($b+$deleted);
+ return;
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
index 9ee7aa84d..9ee7aa84d 100644
--- a/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
new file mode 100644
index 000000000..317f7864d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * Adds important param elements to inside of object in order to make
+ * things safe.
+ */
+class HTMLPurifier_Injector_SafeObject extends HTMLPurifier_Injector
+{
+ /**
+ * @type string
+ */
+ public $name = 'SafeObject';
+
+ /**
+ * @type array
+ */
+ public $needed = array('object', 'param');
+
+ /**
+ * @type array
+ */
+ protected $objectStack = array();
+
+ /**
+ * @type array
+ */
+ protected $paramStack = array();
+
+ /**
+ * Keep this synchronized with AttrTransform/SafeParam.php.
+ * @type array
+ */
+ protected $addParam = array(
+ 'allowScriptAccess' => 'never',
+ 'allowNetworking' => 'internal',
+ );
+
+ /**
+ * These are all lower-case keys.
+ * @type array
+ */
+ protected $allowedParam = array(
+ 'wmode' => true,
+ 'movie' => true,
+ 'flashvars' => true,
+ 'src' => true,
+ 'allowfullscreen' => true, // if omitted, assume to be 'false'
+ );
+
+ /**
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return void
+ */
+ public function prepare($config, $context)
+ {
+ parent::prepare($config, $context);
+ }
+
+ /**
+ * @param HTMLPurifier_Token $token
+ */
+ public function handleElement(&$token)
+ {
+ if ($token->name == 'object') {
+ $this->objectStack[] = $token;
+ $this->paramStack[] = array();
+ $new = array($token);
+ foreach ($this->addParam as $name => $value) {
+ $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value));
+ }
+ $token = $new;
+ } elseif ($token->name == 'param') {
+ $nest = count($this->currentNesting) - 1;
+ if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') {
+ $i = count($this->objectStack) - 1;
+ if (!isset($token->attr['name'])) {
+ $token = false;
+ return;
+ }
+ $n = $token->attr['name'];
+ // We need this fix because YouTube doesn't supply a data
+ // attribute, which we need if a type is specified. This is
+ // *very* Flash specific.
+ if (!isset($this->objectStack[$i]->attr['data']) &&
+ ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src')
+ ) {
+ $this->objectStack[$i]->attr['data'] = $token->attr['value'];
+ }
+ // Check if the parameter is the correct value but has not
+ // already been added
+ if (!isset($this->paramStack[$i][$n]) &&
+ isset($this->addParam[$n]) &&
+ $token->attr['name'] === $this->addParam[$n]) {
+ // keep token, and add to param stack
+ $this->paramStack[$i][$n] = true;
+ } elseif (isset($this->allowedParam[strtolower($n)])) {
+ // keep token, don't do anything to it
+ // (could possibly check for duplicates here)
+ // Note: In principle, parameters should be case sensitive.
+ // But it seems they are not really; so accept any case.
+ } else {
+ $token = false;
+ }
+ } else {
+ // not directly inside an object, DENY!
+ $token = false;
+ }
+ }
+ }
+
+ public function handleEnd(&$token)
+ {
+ // This is the WRONG way of handling the object and param stacks;
+ // we should be inserting them directly on the relevant object tokens
+ // so that the global stack handling handles it.
+ if ($token->name == 'object') {
+ array_pop($this->objectStack);
+ array_pop($this->paramStack);
+ }
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Language.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
index 65277dd43..65277dd43 100644
--- a/library/HTMLPurifier/Language.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php
diff --git a/library/HTMLPurifier/Language/classes/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
index 8828f5cde..8828f5cde 100644
--- a/library/HTMLPurifier/Language/classes/en-x-test.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.php
diff --git a/library/HTMLPurifier/Language/messages/en-x-test.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
index 1c046f379..1c046f379 100644
--- a/library/HTMLPurifier/Language/messages/en-x-test.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-test.php
diff --git a/library/HTMLPurifier/Language/messages/en-x-testmini.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
index 806c83fbf..806c83fbf 100644
--- a/library/HTMLPurifier/Language/messages/en-x-testmini.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en-x-testmini.php
diff --git a/library/HTMLPurifier/Language/messages/en.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
index c7f197e1e..c7f197e1e 100644
--- a/library/HTMLPurifier/Language/messages/en.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php
diff --git a/library/HTMLPurifier/LanguageFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
index 4e35272d8..4e35272d8 100644
--- a/library/HTMLPurifier/LanguageFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php
diff --git a/library/HTMLPurifier/Length.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
index bbfbe6624..bbfbe6624 100644
--- a/library/HTMLPurifier/Length.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
new file mode 100644
index 000000000..99b3c7df0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
@@ -0,0 +1,382 @@
+<?php
+
+/**
+ * Forgivingly lexes HTML (SGML-style) markup into tokens.
+ *
+ * A lexer parses a string of SGML-style markup and converts them into
+ * corresponding tokens. It doesn't check for well-formedness, although its
+ * internal mechanism may make this automatic (such as the case of
+ * HTMLPurifier_Lexer_DOMLex). There are several implementations to choose
+ * from.
+ *
+ * A lexer is HTML-oriented: it might work with XML, but it's not
+ * recommended, as we adhere to a subset of the specification for optimization
+ * reasons. This might change in the future. Also, most tokenizers are not
+ * expected to handle DTDs or PIs.
+ *
+ * This class should not be directly instantiated, but you may use create() to
+ * retrieve a default copy of the lexer. Being a supertype, this class
+ * does not actually define any implementation, but offers commonly used
+ * convenience functions for subclasses.
+ *
+ * @note The unit tests will instantiate this class for testing purposes, as
+ * many of the utility functions require a class to be instantiated.
+ * This means that, even though this class is not runnable, it will
+ * not be declared abstract.
+ *
+ * @par
+ *
+ * @note
+ * We use tokens rather than create a DOM representation because DOM would:
+ *
+ * @par
+ * -# Require more processing and memory to create,
+ * -# Is not streamable, and
+ * -# Has the entire document structure (html and body not needed).
+ *
+ * @par
+ * However, DOM is helpful in that it makes it easy to move around nodes
+ * without a lot of lookaheads to see when a tag is closed. This is a
+ * limitation of the token system and some workarounds would be nice.
+ */
+class HTMLPurifier_Lexer
+{
+
+ /**
+ * Whether or not this lexer implements line-number/column-number tracking.
+ * If it does, set to true.
+ */
+ public $tracksLineNumbers = false;
+
+ // -- STATIC ----------------------------------------------------------
+
+ /**
+ * Retrieves or sets the default Lexer as a Prototype Factory.
+ *
+ * By default HTMLPurifier_Lexer_DOMLex will be returned. There are
+ * a few exceptions involving special features that only DirectLex
+ * implements.
+ *
+ * @note The behavior of this class has changed, rather than accepting
+ * a prototype object, it now accepts a configuration object.
+ * To specify your own prototype, set %Core.LexerImpl to it.
+ * This change in behavior de-singletonizes the lexer object.
+ *
+ * @param HTMLPurifier_Config $config
+ * @return HTMLPurifier_Lexer
+ * @throws HTMLPurifier_Exception
+ */
+ public static function create($config)
+ {
+ if (!($config instanceof HTMLPurifier_Config)) {
+ $lexer = $config;
+ trigger_error(
+ "Passing a prototype to
+ HTMLPurifier_Lexer::create() is deprecated, please instead
+ use %Core.LexerImpl",
+ E_USER_WARNING
+ );
+ } else {
+ $lexer = $config->get('Core.LexerImpl');
+ }
+
+ $needs_tracking =
+ $config->get('Core.MaintainLineNumbers') ||
+ $config->get('Core.CollectErrors');
+
+ $inst = null;
+ if (is_object($lexer)) {
+ $inst = $lexer;
+ } else {
+ if (is_null($lexer)) {
+ do {
+ // auto-detection algorithm
+ if ($needs_tracking) {
+ $lexer = 'DirectLex';
+ break;
+ }
+
+ if (class_exists('DOMDocument') &&
+ method_exists('DOMDocument', 'loadHTML') &&
+ !extension_loaded('domxml')
+ ) {
+ // check for DOM support, because while it's part of the
+ // core, it can be disabled compile time. Also, the PECL
+ // domxml extension overrides the default DOM, and is evil
+ // and nasty and we shan't bother to support it
+ $lexer = 'DOMLex';
+ } else {
+ $lexer = 'DirectLex';
+ }
+ } while (0);
+ } // do..while so we can break
+
+ // instantiate recognized string names
+ switch ($lexer) {
+ case 'DOMLex':
+ $inst = new HTMLPurifier_Lexer_DOMLex();
+ break;
+ case 'DirectLex':
+ $inst = new HTMLPurifier_Lexer_DirectLex();
+ break;
+ case 'PH5P':
+ $inst = new HTMLPurifier_Lexer_PH5P();
+ break;
+ default:
+ throw new HTMLPurifier_Exception(
+ "Cannot instantiate unrecognized Lexer type " .
+ htmlspecialchars($lexer)
+ );
+ }
+ }
+
+ if (!$inst) {
+ throw new HTMLPurifier_Exception('No lexer was instantiated');
+ }
+
+ // once PHP DOM implements native line numbers, or we
+ // hack out something using XSLT, remove this stipulation
+ if ($needs_tracking && !$inst->tracksLineNumbers) {
+ throw new HTMLPurifier_Exception(
+ 'Cannot use lexer that does not support line numbers with ' .
+ 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'
+ );
+ }
+
+ return $inst;
+
+ }
+
+ // -- CONVENIENCE MEMBERS ---------------------------------------------
+
+ public function __construct()
+ {
+ $this->_entity_parser = new HTMLPurifier_EntityParser();
+ }
+
+ /**
+ * Most common entity to raw value conversion table for special entities.
+ * @type array
+ */
+ protected $_special_entity2str =
+ array(
+ '&quot;' => '"',
+ '&amp;' => '&',
+ '&lt;' => '<',
+ '&gt;' => '>',
+ '&#39;' => "'",
+ '&#039;' => "'",
+ '&#x27;' => "'"
+ );
+
+ public function parseText($string, $config) {
+ return $this->parseData($string, false, $config);
+ }
+
+ public function parseAttr($string, $config) {
+ return $this->parseData($string, true, $config);
+ }
+
+ /**
+ * Parses special entities into the proper characters.
+ *
+ * This string will translate escaped versions of the special characters
+ * into the correct ones.
+ *
+ * @param string $string String character data to be parsed.
+ * @return string Parsed character data.
+ */
+ public function parseData($string, $is_attr, $config)
+ {
+ // following functions require at least one character
+ if ($string === '') {
+ return '';
+ }
+
+ // subtracts amps that cannot possibly be escaped
+ $num_amp = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if (!$num_amp) {
+ return $string;
+ } // abort if no entities
+ $num_esc_amp = substr_count($string, '&amp;');
+ $string = strtr($string, $this->_special_entity2str);
+
+ // code duplication for sake of optimization, see above
+ $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') -
+ ($string[strlen($string) - 1] === '&' ? 1 : 0);
+
+ if ($num_amp_2 <= $num_esc_amp) {
+ return $string;
+ }
+
+ // hmm... now we have some uncommon entities. Use the callback.
+ if ($config->get('Core.LegacyEntityDecoder')) {
+ $string = $this->_entity_parser->substituteSpecialEntities($string);
+ } else {
+ if ($is_attr) {
+ $string = $this->_entity_parser->substituteAttrEntities($string);
+ } else {
+ $string = $this->_entity_parser->substituteTextEntities($string);
+ }
+ }
+ return $string;
+ }
+
+ /**
+ * Lexes an HTML string into tokens.
+ * @param $string String HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[] array representation of HTML.
+ */
+ public function tokenizeHTML($string, $config, $context)
+ {
+ trigger_error('Call to abstract class', E_USER_ERROR);
+ }
+
+ /**
+ * Translates CDATA sections into regular sections (through escaping).
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCDATA($string)
+ {
+ return preg_replace_callback(
+ '/<!\[CDATA\[(.+?)\]\]>/s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special CDATA case that is especially convoluted for <script>
+ * @param string $string HTML string to process.
+ * @return string HTML with CDATA sections escaped.
+ */
+ protected static function escapeCommentedCDATA($string)
+ {
+ return preg_replace_callback(
+ '#<!--//--><!\[CDATA\[//><!--(.+?)//--><!\]\]>#s',
+ array('HTMLPurifier_Lexer', 'CDATACallback'),
+ $string
+ );
+ }
+
+ /**
+ * Special Internet Explorer conditional comments should be removed.
+ * @param string $string HTML string to process.
+ * @return string HTML with conditional comments removed.
+ */
+ protected static function removeIEConditional($string)
+ {
+ return preg_replace(
+ '#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
+ '',
+ $string
+ );
+ }
+
+ /**
+ * Callback function for escapeCDATA() that does the work.
+ *
+ * @warning Though this is public in order to let the callback happen,
+ * calling it directly is not recommended.
+ * @param array $matches PCRE matches array, with index 0 the entire match
+ * and 1 the inside of the CDATA section.
+ * @return string Escaped internals of the CDATA section.
+ */
+ protected static function CDATACallback($matches)
+ {
+ // not exactly sure why the character set is needed, but whatever
+ return htmlspecialchars($matches[1], ENT_COMPAT, 'UTF-8');
+ }
+
+ /**
+ * Takes a piece of HTML and normalizes it by converting entities, fixing
+ * encoding, extracting bits, and other good stuff.
+ * @param string $html HTML.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ * @todo Consider making protected
+ */
+ public function normalize($html, $config, $context)
+ {
+ // normalize newlines to \n
+ if ($config->get('Core.NormalizeNewlines')) {
+ $html = str_replace("\r\n", "\n", $html);
+ $html = str_replace("\r", "\n", $html);
+ }
+
+ if ($config->get('HTML.Trusted')) {
+ // escape convoluted CDATA
+ $html = $this->escapeCommentedCDATA($html);
+ }
+
+ // escape CDATA
+ $html = $this->escapeCDATA($html);
+
+ $html = $this->removeIEConditional($html);
+
+ // extract body from document if applicable
+ if ($config->get('Core.ConvertDocumentToFragment')) {
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+ $new_html = $this->extractBody($html);
+ if ($e && $new_html != $html) {
+ $e->send(E_WARNING, 'Lexer: Extracted body');
+ }
+ $html = $new_html;
+ }
+
+ // expand entities that aren't the big five
+ if ($config->get('Core.LegacyEntityDecoder')) {
+ $html = $this->_entity_parser->substituteNonSpecialEntities($html);
+ }
+
+ // clean into wellformed UTF-8 string for an SGML context: this has
+ // to be done after entity expansion because the entities sometimes
+ // represent non-SGML characters (horror, horror!)
+ $html = HTMLPurifier_Encoder::cleanUTF8($html);
+
+ // if processing instructions are to removed, remove them now
+ if ($config->get('Core.RemoveProcessingInstructions')) {
+ $html = preg_replace('#<\?.+?\?>#s', '', $html);
+ }
+
+ $hidden_elements = $config->get('Core.HiddenElements');
+ if ($config->get('Core.AggressivelyRemoveScript') &&
+ !($config->get('HTML.Trusted') || !$config->get('Core.RemoveScriptContents')
+ || empty($hidden_elements["script"]))) {
+ $html = preg_replace('#<script[^>]*>.*?</script>#i', '', $html);
+ }
+
+ return $html;
+ }
+
+ /**
+ * Takes a string of HTML (fragment or document) and returns the content
+ * @todo Consider making protected
+ */
+ public function extractBody($html)
+ {
+ $matches = array();
+ $result = preg_match('|(.*?)<body[^>]*>(.*)</body>|is', $html, $matches);
+ if ($result) {
+ // Make sure it's not in a comment
+ $comment_start = strrpos($matches[1], '<!--');
+ $comment_end = strrpos($matches[1], '-->');
+ if ($comment_start === false ||
+ ($comment_end !== false && $comment_end > $comment_start)) {
+ return $matches[2];
+ }
+ }
+ return $html;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
new file mode 100644
index 000000000..22ab5820c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php
@@ -0,0 +1,291 @@
+<?php
+
+/**
+ * Parser that uses PHP 5's DOM extension (part of the core).
+ *
+ * In PHP 5, the DOM XML extension was revamped into DOM and added to the core.
+ * It gives us a forgiving HTML parser, which we use to transform the HTML
+ * into a DOM, and then into the tokens. It is blazingly fast (for large
+ * documents, it performs twenty times faster than
+ * HTMLPurifier_Lexer_DirectLex,and is the default choice for PHP 5.
+ *
+ * @note Any empty elements will have empty tokens associated with them, even if
+ * this is prohibited by the spec. This is cannot be fixed until the spec
+ * comes into play.
+ *
+ * @note PHP's DOM extension does not actually parse any entities, we use
+ * our own function to do that.
+ *
+ * @warning DOM tends to drop whitespace, which may wreak havoc on indenting.
+ * If this is a huge problem, due to the fact that HTML is hand
+ * edited and you are unable to get a parser cache that caches the
+ * the output of HTML Purifier while keeping the original HTML lying
+ * around, you may want to run Tidy on the resulting output or use
+ * HTMLPurifier_DirectLex
+ */
+
+class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
+{
+
+ /**
+ * @type HTMLPurifier_TokenFactory
+ */
+ private $factory;
+
+ public function __construct()
+ {
+ // setup the factory
+ parent::__construct();
+ $this->factory = new HTMLPurifier_TokenFactory();
+ }
+
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $html = $this->normalize($html, $config, $context);
+
+ // attempt to armor stray angled brackets that cannot possibly
+ // form tags and thus are probably being used as emoticons
+ if ($config->get('Core.AggressivelyFixLt')) {
+ $char = '[^a-z!\/]';
+ $comment = "/<!--(.*?)(-->|\z)/is";
+ $html = preg_replace_callback($comment, array($this, 'callbackArmorCommentEntities'), $html);
+ do {
+ $old = $html;
+ $html = preg_replace("/<($char)/i", '&lt;\\1', $html);
+ } while ($html !== $old);
+ $html = preg_replace_callback($comment, array($this, 'callbackUndoCommentSubst'), $html); // fix comments
+ }
+
+ // preprocess html, essential for UTF-8
+ $html = $this->wrapHTML($html, $config, $context);
+
+ $doc = new DOMDocument();
+ $doc->encoding = 'UTF-8'; // theoretically, the above has this covered
+
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $doc->loadHTML($html);
+ restore_error_handler();
+
+ $body = $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0); // <body>
+
+ $div = $body->getElementsByTagName('div')->item(0); // <div>
+ $tokens = array();
+ $this->tokenizeDOM($div, $tokens, $config);
+ // If the div has a sibling, that means we tripped across
+ // a premature </div> tag. So remove the div we parsed,
+ // and then tokenize the rest of body. We can't tokenize
+ // the sibling directly as we'll lose the tags in that case.
+ if ($div->nextSibling) {
+ $body->removeChild($div);
+ $this->tokenizeDOM($body, $tokens, $config);
+ }
+ return $tokens;
+ }
+
+ /**
+ * Iterative function that tokenizes a node, putting it into an accumulator.
+ * To iterate is human, to recurse divine - L. Peter Deutsch
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @return HTMLPurifier_Token of node appended to previously passed tokens.
+ */
+ protected function tokenizeDOM($node, &$tokens, $config)
+ {
+ $level = 0;
+ $nodes = array($level => new HTMLPurifier_Queue(array($node)));
+ $closingNodes = array();
+ do {
+ while (!$nodes[$level]->isEmpty()) {
+ $node = $nodes[$level]->shift(); // FIFO
+ $collect = $level > 0 ? true : false;
+ $needEndingTag = $this->createStartNode($node, $tokens, $collect, $config);
+ if ($needEndingTag) {
+ $closingNodes[$level][] = $node;
+ }
+ if ($node->childNodes && $node->childNodes->length) {
+ $level++;
+ $nodes[$level] = new HTMLPurifier_Queue();
+ foreach ($node->childNodes as $childNode) {
+ $nodes[$level]->push($childNode);
+ }
+ }
+ }
+ $level--;
+ if ($level && isset($closingNodes[$level])) {
+ while ($node = array_pop($closingNodes[$level])) {
+ $this->createEndNode($node, $tokens);
+ }
+ }
+ } while ($level > 0);
+ }
+
+ /**
+ * @param DOMNode $node DOMNode to be tokenized.
+ * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
+ * @param bool $collect Says whether or start and close are collected, set to
+ * false at first recursion because it's the implicit DIV
+ * tag you're dealing with.
+ * @return bool if the token needs an endtoken
+ * @todo data and tagName properties don't seem to exist in DOMNode?
+ */
+ protected function createStartNode($node, &$tokens, $collect, $config)
+ {
+ // intercept non element nodes. WE MUST catch all of them,
+ // but we're not getting the character reference nodes because
+ // those should have been preprocessed
+ if ($node->nodeType === XML_TEXT_NODE) {
+ $tokens[] = $this->factory->createText($node->data);
+ return false;
+ } elseif ($node->nodeType === XML_CDATA_SECTION_NODE) {
+ // undo libxml's special treatment of <script> and <style> tags
+ $last = end($tokens);
+ $data = $node->data;
+ // (note $node->tagname is already normalized)
+ if ($last instanceof HTMLPurifier_Token_Start && ($last->name == 'script' || $last->name == 'style')) {
+ $new_data = trim($data);
+ if (substr($new_data, 0, 4) === '<!--') {
+ $data = substr($new_data, 4);
+ if (substr($data, -3) === '-->') {
+ $data = substr($data, 0, -3);
+ } else {
+ // Highly suspicious! Not sure what to do...
+ }
+ }
+ }
+ $tokens[] = $this->factory->createText($this->parseText($data, $config));
+ return false;
+ } elseif ($node->nodeType === XML_COMMENT_NODE) {
+ // this is code is only invoked for comments in script/style in versions
+ // of libxml pre-2.6.28 (regular comments, of course, are still
+ // handled regularly)
+ $tokens[] = $this->factory->createComment($node->data);
+ return false;
+ } elseif ($node->nodeType !== XML_ELEMENT_NODE) {
+ // not-well tested: there may be other nodes we have to grab
+ return false;
+ }
+
+ $attr = $node->hasAttributes() ? $this->transformAttrToAssoc($node->attributes) : array();
+
+ // We still have to make sure that the element actually IS empty
+ if (!$node->childNodes->length) {
+ if ($collect) {
+ $tokens[] = $this->factory->createEmpty($node->tagName, $attr);
+ }
+ return false;
+ } else {
+ if ($collect) {
+ $tokens[] = $this->factory->createStart(
+ $tag_name = $node->tagName, // somehow, it get's dropped
+ $attr
+ );
+ }
+ return true;
+ }
+ }
+
+ /**
+ * @param DOMNode $node
+ * @param HTMLPurifier_Token[] $tokens
+ */
+ protected function createEndNode($node, &$tokens)
+ {
+ $tokens[] = $this->factory->createEnd($node->tagName);
+ }
+
+
+ /**
+ * Converts a DOMNamedNodeMap of DOMAttr objects into an assoc array.
+ *
+ * @param DOMNamedNodeMap $node_map DOMNamedNodeMap of DOMAttr objects.
+ * @return array Associative array of attributes.
+ */
+ protected function transformAttrToAssoc($node_map)
+ {
+ // NamedNodeMap is documented very well, so we're using undocumented
+ // features, namely, the fact that it implements Iterator and
+ // has a ->length attribute
+ if ($node_map->length === 0) {
+ return array();
+ }
+ $array = array();
+ foreach ($node_map as $attr) {
+ $array[$attr->name] = $attr->value;
+ }
+ return $array;
+ }
+
+ /**
+ * An error handler that mutes all errors
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+
+ /**
+ * Callback function for undoing escaping of stray angled brackets
+ * in comments
+ * @param array $matches
+ * @return string
+ */
+ public function callbackUndoCommentSubst($matches)
+ {
+ return '<!--' . strtr($matches[1], array('&amp;' => '&', '&lt;' => '<')) . $matches[2];
+ }
+
+ /**
+ * Callback function that entity-izes ampersands in comments so that
+ * callbackUndoCommentSubst doesn't clobber them
+ * @param array $matches
+ * @return string
+ */
+ public function callbackArmorCommentEntities($matches)
+ {
+ return '<!--' . str_replace('&', '&amp;', $matches[1]) . $matches[2];
+ }
+
+ /**
+ * Wraps an HTML fragment in the necessary HTML
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return string
+ */
+ protected function wrapHTML($html, $config, $context, $use_div = true)
+ {
+ $def = $config->getDefinition('HTML');
+ $ret = '';
+
+ if (!empty($def->doctype->dtdPublic) || !empty($def->doctype->dtdSystem)) {
+ $ret .= '<!DOCTYPE html ';
+ if (!empty($def->doctype->dtdPublic)) {
+ $ret .= 'PUBLIC "' . $def->doctype->dtdPublic . '" ';
+ }
+ if (!empty($def->doctype->dtdSystem)) {
+ $ret .= '"' . $def->doctype->dtdSystem . '" ';
+ }
+ $ret .= '>';
+ }
+
+ $ret .= '<html><head>';
+ $ret .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
+ // No protection if $html contains a stray </div>!
+ $ret .= '</head><body>';
+ if ($use_div) $ret .= '<div>';
+ $ret .= $html;
+ if ($use_div) $ret .= '</div>';
+ $ret .= '</body></html>';
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
new file mode 100644
index 000000000..6f1308966
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php
@@ -0,0 +1,539 @@
+<?php
+
+/**
+ * Our in-house implementation of a parser.
+ *
+ * A pure PHP parser, DirectLex has absolutely no dependencies, making
+ * it a reasonably good default for PHP4. Written with efficiency in mind,
+ * it can be four times faster than HTMLPurifier_Lexer_PEARSax3, although it
+ * pales in comparison to HTMLPurifier_Lexer_DOMLex.
+ *
+ * @todo Reread XML spec and document differences.
+ */
+class HTMLPurifier_Lexer_DirectLex extends HTMLPurifier_Lexer
+{
+ /**
+ * @type bool
+ */
+ public $tracksLineNumbers = true;
+
+ /**
+ * Whitespace characters for str(c)spn.
+ * @type string
+ */
+ protected $_whitespace = "\x20\x09\x0D\x0A";
+
+ /**
+ * Callback function for script CDATA fudge
+ * @param array $matches, in form of array(opening tag, contents, closing tag)
+ * @return string
+ */
+ protected function scriptCallback($matches)
+ {
+ return $matches[1] . htmlspecialchars($matches[2], ENT_COMPAT, 'UTF-8') . $matches[3];
+ }
+
+ /**
+ * @param String $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array|HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ // special normalization for script tags without any armor
+ // our "armor" heurstic is a < sign any number of whitespaces after
+ // the first script tag
+ if ($config->get('HTML.Trusted')) {
+ $html = preg_replace_callback(
+ '#(<script[^>]*>)(\s*[^<].+?)(</script>)#si',
+ array($this, 'scriptCallback'),
+ $html
+ );
+ }
+
+ $html = $this->normalize($html, $config, $context);
+
+ $cursor = 0; // our location in the text
+ $inside_tag = false; // whether or not we're parsing the inside of a tag
+ $array = array(); // result array
+
+ // This is also treated to mean maintain *column* numbers too
+ $maintain_line_numbers = $config->get('Core.MaintainLineNumbers');
+
+ if ($maintain_line_numbers === null) {
+ // automatically determine line numbering by checking
+ // if error collection is on
+ $maintain_line_numbers = $config->get('Core.CollectErrors');
+ }
+
+ if ($maintain_line_numbers) {
+ $current_line = 1;
+ $current_col = 0;
+ $length = strlen($html);
+ } else {
+ $current_line = false;
+ $current_col = false;
+ $length = false;
+ }
+ $context->register('CurrentLine', $current_line);
+ $context->register('CurrentCol', $current_col);
+ $nl = "\n";
+ // how often to manually recalculate. This will ALWAYS be right,
+ // but it's pretty wasteful. Set to 0 to turn off
+ $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval');
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // for testing synchronization
+ $loops = 0;
+
+ while (++$loops) {
+ // $cursor is either at the start of a token, or inside of
+ // a tag (i.e. there was a < immediately before it), as indicated
+ // by $inside_tag
+
+ if ($maintain_line_numbers) {
+ // $rcursor, however, is always at the start of a token.
+ $rcursor = $cursor - (int)$inside_tag;
+
+ // Column number is cheap, so we calculate it every round.
+ // We're interested at the *end* of the newline string, so
+ // we need to add strlen($nl) == 1 to $nl_pos before subtracting it
+ // from our "rcursor" position.
+ $nl_pos = strrpos($html, $nl, $rcursor - $length);
+ $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1);
+
+ // recalculate lines
+ if ($synchronize_interval && // synchronization is on
+ $cursor > 0 && // cursor is further than zero
+ $loops % $synchronize_interval === 0) { // time to synchronize!
+ $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor);
+ }
+ }
+
+ $position_next_lt = strpos($html, '<', $cursor);
+ $position_next_gt = strpos($html, '>', $cursor);
+
+ // triggers on "<b>asdf</b>" but not "asdf <b></b>"
+ // special case to set up context
+ if ($position_next_lt === $cursor) {
+ $inside_tag = true;
+ $cursor++;
+ }
+
+ if (!$inside_tag && $position_next_lt !== false) {
+ // We are not inside tag and there still is another tag to parse
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseText(
+ substr(
+ $html,
+ $cursor,
+ $position_next_lt - $cursor
+ ), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_lt + 1;
+ $inside_tag = true;
+ continue;
+ } elseif (!$inside_tag) {
+ // We are not inside tag but there are no more tags
+ // If we're already at the end, break
+ if ($cursor === strlen($html)) {
+ break;
+ }
+ // Create Text of rest of string
+ $token = new
+ HTMLPurifier_Token_Text(
+ $this->parseText(
+ substr(
+ $html,
+ $cursor
+ ), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ $array[] = $token;
+ break;
+ } elseif ($inside_tag && $position_next_gt !== false) {
+ // We are in tag and it is well formed
+ // Grab the internals of the tag
+ $strlen_segment = $position_next_gt - $cursor;
+
+ if ($strlen_segment < 1) {
+ // there's nothing to process!
+ $token = new HTMLPurifier_Token_Text('<');
+ $cursor++;
+ continue;
+ }
+
+ $segment = substr($html, $cursor, $strlen_segment);
+
+ if ($segment === false) {
+ // somehow, we attempted to access beyond the end of
+ // the string, defense-in-depth, reported by Nate Abele
+ break;
+ }
+
+ // Check if it's a comment
+ if (substr($segment, 0, 3) === '!--') {
+ // re-determine segment length, looking for -->
+ $position_comment_end = strpos($html, '-->', $cursor);
+ if ($position_comment_end === false) {
+ // uh oh, we have a comment that extends to
+ // infinity. Can't be helped: set comment
+ // end position to end of string
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Unclosed comment');
+ }
+ $position_comment_end = strlen($html);
+ $end = true;
+ } else {
+ $end = false;
+ }
+ $strlen_segment = $position_comment_end - $cursor;
+ $segment = substr($html, $cursor, $strlen_segment);
+ $token = new
+ HTMLPurifier_Token_Comment(
+ substr(
+ $segment,
+ 3,
+ $strlen_segment - 3
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment);
+ }
+ $array[] = $token;
+ $cursor = $end ? $position_comment_end : $position_comment_end + 3;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it's an end tag
+ $is_end_tag = (strpos($segment, '/') === 0);
+ if ($is_end_tag) {
+ $type = substr($segment, 1);
+ $token = new HTMLPurifier_Token_End($type);
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Check leading character is alnum, if not, we may
+ // have accidently grabbed an emoticon. Translate into
+ // text and go our merry way
+ if (!ctype_alpha($segment[0])) {
+ // XML: $segment[0] !== '_' && $segment[0] !== ':'
+ if ($e) {
+ $e->send(E_NOTICE, 'Lexer: Unescaped lt');
+ }
+ $token = new HTMLPurifier_Token_Text('<');
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ continue;
+ }
+
+ // Check if it is explicitly self closing, if so, remove
+ // trailing slash. Remember, we could have a tag like <br>, so
+ // any later token processing scripts must convert improperly
+ // classified EmptyTags from StartTags.
+ $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1);
+ if ($is_self_closing) {
+ $strlen_segment--;
+ $segment = substr($segment, 0, $strlen_segment);
+ }
+
+ // Check if there are any attributes
+ $position_first_space = strcspn($segment, $this->_whitespace);
+
+ if ($position_first_space >= $strlen_segment) {
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($segment);
+ } else {
+ $token = new HTMLPurifier_Token_Start($segment);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $inside_tag = false;
+ $cursor = $position_next_gt + 1;
+ continue;
+ }
+
+ // Grab out all the data
+ $type = substr($segment, 0, $position_first_space);
+ $attribute_string =
+ trim(
+ substr(
+ $segment,
+ $position_first_space
+ )
+ );
+ if ($attribute_string) {
+ $attr = $this->parseAttributeString(
+ $attribute_string,
+ $config,
+ $context
+ );
+ } else {
+ $attr = array();
+ }
+
+ if ($is_self_closing) {
+ $token = new HTMLPurifier_Token_Empty($type, $attr);
+ } else {
+ $token = new HTMLPurifier_Token_Start($type, $attr);
+ }
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor);
+ }
+ $array[] = $token;
+ $cursor = $position_next_gt + 1;
+ $inside_tag = false;
+ continue;
+ } else {
+ // inside tag, but there's no ending > sign
+ if ($e) {
+ $e->send(E_WARNING, 'Lexer: Missing gt');
+ }
+ $token = new
+ HTMLPurifier_Token_Text(
+ '<' .
+ $this->parseText(
+ substr($html, $cursor), $config
+ )
+ );
+ if ($maintain_line_numbers) {
+ $token->rawPosition($current_line, $current_col);
+ }
+ // no cursor scroll? Hmm...
+ $array[] = $token;
+ break;
+ }
+ break;
+ }
+
+ $context->destroy('CurrentLine');
+ $context->destroy('CurrentCol');
+ return $array;
+ }
+
+ /**
+ * PHP 5.0.x compatible substr_count that implements offset and length
+ * @param string $haystack
+ * @param string $needle
+ * @param int $offset
+ * @param int $length
+ * @return int
+ */
+ protected function substrCount($haystack, $needle, $offset, $length)
+ {
+ static $oldVersion;
+ if ($oldVersion === null) {
+ $oldVersion = version_compare(PHP_VERSION, '5.1', '<');
+ }
+ if ($oldVersion) {
+ $haystack = substr($haystack, $offset, $length);
+ return substr_count($haystack, $needle);
+ } else {
+ return substr_count($haystack, $needle, $offset, $length);
+ }
+ }
+
+ /**
+ * Takes the inside of an HTML tag and makes an assoc array of attributes.
+ *
+ * @param string $string Inside of tag excluding name.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return array Assoc array of attributes.
+ */
+ public function parseAttributeString($string, $config, $context)
+ {
+ $string = (string)$string; // quick typecast
+
+ if ($string == '') {
+ return array();
+ } // no attributes
+
+ $e = false;
+ if ($config->get('Core.CollectErrors')) {
+ $e =& $context->get('ErrorCollector');
+ }
+
+ // let's see if we can abort as quickly as possible
+ // one equal sign, no spaces => one attribute
+ $num_equal = substr_count($string, '=');
+ $has_space = strpos($string, ' ');
+ if ($num_equal === 0 && !$has_space) {
+ // bool attribute
+ return array($string => $string);
+ } elseif ($num_equal === 1 && !$has_space) {
+ // only one attribute
+ list($key, $quoted_value) = explode('=', $string);
+ $quoted_value = trim($quoted_value);
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ return array();
+ }
+ if (!$quoted_value) {
+ return array($key => '');
+ }
+ $first_char = @$quoted_value[0];
+ $last_char = @$quoted_value[strlen($quoted_value) - 1];
+
+ $same_quote = ($first_char == $last_char);
+ $open_quote = ($first_char == '"' || $first_char == "'");
+
+ if ($same_quote && $open_quote) {
+ // well behaved
+ $value = substr($quoted_value, 1, strlen($quoted_value) - 2);
+ } else {
+ // not well behaved
+ if ($open_quote) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing end quote');
+ }
+ $value = substr($quoted_value, 1);
+ } else {
+ $value = $quoted_value;
+ }
+ }
+ if ($value === false) {
+ $value = '';
+ }
+ return array($key => $this->parseAttr($value, $config));
+ }
+
+ // setup loop environment
+ $array = array(); // return assoc array of attributes
+ $cursor = 0; // current position in string (moves forward)
+ $size = strlen($string); // size of the string (stays the same)
+
+ // if we have unquoted attributes, the parser expects a terminating
+ // space, so let's guarantee that there's always a terminating space.
+ $string .= ' ';
+
+ $old_cursor = -1;
+ while ($cursor < $size) {
+ if ($old_cursor >= $cursor) {
+ throw new Exception("Infinite loop detected");
+ }
+ $old_cursor = $cursor;
+
+ $cursor += ($value = strspn($string, $this->_whitespace, $cursor));
+ // grab the key
+
+ $key_begin = $cursor; //we're currently at the start of the key
+
+ // scroll past all characters that are the key (not whitespace or =)
+ $cursor += strcspn($string, $this->_whitespace . '=', $cursor);
+
+ $key_end = $cursor; // now at the end of the key
+
+ $key = substr($string, $key_begin, $key_end - $key_begin);
+
+ if (!$key) {
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop
+ continue; // empty key
+ }
+
+ // scroll past all whitespace
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor >= $size) {
+ $array[$key] = $key;
+ break;
+ }
+
+ // if the next character is an equal sign, we've got a regular
+ // pair, otherwise, it's a bool attribute
+ $first_char = @$string[$cursor];
+
+ if ($first_char == '=') {
+ // key="value"
+
+ $cursor++;
+ $cursor += strspn($string, $this->_whitespace, $cursor);
+
+ if ($cursor === false) {
+ $array[$key] = '';
+ break;
+ }
+
+ // we might be in front of a quote right now
+
+ $char = @$string[$cursor];
+
+ if ($char == '"' || $char == "'") {
+ // it's quoted, end bound is $char
+ $cursor++;
+ $value_begin = $cursor;
+ $cursor = strpos($string, $char, $cursor);
+ $value_end = $cursor;
+ } else {
+ // it's not quoted, end bound is whitespace
+ $value_begin = $cursor;
+ $cursor += strcspn($string, $this->_whitespace, $cursor);
+ $value_end = $cursor;
+ }
+
+ // we reached a premature end
+ if ($cursor === false) {
+ $cursor = $size;
+ $value_end = $cursor;
+ }
+
+ $value = substr($string, $value_begin, $value_end - $value_begin);
+ if ($value === false) {
+ $value = '';
+ }
+ $array[$key] = $this->parseAttr($value, $config);
+ $cursor++;
+ } else {
+ // boolattr
+ if ($key !== '') {
+ $array[$key] = $key;
+ } else {
+ // purely theoretical
+ if ($e) {
+ $e->send(E_ERROR, 'Lexer: Missing attribute key');
+ }
+ }
+ }
+ }
+ return $array;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
new file mode 100644
index 000000000..0b452d17f
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php
@@ -0,0 +1,4788 @@
+<?php
+
+/**
+ * Experimental HTML5-based parser using Jeroen van der Meer's PH5P library.
+ * Occupies space in the HTML5 pseudo-namespace, which may cause conflicts.
+ *
+ * @note
+ * Recent changes to PHP's DOM extension have resulted in some fatal
+ * error conditions with the original version of PH5P. Pending changes,
+ * this lexer will punt to DirectLex if DOM throws an exception.
+ */
+
+class HTMLPurifier_Lexer_PH5P extends HTMLPurifier_Lexer_DOMLex
+{
+ /**
+ * @param string $html
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ */
+ public function tokenizeHTML($html, $config, $context)
+ {
+ $new_html = $this->normalize($html, $config, $context);
+ $new_html = $this->wrapHTML($new_html, $config, $context, false /* no div */);
+ try {
+ $parser = new HTML5($new_html);
+ $doc = $parser->save();
+ } catch (DOMException $e) {
+ // Uh oh, it failed. Punt to DirectLex.
+ $lexer = new HTMLPurifier_Lexer_DirectLex();
+ $context->register('PH5PError', $e); // save the error, so we can detect it
+ return $lexer->tokenizeHTML($html, $config, $context); // use original HTML
+ }
+ $tokens = array();
+ $this->tokenizeDOM(
+ $doc->getElementsByTagName('html')->item(0)-> // <html>
+ getElementsByTagName('body')->item(0) // <body>
+ ,
+ $tokens, $config
+ );
+ return $tokens;
+ }
+}
+
+/*
+
+Copyright 2007 Jeroen van der Meer <http://jero.net/>
+
+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.
+
+*/
+
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array(
+ 'AElig;',
+ 'AElig',
+ 'AMP;',
+ 'AMP',
+ 'Aacute;',
+ 'Aacute',
+ 'Acirc;',
+ 'Acirc',
+ 'Agrave;',
+ 'Agrave',
+ 'Alpha;',
+ 'Aring;',
+ 'Aring',
+ 'Atilde;',
+ 'Atilde',
+ 'Auml;',
+ 'Auml',
+ 'Beta;',
+ 'COPY;',
+ 'COPY',
+ 'Ccedil;',
+ 'Ccedil',
+ 'Chi;',
+ 'Dagger;',
+ 'Delta;',
+ 'ETH;',
+ 'ETH',
+ 'Eacute;',
+ 'Eacute',
+ 'Ecirc;',
+ 'Ecirc',
+ 'Egrave;',
+ 'Egrave',
+ 'Epsilon;',
+ 'Eta;',
+ 'Euml;',
+ 'Euml',
+ 'GT;',
+ 'GT',
+ 'Gamma;',
+ 'Iacute;',
+ 'Iacute',
+ 'Icirc;',
+ 'Icirc',
+ 'Igrave;',
+ 'Igrave',
+ 'Iota;',
+ 'Iuml;',
+ 'Iuml',
+ 'Kappa;',
+ 'LT;',
+ 'LT',
+ 'Lambda;',
+ 'Mu;',
+ 'Ntilde;',
+ 'Ntilde',
+ 'Nu;',
+ 'OElig;',
+ 'Oacute;',
+ 'Oacute',
+ 'Ocirc;',
+ 'Ocirc',
+ 'Ograve;',
+ 'Ograve',
+ 'Omega;',
+ 'Omicron;',
+ 'Oslash;',
+ 'Oslash',
+ 'Otilde;',
+ 'Otilde',
+ 'Ouml;',
+ 'Ouml',
+ 'Phi;',
+ 'Pi;',
+ 'Prime;',
+ 'Psi;',
+ 'QUOT;',
+ 'QUOT',
+ 'REG;',
+ 'REG',
+ 'Rho;',
+ 'Scaron;',
+ 'Sigma;',
+ 'THORN;',
+ 'THORN',
+ 'TRADE;',
+ 'Tau;',
+ 'Theta;',
+ 'Uacute;',
+ 'Uacute',
+ 'Ucirc;',
+ 'Ucirc',
+ 'Ugrave;',
+ 'Ugrave',
+ 'Upsilon;',
+ 'Uuml;',
+ 'Uuml',
+ 'Xi;',
+ 'Yacute;',
+ 'Yacute',
+ 'Yuml;',
+ 'Zeta;',
+ 'aacute;',
+ 'aacute',
+ 'acirc;',
+ 'acirc',
+ 'acute;',
+ 'acute',
+ 'aelig;',
+ 'aelig',
+ 'agrave;',
+ 'agrave',
+ 'alefsym;',
+ 'alpha;',
+ 'amp;',
+ 'amp',
+ 'and;',
+ 'ang;',
+ 'apos;',
+ 'aring;',
+ 'aring',
+ 'asymp;',
+ 'atilde;',
+ 'atilde',
+ 'auml;',
+ 'auml',
+ 'bdquo;',
+ 'beta;',
+ 'brvbar;',
+ 'brvbar',
+ 'bull;',
+ 'cap;',
+ 'ccedil;',
+ 'ccedil',
+ 'cedil;',
+ 'cedil',
+ 'cent;',
+ 'cent',
+ 'chi;',
+ 'circ;',
+ 'clubs;',
+ 'cong;',
+ 'copy;',
+ 'copy',
+ 'crarr;',
+ 'cup;',
+ 'curren;',
+ 'curren',
+ 'dArr;',
+ 'dagger;',
+ 'darr;',
+ 'deg;',
+ 'deg',
+ 'delta;',
+ 'diams;',
+ 'divide;',
+ 'divide',
+ 'eacute;',
+ 'eacute',
+ 'ecirc;',
+ 'ecirc',
+ 'egrave;',
+ 'egrave',
+ 'empty;',
+ 'emsp;',
+ 'ensp;',
+ 'epsilon;',
+ 'equiv;',
+ 'eta;',
+ 'eth;',
+ 'eth',
+ 'euml;',
+ 'euml',
+ 'euro;',
+ 'exist;',
+ 'fnof;',
+ 'forall;',
+ 'frac12;',
+ 'frac12',
+ 'frac14;',
+ 'frac14',
+ 'frac34;',
+ 'frac34',
+ 'frasl;',
+ 'gamma;',
+ 'ge;',
+ 'gt;',
+ 'gt',
+ 'hArr;',
+ 'harr;',
+ 'hearts;',
+ 'hellip;',
+ 'iacute;',
+ 'iacute',
+ 'icirc;',
+ 'icirc',
+ 'iexcl;',
+ 'iexcl',
+ 'igrave;',
+ 'igrave',
+ 'image;',
+ 'infin;',
+ 'int;',
+ 'iota;',
+ 'iquest;',
+ 'iquest',
+ 'isin;',
+ 'iuml;',
+ 'iuml',
+ 'kappa;',
+ 'lArr;',
+ 'lambda;',
+ 'lang;',
+ 'laquo;',
+ 'laquo',
+ 'larr;',
+ 'lceil;',
+ 'ldquo;',
+ 'le;',
+ 'lfloor;',
+ 'lowast;',
+ 'loz;',
+ 'lrm;',
+ 'lsaquo;',
+ 'lsquo;',
+ 'lt;',
+ 'lt',
+ 'macr;',
+ 'macr',
+ 'mdash;',
+ 'micro;',
+ 'micro',
+ 'middot;',
+ 'middot',
+ 'minus;',
+ 'mu;',
+ 'nabla;',
+ 'nbsp;',
+ 'nbsp',
+ 'ndash;',
+ 'ne;',
+ 'ni;',
+ 'not;',
+ 'not',
+ 'notin;',
+ 'nsub;',
+ 'ntilde;',
+ 'ntilde',
+ 'nu;',
+ 'oacute;',
+ 'oacute',
+ 'ocirc;',
+ 'ocirc',
+ 'oelig;',
+ 'ograve;',
+ 'ograve',
+ 'oline;',
+ 'omega;',
+ 'omicron;',
+ 'oplus;',
+ 'or;',
+ 'ordf;',
+ 'ordf',
+ 'ordm;',
+ 'ordm',
+ 'oslash;',
+ 'oslash',
+ 'otilde;',
+ 'otilde',
+ 'otimes;',
+ 'ouml;',
+ 'ouml',
+ 'para;',
+ 'para',
+ 'part;',
+ 'permil;',
+ 'perp;',
+ 'phi;',
+ 'pi;',
+ 'piv;',
+ 'plusmn;',
+ 'plusmn',
+ 'pound;',
+ 'pound',
+ 'prime;',
+ 'prod;',
+ 'prop;',
+ 'psi;',
+ 'quot;',
+ 'quot',
+ 'rArr;',
+ 'radic;',
+ 'rang;',
+ 'raquo;',
+ 'raquo',
+ 'rarr;',
+ 'rceil;',
+ 'rdquo;',
+ 'real;',
+ 'reg;',
+ 'reg',
+ 'rfloor;',
+ 'rho;',
+ 'rlm;',
+ 'rsaquo;',
+ 'rsquo;',
+ 'sbquo;',
+ 'scaron;',
+ 'sdot;',
+ 'sect;',
+ 'sect',
+ 'shy;',
+ 'shy',
+ 'sigma;',
+ 'sigmaf;',
+ 'sim;',
+ 'spades;',
+ 'sub;',
+ 'sube;',
+ 'sum;',
+ 'sup1;',
+ 'sup1',
+ 'sup2;',
+ 'sup2',
+ 'sup3;',
+ 'sup3',
+ 'sup;',
+ 'supe;',
+ 'szlig;',
+ 'szlig',
+ 'tau;',
+ 'there4;',
+ 'theta;',
+ 'thetasym;',
+ 'thinsp;',
+ 'thorn;',
+ 'thorn',
+ 'tilde;',
+ 'times;',
+ 'times',
+ 'trade;',
+ 'uArr;',
+ 'uacute;',
+ 'uacute',
+ 'uarr;',
+ 'ucirc;',
+ 'ucirc',
+ 'ugrave;',
+ 'ugrave',
+ 'uml;',
+ 'uml',
+ 'upsih;',
+ 'upsilon;',
+ 'uuml;',
+ 'uuml',
+ 'weierp;',
+ 'xi;',
+ 'yacute;',
+ 'yacute',
+ 'yen;',
+ 'yen',
+ 'yuml;',
+ 'yuml',
+ 'zeta;',
+ 'zwj;',
+ 'zwnj;'
+ );
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while ($this->state !== null) {
+ $this->{$this->state . 'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if ($s + $l < $this->EOF) {
+ if ($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif ($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if (($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--'
+ ) {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif ($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))
+ ) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif ($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->'
+ ) {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif ($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ )
+ );
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ )
+ );
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch ($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if ($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match(
+ '/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))
+ ) || $this->EOF === $this->char)))
+ ) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(
+ array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif ($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif ($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if ($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif ($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif ($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState();
+
+ } elseif ($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(
+ array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ )
+ );
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if ($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if ($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if ($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif ($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--' . $char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken(
+ array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ )
+ );
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif (preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if ($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif ($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch ($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch ($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for ($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if (in_array($id, $this->entities)) {
+ if ($e_name[$c - 1] !== ';') {
+ if ($c < $len && $e_name[$c] == ';') {
+ $this->char++; // consume extra semicolon
+ }
+ }
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if (!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&' . rtrim($entity, ';') . ';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if (is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif ($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(
+ array(
+ 'type' => self::EOF
+ )
+ );
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th');
+ private $formatting = array(
+ 'a',
+ 'b',
+ 'big',
+ 'em',
+ 'font',
+ 'i',
+ 'nobr',
+ 's',
+ 'small',
+ 'strike',
+ 'strong',
+ 'tt',
+ 'u'
+ );
+ private $special = array(
+ 'address',
+ 'area',
+ 'base',
+ 'basefont',
+ 'bgsound',
+ 'blockquote',
+ 'body',
+ 'br',
+ 'center',
+ 'col',
+ 'colgroup',
+ 'dd',
+ 'dir',
+ 'div',
+ 'dl',
+ 'dt',
+ 'embed',
+ 'fieldset',
+ 'form',
+ 'frame',
+ 'frameset',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'head',
+ 'hr',
+ 'iframe',
+ 'image',
+ 'img',
+ 'input',
+ 'isindex',
+ 'li',
+ 'link',
+ 'listing',
+ 'menu',
+ 'meta',
+ 'noembed',
+ 'noframes',
+ 'noscript',
+ 'ol',
+ 'optgroup',
+ 'option',
+ 'p',
+ 'param',
+ 'plaintext',
+ 'pre',
+ 'script',
+ 'select',
+ 'spacer',
+ 'style',
+ 'tbody',
+ 'textarea',
+ 'tfoot',
+ 'thead',
+ 'title',
+ 'tr',
+ 'ul',
+ 'wbr'
+ );
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch ($this->phase) {
+ case self::INIT_PHASE:
+ return $this->initPhase($token);
+ break;
+ case self::ROOT_PHASE:
+ return $this->rootElementPhase($token);
+ break;
+ case self::MAIN_PHASE:
+ return $this->mainPhase($token);
+ break;
+ case self::END_PHASE :
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if ((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))
+ ) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif (isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif (isset($token['data']) && preg_match(
+ '/^[\t\n\x0b\x0c ]+$/',
+ $token['data']
+ )
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF
+ ) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch ($this->mode) {
+ case self::BEFOR_HEAD:
+ return $this->beforeHead($token);
+ break;
+ case self::IN_HEAD:
+ return $this->inHead($token);
+ break;
+ case self::AFTER_HEAD:
+ return $this->afterHead($token);
+ break;
+ case self::IN_BODY:
+ return $this->inBody($token);
+ break;
+ case self::IN_TABLE:
+ return $this->inTable($token);
+ break;
+ case self::IN_CAPTION:
+ return $this->inCaption($token);
+ break;
+ case self::IN_CGROUP:
+ return $this->inColumnGroup($token);
+ break;
+ case self::IN_TBODY:
+ return $this->inTableBody($token);
+ break;
+ case self::IN_ROW:
+ return $this->inRow($token);
+ break;
+ case self::IN_CELL:
+ return $this->inCell($token);
+ break;
+ case self::IN_SELECT:
+ return $this->inSelect($token);
+ break;
+ case self::AFTER_BODY:
+ return $this->afterBody($token);
+ break;
+ case self::IN_FRAME:
+ return $this->inFrameset($token);
+ break;
+ case self::AFTR_FRAME:
+ return $this->afterFrameset($token);
+ break;
+ case self::END_PHASE:
+ return $this->trailingEndPhase($token);
+ break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif ($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match(
+ '/^[\t\n\x0b\x0c ]$/',
+ $token['data']
+ ))
+ ) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif ($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(
+ end($this->stack)->nodeName,
+ array('title', 'style', 'script')
+ ))
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))
+ ) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta')
+ )
+ ) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if ($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if ($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(
+ array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title')
+ )
+ ) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch ($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch ($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script':
+ case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base':
+ case 'link':
+ case 'meta':
+ case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach ($token['attr'] as $attr) {
+ if (!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'p':
+ case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if ($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li':
+ case 'dd':
+ case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for ($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if ($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))
+ ) {
+ for ($x = $stack_length; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if ($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div'
+ ) {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ if ($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(
+ array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if ($this->elementInScope('button')) {
+ $this->inBody(
+ array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee':
+ case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'img':
+ case 'param':
+ case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if ($this->elementInScope('p')) {
+ $this->emitToken(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if ($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(
+ array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ )
+ );
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText(
+ 'This is a searchable index. ' .
+ 'Insert your search keywords here: '
+ );
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(
+ array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe':
+ case 'noembed':
+ case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'frame':
+ case 'frameset':
+ case 'head':
+ case 'option':
+ case 'optgroup':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source':
+ case 'section':
+ case 'nav':
+ case 'article':
+ case 'aside':
+ case 'header':
+ case 'footer':
+ case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token, true, true);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch ($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif (end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(
+ array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address':
+ case 'blockquote':
+ case 'center':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'listing':
+ case 'menu':
+ case 'ol':
+ case 'pre':
+ case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if (end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if ($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd':
+ case 'dt':
+ case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if ($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while ($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a':
+ case 'b':
+ case 'big':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while (true) {
+ for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if ($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if (!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))
+ ) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif (isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for ($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if ($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if (!isset($furthest_block)) {
+ for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if ($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while (true) {
+ for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if (!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if ($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif ($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if ($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if ($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while ($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button':
+ case 'marquee':
+ case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if ($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area':
+ case 'basefont':
+ case 'bgsound':
+ case 'br':
+ case 'embed':
+ case 'hr':
+ case 'iframe':
+ case 'image':
+ case 'img':
+ case 'input':
+ case 'isindex':
+ case 'noembed':
+ case 'noframes':
+ case 'param':
+ case 'select':
+ case 'spacer':
+ case 'table':
+ case 'textarea':
+ case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if ($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for ($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if ($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col'
+ ) {
+ $this->inTable(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('tbody', 'tfoot', 'thead')
+ )
+ ) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))
+ ) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(
+ array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(
+ array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if (in_array(
+ end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif (!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif (isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)
+ ) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')
+ ) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(
+ array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array(
+ 'body',
+ 'col',
+ 'colgroup',
+ 'html',
+ 'tbody',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup'
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(
+ array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ )
+ );
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif (($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead')
+ )) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')
+ ) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(
+ array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if ($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')
+ ) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(
+ array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if ($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif ($token['type'] === HTML5::STARTTAG && in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'col',
+ 'colgroup',
+ 'tbody',
+ 'td',
+ 'tfoot',
+ 'th',
+ 'thead',
+ 'tr'
+ )
+ )
+ ) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if (!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html')
+ )
+ ) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif ($token['type'] === HTML5::ENDTAG && in_array(
+ $token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr')
+ )
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if (!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if ($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if (end($this->stack)->nodeName === 'option') {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if (end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(
+ array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup'
+ ) {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup'
+ ) {
+ $this->inSelect(
+ array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if ($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option'
+ ) {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if (end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select'
+ ) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if (!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while (true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if ($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif ($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif (in_array(
+ $token['name'],
+ array(
+ 'caption',
+ 'table',
+ 'tbody',
+ 'tfoot',
+ 'thead',
+ 'tr',
+ 'td',
+ 'th'
+ )
+ ) && $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if ($this->elementInScope($token['name'], true)) {
+ $this->inSelect(
+ array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif ($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if (end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif ($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif ($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif ($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG
+ ) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if ($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif ($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif ($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])
+ ) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif (($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG
+ ) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif ($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true, $check = false)
+ {
+ // Proprietary workaround for libxml2's limitations with tag names
+ if ($check) {
+ // Slightly modified HTML5 tag-name modification,
+ // removing anything that's not an ASCII letter, digit, or hyphen
+ $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
+ // Remove leading hyphens and numbers
+ $token['name'] = ltrim($token['name'], '-0..9');
+ // In theory, this should ever be needed, but just in case
+ if ($token['name'] === '') {
+ $token['name'] = 'span';
+ } // arbitrary generic choice
+ }
+
+ $el = $this->dom->createElement($token['name']);
+
+ foreach ($token['attr'] as $attr) {
+ if (!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if ($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif ($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for ($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if ($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null
+ ) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) {
+ $this->foster_parent->insertBefore($node, $table);
+ } else {
+ $this->foster_parent->appendChild($node);
+ }
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if (is_array($el)) {
+ foreach ($el as $element) {
+ if ($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for ($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if ($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif ($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif ($table === true && in_array(
+ $node->tagName,
+ array(
+ 'caption',
+ 'td',
+ 'th',
+ 'button',
+ 'marquee',
+ 'object'
+ )
+ )
+ ) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif ($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if ($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for ($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if ($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while (true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if (isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if (end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while (true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if ($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags($exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while (in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($node)
+ {
+ $name = $node->tagName;
+ if (in_array($name, $this->special)) {
+ return self::SPECIAL;
+ } elseif (in_array($name, $this->scoping)) {
+ return self::SCOPING;
+ } elseif (in_array($name, $this->formatting)) {
+ return self::FORMATTING;
+ } else {
+ return self::PHRASING;
+ }
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while (true) {
+ $node = end($this->stack)->nodeName;
+
+ if (in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for ($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if ($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if ($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif ($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif ($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif ($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif ($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif ($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif ($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif ($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach (array('td', 'th') as $cell) {
+ if ($this->elementInScope($cell, true)) {
+ $this->inCell(
+ array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ )
+ );
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/library/HTMLPurifier/Node.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
index 3995fec9f..3995fec9f 100644
--- a/library/HTMLPurifier/Node.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php
diff --git a/library/HTMLPurifier/Node/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
index 38ba19394..38ba19394 100644
--- a/library/HTMLPurifier/Node/Comment.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php
diff --git a/library/HTMLPurifier/Node/Element.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
index 6cbf56dad..6cbf56dad 100644
--- a/library/HTMLPurifier/Node/Element.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php
diff --git a/library/HTMLPurifier/Node/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
index aec916647..aec916647 100644
--- a/library/HTMLPurifier/Node/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php
diff --git a/library/HTMLPurifier/PercentEncoder.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
index 18c8bbb00..18c8bbb00 100644
--- a/library/HTMLPurifier/PercentEncoder.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php
diff --git a/library/HTMLPurifier/Printer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
index 549e4cea1..549e4cea1 100644
--- a/library/HTMLPurifier/Printer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php
diff --git a/library/HTMLPurifier/Printer/CSSDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
index 29505fe12..29505fe12 100644
--- a/library/HTMLPurifier/Printer/CSSDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php
diff --git a/library/HTMLPurifier/Printer/ConfigForm.css b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
index 3ff1a88aa..3ff1a88aa 100644
--- a/library/HTMLPurifier/Printer/ConfigForm.css
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.css
diff --git a/library/HTMLPurifier/Printer/ConfigForm.js b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
index cba00c9b8..cba00c9b8 100644
--- a/library/HTMLPurifier/Printer/ConfigForm.js
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.js
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
new file mode 100644
index 000000000..65a777904
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php
@@ -0,0 +1,451 @@
+<?php
+
+/**
+ * @todo Rewrite to use Interchange objects
+ */
+class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
+{
+
+ /**
+ * Printers for specific fields.
+ * @type HTMLPurifier_Printer[]
+ */
+ protected $fields = array();
+
+ /**
+ * Documentation URL, can have fragment tagged on end.
+ * @type string
+ */
+ protected $docURL;
+
+ /**
+ * Name of form element to stuff config in.
+ * @type string
+ */
+ protected $name;
+
+ /**
+ * Whether or not to compress directive names, clipping them off
+ * after a certain amount of letters. False to disable or integer letters
+ * before clipping.
+ * @type bool
+ */
+ protected $compress = false;
+
+ /**
+ * @param string $name Form element name for directives to be stuffed into
+ * @param string $doc_url String documentation URL, will have fragment tagged on
+ * @param bool $compress Integer max length before compressing a directive name, set to false to turn off
+ */
+ public function __construct(
+ $name,
+ $doc_url = null,
+ $compress = false
+ ) {
+ parent::__construct();
+ $this->docURL = $doc_url;
+ $this->name = $name;
+ $this->compress = $compress;
+ // initialize sub-printers
+ $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default();
+ $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool();
+ }
+
+ /**
+ * Sets default column and row size for textareas in sub-printers
+ * @param $cols Integer columns of textarea, null to use default
+ * @param $rows Integer rows of textarea, null to use default
+ */
+ public function setTextareaDimensions($cols = null, $rows = null)
+ {
+ if ($cols) {
+ $this->fields['default']->cols = $cols;
+ }
+ if ($rows) {
+ $this->fields['default']->rows = $rows;
+ }
+ }
+
+ /**
+ * Retrieves styling, in case it is not accessible by webserver
+ */
+ public static function getCSS()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css');
+ }
+
+ /**
+ * Retrieves JavaScript, in case it is not accessible by webserver
+ */
+ public static function getJavaScript()
+ {
+ return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js');
+ }
+
+ /**
+ * Returns HTML output for a configuration form
+ * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array
+ * where [0] has an HTML namespace and [1] is being rendered.
+ * @param array|bool $allowed Optional namespace(s) and directives to restrict form to.
+ * @param bool $render_controls
+ * @return string
+ */
+ public function render($config, $allowed = true, $render_controls = true)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+
+ $this->config = $config;
+ $this->genConfig = $gen_config;
+ $this->prepareGenerator($gen_config);
+
+ $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def);
+ $all = array();
+ foreach ($allowed as $key) {
+ list($ns, $directive) = $key;
+ $all[$ns][$directive] = $config->get($ns . '.' . $directive);
+ }
+
+ $ret = '';
+ $ret .= $this->start('table', array('class' => 'hp-config'));
+ $ret .= $this->start('thead');
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive'));
+ $ret .= $this->element('th', 'Value', array('class' => 'hp-value'));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('thead');
+ foreach ($all as $ns => $directives) {
+ $ret .= $this->renderNamespace($ns, $directives);
+ }
+ if ($render_controls) {
+ $ret .= $this->start('tbody');
+ $ret .= $this->start('tr');
+ $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls'));
+ $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit'));
+ $ret .= '[<a href="?">Reset</a>]';
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ }
+ $ret .= $this->end('table');
+ return $ret;
+ }
+
+ /**
+ * Renders a single namespace
+ * @param $ns String namespace name
+ * @param array $directives array of directives to values
+ * @return string
+ */
+ protected function renderNamespace($ns, $directives)
+ {
+ $ret = '';
+ $ret .= $this->start('tbody', array('class' => 'namespace'));
+ $ret .= $this->start('tr');
+ $ret .= $this->element('th', $ns, array('colspan' => 2));
+ $ret .= $this->end('tr');
+ $ret .= $this->end('tbody');
+ $ret .= $this->start('tbody');
+ foreach ($directives as $directive => $value) {
+ $ret .= $this->start('tr');
+ $ret .= $this->start('th');
+ if ($this->docURL) {
+ $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL);
+ $ret .= $this->start('a', array('href' => $url));
+ }
+ $attr = array('for' => "{$this->name}:$ns.$directive");
+
+ // crop directive name if it's too long
+ if (!$this->compress || (strlen($directive) < $this->compress)) {
+ $directive_disp = $directive;
+ } else {
+ $directive_disp = substr($directive, 0, $this->compress - 2) . '...';
+ $attr['title'] = $directive;
+ }
+
+ $ret .= $this->element(
+ 'label',
+ $directive_disp,
+ // component printers must create an element with this id
+ $attr
+ );
+ if ($this->docURL) {
+ $ret .= $this->end('a');
+ }
+ $ret .= $this->end('th');
+
+ $ret .= $this->start('td');
+ $def = $this->config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $allow_null = $def < 0;
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ $allow_null = isset($def->allow_null);
+ }
+ if (!isset($this->fields[$type])) {
+ $type = 0;
+ } // default
+ $type_obj = $this->fields[$type];
+ if ($allow_null) {
+ $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj);
+ }
+ $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config));
+ $ret .= $this->end('td');
+ $ret .= $this->end('tr');
+ }
+ $ret .= $this->end('tbody');
+ return $ret;
+ }
+
+}
+
+/**
+ * Printer decorator for directives that accept null
+ */
+class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer
+{
+ /**
+ * Printer being decorated
+ * @type HTMLPurifier_Printer
+ */
+ protected $obj;
+
+ /**
+ * @param HTMLPurifier_Printer $obj Printer to decorate
+ */
+ public function __construct($obj)
+ {
+ parent::__construct();
+ $this->obj = $obj;
+ }
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+
+ $ret = '';
+ $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Null/Disabled');
+ $ret .= $this->end('label');
+ $attr = array(
+ 'type' => 'checkbox',
+ 'value' => '1',
+ 'class' => 'null-toggle',
+ 'name' => "$name" . "[Null_$ns.$directive]",
+ 'id' => "$name:Null_$ns.$directive",
+ 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!!
+ );
+ if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) {
+ // modify inline javascript slightly
+ $attr['onclick'] =
+ "toggleWriteability('$name:Yes_$ns.$directive',checked);" .
+ "toggleWriteability('$name:No_$ns.$directive',checked)";
+ }
+ if ($value === null) {
+ $attr['checked'] = 'checked';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+ $ret .= $this->text(' or ');
+ $ret .= $this->elementEmpty('br');
+ $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config));
+ return $ret;
+ }
+}
+
+/**
+ * Swiss-army knife configuration form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer
+{
+ /**
+ * @type int
+ */
+ public $cols = 18;
+
+ /**
+ * @type int
+ */
+ public $rows = 5;
+
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ // this should probably be split up a little
+ $ret = '';
+ $def = $config->def->info["$ns.$directive"];
+ if (is_int($def)) {
+ $type = abs($def);
+ } else {
+ $type = $def->type;
+ }
+ if (is_array($value)) {
+ switch ($type) {
+ case HTMLPurifier_VarParser::LOOKUP:
+ $array = $value;
+ $value = array();
+ foreach ($array as $val => $b) {
+ $value[] = $val;
+ }
+ //TODO does this need a break?
+ case HTMLPurifier_VarParser::ALIST:
+ $value = implode(PHP_EOL, $value);
+ break;
+ case HTMLPurifier_VarParser::HASH:
+ $nvalue = '';
+ foreach ($value as $i => $v) {
+ if (is_array($v)) {
+ // HACK
+ $v = implode(";", $v);
+ }
+ $nvalue .= "$i:$v" . PHP_EOL;
+ }
+ $value = $nvalue;
+ break;
+ default:
+ $value = '';
+ }
+ }
+ if ($type === HTMLPurifier_VarParser::MIXED) {
+ return 'Not supported';
+ $value = serialize($value);
+ }
+ $attr = array(
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:$ns.$directive"
+ );
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ if (isset($def->allowed)) {
+ $ret .= $this->start('select', $attr);
+ foreach ($def->allowed as $val => $b) {
+ $attr = array();
+ if ($value == $val) {
+ $attr['selected'] = 'selected';
+ }
+ $ret .= $this->element('option', $val, $attr);
+ }
+ $ret .= $this->end('select');
+ } elseif ($type === HTMLPurifier_VarParser::TEXT ||
+ $type === HTMLPurifier_VarParser::ITEXT ||
+ $type === HTMLPurifier_VarParser::ALIST ||
+ $type === HTMLPurifier_VarParser::HASH ||
+ $type === HTMLPurifier_VarParser::LOOKUP) {
+ $attr['cols'] = $this->cols;
+ $attr['rows'] = $this->rows;
+ $ret .= $this->start('textarea', $attr);
+ $ret .= $this->text($value);
+ $ret .= $this->end('textarea');
+ } else {
+ $attr['value'] = $value;
+ $attr['type'] = 'text';
+ $ret .= $this->elementEmpty('input', $attr);
+ }
+ return $ret;
+ }
+}
+
+/**
+ * Bool form field printer
+ */
+class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer
+{
+ /**
+ * @param string $ns
+ * @param string $directive
+ * @param string $value
+ * @param string $name
+ * @param HTMLPurifier_Config|array $config
+ * @return string
+ */
+ public function render($ns, $directive, $value, $name, $config)
+ {
+ if (is_array($config) && isset($config[0])) {
+ $gen_config = $config[0];
+ $config = $config[1];
+ } else {
+ $gen_config = $config;
+ }
+ $this->prepareGenerator($gen_config);
+ $ret = '';
+ $ret .= $this->start('div', array('id' => "$name:$ns.$directive"));
+
+ $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' Yes');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:Yes_$ns.$directive",
+ 'value' => '1'
+ );
+ if ($value === true) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive"));
+ $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose'));
+ $ret .= $this->text(' No');
+ $ret .= $this->end('label');
+
+ $attr = array(
+ 'type' => 'radio',
+ 'name' => "$name" . "[$ns.$directive]",
+ 'id' => "$name:No_$ns.$directive",
+ 'value' => '0'
+ );
+ if ($value === false) {
+ $attr['checked'] = 'checked';
+ }
+ if ($value === null) {
+ $attr['disabled'] = 'disabled';
+ }
+ $ret .= $this->elementEmpty('input', $attr);
+
+ $ret .= $this->end('div');
+
+ return $ret;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Printer/HTMLDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
index 5f2f2f8a7..5f2f2f8a7 100644
--- a/library/HTMLPurifier/Printer/HTMLDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php
diff --git a/library/HTMLPurifier/PropertyList.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
index 189348fd9..189348fd9 100644
--- a/library/HTMLPurifier/PropertyList.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php
diff --git a/library/HTMLPurifier/PropertyListIterator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
index 15b330ea3..15b330ea3 100644
--- a/library/HTMLPurifier/PropertyListIterator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php
diff --git a/library/HTMLPurifier/Queue.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
index f58db9042..f58db9042 100644
--- a/library/HTMLPurifier/Queue.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php
diff --git a/library/HTMLPurifier/Strategy.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
index e1ff3b72d..e1ff3b72d 100644
--- a/library/HTMLPurifier/Strategy.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php
diff --git a/library/HTMLPurifier/Strategy/Composite.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
index d7d35ce7d..d7d35ce7d 100644
--- a/library/HTMLPurifier/Strategy/Composite.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php
diff --git a/library/HTMLPurifier/Strategy/Core.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
index 4414c17d6..4414c17d6 100644
--- a/library/HTMLPurifier/Strategy/Core.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php
diff --git a/library/HTMLPurifier/Strategy/FixNesting.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
index 6fa673db9..6fa673db9 100644
--- a/library/HTMLPurifier/Strategy/FixNesting.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
new file mode 100644
index 000000000..a6eb09e45
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php
@@ -0,0 +1,659 @@
+<?php
+
+/**
+ * Takes tokens makes them well-formed (balance end tags, etc.)
+ *
+ * Specification of the armor attributes this strategy uses:
+ *
+ * - MakeWellFormed_TagClosedError: This armor field is used to
+ * suppress tag closed errors for certain tokens [TagClosedSuppress],
+ * in particular, if a tag was generated automatically by HTML
+ * Purifier, we may rely on our infrastructure to close it for us
+ * and shouldn't report an error to the user [TagClosedAuto].
+ */
+class HTMLPurifier_Strategy_MakeWellFormed extends HTMLPurifier_Strategy
+{
+
+ /**
+ * Array stream of tokens being processed.
+ * @type HTMLPurifier_Token[]
+ */
+ protected $tokens;
+
+ /**
+ * Current token.
+ * @type HTMLPurifier_Token
+ */
+ protected $token;
+
+ /**
+ * Zipper managing the true state.
+ * @type HTMLPurifier_Zipper
+ */
+ protected $zipper;
+
+ /**
+ * Current nesting of elements.
+ * @type array
+ */
+ protected $stack;
+
+ /**
+ * Injectors active in this stream processing.
+ * @type HTMLPurifier_Injector[]
+ */
+ protected $injectors;
+
+ /**
+ * Current instance of HTMLPurifier_Config.
+ * @type HTMLPurifier_Config
+ */
+ protected $config;
+
+ /**
+ * Current instance of HTMLPurifier_Context.
+ * @type HTMLPurifier_Context
+ */
+ protected $context;
+
+ /**
+ * @param HTMLPurifier_Token[] $tokens
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_Token[]
+ * @throws HTMLPurifier_Exception
+ */
+ public function execute($tokens, $config, $context)
+ {
+ $definition = $config->getHTMLDefinition();
+
+ // local variables
+ $generator = new HTMLPurifier_Generator($config, $context);
+ $escape_invalid_tags = $config->get('Core.EscapeInvalidTags');
+ // used for autoclose early abortion
+ $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config);
+ $e = $context->get('ErrorCollector', true);
+ $i = false; // injector index
+ list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens);
+ if ($token === NULL) {
+ return array();
+ }
+ $reprocess = false; // whether or not to reprocess the same token
+ $stack = array();
+
+ // member variables
+ $this->stack =& $stack;
+ $this->tokens =& $tokens;
+ $this->token =& $token;
+ $this->zipper =& $zipper;
+ $this->config = $config;
+ $this->context = $context;
+
+ // context variables
+ $context->register('CurrentNesting', $stack);
+ $context->register('InputZipper', $zipper);
+ $context->register('CurrentToken', $token);
+
+ // -- begin INJECTOR --
+
+ $this->injectors = array();
+
+ $injectors = $config->getBatch('AutoFormat');
+ $def_injectors = $definition->info_injector;
+ $custom_injectors = $injectors['Custom'];
+ unset($injectors['Custom']); // special case
+ foreach ($injectors as $injector => $b) {
+ // XXX: Fix with a legitimate lookup table of enabled filters
+ if (strpos($injector, '.') !== false) {
+ continue;
+ }
+ $injector = "HTMLPurifier_Injector_$injector";
+ if (!$b) {
+ continue;
+ }
+ $this->injectors[] = new $injector;
+ }
+ foreach ($def_injectors as $injector) {
+ // assumed to be objects
+ $this->injectors[] = $injector;
+ }
+ foreach ($custom_injectors as $injector) {
+ if (!$injector) {
+ continue;
+ }
+ if (is_string($injector)) {
+ $injector = "HTMLPurifier_Injector_$injector";
+ $injector = new $injector;
+ }
+ $this->injectors[] = $injector;
+ }
+
+ // give the injectors references to the definition and context
+ // variables for performance reasons
+ foreach ($this->injectors as $ix => $injector) {
+ $error = $injector->prepare($config, $context);
+ if (!$error) {
+ continue;
+ }
+ array_splice($this->injectors, $ix, 1); // rm the injector
+ trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING);
+ }
+
+ // -- end INJECTOR --
+
+ // a note on reprocessing:
+ // In order to reduce code duplication, whenever some code needs
+ // to make HTML changes in order to make things "correct", the
+ // new HTML gets sent through the purifier, regardless of its
+ // status. This means that if we add a start token, because it
+ // was totally necessary, we don't have to update nesting; we just
+ // punt ($reprocess = true; continue;) and it does that for us.
+
+ // isset is in loop because $tokens size changes during loop exec
+ for (;;
+ // only increment if we don't need to reprocess
+ $reprocess ? $reprocess = false : $token = $zipper->next($token)) {
+
+ // check for a rewind
+ if (is_int($i)) {
+ // possibility: disable rewinding if the current token has a
+ // rewind set on it already. This would offer protection from
+ // infinite loop, but might hinder some advanced rewinding.
+ $rewind_offset = $this->injectors[$i]->getRewindOffset();
+ if (is_int($rewind_offset)) {
+ for ($j = 0; $j < $rewind_offset; $j++) {
+ if (empty($zipper->front)) break;
+ $token = $zipper->prev($token);
+ // indicate that other injectors should not process this token,
+ // but we need to reprocess it. See Note [Injector skips]
+ unset($token->skip[$i]);
+ $token->rewind = $i;
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ array_pop($this->stack);
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ $this->stack[] = $token->start;
+ }
+ }
+ }
+ $i = false;
+ }
+
+ // handle case of document end
+ if ($token === NULL) {
+ // kill processing if stack is empty
+ if (empty($this->stack)) {
+ break;
+ }
+
+ // peek
+ $top_nesting = array_pop($this->stack);
+ $this->stack[] = $top_nesting;
+
+ // send error [TagClosedSuppress]
+ if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting);
+ }
+
+ // append, don't splice, since this is the end
+ $token = new HTMLPurifier_Token_End($top_nesting->name);
+
+ // punt!
+ $reprocess = true;
+ continue;
+ }
+
+ //echo '<br>'; printZipper($zipper, $token);//printTokens($this->stack);
+ //flush();
+
+ // quick-check: if it's not a tag, no need to process
+ if (empty($token->is_tag)) {
+ if ($token instanceof HTMLPurifier_Token_Text) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ // XXX fuckup
+ $r = $token;
+ $injector->handleText($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ }
+ // another possibility is a comment
+ continue;
+ }
+
+ if (isset($definition->info[$token->name])) {
+ $type = $definition->info[$token->name]->child->type;
+ } else {
+ $type = false; // Type is unknown, treat accordingly
+ }
+
+ // quick tag checks: anything that's *not* an end tag
+ $ok = false;
+ if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) {
+ // claims to be a start tag but is empty
+ $token = new HTMLPurifier_Token_Empty(
+ $token->name,
+ $token->attr,
+ $token->line,
+ $token->col,
+ $token->armor
+ );
+ $ok = true;
+ } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) {
+ // claims to be empty but really is a start tag
+ // NB: this assignment is required
+ $old_token = $token;
+ $token = new HTMLPurifier_Token_End($token->name);
+ $token = $this->insertBefore(
+ new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor)
+ );
+ // punt (since we had to modify the input stream in a non-trivial way)
+ $reprocess = true;
+ continue;
+ } elseif ($token instanceof HTMLPurifier_Token_Empty) {
+ // real empty token
+ $ok = true;
+ } elseif ($token instanceof HTMLPurifier_Token_Start) {
+ // start tag
+
+ // ...unless they also have to close their parent
+ if (!empty($this->stack)) {
+
+ // Performance note: you might think that it's rather
+ // inefficient, recalculating the autoclose information
+ // for every tag that a token closes (since when we
+ // do an autoclose, we push a new token into the
+ // stream and then /process/ that, before
+ // re-processing this token.) But this is
+ // necessary, because an injector can make an
+ // arbitrary transformations to the autoclosing
+ // tokens we introduce, so things may have changed
+ // in the meantime. Also, doing the inefficient thing is
+ // "easy" to reason about (for certain perverse definitions
+ // of "easy")
+
+ $parent = array_pop($this->stack);
+ $this->stack[] = $parent;
+
+ $parent_def = null;
+ $parent_elements = null;
+ $autoclose = false;
+ if (isset($definition->info[$parent->name])) {
+ $parent_def = $definition->info[$parent->name];
+ $parent_elements = $parent_def->child->getAllowedElements($config);
+ $autoclose = !isset($parent_elements[$token->name]);
+ }
+
+ if ($autoclose && $definition->info[$token->name]->wrap) {
+ // Check if an element can be wrapped by another
+ // element to make it valid in a context (for
+ // example, <ul><ul> needs a <li> in between)
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) {
+ $newtoken = new HTMLPurifier_Token_Start($wrapname);
+ $token = $this->insertBefore($newtoken);
+ $reprocess = true;
+ continue;
+ }
+ }
+
+ $carryover = false;
+ if ($autoclose && $parent_def->formatting) {
+ $carryover = true;
+ }
+
+ if ($autoclose) {
+ // check if this autoclose is doomed to fail
+ // (this rechecks $parent, which his harmless)
+ $autoclose_ok = isset($global_parent_allowed_elements[$token->name]);
+ if (!$autoclose_ok) {
+ foreach ($this->stack as $ancestor) {
+ $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config);
+ if (isset($elements[$token->name])) {
+ $autoclose_ok = true;
+ break;
+ }
+ if ($definition->info[$token->name]->wrap) {
+ $wrapname = $definition->info[$token->name]->wrap;
+ $wrapdef = $definition->info[$wrapname];
+ $wrap_elements = $wrapdef->child->getAllowedElements($config);
+ if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) {
+ $autoclose_ok = true;
+ break;
+ }
+ }
+ }
+ }
+ if ($autoclose_ok) {
+ // errors need to be updated
+ $new_token = new HTMLPurifier_Token_End($parent->name);
+ $new_token->start = $parent;
+ // [TagClosedSuppress]
+ if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) {
+ if (!$carryover) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent);
+ } else {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent);
+ }
+ }
+ if ($carryover) {
+ $element = clone $parent;
+ // [TagClosedAuto]
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $element->carryover = true;
+ $token = $this->processToken(array($new_token, $token, $element));
+ } else {
+ $token = $this->insertBefore($new_token);
+ }
+ } else {
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ }
+ $ok = true;
+ }
+
+ if ($ok) {
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleElement($r);
+ $token = $this->processToken($r, $i);
+ $reprocess = true;
+ break;
+ }
+ if (!$reprocess) {
+ // ah, nothing interesting happened; do normal processing
+ if ($token instanceof HTMLPurifier_Token_Start) {
+ $this->stack[] = $token;
+ } elseif ($token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception(
+ 'Improper handling of end tag in start code; possible error in MakeWellFormed'
+ );
+ }
+ }
+ continue;
+ }
+
+ // sanity check: we should be dealing with a closing tag
+ if (!$token instanceof HTMLPurifier_Token_End) {
+ throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier');
+ }
+
+ // make sure that we have something open
+ if (empty($this->stack)) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // first, check for the simplest case: everything closes neatly.
+ // Eventually, everything passes through here; if there are problems
+ // we modify the input stream accordingly and then punt, so that
+ // the tokens get processed again.
+ $current_parent = array_pop($this->stack);
+ if ($current_parent->name == $token->name) {
+ $token->start = $current_parent;
+ foreach ($this->injectors as $i => $injector) {
+ if (isset($token->skip[$i])) {
+ // See Note [Injector skips]
+ continue;
+ }
+ if ($token->rewind !== null && $token->rewind !== $i) {
+ continue;
+ }
+ $r = $token;
+ $injector->handleEnd($r);
+ $token = $this->processToken($r, $i);
+ $this->stack[] = $current_parent;
+ $reprocess = true;
+ break;
+ }
+ continue;
+ }
+
+ // okay, so we're trying to close the wrong tag
+
+ // undo the pop previous pop
+ $this->stack[] = $current_parent;
+
+ // scroll back the entire nest, trying to find our tag.
+ // (feature could be to specify how far you'd like to go)
+ $size = count($this->stack);
+ // -2 because -1 is the last element, but we already checked that
+ $skipped_tags = false;
+ for ($j = $size - 2; $j >= 0; $j--) {
+ if ($this->stack[$j]->name == $token->name) {
+ $skipped_tags = array_slice($this->stack, $j);
+ break;
+ }
+ }
+
+ // we didn't find the tag, so remove
+ if ($skipped_tags === false) {
+ if ($escape_invalid_tags) {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text');
+ }
+ $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token));
+ } else {
+ if ($e) {
+ $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed');
+ }
+ $token = $this->remove();
+ }
+ $reprocess = true;
+ continue;
+ }
+
+ // do errors, in REVERSE $j order: a,b,c with </a></b></c>
+ $c = count($skipped_tags);
+ if ($e) {
+ for ($j = $c - 1; $j > 0; $j--) {
+ // notice we exclude $j == 0, i.e. the current ending tag, from
+ // the errors... [TagClosedSuppress]
+ if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) {
+ $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]);
+ }
+ }
+ }
+
+ // insert tags, in FORWARD $j order: c,b,a with </a></b></c>
+ $replace = array($token);
+ for ($j = 1; $j < $c; $j++) {
+ // ...as well as from the insertions
+ $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name);
+ $new_token->start = $skipped_tags[$j];
+ array_unshift($replace, $new_token);
+ if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) {
+ // [TagClosedAuto]
+ $element = clone $skipped_tags[$j];
+ $element->carryover = true;
+ $element->armor['MakeWellFormed_TagClosedError'] = true;
+ $replace[] = $element;
+ }
+ }
+ $token = $this->processToken($replace);
+ $reprocess = true;
+ continue;
+ }
+
+ $context->destroy('CurrentToken');
+ $context->destroy('CurrentNesting');
+ $context->destroy('InputZipper');
+
+ unset($this->injectors, $this->stack, $this->tokens);
+ return $zipper->toArray($token);
+ }
+
+ /**
+ * Processes arbitrary token values for complicated substitution patterns.
+ * In general:
+ *
+ * If $token is an array, it is a list of tokens to substitute for the
+ * current token. These tokens then get individually processed. If there
+ * is a leading integer in the list, that integer determines how many
+ * tokens from the stream should be removed.
+ *
+ * If $token is a regular token, it is swapped with the current token.
+ *
+ * If $token is false, the current token is deleted.
+ *
+ * If $token is an integer, that number of tokens (with the first token
+ * being the current one) will be deleted.
+ *
+ * @param HTMLPurifier_Token|array|int|bool $token Token substitution value
+ * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if
+ * this is not an injector related operation.
+ * @throws HTMLPurifier_Exception
+ */
+ protected function processToken($token, $injector = -1)
+ {
+ // Zend OpCache miscompiles $token = array($token), so
+ // avoid this pattern. See: https://github.com/ezyang/htmlpurifier/issues/108
+
+ // normalize forms of token
+ if (is_object($token)) {
+ $tmp = $token;
+ $token = array(1, $tmp);
+ }
+ if (is_int($token)) {
+ $tmp = $token;
+ $token = array($tmp);
+ }
+ if ($token === false) {
+ $token = array(1);
+ }
+ if (!is_array($token)) {
+ throw new HTMLPurifier_Exception('Invalid token type from injector');
+ }
+ if (!is_int($token[0])) {
+ array_unshift($token, 1);
+ }
+ if ($token[0] === 0) {
+ throw new HTMLPurifier_Exception('Deleting zero tokens is not valid');
+ }
+
+ // $token is now an array with the following form:
+ // array(number nodes to delete, new node 1, new node 2, ...)
+
+ $delete = array_shift($token);
+ list($old, $r) = $this->zipper->splice($this->token, $delete, $token);
+
+ if ($injector > -1) {
+ // See Note [Injector skips]
+ // Determine appropriate skips. Here's what the code does:
+ // *If* we deleted one or more tokens, copy the skips
+ // of those tokens into the skips of the new tokens (in $token).
+ // Also, mark the newly inserted tokens as having come from
+ // $injector.
+ $oldskip = isset($old[0]) ? $old[0]->skip : array();
+ foreach ($token as $object) {
+ $object->skip = $oldskip;
+ $object->skip[$injector] = true;
+ }
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Inserts a token before the current token. Cursor now points to
+ * this token. You must reprocess after this.
+ * @param HTMLPurifier_Token $token
+ */
+ private function insertBefore($token)
+ {
+ // NB not $this->zipper->insertBefore(), due to positioning
+ // differences
+ $splice = $this->zipper->splice($this->token, 0, array($token));
+
+ return $splice[1];
+ }
+
+ /**
+ * Removes current token. Cursor now points to new token occupying previously
+ * occupied space. You must reprocess after this.
+ */
+ private function remove()
+ {
+ return $this->zipper->delete();
+ }
+}
+
+// Note [Injector skips]
+// ~~~~~~~~~~~~~~~~~~~~~
+// When I originally designed this class, the idea behind the 'skip'
+// property of HTMLPurifier_Token was to help avoid infinite loops
+// in injector processing. For example, suppose you wrote an injector
+// that bolded swear words. Naively, you might write it so that
+// whenever you saw ****, you replaced it with <strong>****</strong>.
+//
+// When this happens, we will reprocess all of the tokens with the
+// other injectors. Now there is an opportunity for infinite loop:
+// if we rerun the swear-word injector on these tokens, we might
+// see **** and then reprocess again to get
+// <strong><strong>****</strong></strong> ad infinitum.
+//
+// Thus, the idea of a skip is that once we process a token with
+// an injector, we mark all of those tokens as having "come from"
+// the injector, and we never run the injector again on these
+// tokens.
+//
+// There were two more complications, however:
+//
+// - With HTMLPurifier_Injector_RemoveEmpty, we noticed that if
+// you had <b><i></i></b>, after you removed the <i></i>, you
+// really would like this injector to go back and reprocess
+// the <b> tag, discovering that it is now empty and can be
+// removed. So we reintroduced the possibility of infinite looping
+// by adding a "rewind" function, which let you go back to an
+// earlier point in the token stream and reprocess it with injectors.
+// Needless to say, we need to UN-skip the token so it gets
+// reprocessed.
+//
+// - Suppose that you successfuly process a token, replace it with
+// one with your skip mark, but now another injector wants to
+// process the skipped token with another token. Should you continue
+// to skip that new token, or reprocess it? If you reprocess,
+// you can end up with an infinite loop where one injector converts
+// <a> to <b>, and then another injector converts it back. So
+// we inherit the skips, but for some reason, I thought that we
+// should inherit the skip from the first token of the token
+// that we deleted. Why? Well, it seems to work OK.
+//
+// If I were to redesign this functionality, I would absolutely not
+// go about doing it this way: the semantics are just not very well
+// defined, and in any case you probably wanted to operate on trees,
+// not token streams.
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Strategy/RemoveForeignElements.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
index 1a8149ecc..1a8149ecc 100644
--- a/library/HTMLPurifier/Strategy/RemoveForeignElements.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php
diff --git a/library/HTMLPurifier/Strategy/ValidateAttributes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
index fbb3d27c8..fbb3d27c8 100644
--- a/library/HTMLPurifier/Strategy/ValidateAttributes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php
diff --git a/library/HTMLPurifier/StringHash.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
index c07370197..c07370197 100644
--- a/library/HTMLPurifier/StringHash.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php
diff --git a/library/HTMLPurifier/StringHashParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
index 7c73f8083..7c73f8083 100644
--- a/library/HTMLPurifier/StringHashParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php
diff --git a/library/HTMLPurifier/TagTransform.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
index 7b8d83343..7b8d83343 100644
--- a/library/HTMLPurifier/TagTransform.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php
diff --git a/library/HTMLPurifier/TagTransform/Font.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
index 7853d90bc..7853d90bc 100644
--- a/library/HTMLPurifier/TagTransform/Font.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php
diff --git a/library/HTMLPurifier/TagTransform/Simple.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
index 71bf10b91..71bf10b91 100644
--- a/library/HTMLPurifier/TagTransform/Simple.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
new file mode 100644
index 000000000..84d3619a3
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * Abstract base token class that all others inherit from.
+ */
+abstract class HTMLPurifier_Token
+{
+ /**
+ * Line number node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $line;
+
+ /**
+ * Column of line node was on in source document. Null if unknown.
+ * @type int
+ */
+ public $col;
+
+ /**
+ * Lookup array of processing that this token is exempt from.
+ * Currently, valid values are "ValidateAttributes" and
+ * "MakeWellFormed_TagClosedError"
+ * @type array
+ */
+ public $armor = array();
+
+ /**
+ * Used during MakeWellFormed. See Note [Injector skips]
+ * @type
+ */
+ public $skip;
+
+ /**
+ * @type
+ */
+ public $rewind;
+
+ /**
+ * @type
+ */
+ public $carryover;
+
+ /**
+ * @param string $n
+ * @return null|string
+ */
+ public function __get($n)
+ {
+ if ($n === 'type') {
+ trigger_error('Deprecated type property called; use instanceof', E_USER_NOTICE);
+ switch (get_class($this)) {
+ case 'HTMLPurifier_Token_Start':
+ return 'start';
+ case 'HTMLPurifier_Token_Empty':
+ return 'empty';
+ case 'HTMLPurifier_Token_End':
+ return 'end';
+ case 'HTMLPurifier_Token_Text':
+ return 'text';
+ case 'HTMLPurifier_Token_Comment':
+ return 'comment';
+ default:
+ return null;
+ }
+ }
+ }
+
+ /**
+ * Sets the position of the token in the source document.
+ * @param int $l
+ * @param int $c
+ */
+ public function position($l = null, $c = null)
+ {
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Convenience function for DirectLex settings line/col position.
+ * @param int $l
+ * @param int $c
+ */
+ public function rawPosition($l, $c)
+ {
+ if ($c === -1) {
+ $l++;
+ }
+ $this->line = $l;
+ $this->col = $c;
+ }
+
+ /**
+ * Converts a token into its corresponding node.
+ */
+ abstract public function toNode();
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/Token/Comment.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
index 23453c705..23453c705 100644
--- a/library/HTMLPurifier/Token/Comment.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php
diff --git a/library/HTMLPurifier/Token/Empty.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
index 78a95f555..78a95f555 100644
--- a/library/HTMLPurifier/Token/Empty.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php
diff --git a/library/HTMLPurifier/Token/End.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
index 59b38fdc5..59b38fdc5 100644
--- a/library/HTMLPurifier/Token/End.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php
diff --git a/library/HTMLPurifier/Token/Start.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
index 019f317ad..019f317ad 100644
--- a/library/HTMLPurifier/Token/Start.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php
diff --git a/library/HTMLPurifier/Token/Tag.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
index d643fa64e..d643fa64e 100644
--- a/library/HTMLPurifier/Token/Tag.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php
diff --git a/library/HTMLPurifier/Token/Text.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
index f26a1c211..f26a1c211 100644
--- a/library/HTMLPurifier/Token/Text.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php
diff --git a/library/HTMLPurifier/TokenFactory.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
index dea2446b9..dea2446b9 100644
--- a/library/HTMLPurifier/TokenFactory.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
new file mode 100644
index 000000000..9c5be39d1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * HTML Purifier's internal representation of a URI.
+ * @note
+ * Internal data-structures are completely escaped. If the data needs
+ * to be used in a non-URI context (which is very unlikely), be sure
+ * to decode it first. The URI may not necessarily be well-formed until
+ * validate() is called.
+ */
+class HTMLPurifier_URI
+{
+ /**
+ * @type string
+ */
+ public $scheme;
+
+ /**
+ * @type string
+ */
+ public $userinfo;
+
+ /**
+ * @type string
+ */
+ public $host;
+
+ /**
+ * @type int
+ */
+ public $port;
+
+ /**
+ * @type string
+ */
+ public $path;
+
+ /**
+ * @type string
+ */
+ public $query;
+
+ /**
+ * @type string
+ */
+ public $fragment;
+
+ /**
+ * @param string $scheme
+ * @param string $userinfo
+ * @param string $host
+ * @param int $port
+ * @param string $path
+ * @param string $query
+ * @param string $fragment
+ * @note Automatically normalizes scheme and port
+ */
+ public function __construct($scheme, $userinfo, $host, $port, $path, $query, $fragment)
+ {
+ $this->scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme);
+ $this->userinfo = $userinfo;
+ $this->host = $host;
+ $this->port = is_null($port) ? $port : (int)$port;
+ $this->path = $path;
+ $this->query = $query;
+ $this->fragment = $fragment;
+ }
+
+ /**
+ * Retrieves a scheme object corresponding to the URI's scheme/default
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI
+ */
+ public function getSchemeObj($config, $context)
+ {
+ $registry = HTMLPurifier_URISchemeRegistry::instance();
+ if ($this->scheme !== null) {
+ $scheme_obj = $registry->getScheme($this->scheme, $config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // invalid scheme, clean it out
+ } else {
+ // no scheme: retrieve the default one
+ $def = $config->getDefinition('URI');
+ $scheme_obj = $def->getDefaultScheme($config, $context);
+ if (!$scheme_obj) {
+ if ($def->defaultScheme !== null) {
+ // something funky happened to the default scheme object
+ trigger_error(
+ 'Default scheme object "' . $def->defaultScheme . '" was not readable',
+ E_USER_WARNING
+ );
+ } // suppress error if it's null
+ return false;
+ }
+ }
+ return $scheme_obj;
+ }
+
+ /**
+ * Generic validation method applicable for all schemes. May modify
+ * this URI in order to get it into a compliant form.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool True if validation/filtering succeeds, false if failure
+ */
+ public function validate($config, $context)
+ {
+ // ABNF definitions from RFC 3986
+ $chars_sub_delims = '!$&\'()*+,;=';
+ $chars_gen_delims = ':/?#[]@';
+ $chars_pchar = $chars_sub_delims . ':@';
+
+ // validate host
+ if (!is_null($this->host)) {
+ $host_def = new HTMLPurifier_AttrDef_URI_Host();
+ $this->host = $host_def->validate($this->host, $config, $context);
+ if ($this->host === false) {
+ $this->host = null;
+ }
+ }
+
+ // validate scheme
+ // NOTE: It's not appropriate to check whether or not this
+ // scheme is in our registry, since a URIFilter may convert a
+ // URI that we don't allow into one we do. So instead, we just
+ // check if the scheme can be dropped because there is no host
+ // and it is our default scheme.
+ if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') {
+ // support for relative paths is pretty abysmal when the
+ // scheme is present, so axe it when possible
+ $def = $config->getDefinition('URI');
+ if ($def->defaultScheme === $this->scheme) {
+ $this->scheme = null;
+ }
+ }
+
+ // validate username
+ if (!is_null($this->userinfo)) {
+ $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':');
+ $this->userinfo = $encoder->encode($this->userinfo);
+ }
+
+ // validate port
+ if (!is_null($this->port)) {
+ if ($this->port < 1 || $this->port > 65535) {
+ $this->port = null;
+ }
+ }
+
+ // validate path
+ $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/');
+ if (!is_null($this->host)) { // this catches $this->host === ''
+ // path-abempty (hier and relative)
+ // http://www.example.com/my/path
+ // //www.example.com/my/path (looks odd, but works, and
+ // recognized by most browsers)
+ // (this set is valid or invalid on a scheme by scheme
+ // basis, so we'll deal with it later)
+ // file:///my/path
+ // ///my/path
+ $this->path = $segments_encoder->encode($this->path);
+ } elseif ($this->path !== '') {
+ if ($this->path[0] === '/') {
+ // path-absolute (hier and relative)
+ // http:/my/path
+ // /my/path
+ if (strlen($this->path) >= 2 && $this->path[1] === '/') {
+ // This could happen if both the host gets stripped
+ // out
+ // http://my/path
+ // //my/path
+ $this->path = '';
+ } else {
+ $this->path = $segments_encoder->encode($this->path);
+ }
+ } elseif (!is_null($this->scheme)) {
+ // path-rootless (hier)
+ // http:my/path
+ // Short circuit evaluation means we don't need to check nz
+ $this->path = $segments_encoder->encode($this->path);
+ } else {
+ // path-noscheme (relative)
+ // my/path
+ // (once again, not checking nz)
+ $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@');
+ $c = strpos($this->path, '/');
+ if ($c !== false) {
+ $this->path =
+ $segment_nc_encoder->encode(substr($this->path, 0, $c)) .
+ $segments_encoder->encode(substr($this->path, $c));
+ } else {
+ $this->path = $segment_nc_encoder->encode($this->path);
+ }
+ }
+ } else {
+ // path-empty (hier and relative)
+ $this->path = ''; // just to be safe
+ }
+
+ // qf = query and fragment
+ $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?');
+
+ if (!is_null($this->query)) {
+ $this->query = $qf_encoder->encode($this->query);
+ }
+
+ if (!is_null($this->fragment)) {
+ $this->fragment = $qf_encoder->encode($this->fragment);
+ }
+ return true;
+ }
+
+ /**
+ * Convert URI back to string
+ * @return string URI appropriate for output
+ */
+ public function toString()
+ {
+ // reconstruct authority
+ $authority = null;
+ // there is a rendering difference between a null authority
+ // (http:foo-bar) and an empty string authority
+ // (http:///foo-bar).
+ if (!is_null($this->host)) {
+ $authority = '';
+ if (!is_null($this->userinfo)) {
+ $authority .= $this->userinfo . '@';
+ }
+ $authority .= $this->host;
+ if (!is_null($this->port)) {
+ $authority .= ':' . $this->port;
+ }
+ }
+
+ // Reconstruct the result
+ // One might wonder about parsing quirks from browsers after
+ // this reconstruction. Unfortunately, parsing behavior depends
+ // on what *scheme* was employed (file:///foo is handled *very*
+ // differently than http:///foo), so unfortunately we have to
+ // defer to the schemes to do the right thing.
+ $result = '';
+ if (!is_null($this->scheme)) {
+ $result .= $this->scheme . ':';
+ }
+ if (!is_null($authority)) {
+ $result .= '//' . $authority;
+ }
+ $result .= $this->path;
+ if (!is_null($this->query)) {
+ $result .= '?' . $this->query;
+ }
+ if (!is_null($this->fragment)) {
+ $result .= '#' . $this->fragment;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Returns true if this URL might be considered a 'local' URL given
+ * the current context. This is true when the host is null, or
+ * when it matches the host supplied to the configuration.
+ *
+ * Note that this does not do any scheme checking, so it is mostly
+ * only appropriate for metadata that doesn't care about protocol
+ * security. isBenign is probably what you actually want.
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isLocal($config, $context)
+ {
+ if ($this->host === null) {
+ return true;
+ }
+ $uri_def = $config->getDefinition('URI');
+ if ($uri_def->host === $this->host) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this URL should be considered a 'benign' URL,
+ * that is:
+ *
+ * - It is a local URL (isLocal), and
+ * - It has a equal or better level of security
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function isBenign($config, $context)
+ {
+ if (!$this->isLocal($config, $context)) {
+ return false;
+ }
+
+ $scheme_obj = $this->getSchemeObj($config, $context);
+ if (!$scheme_obj) {
+ return false;
+ } // conservative approach
+
+ $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context);
+ if ($current_scheme_obj->secure) {
+ if (!$scheme_obj->secure) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URIDefinition.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
index e0bd8bcca..e0bd8bcca 100644
--- a/library/HTMLPurifier/URIDefinition.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php
diff --git a/library/HTMLPurifier/URIFilter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
index 09724e9f4..09724e9f4 100644
--- a/library/HTMLPurifier/URIFilter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php
diff --git a/library/HTMLPurifier/URIFilter/DisableExternal.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
index ced1b1376..ced1b1376 100644
--- a/library/HTMLPurifier/URIFilter/DisableExternal.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php
diff --git a/library/HTMLPurifier/URIFilter/DisableExternalResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
index c6562169e..c6562169e 100644
--- a/library/HTMLPurifier/URIFilter/DisableExternalResources.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php
diff --git a/library/HTMLPurifier/URIFilter/DisableResources.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
index d5c412c44..d5c412c44 100644
--- a/library/HTMLPurifier/URIFilter/DisableResources.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php
diff --git a/library/HTMLPurifier/URIFilter/HostBlacklist.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
index a6645c17e..a6645c17e 100644
--- a/library/HTMLPurifier/URIFilter/HostBlacklist.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php
diff --git a/library/HTMLPurifier/URIFilter/MakeAbsolute.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
index c507bbff8..c507bbff8 100644
--- a/library/HTMLPurifier/URIFilter/MakeAbsolute.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php
diff --git a/library/HTMLPurifier/URIFilter/Munge.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
index 6e03315a1..6e03315a1 100644
--- a/library/HTMLPurifier/URIFilter/Munge.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php
diff --git a/library/HTMLPurifier/URIFilter/SafeIframe.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
index f609c47a3..f609c47a3 100644
--- a/library/HTMLPurifier/URIFilter/SafeIframe.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php
diff --git a/library/HTMLPurifier/URIParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
index 0e7381a07..0e7381a07 100644
--- a/library/HTMLPurifier/URIParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php
diff --git a/library/HTMLPurifier/URIScheme.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
index fe9e82cf2..fe9e82cf2 100644
--- a/library/HTMLPurifier/URIScheme.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
new file mode 100644
index 000000000..41c49d553
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Implements data: URI for base64 encoded images supported by GD.
+ */
+class HTMLPurifier_URIScheme_data extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = true;
+
+ /**
+ * @type array
+ */
+ public $allowed_types = array(
+ // you better write validation code for other types if you
+ // decide to allow them
+ 'image/jpeg' => true,
+ 'image/gif' => true,
+ 'image/png' => true,
+ );
+ // this is actually irrelevant since we only write out the path
+ // component
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $result = explode(',', $uri->path, 2);
+ $is_base64 = false;
+ $charset = null;
+ $content_type = null;
+ if (count($result) == 2) {
+ list($metadata, $data) = $result;
+ // do some legwork on the metadata
+ $metas = explode(';', $metadata);
+ while (!empty($metas)) {
+ $cur = array_shift($metas);
+ if ($cur == 'base64') {
+ $is_base64 = true;
+ break;
+ }
+ if (substr($cur, 0, 8) == 'charset=') {
+ // doesn't match if there are arbitrary spaces, but
+ // whatever dude
+ if ($charset !== null) {
+ continue;
+ } // garbage
+ $charset = substr($cur, 8); // not used
+ } else {
+ if ($content_type !== null) {
+ continue;
+ } // garbage
+ $content_type = $cur;
+ }
+ }
+ } else {
+ $data = $result[0];
+ }
+ if ($content_type !== null && empty($this->allowed_types[$content_type])) {
+ return false;
+ }
+ if ($charset !== null) {
+ // error; we don't allow plaintext stuff
+ $charset = null;
+ }
+ $data = rawurldecode($data);
+ if ($is_base64) {
+ $raw_data = base64_decode($data);
+ } else {
+ $raw_data = $data;
+ }
+ if ( strlen($raw_data) < 12 ) {
+ // error; exif_imagetype throws exception with small files,
+ // and this likely indicates a corrupt URI/failed parse anyway
+ return false;
+ }
+ // XXX probably want to refactor this into a general mechanism
+ // for filtering arbitrary content types
+ if (function_exists('sys_get_temp_dir')) {
+ $file = tempnam(sys_get_temp_dir(), "");
+ } else {
+ $file = tempnam("/tmp", "");
+ }
+ file_put_contents($file, $raw_data);
+ if (function_exists('exif_imagetype')) {
+ $image_code = exif_imagetype($file);
+ unlink($file);
+ } elseif (function_exists('getimagesize')) {
+ set_error_handler(array($this, 'muteErrorHandler'));
+ $info = getimagesize($file);
+ restore_error_handler();
+ unlink($file);
+ if ($info == false) {
+ return false;
+ }
+ $image_code = $info[2];
+ } else {
+ trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR);
+ }
+ $real_content_type = image_type_to_mime_type($image_code);
+ if ($real_content_type != $content_type) {
+ // we're nice guys; if the content type is something else we
+ // support, change it over
+ if (empty($this->allowed_types[$real_content_type])) {
+ return false;
+ }
+ $content_type = $real_content_type;
+ }
+ // ok, it's kosher, rewrite what we need
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+ $uri->fragment = null;
+ $uri->query = null;
+ $uri->path = "$content_type;base64," . base64_encode($raw_data);
+ return true;
+ }
+
+ /**
+ * @param int $errno
+ * @param string $errstr
+ */
+ public function muteErrorHandler($errno, $errstr)
+ {
+ }
+}
diff --git a/library/HTMLPurifier/URIScheme/file.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
index 215be4ba8..215be4ba8 100644
--- a/library/HTMLPurifier/URIScheme/file.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php
diff --git a/library/HTMLPurifier/URIScheme/ftp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
index 1eb43ee5c..1eb43ee5c 100644
--- a/library/HTMLPurifier/URIScheme/ftp.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php
diff --git a/library/HTMLPurifier/URIScheme/http.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
index ce69ec438..ce69ec438 100644
--- a/library/HTMLPurifier/URIScheme/http.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php
diff --git a/library/HTMLPurifier/URIScheme/https.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
index 0e96882db..0e96882db 100644
--- a/library/HTMLPurifier/URIScheme/https.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php
diff --git a/library/HTMLPurifier/URIScheme/mailto.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
index c3a6b602a..c3a6b602a 100644
--- a/library/HTMLPurifier/URIScheme/mailto.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php
diff --git a/library/HTMLPurifier/URIScheme/news.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
index 7490927d6..7490927d6 100644
--- a/library/HTMLPurifier/URIScheme/news.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php
diff --git a/library/HTMLPurifier/URIScheme/nntp.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
index f211d715e..f211d715e 100644
--- a/library/HTMLPurifier/URIScheme/nntp.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php
new file mode 100644
index 000000000..8cd193352
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Validates tel (for phone numbers).
+ *
+ * The relevant specifications for this protocol are RFC 3966 and RFC 5341,
+ * but this class takes a much simpler approach: we normalize phone
+ * numbers so that they only include (possibly) a leading plus,
+ * and then any number of digits and x'es.
+ */
+
+class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
+{
+ /**
+ * @type bool
+ */
+ public $browsable = false;
+
+ /**
+ * @type bool
+ */
+ public $may_omit_host = true;
+
+ /**
+ * @param HTMLPurifier_URI $uri
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool
+ */
+ public function doValidate(&$uri, $config, $context)
+ {
+ $uri->userinfo = null;
+ $uri->host = null;
+ $uri->port = null;
+
+ // Delete all non-numeric characters, non-x characters
+ // from phone number, EXCEPT for a leading plus sign.
+ $uri->path = preg_replace('/(?!^\+)[^\dx]/', '',
+ // Normalize e(x)tension to lower-case
+ str_replace('X', 'x', $uri->path));
+
+ return true;
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/library/HTMLPurifier/URISchemeRegistry.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
index 4ac8a0b76..4ac8a0b76 100644
--- a/library/HTMLPurifier/URISchemeRegistry.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php
diff --git a/library/HTMLPurifier/UnitConverter.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
index 166f3bf30..166f3bf30 100644
--- a/library/HTMLPurifier/UnitConverter.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php
diff --git a/library/HTMLPurifier/VarParser.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
index 50cba6910..50cba6910 100644
--- a/library/HTMLPurifier/VarParser.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php
diff --git a/library/HTMLPurifier/VarParser/Flexible.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
index b15016c5b..b15016c5b 100644
--- a/library/HTMLPurifier/VarParser/Flexible.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php
diff --git a/library/HTMLPurifier/VarParser/Native.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
index f11c318ef..f11c318ef 100644
--- a/library/HTMLPurifier/VarParser/Native.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php
diff --git a/library/HTMLPurifier/VarParserException.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
index 5df341495..5df341495 100644
--- a/library/HTMLPurifier/VarParserException.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php
diff --git a/library/HTMLPurifier/Zipper.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
index 6e21ea070..6e21ea070 100644
--- a/library/HTMLPurifier/Zipper.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php
diff --git a/vendor/ezyang/htmlpurifier/maintenance/.htaccess b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
new file mode 100644
index 000000000..3a4288278
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/.htaccess
@@ -0,0 +1 @@
+Deny from all
diff --git a/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch b/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch
new file mode 100644
index 000000000..763709509
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/PH5P.patch
@@ -0,0 +1,102 @@
+--- C:\Users\Edward\Webs\htmlpurifier\maintenance\PH5P.php 2008-07-07 09:12:12.000000000 -0400
++++ C:\Users\Edward\Webs\htmlpurifier\maintenance/PH5P.new.php 2008-12-06 02:29:34.988800000 -0500
+@@ -65,7 +65,7 @@
+
+ public function __construct($data) {
+ $data = str_replace("\r\n", "\n", $data);
+- $date = str_replace("\r", null, $data);
++ $data = str_replace("\r", null, $data);
+
+ $this->data = $data;
+ $this->char = -1;
+@@ -211,7 +211,10 @@
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+- $this->emitToken($char);
++ $this->emitToken(array(
++ 'type' => self::CHARACTR,
++ 'data' => $char
++ ));
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+@@ -708,7 +711,7 @@
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+- $this->entityInAttributeValueState('non');
++ $this->entityInAttributeValueState();
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+@@ -738,7 +741,8 @@
+ ? '&'
+ : $entity;
+
+- $this->emitToken($char);
++ $last = count($this->token['attr']) - 1;
++ $this->token['attr'][$last]['value'] .= $char;
+ }
+
+ private function bogusCommentState() {
+@@ -1066,6 +1070,11 @@
+ $this->char++;
+
+ if(in_array($id, $this->entities)) {
++ if ($e_name[$c-1] !== ';') {
++ if ($c < $len && $e_name[$c] == ';') {
++ $this->char++; // consume extra semicolon
++ }
++ }
+ $entity = $id;
+ break;
+ }
+@@ -2084,7 +2093,7 @@
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+- $this->insertElement($token);
++ $this->insertElement($token, true, true);
+ break;
+ }
+ break;
+@@ -3465,7 +3474,18 @@
+ }
+ }
+
+- private function insertElement($token, $append = true) {
++ private function insertElement($token, $append = true, $check = false) {
++ // Proprietary workaround for libxml2's limitations with tag names
++ if ($check) {
++ // Slightly modified HTML5 tag-name modification,
++ // removing anything that's not an ASCII letter, digit, or hyphen
++ $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']);
++ // Remove leading hyphens and numbers
++ $token['name'] = ltrim($token['name'], '-0..9');
++ // In theory, this should ever be needed, but just in case
++ if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice
++ }
++
+ $el = $this->dom->createElement($token['name']);
+
+ foreach($token['attr'] as $attr) {
+@@ -3659,7 +3679,7 @@
+ }
+ }
+
+- private function generateImpliedEndTags(array $exclude = array()) {
++ private function generateImpliedEndTags($exclude = array()) {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+@@ -3673,7 +3693,8 @@
+ }
+ }
+
+- private function getElementCategory($name) {
++ private function getElementCategory($node) {
++ $name = $node->tagName;
+ if(in_array($name, $this->special))
+ return self::SPECIAL;
+
diff --git a/vendor/ezyang/htmlpurifier/maintenance/PH5P.php b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
new file mode 100644
index 000000000..9d83dcbf5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/PH5P.php
@@ -0,0 +1,3889 @@
+<?php
+class HTML5
+{
+ private $data;
+ private $char;
+ private $EOF;
+ private $state;
+ private $tree;
+ private $token;
+ private $content_model;
+ private $escape = false;
+ private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute',
+ 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;',
+ 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;',
+ 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;',
+ 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;',
+ 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;',
+ 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;',
+ 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;',
+ 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;',
+ 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN',
+ 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;',
+ 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;',
+ 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig',
+ 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;',
+ 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;',
+ 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil',
+ 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;',
+ 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;',
+ 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;',
+ 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth',
+ 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12',
+ 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt',
+ 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc',
+ 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;',
+ 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;',
+ 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;',
+ 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro',
+ 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;',
+ 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;',
+ 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;',
+ 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash',
+ 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;',
+ 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;',
+ 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;',
+ 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;',
+ 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;',
+ 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;',
+ 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;',
+ 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;',
+ 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc',
+ 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;',
+ 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;');
+
+ const PCDATA = 0;
+ const RCDATA = 1;
+ const CDATA = 2;
+ const PLAINTEXT = 3;
+
+ const DOCTYPE = 0;
+ const STARTTAG = 1;
+ const ENDTAG = 2;
+ const COMMENT = 3;
+ const CHARACTR = 4;
+ const EOF = 5;
+
+ public function __construct($data)
+ {
+ $data = str_replace("\r\n", "\n", $data);
+ $date = str_replace("\r", null, $data);
+
+ $this->data = $data;
+ $this->char = -1;
+ $this->EOF = strlen($data);
+ $this->tree = new HTML5TreeConstructer;
+ $this->content_model = self::PCDATA;
+
+ $this->state = 'data';
+
+ while($this->state !== null) {
+ $this->{$this->state.'State'}();
+ }
+ }
+
+ public function save()
+ {
+ return $this->tree->save();
+ }
+
+ private function char()
+ {
+ return ($this->char < $this->EOF)
+ ? $this->data[$this->char]
+ : false;
+ }
+
+ private function character($s, $l = 0)
+ {
+ if($s + $l < $this->EOF) {
+ if($l === 0) {
+ return $this->data[$s];
+ } else {
+ return substr($this->data, $s, $l);
+ }
+ }
+ }
+
+ private function characters($char_class, $start)
+ {
+ return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start));
+ }
+
+ private function dataState()
+ {
+ // Consume the next input character
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) {
+ /* U+0026 AMPERSAND (&)
+ When the content model flag is set to one of the PCDATA or RCDATA
+ states: switch to the entity data state. Otherwise: treat it as per
+ the "anything else" entry below. */
+ $this->state = 'entityData';
+
+ } elseif($char === '-') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is false, and there are at
+ least three characters before this one in the input stream, and the
+ last four characters in the input stream, including this one, are
+ U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS,
+ and U+002D HYPHEN-MINUS ("<!--"), then set the escape flag to true. */
+ if(($this->content_model === self::RCDATA || $this->content_model ===
+ self::CDATA) && $this->escape === false &&
+ $this->char >= 3 && $this->character($this->char - 4, 4) === '<!--') {
+ $this->escape = true;
+ }
+
+ /* In any case, emit the input character as a character token. Stay
+ in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ /* U+003C LESS-THAN SIGN (<) */
+ } elseif($char === '<' && ($this->content_model === self::PCDATA ||
+ (($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === false))) {
+ /* When the content model flag is set to the PCDATA state: switch
+ to the tag open state.
+
+ When the content model flag is set to either the RCDATA state or
+ the CDATA state and the escape flag is false: switch to the tag
+ open state.
+
+ Otherwise: treat it as per the "anything else" entry below. */
+ $this->state = 'tagOpen';
+
+ /* U+003E GREATER-THAN SIGN (>) */
+ } elseif($char === '>') {
+ /* If the content model flag is set to either the RCDATA state or
+ the CDATA state, and the escape flag is true, and the last three
+ characters in the input stream including this one are U+002D
+ HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"),
+ set the escape flag to false. */
+ if(($this->content_model === self::RCDATA ||
+ $this->content_model === self::CDATA) && $this->escape === true &&
+ $this->character($this->char, 3) === '-->') {
+ $this->escape = false;
+ }
+
+ /* In any case, emit the input character as a character token.
+ Stay in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Emit an end-of-file token. */
+ $this->EOF();
+
+ } elseif($this->content_model === self::PLAINTEXT) {
+ /* When the content model flag is set to the PLAINTEXT state
+ THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of
+ the text and emit it as a character token. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => substr($this->data, $this->char)
+ ));
+
+ $this->EOF();
+
+ } else {
+ /* Anything else
+ THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that
+ otherwise would also be treated as a character token and emit it
+ as a single character token. Stay in the data state. */
+ $len = strcspn($this->data, '<&', $this->char);
+ $char = substr($this->data, $this->char, $len);
+ $this->char += $len - 1;
+
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => $char
+ ));
+
+ $this->state = 'data';
+ }
+ }
+
+ private function entityDataState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, emit a U+0026 AMPERSAND character token.
+ // Otherwise, emit the character token that was returned.
+ $char = (!$entity) ? '&' : $entity;
+ $this->emitToken($char);
+
+ // Finally, switch to the data state.
+ $this->state = 'data';
+ }
+
+ private function tagOpenState()
+ {
+ switch($this->content_model) {
+ case self::RCDATA:
+ case self::CDATA:
+ /* If the next input character is a U+002F SOLIDUS (/) character,
+ consume it and switch to the close tag open state. If the next
+ input character is not a U+002F SOLIDUS (/) character, emit a
+ U+003C LESS-THAN SIGN character token and switch to the data
+ state to process the next input character. */
+ if($this->character($this->char + 1) === '/') {
+ $this->char++;
+ $this->state = 'closeTagOpen';
+
+ } else {
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->state = 'data';
+ }
+ break;
+
+ case self::PCDATA:
+ // If the content model flag is set to the PCDATA state
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '!') {
+ /* U+0021 EXCLAMATION MARK (!)
+ Switch to the markup declaration open state. */
+ $this->state = 'markupDeclarationOpen';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Switch to the close tag open state. */
+ $this->state = 'closeTagOpen';
+
+ } elseif(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new start tag token, set its tag name to the lowercase
+ version of the input character (add 0x0020 to the character's code
+ point), then switch to the tag name state. (Don't emit the token
+ yet; further details will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::STARTTAG,
+ 'attr' => array()
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a
+ U+003E GREATER-THAN SIGN character token. Switch to the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<>'
+ ));
+
+ $this->state = 'data';
+
+ } elseif($char === '?') {
+ /* U+003F QUESTION MARK (?)
+ Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+
+ } else {
+ /* Anything else
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and
+ reconsume the current input character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '<'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+ }
+ break;
+ }
+ }
+
+ private function closeTagOpenState()
+ {
+ $next_node = strtolower($this->characters('A-Za-z', $this->char + 1));
+ $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName;
+
+ if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) &&
+ (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/',
+ $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) {
+ /* If the content model flag is set to the RCDATA or CDATA states then
+ examine the next few characters. If they do not match the tag name of
+ the last start tag token emitted (case insensitively), or if they do but
+ they are not immediately followed by one of the following characters:
+ * U+0009 CHARACTER TABULATION
+ * U+000A LINE FEED (LF)
+ * U+000B LINE TABULATION
+ * U+000C FORM FEED (FF)
+ * U+0020 SPACE
+ * U+003E GREATER-THAN SIGN (>)
+ * U+002F SOLIDUS (/)
+ * EOF
+ ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character
+ token, a U+002F SOLIDUS character token, and switch to the data state
+ to process the next input character. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->state = 'data';
+
+ } else {
+ /* Otherwise, if the content model flag is set to the PCDATA state,
+ or if the next few characters do match that tag name, consume the
+ next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[A-Za-z]$/', $char)) {
+ /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z
+ Create a new end tag token, set its tag name to the lowercase version
+ of the input character (add 0x0020 to the character's code point), then
+ switch to the tag name state. (Don't emit the token yet; further details
+ will be filled in before it is emitted.) */
+ $this->token = array(
+ 'name' => strtolower($char),
+ 'type' => self::ENDTAG
+ );
+
+ $this->state = 'tagName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Parse error. Switch to the data state. */
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F
+ SOLIDUS character token. Reconsume the EOF character in the data state. */
+ $this->emitToken(array(
+ 'type' => self::CHARACTR,
+ 'data' => '</'
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Parse error. Switch to the bogus comment state. */
+ $this->state = 'bogusComment';
+ }
+ }
+ }
+
+ private function tagNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current tag token's tag name.
+ Stay in the tag name state. */
+ $this->token['name'] .= strtolower($char);
+ $this->state = 'tagName';
+ }
+ }
+
+ private function beforeAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Stay in the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function attributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the before
+ attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's name.
+ Stay in the attribute name state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['name'] .= strtolower($char);
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function afterAttributeNameState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the after attribute name state. */
+ $this->state = 'afterAttributeName';
+
+ } elseif($char === '=') {
+ /* U+003D EQUALS SIGN (=)
+ Switch to the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '/' && $this->character($this->char + 1) !== '>') {
+ /* U+002F SOLIDUS (/)
+ Parse error unless this is a permitted slash. Switch to the
+ before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the EOF
+ character in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Start a new attribute in the current tag token. Set that attribute's
+ name to the current input character, and its value to the empty string.
+ Switch to the attribute name state. */
+ $this->token['attr'][] = array(
+ 'name' => strtolower($char),
+ 'value' => null
+ );
+
+ $this->state = 'attributeName';
+ }
+ }
+
+ private function beforeAttributeValueState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Stay in the before attribute value state. */
+ $this->state = 'beforeAttributeValue';
+
+ } elseif($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the attribute value (double-quoted) state. */
+ $this->state = 'attributeValueDoubleQuoted';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the attribute value (unquoted) state and reconsume
+ this input character. */
+ $this->char--;
+ $this->state = 'attributeValueUnquoted';
+
+ } elseif($char === '\'') {
+ /* U+0027 APOSTROPHE (')
+ Switch to the attribute value (single-quoted) state. */
+ $this->state = 'attributeValueSingleQuoted';
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Switch to the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function attributeValueDoubleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '"') {
+ /* U+0022 QUOTATION MARK (")
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('double');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (double-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueDoubleQuoted';
+ }
+ }
+
+ private function attributeValueSingleQuotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if($char === '\'') {
+ /* U+0022 QUOTATION MARK (')
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('single');
+
+ } elseif($this->char === $this->EOF) {
+ /* EOF
+ Parse error. Emit the current tag token. Reconsume the character
+ in the data state. */
+ $this->emitToken($this->token);
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (single-quoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueSingleQuoted';
+ }
+ }
+
+ private function attributeValueUnquotedState()
+ {
+ // Consume the next input character:
+ $this->char++;
+ $char = $this->character($this->char);
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ /* U+0009 CHARACTER TABULATION
+ U+000A LINE FEED (LF)
+ U+000B LINE TABULATION
+ U+000C FORM FEED (FF)
+ U+0020 SPACE
+ Switch to the before attribute name state. */
+ $this->state = 'beforeAttributeName';
+
+ } elseif($char === '&') {
+ /* U+0026 AMPERSAND (&)
+ Switch to the entity in attribute value state. */
+ $this->entityInAttributeValueState('non');
+
+ } elseif($char === '>') {
+ /* U+003E GREATER-THAN SIGN (>)
+ Emit the current tag token. Switch to the data state. */
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } else {
+ /* Anything else
+ Append the current input character to the current attribute's value.
+ Stay in the attribute value (unquoted) state. */
+ $last = count($this->token['attr']) - 1;
+ $this->token['attr'][$last]['value'] .= $char;
+
+ $this->state = 'attributeValueUnquoted';
+ }
+ }
+
+ private function entityInAttributeValueState()
+ {
+ // Attempt to consume an entity.
+ $entity = $this->entity();
+
+ // If nothing is returned, append a U+0026 AMPERSAND character to the
+ // current attribute's value. Otherwise, emit the character token that
+ // was returned.
+ $char = (!$entity)
+ ? '&'
+ : $entity;
+
+ $this->emitToken($char);
+ }
+
+ private function bogusCommentState()
+ {
+ /* Consume every character up to the first U+003E GREATER-THAN SIGN
+ character (>) or the end of the file (EOF), whichever comes first. Emit
+ a comment token whose data is the concatenation of all the characters
+ starting from and including the character that caused the state machine
+ to switch into the bogus comment state, up to and including the last
+ consumed character before the U+003E character, if any, or up to the
+ end of the file otherwise. (If the comment was started by the end of
+ the file (EOF), the token is empty.) */
+ $data = $this->characters('^>', $this->char);
+ $this->emitToken(array(
+ 'data' => $data,
+ 'type' => self::COMMENT
+ ));
+
+ $this->char += strlen($data);
+
+ /* Switch to the data state. */
+ $this->state = 'data';
+
+ /* If the end of the file was reached, reconsume the EOF character. */
+ if($this->char === $this->EOF) {
+ $this->char = $this->EOF - 1;
+ }
+ }
+
+ private function markupDeclarationOpenState()
+ {
+ /* If the next two characters are both U+002D HYPHEN-MINUS (-)
+ characters, consume those two characters, create a comment token whose
+ data is the empty string, and switch to the comment state. */
+ if($this->character($this->char + 1, 2) === '--') {
+ $this->char += 2;
+ $this->state = 'comment';
+ $this->token = array(
+ 'data' => null,
+ 'type' => self::COMMENT
+ );
+
+ /* Otherwise if the next seven chacacters are a case-insensitive match
+ for the word "DOCTYPE", then consume those characters and switch to the
+ DOCTYPE state. */
+ } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') {
+ $this->char += 7;
+ $this->state = 'doctype';
+
+ /* Otherwise, is is a parse error. Switch to the bogus comment state.
+ The next character that is consumed, if any, is the first character
+ that will be in the comment. */
+ } else {
+ $this->char++;
+ $this->state = 'bogusComment';
+ }
+ }
+
+ private function commentState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment dash state */
+ $this->state = 'commentDash';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append the input character to the comment token's data. Stay in
+ the comment state. */
+ $this->token['data'] .= $char;
+ }
+ }
+
+ private function commentDashState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ /* U+002D HYPHEN-MINUS (-) */
+ if($char === '-') {
+ /* Switch to the comment end state */
+ $this->state = 'commentEnd';
+
+ /* EOF */
+ } elseif($this->char === $this->EOF) {
+ /* Parse error. Emit the comment token. Reconsume the EOF character
+ in the data state. */
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ /* Anything else */
+ } else {
+ /* Append a U+002D HYPHEN-MINUS (-) character and the input
+ character to the comment token's data. Switch to the comment state. */
+ $this->token['data'] .= '-'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function commentEndState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($char === '-') {
+ $this->token['data'] .= '-';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['data'] .= '--'.$char;
+ $this->state = 'comment';
+ }
+ }
+
+ private function doctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'beforeDoctypeName';
+
+ } else {
+ $this->char--;
+ $this->state = 'beforeDoctypeName';
+ }
+ }
+
+ private function beforeDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the before DOCTYPE name state.
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token = array(
+ 'name' => strtoupper($char),
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken(array(
+ 'name' => null,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ ));
+
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token = array(
+ 'name' => $char,
+ 'type' => self::DOCTYPE,
+ 'error' => true
+ );
+
+ $this->state = 'doctypeName';
+ }
+ }
+
+ private function doctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ $this->state = 'AfterDoctypeName';
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif(preg_match('/^[a-z]$/', $char)) {
+ $this->token['name'] .= strtoupper($char);
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['name'] .= $char;
+ }
+
+ $this->token['error'] = ($this->token['name'] === 'HTML')
+ ? false
+ : true;
+ }
+
+ private function afterDoctypeNameState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) {
+ // Stay in the DOCTYPE name state.
+
+ } elseif($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ $this->token['error'] = true;
+ $this->state = 'bogusDoctype';
+ }
+ }
+
+ private function bogusDoctypeState()
+ {
+ /* Consume the next input character: */
+ $this->char++;
+ $char = $this->char();
+
+ if($char === '>') {
+ $this->emitToken($this->token);
+ $this->state = 'data';
+
+ } elseif($this->char === $this->EOF) {
+ $this->emitToken($this->token);
+ $this->char--;
+ $this->state = 'data';
+
+ } else {
+ // Stay in the bogus DOCTYPE state.
+ }
+ }
+
+ private function entity()
+ {
+ $start = $this->char;
+
+ // This section defines how to consume an entity. This definition is
+ // used when parsing entities in text and in attributes.
+
+ // The behaviour depends on the identity of the next character (the
+ // one immediately after the U+0026 AMPERSAND character):
+
+ switch($this->character($this->char + 1)) {
+ // U+0023 NUMBER SIGN (#)
+ case '#':
+
+ // The behaviour further depends on the character after the
+ // U+0023 NUMBER SIGN:
+ switch($this->character($this->char + 1)) {
+ // U+0078 LATIN SMALL LETTER X
+ // U+0058 LATIN CAPITAL LETTER X
+ case 'x':
+ case 'X':
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE, U+0061 LATIN SMALL LETTER A through to U+0066
+ // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER
+ // A, through to U+0046 LATIN CAPITAL LETTER F (in other
+ // words, 0-9, A-F, a-f).
+ $char = 1;
+ $char_class = '0-9A-Fa-f';
+ break;
+
+ // Anything else
+ default:
+ // Follow the steps below, but using the range of
+ // characters U+0030 DIGIT ZERO through to U+0039 DIGIT
+ // NINE (i.e. just 0-9).
+ $char = 0;
+ $char_class = '0-9';
+ break;
+ }
+
+ // Consume as many characters as match the range of characters
+ // given above.
+ $this->char++;
+ $e_name = $this->characters($char_class, $this->char + $char + 1);
+ $entity = $this->character($start, $this->char);
+ $cond = strlen($e_name) > 0;
+
+ // The rest of the parsing happens bellow.
+ break;
+
+ // Anything else
+ default:
+ // Consume the maximum number of characters possible, with the
+ // consumed characters case-sensitively matching one of the
+ // identifiers in the first column of the entities table.
+ $e_name = $this->characters('0-9A-Za-z;', $this->char + 1);
+ $len = strlen($e_name);
+
+ for($c = 1; $c <= $len; $c++) {
+ $id = substr($e_name, 0, $c);
+ $this->char++;
+
+ if(in_array($id, $this->entities)) {
+ $entity = $id;
+ break;
+ }
+ }
+
+ $cond = isset($entity);
+ // The rest of the parsing happens bellow.
+ break;
+ }
+
+ if(!$cond) {
+ // If no match can be made, then this is a parse error. No
+ // characters are consumed, and nothing is returned.
+ $this->char = $start;
+ return false;
+ }
+
+ // Return a character token for the character corresponding to the
+ // entity name (as given by the second column of the entities table).
+ return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8');
+ }
+
+ private function emitToken($token)
+ {
+ $emit = $this->tree->emitToken($token);
+
+ if(is_int($emit)) {
+ $this->content_model = $emit;
+
+ } elseif($token['type'] === self::ENDTAG) {
+ $this->content_model = self::PCDATA;
+ }
+ }
+
+ private function EOF()
+ {
+ $this->state = null;
+ $this->tree->emitToken(array(
+ 'type' => self::EOF
+ ));
+ }
+}
+
+class HTML5TreeConstructer
+{
+ public $stack = array();
+
+ private $phase;
+ private $mode;
+ private $dom;
+ private $foster_parent = null;
+ private $a_formatting = array();
+
+ private $head_pointer = null;
+ private $form_pointer = null;
+
+ private $scoping = array('button','caption','html','marquee','object','table','td','th');
+ private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u');
+ private $special = array('address','area','base','basefont','bgsound',
+ 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl',
+ 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5',
+ 'h6','head','hr','iframe','image','img','input','isindex','li','link',
+ 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup',
+ 'option','p','param','plaintext','pre','script','select','spacer','style',
+ 'tbody','textarea','tfoot','thead','title','tr','ul','wbr');
+
+ // The different phases.
+ const INIT_PHASE = 0;
+ const ROOT_PHASE = 1;
+ const MAIN_PHASE = 2;
+ const END_PHASE = 3;
+
+ // The different insertion modes for the main phase.
+ const BEFOR_HEAD = 0;
+ const IN_HEAD = 1;
+ const AFTER_HEAD = 2;
+ const IN_BODY = 3;
+ const IN_TABLE = 4;
+ const IN_CAPTION = 5;
+ const IN_CGROUP = 6;
+ const IN_TBODY = 7;
+ const IN_ROW = 8;
+ const IN_CELL = 9;
+ const IN_SELECT = 10;
+ const AFTER_BODY = 11;
+ const IN_FRAME = 12;
+ const AFTR_FRAME = 13;
+
+ // The different types of elements.
+ const SPECIAL = 0;
+ const SCOPING = 1;
+ const FORMATTING = 2;
+ const PHRASING = 3;
+
+ const MARKER = 0;
+
+ public function __construct()
+ {
+ $this->phase = self::INIT_PHASE;
+ $this->mode = self::BEFOR_HEAD;
+ $this->dom = new DOMDocument;
+
+ $this->dom->encoding = 'UTF-8';
+ $this->dom->preserveWhiteSpace = true;
+ $this->dom->substituteEntities = true;
+ $this->dom->strictErrorChecking = false;
+ }
+
+ // Process tag tokens
+ public function emitToken($token)
+ {
+ switch($this->phase) {
+ case self::INIT_PHASE: return $this->initPhase($token); break;
+ case self::ROOT_PHASE: return $this->rootElementPhase($token); break;
+ case self::MAIN_PHASE: return $this->mainPhase($token); break;
+ case self::END_PHASE : return $this->trailingEndPhase($token); break;
+ }
+ }
+
+ private function initPhase($token)
+ {
+ /* Initially, the tree construction stage must handle each token
+ emitted from the tokenisation stage as follows: */
+
+ /* A DOCTYPE token that is marked as being in error
+ A comment token
+ A start tag token
+ An end tag token
+ A character token that is not one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE
+ An end-of-file token */
+ if((isset($token['error']) && $token['error']) ||
+ $token['type'] === HTML5::COMMENT ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF ||
+ ($token['type'] === HTML5::CHARACTR && isset($token['data']) &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) {
+ /* This specification does not define how to handle this case. In
+ particular, user agents may ignore the entirety of this specification
+ altogether for such documents, and instead invoke special parse modes
+ with a greater emphasis on backwards compatibility. */
+
+ $this->phase = self::ROOT_PHASE;
+ return $this->rootElementPhase($token);
+
+ /* A DOCTYPE token marked as being correct */
+ } elseif(isset($token['error']) && !$token['error']) {
+ /* Append a DocumentType node to the Document node, with the name
+ attribute set to the name given in the DOCTYPE token (which will be
+ "HTML"), and the other attributes specific to DocumentType objects
+ set to null, empty lists, or the empty string as appropriate. */
+ $doctype = new DOMDocumentType(null, null, 'HTML');
+
+ /* Then, switch to the root element phase of the tree construction
+ stage. */
+ $this->phase = self::ROOT_PHASE;
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/',
+ $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+ }
+ }
+
+ private function rootElementPhase($token)
+ {
+ /* After the initial phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append that character to the Document node. */
+ $text = $this->dom->createTextNode($token['data']);
+ $this->dom->appendChild($text);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED
+ (FF), or U+0020 SPACE
+ A start tag token
+ An end tag token
+ An end-of-file token */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG ||
+ $token['type'] === HTML5::ENDTAG ||
+ $token['type'] === HTML5::EOF) {
+ /* Create an HTMLElement node with the tag name html, in the HTML
+ namespace. Append it to the Document object. Switch to the main
+ phase and reprocess the current token. */
+ $html = $this->dom->createElement('html');
+ $this->dom->appendChild($html);
+ $this->stack[] = $html;
+
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+ }
+ }
+
+ private function mainPhase($token)
+ {
+ /* Tokens in the main phase must be handled as follows: */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A start tag token with the tag name "html" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') {
+ /* If this start tag token was not the first start tag token, then
+ it is a parse error. */
+
+ /* For each attribute on the token, check to see if the attribute
+ is already present on the top element of the stack of open elements.
+ If it is not, add the attribute and its corresponding value to that
+ element. */
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[0]->hasAttribute($attr['name'])) {
+ $this->stack[0]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Anything else. */
+ } else {
+ /* Depends on the insertion mode: */
+ switch($this->mode) {
+ case self::BEFOR_HEAD: return $this->beforeHead($token); break;
+ case self::IN_HEAD: return $this->inHead($token); break;
+ case self::AFTER_HEAD: return $this->afterHead($token); break;
+ case self::IN_BODY: return $this->inBody($token); break;
+ case self::IN_TABLE: return $this->inTable($token); break;
+ case self::IN_CAPTION: return $this->inCaption($token); break;
+ case self::IN_CGROUP: return $this->inColumnGroup($token); break;
+ case self::IN_TBODY: return $this->inTableBody($token); break;
+ case self::IN_ROW: return $this->inRow($token); break;
+ case self::IN_CELL: return $this->inCell($token); break;
+ case self::IN_SELECT: return $this->inSelect($token); break;
+ case self::AFTER_BODY: return $this->afterBody($token); break;
+ case self::IN_FRAME: return $this->inFrameset($token); break;
+ case self::AFTR_FRAME: return $this->afterFrameset($token); break;
+ case self::END_PHASE: return $this->trailingEndPhase($token); break;
+ }
+ }
+ }
+
+ private function beforeHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "head" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') {
+ /* Create an element for the token, append the new element to the
+ current node and push it onto the stack of open elements. */
+ $element = $this->insertElement($token);
+
+ /* Set the head element pointer to this new element node. */
+ $this->head_pointer = $element;
+
+ /* Change the insertion mode to "in head". */
+ $this->mode = self::IN_HEAD;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title". Or an end tag with the tag name "html".
+ Or a character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or any other start tag token */
+ } elseif($token['type'] === HTML5::STARTTAG ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') ||
+ ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/',
+ $token['data']))) {
+ /* Act as if a start tag token with the tag name "head" and no
+ attributes had been seen, then reprocess the current token. */
+ $this->beforeHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inHead($token);
+
+ /* Any other end tag */
+ } elseif($token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function inHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE.
+
+ THIS DIFFERS FROM THE SPEC: If the current node is either a title, style
+ or script element, append the character to the current node regardless
+ of its content. */
+ if(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || (
+ $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName,
+ array('title', 'style', 'script')))) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('title', 'style', 'script'))) {
+ array_pop($this->stack);
+ return HTML5::PCDATA;
+
+ /* A start tag with the tag name "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $element = $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the RCDATA state. */
+ return HTML5::RCDATA;
+
+ /* A start tag with the tag name "style" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "script" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') {
+ /* Create an element for the token. */
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+
+ /* A start tag with the tag name "base", "link", or "meta" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta'))) {
+ /* Create an element for the token and append the new element to the
+ node pointed to by the head element pointer, or, if that is null
+ (innerHTML case), to the current node. */
+ if($this->head_pointer !== null) {
+ $element = $this->insertElement($token, false);
+ $this->head_pointer->appendChild($element);
+ array_pop($this->stack);
+
+ } else {
+ $this->insertElement($token);
+ }
+
+ /* An end tag with the tag name "head" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') {
+ /* If the current node is a head element, pop the current node off
+ the stack of open elements. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ array_pop($this->stack);
+
+ /* Otherwise, this is a parse error. */
+ } else {
+ // k
+ }
+
+ /* Change the insertion mode to "after head". */
+ $this->mode = self::AFTER_HEAD;
+
+ /* A start tag with the tag name "head" or an end tag except "html". */
+ } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') ||
+ ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* If the current node is a head element, act as if an end tag
+ token with the tag name "head" had been seen. */
+ if($this->head_pointer->isSameNode(end($this->stack))) {
+ $this->inHead(array(
+ 'name' => 'head',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Otherwise, change the insertion mode to "after head". */
+ } else {
+ $this->mode = self::AFTER_HEAD;
+ }
+
+ /* Then, reprocess the current token. */
+ return $this->afterHead($token);
+ }
+ }
+
+ private function afterHead($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data attribute
+ set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token with the tag name "body" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') {
+ /* Insert a body element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in body". */
+ $this->mode = self::IN_BODY;
+
+ /* A start tag token with the tag name "frameset" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') {
+ /* Insert a frameset element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in frameset". */
+ $this->mode = self::IN_FRAME;
+
+ /* A start tag token whose tag name is one of: "base", "link", "meta",
+ "script", "style", "title" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('base', 'link', 'meta', 'script', 'style', 'title'))) {
+ /* Parse error. Switch the insertion mode back to "in head" and
+ reprocess the token. */
+ $this->mode = self::IN_HEAD;
+ return $this->inHead($token);
+
+ /* Anything else */
+ } else {
+ /* Act as if a start tag token with the tag name "body" and no
+ attributes had been seen, and then reprocess the current token. */
+ $this->afterHead(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inBody($token);
+ }
+ }
+
+ private function inBody($token)
+ {
+ /* Handle the token as follows: */
+
+ switch($token['type']) {
+ /* A character token */
+ case HTML5::CHARACTR:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+ break;
+
+ /* A comment token */
+ case HTML5::COMMENT:
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+ break;
+
+ case HTML5::STARTTAG:
+ switch($token['name']) {
+ /* A start tag token whose tag name is one of: "script",
+ "style" */
+ case 'script': case 'style':
+ /* Process the token as if the insertion mode had been "in
+ head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token whose tag name is one of: "base", "link",
+ "meta", "title" */
+ case 'base': case 'link': case 'meta': case 'title':
+ /* Parse error. Process the token as if the insertion mode
+ had been "in head". */
+ return $this->inHead($token);
+ break;
+
+ /* A start tag token with the tag name "body" */
+ case 'body':
+ /* Parse error. If the second element on the stack of open
+ elements is not a body element, or, if the stack of open
+ elements has only one node on it, then ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore
+
+ /* Otherwise, for each attribute on the token, check to see
+ if the attribute is already present on the body element (the
+ second element) on the stack of open elements. If it is not,
+ add the attribute and its corresponding value to that
+ element. */
+ } else {
+ foreach($token['attr'] as $attr) {
+ if(!$this->stack[1]->hasAttribute($attr['name'])) {
+ $this->stack[1]->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+ }
+ break;
+
+ /* A start tag whose tag name is one of: "address",
+ "blockquote", "center", "dir", "div", "dl", "fieldset",
+ "listing", "menu", "ol", "p", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'p': case 'ul':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "form" */
+ case 'form':
+ /* If the form element pointer is not null, ignore the
+ token with a parse error. */
+ if($this->form_pointer !== null) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* If the stack of open elements has a p element in
+ scope, then act as if an end tag with the tag name p
+ had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token, and set the
+ form element pointer to point to the element created. */
+ $element = $this->insertElement($token);
+ $this->form_pointer = $element;
+ }
+ break;
+
+ /* A start tag whose tag name is "li", "dd" or "dt" */
+ case 'li': case 'dd': case 'dt':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ $stack_length = count($this->stack) - 1;
+
+ for($n = $stack_length; 0 <= $n; $n--) {
+ /* 1. Initialise node to be the current node (the
+ bottommost node of the stack). */
+ $stop = false;
+ $node = $this->stack[$n];
+ $cat = $this->getElementCategory($node->tagName);
+
+ /* 2. If node is an li, dd or dt element, then pop all
+ the nodes from the current node up to node, including
+ node, then stop this algorithm. */
+ if($token['name'] === $node->tagName || ($token['name'] !== 'li'
+ && ($node->tagName === 'dd' || $node->tagName === 'dt'))) {
+ for($x = $stack_length; $x >= $n ; $x--) {
+ array_pop($this->stack);
+ }
+
+ break;
+ }
+
+ /* 3. If node is not in the formatting category, and is
+ not in the phrasing category, and is not an address or
+ div element, then stop this algorithm. */
+ if($cat !== self::FORMATTING && $cat !== self::PHRASING &&
+ $node->tagName !== 'address' && $node->tagName !== 'div') {
+ break;
+ }
+ }
+
+ /* Finally, insert an HTML element with the same tag
+ name as the token's. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag token whose tag name is "plaintext" */
+ case 'plaintext':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been
+ seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ return HTML5::PLAINTEXT;
+ break;
+
+ /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ this is a parse error; pop elements from the stack until an
+ element with one of those tag names has been popped from the
+ stack. */
+ while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) {
+ array_pop($this->stack);
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+ break;
+
+ /* A start tag whose tag name is "a" */
+ case 'a':
+ /* If the list of active formatting elements contains
+ an element whose tag name is "a" between the end of the
+ list and the last marker on the list (or the start of
+ the list if there is no marker on the list), then this
+ is a parse error; act as if an end tag with the tag name
+ "a" had been seen, then remove that element from the list
+ of active formatting elements and the stack of open
+ elements if the end tag didn't already remove it (it
+ might not have if the element is not in table scope). */
+ $leng = count($this->a_formatting);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ if($this->a_formatting[$n] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$n]->nodeName === 'a') {
+ $this->emitToken(array(
+ 'name' => 'a',
+ 'type' => HTML5::ENDTAG
+ ));
+ break;
+ }
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag whose tag name is one of: "b", "big", "em", "font",
+ "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'b': case 'big': case 'em': case 'font': case 'i':
+ case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $el = $this->insertElement($token);
+
+ /* Add that element to the list of active formatting
+ elements. */
+ $this->a_formatting[] = $el;
+ break;
+
+ /* A start tag token whose tag name is "button" */
+ case 'button':
+ /* If the stack of open elements has a button element in scope,
+ then this is a parse error; act as if an end tag with the tag
+ name "button" had been seen, then reprocess the token. (We don't
+ do that. Unnecessary.) */
+ if($this->elementInScope('button')) {
+ $this->inBody(array(
+ 'name' => 'button',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is one of: "marquee", "object" */
+ case 'marquee': case 'object':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+ break;
+
+ /* A start tag token whose tag name is "xmp" */
+ case 'xmp':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Switch the content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "table" */
+ case 'table':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* A start tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'img': case 'param': case 'spacer':
+ case 'wbr':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "hr" */
+ case 'hr':
+ /* If the stack of open elements has a p element in scope,
+ then act as if an end tag with the tag name p had been seen. */
+ if($this->elementInScope('p')) {
+ $this->emitToken(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "image" */
+ case 'image':
+ /* Parse error. Change the token's tag name to "img" and
+ reprocess it. (Don't ask.) */
+ $token['name'] = 'img';
+ return $this->inBody($token);
+ break;
+
+ /* A start tag whose tag name is "input" */
+ case 'input':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an input element for the token. */
+ $element = $this->insertElement($token, false);
+
+ /* If the form element pointer is not null, then associate the
+ input element with the form element pointed to by the form
+ element pointer. */
+ $this->form_pointer !== null
+ ? $this->form_pointer->appendChild($element)
+ : end($this->stack)->appendChild($element);
+
+ /* Pop that input element off the stack of open elements. */
+ array_pop($this->stack);
+ break;
+
+ /* A start tag whose tag name is "isindex" */
+ case 'isindex':
+ /* Parse error. */
+ // w/e
+
+ /* If the form element pointer is not null,
+ then ignore the token. */
+ if($this->form_pointer === null) {
+ /* Act as if a start tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a start tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ /* Act as if a stream of character tokens had been seen. */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if a start tag token with the tag name "input"
+ had been seen, with all the attributes from the "isindex"
+ token, except with the "name" attribute set to the value
+ "isindex" (ignoring any explicit "name" attribute). */
+ $attr = $token['attr'];
+ $attr[] = array('name' => 'name', 'value' => 'isindex');
+
+ $this->inBody(array(
+ 'name' => 'input',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => $attr
+ ));
+
+ /* Act as if a stream of character tokens had been seen
+ (see below for what they should say). */
+ $this->insertText('This is a searchable index. '.
+ 'Insert your search keywords here: ');
+
+ /* Act as if an end tag token with the tag name "label"
+ had been seen. */
+ $this->inBody(array(
+ 'name' => 'label',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "p" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'p',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if a start tag token with the tag name "hr" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'hr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* Act as if an end tag token with the tag name "form" had
+ been seen. */
+ $this->inBody(array(
+ 'name' => 'form',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+ break;
+
+ /* A start tag whose tag name is "textarea" */
+ case 'textarea':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the
+ RCDATA state. */
+ return HTML5::RCDATA;
+ break;
+
+ /* A start tag whose tag name is one of: "iframe", "noembed",
+ "noframes" */
+ case 'iframe': case 'noembed': case 'noframes':
+ $this->insertElement($token);
+
+ /* Switch the tokeniser's content model flag to the CDATA state. */
+ return HTML5::CDATA;
+ break;
+
+ /* A start tag whose tag name is "select" */
+ case 'select':
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Change the insertion mode to "in select". */
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* A start or end tag whose tag name is one of: "caption", "col",
+ "colgroup", "frame", "frameset", "head", "option", "optgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr". */
+ case 'caption': case 'col': case 'colgroup': case 'frame':
+ case 'frameset': case 'head': case 'option': case 'optgroup':
+ case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead':
+ case 'tr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* A start or end tag whose tag name is one of: "event-source",
+ "section", "nav", "article", "aside", "header", "footer",
+ "datagrid", "command" */
+ case 'event-source': case 'section': case 'nav': case 'article':
+ case 'aside': case 'header': case 'footer': case 'datagrid':
+ case 'command':
+ // Work in progress!
+ break;
+
+ /* A start tag token not covered by the previous entries */
+ default:
+ /* Reconstruct the active formatting elements, if any. */
+ $this->reconstructActiveFormattingElements();
+
+ $this->insertElement($token);
+ break;
+ }
+ break;
+
+ case HTML5::ENDTAG:
+ switch($token['name']) {
+ /* An end tag with the tag name "body" */
+ case 'body':
+ /* If the second element in the stack of open elements is
+ not a body element, this is a parse error. Ignore the token.
+ (innerHTML case) */
+ if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') {
+ // Ignore.
+
+ /* If the current node is not the body element, then this
+ is a parse error. */
+ } elseif(end($this->stack)->nodeName !== 'body') {
+ // Parse error.
+ }
+
+ /* Change the insertion mode to "after body". */
+ $this->mode = self::AFTER_BODY;
+ break;
+
+ /* An end tag with the tag name "html" */
+ case 'html':
+ /* Act as if an end tag with tag name "body" had been seen,
+ then, if that token wasn't ignored, reprocess the current
+ token. */
+ $this->inBody(array(
+ 'name' => 'body',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->afterBody($token);
+ break;
+
+ /* An end tag whose tag name is one of: "address", "blockquote",
+ "center", "dir", "div", "dl", "fieldset", "listing", "menu",
+ "ol", "pre", "ul" */
+ case 'address': case 'blockquote': case 'center': case 'dir':
+ case 'div': case 'dl': case 'fieldset': case 'listing':
+ case 'menu': case 'ol': case 'pre': case 'ul':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with
+ the same tag name as that of the token, then this
+ is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in
+ scope with the same tag name as that of the token,
+ then pop elements from this stack until an element
+ with that tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "form" */
+ case 'form':
+ /* If the stack of open elements has an element in scope
+ with the same tag name as that of the token, then generate
+ implied end tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ }
+
+ if(end($this->stack)->nodeName !== $token['name']) {
+ /* Now, if the current node is not an element with the
+ same tag name as that of the token, then this is a parse
+ error. */
+ // w/e
+
+ } else {
+ /* Otherwise, if the current node is an element with
+ the same tag name as that of the token pop that element
+ from the stack. */
+ array_pop($this->stack);
+ }
+
+ /* In any case, set the form element pointer to null. */
+ $this->form_pointer = null;
+ break;
+
+ /* An end tag whose tag name is "p" */
+ case 'p':
+ /* If the stack of open elements has a p element in scope,
+ then generate implied end tags, except for p elements. */
+ if($this->elementInScope('p')) {
+ $this->generateImpliedEndTags(array('p'));
+
+ /* If the current node is not a p element, then this is
+ a parse error. */
+ // k
+
+ /* If the stack of open elements has a p element in
+ scope, then pop elements from this stack until the stack
+ no longer has a p element in scope. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->elementInScope('p')) {
+ array_pop($this->stack);
+
+ } else {
+ break;
+ }
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is "dd", "dt", or "li" */
+ case 'dd': case 'dt': case 'li':
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ generate implied end tags, except for elements with the
+ same tag name as the token. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* If the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then
+ pop elements from this stack until an element with that
+ tag name has been popped from the stack. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
+ "h5", "h6" */
+ case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
+ $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+
+ /* If the stack of open elements has in scope an element whose
+ tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
+ generate implied end tags. */
+ if($this->elementInScope($elements)) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as that of the token, then this is a parse error. */
+ // w/e
+
+ /* If the stack of open elements has in scope an element
+ whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
+ "h6", then pop elements from the stack until an element
+ with one of those tag names has been popped from the stack. */
+ while($this->elementInScope($elements)) {
+ array_pop($this->stack);
+ }
+ }
+ break;
+
+ /* An end tag whose tag name is one of: "a", "b", "big", "em",
+ "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
+ case 'a': case 'b': case 'big': case 'em': case 'font':
+ case 'i': case 'nobr': case 's': case 'small': case 'strike':
+ case 'strong': case 'tt': case 'u':
+ /* 1. Let the formatting element be the last element in
+ the list of active formatting elements that:
+ * is between the end of the list and the last scope
+ marker in the list, if any, or the start of the list
+ otherwise, and
+ * has the same tag name as the token.
+ */
+ while(true) {
+ for($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
+ if($this->a_formatting[$a] === self::MARKER) {
+ break;
+
+ } elseif($this->a_formatting[$a]->tagName === $token['name']) {
+ $formatting_element = $this->a_formatting[$a];
+ $in_stack = in_array($formatting_element, $this->stack, true);
+ $fe_af_pos = $a;
+ break;
+ }
+ }
+
+ /* If there is no such node, or, if that node is
+ also in the stack of open elements but the element
+ is not in scope, then this is a parse error. Abort
+ these steps. The token is ignored. */
+ if(!isset($formatting_element) || ($in_stack &&
+ !$this->elementInScope($token['name']))) {
+ break;
+
+ /* Otherwise, if there is such a node, but that node
+ is not in the stack of open elements, then this is a
+ parse error; remove the element from the list, and
+ abort these steps. */
+ } elseif(isset($formatting_element) && !$in_stack) {
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 2. Let the furthest block be the topmost node in the
+ stack of open elements that is lower in the stack
+ than the formatting element, and is not an element in
+ the phrasing or formatting categories. There might
+ not be one. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $length = count($this->stack);
+
+ for($s = $fe_s_pos + 1; $s < $length; $s++) {
+ $category = $this->getElementCategory($this->stack[$s]->nodeName);
+
+ if($category !== self::PHRASING && $category !== self::FORMATTING) {
+ $furthest_block = $this->stack[$s];
+ }
+ }
+
+ /* 3. If there is no furthest block, then the UA must
+ skip the subsequent steps and instead just pop all
+ the nodes from the bottom of the stack of open
+ elements, from the current node up to the formatting
+ element, and remove the formatting element from the
+ list of active formatting elements. */
+ if(!isset($furthest_block)) {
+ for($n = $length - 1; $n >= $fe_s_pos; $n--) {
+ array_pop($this->stack);
+ }
+
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+ break;
+ }
+
+ /* 4. Let the common ancestor be the element
+ immediately above the formatting element in the stack
+ of open elements. */
+ $common_ancestor = $this->stack[$fe_s_pos - 1];
+
+ /* 5. If the furthest block has a parent node, then
+ remove the furthest block from its parent node. */
+ if($furthest_block->parentNode !== null) {
+ $furthest_block->parentNode->removeChild($furthest_block);
+ }
+
+ /* 6. Let a bookmark note the position of the
+ formatting element in the list of active formatting
+ elements relative to the elements on either side
+ of it in the list. */
+ $bookmark = $fe_af_pos;
+
+ /* 7. Let node and last node be the furthest block.
+ Follow these steps: */
+ $node = $furthest_block;
+ $last_node = $furthest_block;
+
+ while(true) {
+ for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
+ /* 7.1 Let node be the element immediately
+ prior to node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 7.2 If node is not in the list of active
+ formatting elements, then remove node from
+ the stack of open elements and then go back
+ to step 1. */
+ if(!in_array($node, $this->a_formatting, true)) {
+ unset($this->stack[$n]);
+ $this->stack = array_merge($this->stack);
+
+ } else {
+ break;
+ }
+ }
+
+ /* 7.3 Otherwise, if node is the formatting
+ element, then go to the next step in the overall
+ algorithm. */
+ if($node === $formatting_element) {
+ break;
+
+ /* 7.4 Otherwise, if last node is the furthest
+ block, then move the aforementioned bookmark to
+ be immediately after the node in the list of
+ active formatting elements. */
+ } elseif($last_node === $furthest_block) {
+ $bookmark = array_search($node, $this->a_formatting, true) + 1;
+ }
+
+ /* 7.5 If node has any children, perform a
+ shallow clone of node, replace the entry for
+ node in the list of active formatting elements
+ with an entry for the clone, replace the entry
+ for node in the stack of open elements with an
+ entry for the clone, and let node be the clone. */
+ if($node->hasChildNodes()) {
+ $clone = $node->cloneNode();
+ $s_pos = array_search($node, $this->stack, true);
+ $a_pos = array_search($node, $this->a_formatting, true);
+
+ $this->stack[$s_pos] = $clone;
+ $this->a_formatting[$a_pos] = $clone;
+ $node = $clone;
+ }
+
+ /* 7.6 Insert last node into node, first removing
+ it from its previous parent node if any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $node->appendChild($last_node);
+
+ /* 7.7 Let last node be node. */
+ $last_node = $node;
+ }
+
+ /* 8. Insert whatever last node ended up being in
+ the previous step into the common ancestor node,
+ first removing it from its previous parent node if
+ any. */
+ if($last_node->parentNode !== null) {
+ $last_node->parentNode->removeChild($last_node);
+ }
+
+ $common_ancestor->appendChild($last_node);
+
+ /* 9. Perform a shallow clone of the formatting
+ element. */
+ $clone = $formatting_element->cloneNode();
+
+ /* 10. Take all of the child nodes of the furthest
+ block and append them to the clone created in the
+ last step. */
+ while($furthest_block->hasChildNodes()) {
+ $child = $furthest_block->firstChild;
+ $furthest_block->removeChild($child);
+ $clone->appendChild($child);
+ }
+
+ /* 11. Append that clone to the furthest block. */
+ $furthest_block->appendChild($clone);
+
+ /* 12. Remove the formatting element from the list
+ of active formatting elements, and insert the clone
+ into the list of active formatting elements at the
+ position of the aforementioned bookmark. */
+ $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
+ unset($this->a_formatting[$fe_af_pos]);
+ $this->a_formatting = array_merge($this->a_formatting);
+
+ $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
+ $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting));
+ $this->a_formatting = array_merge($af_part1, array($clone), $af_part2);
+
+ /* 13. Remove the formatting element from the stack
+ of open elements, and insert the clone into the stack
+ of open elements immediately after (i.e. in a more
+ deeply nested position than) the position of the
+ furthest block in that stack. */
+ $fe_s_pos = array_search($formatting_element, $this->stack, true);
+ $fb_s_pos = array_search($furthest_block, $this->stack, true);
+ unset($this->stack[$fe_s_pos]);
+
+ $s_part1 = array_slice($this->stack, 0, $fb_s_pos);
+ $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack));
+ $this->stack = array_merge($s_part1, array($clone), $s_part2);
+
+ /* 14. Jump back to step 1 in this series of steps. */
+ unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
+ }
+ break;
+
+ /* An end tag token whose tag name is one of: "button",
+ "marquee", "object" */
+ case 'button': case 'marquee': case 'object':
+ /* If the stack of open elements has an element in scope whose
+ tag name matches the tag name of the token, then generate implied
+ tags. */
+ if($this->elementInScope($token['name'])) {
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not an element with the same
+ tag name as the token, then this is a parse error. */
+ // k
+
+ /* Now, if the stack of open elements has an element in scope
+ whose tag name matches the tag name of the token, then pop
+ elements from the stack until that element has been popped from
+ the stack, and clear the list of active formatting elements up
+ to the last marker. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === $token['name']) {
+ $n = -1;
+ }
+
+ array_pop($this->stack);
+ }
+
+ $marker = end(array_keys($this->a_formatting, self::MARKER, true));
+
+ for($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
+ array_pop($this->a_formatting);
+ }
+ }
+ break;
+
+ /* Or an end tag whose tag name is one of: "area", "basefont",
+ "bgsound", "br", "embed", "hr", "iframe", "image", "img",
+ "input", "isindex", "noembed", "noframes", "param", "select",
+ "spacer", "table", "textarea", "wbr" */
+ case 'area': case 'basefont': case 'bgsound': case 'br':
+ case 'embed': case 'hr': case 'iframe': case 'image':
+ case 'img': case 'input': case 'isindex': case 'noembed':
+ case 'noframes': case 'param': case 'select': case 'spacer':
+ case 'table': case 'textarea': case 'wbr':
+ // Parse error. Ignore the token.
+ break;
+
+ /* An end tag token not covered by the previous entries */
+ default:
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ /* Initialise node to be the current node (the bottommost
+ node of the stack). */
+ $node = end($this->stack);
+
+ /* If node has the same tag name as the end tag token,
+ then: */
+ if($token['name'] === $node->nodeName) {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* If the tag name of the end tag token does not
+ match the tag name of the current node, this is a
+ parse error. */
+ // k
+
+ /* Pop all the nodes from the current node up to
+ node, including node, then stop this algorithm. */
+ for($x = count($this->stack) - $n; $x >= $n; $x--) {
+ array_pop($this->stack);
+ }
+
+ } else {
+ $category = $this->getElementCategory($node);
+
+ if($category !== self::SPECIAL && $category !== self::SCOPING) {
+ /* Otherwise, if node is in neither the formatting
+ category nor the phrasing category, then this is a
+ parse error. Stop this algorithm. The end tag token
+ is ignored. */
+ return false;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ private function inTable($token)
+ {
+ $clear = array('html', 'table');
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "caption" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'caption') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a marker at the end of the list of active
+ formatting elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in caption". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CAPTION;
+
+ /* A start tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'colgroup') {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the
+ insertion mode to "in column group". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CGROUP;
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'col') {
+ $this->inTable(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ $this->inColumnGroup($token);
+
+ /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('tbody', 'tfoot', 'thead'))) {
+ /* Clear the stack back to a table context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in table body". */
+ $this->insertElement($token);
+ $this->mode = self::IN_TBODY;
+
+ /* A start tag whose tag name is one of: "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ in_array($token['name'], array('td', 'th', 'tr'))) {
+ /* Act as if a start tag token with the tag name "tbody" had been
+ seen, then reprocess the current token. */
+ $this->inTable(array(
+ 'name' => 'tbody',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inTableBody($token);
+
+ /* A start tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'table') {
+ /* Parse error. Act as if an end tag token with the tag name "table"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inTable(array(
+ 'name' => 'table',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+
+ /* An end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ return false;
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a table element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a table element has been
+ popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'table') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',
+ 'tfoot', 'th', 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Parse error. Process the token as if the insertion mode was "in
+ body", with the following exception: */
+
+ /* If the current node is a table, tbody, tfoot, thead, or tr
+ element, then, whenever a node would be inserted into the current
+ node, it must instead be inserted into the foster parent element. */
+ if(in_array(end($this->stack)->nodeName,
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* The foster parent element is the parent element of the last
+ table element in the stack of open elements, if there is a
+ table element and it has such a parent element. If there is no
+ table element in the stack of open elements (innerHTML case),
+ then the foster parent element is the first element in the
+ stack of open elements (the html element). Otherwise, if there
+ is a table element in the stack of open elements, but the last
+ table element in the stack of open elements has no parent, or
+ its parent node is not an element, then the foster parent
+ element is the element before the last table element in the
+ stack of open elements. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table') {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $table->parentNode !== null) {
+ $this->foster_parent = $table->parentNode;
+
+ } elseif(!isset($table)) {
+ $this->foster_parent = $this->stack[0];
+
+ } elseif(isset($table) && ($table->parentNode === null ||
+ $table->parentNode->nodeType !== XML_ELEMENT_NODE)) {
+ $this->foster_parent = $this->stack[$n - 1];
+ }
+ }
+
+ $this->inBody($token);
+ }
+ }
+
+ private function inCaption($token)
+ {
+ /* An end tag whose tag name is "caption" */
+ if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags. */
+ $this->generateImpliedEndTags();
+
+ /* Now, if the current node is not a caption element, then this
+ is a parse error. */
+ // w/e
+
+ /* Pop elements from this stack until a caption element has
+ been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === 'caption') {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in table". */
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
+ name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'table')) {
+ /* Parse error. Act as if an end tag with the tag name "caption"
+ had been seen, then, if that token wasn't ignored, reprocess the
+ current token. */
+ $this->inCaption(array(
+ 'name' => 'caption',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+
+ /* An end tag whose tag name is one of: "body", "col", "colgroup",
+ "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ // Parse error. Ignore the token.
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inColumnGroup($token)
+ {
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $text = $this->dom->createTextNode($token['data']);
+ end($this->stack)->appendChild($text);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ end($this->stack)->appendChild($comment);
+
+ /* A start tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') {
+ /* Insert a col element for the token. Immediately pop the current
+ node off the stack of open elements. */
+ $this->insertElement($token);
+ array_pop($this->stack);
+
+ /* An end tag whose tag name is "colgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'colgroup') {
+ /* If the current node is the root html element, then this is a
+ parse error, ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ /* Otherwise, pop the current node (which will be a colgroup
+ element) from the stack of open elements. Switch the insertion
+ mode to "in table". */
+ } else {
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* An end tag whose tag name is "col" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Act as if an end tag with the tag name "colgroup" had been seen,
+ and then, if that token wasn't ignored, reprocess the current token. */
+ $this->inColumnGroup(array(
+ 'name' => 'colgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inTable($token);
+ }
+ }
+
+ private function inTableBody($token)
+ {
+ $clear = array('tbody', 'tfoot', 'thead', 'html');
+
+ /* A start tag whose tag name is "tr" */
+ if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert a tr element for the token, then switch the insertion
+ mode to "in row". */
+ $this->insertElement($token);
+ $this->mode = self::IN_ROW;
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Parse error. Act as if a start tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => 'tr',
+ 'type' => HTML5::STARTTAG,
+ 'attr' => array()
+ ));
+
+ return $this->inRow($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node from the stack of open elements. Switch
+ the insertion mode to "in table". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TABLE;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
+ } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) ||
+ ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) {
+ /* If the stack of open elements does not have a tbody, thead, or
+ tfoot element in table scope, this is a parse error. Ignore the
+ token. (innerHTML case) */
+ if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table body context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Act as if an end tag with the same tag name as the current
+ node ("tbody", "tfoot", or "thead") had been seen, then
+ reprocess the current token. */
+ $this->inTableBody(array(
+ 'name' => end($this->stack)->nodeName,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->mainPhase($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inRow($token)
+ {
+ $clear = array('tr', 'html');
+
+ /* A start tag whose tag name is one of: "th", "td" */
+ if($token['type'] === HTML5::STARTTAG &&
+ ($token['name'] === 'th' || $token['name'] === 'td')) {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Insert an HTML element for the token, then switch the insertion
+ mode to "in cell". */
+ $this->insertElement($token);
+ $this->mode = self::IN_CELL;
+
+ /* Insert a marker at the end of the list of active formatting
+ elements. */
+ $this->a_formatting[] = self::MARKER;
+
+ /* An end tag whose tag name is "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Clear the stack back to a table row context. */
+ $this->clearStackToTableContext($clear);
+
+ /* Pop the current node (which will be a tr element) from the
+ stack of open elements. Switch the insertion mode to "in table
+ body". */
+ array_pop($this->stack);
+ $this->mode = self::IN_TBODY;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* Act as if an end tag with the tag name "tr" had been seen, then,
+ if that token wasn't ignored, reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+
+ /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ in_array($token['name'], array('tbody', 'tfoot', 'thead'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Otherwise, act as if an end tag with the tag name "tr" had
+ been seen, then reprocess the current token. */
+ $this->inRow(array(
+ 'name' => 'tr',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ return $this->inCell($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html", "td", "th" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) {
+ /* Parse error. Ignore the token. */
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in table". */
+ $this->inTable($token);
+ }
+ }
+
+ private function inCell($token)
+ {
+ /* An end tag whose tag name is one of: "td", "th" */
+ if($token['type'] === HTML5::ENDTAG &&
+ ($token['name'] === 'td' || $token['name'] === 'th')) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token, then this is a
+ parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise: */
+ } else {
+ /* Generate implied end tags, except for elements with the same
+ tag name as the token. */
+ $this->generateImpliedEndTags(array($token['name']));
+
+ /* Now, if the current node is not an element with the same tag
+ name as the token, then this is a parse error. */
+ // k
+
+ /* Pop elements from this stack until an element with the same
+ tag name as the token has been popped from the stack. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($node === $token['name']) {
+ break;
+ }
+ }
+
+ /* Clear the list of active formatting elements up to the last
+ marker. */
+ $this->clearTheActiveFormattingElementsUpToTheLastMarker();
+
+ /* Switch the insertion mode to "in row". (The current node
+ will be a tr element at this point.) */
+ $this->mode = self::IN_ROW;
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* A start tag whose tag name is one of: "caption", "col", "colgroup",
+ "tbody", "td", "tfoot", "th", "thead", "tr" */
+ } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'],
+ array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
+ 'thead', 'tr'))) {
+ /* If the stack of open elements does not have a td or th element
+ in table scope, then this is a parse error; ignore the token.
+ (innerHTML case) */
+ if(!$this->elementInScope(array('td', 'th'), true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* An end tag whose tag name is one of: "body", "caption", "col",
+ "colgroup", "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('body', 'caption', 'col', 'colgroup', 'html'))) {
+ /* Parse error. Ignore the token. */
+
+ /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
+ "thead", "tr" */
+ } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'],
+ array('table', 'tbody', 'tfoot', 'thead', 'tr'))) {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as that of the token (which can only
+ happen for "tbody", "tfoot" and "thead", or, in the innerHTML case),
+ then this is a parse error and the token must be ignored. */
+ if(!$this->elementInScope($token['name'], true)) {
+ // Ignore.
+
+ /* Otherwise, close the cell (see below) and reprocess the current
+ token. */
+ } else {
+ $this->closeCell();
+ return $this->inRow($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Process the token as if the insertion mode was "in body". */
+ $this->inBody($token);
+ }
+ }
+
+ private function inSelect($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token */
+ if($token['type'] === HTML5::CHARACTR) {
+ /* Append the token's character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* A start tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::STARTTAG &&
+ $token['name'] === 'optgroup') {
+ /* If the current node is an option element, act as if an end tag
+ with the tag name "option" had been seen. */
+ if(end($this->stack)->nodeName === 'option') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, act as if an end tag
+ with the tag name "optgroup" had been seen. */
+ if(end($this->stack)->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'optgroup',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* An end tag token whose tag name is "optgroup" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'optgroup') {
+ /* First, if the current node is an option element, and the node
+ immediately before it in the stack of open elements is an optgroup
+ element, then act as if an end tag with the tag name "option" had
+ been seen. */
+ $elements_in_stack = count($this->stack);
+
+ if($this->stack[$elements_in_stack - 1]->nodeName === 'option' &&
+ $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') {
+ $this->inSelect(array(
+ 'name' => 'option',
+ 'type' => HTML5::ENDTAG
+ ));
+ }
+
+ /* If the current node is an optgroup element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if($this->stack[$elements_in_stack - 1] === 'optgroup') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag token whose tag name is "option" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'option') {
+ /* If the current node is an option element, then pop that node
+ from the stack of open elements. Otherwise, this is a parse error,
+ ignore the token. */
+ if(end($this->stack)->nodeName === 'option') {
+ array_pop($this->stack);
+ }
+
+ /* An end tag whose tag name is "select" */
+ } elseif($token['type'] === HTML5::ENDTAG &&
+ $token['name'] === 'select') {
+ /* If the stack of open elements does not have an element in table
+ scope with the same tag name as the token, this is a parse error.
+ Ignore the token. (innerHTML case) */
+ if(!$this->elementInScope($token['name'], true)) {
+ // w/e
+
+ /* Otherwise: */
+ } else {
+ /* Pop elements from the stack of open elements until a select
+ element has been popped from the stack. */
+ while(true) {
+ $current = end($this->stack)->nodeName;
+ array_pop($this->stack);
+
+ if($current === 'select') {
+ break;
+ }
+ }
+
+ /* Reset the insertion mode appropriately. */
+ $this->resetInsertionMode();
+ }
+
+ /* A start tag whose tag name is "select" */
+ } elseif($token['name'] === 'select' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Parse error. Act as if the token had been an end tag with the
+ tag name "select" instead. */
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ /* An end tag whose tag name is one of: "caption", "table", "tbody",
+ "tfoot", "thead", "tr", "td", "th" */
+ } elseif(in_array($token['name'], array('caption', 'table', 'tbody',
+ 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. */
+ // w/e
+
+ /* If the stack of open elements has an element in table scope with
+ the same tag name as that of the token, then act as if an end tag
+ with the tag name "select" had been seen, and reprocess the token.
+ Otherwise, ignore the token. */
+ if($this->elementInScope($token['name'], true)) {
+ $this->inSelect(array(
+ 'name' => 'select',
+ 'type' => HTML5::ENDTAG
+ ));
+
+ $this->mainPhase($token);
+ }
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterBody($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed if the insertion mode
+ was "in body". */
+ $this->inBody($token);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the first element in the stack of open
+ elements (the html element), with the data attribute set to the
+ data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->stack[0]->appendChild($comment);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') {
+ /* If the parser was originally created in order to handle the
+ setting of an element's innerHTML attribute, this is a parse error;
+ ignore the token. (The element will be an html element in this
+ case.) (innerHTML case) */
+
+ /* Otherwise, switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* Anything else */
+ } else {
+ /* Parse error. Set the insertion mode to "in body" and reprocess
+ the token. */
+ $this->mode = self::IN_BODY;
+ return $this->inBody($token);
+ }
+ }
+
+ private function inFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* A start tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::STARTTAG) {
+ $this->insertElement($token);
+
+ /* An end tag with the tag name "frameset" */
+ } elseif($token['name'] === 'frameset' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* If the current node is the root html element, then this is a
+ parse error; ignore the token. (innerHTML case) */
+ if(end($this->stack)->nodeName === 'html') {
+ // Ignore
+
+ } else {
+ /* Otherwise, pop the current node from the stack of open
+ elements. */
+ array_pop($this->stack);
+
+ /* If the parser was not originally created in order to handle
+ the setting of an element's innerHTML attribute (innerHTML case),
+ and the current node is no longer a frameset element, then change
+ the insertion mode to "after frameset". */
+ $this->mode = self::AFTR_FRAME;
+ }
+
+ /* A start tag with the tag name "frame" */
+ } elseif($token['name'] === 'frame' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Insert an HTML element for the token. */
+ $this->insertElement($token);
+
+ /* Immediately pop the current node off the stack of open elements. */
+ array_pop($this->stack);
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function afterFrameset($token)
+ {
+ /* Handle the token as follows: */
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
+ if($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Append the character to the current node. */
+ $this->insertText($token['data']);
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the current node with the data
+ attribute set to the data given in the comment token. */
+ $this->insertComment($token['data']);
+
+ /* An end tag with the tag name "html" */
+ } elseif($token['name'] === 'html' &&
+ $token['type'] === HTML5::ENDTAG) {
+ /* Switch to the trailing end phase. */
+ $this->phase = self::END_PHASE;
+
+ /* A start tag with the tag name "noframes" */
+ } elseif($token['name'] === 'noframes' &&
+ $token['type'] === HTML5::STARTTAG) {
+ /* Process the token as if the insertion mode had been "in body". */
+ $this->inBody($token);
+
+ /* Anything else */
+ } else {
+ /* Parse error. Ignore the token. */
+ }
+ }
+
+ private function trailingEndPhase($token)
+ {
+ /* After the main phase, as each token is emitted from the tokenisation
+ stage, it must be processed as described in this section. */
+
+ /* A DOCTYPE token */
+ if($token['type'] === HTML5::DOCTYPE) {
+ // Parse error. Ignore the token.
+
+ /* A comment token */
+ } elseif($token['type'] === HTML5::COMMENT) {
+ /* Append a Comment node to the Document object with the data
+ attribute set to the data given in the comment token. */
+ $comment = $this->dom->createComment($token['data']);
+ $this->dom->appendChild($comment);
+
+ /* A character token that is one of one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE */
+ } elseif($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) {
+ /* Process the token as it would be processed in the main phase. */
+ $this->mainPhase($token);
+
+ /* A character token that is not one of U+0009 CHARACTER TABULATION,
+ U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
+ or U+0020 SPACE. Or a start tag token. Or an end tag token. */
+ } elseif(($token['type'] === HTML5::CHARACTR &&
+ preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) ||
+ $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) {
+ /* Parse error. Switch back to the main phase and reprocess the
+ token. */
+ $this->phase = self::MAIN_PHASE;
+ return $this->mainPhase($token);
+
+ /* An end-of-file token */
+ } elseif($token['type'] === HTML5::EOF) {
+ /* OMG DONE!! */
+ }
+ }
+
+ private function insertElement($token, $append = true)
+ {
+ $el = $this->dom->createElement($token['name']);
+
+ foreach($token['attr'] as $attr) {
+ if(!$el->hasAttribute($attr['name'])) {
+ $el->setAttribute($attr['name'], $attr['value']);
+ }
+ }
+
+ $this->appendToRealParent($el);
+ $this->stack[] = $el;
+
+ return $el;
+ }
+
+ private function insertText($data)
+ {
+ $text = $this->dom->createTextNode($data);
+ $this->appendToRealParent($text);
+ }
+
+ private function insertComment($data)
+ {
+ $comment = $this->dom->createComment($data);
+ $this->appendToRealParent($comment);
+ }
+
+ private function appendToRealParent($node)
+ {
+ if($this->foster_parent === null) {
+ end($this->stack)->appendChild($node);
+
+ } elseif($this->foster_parent !== null) {
+ /* If the foster parent element is the parent element of the
+ last table element in the stack of open elements, then the new
+ node must be inserted immediately before the last table element
+ in the stack of open elements in the foster parent element;
+ otherwise, the new node must be appended to the foster parent
+ element. */
+ for($n = count($this->stack) - 1; $n >= 0; $n--) {
+ if($this->stack[$n]->nodeName === 'table' &&
+ $this->stack[$n]->parentNode !== null) {
+ $table = $this->stack[$n];
+ break;
+ }
+ }
+
+ if(isset($table) && $this->foster_parent->isSameNode($table->parentNode))
+ $this->foster_parent->insertBefore($node, $table);
+ else
+ $this->foster_parent->appendChild($node);
+
+ $this->foster_parent = null;
+ }
+ }
+
+ private function elementInScope($el, $table = false)
+ {
+ if(is_array($el)) {
+ foreach($el as $element) {
+ if($this->elementInScope($element, $table)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ $leng = count($this->stack);
+
+ for($n = 0; $n < $leng; $n++) {
+ /* 1. Initialise node to be the current node (the bottommost node of
+ the stack). */
+ $node = $this->stack[$leng - 1 - $n];
+
+ if($node->tagName === $el) {
+ /* 2. If node is the target node, terminate in a match state. */
+ return true;
+
+ } elseif($node->tagName === 'table') {
+ /* 3. Otherwise, if node is a table element, terminate in a failure
+ state. */
+ return false;
+
+ } elseif($table === true && in_array($node->tagName, array('caption', 'td',
+ 'th', 'button', 'marquee', 'object'))) {
+ /* 4. Otherwise, if the algorithm is the "has an element in scope"
+ variant (rather than the "has an element in table scope" variant),
+ and node is one of the following, terminate in a failure state. */
+ return false;
+
+ } elseif($node === $node->ownerDocument->documentElement) {
+ /* 5. Otherwise, if node is an html element (root element), terminate
+ in a failure state. (This can only happen if the node is the topmost
+ node of the stack of open elements, and prevents the next step from
+ being invoked if there are no more elements in the stack.) */
+ return false;
+ }
+
+ /* Otherwise, set node to the previous entry in the stack of open
+ elements and return to step 2. (This will never fail, since the loop
+ will always terminate in the previous step if the top of the stack
+ is reached.) */
+ }
+ }
+
+ private function reconstructActiveFormattingElements()
+ {
+ /* 1. If there are no entries in the list of active formatting elements,
+ then there is nothing to reconstruct; stop this algorithm. */
+ $formatting_elements = count($this->a_formatting);
+
+ if($formatting_elements === 0) {
+ return false;
+ }
+
+ /* 3. Let entry be the last (most recently added) element in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. If the last (most recently added) entry in the list of active
+ formatting elements is a marker, or if it is an element that is in the
+ stack of open elements, then there is nothing to reconstruct; stop this
+ algorithm. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ return false;
+ }
+
+ for($a = $formatting_elements - 1; $a >= 0; true) {
+ /* 4. If there are no entries before entry in the list of active
+ formatting elements, then jump to step 8. */
+ if($a === 0) {
+ $step_seven = false;
+ break;
+ }
+
+ /* 5. Let entry be the entry one earlier than entry in the list of
+ active formatting elements. */
+ $a--;
+ $entry = $this->a_formatting[$a];
+
+ /* 6. If entry is neither a marker nor an element that is also in
+ thetack of open elements, go to step 4. */
+ if($entry === self::MARKER || in_array($entry, $this->stack, true)) {
+ break;
+ }
+ }
+
+ while(true) {
+ /* 7. Let entry be the element one later than entry in the list of
+ active formatting elements. */
+ if(isset($step_seven) && $step_seven === true) {
+ $a++;
+ $entry = $this->a_formatting[$a];
+ }
+
+ /* 8. Perform a shallow clone of the element entry to obtain clone. */
+ $clone = $entry->cloneNode();
+
+ /* 9. Append clone to the current node and push it onto the stack
+ of open elements so that it is the new current node. */
+ end($this->stack)->appendChild($clone);
+ $this->stack[] = $clone;
+
+ /* 10. Replace the entry for entry in the list with an entry for
+ clone. */
+ $this->a_formatting[$a] = $clone;
+
+ /* 11. If the entry for clone in the list of active formatting
+ elements is not the last entry in the list, return to step 7. */
+ if(end($this->a_formatting) !== $clone) {
+ $step_seven = true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ private function clearTheActiveFormattingElementsUpToTheLastMarker()
+ {
+ /* When the steps below require the UA to clear the list of active
+ formatting elements up to the last marker, the UA must perform the
+ following steps: */
+
+ while(true) {
+ /* 1. Let entry be the last (most recently added) entry in the list
+ of active formatting elements. */
+ $entry = end($this->a_formatting);
+
+ /* 2. Remove entry from the list of active formatting elements. */
+ array_pop($this->a_formatting);
+
+ /* 3. If entry was a marker, then stop the algorithm at this point.
+ The list has been cleared up to the last marker. */
+ if($entry === self::MARKER) {
+ break;
+ }
+ }
+ }
+
+ private function generateImpliedEndTags(array $exclude = array())
+ {
+ /* When the steps below require the UA to generate implied end tags,
+ then, if the current node is a dd element, a dt element, an li element,
+ a p element, a td element, a th element, or a tr element, the UA must
+ act as if an end tag with the respective tag name had been seen and
+ then generate implied end tags again. */
+ $node = end($this->stack);
+ $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude);
+
+ while(in_array(end($this->stack)->nodeName, $elements)) {
+ array_pop($this->stack);
+ }
+ }
+
+ private function getElementCategory($name)
+ {
+ if(in_array($name, $this->special))
+ return self::SPECIAL;
+
+ elseif(in_array($name, $this->scoping))
+ return self::SCOPING;
+
+ elseif(in_array($name, $this->formatting))
+ return self::FORMATTING;
+
+ else
+ return self::PHRASING;
+ }
+
+ private function clearStackToTableContext($elements)
+ {
+ /* When the steps above require the UA to clear the stack back to a
+ table context, it means that the UA must, while the current node is not
+ a table element or an html element, pop elements from the stack of open
+ elements. If this causes any elements to be popped from the stack, then
+ this is a parse error. */
+ while(true) {
+ $node = end($this->stack)->nodeName;
+
+ if(in_array($node, $elements)) {
+ break;
+ } else {
+ array_pop($this->stack);
+ }
+ }
+ }
+
+ private function resetInsertionMode()
+ {
+ /* 1. Let last be false. */
+ $last = false;
+ $leng = count($this->stack);
+
+ for($n = $leng - 1; $n >= 0; $n--) {
+ /* 2. Let node be the last node in the stack of open elements. */
+ $node = $this->stack[$n];
+
+ /* 3. If node is the first node in the stack of open elements, then
+ set last to true. If the element whose innerHTML attribute is being
+ set is neither a td element nor a th element, then set node to the
+ element whose innerHTML attribute is being set. (innerHTML case) */
+ if($this->stack[0]->isSameNode($node)) {
+ $last = true;
+ }
+
+ /* 4. If node is a select element, then switch the insertion mode to
+ "in select" and abort these steps. (innerHTML case) */
+ if($node->nodeName === 'select') {
+ $this->mode = self::IN_SELECT;
+ break;
+
+ /* 5. If node is a td or th element, then switch the insertion mode
+ to "in cell" and abort these steps. */
+ } elseif($node->nodeName === 'td' || $node->nodeName === 'th') {
+ $this->mode = self::IN_CELL;
+ break;
+
+ /* 6. If node is a tr element, then switch the insertion mode to
+ "in row" and abort these steps. */
+ } elseif($node->nodeName === 'tr') {
+ $this->mode = self::IN_ROW;
+ break;
+
+ /* 7. If node is a tbody, thead, or tfoot element, then switch the
+ insertion mode to "in table body" and abort these steps. */
+ } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) {
+ $this->mode = self::IN_TBODY;
+ break;
+
+ /* 8. If node is a caption element, then switch the insertion mode
+ to "in caption" and abort these steps. */
+ } elseif($node->nodeName === 'caption') {
+ $this->mode = self::IN_CAPTION;
+ break;
+
+ /* 9. If node is a colgroup element, then switch the insertion mode
+ to "in column group" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'colgroup') {
+ $this->mode = self::IN_CGROUP;
+ break;
+
+ /* 10. If node is a table element, then switch the insertion mode
+ to "in table" and abort these steps. */
+ } elseif($node->nodeName === 'table') {
+ $this->mode = self::IN_TABLE;
+ break;
+
+ /* 11. If node is a head element, then switch the insertion mode
+ to "in body" ("in body"! not "in head"!) and abort these steps.
+ (innerHTML case) */
+ } elseif($node->nodeName === 'head') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 12. If node is a body element, then switch the insertion mode to
+ "in body" and abort these steps. */
+ } elseif($node->nodeName === 'body') {
+ $this->mode = self::IN_BODY;
+ break;
+
+ /* 13. If node is a frameset element, then switch the insertion
+ mode to "in frameset" and abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'frameset') {
+ $this->mode = self::IN_FRAME;
+ break;
+
+ /* 14. If node is an html element, then: if the head element
+ pointer is null, switch the insertion mode to "before head",
+ otherwise, switch the insertion mode to "after head". In either
+ case, abort these steps. (innerHTML case) */
+ } elseif($node->nodeName === 'html') {
+ $this->mode = ($this->head_pointer === null)
+ ? self::BEFOR_HEAD
+ : self::AFTER_HEAD;
+
+ break;
+
+ /* 15. If last is true, then set the insertion mode to "in body"
+ and abort these steps. (innerHTML case) */
+ } elseif($last) {
+ $this->mode = self::IN_BODY;
+ break;
+ }
+ }
+ }
+
+ private function closeCell()
+ {
+ /* If the stack of open elements has a td or th element in table scope,
+ then act as if an end tag token with that tag name had been seen. */
+ foreach(array('td', 'th') as $cell) {
+ if($this->elementInScope($cell, true)) {
+ $this->inCell(array(
+ 'name' => $cell,
+ 'type' => HTML5::ENDTAG
+ ));
+
+ break;
+ }
+ }
+ }
+
+ public function save()
+ {
+ return $this->dom;
+ }
+}
diff --git a/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
new file mode 100644
index 000000000..d6a8eb202
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/add-vimline.php
@@ -0,0 +1,130 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Adds vimline to files
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$vimline = 'vim: et sw=4 sts=4';
+
+$files = $FS->globr('.', '*');
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ prefix_is('./library/standalone', $file) ||
+ prefix_is('./docs/specimens', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ postfix_is('.png', $file) ||
+ postfix_is('.ico', $file) ||
+ // wontfix
+ postfix_is('.vtest', $file) ||
+ postfix_is('.svg', $file) ||
+ postfix_is('.phpt', $file) ||
+ postfix_is('VERSION', $file) ||
+ postfix_is('WHATSNEW', $file) ||
+ postfix_is('configdoc/usage.xml', $file) ||
+ postfix_is('library/HTMLPurifier.includes.php', $file) ||
+ postfix_is('library/HTMLPurifier.safe-includes.php', $file) ||
+ postfix_is('smoketests/xssAttacks.xml', $file) ||
+ // phpt files
+ postfix_is('.diff', $file) ||
+ postfix_is('.exp', $file) ||
+ postfix_is('.log', $file) ||
+ postfix_is('.out', $file) ||
+
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $ext = strrchr($file, '.');
+ if (
+ postfix_is('README', $file) ||
+ postfix_is('LICENSE', $file) ||
+ postfix_is('CREDITS', $file) ||
+ postfix_is('INSTALL', $file) ||
+ postfix_is('NEWS', $file) ||
+ postfix_is('TODO', $file) ||
+ postfix_is('WYSIWYG', $file) ||
+ postfix_is('Changelog', $file)
+ ) $ext = '.txt';
+ if (postfix_is('Doxyfile', $file)) $ext = 'Doxyfile';
+ if (postfix_is('.php.in', $file)) $ext = '.php';
+ $no_nl = false;
+ switch ($ext) {
+ case '.php':
+ case '.inc':
+ case '.js':
+ $line = '// %s';
+ break;
+ case '.html':
+ case '.xsl':
+ case '.xml':
+ case '.htc':
+ $line = "<!-- %s\n-->";
+ break;
+ case '.htmlt':
+ $no_nl = true;
+ $line = '--# %s';
+ break;
+ case '.ini':
+ $line = '; %s';
+ break;
+ case '.css':
+ $line = '/* %s */';
+ break;
+ case '.bat':
+ $line = 'rem %s';
+ break;
+ case '.txt':
+ case '.utf8':
+ if (
+ prefix_is('./library/HTMLPurifier/ConfigSchema', $file) ||
+ prefix_is('./smoketests/test-schema', $file) ||
+ prefix_is('./tests/HTMLPurifier/StringHashParser', $file)
+ ) {
+ $no_nl = true;
+ $line = '--# %s';
+ } else {
+ $line = ' %s';
+ }
+ break;
+ case 'Doxyfile':
+ $line = '# %s';
+ break;
+ default:
+ throw new Exception('Unknown file: ' . $file);
+ }
+
+ echo "$file\n";
+ $contents = file_get_contents($file);
+
+ $regex = '~' . str_replace('%s', 'vim: .+', preg_quote($line, '~')) . '~m';
+ $contents = preg_replace($regex, '', $contents);
+
+ $contents = rtrim($contents);
+
+ if (strpos($contents, "\r\n") !== false) $nl = "\r\n";
+ elseif (strpos($contents, "\n") !== false) $nl = "\n";
+ elseif (strpos($contents, "\r") !== false) $nl = "\r";
+ else $nl = PHP_EOL;
+
+ if (!$no_nl) $contents .= $nl;
+ $contents .= $nl . str_replace('%s', $vimline, $line) . $nl;
+
+ file_put_contents($file, $contents);
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/common.php b/vendor/ezyang/htmlpurifier/maintenance/common.php
new file mode 100644
index 000000000..342bc205a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/common.php
@@ -0,0 +1,25 @@
+<?php
+
+function assertCli()
+{
+ if (php_sapi_name() != 'cli' && !getenv('PHP_IS_CLI')) {
+ echo 'Script cannot be called from web-browser (if you are indeed calling via cli,
+set environment variable PHP_IS_CLI to work around this).';
+ exit(1);
+ }
+}
+
+function prefix_is($comp, $subject)
+{
+ return strncmp($comp, $subject, strlen($comp)) === 0;
+}
+
+function postfix_is($comp, $subject)
+{
+ return strlen($subject) < $comp ? false : substr($subject, -strlen($comp)) === $comp;
+}
+
+// Load useful stuff like FSTools
+require_once dirname(__FILE__) . '/../extras/HTMLPurifierExtras.auto.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
new file mode 100755
index 000000000..ecd1127fd
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/compile-doxygen.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+cd ..
+mkdir docs/doxygen
+rm -Rf docs/doxygen/*
+doxygen 1>docs/doxygen/info.log 2>docs/doxygen/errors.log
+if [ "$?" != 0 ]; then
+ cat docs/doxygen/errors.log
+ exit
+fi
+cd docs
+tar czf doxygen.tgz doxygen
diff --git a/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
new file mode 100644
index 000000000..c614d1fbc
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/config-scanner.php
@@ -0,0 +1,155 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+if (version_compare(PHP_VERSION, '5.2.2', '<')) {
+ echo "This script requires PHP 5.2.2 or later, for tokenizer line numbers.";
+ exit(1);
+}
+
+/**
+ * @file
+ * Scans HTML Purifier source code for $config tokens and records the
+ * directive being used; configdoc can use this info later.
+ *
+ * Currently, this just dumps all the info onto the console. Eventually, it
+ * will create an XML file that our XSLT transform can use.
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/../library/');
+$raw_files = $FS->globr('.', '*.php');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $files[] = $file;
+}
+
+/**
+ * Moves the $i cursor to the next non-whitespace token
+ */
+function consumeWhitespace($tokens, &$i)
+{
+ do {$i++;} while (is_array($tokens[$i]) && $tokens[$i][0] === T_WHITESPACE);
+}
+
+/**
+ * Tests whether or not a token is a particular type. There are three run-cases:
+ * - ($token, $expect_token): tests if the token is $expect_token type;
+ * - ($token, $expect_value): tests if the token is the string $expect_value;
+ * - ($token, $expect_token, $expect_value): tests if token is $expect_token type, and
+ * its string representation is $expect_value
+ */
+function testToken($token, $value_or_token, $value = null)
+{
+ if (is_null($value)) {
+ if (is_int($value_or_token)) return is_array($token) && $token[0] === $value_or_token;
+ else return $token === $value_or_token;
+ } else {
+ return is_array($token) && $token[0] === $value_or_token && $token[1] === $value;
+ }
+}
+
+$counter = 0;
+$full_counter = 0;
+$tracker = array();
+
+foreach ($files as $file) {
+ $tokens = token_get_all(file_get_contents($file));
+ $file = str_replace('\\', '/', $file);
+ for ($i = 0, $c = count($tokens); $i < $c; $i++) {
+ $ok = false;
+ // Match $config
+ if (!$ok && testToken($tokens[$i], T_VARIABLE, '$config')) $ok = true;
+ // Match $this->config
+ while (!$ok && testToken($tokens[$i], T_VARIABLE, '$this')) {
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_OBJECT_OPERATOR)) break;
+ consumeWhitespace($tokens, $i);
+ if (testToken($tokens[$i], T_STRING, 'config')) $ok = true;
+ break;
+ }
+ if (!$ok) continue;
+
+ $ok = false;
+ for($i++; $i < $c; $i++) {
+ if ($tokens[$i] === ',' || $tokens[$i] === ')' || $tokens[$i] === ';') {
+ break;
+ }
+ if (is_string($tokens[$i])) continue;
+ if ($tokens[$i][0] === T_OBJECT_OPERATOR) {
+ $ok = true;
+ break;
+ }
+ }
+ if (!$ok) continue;
+
+ $line = $tokens[$i][2];
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_STRING, 'get')) continue;
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], '(')) continue;
+
+ $full_counter++;
+
+ $matched = false;
+ do {
+
+ // What we currently don't match are batch retrievals, and
+ // wildcard retrievals. This data might be useful in the future,
+ // which is why we have a do {} while loop that doesn't actually
+ // do anything.
+
+ consumeWhitespace($tokens, $i);
+ if (!testToken($tokens[$i], T_CONSTANT_ENCAPSED_STRING)) continue;
+ $id = substr($tokens[$i][1], 1, -1);
+
+ $counter++;
+ $matched = true;
+
+ if (!isset($tracker[$id])) $tracker[$id] = array();
+ if (!isset($tracker[$id][$file])) $tracker[$id][$file] = array();
+ $tracker[$id][$file][] = $line;
+
+ } while (0);
+
+ //echo "$file:$line uses $namespace.$directive\n";
+ }
+}
+
+echo "\n$counter/$full_counter instances of \$config or \$this->config found in source code.\n";
+
+echo "Generating XML... ";
+
+$xw = new XMLWriter();
+$xw->openURI('../configdoc/usage.xml');
+$xw->setIndent(true);
+$xw->startDocument('1.0', 'UTF-8');
+$xw->startElement('usage');
+foreach ($tracker as $id => $files) {
+ $xw->startElement('directive');
+ $xw->writeAttribute('id', $id);
+ foreach ($files as $file => $lines) {
+ $xw->startElement('file');
+ $xw->writeAttribute('name', $file);
+ foreach ($lines as $line) {
+ $xw->writeElement('line', $line);
+ }
+ $xw->endElement();
+ }
+ $xw->endElement();
+}
+$xw->endElement();
+$xw->flush();
+
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
new file mode 100755
index 000000000..138badb65
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush-definition-cache.php
@@ -0,0 +1,42 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Flushes the definition serial cache. This file should be
+ * called if changes to any subclasses of HTMLPurifier_Definition
+ * or related classes (such as HTMLPurifier_HTMLModule) are made. This
+ * may also be necessary if you've modified a customized version.
+ *
+ * @param Accepts one argument, cache type to flush; otherwise flushes all
+ * the caches.
+ */
+
+echo "Flushing cache... \n";
+
+require_once(dirname(__FILE__) . '/../library/HTMLPurifier.auto.php');
+
+$config = HTMLPurifier_Config::createDefault();
+
+$names = array('HTML', 'CSS', 'URI', 'Test');
+if (isset($argv[1])) {
+ if (in_array($argv[1], $names)) {
+ $names = array($argv[1]);
+ } else {
+ throw new Exception("Cache parameter {$argv[1]} is not a valid cache");
+ }
+}
+
+foreach ($names as $name) {
+ echo " - Flushing $name\n";
+ $cache = new HTMLPurifier_DefinitionCache_Serializer($name);
+ $cache->flush($config);
+}
+
+echo "Cache flushed successfully.\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/flush.php b/vendor/ezyang/htmlpurifier/maintenance/flush.php
new file mode 100644
index 000000000..c0853d230
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/flush.php
@@ -0,0 +1,30 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Runs all generation/flush cache scripts to ensure that somewhat volatile
+ * generated files are up-to-date.
+ */
+
+function e($cmd)
+{
+ echo "\$ $cmd\n";
+ passthru($cmd, $status);
+ echo "\n";
+ if ($status) exit($status);
+}
+
+$php = empty($_SERVER['argv'][1]) ? 'php' : $_SERVER['argv'][1];
+
+e($php . ' generate-includes.php');
+e($php . ' generate-schema-cache.php');
+e($php . ' flush-definition-cache.php');
+e($php . ' generate-standalone.php');
+e($php . ' config-scanner.php');
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
new file mode 100755
index 000000000..ff1713e39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-entity-file.php
@@ -0,0 +1,75 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Parses *.ent files into an entity lookup table, and then serializes and
+ * writes the whole kaboodle to a file. The resulting file is cached so
+ * that this script does not need to be run. This script should rarely,
+ * if ever, be run, since HTML's entities are fairly immutable.
+ */
+
+// here's where the entity files are located, assuming working directory
+// is the same as the location of this PHP file. Needs trailing slash.
+$entity_dir = '../docs/entities/';
+
+// defines the output file for the serialized content.
+$output_file = '../library/HTMLPurifier/EntityLookup/entities.ser';
+
+// courtesy of a PHP manual comment
+function unichr($dec)
+{
+ if ($dec < 128) {
+ $utf = chr($dec);
+ } elseif ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ } else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+ return $utf;
+}
+
+if ( !is_dir($entity_dir) ) exit("Fatal Error: Can't find entity directory.\n");
+if ( file_exists($output_file) ) exit("Fatal Error: output file already exists.\n");
+
+$dh = @opendir($entity_dir);
+if ( !$dh ) exit("Fatal Error: Cannot read entity directory.\n");
+
+$entity_files = array();
+while (($file = readdir($dh)) !== false) {
+ if (@$file[0] === '.') continue;
+ if (substr(strrchr($file, "."), 1) !== 'ent') continue;
+ $entity_files[] = $file;
+}
+closedir($dh);
+
+if ( !$entity_files ) exit("Fatal Error: No entity files to parse.\n");
+
+$entity_table = array();
+$regexp = '/<!ENTITY\s+([A-Za-z0-9]+)\s+"&#(?:38;#)?([0-9]+);">/';
+
+foreach ( $entity_files as $file ) {
+ $contents = file_get_contents($entity_dir . $file);
+ $matches = array();
+ preg_match_all($regexp, $contents, $matches, PREG_SET_ORDER);
+ foreach ($matches as $match) {
+ $entity_table[$match[1]] = unichr($match[2]);
+ }
+}
+
+$output = serialize($entity_table);
+
+$fh = fopen($output_file, 'w');
+fwrite($fh, $output);
+fclose($fh);
+
+echo "Completed successfully.";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
new file mode 100644
index 000000000..01e1c2aba
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-includes.php
@@ -0,0 +1,192 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../tests/path2class.func.php';
+require_once '../library/HTMLPurifier/Bootstrap.php';
+assertCli();
+
+/**
+ * @file
+ * Generates an include stub for users who do not want to use the autoloader.
+ * When new files are added to HTML Purifier's main codebase, this file should
+ * be called.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$exclude_dirs = array(
+ 'HTMLPurifier/Language/',
+ 'HTMLPurifier/ConfigSchema/',
+ 'HTMLPurifier/Filter/',
+ 'HTMLPurifier/Printer/',
+ /* These should be excluded, but need to have ConfigSchema support first
+
+ */
+);
+$exclude_files = array(
+ 'HTMLPurifier/Lexer/PEARSax3.php',
+ 'HTMLPurifier/Lexer/PH5P.php',
+ 'HTMLPurifier/Printer.php',
+);
+
+// Determine what files need to be included:
+echo 'Scanning for files... ';
+$raw_files = $FS->globr('.', '*.php');
+if (!$raw_files) throw new Exception('Did not find any PHP source files');
+$files = array();
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strncmp('standalone/', $file, 11) === 0) continue; // rm generated files
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ $ok = true;
+ foreach ($exclude_dirs as $dir) {
+ if (strncmp($dir, $file, strlen($dir)) === 0) {
+ $ok = false;
+ break;
+ }
+ }
+ if (!$ok) continue; // rm excluded directories
+ if (in_array($file, $exclude_files)) continue; // rm excluded files
+ $files[] = $file;
+}
+echo "done!\n";
+
+// Reorder list so that dependencies are included first:
+
+/**
+ * Returns a lookup array of dependencies for a file.
+ *
+ * @note This function expects that format $name extends $parent on one line
+ *
+ * @param string $file
+ * File to check dependencies of.
+ * @return array
+ * Lookup array of files the file is dependent on, sorted accordingly.
+ */
+function get_dependency_lookup($file)
+{
+ static $cache = array();
+ if (isset($cache[$file])) return $cache[$file];
+ if (!file_exists($file)) {
+ echo "File doesn't exist: $file\n";
+ return array();
+ }
+ $fh = fopen($file, 'r');
+ $deps = array();
+ while (!feof($fh)) {
+ $line = fgets($fh);
+ if (strncmp('class', $line, 5) === 0) {
+ // The implementation here is fragile and will break if we attempt
+ // to use interfaces. Beware!
+ $arr = explode(' extends ', trim($line, ' {'."\n\r"), 2);
+ if (count($arr) < 2) break;
+ $parent = $arr[1];
+ $dep_file = HTMLPurifier_Bootstrap::getPath($parent);
+ if (!$dep_file) break;
+ $deps[$dep_file] = true;
+ break;
+ }
+ }
+ fclose($fh);
+ foreach (array_keys($deps) as $file) {
+ // Extra dependencies must come *before* base dependencies
+ $deps = get_dependency_lookup($file) + $deps;
+ }
+ $cache[$file] = $deps;
+ return $deps;
+}
+
+/**
+ * Sorts files based on dependencies. This function is lazy and will not
+ * group files with dependencies together; it will merely ensure that a file
+ * is never included before its dependencies are.
+ *
+ * @param $files
+ * Files array to sort.
+ * @return
+ * Sorted array ($files is not modified by reference!)
+ */
+function dep_sort($files)
+{
+ $ret = array();
+ $cache = array();
+ foreach ($files as $file) {
+ if (isset($cache[$file])) continue;
+ $deps = get_dependency_lookup($file);
+ foreach (array_keys($deps) as $dep) {
+ if (!isset($cache[$dep])) {
+ $ret[] = $dep;
+ $cache[$dep] = true;
+ }
+ }
+ $cache[$file] = true;
+ $ret[] = $file;
+ }
+ return $ret;
+}
+
+$files = dep_sort($files);
+
+// Build the actual include stub:
+
+$version = trim(file_get_contents('../VERSION'));
+
+// stub
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. Use this if performance is a
+ * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
+ * FILE, changes will be overwritten the next time the script is run.
+ *
+ * @version $version
+ *
+ * @warning
+ * You must *not* include any other HTML Purifier files before this file,
+ * because 'require' not 'require_once' is used.
+ *
+ * @warning
+ * This file requires that the include path contains the HTML Purifier
+ * library directory; this is not auto-set.
+ */
+
+";
+
+foreach ($files as $file) {
+ $php .= "require '$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.includes.php... ";
+file_put_contents('HTMLPurifier.includes.php', $php);
+echo "done!\n";
+
+$php = "<?php
+
+/**
+ * @file
+ * This file was auto-generated by generate-includes.php and includes all of
+ * the core files required by HTML Purifier. This is a convenience stub that
+ * includes all files using dirname(__FILE__) and require_once. PLEASE DO NOT
+ * EDIT THIS FILE, changes will be overwritten the next time the script is run.
+ *
+ * Changes to include_path are not necessary.
+ */
+
+\$__dir = dirname(__FILE__);
+
+";
+
+foreach ($files as $file) {
+ $php .= "require_once \$__dir . '/$file';" . PHP_EOL;
+}
+
+echo "Writing HTMLPurifier.safe-includes.php... ";
+file_put_contents('HTMLPurifier.safe-includes.php', $php);
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
new file mode 100644
index 000000000..c92a7d211
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-ph5p-patch.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * This file compares our version of PH5P with Jero's original version, and
+ * generates a patch of the differences. This script should be run whenever
+ * library/HTMLPurifier/Lexer/PH5P.php is modified.
+ */
+
+$orig = realpath(dirname(__FILE__) . '/PH5P.php');
+$new = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/Lexer/PH5P.php');
+$newt = dirname(__FILE__) . '/PH5P.new.php'; // temporary file
+
+// minor text-processing of new file to get into same format as original
+$new_src = file_get_contents($new);
+$new_src = '<?php' . PHP_EOL . substr($new_src, strpos($new_src, 'class HTML5 {'));
+
+file_put_contents($newt, $new_src);
+shell_exec("diff -u \"$orig\" \"$newt\" > PH5P.patch");
+unlink($newt);
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
new file mode 100644
index 000000000..339ff12da
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-schema-cache.php
@@ -0,0 +1,45 @@
+#!/usr/bin/php
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Generates a schema cache file, saving it to
+ * library/HTMLPurifier/ConfigSchema/schema.ser.
+ *
+ * This should be run when new configuration options are added to
+ * HTML Purifier. A cached version is available via the repository
+ * so this does not normally have to be regenerated.
+ *
+ * If you have a directory containing custom configuration schema files,
+ * you can simple add a path to that directory as a parameter to
+ * this, and they will get included.
+ */
+
+$target = dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema/schema.ser';
+
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+
+$builder->buildDir($interchange);
+
+$loader = dirname(__FILE__) . '/../config-schema.php';
+if (file_exists($loader)) include $loader;
+foreach ($_SERVER['argv'] as $i => $dir) {
+ if ($i === 0) continue;
+ $builder->buildDir($interchange, realpath($dir));
+}
+
+$interchange->validate();
+
+$schema_builder = new HTMLPurifier_ConfigSchema_Builder_ConfigSchema();
+$schema = $schema_builder->build($interchange);
+
+echo "Saving schema... ";
+file_put_contents($target, serialize($schema));
+echo "done!\n";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
new file mode 100755
index 000000000..254d4d83b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/generate-standalone.php
@@ -0,0 +1,159 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Compiles all of HTML Purifier's library files into one big file
+ * named HTMLPurifier.standalone.php. This is usually called during the
+ * release process.
+ */
+
+/**
+ * Global hash that tracks already loaded includes
+ */
+$GLOBALS['loaded'] = array();
+
+/**
+ * Custom FSTools for this script that overloads some behavior
+ * @warning The overloading of copy() is not necessarily global for
+ * this script. Watch out!
+ */
+class MergeLibraryFSTools extends FSTools
+{
+ public function copyable($entry)
+ {
+ // Skip hidden files
+ if ($entry[0] == '.') {
+ return false;
+ }
+ return true;
+ }
+ public function copy($source, $dest)
+ {
+ copy_and_remove_includes($source, $dest);
+ }
+}
+$FS = new MergeLibraryFSTools();
+
+/**
+ * Replaces the includes inside PHP source code with the corresponding
+ * source.
+ * @param string $text PHP source code to replace includes from
+ */
+function replace_includes($text)
+{
+ // also remove vim modelines
+ return preg_replace_callback(
+ "/require(?:_once)? ['\"]([^'\"]+)['\"];/",
+ 'replace_includes_callback',
+ $text
+ );
+}
+
+/**
+ * Removes leading PHP tags from included files. Assumes that there is
+ * no trailing tag. Also removes vim modelines.
+ * @note This is safe for files that have internal <?php
+ * @param string $text Text to have leading PHP tag from
+ */
+function remove_php_tags($text)
+{
+ $text = preg_replace('#// vim:.+#', '', $text);
+ return substr($text, 5);
+}
+
+/**
+ * Copies the contents of a directory to the standalone directory
+ * @param string $dir Directory to copy
+ */
+function make_dir_standalone($dir)
+{
+ global $FS;
+ return $FS->copyr($dir, 'standalone/' . $dir);
+}
+
+/**
+ * Copies the contents of a file to the standalone directory
+ * @param string $file File to copy
+ */
+function make_file_standalone($file)
+{
+ global $FS;
+ $FS->mkdirr('standalone/' . dirname($file));
+ copy_and_remove_includes($file, 'standalone/' . $file);
+ return true;
+}
+
+/**
+ * Copies a file to another location recursively, if it is a PHP file
+ * remove includes
+ * @param string $file Original file
+ * @param string $sfile New location of file
+ */
+function copy_and_remove_includes($file, $sfile)
+{
+ $contents = file_get_contents($file);
+ if (strrchr($file, '.') === '.php') $contents = replace_includes($contents);
+ return file_put_contents($sfile, $contents);
+}
+
+/**
+ * @param $matches preg_replace_callback matches array, where index 1
+ * is the filename to include
+ */
+function replace_includes_callback($matches)
+{
+ $file = $matches[1];
+ $preserve = array(
+ // PEAR (external)
+ 'XML/HTMLSax3.php' => 1
+ );
+ if (isset($preserve[$file])) {
+ return $matches[0];
+ }
+ if (isset($GLOBALS['loaded'][$file])) return '';
+ $GLOBALS['loaded'][$file] = true;
+ return replace_includes(remove_php_tags(file_get_contents($file)));
+}
+
+echo 'Generating includes file... ';
+shell_exec('php generate-includes.php');
+echo "done!\n";
+
+chdir(dirname(__FILE__) . '/../library/');
+
+echo 'Creating full file...';
+$contents = replace_includes(file_get_contents('HTMLPurifier.includes.php'));
+$contents = str_replace(
+ // Note that bootstrap is now inside the standalone file
+ "define('HTMLPURIFIER_PREFIX', realpath(dirname(__FILE__) . '/..'));",
+ "define('HTMLPURIFIER_PREFIX', dirname(__FILE__) . '/standalone');
+ set_include_path(HTMLPURIFIER_PREFIX . PATH_SEPARATOR . get_include_path());",
+ $contents
+);
+file_put_contents('HTMLPurifier.standalone.php', $contents);
+echo ' done!' . PHP_EOL;
+
+echo 'Creating standalone directory...';
+$FS->rmdirr('standalone'); // ensure a clean copy
+
+// data files
+$FS->mkdirr('standalone/HTMLPurifier/DefinitionCache/Serializer');
+make_file_standalone('HTMLPurifier/EntityLookup/entities.ser');
+make_file_standalone('HTMLPurifier/ConfigSchema/schema.ser');
+
+// non-standard inclusion setup
+make_dir_standalone('HTMLPurifier/ConfigSchema');
+make_dir_standalone('HTMLPurifier/Language');
+make_dir_standalone('HTMLPurifier/Filter');
+make_dir_standalone('HTMLPurifier/Printer');
+make_file_standalone('HTMLPurifier/Printer.php');
+make_file_standalone('HTMLPurifier/Lexer/PH5P.php');
+
+echo ' done!' . PHP_EOL;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/merge-library.php b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
new file mode 100755
index 000000000..de2eecdc0
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/merge-library.php
@@ -0,0 +1,11 @@
+#!/usr/bin/php
+<?php
+
+/**
+ * @file
+ * Deprecated in favor of generate-standalone.php.
+ */
+
+require dirname(__FILE__) . '/generate-standalone.php';
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
new file mode 100644
index 000000000..514a08dd9
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-extract-schema.php
@@ -0,0 +1,71 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Extracts all definitions inside a configuration schema
+ * (HTMLPurifier_ConfigSchema) and exports them as plain text files.
+ *
+ * @todo Extract version numbers.
+ */
+
+define('HTMLPURIFIER_SCHEMA_STRICT', true); // description data needs to be collected
+require_once dirname(__FILE__) . '/../library/HTMLPurifier.auto.php';
+
+// We need includes to ensure all HTMLPurifier_ConfigSchema calls are
+// performed.
+require_once 'HTMLPurifier.includes.php';
+
+// Also, these extra files will be necessary.
+require_once 'HTMLPurifier/Filter/ExtractStyleBlocks.php';
+
+/**
+ * Takes a hash and saves its contents to library/HTMLPurifier/ConfigSchema/
+ */
+function saveHash($hash)
+{
+ if ($hash === false) return;
+ $dir = realpath(dirname(__FILE__) . '/../library/HTMLPurifier/ConfigSchema');
+ $name = $hash['ID'] . '.txt';
+ $file = $dir . '/' . $name;
+ if (file_exists($file)) {
+ trigger_error("File already exists; skipped $name");
+ return;
+ }
+ $file = new FSTools_File($file);
+ $file->open('w');
+ $multiline = false;
+ foreach ($hash as $key => $value) {
+ $multiline = $multiline || (strpos($value, "\n") !== false);
+ if ($multiline) {
+ $file->put("--$key--" . PHP_EOL);
+ $file->put(str_replace("\n", PHP_EOL, $value) . PHP_EOL);
+ } else {
+ if ($key == 'ID') {
+ $file->put("$value" . PHP_EOL);
+ } else {
+ $file->put("$key: $value" . PHP_EOL);
+ }
+ }
+ }
+ $file->close();
+}
+
+$schema = HTMLPurifier_ConfigSchema::instance();
+$adapter = new HTMLPurifier_ConfigSchema_StringHashReverseAdapter($schema);
+
+foreach ($schema->info as $ns => $ns_array) {
+ saveHash($adapter->get($ns));
+ foreach ($ns_array as $dir => $x) {
+ saveHash($adapter->get($ns, $dir));
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
new file mode 100644
index 000000000..f47c7d0f1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-require-once.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes leading includes from files.
+ *
+ * @note
+ * This does not remove inline includes; those must be handled manually.
+ */
+
+chdir(dirname(__FILE__) . '/../tests/HTMLPurifier');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^require_once .+[\n\r]*#m", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
new file mode 100644
index 000000000..5ae031973
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/old-remove-schema-def.php
@@ -0,0 +1,32 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+echo "Please do not run this script. It is here for historical purposes only.";
+exit;
+
+/**
+ * @file
+ * Removes ConfigSchema function calls from source files.
+ */
+
+chdir(dirname(__FILE__) . '/../library/');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '*.php');
+foreach ($files as $file) {
+ if (substr_count(basename($file), '.') > 1) continue;
+ $old_code = file_get_contents($file);
+ $new_code = preg_replace("#^HTMLPurifier_ConfigSchema::.+?\);[\n\r]*#ms", '', $old_code);
+ if ($old_code !== $new_code) {
+ file_put_contents($file, $new_code);
+ }
+ if (preg_match('#^\s+HTMLPurifier_ConfigSchema::#m', $new_code)) {
+ echo "Indented ConfigSchema call in $file\n";
+ }
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
new file mode 100755
index 000000000..6f4d720ff
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/regenerate-docs.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -e
+./compile-doxygen.sh
+cd ../docs
+scp doxygen.tgz htmlpurifier.org:/home/ezyang/htmlpurifier.org
+ssh htmlpurifier.org "cd /home/ezyang/htmlpurifier.org && ./reload-docs.sh"
diff --git a/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
new file mode 100644
index 000000000..857870546
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/remove-trailing-whitespace.php
@@ -0,0 +1,37 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Removes trailing whitespace from files.
+ */
+
+chdir(dirname(__FILE__) . '/..');
+$FS = new FSTools();
+
+$files = $FS->globr('.', '{,.}*', GLOB_BRACE);
+foreach ($files as $file) {
+ if (
+ !is_file($file) ||
+ prefix_is('./.git', $file) ||
+ prefix_is('./docs/doxygen', $file) ||
+ postfix_is('.ser', $file) ||
+ postfix_is('.tgz', $file) ||
+ postfix_is('.patch', $file) ||
+ postfix_is('.dtd', $file) ||
+ postfix_is('.ent', $file) ||
+ $file == './library/HTMLPurifier/Lexer/PH5P.php' ||
+ $file == './maintenance/PH5P.php'
+ ) continue;
+ $contents = file_get_contents($file);
+ $result = preg_replace('/^(.*?)[ \t]+(\r?)$/m', '\1\2', $contents, -1, $count);
+ if (!$count) continue;
+ echo "$file\n";
+ file_put_contents($file, $result);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/maintenance/rename-config.php b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
new file mode 100644
index 000000000..6e59e2a79
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/rename-config.php
@@ -0,0 +1,84 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+require_once '../library/HTMLPurifier.auto.php';
+assertCli();
+
+/**
+ * @file
+ * Renames a configuration directive. This involves renaming the file,
+ * adding an alias, and then regenerating the cache. You still have to
+ * manually go through and fix any calls to the directive.
+ * @warning This script doesn't handle multi-stringhash files.
+ */
+
+$argv = $_SERVER['argv'];
+if (count($argv) < 3) {
+ echo "Usage: {$argv[0]} OldName NewName\n";
+ exit(1);
+}
+
+chdir('../library/HTMLPurifier/ConfigSchema/schema');
+
+$old = $argv[1];
+$new = $argv[2];
+
+if (!file_exists("$old.txt")) {
+ echo "Cannot move undefined configuration directive $old\n";
+ exit(1);
+}
+
+if ($old === $new) {
+ echo "Attempting to move to self, aborting\n";
+ exit(1);
+}
+
+if (file_exists("$new.txt")) {
+ echo "Cannot move to already defined directive $new\n";
+ exit(1);
+}
+
+$file = "$old.txt";
+$builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder();
+$interchange = new HTMLPurifier_ConfigSchema_Interchange();
+$builder->buildFile($interchange, $file);
+$contents = file_get_contents($file);
+
+if (strpos($contents, "\r\n") !== false) {
+ $nl = "\r\n";
+} elseif (strpos($contents, "\r") !== false) {
+ $nl = "\r";
+} else {
+ $nl = "\n";
+}
+
+// replace name with new name
+$contents = str_replace($old, $new, $contents);
+
+if ($interchange->directives[$old]->aliases) {
+ $pos_alias = strpos($contents, 'ALIASES:');
+ $pos_ins = strpos($contents, $nl, $pos_alias);
+ if ($pos_ins === false) $pos_ins = strlen($contents);
+ $contents =
+ substr($contents, 0, $pos_ins) . ", $old" . substr($contents, $pos_ins);
+ file_put_contents($file, $contents);
+} else {
+ $lines = explode($nl, $contents);
+ $insert = false;
+ foreach ($lines as $n => $line) {
+ if (strncmp($line, '--', 2) === 0) {
+ $insert = $n;
+ break;
+ }
+ }
+ if (!$insert) {
+ $lines[] = "ALIASES: $old";
+ } else {
+ array_splice($lines, $insert, 0, "ALIASES: $old");
+ }
+ file_put_contents($file, implode($nl, $lines));
+}
+
+rename("$old.txt", "$new.txt") || exit(1);
diff --git a/vendor/ezyang/htmlpurifier/maintenance/update-config.php b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
new file mode 100644
index 000000000..2d8a7a9c1
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/maintenance/update-config.php
@@ -0,0 +1,34 @@
+#!/usr/bin/php
+<?php
+
+chdir(dirname(__FILE__));
+require_once 'common.php';
+assertCli();
+
+/**
+ * @file
+ * Converts all instances of $config->set and $config->get to the new
+ * format, as described by docs/dev-config-bcbreaks.txt
+ */
+
+$FS = new FSTools();
+chdir(dirname(__FILE__) . '/..');
+$raw_files = $FS->globr('.', '*.php');
+foreach ($raw_files as $file) {
+ $file = substr($file, 2); // rm leading './'
+ if (strpos($file, 'library/standalone/') === 0) continue;
+ if (strpos($file, 'maintenance/update-config.php') === 0) continue;
+ if (strpos($file, 'test-settings.php') === 0) continue;
+ if (substr_count($file, '.') > 1) continue; // rm meta files
+ // process the file
+ $contents = file_get_contents($file);
+ $contents = preg_replace(
+ "#config->(set|get)\('(.+?)', '(.+?)'#",
+ "config->\\1('\\2.\\3'",
+ $contents
+ );
+ if ($contents === '') continue;
+ file_put_contents($file, $contents);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/package.php b/vendor/ezyang/htmlpurifier/package.php
new file mode 100644
index 000000000..bfef93622
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/package.php
@@ -0,0 +1,61 @@
+<?php
+
+set_time_limit(0);
+
+require_once 'PEAR/PackageFileManager2.php';
+require_once 'PEAR/PackageFileManager/File.php';
+PEAR::setErrorHandling(PEAR_ERROR_PRINT);
+$pkg = new PEAR_PackageFileManager2;
+
+$pkg->setOptions(
+ array(
+ 'baseinstalldir' => '/',
+ 'packagefile' => 'package.xml',
+ 'packagedirectory' => realpath(dirname(__FILE__) . '/library'),
+ 'filelistgenerator' => 'file',
+ 'include' => array('*'),
+ 'dir_roles' => array('/' => 'php'), // hack to put *.ser files in the right place
+ 'ignore' => array(
+ 'HTMLPurifier.standalone.php',
+ 'HTMLPurifier.path.php',
+ '*.tar.gz',
+ '*.tgz',
+ 'standalone/'
+ ),
+ )
+);
+
+$pkg->setPackage('HTMLPurifier');
+$pkg->setLicense('LGPL', 'http://www.gnu.org/licenses/lgpl.html');
+$pkg->setSummary('Standards-compliant HTML filter');
+$pkg->setDescription(
+ 'HTML Purifier is an HTML filter that will remove all malicious code
+ (better known as XSS) with a thoroughly audited, secure yet permissive
+ whitelist and will also make sure your documents are standards
+ compliant.'
+);
+
+$pkg->addMaintainer('lead', 'ezyang', 'Edward Z. Yang', 'admin@htmlpurifier.org', 'yes');
+
+$version = trim(file_get_contents('VERSION'));
+$api_version = substr($version, 0, strrpos($version, '.'));
+
+$pkg->setChannel('htmlpurifier.org');
+$pkg->setAPIVersion($api_version);
+$pkg->setAPIStability('stable');
+$pkg->setReleaseVersion($version);
+$pkg->setReleaseStability('stable');
+
+$pkg->addRelease();
+
+$pkg->setNotes(file_get_contents('WHATSNEW'));
+$pkg->setPackageType('php');
+
+$pkg->setPhpDep('5.0.0');
+$pkg->setPearinstallerDep('1.4.3');
+
+$pkg->generateContents();
+
+$pkg->writePackageFile();
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/phpdoc.ini b/vendor/ezyang/htmlpurifier/phpdoc.ini
new file mode 100644
index 000000000..c4c372353
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/phpdoc.ini
@@ -0,0 +1,102 @@
+;; phpDocumentor parse configuration file
+;;
+;; This file is designed to cut down on repetitive typing on the command-line or web interface
+;; You can copy this file to create a number of configuration files that can be used with the
+;; command-line switch -c, as in phpdoc -c default.ini or phpdoc -c myini.ini. The web
+;; interface will automatically generate a list of .ini files that can be used.
+;;
+;; default.ini is used to generate the online manual at http://www.phpdoc.org/docs
+;;
+;; ALL .ini files must be in the user subdirectory of phpDocumentor with an extension of .ini
+;;
+;; Copyright 2002, Greg Beaver <cellog@users.sourceforge.net>
+;;
+;; WARNING: do not change the name of any command-line parameters, phpDocumentor will ignore them
+
+[Parse Data]
+;; title of all the documentation
+;; legal values: any string
+title = HTML Purifier API Documentation
+
+;; parse files that start with a . like .bash_profile
+;; legal values: true, false
+hidden = false
+
+;; show elements marked @access private in documentation by setting this to on
+;; legal values: on, off
+parseprivate = off
+
+;; parse with javadoc-like description (first sentence is always the short description)
+;; legal values: on, off
+javadocdesc = on
+
+;; add any custom @tags separated by commas here
+;; legal values: any legal tagname separated by commas.
+;customtags = mytag1,mytag2
+
+;; This is only used by the XML:DocBook/peardoc2 converter
+defaultcategoryname = Documentation
+
+;; what is the main package?
+;; legal values: alphanumeric string plus - and _
+defaultpackagename = HTMLPurifier
+
+;; output any parsing information? set to on for cron jobs
+;; legal values: on
+;quiet = on
+
+;; parse a PEAR-style repository. Do not turn this on if your project does
+;; not have a parent directory named "pear"
+;; legal values: on/off
+;pear = on
+
+;; where should the documentation be written?
+;; legal values: a legal path
+target = docs/phpdoc
+
+;; Which files should be parsed out as special documentation files, such as README,
+;; INSTALL and CHANGELOG? This overrides the default files found in
+;; phpDocumentor.ini (this file is not a user .ini file, but the global file)
+readmeinstallchangelog = README, INSTALL, NEWS, WYSIWYG, SLOW, LICENSE, CREDITS
+
+;; limit output to the specified packages, even if others are parsed
+;; legal values: package names separated by commas
+;packageoutput = package1,package2
+
+;; comma-separated list of files to parse
+;; legal values: paths separated by commas
+;filename = /path/to/file1,/path/to/file2,fileincurrentdirectory
+
+;; comma-separated list of directories to parse
+;; legal values: directory paths separated by commas
+;directory = /path1,/path2,.,..,subdirectory
+;directory = /home/jeichorn/cvs/pear
+directory = .
+
+;; template base directory (the equivalent directory of <installdir>/phpDocumentor)
+;templatebase = /path/to/my/templates
+
+;; directory to find any example files in through @example and {@example} tags
+;examplesdir = /path/to/my/templates
+
+;; comma-separated list of files, directories or wildcards ? and * (any wildcard) to ignore
+;; legal values: any wildcard strings separated by commas
+;ignore = /path/to/ignore*,*list.php,myfile.php,subdirectory/
+ignore = *tests*,*benchmarks*,*docs*,*test-settings.php,*configdoc*,*maintenance*,*smoketests*,*standalone*,*.svn*,*conf*
+
+sourcecode = on
+
+;; comma-separated list of Converters to use in outputformat:Convertername:templatedirectory format
+;; legal values: HTML:frames:default,HTML:frames:l0l33t,HTML:frames:phpdoc.de,HTML:frames:phphtmllib,
+;; HTML:frames:earthli,
+;; HTML:frames:DOM/default,HTML:frames:DOM/l0l33t,HTML:frames:DOM/phpdoc.de,
+;; HTML:frames:DOM/phphtmllib,HTML:frames:DOM/earthli
+;; HTML:Smarty:default,HTML:Smarty:PHP,HTML:Smarty:HandS
+;; PDF:default:default,CHM:default:default,XML:DocBook/peardoc2:default
+output=HTML:frames:default
+
+;; turn this option on if you want highlighted source code for every file
+;; legal values: on/off
+sourcecode = on
+
+; vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/modx.txt b/vendor/ezyang/htmlpurifier/plugins/modx.txt
new file mode 100644
index 000000000..0763821b5
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/modx.txt
@@ -0,0 +1,112 @@
+
+MODx Plugin
+
+MODx <http://www.modxcms.com/> is an open source PHP application framework.
+I first came across them in my referrer logs when tillda asked if anyone
+could implement an HTML Purifier plugin. This forum thread
+<http://modxcms.com/forums/index.php/topic,6604.0.html> eventually resulted
+in the fruition of this plugin that davidm says, "is on top of my favorite
+list." HTML Purifier goes great with WYSIWYG editors!
+
+
+
+1. Credits
+
+PaulGregory wrote the overall structure of the code. I added the
+slashes hack.
+
+
+
+2. Install
+
+First, you need to place HTML Purifier library somewhere. The code here
+assumes that you've placed in MODx's assets/plugins/htmlpurifier (no version
+number).
+
+Log into the manager, and navigate:
+
+Resources > Manage Resources > Plugins tab > New Plugin
+
+Type in a name (probably HTML Purifier), and copy paste this code into the
+textarea:
+
+--------------------------------------------------------------------------------
+$e = &$modx->Event;
+if ($e->name == 'OnBeforeDocFormSave') {
+ global $content;
+
+ include_once '../assets/plugins/htmlpurifier/library/HTMLPurifier.auto.php';
+ $purifier = new HTMLPurifier();
+
+ static $magic_quotes = null;
+ if ($magic_quotes === null) {
+ // this is an ugly hack because this hook hasn't
+ // had the backslashes removed yet when magic_quotes_gpc is on,
+ // but HTMLPurifier must not have the quotes slashed.
+ $magic_quotes = get_magic_quotes_gpc();
+ }
+
+ if ($magic_quotes) $content = stripslashes($content);
+ $content = $purifier->purify($content);
+ if ($magic_quotes) $content = addslashes($content);
+}
+--------------------------------------------------------------------------------
+
+Then navigate to the System Events tab and check "OnBeforeDocFormSave".
+Save the plugin. HTML Purifier now is integrated!
+
+
+
+3. Making sure it works
+
+You can test HTML Purifier by deliberately putting in crappy HTML and seeing
+whether or not it gets fixed. A better way is to put in something like this:
+
+<p lang="fr">Il est bon</p>
+
+...and seeing whether or not the content comes out as:
+
+<p lang="fr" xml:lang="fr">Il est bon</p>
+
+(lang to xml:lang synchronization is one of the many features HTML Purifier
+has).
+
+
+
+4. Caveat Emptor
+
+This code does not intercept save requests from the QuickEdit plugin, this may
+be added in a later version. It also modifies things on save, so there's a
+slight chance that HTML Purifier may make a boo-boo and accidently mess things
+up (the original version is not saved).
+
+Finally, make sure that MODx is using UTF-8. If you are using, say, a French
+localisation, you may be using Latin-1, if that's the case, configure
+HTML Purifier properly like this:
+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('Core', 'Encoding', 'ISO-8859-1'); // or whatever encoding
+$purifier = new HTMLPurifier($config);
+
+
+
+5. Known Bugs
+
+'rn' characters sometimes mysteriously appear after purification. We are
+currently investigating this issue. See: <http://htmlpurifier.org/phorum/read.php?3,1866>
+
+
+
+6. See Also
+
+A modified version of Jot 1.1.3 is available, which integrates with HTML
+Purifier. You can check it out here: <http://modxcms.com/forums/index.php/topic,25621.msg161970.html>
+
+
+X. Changelog
+
+2008-06-16
+- Updated code to work with 3.1.0 and later
+- Add Known Bugs and See Also section
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
new file mode 100644
index 000000000..8325e0902
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/.gitignore
@@ -0,0 +1,2 @@
+migrate.php
+htmlpurifier/*
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
new file mode 100644
index 000000000..9f939e54a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/Changelog
@@ -0,0 +1,27 @@
+Changelog HTMLPurifier : Phorum Mod
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+= KEY ====================
+ # Breaks back-compat
+ ! Feature
+ - Bugfix
+ + Sub-comment
+ . Internal change
+==========================
+
+Version 4.0.0 for Phorum 5.2, released July 9, 2009
+# Works only with HTML Purifier 4.0.0
+! Better installation documentation
+- Fixed double encoded quotes
+- Fixed fatal error when migrate.php is blank
+
+Version 3.0.0 for Phorum 5.2, released January 12, 2008
+# WYSIWYG and suppress_message options are now configurable via web
+ interface.
+- Module now compatible with Phorum 5.2, primary bugs were in migration
+ code as well as signature and edit message handling. This module is NOT
+ compatible with Phorum 5.1.
+- Buggy WYSIWYG mode refined
+. AutoFormatParam added to list of default configuration namespaces
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
new file mode 100644
index 000000000..23c76fc5c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/INSTALL
@@ -0,0 +1,84 @@
+
+Install
+ How to install the Phorum HTML Purifier plugin
+
+0. PREREQUISITES
+----------------
+This Phorum module only works on PHP5 and with HTML Purifier 4.0.0
+or later.
+
+1. UNZIP
+--------
+Unzip phorum-htmlpurifier-x.y.z, producing an htmlpurifier folder.
+You've already done this step if you're reading this!
+
+2. MOVE
+-------
+Move the htmlpurifier folder to the mods/ folder of your Phorum
+installation, so the directory structure looks like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ INSTALL - this install file
+ info.txt, ... - the module files
+ htmlpurifier/
+
+3. INSTALL HTML PURIFIER
+------------------------
+Download and unzip HTML Purifier <htmlpurifier.org>. Place the contents of
+the library/ folder in the htmlpurifier/htmlpurifier folder. Your directory
+structure will look like:
+
+phorum/
+ mods/
+ htmlpurifier/
+ htmlpurifier/
+ HTMLPurifier.auto.php
+ ... - other files
+ HTMLPurifier/
+
+Advanced users:
+ If you have HTML Purifier installed elsewhere on your server,
+ all you need is an HTMLPurifier.auto.php file in the library folder which
+ includes the HTMLPurifier.auto.php file in your install.
+
+4. MIGRATE
+----------
+If you're setting up a new Phorum installation, all you need to do is create
+a blank migrate.php file in the htmlpurifier module folder (NOT the library
+folder.
+
+If you have an old Phorum installation and was using BBCode,
+copy migrate.bbcode.php to migrate.php. If you were using a different input
+format, follow the instructions in migrate.bbcode.php to create your own custom
+migrate.php file.
+
+Your directory structure should now look like this:
+
+phorum/
+ mods/
+ htmlpurifier/
+ migrate.php
+
+5. ENABLE
+---------
+Navigate to your Phorum admin panel at http://example.com/phorum/admin.php,
+click on Global Settings > Modules, scroll to "HTML Purifier Phorum Mod" and
+turn it On.
+
+6. MIGRATE SIGNATURES
+---------------------
+If you're setting up a new Phorum installation, skip this step.
+
+If you allowed your users to make signatures, navigate to the module settings
+page of HTML Purifier (Global Settings > Modules > HTML Purifier Phorum Mod >
+Configure), type in "yes" in the "Confirm" box, and press "Migrate."
+
+ONLY DO THIS ONCE! BE SURE TO BACK UP YOUR DATABASE!
+
+7. CONFIGURE
+------------
+Configure using Edit settings. See that page for more information.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/README b/vendor/ezyang/htmlpurifier/plugins/phorum/README
new file mode 100644
index 000000000..0524ed39d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/README
@@ -0,0 +1,45 @@
+
+HTML Purifier Phorum Mod - Filter your HTML the Standards-Compliant Way!
+
+This Phorum mod enables HTML posting on Phorum. Under normal circumstances,
+this would cause a huge security risk, but because we are running
+HTML through HTML Purifier, output is guaranteed to be XSS free and
+standards-compliant.
+
+This mod requires HTML input, and previous markup languages need to be
+converted accordingly. Thus, it is vital that you create a 'migrate.php'
+file that works with your installation. If you're using the built-in
+BBCode formatting, simply move migrate.bbcode.php to that place; for
+other markup languages, consult said file for instructions on how
+to adapt it to your needs.
+
+ -- NOTE -------------------------------------------------
+ You can also run this module in parallel with another
+ formatting module; this module attempts to place itself
+ at the end of the filtering chain. However, if any
+ previous modules produce insecure HTML (for instance,
+ a JavaScript email obfuscator) they will get cleaned.
+
+This module will not work if 'migrate.php' is not created, and an improperly
+made migration file may *CORRUPT* Phorum, so please take your time to
+do this correctly. It should go without saying to *BACKUP YOUR DATABASE*
+before attempting anything here. If no migration is necessary, you can
+simply create a blank migrate.php file. HTML Purifier is smart and will
+not re-migrate already processed messages. However, the original code
+is irretrievably lost (we may change this in the future.)
+
+This module will not automatically migrate user signatures, because this
+process may take a long time. After installing the HTML Purifier module and
+then configuring 'migrate.php', navigate to Settings and click 'Migrate
+Signatures' to migrate all user signatures to HTML.
+
+All of HTML Purifier's usual functions are configurable via the mod settings
+page. If you require custom configuration, create config.php file in
+the mod directory that edits a $config variable. Be sure, also, to
+set $PHORUM['mod_htmlpurifier']['wysiwyg'] to TRUE if you are using a
+WYSIWYG editor (you can do this through a common hook or the web
+configuration form).
+
+Visit HTML Purifier at <http://htmlpurifier.org/>.
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
new file mode 100644
index 000000000..e047c0b42
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/config.default.php
@@ -0,0 +1,57 @@
+<?php
+
+if(!defined("PHORUM")) exit;
+
+// default HTML Purifier configuration settings
+$config->set('HTML.Allowed',
+ // alphabetically sorted
+'a[href|title]
+abbr[title]
+acronym[title]
+b
+blockquote[cite]
+br
+caption
+cite
+code
+dd
+del
+dfn
+div
+dl
+dt
+em
+i
+img[src|alt|title|class]
+ins
+kbd
+li
+ol
+p
+pre
+s
+strike
+strong
+sub
+sup
+table
+tbody
+td
+tfoot
+th
+thead
+tr
+tt
+u
+ul
+var');
+$config->set('AutoFormat.AutoParagraph', true);
+$config->set('AutoFormat.Linkify', true);
+$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
+$config->set('Core.AggressivelyFixLt', true);
+$config->set('Core.Encoding', $GLOBALS['PHORUM']['DATA']['CHARSET']); // we'll change this eventually
+if (strtolower($GLOBALS['PHORUM']['DATA']['CHARSET']) !== 'utf-8') {
+ $config->set('Core.EscapeNonASCIICharacters', true);
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
new file mode 100644
index 000000000..f66d8c36c
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/htmlpurifier.php
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * HTML Purifier Phorum Mod. Filter your HTML the Standards-Compliant Way!
+ *
+ * This Phorum mod enables users to post raw HTML into Phorum. But never
+ * fear: with the help of HTML Purifier, this HTML will be beat into
+ * de-XSSed and standards-compliant form, safe for general consumption.
+ * It is not recommended, but possible to run this mod in parallel
+ * with other formatters (in short, please DISABLE the BBcode mod).
+ *
+ * For help migrating from your previous markup language to pure HTML
+ * please check the migrate.bbcode.php file.
+ *
+ * If you'd like to use this with a WYSIWYG editor, make sure that
+ * editor sets $PHORUM['mod_htmlpurifier']['wysiwyg'] to true. Otherwise,
+ * administrators who need to edit other people's comments may be at
+ * risk for some nasty attacks.
+ *
+ * Tested with Phorum 5.2.11.
+ */
+
+// Note: Cache data is base64 encoded because Phorum insists on flinging
+// to the user and expecting it to come back unharmed, newlines and
+// all, which ain't happening. It's slower, it takes up more space, but
+// at least it won't get mutilated
+
+/**
+ * Purifies a data array
+ */
+function phorum_htmlpurifier_format($data)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+
+ $purifier =& HTMLPurifier::getInstance();
+ $cache_serial = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+
+ foreach($data as $message_id => $message){
+ if(isset($message['body'])) {
+
+ if ($message_id) {
+ // we're dealing with a real message, not a fake, so
+ // there a number of shortcuts that can be taken
+
+ if (isset($message['meta']['htmlpurifier_light'])) {
+ // format hook was called outside of Phorum's normal
+ // functions, do the abridged purification
+ $data[$message_id]['body'] = $purifier->purify($message['body']);
+ continue;
+ }
+
+ if (!empty($PHORUM['args']['purge'])) {
+ // purge the cache, must be below the following if
+ unset($message['meta']['body_cache']);
+ }
+
+ if (
+ isset($message['meta']['body_cache']) &&
+ isset($message['meta']['body_cache_serial']) &&
+ $message['meta']['body_cache_serial'] == $cache_serial
+ ) {
+ // cached version is present, bail out early
+ $data[$message_id]['body'] = base64_decode($message['meta']['body_cache']);
+ continue;
+ }
+ }
+
+ // migration might edit this array, that's why it's defined
+ // so early
+ $updated_message = array();
+
+ // create the $body variable
+ if (
+ $message_id && // message must be real to migrate
+ !isset($message['meta']['body_cache_serial'])
+ ) {
+ // perform migration
+ $fake_data = array();
+ list($signature, $edit_message) = phorum_htmlpurifier_remove_sig_and_editmessage($message);
+ $fake_data[$message_id] = $message;
+ $fake_data = phorum_htmlpurifier_migrate($fake_data);
+ $body = $fake_data[$message_id]['body'];
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $updated_message['body'] = $body; // save it in
+ $body .= $signature . $edit_message; // add it back in
+ } else {
+ // reverse Phorum's pre-processing
+ $body = $message['body'];
+ // order is important
+ $body = str_replace("<phorum break>\n", "\n", $body);
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ if (!$message_id && defined('PHORUM_CONTROL_CENTER')) {
+ // we're in control.php, so it was double-escaped
+ $body = str_replace(array('&lt;','&gt;','&amp;', '&quot;'), array('<','>','&','"'), $body);
+ }
+ }
+
+ $body = $purifier->purify($body);
+
+ // dynamically update the cache (MUST BE DONE HERE!)
+ // this is inefficient because it's one db call per
+ // cache miss, but once the cache is in place things are
+ // a lot zippier.
+
+ if ($message_id) { // make sure it's not a fake id
+ $updated_message['meta'] = $message['meta'];
+ $updated_message['meta']['body_cache'] = base64_encode($body);
+ $updated_message['meta']['body_cache_serial'] = $cache_serial;
+ phorum_db_update_message($message_id, $updated_message);
+ }
+
+ // must not get overloaded until after we cache it, otherwise
+ // we'll inadvertently change the original text
+ $data[$message_id]['body'] = $body;
+
+ }
+ }
+
+ return $data;
+}
+
+// -----------------------------------------------------------------------
+// This is fragile code, copied from read.php:596 (Phorum 5.2.6). Please
+// keep this code in-sync with Phorum
+
+/**
+ * Generates a signature based on a message array
+ */
+function phorum_htmlpurifier_generate_sig($row)
+{
+ $phorum_sig = '';
+ if(isset($row["user"]["signature"])
+ && isset($row['meta']['show_signature']) && $row['meta']['show_signature']==1){
+ $phorum_sig=trim($row["user"]["signature"]);
+ if(!empty($phorum_sig)){
+ $phorum_sig="\n\n$phorum_sig";
+ }
+ }
+ return $phorum_sig;
+}
+
+/**
+ * Generates an edit message based on a message array
+ */
+function phorum_htmlpurifier_generate_editmessage($row)
+{
+ $PHORUM = $GLOBALS['PHORUM'];
+ $editmessage = '';
+ if(isset($row['meta']['edit_count']) && $row['meta']['edit_count'] > 0) {
+ $editmessage = str_replace ("%count%", $row['meta']['edit_count'], $PHORUM["DATA"]["LANG"]["EditedMessage"]);
+ $editmessage = str_replace ("%lastedit%", phorum_date($PHORUM["short_date_time"],$row['meta']['edit_date']), $editmessage);
+ $editmessage = str_replace ("%lastuser%", $row['meta']['edit_username'], $editmessage);
+ $editmessage = "\n\n\n\n$editmessage";
+ }
+ return $editmessage;
+}
+
+// End fragile code
+// -----------------------------------------------------------------------
+
+/**
+ * Removes the signature and edit message from a message
+ * @param $row Message passed by reference
+ */
+function phorum_htmlpurifier_remove_sig_and_editmessage(&$row)
+{
+ $signature = phorum_htmlpurifier_generate_sig($row);
+ $editmessage = phorum_htmlpurifier_generate_editmessage($row);
+ $replacements = array();
+ // we need to remove add <phorum break> as that is the form these
+ // extra bits are in.
+ if ($signature) $replacements[str_replace("\n", "<phorum break>\n", $signature)] = '';
+ if ($editmessage) $replacements[str_replace("\n", "<phorum break>\n", $editmessage)] = '';
+ $row['body'] = strtr($row['body'], $replacements);
+ return array($signature, $editmessage);
+}
+
+/**
+ * Indicate that data is fully HTML and not from migration, invalidate
+ * previous caches
+ * @note This function could generate the actual cache entries, but
+ * since there's data missing that must be deferred to the first read
+ */
+function phorum_htmlpurifier_posting($message)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ unset($message['meta']['body_cache']); // invalidate the cache
+ $message['meta']['body_cache_serial'] = $PHORUM['mod_htmlpurifier']['body_cache_serial'];
+ return $message;
+}
+
+/**
+ * Overload quoting mechanism to prevent default, mail-style quote from happening
+ */
+function phorum_htmlpurifier_quote($array)
+{
+ $PHORUM = $GLOBALS["PHORUM"];
+ $purifier =& HTMLPurifier::getInstance();
+ $text = $purifier->purify($array[1]);
+ $source = htmlspecialchars($array[0]);
+ return "<blockquote cite=\"$source\">\n$text\n</blockquote>";
+}
+
+/**
+ * Ensure that our format hook is processed last. Also, loads the library.
+ * @credits <http://secretsauce.phorum.org/snippets/make_bbcode_last_formatter.php.txt>
+ */
+function phorum_htmlpurifier_common()
+{
+ require_once(dirname(__FILE__).'/htmlpurifier/HTMLPurifier.auto.php');
+ require(dirname(__FILE__).'/init-config.php');
+
+ $config = phorum_htmlpurifier_get_config();
+ HTMLPurifier::getInstance($config);
+
+ // increment revision.txt if you want to invalidate the cache
+ $GLOBALS['PHORUM']['mod_htmlpurifier']['body_cache_serial'] = $config->getSerial();
+
+ // load migration
+ if (file_exists(dirname(__FILE__) . '/migrate.php')) {
+ include(dirname(__FILE__) . '/migrate.php');
+ } else {
+ echo '<strong>Error:</strong> No migration path specified for HTML Purifier, please check
+ <tt>modes/htmlpurifier/migrate.bbcode.php</tt> for instructions on
+ how to migrate from your previous markup language.';
+ exit;
+ }
+
+ if (!function_exists('phorum_htmlpurifier_migrate')) {
+ // Dummy function
+ function phorum_htmlpurifier_migrate($data) {return $data;}
+ }
+
+}
+
+/**
+ * Pre-emptively performs purification if it looks like a WYSIWYG editor
+ * is being used
+ */
+function phorum_htmlpurifier_before_editor($message)
+{
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ if (!empty($message['body'])) {
+ $body = $message['body'];
+ // de-entity-ize contents
+ $body = str_replace(array('&lt;','&gt;','&amp;'), array('<','>','&'), $body);
+ $purifier =& HTMLPurifier::getInstance();
+ $body = $purifier->purify($body);
+ // re-entity-ize contents
+ $body = htmlspecialchars($body, ENT_QUOTES, $GLOBALS['PHORUM']['DATA']['CHARSET']);
+ $message['body'] = $body;
+ }
+ }
+ return $message;
+}
+
+function phorum_htmlpurifier_editor_after_subject()
+{
+ // don't show this message if it's a WYSIWYG editor, since it will
+ // then be handled automatically
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg'])) {
+ $i = $GLOBALS['PHORUM']['DATA']['MODE'];
+ if ($i == 'quote' || $i == 'edit' || $i == 'moderation') {
+ ?>
+ <div>
+ <p>
+ <strong>Notice:</strong> HTML has been scrubbed for your safety.
+ If you would like to see the original, turn off WYSIWYG mode
+ (consult your administrator for details.)
+ </p>
+ </div>
+ <?php
+ }
+ return;
+ }
+ if (!empty($GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message'])) return;
+ ?><div class="htmlpurifier-help">
+ <p>
+ <strong>HTML input</strong> is enabled. Make sure you escape all HTML and
+ angled brackets with <code>&amp;lt;</code> and <code>&amp;gt;</code>.
+ </p><?php
+ $purifier =& HTMLPurifier::getInstance();
+ $config = $purifier->config;
+ if ($config->get('AutoFormat.AutoParagraph')) {
+ ?><p>
+ <strong>Auto-paragraphing</strong> is enabled. Double
+ newlines will be converted to paragraphs; for single
+ newlines, use the <code>pre</code> tag.
+ </p><?php
+ }
+ $html_definition = $config->getDefinition('HTML');
+ $allowed = array();
+ foreach ($html_definition->info as $name => $x) $allowed[] = "<code>$name</code>";
+ sort($allowed);
+ $allowed_text = implode(', ', $allowed);
+ ?><p><strong>Allowed tags:</strong> <?php
+ echo $allowed_text;
+ ?>.</p><?php
+ ?>
+ </p>
+ <p>
+ For inputting literal code such as HTML and PHP for display, use
+ CDATA tags to auto-escape your angled brackets, and <code>pre</code>
+ to preserve newlines:
+ </p>
+ <pre>&lt;pre&gt;&lt;![CDATA[
+<em>Place code here</em>
+]]&gt;&lt;/pre&gt;</pre>
+ <p>
+ Power users, you can hide this notice with:
+ <pre>.htmlpurifier-help {display:none;}</pre>
+ </p>
+ </div><?php
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
new file mode 100644
index 000000000..723465490
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/info.txt
@@ -0,0 +1,18 @@
+title: HTML Purifier Phorum Mod
+desc: This module enables standards-compliant HTML filtering on Phorum. Please check migrate.bbcode.php before enabling this mod.
+author: Edward Z. Yang
+url: http://htmlpurifier.org/
+version: 4.0.0
+
+hook: format|phorum_htmlpurifier_format
+hook: quote|phorum_htmlpurifier_quote
+hook: posting_custom_action|phorum_htmlpurifier_posting
+hook: common|phorum_htmlpurifier_common
+hook: before_editor|phorum_htmlpurifier_before_editor
+hook: tpl_editor_after_subject|phorum_htmlpurifier_editor_after_subject
+
+# This module is meant to be a drop-in for bbcode, so make it run last.
+priority: run module after *
+priority: run hook format after *
+
+ vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
new file mode 100644
index 000000000..e19787b4b
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/init-config.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Initializes the appropriate configuration from either a PHP file
+ * or a module configuration value
+ * @return Instance of HTMLPurifier_Config
+ */
+function phorum_htmlpurifier_get_config($default = false)
+{
+ global $PHORUM;
+ $config_exists = phorum_htmlpurifier_config_file_exists();
+ if ($default || $config_exists || !isset($PHORUM['mod_htmlpurifier']['config'])) {
+ $config = HTMLPurifier_Config::createDefault();
+ include(dirname(__FILE__) . '/config.default.php');
+ if ($config_exists) {
+ include(dirname(__FILE__) . '/config.php');
+ }
+ unset($PHORUM['mod_htmlpurifier']['config']); // unnecessary
+ } else {
+ $config = HTMLPurifier_Config::create($PHORUM['mod_htmlpurifier']['config']);
+ }
+ return $config;
+}
+
+function phorum_htmlpurifier_config_file_exists()
+{
+ return file_exists(dirname(__FILE__) . '/config.php');
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
new file mode 100644
index 000000000..0d0919455
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/migrate.bbcode.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * This file is responsible for migrating from a specific markup language
+ * like BBCode or Markdown to HTML. WARNING: THIS PROCESS IS NOT REVERSIBLE
+ *
+ * Copy this file to 'migrate.php' and it will automatically work for
+ * BBCode; you may need to tweak this a little to get it to work for other
+ * languages (usually, just replace the include name and the function name).
+ *
+ * If you do NOT want to have any migration performed (for instance, you
+ * are installing the module on a new forum with no posts), simply remove
+ * phorum_htmlpurifier_migrate() function. You still need migrate.php
+ * present, otherwise the module won't work. This ensures that the user
+ * explicitly says, "No, I do not need to migrate."
+ */
+
+if(!defined("PHORUM")) exit;
+
+require_once(dirname(__FILE__) . "/../bbcode/bbcode.php");
+
+/**
+ * 'format' hook style function that will be called to convert
+ * legacy markup into HTML.
+ */
+function phorum_htmlpurifier_migrate($data)
+{
+ return phorum_mod_bbcode_format($data); // bbcode's 'format' hook
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
new file mode 100644
index 000000000..8158f0282
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings.php
@@ -0,0 +1,64 @@
+<?php
+
+// based off of BBCode's settings file
+
+/**
+ * HTML Purifier Phorum mod settings configuration. This provides
+ * a convenient web-interface for editing the most common HTML Purifier
+ * configuration directives. You can also specify custom configuration
+ * by creating a 'config.php' file.
+ */
+
+if(!defined("PHORUM_ADMIN")) exit;
+
+// error reporting is good!
+error_reporting(E_ALL ^ E_NOTICE);
+
+// load library and other paraphenalia
+require_once './include/admin/PhorumInputForm.php';
+require_once (dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.auto.php');
+require_once (dirname(__FILE__) . '/init-config.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs-form.php');
+require_once (dirname(__FILE__) . '/settings/migrate-sigs.php');
+require_once (dirname(__FILE__) . '/settings/form.php');
+require_once (dirname(__FILE__) . '/settings/save.php');
+
+// define friendly configuration directives. you can expand this array
+// to get more web-definable directives
+$PHORUM['mod_htmlpurifier']['directives'] = array(
+ 'URI.Host', // auto-detectable
+ 'URI.DisableExternal',
+ 'URI.DisableExternalResources',
+ 'URI.DisableResources',
+ 'URI.Munge',
+ 'URI.HostBlacklist',
+ 'URI.Disable',
+ 'HTML.TidyLevel',
+ 'HTML.Doctype', // auto-detectable
+ 'HTML.Allowed',
+ 'AutoFormat',
+ '-AutoFormat.Custom',
+ 'AutoFormatParam',
+ 'Output.TidyFormat',
+);
+
+// lower this setting if you're getting time outs/out of memory
+$PHORUM['mod_htmlpurifier']['migrate-sigs-increment'] = 100;
+
+if (isset($_POST['reset'])) {
+ unset($PHORUM['mod_htmlpurifier']['config']);
+}
+
+if ($offset = phorum_htmlpurifier_migrate_sigs_check()) {
+ // migrate signatures
+ phorum_htmlpurifier_migrate_sigs($offset);
+} elseif(!empty($_POST)){
+ // save settings
+ phorum_htmlpurifier_save_settings();
+}
+
+phorum_htmlpurifier_show_migrate_sigs_form();
+echo '<br />';
+phorum_htmlpurifier_show_form();
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
new file mode 100644
index 000000000..9b6ad5f39
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/form.php
@@ -0,0 +1,95 @@
+<?php
+
+function phorum_htmlpurifier_show_form()
+{
+ if (phorum_htmlpurifier_config_file_exists()) {
+ phorum_htmlpurifier_show_config_info();
+ return;
+ }
+
+ global $PHORUM;
+
+ $config = phorum_htmlpurifier_get_config();
+
+ $frm = new PhorumInputForm ("", "post", "Save");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier"); // this is the directory name that the Settings file lives in
+
+ if (!empty($error)){
+ echo "$error<br />";
+ }
+
+ $frm->addbreak("Edit settings for the HTML Purifier module");
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'wysiwyg\']</code>.
+ When checked, contents sent for edit are now purified and the
+ informative message is disabled. If your WYSIWYG editor is disabled for
+ admin edits, you can safely keep this unchecked.</p>');
+ $frm->addRow('Use WYSIWYG?', $frm->checkbox('wysiwyg', '1', '', $PHORUM['mod_htmlpurifier']['wysiwyg']));
+
+ $frm->addMessage('<p>The box below sets <code>$PHORUM[\'mod_htmlpurifier\'][\'suppress_message\']</code>,
+ which removes the big how-to use
+ HTML Purifier message.</p>');
+ $frm->addRow('Suppress information?', $frm->checkbox('suppress_message', '1', '', $PHORUM['mod_htmlpurifier']['suppress_message']));
+
+ $frm->addMessage('<p>Click on directive links to read what each option does
+ (links do not open in new windows).</p>
+ <p>For more flexibility (for instance, you want to edit the full
+ range of configuration directives), you can create a <tt>config.php</tt>
+ file in your <tt>mods/htmlpurifier/</tt> directory. Doing so will,
+ however, make the web configuration interface unavailable.</p>');
+
+ require_once 'HTMLPurifier/Printer/ConfigForm.php';
+ $htmlpurifier_form = new HTMLPurifier_Printer_ConfigForm('config', 'http://htmlpurifier.org/live/configdoc/plain.html#%s');
+ $htmlpurifier_form->setTextareaDimensions(23, 7); // widen a little, since we have space
+
+ $frm->addMessage($htmlpurifier_form->render(
+ $config, $PHORUM['mod_htmlpurifier']['directives'], false));
+
+ $frm->addMessage("<strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>");
+
+ $frm->addrow('Reset to defaults:', $frm->checkbox("reset", "1", "", false));
+
+ // hack to include extra styling
+ echo '<style type="text/css">' . $htmlpurifier_form->getCSS() . '
+ .hp-config {margin-left:auto;margin-right:auto;}
+ </style>';
+ $js = $htmlpurifier_form->getJavaScript();
+ echo '<script type="text/javascript">'."<!--\n$js\n//-->".'</script>';
+
+ $frm->show();
+}
+
+function phorum_htmlpurifier_show_config_info()
+{
+ global $PHORUM;
+
+ // update mod_htmlpurifier for housekeeping
+ phorum_htmlpurifier_commit_settings();
+
+ // politely tell user how to edit settings manually
+?>
+ <div class="input-form-td-break">How to edit settings for HTML Purifier module</div>
+ <p>
+ A <tt>config.php</tt> file exists in your <tt>mods/htmlpurifier/</tt>
+ directory. This file contains your custom configuration: in order to
+ change it, please navigate to that file and edit it accordingly.
+ You can also set <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['wysiwyg']</code>
+ or <code>$GLOBALS['PHORUM']['mod_htmlpurifier']['suppress_message']</code>
+ </p>
+ <p>
+ To use the web interface, delete <tt>config.php</tt> (or rename it to
+ <tt>config.php.bak</tt>).
+ </p>
+ <p>
+ <strong>Warning: Changing HTML Purifier's configuration will invalidate
+ the cache. Expect to see a flurry of database activity after you change
+ any of these settings.</strong>
+ </p>
+<?php
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
new file mode 100644
index 000000000..abea3b51d
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs-form.php
@@ -0,0 +1,22 @@
+<?php
+
+function phorum_htmlpurifier_show_migrate_sigs_form()
+{
+ $frm = new PhorumInputForm ('', "post", "Migrate");
+ $frm->hidden("module", "modsettings");
+ $frm->hidden("mod", "htmlpurifier");
+ $frm->hidden("migrate-sigs", "1");
+ $frm->addbreak("Migrate user signatures to HTML");
+ $frm->addMessage('This operation will migrate your users signatures
+ to HTML. <strong>This process is irreversible and must only be performed once.</strong>
+ Type in yes in the confirmation field to migrate.');
+ if (!file_exists(dirname(__FILE__) . '/../migrate.php')) {
+ $frm->addMessage('Migration file does not exist, cannot migrate signatures.
+ Please check <tt>migrate.bbcode.php</tt> on how to create an appropriate file.');
+ } else {
+ $frm->addrow('Confirm:', $frm->text_box("confirmation", ""));
+ }
+ $frm->show();
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
new file mode 100644
index 000000000..5ea9cd0b8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/migrate-sigs.php
@@ -0,0 +1,79 @@
+<?php
+
+function phorum_htmlpurifier_migrate_sigs_check()
+{
+ global $PHORUM;
+ $offset = 0;
+ if (!empty($_POST['migrate-sigs'])) {
+ if (!isset($_POST['confirmation']) || strtolower($_POST['confirmation']) !== 'yes') {
+ echo 'Invalid confirmation code.';
+ exit;
+ }
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = true;
+ phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+ $offset = 1;
+ } elseif (!empty($_GET['migrate-sigs']) && $PHORUM['mod_htmlpurifier']['migrate-sigs']) {
+ $offset = (int) $_GET['migrate-sigs'];
+ }
+ return $offset;
+}
+
+function phorum_htmlpurifier_migrate_sigs($offset)
+{
+ global $PHORUM;
+
+ if(!$offset) return; // bail out quick if $offset == 0
+
+ // theoretically, we could get rid of this multi-request
+ // doo-hickery if safe mode is off
+ @set_time_limit(0); // attempt to let this run
+ $increment = $PHORUM['mod_htmlpurifier']['migrate-sigs-increment'];
+
+ require_once(dirname(__FILE__) . '/../migrate.php');
+ // migrate signatures
+ // do this in batches so we don't run out of time/space
+ $end = $offset + $increment;
+ $user_ids = array();
+ for ($i = $offset; $i < $end; $i++) {
+ $user_ids[] = $i;
+ }
+ $userinfos = phorum_db_user_get_fields($user_ids, 'signature');
+ foreach ($userinfos as $i => $user) {
+ if (empty($user['signature'])) continue;
+ $sig = $user['signature'];
+ // perform standard Phorum processing on the sig
+ $sig = str_replace(array("&","<",">"), array("&amp;","&lt;","&gt;"), $sig);
+ $sig = preg_replace("/<((http|https|ftp):\/\/[a-z0-9;\/\?:@=\&\$\-_\.\+!*'\(\),~%]+?)>/i", "$1", $sig);
+ // prepare fake data to pass to migration function
+ $fake_data = array(array("author"=>"", "email"=>"", "subject"=>"", 'body' => $sig));
+ list($fake_message) = phorum_htmlpurifier_migrate($fake_data);
+ $user['signature'] = $fake_message['body'];
+ if (!phorum_api_user_save($user)) {
+ exit('Error while saving user data');
+ }
+ }
+ unset($userinfos); // free up memory
+
+ // query for highest ID in database
+ $type = $PHORUM['DBCONFIG']['type'];
+ $sql = "select MAX(user_id) from {$PHORUM['user_table']}";
+ $row = phorum_db_interact(DB_RETURN_ROW, $sql);
+ $top_id = (int) $row[0];
+
+ $offset += $increment;
+ if ($offset > $top_id) { // test for end condition
+ echo 'Migration finished';
+ $PHORUM['mod_htmlpurifier']['migrate-sigs'] = false;
+ phorum_htmlpurifier_commit_settings();
+ return true;
+ }
+ $host = $_SERVER['HTTP_HOST'];
+ $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
+ $extra = 'admin.php?module=modsettings&mod=htmlpurifier&migrate-sigs=' . $offset;
+ // relies on output buffering to work
+ header("Location: http://$host$uri/$extra");
+ exit;
+
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
new file mode 100644
index 000000000..2aefaf83a
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/plugins/phorum/settings/save.php
@@ -0,0 +1,29 @@
+<?php
+
+function phorum_htmlpurifier_save_settings()
+{
+ global $PHORUM;
+ if (phorum_htmlpurifier_config_file_exists()) {
+ echo "Cannot update settings, <code>mods/htmlpurifier/config.php</code> already exists. To change
+ settings, edit that file. To use the web form, delete that file.<br />";
+ } else {
+ $config = phorum_htmlpurifier_get_config(true);
+ if (!isset($_POST['reset'])) $config->mergeArrayFromForm($_POST, 'config', $PHORUM['mod_htmlpurifier']['directives']);
+ $PHORUM['mod_htmlpurifier']['config'] = $config->getAll();
+ }
+ $PHORUM['mod_htmlpurifier']['wysiwyg'] = !empty($_POST['wysiwyg']);
+ $PHORUM['mod_htmlpurifier']['suppress_message'] = !empty($_POST['suppress_message']);
+ if(!phorum_htmlpurifier_commit_settings()){
+ $error="Database error while updating settings.";
+ } else {
+ echo "Settings Updated<br />";
+ }
+}
+
+function phorum_htmlpurifier_commit_settings()
+{
+ global $PHORUM;
+ return phorum_db_update_settings(array("mod_htmlpurifier"=>$PHORUM["mod_htmlpurifier"]));
+}
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/release1-update.php b/vendor/ezyang/htmlpurifier/release1-update.php
new file mode 100644
index 000000000..834d38567
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/release1-update.php
@@ -0,0 +1,110 @@
+<?php
+
+// release script
+// PHP 5.0 only
+
+if (php_sapi_name() != 'cli') {
+ echo 'Release script cannot be called from web-browser.';
+ exit;
+}
+
+if (!isset($argv[1])) {
+ echo
+'php release.php [version]
+ HTML Purifier release script
+';
+ exit;
+}
+
+$version = trim($argv[1]);
+
+// Bump version numbers:
+
+// ...in VERSION
+file_put_contents('VERSION', $version);
+
+// ...in NEWS
+if ($is_dev = (strpos($version, 'dev') === false)) {
+ $date = date('Y-m-d');
+ $news_c = str_replace(
+ $l = "$version, unknown release date",
+ "$version, released $date",
+ file_get_contents('NEWS'),
+ $c
+ );
+ if (!$c) {
+ echo 'Could not update NEWS, missing ' . $l . PHP_EOL;
+ exit;
+ } elseif ($c > 1) {
+ echo 'More than one release declaration in NEWS replaced' . PHP_EOL;
+ exit;
+ }
+ file_put_contents('NEWS', $news_c);
+}
+
+// ...in Doxyfile
+$doxyfile_c = preg_replace(
+ '/(?<=PROJECT_NUMBER {9}= )[^\s]+/m', // brittle
+ $version,
+ file_get_contents('Doxyfile'),
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Doxyfile, missing PROJECT_NUMBER.' . PHP_EOL;
+ exit;
+}
+file_put_contents('Doxyfile', $doxyfile_c);
+
+// ...in HTMLPurifier.php
+$htmlpurifier_c = file_get_contents('library/HTMLPurifier.php');
+$htmlpurifier_c = preg_replace(
+ '/HTML Purifier .+? - /',
+ "HTML Purifier $version - ",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing HTML Purifier [version] header.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+$htmlpurifier_c = preg_replace(
+ '/const VERSION = \'.+?\';/',
+ "const VERSION = '$version';",
+ $htmlpurifier_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update HTMLPurifier.php, missing const $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier.php', $htmlpurifier_c);
+
+$config_c = file_get_contents('library/HTMLPurifier/Config.php');
+$config_c = preg_replace(
+ '/public \$version = \'.+?\';/',
+ "public \$version = '$version';",
+ $config_c,
+ 1, $c
+);
+if (!$c) {
+ echo 'Could not update Config.php, missing public $version.' . PHP_EOL;
+ exit;
+}
+file_put_contents('library/HTMLPurifier/Config.php', $config_c);
+
+passthru('php maintenance/flush.php');
+
+if ($is_dev) echo "Review changes, write something in WHATSNEW and FOCUS, and then commit with log 'Release $version.'" . PHP_EOL;
+else echo "Numbers updated to dev, no other modifications necessary!";
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/release2-tag.php b/vendor/ezyang/htmlpurifier/release2-tag.php
new file mode 100644
index 000000000..25e5300d8
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/release2-tag.php
@@ -0,0 +1,22 @@
+<?php
+
+// Tags releases
+
+if (php_sapi_name() != 'cli') {
+ echo 'Release script cannot be called from web-browser.';
+ exit;
+}
+
+require 'svn.php';
+
+$svn_info = my_svn_info('.');
+
+$version = trim(file_get_contents('VERSION'));
+
+$trunk_url = $svn_info['Repository Root'] . '/htmlpurifier/trunk';
+$trunk_tag_url = $svn_info['Repository Root'] . '/htmlpurifier/tags/' . $version;
+
+echo "Tagging trunk to tags/$version...";
+passthru("svn copy --message \"Tag $version release.\" $trunk_url $trunk_tag_url");
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/test-settings.sample.php b/vendor/ezyang/htmlpurifier/test-settings.sample.php
new file mode 100644
index 000000000..480b66279
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/test-settings.sample.php
@@ -0,0 +1,74 @@
+<?php
+
+// ATTENTION! DO NOT EDIT THIS FILE!
+// This file is necessary to run the unit tests and profiling scripts.
+// Please copy it to 'test-settings.php' and make the necessary edits.
+
+// Note: The only external library you *need* is SimpleTest; everything else
+// is optional.
+
+// We've got a lot of tests, so we recommend turning the limit off.
+set_time_limit(0);
+
+// Turning off output buffering will prevent mysterious errors from core dumps.
+$data = @ob_get_clean();
+if ($data !== false && $data !== '') {
+ echo "Output buffer contains data [".urlencode($data)."]\n";
+ exit;
+}
+
+// -----------------------------------------------------------------------------
+// REQUIRED SETTINGS
+
+// Note on running SimpleTest:
+// You want the Git copy of SimpleTest, found here:
+// https://github.com/simpletest/simpletest/
+//
+// If SimpleTest is borked with HTML Purifier, please contact me or
+// the SimpleTest devs; I am a developer for SimpleTest so I should be
+// able to quickly assess a fix. SimpleTest's problem is my problem!
+
+// Where is SimpleTest located? Remember to include a trailing slash!
+$simpletest_location = '/path/to/simpletest/';
+
+// -----------------------------------------------------------------------------
+// OPTIONAL SETTINGS
+
+// Note on running PHPT:
+// Vanilla PHPT from https://github.com/tswicegood/PHPT_Core should
+// work fine on Linux w/o multitest.
+//
+// To do multitest or Windows testing, you'll need some more
+// patches at https://github.com/ezyang/PHPT_Core
+//
+// I haven't tested the Windows setup in a while so I don't know if
+// it still works.
+
+// Should PHPT tests be enabled?
+$GLOBALS['HTMLPurifierTest']['PHPT'] = false;
+
+// If PHPT isn't in your Path via PEAR, set that here:
+// set_include_path('/path/to/phpt/Core/src' . PATH_SEPARATOR . get_include_path());
+
+// Where is CSSTidy located? (Include trailing slash. Leave false to disable.)
+$csstidy_location = false;
+
+// For tests/multitest.php, which versions to test?
+$versions_to_test = array();
+
+// Stable PHP binary to use when invoking maintenance scripts.
+$php = 'php';
+
+// For tests/multitest.php, what is the multi-version executable? It must
+// accept an extra parameter (version number) before all other arguments
+$phpv = false;
+
+// Should PEAR tests be run? If you've got a valid PEAR installation, set this
+// to true (or, if it's not in the include path, to its install directory).
+$GLOBALS['HTMLPurifierTest']['PEAR'] = false;
+
+// If PEAR is enabled, what PEAR tests should be run? (Note: you will
+// need to ensure these libraries are installed)
+$GLOBALS['HTMLPurifierTest']['Net_IDNA2'] = true;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/ezyang/htmlpurifier/test-settings.travis.php b/vendor/ezyang/htmlpurifier/test-settings.travis.php
new file mode 100644
index 000000000..b1edce4aa
--- /dev/null
+++ b/vendor/ezyang/htmlpurifier/test-settings.travis.php
@@ -0,0 +1,72 @@
+<?php
+
+// This file is the configuration for Travis testing.
+
+// Note: The only external library you *need* is SimpleTest; everything else
+// is optional.
+
+// We've got a lot of tests, so we recommend turning the limit off.
+set_time_limit(0);
+
+// Turning off output buffering will prevent mysterious errors from core dumps.
+$data = @ob_get_clean();
+if ($data !== false && $data !== '') {
+ echo "Output buffer contains data [".urlencode($data)."]\n";
+ exit;
+}
+
+// -----------------------------------------------------------------------------
+// REQUIRED SETTINGS
+
+// Note on running SimpleTest:
+// You want the Git copy of SimpleTest, found here:
+// https://github.com/simpletest/simpletest/
+//
+// If SimpleTest is borked with HTML Purifier, please contact me or
+// the SimpleTest devs; I am a developer for SimpleTest so I should be
+// able to quickly assess a fix. SimpleTest's problem is my problem!
+
+// Where is SimpleTest located? Remember to include a trailing slash!
+$simpletest_location = dirname(__FILE__) . '/simpletest/';
+
+// -----------------------------------------------------------------------------
+// OPTIONAL SETTINGS
+
+// Note on running PHPT:
+// Vanilla PHPT from https://github.com/tswicegood/PHPT_Core should
+// work fine on Linux w/o multitest.
+//
+// To do multitest or Windows testing, you'll need some more
+// patches at https://github.com/ezyang/PHPT_Core
+//
+// I haven't tested the Windows setup in a while so I don't know if
+// it still works.
+
+// Should PHPT tests be enabled?
+$GLOBALS['HTMLPurifierTest']['PHPT'] = false;
+
+// If PHPT isn't in your Path via PEAR, set that here:
+// set_include_path('/path/to/phpt/Core/src' . PATH_SEPARATOR . get_include_path());
+
+// Where is CSSTidy located? (Include trailing slash. Leave false to disable.)
+$csstidy_location = false;
+
+// For tests/multitest.php, which versions to test?
+$versions_to_test = array();
+
+// Stable PHP binary to use when invoking maintenance scripts.
+$php = 'php';
+
+// For tests/multitest.php, what is the multi-version executable? It must
+// accept an extra parameter (version number) before all other arguments
+$phpv = false;
+
+// Should PEAR tests be run? If you've got a valid PEAR installation, set this
+// to true (or, if it's not in the include path, to its install directory).
+$GLOBALS['HTMLPurifierTest']['PEAR'] = false;
+
+// If PEAR is enabled, what PEAR tests should be run? (Note: you will
+// need to ensure these libraries are installed)
+$GLOBALS['HTMLPurifierTest']['Net_IDNA2'] = true;
+
+// vim: et sw=4 sts=4
diff --git a/vendor/michelf/php-markdown/License.md b/vendor/michelf/php-markdown/License.md
new file mode 100644
index 000000000..c16197b69
--- /dev/null
+++ b/vendor/michelf/php-markdown/License.md
@@ -0,0 +1,36 @@
+PHP Markdown Lib
+Copyright (c) 2004-2016 Michel Fortin
+<https://michelf.ca/>
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2006 John Gruber
+<https://daringfireball.net/>
+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.
diff --git a/vendor/michelf/php-markdown/Michelf/Markdown.inc.php b/vendor/michelf/php-markdown/Michelf/Markdown.inc.php
new file mode 100644
index 000000000..e2bd3808e
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/Markdown.inc.php
@@ -0,0 +1,10 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the Markdown parser.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
+require_once dirname(__FILE__) . '/Markdown.php';
diff --git a/vendor/michelf/php-markdown/Michelf/Markdown.php b/vendor/michelf/php-markdown/Michelf/Markdown.php
new file mode 100644
index 000000000..c3eaf4464
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/Markdown.php
@@ -0,0 +1,1896 @@
+<?php
+/**
+ * Markdown - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Parser Class
+ */
+class Markdown implements MarkdownInterface {
+ /**
+ * Define the package version
+ * @var string
+ */
+ const MARKDOWNLIB_VERSION = "1.7.0";
+
+ /**
+ * Simple function interface - Initialize the parser and return the result
+ * of its transform method. This will work fine for derived classes too.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public static function defaultTransform($text) {
+ // Take parser class on which this function was called.
+ $parser_class = \get_called_class();
+
+ // Try to take parser from the static parser list
+ static $parser_list;
+ $parser =& $parser_list[$parser_class];
+
+ // Create the parser it not already set
+ if (!$parser) {
+ $parser = new $parser_class;
+ }
+
+ // Transform text using parser.
+ return $parser->transform($text);
+ }
+
+ /**
+ * Configuration variables
+ */
+
+ /**
+ * Change to ">" for HTML output.
+ * @var string
+ */
+ public $empty_element_suffix = " />";
+
+ /**
+ * The width of indentation of the output markup
+ * @var int
+ */
+ public $tab_width = 4;
+
+ /**
+ * Change to `true` to disallow markup or entities.
+ * @var boolean
+ */
+ public $no_markup = false;
+ public $no_entities = false;
+
+
+ /**
+ * Change to `true` to enable line breaks on \n without two trailling spaces
+ * @var boolean
+ */
+ public $hard_wrap = false;
+
+ /**
+ * Predefined URLs and titles for reference links and images.
+ * @var array
+ */
+ public $predef_urls = array();
+ public $predef_titles = array();
+
+ /**
+ * Optional filter function for URLs
+ * @var callable
+ */
+ public $url_filter_func = null;
+
+ /**
+ * Optional header id="" generation callback function.
+ * @var callable
+ */
+ public $header_id_func = null;
+
+ /**
+ * Optional function for converting code block content to HTML
+ * @var callable
+ */
+ public $code_block_content_func = null;
+
+ /**
+ * Optional function for converting code span content to HTML.
+ * @var callable
+ */
+ public $code_span_content_func = null;
+
+ /**
+ * Class attribute to toggle "enhanced ordered list" behaviour
+ * setting this to true will allow ordered lists to start from the index
+ * number that is defined first.
+ *
+ * For example:
+ * 2. List item two
+ * 3. List item three
+ *
+ * Becomes:
+ * <ol start="2">
+ * <li>List item two</li>
+ * <li>List item three</li>
+ * </ol>
+ *
+ * @var bool
+ */
+ public $enhanced_ordered_list = false;
+
+ /**
+ * Parser implementation
+ */
+
+ /**
+ * Regex to match balanced [brackets].
+ * Needed to insert a maximum bracked depth while converting to PHP.
+ * @var int
+ */
+ protected $nested_brackets_depth = 6;
+ protected $nested_brackets_re;
+
+ protected $nested_url_parenthesis_depth = 4;
+ protected $nested_url_parenthesis_re;
+
+ /**
+ * Table of hash values for escaped characters:
+ * @var string
+ */
+ protected $escape_chars = '\`*_{}[]()>#+-.!';
+ protected $escape_chars_re;
+
+ /**
+ * Constructor function. Initialize appropriate member variables.
+ * @return void
+ */
+ public function __construct() {
+ $this->_initDetab();
+ $this->prepareItalicsAndBold();
+
+ $this->nested_brackets_re =
+ str_repeat('(?>[^\[\]]+|\[', $this->nested_brackets_depth).
+ str_repeat('\])*', $this->nested_brackets_depth);
+
+ $this->nested_url_parenthesis_re =
+ str_repeat('(?>[^()\s]+|\(', $this->nested_url_parenthesis_depth).
+ str_repeat('(?>\)))*', $this->nested_url_parenthesis_depth);
+
+ $this->escape_chars_re = '['.preg_quote($this->escape_chars).']';
+
+ // Sort document, block, and span gamut in ascendent priority order.
+ asort($this->document_gamut);
+ asort($this->block_gamut);
+ asort($this->span_gamut);
+ }
+
+
+ /**
+ * Internal hashes used during transformation.
+ * @var array
+ */
+ protected $urls = array();
+ protected $titles = array();
+ protected $html_hashes = array();
+
+ /**
+ * Status flag to avoid invalid nesting.
+ * @var boolean
+ */
+ protected $in_anchor = false;
+
+ /**
+ * Called before the transformation process starts to setup parser states.
+ * @return void
+ */
+ protected function setup() {
+ // Clear global hashes.
+ $this->urls = $this->predef_urls;
+ $this->titles = $this->predef_titles;
+ $this->html_hashes = array();
+ $this->in_anchor = false;
+ }
+
+ /**
+ * Called after the transformation process to clear any variable which may
+ * be taking up memory unnecessarly.
+ * @return void
+ */
+ protected function teardown() {
+ $this->urls = array();
+ $this->titles = array();
+ $this->html_hashes = array();
+ }
+
+ /**
+ * Main function. Performs some preprocessing on the input text and pass
+ * it through the document gamut.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public function transform($text) {
+ $this->setup();
+
+ # Remove UTF-8 BOM and marker character in input, if present.
+ $text = preg_replace('{^\xEF\xBB\xBF|\x1A}', '', $text);
+
+ # Standardize line endings:
+ # DOS to Unix and Mac to Unix
+ $text = preg_replace('{\r\n?}', "\n", $text);
+
+ # Make sure $text ends with a couple of newlines:
+ $text .= "\n\n";
+
+ # Convert all tabs to spaces.
+ $text = $this->detab($text);
+
+ # Turn block-level HTML blocks into hash entries
+ $text = $this->hashHTMLBlocks($text);
+
+ # Strip any lines consisting only of spaces and tabs.
+ # This makes subsequent regexen easier to write, because we can
+ # match consecutive blank lines with /\n+/ instead of something
+ # contorted like /[ ]*\n+/ .
+ $text = preg_replace('/^[ ]+$/m', '', $text);
+
+ # Run document gamut methods.
+ foreach ($this->document_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ $this->teardown();
+
+ return $text . "\n";
+ }
+
+ /**
+ * Define the document gamut
+ * @var array
+ */
+ protected $document_gamut = array(
+ // Strip link definitions, store in hashes.
+ "stripLinkDefinitions" => 20,
+ "runBasicBlockGamut" => 30,
+ );
+
+ /**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references
+ * @param string $text
+ * @return string
+ */
+ protected function stripLinkDefinitions($text) {
+
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:\n+|\Z)
+ }xm',
+ array($this, '_stripLinkDefinitions_callback'),
+ $text
+ );
+ return $text;
+ }
+
+ /**
+ * The callback to strip link definitions
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Hashify HTML blocks
+ * @param string $text
+ * @return string
+ */
+ protected function hashHTMLBlocks($text) {
+ if ($this->no_markup) {
+ return $text;
+ }
+
+ $less_than_tab = $this->tab_width - 1;
+
+ /**
+ * Hashify HTML blocks:
+ *
+ * We only want to do this for block-level HTML tags, such as headers,
+ * lists, and tables. That's because we still want to wrap <p>s around
+ * "paragraphs" that are wrapped in non-block-level tags, such as
+ * anchors, phrase emphasis, and spans. The list of tags we're looking
+ * for is hard-coded:
+ *
+ * * List "a" is made of tags which can be both inline or block-level.
+ * These will be treated block-level when the start tag is alone on
+ * its line, otherwise they're not matched here and will be taken as
+ * inline later.
+ * * List "b" is made of tags which are always block-level;
+ */
+ $block_tags_a_re = 'ins|del';
+ $block_tags_b_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|'.
+ 'script|noscript|style|form|fieldset|iframe|math|svg|'.
+ 'article|section|nav|aside|hgroup|header|footer|'.
+ 'figure';
+
+ // Regular expression for the content of a block tag.
+ $nested_tags_level = 4;
+ $attr = '
+ (?> # optional tag attributes
+ \s # starts with whitespace
+ (?>
+ [^>"/]+ # text outside quotes
+ |
+ /+(?!>) # slash not followed by ">"
+ |
+ "[^"]*" # text inside double quotes (tolerate ">")
+ |
+ \'[^\']*\' # text inside single quotes (tolerate ">")
+ )*
+ )?
+ ';
+ $content =
+ str_repeat('
+ (?>
+ [^<]+ # content without tag
+ |
+ <\2 # nested opening tag
+ '.$attr.' # attributes
+ (?>
+ />
+ |
+ >', $nested_tags_level). // end of opening tag
+ '.*?'. // last level nested tag content
+ str_repeat('
+ </\2\s*> # closing nested tag
+ )
+ |
+ <(?!/\2\s*> # other tags with a different name
+ )
+ )*',
+ $nested_tags_level);
+ $content2 = str_replace('\2', '\3', $content);
+
+ /**
+ * First, look for nested blocks, e.g.:
+ * <div>
+ * <div>
+ * tags for inner block must be indented.
+ * </div>
+ * </div>
+ *
+ * The outermost tags must start at the left margin for this to match,
+ * and the inner nested divs must be indented.
+ * We need to do this before the next, more liberal match, because the
+ * next match will start at the first `<div>` and stop at the
+ * first `</div>`.
+ */
+ $text = preg_replace_callback('{(?>
+ (?>
+ (?<=\n) # Starting on its own line
+ | # or
+ \A\n? # the at beginning of the doc
+ )
+ ( # save in $1
+
+ # Match from `\n<tag>` to `</tag>\n`, handling nested tags
+ # in between.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_b_re.')# start tag = $2
+ '.$attr.'> # attributes followed by > and \n
+ '.$content.' # content, support nesting
+ </\2> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special version for tags of group a.
+
+ [ ]{0,'.$less_than_tab.'}
+ <('.$block_tags_a_re.')# start tag = $3
+ '.$attr.'>[ ]*\n # attributes followed by >
+ '.$content2.' # content, support nesting
+ </\3> # the matching end tag
+ [ ]* # trailing spaces/tabs
+ (?=\n+|\Z) # followed by a newline or end of document
+
+ | # Special case just for <hr />. It was easier to make a special
+ # case than to make the other regex more complicated.
+
+ [ ]{0,'.$less_than_tab.'}
+ <(hr) # start tag = $2
+ '.$attr.' # attributes
+ /?> # the matching end tag
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # Special case for standalone HTML comments:
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <!-- .*? -->
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ | # PHP and ASP-style processor instructions (<? and <%)
+
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <([?%]) # $2
+ .*?
+ \2>
+ )
+ [ ]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+
+ )
+ )}Sxmi',
+ array($this, '_hashHTMLBlocks_callback'),
+ $text
+ );
+
+ return $text;
+ }
+
+ /**
+ * The callback for hashing HTML blocks
+ * @param string $matches
+ * @return string
+ */
+ protected function _hashHTMLBlocks_callback($matches) {
+ $text = $matches[1];
+ $key = $this->hashBlock($text);
+ return "\n\n$key\n\n";
+ }
+
+ /**
+ * Called whenever a tag must be hashed when a function insert an atomic
+ * element in the text stream. Passing $text to through this function gives
+ * a unique text-token which will be reverted back when calling unhash.
+ *
+ * The $boundary argument specify what character should be used to surround
+ * the token. By convension, "B" is used for block elements that needs not
+ * to be wrapped into paragraph tags at the end, ":" is used for elements
+ * that are word separators and "X" is used in the general case.
+ *
+ * @param string $text
+ * @param string $boundary
+ * @return string
+ */
+ protected function hashPart($text, $boundary = 'X') {
+ // Swap back any tag hash found in $text so we do not have to `unhash`
+ // multiple times at the end.
+ $text = $this->unhash($text);
+
+ // Then hash the block.
+ static $i = 0;
+ $key = "$boundary\x1A" . ++$i . $boundary;
+ $this->html_hashes[$key] = $text;
+ return $key; // String that will replace the tag.
+ }
+
+ /**
+ * Shortcut function for hashPart with block-level boundaries.
+ * @param string $text
+ * @return string
+ */
+ protected function hashBlock($text) {
+ return $this->hashPart($text, 'B');
+ }
+
+ /**
+ * Define the block gamut - these are all the transformations that form
+ * block-level tags like paragraphs, headers, and list items.
+ * @var array
+ */
+ protected $block_gamut = array(
+ "doHeaders" => 10,
+ "doHorizontalRules" => 20,
+ "doLists" => 40,
+ "doCodeBlocks" => 50,
+ "doBlockQuotes" => 60,
+ );
+
+ /**
+ * Run block gamut tranformations.
+ *
+ * We need to escape raw HTML in Markdown source before doing anything
+ * else. This need to be done for each block, and not only at the
+ * begining in the Markdown function since hashed blocks can be part of
+ * list items and could have been indented. Indented blocks would have
+ * been seen as a code block in a previous pass of hashHTMLBlocks.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function runBlockGamut($text) {
+ $text = $this->hashHTMLBlocks($text);
+ return $this->runBasicBlockGamut($text);
+ }
+
+ /**
+ * Run block gamut tranformations, without hashing HTML blocks. This is
+ * useful when HTML blocks are known to be already hashed, like in the first
+ * whole-document pass.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function runBasicBlockGamut($text) {
+
+ foreach ($this->block_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ // Finally form paragraph and restore hashed blocks.
+ $text = $this->formParagraphs($text);
+
+ return $text;
+ }
+
+ /**
+ * Convert horizontal rules
+ * @param string $text
+ * @return string
+ */
+ protected function doHorizontalRules($text) {
+ return preg_replace(
+ '{
+ ^[ ]{0,3} # Leading space
+ ([-*_]) # $1: First marker
+ (?> # Repeated marker group
+ [ ]{0,2} # Zero, one, or two spaces.
+ \1 # Marker character
+ ){2,} # Group repeated at least twice
+ [ ]* # Tailing spaces
+ $ # End of line.
+ }mx',
+ "\n".$this->hashBlock("<hr$this->empty_element_suffix")."\n",
+ $text
+ );
+ }
+
+ /**
+ * These are all the transformations that occur *within* block-level
+ * tags like paragraphs, headers, and list items.
+ * @var array
+ */
+ protected $span_gamut = array(
+ // Process character escapes, code spans, and inline HTML
+ // in one shot.
+ "parseSpan" => -30,
+ // Process anchor and image tags. Images must come first,
+ // because ![foo][f] looks like an anchor.
+ "doImages" => 10,
+ "doAnchors" => 20,
+ // Make links out of things like `<https://example.com/>`
+ // Must come after doAnchors, because you can use < and >
+ // delimiters in inline links like [this](<url>).
+ "doAutoLinks" => 30,
+ "encodeAmpsAndAngles" => 40,
+ "doItalicsAndBold" => 50,
+ "doHardBreaks" => 60,
+ );
+
+ /**
+ * Run span gamut transformations
+ * @param string $text
+ * @return string
+ */
+ protected function runSpanGamut($text) {
+ foreach ($this->span_gamut as $method => $priority) {
+ $text = $this->$method($text);
+ }
+
+ return $text;
+ }
+
+ /**
+ * Do hard breaks
+ * @param string $text
+ * @return string
+ */
+ protected function doHardBreaks($text) {
+ if ($this->hard_wrap) {
+ return preg_replace_callback('/ *\n/',
+ array($this, '_doHardBreaks_callback'), $text);
+ } else {
+ return preg_replace_callback('/ {2,}\n/',
+ array($this, '_doHardBreaks_callback'), $text);
+ }
+ }
+
+ /**
+ * Trigger part hashing for the hard break (callback method)
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHardBreaks_callback($matches) {
+ return $this->hashPart("<br$this->empty_element_suffix\n");
+ }
+
+ /**
+ * Turn Markdown link shortcuts into XHTML <a> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doAnchors($text) {
+ if ($this->in_anchor) {
+ return $text;
+ }
+ $this->in_anchor = true;
+
+ // First, handle reference-style links: [link text] [id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ // Next, inline-style links: [link text](url "optional title")
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ('.$this->nested_brackets_re.') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array($this, '_doAnchors_inline_callback'), $text);
+
+ // Last, handle reference-style shortcuts: [link text]
+ // These must come last in case you've also got [link text][1]
+ // or [link text](/foo)
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+
+ /**
+ * Callback method to parse referenced anchors
+ * @param string $matches
+ * @return string
+ */
+ protected function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ // for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ // lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if ( isset( $this->titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+ $result = $this->hashPart($result);
+ } else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+
+ /**
+ * Callback method to parse inline anchors
+ * @param string $matches
+ * @return string
+ */
+ protected function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ // If the URL was of the form <s p a c e s> it got caught by the HTML
+ // tag parser and hashed. Need to reverse the process before using
+ // the URL.
+ $unhashed = $this->unhash($url);
+ if ($unhashed != $url)
+ $url = preg_replace('/^<(.*)>$/', '\1', $unhashed);
+
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Turn Markdown image shortcuts into <img> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doImages($text) {
+ // First, handle reference-style labeled images: ![alt text][id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array($this, '_doImages_reference_callback'), $text);
+
+ // Next, handle inline images: ![alt text](url "optional title")
+ // Don't forget: encode * and _
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$this->nested_brackets_re.') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ ('.$this->nested_url_parenthesis_re.') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ )
+ }xs',
+ array($this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback to parse references image tags
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); // for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeURLAttribute($this->urls[$link_id]);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($this->titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ } else {
+ // If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Callback to parse inline image tags
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeURLAttribute($url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\""; // $title already quoted
+ }
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Parse Markdown heading elements to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doHeaders($text) {
+ /**
+ * Setext-style headers:
+ * Header 1
+ * ========
+ *
+ * Header 2
+ * --------
+ */
+ $text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx',
+ array($this, '_doHeaders_callback_setext'), $text);
+
+ /**
+ * atx-style headers:
+ * # Header 1
+ * ## Header 2
+ * ## Header 2 with closing hashes ##
+ * ...
+ * ###### Header 6
+ */
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ \n+
+ }xm',
+ array($this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Setext header parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_setext($matches) {
+ // Terrible hack to check we haven't found an empty list item.
+ if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1])) {
+ return $matches[0];
+ }
+
+ $level = $matches[2]{0} == '=' ? 1 : 2;
+
+ // ID attribute generation
+ $idAtt = $this->_generateIdFromHeaderValue($matches[1]);
+
+ $block = "<h$level$idAtt>".$this->runSpanGamut($matches[1])."</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * ATX header parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_atx($matches) {
+ // ID attribute generation
+ $idAtt = $this->_generateIdFromHeaderValue($matches[2]);
+
+ $level = strlen($matches[1]);
+ $block = "<h$level$idAtt>".$this->runSpanGamut($matches[2])."</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * If a header_id_func property is set, we can use it to automatically
+ * generate an id attribute.
+ *
+ * This method returns a string in the form id="foo", or an empty string
+ * otherwise.
+ * @param string $headerValue
+ * @return string
+ */
+ protected function _generateIdFromHeaderValue($headerValue) {
+ if (!is_callable($this->header_id_func)) {
+ return "";
+ }
+
+ $idValue = call_user_func($this->header_id_func, $headerValue);
+ if (!$idValue) {
+ return "";
+ }
+
+ return ' id="' . $this->encodeAttribute($idValue) . '"';
+ }
+
+ /**
+ * Form HTML ordered (numbered) and unordered (bulleted) lists.
+ * @param string $text
+ * @return string
+ */
+ protected function doLists($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+
+ $markers_relist = array(
+ $marker_ul_re => $marker_ol_re,
+ $marker_ol_re => $marker_ul_re,
+ );
+
+ foreach ($markers_relist as $marker_re => $other_marker_re) {
+ // Re-usable pattern to match any entirel ul or ol list:
+ $whole_list_re = '
+ ( # $1 = whole list
+ ( # $2
+ ([ ]{0,'.$less_than_tab.'}) # $3 = number of spaces
+ ('.$marker_re.') # $4 = first list item marker
+ [ ]+
+ )
+ (?s:.+?)
+ ( # $5
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another list item marker
+ [ ]*
+ '.$marker_re.'[ ]+
+ )
+ |
+ (?= # Lookahead for another kind of list
+ \n
+ \3 # Must have the same indentation
+ '.$other_marker_re.'[ ]+
+ )
+ )
+ )
+ '; // mx
+
+ // We use a different prefix before nested lists than top-level lists.
+ //See extended comment in _ProcessListItems().
+
+ if ($this->list_level) {
+ $text = preg_replace_callback('{
+ ^
+ '.$whole_list_re.'
+ }mx',
+ array($this, '_doLists_callback'), $text);
+ } else {
+ $text = preg_replace_callback('{
+ (?:(?<=\n)\n|\A\n?) # Must eat the newline
+ '.$whole_list_re.'
+ }mx',
+ array($this, '_doLists_callback'), $text);
+ }
+ }
+
+ return $text;
+ }
+
+ /**
+ * List parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doLists_callback($matches) {
+ // Re-usable patterns to match list item bullets and number markers:
+ $marker_ul_re = '[*+-]';
+ $marker_ol_re = '\d+[\.]';
+ $marker_any_re = "(?:$marker_ul_re|$marker_ol_re)";
+ $marker_ol_start_re = '[0-9]+';
+
+ $list = $matches[1];
+ $list_type = preg_match("/$marker_ul_re/", $matches[4]) ? "ul" : "ol";
+
+ $marker_any_re = ( $list_type == "ul" ? $marker_ul_re : $marker_ol_re );
+
+ $list .= "\n";
+ $result = $this->processListItems($list, $marker_any_re);
+
+ $ol_start = 1;
+ if ($this->enhanced_ordered_list) {
+ // Get the start number for ordered list.
+ if ($list_type == 'ol') {
+ $ol_start_array = array();
+ $ol_start_check = preg_match("/$marker_ol_start_re/", $matches[4], $ol_start_array);
+ if ($ol_start_check){
+ $ol_start = $ol_start_array[0];
+ }
+ }
+ }
+
+ if ($ol_start > 1 && $list_type == 'ol'){
+ $result = $this->hashBlock("<$list_type start=\"$ol_start\">\n" . $result . "</$list_type>");
+ } else {
+ $result = $this->hashBlock("<$list_type>\n" . $result . "</$list_type>");
+ }
+ return "\n". $result ."\n\n";
+ }
+
+ /**
+ * Nesting tracker for list levels
+ * @var integer
+ */
+ protected $list_level = 0;
+
+ /**
+ * Process the contents of a single ordered or unordered list, splitting it
+ * into individual list items.
+ * @param string $list_str
+ * @param string $marker_any_re
+ * @return string
+ */
+ protected function processListItems($list_str, $marker_any_re) {
+ /**
+ * The $this->list_level global keeps track of when we're inside a list.
+ * Each time we enter a list, we increment it; when we leave a list,
+ * we decrement. If it's zero, we're not in a list anymore.
+ *
+ * We do this because when we're not inside a list, we want to treat
+ * something like this:
+ *
+ * I recommend upgrading to version
+ * 8. Oops, now this line is treated
+ * as a sub-list.
+ *
+ * As a single paragraph, despite the fact that the second line starts
+ * with a digit-period-space sequence.
+ *
+ * Whereas when we're inside a list (or sub-list), that line will be
+ * treated as the start of a sub-list. What a kludge, huh? This is
+ * an aspect of Markdown's syntax that's hard to parse perfectly
+ * without resorting to mind-reading. Perhaps the solution is to
+ * change the syntax rules such that sub-lists must start with a
+ * starting cardinal number; e.g. "1." or "a.".
+ */
+ $this->list_level++;
+
+ // Trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ $list_str = preg_replace_callback('{
+ (\n)? # leading line = $1
+ (^[ ]*) # leading whitespace = $2
+ ('.$marker_any_re.' # list marker and space = $3
+ (?:[ ]+|(?=\n)) # space only required if item is not empty
+ )
+ ((?s:.*?)) # list item text = $4
+ (?:(\n+(?=\n))|\n) # tailing blank line = $5
+ (?= \n* (\z | \2 ('.$marker_any_re.') (?:[ ]+|(?=\n))))
+ }xm',
+ array($this, '_processListItems_callback'), $list_str);
+
+ $this->list_level--;
+ return $list_str;
+ }
+
+ /**
+ * List item parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _processListItems_callback($matches) {
+ $item = $matches[4];
+ $leading_line =& $matches[1];
+ $leading_space =& $matches[2];
+ $marker_space = $matches[3];
+ $tailing_blank_line =& $matches[5];
+
+ if ($leading_line || $tailing_blank_line ||
+ preg_match('/\n{2,}/', $item))
+ {
+ // Replace marker with the appropriate whitespace indentation
+ $item = $leading_space . str_repeat(' ', strlen($marker_space)) . $item;
+ $item = $this->runBlockGamut($this->outdent($item)."\n");
+ } else {
+ // Recursion for sub-lists:
+ $item = $this->doLists($this->outdent($item));
+ $item = $this->formParagraphs($item, false);
+ }
+
+ return "<li>" . $item . "</li>\n";
+ }
+
+ /**
+ * Process Markdown `<pre><code>` blocks.
+ * @param string $text
+ * @return string
+ */
+ protected function doCodeBlocks($text) {
+ $text = preg_replace_callback('{
+ (?:\n\n|\A\n?)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?>
+ [ ]{'.$this->tab_width.'} # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,'.$this->tab_width.'}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm',
+ array($this, '_doCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Code block parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doCodeBlocks_callback($matches) {
+ $codeblock = $matches[1];
+
+ $codeblock = $this->outdent($codeblock);
+ if ($this->code_block_content_func) {
+ $codeblock = call_user_func($this->code_block_content_func, $codeblock, "");
+ } else {
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+ }
+
+ # trim leading newlines and trailing newlines
+ $codeblock = preg_replace('/\A\n+|\n+\z/', '', $codeblock);
+
+ $codeblock = "<pre><code>$codeblock\n</code></pre>";
+ return "\n\n" . $this->hashBlock($codeblock) . "\n\n";
+ }
+
+ /**
+ * Create a code span markup for $code. Called from handleSpanToken.
+ * @param string $code
+ * @return string
+ */
+ protected function makeCodeSpan($code) {
+ if ($this->code_span_content_func) {
+ $code = call_user_func($this->code_span_content_func, $code);
+ } else {
+ $code = htmlspecialchars(trim($code), ENT_NOQUOTES);
+ }
+ return $this->hashPart("<code>$code</code>");
+ }
+
+ /**
+ * Define the emphasis operators with their regex matches
+ * @var array
+ */
+ protected $em_relist = array(
+ '' => '(?:(?<!\*)\*(?!\*)|(?<!_)_(?!_))(?![\.,:;]?\s)',
+ '*' => '(?<![\s*])\*(?!\*)',
+ '_' => '(?<![\s_])_(?!_)',
+ );
+
+ /**
+ * Define the strong operators with their regex matches
+ * @var array
+ */
+ protected $strong_relist = array(
+ '' => '(?:(?<!\*)\*\*(?!\*)|(?<!_)__(?!_))(?![\.,:;]?\s)',
+ '**' => '(?<![\s*])\*\*(?!\*)',
+ '__' => '(?<![\s_])__(?!_)',
+ );
+
+ /**
+ * Define the emphasis + strong operators with their regex matches
+ * @var array
+ */
+ protected $em_strong_relist = array(
+ '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<!_)___(?!_))(?![\.,:;]?\s)',
+ '***' => '(?<![\s*])\*\*\*(?!\*)',
+ '___' => '(?<![\s_])___(?!_)',
+ );
+
+ /**
+ * Container for prepared regular expressions
+ * @var array
+ */
+ protected $em_strong_prepared_relist;
+
+ /**
+ * Prepare regular expressions for searching emphasis tokens in any
+ * context.
+ * @return void
+ */
+ protected function prepareItalicsAndBold() {
+ foreach ($this->em_relist as $em => $em_re) {
+ foreach ($this->strong_relist as $strong => $strong_re) {
+ // Construct list of allowed token expressions.
+ $token_relist = array();
+ if (isset($this->em_strong_relist["$em$strong"])) {
+ $token_relist[] = $this->em_strong_relist["$em$strong"];
+ }
+ $token_relist[] = $em_re;
+ $token_relist[] = $strong_re;
+
+ // Construct master expression from list.
+ $token_re = '{(' . implode('|', $token_relist) . ')}';
+ $this->em_strong_prepared_relist["$em$strong"] = $token_re;
+ }
+ }
+ }
+
+ /**
+ * Convert Markdown italics (emphasis) and bold (strong) to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doItalicsAndBold($text) {
+ $token_stack = array('');
+ $text_stack = array('');
+ $em = '';
+ $strong = '';
+ $tree_char_em = false;
+
+ while (1) {
+ // Get prepared regular expression for seraching emphasis tokens
+ // in current context.
+ $token_re = $this->em_strong_prepared_relist["$em$strong"];
+
+ // Each loop iteration search for the next emphasis token.
+ // Each token is then passed to handleSpanToken.
+ $parts = preg_split($token_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+ $text_stack[0] .= $parts[0];
+ $token =& $parts[1];
+ $text =& $parts[2];
+
+ if (empty($token)) {
+ // Reached end of text span: empty stack without emitting.
+ // any more emphasis.
+ while ($token_stack[0]) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ break;
+ }
+
+ $token_len = strlen($token);
+ if ($tree_char_em) {
+ // Reached closing marker while inside a three-char emphasis.
+ if ($token_len == 3) {
+ // Three-char closing marker, close em and strong.
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<strong><em>$span</em></strong>";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ $strong = '';
+ } else {
+ // Other closing marker: close one em or strong and
+ // change current token state to match the other
+ $token_stack[0] = str_repeat($token{0}, 3-$token_len);
+ $tag = $token_len == 2 ? "strong" : "em";
+ $span = $text_stack[0];
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span</$tag>";
+ $text_stack[0] = $this->hashPart($span);
+ $$tag = ''; // $$tag stands for $em or $strong
+ }
+ $tree_char_em = false;
+ } else if ($token_len == 3) {
+ if ($em) {
+ // Reached closing marker for both em and strong.
+ // Closing strong marker:
+ for ($i = 0; $i < 2; ++$i) {
+ $shifted_token = array_shift($token_stack);
+ $tag = strlen($shifted_token) == 2 ? "strong" : "em";
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<$tag>$span</$tag>";
+ $text_stack[0] .= $this->hashPart($span);
+ $$tag = ''; // $$tag stands for $em or $strong
+ }
+ } else {
+ // Reached opening three-char emphasis marker. Push on token
+ // stack; will be handled by the special condition above.
+ $em = $token{0};
+ $strong = "$em$em";
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $tree_char_em = true;
+ }
+ } else if ($token_len == 2) {
+ if ($strong) {
+ // Unwind any dangling emphasis marker:
+ if (strlen($token_stack[0]) == 1) {
+ $text_stack[1] .= array_shift($token_stack);
+ $text_stack[0] .= array_shift($text_stack);
+ }
+ // Closing strong marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<strong>$span</strong>";
+ $text_stack[0] .= $this->hashPart($span);
+ $strong = '';
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $strong = $token;
+ }
+ } else {
+ // Here $token_len == 1
+ if ($em) {
+ if (strlen($token_stack[0]) == 1) {
+ // Closing emphasis marker:
+ array_shift($token_stack);
+ $span = array_shift($text_stack);
+ $span = $this->runSpanGamut($span);
+ $span = "<em>$span</em>";
+ $text_stack[0] .= $this->hashPart($span);
+ $em = '';
+ } else {
+ $text_stack[0] .= $token;
+ }
+ } else {
+ array_unshift($token_stack, $token);
+ array_unshift($text_stack, '');
+ $em = $token;
+ }
+ }
+ }
+ return $text_stack[0];
+ }
+
+ /**
+ * Parse Markdown blockquotes to HTML
+ * @param string $text
+ * @return string
+ */
+ protected function doBlockQuotes($text) {
+ $text = preg_replace_callback('/
+ ( # Wrap whole match in $1
+ (?>
+ ^[ ]*>[ ]? # ">" at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ /xm',
+ array($this, '_doBlockQuotes_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Blockquote parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doBlockQuotes_callback($matches) {
+ $bq = $matches[1];
+ // trim one level of quoting - trim whitespace-only lines
+ $bq = preg_replace('/^[ ]*>[ ]?|^[ ]+$/m', '', $bq);
+ $bq = $this->runBlockGamut($bq); // recurse
+
+ $bq = preg_replace('/^/m', " ", $bq);
+ // These leading spaces cause problem with <pre> content,
+ // so we need to fix that:
+ $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
+ array($this, '_doBlockQuotes_callback2'), $bq);
+
+ return "\n" . $this->hashBlock("<blockquote>\n$bq\n</blockquote>") . "\n\n";
+ }
+
+ /**
+ * Blockquote parsing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doBlockQuotes_callback2($matches) {
+ $pre = $matches[1];
+ $pre = preg_replace('/^ /m', '', $pre);
+ return $pre;
+ }
+
+ /**
+ * Parse paragraphs
+ *
+ * @param string $text String to process in paragraphs
+ * @param boolean $wrap_in_p Whether paragraphs should be wrapped in <p> tags
+ * @return string
+ */
+ protected function formParagraphs($text, $wrap_in_p = true) {
+ // Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ // Wrap <p> tags and unhashify HTML blocks
+ foreach ($grafs as $key => $value) {
+ if (!preg_match('/^B\x1A[0-9]+B$/', $value)) {
+ // Is a paragraph.
+ $value = $this->runSpanGamut($value);
+ if ($wrap_in_p) {
+ $value = preg_replace('/^([ ]*)/', "<p>", $value);
+ $value .= "</p>";
+ }
+ $grafs[$key] = $this->unhash($value);
+ } else {
+ // Is a block.
+ // Modify elements of @grafs in-place...
+ $graf = $value;
+ $block = $this->html_hashes[$graf];
+ $graf = $block;
+// if (preg_match('{
+// \A
+// ( # $1 = <div> tag
+// <div \s+
+// [^>]*
+// \b
+// markdown\s*=\s* ([\'"]) # $2 = attr quote char
+// 1
+// \2
+// [^>]*
+// >
+// )
+// ( # $3 = contents
+// .*
+// )
+// (</div>) # $4 = closing tag
+// \z
+// }xs', $block, $matches))
+// {
+// list(, $div_open, , $div_content, $div_close) = $matches;
+//
+// // We can't call Markdown(), because that resets the hash;
+// // that initialization code should be pulled into its own sub, though.
+// $div_content = $this->hashHTMLBlocks($div_content);
+//
+// // Run document gamut methods on the content.
+// foreach ($this->document_gamut as $method => $priority) {
+// $div_content = $this->$method($div_content);
+// }
+//
+// $div_open = preg_replace(
+// '{\smarkdown\s*=\s*([\'"]).+?\1}', '', $div_open);
+//
+// $graf = $div_open . "\n" . $div_content . "\n" . $div_close;
+// }
+ $grafs[$key] = $graf;
+ }
+ }
+
+ return implode("\n\n", $grafs);
+ }
+
+ /**
+ * Encode text for a double-quoted HTML attribute. This function
+ * is *not* suitable for attributes enclosed in single quotes.
+ * @param string $text
+ * @return string
+ */
+ protected function encodeAttribute($text) {
+ $text = $this->encodeAmpsAndAngles($text);
+ $text = str_replace('"', '&quot;', $text);
+ return $text;
+ }
+
+ /**
+ * Encode text for a double-quoted HTML attribute containing a URL,
+ * applying the URL filter if set. Also generates the textual
+ * representation for the URL (removing mailto: or tel:) storing it in $text.
+ * This function is *not* suitable for attributes enclosed in single quotes.
+ *
+ * @param string $url
+ * @param string &$text Passed by reference
+ * @return string URL
+ */
+ protected function encodeURLAttribute($url, &$text = null) {
+ if ($this->url_filter_func) {
+ $url = call_user_func($this->url_filter_func, $url);
+ }
+
+ if (preg_match('{^mailto:}i', $url)) {
+ $url = $this->encodeEntityObfuscatedAttribute($url, $text, 7);
+ } else if (preg_match('{^tel:}i', $url)) {
+ $url = $this->encodeAttribute($url);
+ $text = substr($url, 4);
+ } else {
+ $url = $this->encodeAttribute($url);
+ $text = $url;
+ }
+
+ return $url;
+ }
+
+ /**
+ * Smart processing for ampersands and angle brackets that need to
+ * be encoded. Valid character entities are left alone unless the
+ * no-entities mode is set.
+ * @param string $text
+ * @return string
+ */
+ protected function encodeAmpsAndAngles($text) {
+ if ($this->no_entities) {
+ $text = str_replace('&', '&amp;', $text);
+ } else {
+ // Ampersand-encoding based entirely on Nat Irons's Amputator
+ // MT plugin: <http://bumppo.net/projects/amputator/>
+ $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
+ '&amp;', $text);
+ }
+ // Encode remaining <'s
+ $text = str_replace('<', '&lt;', $text);
+
+ return $text;
+ }
+
+ /**
+ * Parse Markdown automatic links to anchor HTML tags
+ * @param string $text
+ * @return string
+ */
+ protected function doAutoLinks($text) {
+ $text = preg_replace_callback('{<((https?|ftp|dict|tel):[^\'">\s]+)>}i',
+ array($this, '_doAutoLinks_url_callback'), $text);
+
+ // Email addresses: <address@domain.foo>
+ $text = preg_replace_callback('{
+ <
+ (?:mailto:)?
+ (
+ (?:
+ [-!#$%&\'*+/=?^_`.{|}~\w\x80-\xFF]+
+ |
+ ".*?"
+ )
+ \@
+ (?:
+ [-a-z0-9\x80-\xFF]+(\.[-a-z0-9\x80-\xFF]+)*\.[a-z]+
+ |
+ \[[\d.a-fA-F:]+\] # IPv4 & IPv6
+ )
+ )
+ >
+ }xi',
+ array($this, '_doAutoLinks_email_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Parse URL callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAutoLinks_url_callback($matches) {
+ $url = $this->encodeURLAttribute($matches[1], $text);
+ $link = "<a href=\"$url\">$text</a>";
+ return $this->hashPart($link);
+ }
+
+ /**
+ * Parse email address callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAutoLinks_email_callback($matches) {
+ $addr = $matches[1];
+ $url = $this->encodeURLAttribute("mailto:$addr", $text);
+ $link = "<a href=\"$url\">$text</a>";
+ return $this->hashPart($link);
+ }
+
+ /**
+ * Input: some text to obfuscate, e.g. "mailto:foo@example.com"
+ *
+ * Output: the same text but with most characters encoded as either a
+ * decimal or hex entity, in the hopes of foiling most address
+ * harvesting spam bots. E.g.:
+ *
+ * &#109;&#x61;&#105;&#x6c;&#116;&#x6f;&#58;&#x66;o&#111;
+ * &#x40;&#101;&#x78;&#97;&#x6d;&#112;&#x6c;&#101;&#46;&#x63;&#111;
+ * &#x6d;
+ *
+ * Note: the additional output $tail is assigned the same value as the
+ * ouput, minus the number of characters specified by $head_length.
+ *
+ * Based by a filter by Matthew Wickline, posted to BBEdit-Talk.
+ * With some optimizations by Milian Wolff. Forced encoding of HTML
+ * attribute special characters by Allan Odgaard.
+ *
+ * @param string $text
+ * @param string &$tail
+ * @param integer $head_length
+ * @return string
+ */
+ protected function encodeEntityObfuscatedAttribute($text, &$tail = null, $head_length = 0) {
+ if ($text == "") {
+ return $tail = "";
+ }
+
+ $chars = preg_split('/(?<!^)(?!$)/', $text);
+ $seed = (int)abs(crc32($text) / strlen($text)); // Deterministic seed.
+
+ foreach ($chars as $key => $char) {
+ $ord = ord($char);
+ // Ignore non-ascii chars.
+ if ($ord < 128) {
+ $r = ($seed * (1 + $key)) % 100; // Pseudo-random function.
+ // roughly 10% raw, 45% hex, 45% dec
+ // '@' *must* be encoded. I insist.
+ // '"' and '>' have to be encoded inside the attribute
+ if ($r > 90 && strpos('@"&>', $char) === false) {
+ /* do nothing */
+ } else if ($r < 45) {
+ $chars[$key] = '&#x'.dechex($ord).';';
+ } else {
+ $chars[$key] = '&#'.$ord.';';
+ }
+ }
+ }
+
+ $text = implode('', $chars);
+ $tail = $head_length ? implode('', array_slice($chars, $head_length)) : $text;
+
+ return $text;
+ }
+
+ /**
+ * Take the string $str and parse it into tokens, hashing embeded HTML,
+ * escaped characters and handling code spans.
+ * @param string $str
+ * @return string
+ */
+ protected function parseSpan($str) {
+ $output = '';
+
+ $span_re = '{
+ (
+ \\\\'.$this->escape_chars_re.'
+ |
+ (?<![`\\\\])
+ `+ # code span marker
+ '.( $this->no_markup ? '' : '
+ |
+ <!-- .*? --> # comment
+ |
+ <\?.*?\?> | <%.*?%> # processing instruction
+ |
+ <[!$]?[-a-zA-Z0-9:_]+ # regular tags
+ (?>
+ \s
+ (?>[^"\'>]+|"[^"]*"|\'[^\']*\')*
+ )?
+ >
+ |
+ <[-a-zA-Z0-9:_]+\s*/> # xml-style empty tag
+ |
+ </[-a-zA-Z0-9:_]+\s*> # closing tag
+ ').'
+ )
+ }xs';
+
+ while (1) {
+ // Each loop iteration seach for either the next tag, the next
+ // openning code span marker, or the next escaped character.
+ // Each token is then passed to handleSpanToken.
+ $parts = preg_split($span_re, $str, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ // Create token from text preceding tag.
+ if ($parts[0] != "") {
+ $output .= $parts[0];
+ }
+
+ // Check if we reach the end.
+ if (isset($parts[1])) {
+ $output .= $this->handleSpanToken($parts[1], $parts[2]);
+ $str = $parts[2];
+ } else {
+ break;
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Handle $token provided by parseSpan by determining its nature and
+ * returning the corresponding value that should replace it.
+ * @param string $token
+ * @param string &$str
+ * @return string
+ */
+ protected function handleSpanToken($token, &$str) {
+ switch ($token{0}) {
+ case "\\":
+ return $this->hashPart("&#". ord($token{1}). ";");
+ case "`":
+ // Search for end marker in remaining text.
+ if (preg_match('/^(.*?[^`])'.preg_quote($token).'(?!`)(.*)$/sm',
+ $str, $matches))
+ {
+ $str = $matches[2];
+ $codespan = $this->makeCodeSpan($matches[1]);
+ return $this->hashPart($codespan);
+ }
+ return $token; // Return as text since no ending marker found.
+ default:
+ return $this->hashPart($token);
+ }
+ }
+
+ /**
+ * Remove one level of line-leading tabs or spaces
+ * @param string $text
+ * @return string
+ */
+ protected function outdent($text) {
+ return preg_replace('/^(\t|[ ]{1,' . $this->tab_width . '})/m', '', $text);
+ }
+
+
+ /**
+ * String length function for detab. `_initDetab` will create a function to
+ * handle UTF-8 if the default function does not exist.
+ * @var string
+ */
+ protected $utf8_strlen = 'mb_strlen';
+
+ /**
+ * Replace tabs with the appropriate amount of spaces.
+ *
+ * For each line we separate the line in blocks delemited by tab characters.
+ * Then we reconstruct every line by adding the appropriate number of space
+ * between each blocks.
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function detab($text) {
+ $text = preg_replace_callback('/^.*\t.*$/m',
+ array($this, '_detab_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Replace tabs callback
+ * @param string $matches
+ * @return string
+ */
+ protected function _detab_callback($matches) {
+ $line = $matches[0];
+ $strlen = $this->utf8_strlen; // strlen function for UTF-8.
+
+ // Split in blocks.
+ $blocks = explode("\t", $line);
+ // Add each blocks to the line.
+ $line = $blocks[0];
+ unset($blocks[0]); // Do not add first block twice.
+ foreach ($blocks as $block) {
+ // Calculate amount of space, insert spaces, insert block.
+ $amount = $this->tab_width -
+ $strlen($line, 'UTF-8') % $this->tab_width;
+ $line .= str_repeat(" ", $amount) . $block;
+ }
+ return $line;
+ }
+
+ /**
+ * Check for the availability of the function in the `utf8_strlen` property
+ * (initially `mb_strlen`). If the function is not available, create a
+ * function that will loosely count the number of UTF-8 characters with a
+ * regular expression.
+ * @return void
+ */
+ protected function _initDetab() {
+
+ if (function_exists($this->utf8_strlen)) {
+ return;
+ }
+
+ $this->utf8_strlen = create_function('$text', 'return preg_match_all(
+ "/[\\\\x00-\\\\xBF]|[\\\\xC0-\\\\xFF][\\\\x80-\\\\xBF]*/",
+ $text, $m);');
+ }
+
+ /**
+ * Swap back in all the tags hashed by _HashHTMLBlocks.
+ * @param string $text
+ * @return string
+ */
+ protected function unhash($text) {
+ return preg_replace_callback('/(.)\x1A[0-9]+\1/',
+ array($this, '_unhash_callback'), $text);
+ }
+
+ /**
+ * Unhashing callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _unhash_callback($matches) {
+ return $this->html_hashes[$matches[0]];
+ }
+}
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php
new file mode 100644
index 000000000..d09bd7a48
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.inc.php
@@ -0,0 +1,11 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the MarkdownExtra parser.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
+require_once dirname(__FILE__) . '/Markdown.php';
+require_once dirname(__FILE__) . '/MarkdownExtra.php';
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php
new file mode 100644
index 000000000..ac6b1b4f2
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownExtra.php
@@ -0,0 +1,1785 @@
+<?php
+/**
+ * Markdown Extra - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Extra Parser Class
+ */
+class MarkdownExtra extends \Michelf\Markdown {
+ /**
+ * Configuration variables
+ */
+
+ /**
+ * Prefix for footnote ids.
+ * @var string
+ */
+ public $fn_id_prefix = "";
+
+ /**
+ * Optional title attribute for footnote links and backlinks.
+ * @var string
+ */
+ public $fn_link_title = "";
+ public $fn_backlink_title = "";
+
+ /**
+ * Optional class attribute for footnote links and backlinks.
+ * @var string
+ */
+ public $fn_link_class = "footnote-ref";
+ public $fn_backlink_class = "footnote-backref";
+
+ /**
+ * Content to be displayed within footnote backlinks. The default is '↩';
+ * the U+FE0E on the end is a Unicode variant selector used to prevent iOS
+ * from displaying the arrow character as an emoji.
+ * @var string
+ */
+ public $fn_backlink_html = '&#8617;&#xFE0E;';
+
+ /**
+ * Class name for table cell alignment (%% replaced left/center/right)
+ * For instance: 'go-%%' becomes 'go-left' or 'go-right' or 'go-center'
+ * If empty, the align attribute is used instead of a class name.
+ * @var string
+ */
+ public $table_align_class_tmpl = '';
+
+ /**
+ * Optional class prefix for fenced code block.
+ * @var string
+ */
+ public $code_class_prefix = "";
+
+ /**
+ * Class attribute for code blocks goes on the `code` tag;
+ * setting this to true will put attributes on the `pre` tag instead.
+ * @var boolean
+ */
+ public $code_attr_on_pre = false;
+
+ /**
+ * Predefined abbreviations.
+ * @var array
+ */
+ public $predef_abbr = array();
+
+ /**
+ * Parser implementation
+ */
+
+ /**
+ * Constructor function. Initialize the parser object.
+ * @return void
+ */
+ public function __construct() {
+ // Add extra escapable characters before parent constructor
+ // initialize the table.
+ $this->escape_chars .= ':|';
+
+ // Insert extra document, block, and span transformations.
+ // Parent constructor will do the sorting.
+ $this->document_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "stripFootnotes" => 15,
+ "stripAbbreviations" => 25,
+ "appendFootnotes" => 50,
+ );
+ $this->block_gamut += array(
+ "doFencedCodeBlocks" => 5,
+ "doTables" => 15,
+ "doDefLists" => 45,
+ );
+ $this->span_gamut += array(
+ "doFootnotes" => 5,
+ "doAbbreviations" => 70,
+ );
+
+ $this->enhanced_ordered_list = true;
+ parent::__construct();
+ }
+
+
+ /**
+ * Extra variables used during extra transformations.
+ * @var array
+ */
+ protected $footnotes = array();
+ protected $footnotes_ordered = array();
+ protected $footnotes_ref_count = array();
+ protected $footnotes_numbers = array();
+ protected $abbr_desciptions = array();
+ /** @var @string */
+ protected $abbr_word_re = '';
+
+ /**
+ * Give the current footnote number.
+ * @var integer
+ */
+ protected $footnote_counter = 1;
+
+ /**
+ * Setting up Extra-specific variables.
+ */
+ protected function setup() {
+ parent::setup();
+
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+ $this->footnote_counter = 1;
+
+ foreach ($this->predef_abbr as $abbr_word => $abbr_desc) {
+ if ($this->abbr_word_re)
+ $this->abbr_word_re .= '|';
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ }
+ }
+
+ /**
+ * Clearing Extra-specific variables.
+ */
+ protected function teardown() {
+ $this->footnotes = array();
+ $this->footnotes_ordered = array();
+ $this->footnotes_ref_count = array();
+ $this->footnotes_numbers = array();
+ $this->abbr_desciptions = array();
+ $this->abbr_word_re = '';
+
+ parent::teardown();
+ }
+
+
+ /**
+ * Extra attribute parser
+ */
+
+ /**
+ * Expression to use to catch attributes (includes the braces)
+ * @var string
+ */
+ protected $id_class_attr_catch_re = '\{((?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,})[ ]*\}';
+
+ /**
+ * Expression to use when parsing in a context when no capture is desired
+ * @var string
+ */
+ protected $id_class_attr_nocatch_re = '\{(?>[ ]*[#.a-z][-_:a-zA-Z0-9=]+){1,}[ ]*\}';
+
+ /**
+ * Parse attributes caught by the $this->id_class_attr_catch_re expression
+ * and return the HTML-formatted list of attributes.
+ *
+ * Currently supported attributes are .class and #id.
+ *
+ * In addition, this method also supports supplying a default Id value,
+ * which will be used to populate the id attribute in case it was not
+ * overridden.
+ * @param string $tag_name
+ * @param string $attr
+ * @param mixed $defaultIdValue
+ * @param array $classes
+ * @return string
+ */
+ protected function doExtraAttributes($tag_name, $attr, $defaultIdValue = null, $classes = array()) {
+ if (empty($attr) && !$defaultIdValue && empty($classes)) return "";
+
+ // Split on components
+ preg_match_all('/[#.a-z][-_:a-zA-Z0-9=]+/', $attr, $matches);
+ $elements = $matches[0];
+
+ // Handle classes and IDs (only first ID taken into account)
+ $attributes = array();
+ $id = false;
+ foreach ($elements as $element) {
+ if ($element{0} == '.') {
+ $classes[] = substr($element, 1);
+ } else if ($element{0} == '#') {
+ if ($id === false) $id = substr($element, 1);
+ } else if (strpos($element, '=') > 0) {
+ $parts = explode('=', $element, 2);
+ $attributes[] = $parts[0] . '="' . $parts[1] . '"';
+ }
+ }
+
+ if (!$id) $id = $defaultIdValue;
+
+ // Compose attributes as string
+ $attr_str = "";
+ if (!empty($id)) {
+ $attr_str .= ' id="'.$this->encodeAttribute($id) .'"';
+ }
+ if (!empty($classes)) {
+ $attr_str .= ' class="'. implode(" ", $classes) . '"';
+ }
+ if (!$this->no_markup && !empty($attributes)) {
+ $attr_str .= ' '.implode(" ", $attributes);
+ }
+ return $attr_str;
+ }
+
+ /**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripLinkDefinitions($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\][ ]?: # id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ [ ]*
+ (?:
+ <(.+?)> # url = $2
+ |
+ (\S+?) # url = $3
+ )
+ [ ]*
+ \n? # maybe one newline
+ [ ]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.*?) # title = $4
+ [")]
+ [ ]*
+ )? # title is optional
+ (?:[ ]* '.$this->id_class_attr_catch_re.' )? # $5 = extra id & class attr
+ (?:\n+|\Z)
+ }xm',
+ array($this, '_stripLinkDefinitions_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Strip link definition callback
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripLinkDefinitions_callback($matches) {
+ $link_id = strtolower($matches[1]);
+ $url = $matches[2] == '' ? $matches[3] : $matches[2];
+ $this->urls[$link_id] = $url;
+ $this->titles[$link_id] =& $matches[4];
+ $this->ref_attr[$link_id] = $this->doExtraAttributes("", $dummy =& $matches[5]);
+ return ''; // String that will replace the block
+ }
+
+
+ /**
+ * HTML block parser
+ */
+
+ /**
+ * Tags that are always treated as block tags
+ * @var string
+ */
+ protected $block_tags_re = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|address|form|fieldset|iframe|hr|legend|article|section|nav|aside|hgroup|header|footer|figcaption|figure';
+
+ /**
+ * Tags treated as block tags only if the opening tag is alone on its line
+ * @var string
+ */
+ protected $context_block_tags_re = 'script|noscript|style|ins|del|iframe|object|source|track|param|math|svg|canvas|audio|video';
+
+ /**
+ * Tags where markdown="1" default to span mode:
+ * @var string
+ */
+ protected $contain_span_tags_re = 'p|h[1-6]|li|dd|dt|td|th|legend|address';
+
+ /**
+ * Tags which must not have their contents modified, no matter where
+ * they appear
+ * @var string
+ */
+ protected $clean_tags_re = 'script|style|math|svg';
+
+ /**
+ * Tags that do not need to be closed.
+ * @var string
+ */
+ protected $auto_close_tags_re = 'hr|img|param|source|track';
+
+ /**
+ * Hashify HTML Blocks and "clean tags".
+ *
+ * We only want to do this for block-level HTML tags, such as headers,
+ * lists, and tables. That's because we still want to wrap <p>s around
+ * "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ * phrase emphasis, and spans. The list of tags we're looking for is
+ * hard-coded.
+ *
+ * This works by calling _HashHTMLBlocks_InMarkdown, which then calls
+ * _HashHTMLBlocks_InHTML when it encounter block tags. When the markdown="1"
+ * attribute is found within a tag, _HashHTMLBlocks_InHTML calls back
+ * _HashHTMLBlocks_InMarkdown to handle the Markdown syntax within the tag.
+ * These two functions are calling each other. It's recursive!
+ * @param string $text
+ * @return string
+ */
+ protected function hashHTMLBlocks($text) {
+ if ($this->no_markup) {
+ return $text;
+ }
+
+ // Call the HTML-in-Markdown hasher.
+ list($text, ) = $this->_hashHTMLBlocks_inMarkdown($text);
+
+ return $text;
+ }
+
+ /**
+ * Parse markdown text, calling _HashHTMLBlocks_InHTML for block tags.
+ *
+ * * $indent is the number of space to be ignored when checking for code
+ * blocks. This is important because if we don't take the indent into
+ * account, something like this (which looks right) won't work as expected:
+ *
+ * <div>
+ * <div markdown="1">
+ * Hello World. <-- Is this a Markdown code block or text?
+ * </div> <-- Is this a Markdown code block or a real tag?
+ * <div>
+ *
+ * If you don't like this, just don't indent the tag on which
+ * you apply the markdown="1" attribute.
+ *
+ * * If $enclosing_tag_re is not empty, stops at the first unmatched closing
+ * tag with that name. Nested tags supported.
+ *
+ * * If $span is true, text inside must treated as span. So any double
+ * newline will be replaced by a single newline so that it does not create
+ * paragraphs.
+ *
+ * Returns an array of that form: ( processed text , remaining text )
+ *
+ * @param string $text
+ * @param integer $indent
+ * @param string $enclosing_tag_re
+ * @param boolean $span
+ * @return array
+ */
+ protected function _hashHTMLBlocks_inMarkdown($text, $indent = 0,
+ $enclosing_tag_re = '', $span = false)
+ {
+
+ if ($text === '') return array('', '');
+
+ // Regex to check for the presense of newlines around a block tag.
+ $newline_before_re = '/(?:^\n?|\n\n)*$/';
+ $newline_after_re =
+ '{
+ ^ # Start of text following the tag.
+ (?>[ ]*<!--.*?-->)? # Optional comment.
+ [ ]*\n # Must be followed by newline.
+ }xs';
+
+ // Regex to match any tag.
+ $block_tag_re =
+ '{
+ ( # $2: Capture whole tag.
+ </? # Any opening or closing tag.
+ (?> # Tag name.
+ ' . $this->block_tags_re . ' |
+ ' . $this->context_block_tags_re . ' |
+ ' . $this->clean_tags_re . ' |
+ (?!\s)'.$enclosing_tag_re . '
+ )
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ <!-- .*? --> # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ <!\[CDATA\[.*?\]\]> # CData Block
+ ' . ( !$span ? ' # If not in span.
+ |
+ # Indented code block
+ (?: ^[ ]*\n | ^ | \n[ ]*\n )
+ [ ]{' . ($indent + 4) . '}[^\n]* \n
+ (?>
+ (?: [ ]{' . ($indent + 4) . '}[^\n]* | [ ]* ) \n
+ )*
+ |
+ # Fenced code block marker
+ (?<= ^ | \n )
+ [ ]{0,' . ($indent + 3) . '}(?:~{3,}|`{3,})
+ [ ]*
+ (?: \.?[-_:a-zA-Z0-9]+ )? # standalone class name
+ [ ]*
+ (?: ' . $this->id_class_attr_nocatch_re . ' )? # extra attributes
+ [ ]*
+ (?= \n )
+ ' : '' ) . ' # End (if not is span).
+ |
+ # Code span marker
+ # Note, this regex needs to go after backtick fenced
+ # code blocks but it should also be kept outside of the
+ # "if not in span" condition adding backticks to the parser
+ `+
+ )
+ }xs';
+
+
+ $depth = 0; // Current depth inside the tag tree.
+ $parsed = ""; // Parsed text that will be returned.
+
+ // Loop through every tag until we find the closing tag of the parent
+ // or loop until reaching the end of text if no parent tag specified.
+ do {
+ // Split the text using the first $tag_match pattern found.
+ // Text before pattern will be first in the array, text after
+ // pattern will be at the end, and between will be any catches made
+ // by the pattern.
+ $parts = preg_split($block_tag_re, $text, 2,
+ PREG_SPLIT_DELIM_CAPTURE);
+
+ // If in Markdown span mode, add a empty-string span-level hash
+ // after each newline to prevent triggering any block element.
+ if ($span) {
+ $void = $this->hashPart("", ':');
+ $newline = "\n$void";
+ $parts[0] = $void . str_replace("\n", $newline, $parts[0]) . $void;
+ }
+
+ $parsed .= $parts[0]; // Text before current tag.
+
+ // If end of $text has been reached. Stop loop.
+ if (count($parts) < 3) {
+ $text = "";
+ break;
+ }
+
+ $tag = $parts[1]; // Tag to handle.
+ $text = $parts[2]; // Remaining text after current tag.
+ $tag_re = preg_quote($tag); // For use in a regular expression.
+
+ // Check for: Fenced code block marker.
+ // Note: need to recheck the whole tag to disambiguate backtick
+ // fences from code spans
+ if (preg_match('{^\n?([ ]{0,' . ($indent + 3) . '})(~{3,}|`{3,})[ ]*(?:\.?[-_:a-zA-Z0-9]+)?[ ]*(?:' . $this->id_class_attr_nocatch_re . ')?[ ]*\n?$}', $tag, $capture)) {
+ // Fenced code block marker: find matching end marker.
+ $fence_indent = strlen($capture[1]); // use captured indent in re
+ $fence_re = $capture[2]; // use captured fence in re
+ if (preg_match('{^(?>.*\n)*?[ ]{' . ($fence_indent) . '}' . $fence_re . '[ ]*(?:\n|$)}', $text,
+ $matches))
+ {
+ // End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ // No end marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ // Check for: Indented code block.
+ else if ($tag{0} == "\n" || $tag{0} == " ") {
+ // Indented code block: pass it unchanged, will be handled
+ // later.
+ $parsed .= $tag;
+ }
+ // Check for: Code span marker
+ // Note: need to check this after backtick fenced code blocks
+ else if ($tag{0} == "`") {
+ // Find corresponding end marker.
+ $tag_re = preg_quote($tag);
+ if (preg_match('{^(?>.+?|\n(?!\n))*?(?<!`)' . $tag_re . '(?!`)}',
+ $text, $matches))
+ {
+ // End marker found: pass text unchanged until marker.
+ $parsed .= $tag . $matches[0];
+ $text = substr($text, strlen($matches[0]));
+ }
+ else {
+ // Unmatched marker: just skip it.
+ $parsed .= $tag;
+ }
+ }
+ // Check for: Opening Block level tag or
+ // Opening Context Block tag (like ins and del)
+ // used as a block tag (tag is alone on it's line).
+ else if (preg_match('{^<(?:' . $this->block_tags_re . ')\b}', $tag) ||
+ ( preg_match('{^<(?:' . $this->context_block_tags_re . ')\b}', $tag) &&
+ preg_match($newline_before_re, $parsed) &&
+ preg_match($newline_after_re, $text) )
+ )
+ {
+ // Need to parse tag and following text using the HTML parser.
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashBlock", true);
+
+ // Make sure it stays outside of any paragraph by adding newlines.
+ $parsed .= "\n\n$block_text\n\n";
+ }
+ // Check for: Clean tag (like script, math)
+ // HTML Comments, processing instructions.
+ else if (preg_match('{^<(?:' . $this->clean_tags_re . ')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ // Need to parse tag and following text using the HTML parser.
+ // (don't check for markdown attribute)
+ list($block_text, $text) =
+ $this->_hashHTMLBlocks_inHTML($tag . $text, "hashClean", false);
+
+ $parsed .= $block_text;
+ }
+ // Check for: Tag with same name as enclosing tag.
+ else if ($enclosing_tag_re !== '' &&
+ // Same name as enclosing tag.
+ preg_match('{^</?(?:' . $enclosing_tag_re . ')\b}', $tag))
+ {
+ // Increase/decrease nested tag count.
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+
+ if ($depth < 0) {
+ // Going out of parent element. Clean up and break so we
+ // return to the calling function.
+ $text = $tag . $text;
+ break;
+ }
+
+ $parsed .= $tag;
+ }
+ else {
+ $parsed .= $tag;
+ }
+ } while ($depth >= 0);
+
+ return array($parsed, $text);
+ }
+
+ /**
+ * Parse HTML, calling _HashHTMLBlocks_InMarkdown for block tags.
+ *
+ * * Calls $hash_method to convert any blocks.
+ * * Stops when the first opening tag closes.
+ * * $md_attr indicate if the use of the `markdown="1"` attribute is allowed.
+ * (it is not inside clean tags)
+ *
+ * Returns an array of that form: ( processed text , remaining text )
+ * @param string $text
+ * @param string $hash_method
+ * @param string $md_attr
+ * @return array
+ */
+ protected function _hashHTMLBlocks_inHTML($text, $hash_method, $md_attr) {
+ if ($text === '') return array('', '');
+
+ // Regex to match `markdown` attribute inside of a tag.
+ $markdown_attr_re = '
+ {
+ \s* # Eat whitespace before the `markdown` attribute
+ markdown
+ \s*=\s*
+ (?>
+ (["\']) # $1: quote delimiter
+ (.*?) # $2: attribute value
+ \1 # matching delimiter
+ |
+ ([^\s>]*) # $3: unquoted attribute value
+ )
+ () # $4: make $3 always defined (avoid warnings)
+ }xs';
+
+ // Regex to match any tag.
+ $tag_re = '{
+ ( # $2: Capture whole tag.
+ </? # Any opening or closing tag.
+ [\w:$]+ # Tag name.
+ (?:
+ (?=[\s"\'/a-zA-Z0-9]) # Allowed characters after tag name.
+ (?>
+ ".*?" | # Double quotes (can contain `>`)
+ \'.*?\' | # Single quotes (can contain `>`)
+ .+? # Anything but quotes and `>`.
+ )*?
+ )?
+ > # End of tag.
+ |
+ <!-- .*? --> # HTML Comment
+ |
+ <\?.*?\?> | <%.*?%> # Processing instruction
+ |
+ <!\[CDATA\[.*?\]\]> # CData Block
+ )
+ }xs';
+
+ $original_text = $text; // Save original text in case of faliure.
+
+ $depth = 0; // Current depth inside the tag tree.
+ $block_text = ""; // Temporary text holder for current text.
+ $parsed = ""; // Parsed text that will be returned.
+
+ // Get the name of the starting tag.
+ // (This pattern makes $base_tag_name_re safe without quoting.)
+ if (preg_match('/^<([\w:$]*)\b/', $text, $matches))
+ $base_tag_name_re = $matches[1];
+
+ // Loop through every tag until we find the corresponding closing tag.
+ do {
+ // Split the text using the first $tag_match pattern found.
+ // Text before pattern will be first in the array, text after
+ // pattern will be at the end, and between will be any catches made
+ // by the pattern.
+ $parts = preg_split($tag_re, $text, 2, PREG_SPLIT_DELIM_CAPTURE);
+
+ if (count($parts) < 3) {
+ // End of $text reached with unbalenced tag(s).
+ // In that case, we return original text unchanged and pass the
+ // first character as filtered to prevent an infinite loop in the
+ // parent function.
+ return array($original_text{0}, substr($original_text, 1));
+ }
+
+ $block_text .= $parts[0]; // Text before current tag.
+ $tag = $parts[1]; // Tag to handle.
+ $text = $parts[2]; // Remaining text after current tag.
+
+ // Check for: Auto-close tag (like <hr/>)
+ // Comments and Processing Instructions.
+ if (preg_match('{^</?(?:' . $this->auto_close_tags_re . ')\b}', $tag) ||
+ $tag{1} == '!' || $tag{1} == '?')
+ {
+ // Just add the tag to the block as if it was text.
+ $block_text .= $tag;
+ }
+ else {
+ // Increase/decrease nested tag count. Only do so if
+ // the tag's name match base tag's.
+ if (preg_match('{^</?' . $base_tag_name_re . '\b}', $tag)) {
+ if ($tag{1} == '/') $depth--;
+ else if ($tag{strlen($tag)-2} != '/') $depth++;
+ }
+
+ // Check for `markdown="1"` attribute and handle it.
+ if ($md_attr &&
+ preg_match($markdown_attr_re, $tag, $attr_m) &&
+ preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
+ {
+ // Remove `markdown` attribute from opening tag.
+ $tag = preg_replace($markdown_attr_re, '', $tag);
+
+ // Check if text inside this tag must be parsed in span mode.
+ $this->mode = $attr_m[2] . $attr_m[3];
+ $span_mode = $this->mode == 'span' || $this->mode != 'block' &&
+ preg_match('{^<(?:' . $this->contain_span_tags_re . ')\b}', $tag);
+
+ // Calculate indent before tag.
+ if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
+ $strlen = $this->utf8_strlen;
+ $indent = $strlen($matches[1], 'UTF-8');
+ } else {
+ $indent = 0;
+ }
+
+ // End preceding block with this tag.
+ $block_text .= $tag;
+ $parsed .= $this->$hash_method($block_text);
+
+ // Get enclosing tag name for the ParseMarkdown function.
+ // (This pattern makes $tag_name_re safe without quoting.)
+ preg_match('/^<([\w:$]*)\b/', $tag, $matches);
+ $tag_name_re = $matches[1];
+
+ // Parse the content using the HTML-in-Markdown parser.
+ list ($block_text, $text)
+ = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
+ $tag_name_re, $span_mode);
+
+ // Outdent markdown text.
+ if ($indent > 0) {
+ $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
+ $block_text);
+ }
+
+ // Append tag content to parsed text.
+ if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
+ else $parsed .= "$block_text";
+
+ // Start over with a new block.
+ $block_text = "";
+ }
+ else $block_text .= $tag;
+ }
+
+ } while ($depth > 0);
+
+ // Hash last block text that wasn't processed inside the loop.
+ $parsed .= $this->$hash_method($block_text);
+
+ return array($parsed, $text);
+ }
+
+ /**
+ * Called whenever a tag must be hashed when a function inserts a "clean" tag
+ * in $text, it passes through this function and is automaticaly escaped,
+ * blocking invalid nested overlap.
+ * @param string $text
+ * @return string
+ */
+ protected function hashClean($text) {
+ return $this->hashPart($text, 'C');
+ }
+
+ /**
+ * Turn Markdown link shortcuts into XHTML <a> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doAnchors($text) {
+ if ($this->in_anchor) {
+ return $text;
+ }
+ $this->in_anchor = true;
+
+ // First, handle reference-style links: [link text] [id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ (' . $this->nested_brackets_re . ') # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ // Next, inline-style links: [link text](url "optional title")
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ (' . $this->nested_brackets_re . ') # link text = $2
+ \]
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(.+?)> # href = $3
+ |
+ (' . $this->nested_url_parenthesis_re . ') # href = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # Title = $7
+ \6 # matching quote
+ [ \n]* # ignore any spaces/tabs between closing quote and )
+ )? # title is optional
+ \)
+ (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes
+ )
+ }xs',
+ array($this, '_doAnchors_inline_callback'), $text);
+
+ // Last, handle reference-style shortcuts: [link text]
+ // These must come last in case you've also got [link text][1]
+ // or [link text](/foo)
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ \[
+ ([^\[\]]+) # link text = $2; can\'t contain [ or ]
+ \]
+ )
+ }xs',
+ array($this, '_doAnchors_reference_callback'), $text);
+
+ $this->in_anchor = false;
+ return $text;
+ }
+
+ /**
+ * Callback for reference anchors
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAnchors_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id =& $matches[3];
+
+ if ($link_id == "") {
+ // for shortcut links like [this][] or [this].
+ $link_id = $link_text;
+ }
+
+ // lower-case and turn embedded newlines into spaces
+ $link_id = strtolower($link_id);
+ $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
+
+ if (isset($this->urls[$link_id])) {
+ $url = $this->urls[$link_id];
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if ( isset( $this->titles[$link_id] ) ) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+ $result = $this->hashPart($result);
+ }
+ else {
+ $result = $whole_match;
+ }
+ return $result;
+ }
+
+ /**
+ * Callback for inline anchors
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAnchors_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $link_text = $this->runSpanGamut($matches[2]);
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("a", $dummy =& $matches[8]);
+
+ // if the URL was of the form <s p a c e s> it got caught by the HTML
+ // tag parser and hashed. Need to reverse the process before using the URL.
+ $unhashed = $this->unhash($url);
+ if ($unhashed != $url)
+ $url = preg_replace('/^<(.*)>$/', '\1', $unhashed);
+
+ $url = $this->encodeURLAttribute($url);
+
+ $result = "<a href=\"$url\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $attr;
+
+ $link_text = $this->runSpanGamut($link_text);
+ $result .= ">$link_text</a>";
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Turn Markdown image shortcuts into <img> tags.
+ * @param string $text
+ * @return string
+ */
+ protected function doImages($text) {
+ // First, handle reference-style labeled images: ![alt text][id]
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ (' . $this->nested_brackets_re . ') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ array($this, '_doImages_reference_callback'), $text);
+
+ // Next, handle inline images: ![alt text](url "optional title")
+ // Don't forget: encode * and _
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ (' . $this->nested_brackets_re . ') # alt text = $2
+ \]
+ \s? # One optional whitespace character
+ \( # literal paren
+ [ \n]*
+ (?:
+ <(\S*)> # src url = $3
+ |
+ (' . $this->nested_url_parenthesis_re . ') # src url = $4
+ )
+ [ \n]*
+ ( # $5
+ ([\'"]) # quote char = $6
+ (.*?) # title = $7
+ \6 # matching quote
+ [ \n]*
+ )? # title is optional
+ \)
+ (?:[ ]? ' . $this->id_class_attr_catch_re . ' )? # $8 = id/class attributes
+ )
+ }xs',
+ array($this, '_doImages_inline_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for referenced images
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_reference_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); // for shortcut links like ![this][].
+ }
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ if (isset($this->urls[$link_id])) {
+ $url = $this->encodeURLAttribute($this->urls[$link_id]);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($this->titles[$link_id])) {
+ $title = $this->titles[$link_id];
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\"";
+ }
+ if (isset($this->ref_attr[$link_id]))
+ $result .= $this->ref_attr[$link_id];
+ $result .= $this->empty_element_suffix;
+ $result = $this->hashPart($result);
+ }
+ else {
+ // If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Callback for inline images
+ * @param array $matches
+ * @return string
+ */
+ protected function _doImages_inline_callback($matches) {
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3] == '' ? $matches[4] : $matches[3];
+ $title =& $matches[7];
+ $attr = $this->doExtraAttributes("img", $dummy =& $matches[8]);
+
+ $alt_text = $this->encodeAttribute($alt_text);
+ $url = $this->encodeURLAttribute($url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($title)) {
+ $title = $this->encodeAttribute($title);
+ $result .= " title=\"$title\""; // $title already quoted
+ }
+ $result .= $attr;
+ $result .= $this->empty_element_suffix;
+
+ return $this->hashPart($result);
+ }
+
+ /**
+ * Process markdown headers. Redefined to add ID and class attribute support.
+ * @param string $text
+ * @return string
+ */
+ protected function doHeaders($text) {
+ // Setext-style headers:
+ // Header 1 {#header1}
+ // ========
+ //
+ // Header 2 {#header2 .class1 .class2}
+ // --------
+ //
+ $text = preg_replace_callback(
+ '{
+ (^.+?) # $1: Header text
+ (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes
+ [ ]*\n(=+|-+)[ ]*\n+ # $3: Header footer
+ }mx',
+ array($this, '_doHeaders_callback_setext'), $text);
+
+ // atx-style headers:
+ // # Header 1 {#header1}
+ // ## Header 2 {#header2}
+ // ## Header 2 with closing hashes ## {#header3.class1.class2}
+ // ...
+ // ###### Header 6 {.class2}
+ //
+ $text = preg_replace_callback('{
+ ^(\#{1,6}) # $1 = string of #\'s
+ [ ]*
+ (.+?) # $2 = Header text
+ [ ]*
+ \#* # optional closing #\'s (not counted)
+ (?:[ ]+ ' . $this->id_class_attr_catch_re . ' )? # $3 = id/class attributes
+ [ ]*
+ \n+
+ }xm',
+ array($this, '_doHeaders_callback_atx'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for setext headers
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_setext($matches) {
+ if ($matches[3] == '-' && preg_match('{^- }', $matches[1])) {
+ return $matches[0];
+ }
+
+ $level = $matches[3]{0} == '=' ? 1 : 2;
+
+ $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[1]) : null;
+
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[2], $defaultId);
+ $block = "<h$level$attr>" . $this->runSpanGamut($matches[1]) . "</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * Callback for atx headers
+ * @param array $matches
+ * @return string
+ */
+ protected function _doHeaders_callback_atx($matches) {
+ $level = strlen($matches[1]);
+
+ $defaultId = is_callable($this->header_id_func) ? call_user_func($this->header_id_func, $matches[2]) : null;
+ $attr = $this->doExtraAttributes("h$level", $dummy =& $matches[3], $defaultId);
+ $block = "<h$level$attr>" . $this->runSpanGamut($matches[2]) . "</h$level>";
+ return "\n" . $this->hashBlock($block) . "\n\n";
+ }
+
+ /**
+ * Form HTML tables.
+ * @param string $text
+ * @return string
+ */
+ protected function doTables($text) {
+ $less_than_tab = $this->tab_width - 1;
+ // Find tables with leading pipe.
+ //
+ // | Header 1 | Header 2
+ // | -------- | --------
+ // | Cell 1 | Cell 2
+ // | Cell 3 | Cell 4
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ [|] # Optional leading pipe (present)
+ (.+) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ [|] ([ ]*[-:]+[-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ [ ]* # Allowed whitespace.
+ [|] .* \n # Row content.
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array($this, '_doTable_leadingPipe_callback'), $text);
+
+ // Find tables without leading pipe.
+ //
+ // Header 1 | Header 2
+ // -------- | --------
+ // Cell 1 | Cell 2
+ // Cell 3 | Cell 4
+ $text = preg_replace_callback('
+ {
+ ^ # Start of a line
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ (\S.*[|].*) \n # $1: Header row (at least one pipe)
+
+ [ ]{0,' . $less_than_tab . '} # Allowed whitespace.
+ ([-:]+[ ]*[|][-| :]*) \n # $2: Header underline
+
+ ( # $3: Cells
+ (?>
+ .* [|] .* \n # Row content
+ )*
+ )
+ (?=\n|\Z) # Stop at final double newline.
+ }xm',
+ array($this, '_DoTable_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for removing the leading pipe for each row
+ * @param array $matches
+ * @return string
+ */
+ protected function _doTable_leadingPipe_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ $content = preg_replace('/^ *[|]/m', '', $content);
+
+ return $this->_doTable_callback(array($matches[0], $head, $underline, $content));
+ }
+
+ /**
+ * Make the align attribute in a table
+ * @param string $alignname
+ * @return string
+ */
+ protected function _doTable_makeAlignAttr($alignname)
+ {
+ if (empty($this->table_align_class_tmpl)) {
+ return " align=\"$alignname\"";
+ }
+
+ $classname = str_replace('%%', $alignname, $this->table_align_class_tmpl);
+ return " class=\"$classname\"";
+ }
+
+ /**
+ * Calback for processing tables
+ * @param array $matches
+ * @return string
+ */
+ protected function _doTable_callback($matches) {
+ $head = $matches[1];
+ $underline = $matches[2];
+ $content = $matches[3];
+
+ // Remove any tailing pipes for each line.
+ $head = preg_replace('/[|] *$/m', '', $head);
+ $underline = preg_replace('/[|] *$/m', '', $underline);
+ $content = preg_replace('/[|] *$/m', '', $content);
+
+ // Reading alignement from header underline.
+ $separators = preg_split('/ *[|] */', $underline);
+ foreach ($separators as $n => $s) {
+ if (preg_match('/^ *-+: *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('right');
+ else if (preg_match('/^ *:-+: *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('center');
+ else if (preg_match('/^ *:-+ *$/', $s))
+ $attr[$n] = $this->_doTable_makeAlignAttr('left');
+ else
+ $attr[$n] = '';
+ }
+
+ // Parsing span elements, including code spans, character escapes,
+ // and inline HTML tags, so that pipes inside those gets ignored.
+ $head = $this->parseSpan($head);
+ $headers = preg_split('/ *[|] */', $head);
+ $col_count = count($headers);
+ $attr = array_pad($attr, $col_count, '');
+
+ // Write column headers.
+ $text = "<table>\n";
+ $text .= "<thead>\n";
+ $text .= "<tr>\n";
+ foreach ($headers as $n => $header)
+ $text .= " <th$attr[$n]>" . $this->runSpanGamut(trim($header)) . "</th>\n";
+ $text .= "</tr>\n";
+ $text .= "</thead>\n";
+
+ // Split content by row.
+ $rows = explode("\n", trim($content, "\n"));
+
+ $text .= "<tbody>\n";
+ foreach ($rows as $row) {
+ // Parsing span elements, including code spans, character escapes,
+ // and inline HTML tags, so that pipes inside those gets ignored.
+ $row = $this->parseSpan($row);
+
+ // Split row by cell.
+ $row_cells = preg_split('/ *[|] */', $row, $col_count);
+ $row_cells = array_pad($row_cells, $col_count, '');
+
+ $text .= "<tr>\n";
+ foreach ($row_cells as $n => $cell)
+ $text .= " <td$attr[$n]>" . $this->runSpanGamut(trim($cell)) . "</td>\n";
+ $text .= "</tr>\n";
+ }
+ $text .= "</tbody>\n";
+ $text .= "</table>";
+
+ return $this->hashBlock($text) . "\n";
+ }
+
+ /**
+ * Form HTML definition lists.
+ * @param string $text
+ * @return string
+ */
+ protected function doDefLists($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Re-usable pattern to match any entire dl list:
+ $whole_list_re = '(?>
+ ( # $1 = whole list
+ ( # $2
+ [ ]{0,' . $less_than_tab . '}
+ ((?>.*\S.*\n)+) # $3 = defined term
+ \n?
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ (?s:.+?)
+ ( # $4
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another term
+ [ ]{0,' . $less_than_tab . '}
+ (?: \S.*\n )+? # defined term
+ \n?
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ (?! # Negative lookahead for another definition
+ [ ]{0,' . $less_than_tab . '}:[ ]+ # colon starting definition
+ )
+ )
+ )
+ )'; // mx
+
+ $text = preg_replace_callback('{
+ (?>\A\n?|(?<=\n\n))
+ ' . $whole_list_re . '
+ }mx',
+ array($this, '_doDefLists_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback for processing definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _doDefLists_callback($matches) {
+ // Re-usable patterns to match list item bullets and number markers:
+ $list = $matches[1];
+
+ // Turn double returns into triple returns, so that we can make a
+ // paragraph for the last item in a list, if necessary:
+ $result = trim($this->processDefListItems($list));
+ $result = "<dl>\n" . $result . "\n</dl>";
+ return $this->hashBlock($result) . "\n\n";
+ }
+
+ /**
+ * Process the contents of a single definition list, splitting it
+ * into individual term and definition list items.
+ * @param string $list_str
+ * @return string
+ */
+ protected function processDefListItems($list_str) {
+
+ $less_than_tab = $this->tab_width - 1;
+
+ // Trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ // Process definition terms.
+ $list_str = preg_replace_callback('{
+ (?>\A\n?|\n\n+) # leading line
+ ( # definition terms = $1
+ [ ]{0,' . $less_than_tab . '} # leading whitespace
+ (?!\:[ ]|[ ]) # negative lookahead for a definition
+ # mark (colon) or more whitespace.
+ (?> \S.* \n)+? # actual term (not whitespace).
+ )
+ (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
+ # with a definition mark.
+ }xm',
+ array($this, '_processDefListItems_callback_dt'), $list_str);
+
+ // Process actual definitions.
+ $list_str = preg_replace_callback('{
+ \n(\n+)? # leading line = $1
+ ( # marker space = $2
+ [ ]{0,' . $less_than_tab . '} # whitespace before colon
+ \:[ ]+ # definition mark (colon)
+ )
+ ((?s:.+?)) # definition text = $3
+ (?= \n+ # stop at next definition mark,
+ (?: # next term or end of text
+ [ ]{0,' . $less_than_tab . '} \:[ ] |
+ <dt> | \z
+ )
+ )
+ }xm',
+ array($this, '_processDefListItems_callback_dd'), $list_str);
+
+ return $list_str;
+ }
+
+ /**
+ * Callback for <dt> elements in definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _processDefListItems_callback_dt($matches) {
+ $terms = explode("\n", trim($matches[1]));
+ $text = '';
+ foreach ($terms as $term) {
+ $term = $this->runSpanGamut(trim($term));
+ $text .= "\n<dt>" . $term . "</dt>";
+ }
+ return $text . "\n";
+ }
+
+ /**
+ * Callback for <dd> elements in definition lists
+ * @param array $matches
+ * @return string
+ */
+ protected function _processDefListItems_callback_dd($matches) {
+ $leading_line = $matches[1];
+ $marker_space = $matches[2];
+ $def = $matches[3];
+
+ if ($leading_line || preg_match('/\n{2,}/', $def)) {
+ // Replace marker with the appropriate whitespace indentation
+ $def = str_repeat(' ', strlen($marker_space)) . $def;
+ $def = $this->runBlockGamut($this->outdent($def . "\n\n"));
+ $def = "\n". $def ."\n";
+ }
+ else {
+ $def = rtrim($def);
+ $def = $this->runSpanGamut($this->outdent($def));
+ }
+
+ return "\n<dd>" . $def . "</dd>\n";
+ }
+
+ /**
+ * Adding the fenced code block syntax to regular Markdown:
+ *
+ * ~~~
+ * Code block
+ * ~~~
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function doFencedCodeBlocks($text) {
+
+ $less_than_tab = $this->tab_width;
+
+ $text = preg_replace_callback('{
+ (?:\n|\A)
+ # 1: Opening marker
+ (
+ (?:~{3,}|`{3,}) # 3 or more tildes/backticks.
+ )
+ [ ]*
+ (?:
+ \.?([-_:a-zA-Z0-9]+) # 2: standalone class name
+ )?
+ [ ]*
+ (?:
+ ' . $this->id_class_attr_catch_re . ' # 3: Extra attributes
+ )?
+ [ ]* \n # Whitespace and newline following marker.
+
+ # 4: Content
+ (
+ (?>
+ (?!\1 [ ]* \n) # Not a closing marker.
+ .*\n+
+ )+
+ )
+
+ # Closing marker.
+ \1 [ ]* (?= \n )
+ }xm',
+ array($this, '_doFencedCodeBlocks_callback'), $text);
+
+ return $text;
+ }
+
+ /**
+ * Callback to process fenced code blocks
+ * @param array $matches
+ * @return string
+ */
+ protected function _doFencedCodeBlocks_callback($matches) {
+ $classname =& $matches[2];
+ $attrs =& $matches[3];
+ $codeblock = $matches[4];
+
+ if ($this->code_block_content_func) {
+ $codeblock = call_user_func($this->code_block_content_func, $codeblock, $classname);
+ } else {
+ $codeblock = htmlspecialchars($codeblock, ENT_NOQUOTES);
+ }
+
+ $codeblock = preg_replace_callback('/^\n+/',
+ array($this, '_doFencedCodeBlocks_newlines'), $codeblock);
+
+ $classes = array();
+ if ($classname != "") {
+ if ($classname{0} == '.')
+ $classname = substr($classname, 1);
+ $classes[] = $this->code_class_prefix . $classname;
+ }
+ $attr_str = $this->doExtraAttributes($this->code_attr_on_pre ? "pre" : "code", $attrs, null, $classes);
+ $pre_attr_str = $this->code_attr_on_pre ? $attr_str : '';
+ $code_attr_str = $this->code_attr_on_pre ? '' : $attr_str;
+ $codeblock = "<pre$pre_attr_str><code$code_attr_str>$codeblock</code></pre>";
+
+ return "\n\n".$this->hashBlock($codeblock)."\n\n";
+ }
+
+ /**
+ * Replace new lines in fenced code blocks
+ * @param array $matches
+ * @return string
+ */
+ protected function _doFencedCodeBlocks_newlines($matches) {
+ return str_repeat("<br$this->empty_element_suffix",
+ strlen($matches[0]));
+ }
+
+ /**
+ * Redefining emphasis markers so that emphasis by underscore does not
+ * work in the middle of a word.
+ * @var array
+ */
+ protected $em_relist = array(
+ '' => '(?:(?<!\*)\*(?!\*)|(?<![a-zA-Z0-9_])_(?!_))(?![\.,:;]?\s)',
+ '*' => '(?<![\s*])\*(?!\*)',
+ '_' => '(?<![\s_])_(?![a-zA-Z0-9_])',
+ );
+ protected $strong_relist = array(
+ '' => '(?:(?<!\*)\*\*(?!\*)|(?<![a-zA-Z0-9_])__(?!_))(?![\.,:;]?\s)',
+ '**' => '(?<![\s*])\*\*(?!\*)',
+ '__' => '(?<![\s_])__(?![a-zA-Z0-9_])',
+ );
+ protected $em_strong_relist = array(
+ '' => '(?:(?<!\*)\*\*\*(?!\*)|(?<![a-zA-Z0-9_])___(?!_))(?![\.,:;]?\s)',
+ '***' => '(?<![\s*])\*\*\*(?!\*)',
+ '___' => '(?<![\s_])___(?![a-zA-Z0-9_])',
+ );
+
+ /**
+ * Parse text into paragraphs
+ * @param string $text String to process in paragraphs
+ * @param boolean $wrap_in_p Whether paragraphs should be wrapped in <p> tags
+ * @return string HTML output
+ */
+ protected function formParagraphs($text, $wrap_in_p = true) {
+ // Strip leading and trailing lines:
+ $text = preg_replace('/\A\n+|\n+\z/', '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ // Wrap <p> tags and unhashify HTML blocks
+ foreach ($grafs as $key => $value) {
+ $value = trim($this->runSpanGamut($value));
+
+ // Check if this should be enclosed in a paragraph.
+ // Clean tag hashes & block tag hashes are left alone.
+ $is_p = $wrap_in_p && !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
+
+ if ($is_p) {
+ $value = "<p>$value</p>";
+ }
+ $grafs[$key] = $value;
+ }
+
+ // Join grafs in one text, then unhash HTML tags.
+ $text = implode("\n\n", $grafs);
+
+ // Finish by removing any tag hashes still present in $text.
+ $text = $this->unhash($text);
+
+ return $text;
+ }
+
+
+ /**
+ * Footnotes - Strips link definitions from text, stores the URLs and
+ * titles in hash references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripFootnotes($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: [^id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,' . $less_than_tab . '}\[\^(.+?)\][ ]?: # note_id = $1
+ [ ]*
+ \n? # maybe *one* newline
+ ( # text = $2 (no blank lines allowed)
+ (?:
+ .+ # actual text
+ |
+ \n # newlines but
+ (?!\[.+?\][ ]?:\s)# negative lookahead for footnote or link definition marker.
+ (?!\n+[ ]{0,3}\S)# ensure line is not blank and followed
+ # by non-indented content
+ )*
+ )
+ }xm',
+ array($this, '_stripFootnotes_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Callback for stripping footnotes
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripFootnotes_callback($matches) {
+ $note_id = $this->fn_id_prefix . $matches[1];
+ $this->footnotes[$note_id] = $this->outdent($matches[2]);
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Replace footnote references in $text [^id] with a special text-token
+ * which will be replaced by the actual footnote marker in appendFootnotes.
+ * @param string $text
+ * @return string
+ */
+ protected function doFootnotes($text) {
+ if (!$this->in_anchor) {
+ $text = preg_replace('{\[\^(.+?)\]}', "F\x1Afn:\\1\x1A:", $text);
+ }
+ return $text;
+ }
+
+ /**
+ * Append footnote list to text
+ * @param string $text
+ * @return string
+ */
+ protected function appendFootnotes($text) {
+ $text = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array($this, '_appendFootnotes_callback'), $text);
+
+ if (!empty($this->footnotes_ordered)) {
+ $text .= "\n\n";
+ $text .= "<div class=\"footnotes\">\n";
+ $text .= "<hr" . $this->empty_element_suffix . "\n";
+ $text .= "<ol>\n\n";
+
+ $attr = "";
+ if ($this->fn_backlink_class != "") {
+ $class = $this->fn_backlink_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_backlink_title != "") {
+ $title = $this->fn_backlink_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+ $backlink_text = $this->fn_backlink_html;
+ $num = 0;
+
+ while (!empty($this->footnotes_ordered)) {
+ $footnote = reset($this->footnotes_ordered);
+ $note_id = key($this->footnotes_ordered);
+ unset($this->footnotes_ordered[$note_id]);
+ $ref_count = $this->footnotes_ref_count[$note_id];
+ unset($this->footnotes_ref_count[$note_id]);
+ unset($this->footnotes[$note_id]);
+
+ $footnote .= "\n"; // Need to append newline before parsing.
+ $footnote = $this->runBlockGamut("$footnote\n");
+ $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ array($this, '_appendFootnotes_callback'), $footnote);
+
+ $attr = str_replace("%%", ++$num, $attr);
+ $note_id = $this->encodeAttribute($note_id);
+
+ // Prepare backlink, multiple backlinks if multiple references
+ $backlink = "<a href=\"#fnref:$note_id\"$attr>$backlink_text</a>";
+ for ($ref_num = 2; $ref_num <= $ref_count; ++$ref_num) {
+ $backlink .= " <a href=\"#fnref$ref_num:$note_id\"$attr>$backlink_text</a>";
+ }
+ // Add backlink to last paragraph; create new paragraph if needed.
+ if (preg_match('{</p>$}', $footnote)) {
+ $footnote = substr($footnote, 0, -4) . "&#160;$backlink</p>";
+ } else {
+ $footnote .= "\n\n<p>$backlink</p>";
+ }
+
+ $text .= "<li id=\"fn:$note_id\">\n";
+ $text .= $footnote . "\n";
+ $text .= "</li>\n\n";
+ }
+
+ $text .= "</ol>\n";
+ $text .= "</div>";
+ }
+ return $text;
+ }
+
+ /**
+ * Callback for appending footnotes
+ * @param array $matches
+ * @return string
+ */
+ protected function _appendFootnotes_callback($matches) {
+ $node_id = $this->fn_id_prefix . $matches[1];
+
+ // Create footnote marker only if it has a corresponding footnote *and*
+ // the footnote hasn't been used by another marker.
+ if (isset($this->footnotes[$node_id])) {
+ $num =& $this->footnotes_numbers[$node_id];
+ if (!isset($num)) {
+ // Transfer footnote content to the ordered list and give it its
+ // number
+ $this->footnotes_ordered[$node_id] = $this->footnotes[$node_id];
+ $this->footnotes_ref_count[$node_id] = 1;
+ $num = $this->footnote_counter++;
+ $ref_count_mark = '';
+ } else {
+ $ref_count_mark = $this->footnotes_ref_count[$node_id] += 1;
+ }
+
+ $attr = "";
+ if ($this->fn_link_class != "") {
+ $class = $this->fn_link_class;
+ $class = $this->encodeAttribute($class);
+ $attr .= " class=\"$class\"";
+ }
+ if ($this->fn_link_title != "") {
+ $title = $this->fn_link_title;
+ $title = $this->encodeAttribute($title);
+ $attr .= " title=\"$title\"";
+ }
+
+ $attr = str_replace("%%", $num, $attr);
+ $node_id = $this->encodeAttribute($node_id);
+
+ return
+ "<sup id=\"fnref$ref_count_mark:$node_id\">".
+ "<a href=\"#fn:$node_id\"$attr>$num</a>".
+ "</sup>";
+ }
+
+ return "[^" . $matches[1] . "]";
+ }
+
+
+ /**
+ * Abbreviations - strips abbreviations from text, stores titles in hash
+ * references.
+ * @param string $text
+ * @return string
+ */
+ protected function stripAbbreviations($text) {
+ $less_than_tab = $this->tab_width - 1;
+
+ // Link defs are in the form: [id]*: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,' . $less_than_tab . '}\*\[(.+?)\][ ]?: # abbr_id = $1
+ (.*) # text = $2 (no blank lines allowed)
+ }xm',
+ array($this, '_stripAbbreviations_callback'),
+ $text);
+ return $text;
+ }
+
+ /**
+ * Callback for stripping abbreviations
+ * @param array $matches
+ * @return string
+ */
+ protected function _stripAbbreviations_callback($matches) {
+ $abbr_word = $matches[1];
+ $abbr_desc = $matches[2];
+ if ($this->abbr_word_re) {
+ $this->abbr_word_re .= '|';
+ }
+ $this->abbr_word_re .= preg_quote($abbr_word);
+ $this->abbr_desciptions[$abbr_word] = trim($abbr_desc);
+ return ''; // String that will replace the block
+ }
+
+ /**
+ * Find defined abbreviations in text and wrap them in <abbr> elements.
+ * @param string $text
+ * @return string
+ */
+ protected function doAbbreviations($text) {
+ if ($this->abbr_word_re) {
+ // cannot use the /x modifier because abbr_word_re may
+ // contain significant spaces:
+ $text = preg_replace_callback('{' .
+ '(?<![\w\x1A])' .
+ '(?:' . $this->abbr_word_re . ')' .
+ '(?![\w\x1A])' .
+ '}',
+ array($this, '_doAbbreviations_callback'), $text);
+ }
+ return $text;
+ }
+
+ /**
+ * Callback for processing abbreviations
+ * @param array $matches
+ * @return string
+ */
+ protected function _doAbbreviations_callback($matches) {
+ $abbr = $matches[0];
+ if (isset($this->abbr_desciptions[$abbr])) {
+ $desc = $this->abbr_desciptions[$abbr];
+ if (empty($desc)) {
+ return $this->hashPart("<abbr>$abbr</abbr>");
+ } else {
+ $desc = $this->encodeAttribute($desc);
+ return $this->hashPart("<abbr title=\"$desc\">$abbr</abbr>");
+ }
+ } else {
+ return $matches[0];
+ }
+ }
+}
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php
new file mode 100644
index 000000000..c4e9ac7f6
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.inc.php
@@ -0,0 +1,9 @@
+<?php
+
+// Use this file if you cannot use class autoloading. It will include all the
+// files needed for the MarkdownInterface interface.
+//
+// Take a look at the PSR-0-compatible class autoloading implementation
+// in the Readme.php file if you want a simple autoloader setup.
+
+require_once dirname(__FILE__) . '/MarkdownInterface.php';
diff --git a/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php
new file mode 100644
index 000000000..8512e3753
--- /dev/null
+++ b/vendor/michelf/php-markdown/Michelf/MarkdownInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Markdown - A text-to-HTML conversion tool for web writers
+ *
+ * @package php-markdown
+ * @author Michel Fortin <michel.fortin@michelf.com>
+ * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
+ * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
+ */
+
+namespace Michelf;
+
+/**
+ * Markdown Parser Interface
+ */
+interface MarkdownInterface {
+ /**
+ * Initialize the parser and return the result of its transform method.
+ * This will work fine for derived classes too.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public static function defaultTransform($text);
+
+ /**
+ * Main function. Performs some preprocessing on the input text
+ * and pass it through the document gamut.
+ *
+ * @api
+ *
+ * @param string $text
+ * @return string
+ */
+ public function transform($text);
+}
diff --git a/vendor/michelf/php-markdown/Readme.md b/vendor/michelf/php-markdown/Readme.md
new file mode 100644
index 000000000..044407106
--- /dev/null
+++ b/vendor/michelf/php-markdown/Readme.md
@@ -0,0 +1,384 @@
+PHP Markdown
+============
+
+PHP Markdown Lib 1.7.0 - 29 Oct 2016
+
+by Michel Fortin
+<https://michelf.ca/>
+
+based on Markdown by John Gruber
+<https://daringfireball.net/>
+
+
+Introduction
+------------
+
+This is a library package that includes the PHP Markdown parser and its
+sibling PHP Markdown Extra with additional features.
+
+Markdown is a text-to-HTML conversion tool for web writers. Markdown
+allows you to write using an easy-to-read, easy-to-write plain text
+format, then convert it to structurally valid XHTML (or HTML).
+
+"Markdown" is actually two things: a plain text markup syntax, and a
+software tool, originally written in Perl, that converts the plain text
+markup to HTML. PHP Markdown is a port to PHP of the original Markdown
+program by John Gruber.
+
+* [Full documentation of the Markdown syntax](<https://daringfireball.net/projects/markdown/>)
+ — Daring Fireball (John Gruber)
+* [Markdown Extra syntax additions](<https://michelf.ca/projects/php-markdown/extra/>)
+ — Michel Fortin
+
+
+Requirement
+-----------
+
+This library package requires PHP 5.3 or later.
+
+Note: The older plugin/library hybrid package for PHP Markdown and
+PHP Markdown Extra is still maintained and will work with PHP 4.0.5 and later.
+
+Before PHP 5.3.7, pcre.backtrack_limit defaults to 100 000, which is too small
+in many situations. You might need to set it to higher values. Later PHP
+releases defaults to 1 000 000, which is usually fine.
+
+
+Usage
+-----
+
+This library package is meant to be used with class autoloading. For autoloading
+to work, your project needs have setup a PSR-0-compatible autoloader. See the
+included Readme.php file for a minimal autoloader setup. (If you cannot use
+autoloading, see below.)
+
+With class autoloading in place, putting the 'Michelf' folder in your
+include path should be enough for this to work:
+
+ use \Michelf\Markdown;
+ $my_html = Markdown::defaultTransform($my_text);
+
+Markdown Extra syntax is also available the same way:
+
+ use \Michelf\MarkdownExtra;
+ $my_html = MarkdownExtra::defaultTransform($my_text);
+
+If you wish to use PHP Markdown with another text filter function
+built to parse HTML, you should filter the text *after* the `transform`
+function call. This is an example with [PHP SmartyPants][psp]:
+
+ use \Michelf\Markdown, \Michelf\SmartyPants;
+ $my_html = Markdown::defaultTransform($my_text);
+ $my_html = SmartyPants::defaultTransform($my_html);
+
+All these examples are using the static `defaultTransform` static function
+found inside the parser class. If you want to customize the parser
+configuration, you can also instantiate it directly and change some
+configuration variables:
+
+ use \Michelf\MarkdownExtra;
+ $parser = new MarkdownExtra;
+ $parser->fn_id_prefix = "post22-";
+ $my_html = $parser->transform($my_text);
+
+To learn more, see the full list of [configuration variables].
+
+ [configuration variables]: https://michelf.ca/projects/php-markdown/configuration/
+
+
+### Usage without an autoloader
+
+If you cannot use class autoloading, you can still use `include` or `require`
+to access the parser. To load the `\Michelf\Markdown` parser, do it this way:
+
+ require_once 'Michelf/Markdown.inc.php';
+
+Or, if you need the `\Michelf\MarkdownExtra` parser:
+
+ require_once 'Michelf/MarkdownExtra.inc.php';
+
+While the plain `.php` files depend on autoloading to work correctly, using the
+`.inc.php` files instead will eagerly load the dependencies that would be
+loaded on demand if you were using autoloading.
+
+
+Public API and Versioning Policy
+---------------------------------
+
+Version numbers are of the form *major*.*minor*.*patch*.
+
+The public API of PHP Markdown consist of the two parser classes `Markdown`
+and `MarkdownExtra`, their constructors, the `transform` and `defaultTransform`
+functions and their configuration variables. The public API is stable for
+a given major version number. It might get additions when the minor version
+number increments.
+
+**Protected members are not considered public API.** This is unconventional
+and deserves an explanation. Incrementing the major version number every time
+the underlying implementation of something changes is going to give
+nonessential version numbers for the vast majority of people who just use the
+parser. Protected members are meant to create parser subclasses that behave in
+different ways. Very few people create parser subclasses. I don't want to
+discourage it by making everything private, but at the same time I can't
+guarantee any stable hook between versions if you use protected members.
+
+**Syntax changes** will increment the minor number for new features, and the
+patch number for small corrections. A *new feature* is something that needs a
+change in the syntax documentation. Note that since PHP Markdown Lib includes
+two parsers, a syntax change for either of them will increment the minor
+number. Also note that there is nothing perfectly backward-compatible with the
+Markdown syntax: all inputs are always valid, so new features always replace
+something that was previously legal, although generally nonsensical to do.
+
+
+Bugs
+----
+
+To file bug reports please send email to:
+<michel.fortin@michelf.ca>
+
+Please include with your report: (1) the example input; (2) the output you
+expected; (3) the output PHP Markdown actually produced.
+
+If you have a problem where Markdown gives you an empty result, first check
+that the backtrack limit is not too low by running `php --info | grep pcre`.
+See Installation and Requirement above for details.
+
+
+Development and Testing
+-----------------------
+
+Pull requests for fixing bugs are welcome. Proposed new features are
+going to be meticulously reviewed -- taking into account backward compatibility,
+potential side effects, and future extensibility -- before deciding on
+acceptance or rejection.
+
+If you make a pull request that includes changes to the parser please add
+tests for what is being changed to [MDTest][] and make a pull request there
+too.
+
+ [MDTest]: https://github.com/michelf/mdtest/
+
+
+Donations
+---------
+
+If you wish to make a donation that will help me devote more time to
+PHP Markdown, please visit [michelf.ca/donate] or send Bitcoin to
+[1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH].
+
+ [michelf.ca/donate]: https://michelf.ca/donate/#!Thanks%20for%20PHP%20Markdown
+ [1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH]: bitcoin:1HiuX34czvVPPdhXbUAsAu7pZcesniDCGH
+
+
+Version History
+---------------
+
+PHP Markdown Lib 1.7.0 (29 Oct 2016)
+
+* Added a `hard_wrap` configuration variable to make all newline characters
+ in the text become `<br>` tags in the HTML output. By default, according
+ to the standard Markdown syntax these newlines are ignored unless they a
+ preceded by two spaces. Thanks to Jonathan Cohlmeyer for the implementation.
+
+* Improved the parsing of list items to fix problematic cases that came to
+ light with the addition of `hard_wrap`. This should have no effect on the
+ output except span-level list items that ended with two spaces (and thus
+ ended with a line break).
+
+* Added a `code_span_content_func` configuration variable which takes a
+ function that will convert the content of the code span to HTML. This can
+ be useful to implement syntax highlighting. Although contrary to its
+ code block equivalent, there is no syntax for specifying a language.
+ Credits to styxit for the implementation.
+
+* Fixed a Markdwon Extra issue where two-space-at-end-of-line hard breaks
+ wouldn't work inside of HTML block elements such as `<p markdown="1">`
+ where the element expects only span-level content.
+
+* In the parser code, switched to PHPDoc comment format. Thanks to
+ Robbie Averill for the help.
+
+
+PHP Markdown Lib 1.6.0 (23 Dec 2015)
+
+Note: this version was incorrectly released as 1.5.1 on Dec 22, a number
+that contradicted the versioning policy.
+
+* For fenced code blocks in Markdown Extra, can now set a class name for the
+ code block's language before the special attribute block. Previously, this
+ class name was only allowed in the absence of the special attribute block.
+
+* Added a `code_block_content_func` configuration variable which takes a
+ function that will convert the content of the code block to HTML. This is
+ most useful for syntax highlighting. For fenced code blocks in Markdown
+ Extra, the function has access to the language class name (the one outside
+ of the special attribute block). Credits to Mario Konrad for providing the
+ implementation.
+
+* The curled arrow character for the backlink in footnotes is now followed
+ by a Unicode variant selector to prevent it from being displayed in emoji
+ form on iOS.
+
+ Note that in older browsers the variant selector is often interpreted as a
+ separate character, making it visible after the arrow. So there is now a
+ also a `fn_backlink_html` configuration variable that can be used to set
+ the link text to something else. Credits to Dana for providing the
+ implementation.
+
+* Fixed an issue in MarkdownExtra where long header lines followed by a
+ special attribute block would hit the backtrack limit an cause an empty
+ string to be returned.
+
+
+PHP Markdown Lib 1.5.0 (1 Mar 2015)
+
+* Added the ability start ordered lists with a number different from 1 and
+ and have that reflected in the HTML output. This can be enabled with
+ the `enhanced_ordered_lists` configuration variable for the Markdown
+ parser; it is enabled by default for Markdown Extra.
+ Credits to Matt Gorle for providing the implementation.
+
+* Added the ability to insert custom HTML attributes with simple values
+ everywhere an extra attribute block is allowed (links, images, headers).
+ The value must be unquoted, cannot contains spaces and is limited to
+ alphanumeric ASCII characters.
+ Credits to Peter Droogmans for providing the implementation.
+
+* Added a `header_id_func` configuration variable which takes a function
+ that can generate an `id` attribute value from the header text.
+ Credits to Evert Pot for providing the implementation.
+
+* Added a `url_filter_func` configuration variable which takes a function
+ that can rewrite any link or image URL to something different.
+
+
+PHP Markdown Lib 1.4.1 (4 May 2014)
+
+* The HTML block parser will now treat `<figure>` as a block-level element
+ (as it should) and no longer wrap it in `<p>` or parse it's content with
+ the as Markdown syntax (although with Extra you can use `markdown="1"`
+ if you wish to use the Markdown syntax inside it).
+
+* The content of `<style>` elements will now be left alone, its content
+ won't be interpreted as Markdown.
+
+* Corrected an bug where some inline links with spaces in them would not
+ work even when surounded with angle brackets:
+
+ [link](<s p a c e s>)
+
+* Fixed an issue where email addresses with quotes in them would not always
+ have the quotes escaped in the link attribute, causing broken links (and
+ invalid HTML).
+
+* Fixed the case were a link definition following a footnote definition would
+ be swallowed by the footnote unless it was separated by a blank line.
+
+
+PHP Markdown Lib 1.4.0 (29 Nov 2013)
+
+* Added support for the `tel:` URL scheme in automatic links.
+
+ <tel:+1-111-111-1111>
+
+ It gets converted to this (note the `tel:` prefix becomes invisible):
+
+ <a href="tel:+1-111-111-1111">+1-111-111-1111</a>
+
+* Added backtick fenced code blocks to MarkdownExtra, originally from
+ Github-Flavored Markdown.
+
+* Added an interface called MarkdownInterface implemented by both
+ the Markdown and MarkdownExtra parsers. You can use the interface if
+ you want to create a mockup parser object for unit testing.
+
+* For those of you who cannot use class autoloading, you can now
+ include `Michelf/Markdown.inc.php` or `Michelf/MarkdownExtra.inc.php` (note
+ the `.inc.php` extension) to automatically include other files required
+ by the parser.
+
+
+PHP Markdown Lib 1.3 (11 Apr 2013)
+
+This is the first release of PHP Markdown Lib. This package requires PHP
+version 5.3 or later and is designed to work with PSR-0 autoloading and,
+optionally with Composer. Here is a list of the changes since
+PHP Markdown Extra 1.2.6:
+
+* Plugin interface for WordPress and other systems is no longer present in
+ the Lib package. The classic package is still available if you need it:
+ <https://michelf.ca/projects/php-markdown/classic/>
+
+* Added `public` and `protected` protection attributes, plus a section about
+ what is "public API" and what isn't in the Readme file.
+
+* Changed HTML output for footnotes: now instead of adding `rel` and `rev`
+ attributes, footnotes links have the class name `footnote-ref` and
+ backlinks `footnote-backref`.
+
+* Fixed some regular expressions to make PCRE not shout warnings about POSIX
+ collation classes (dependent on your version of PCRE).
+
+* Added optional class and id attributes to images and links using the same
+ syntax as for headers:
+
+ [link](url){#id .class}
+ ![img](url){#id .class}
+
+ It work too for reference-style links and images. In this case you need
+ to put those attributes at the reference definition:
+
+ [link][linkref] or [linkref]
+ ![img][linkref]
+
+ [linkref]: url "optional title" {#id .class}
+
+* Fixed a PHP notice message triggered when some table column separator
+ markers are missing on the separator line below column headers.
+
+* Fixed a small mistake that could cause the parser to retain an invalid
+ state related to parsing links across multiple runs. This was never
+ observed (that I know of), but it's still worth fixing.
+
+
+Copyright and License
+---------------------
+
+PHP Markdown Lib
+Copyright (c) 2004-2016 Michel Fortin
+<https://michelf.ca/>
+All rights reserved.
+
+Based on Markdown
+Copyright (c) 2003-2005 John Gruber
+<https://daringfireball.net/>
+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.
diff --git a/vendor/michelf/php-markdown/Readme.php b/vendor/michelf/php-markdown/Readme.php
new file mode 100644
index 000000000..89449dea4
--- /dev/null
+++ b/vendor/michelf/php-markdown/Readme.php
@@ -0,0 +1,31 @@
+<?php
+
+// This file passes the content of the Readme.md file in the same directory
+// through the Markdown filter. You can adapt this sample code in any way
+// you like.
+
+// Install PSR-0-compatible class autoloader
+spl_autoload_register(function($class){
+ require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
+});
+
+// Get Markdown class
+use \Michelf\Markdown;
+
+// Read file and pass content through the Markdown parser
+$text = file_get_contents('Readme.md');
+$html = Markdown::defaultTransform($text);
+
+?>
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>PHP Markdown Lib - Readme</title>
+ </head>
+ <body>
+ <?php
+ // Put HTML content in the document
+ echo $html;
+ ?>
+ </body>
+</html>
diff --git a/vendor/michelf/php-markdown/composer.json b/vendor/michelf/php-markdown/composer.json
new file mode 100644
index 000000000..36a4f744a
--- /dev/null
+++ b/vendor/michelf/php-markdown/composer.json
@@ -0,0 +1,31 @@
+{
+ "name": "michelf/php-markdown",
+ "type": "library",
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
+ "keywords": ["markdown"],
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-0": { "Michelf": "" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ }
+}
diff --git a/vendor/pixel418/markdownify/CHANGELOG.md b/vendor/pixel418/markdownify/CHANGELOG.md
new file mode 100644
index 000000000..a0900fdf5
--- /dev/null
+++ b/vendor/pixel418/markdownify/CHANGELOG.md
@@ -0,0 +1,76 @@
+CHANGELOG
+==============
+
+
+21/09/2016 v2.2.1
+--------------
+
+ * Fix: Moving trailing whitespace from inline elements outside of the element
+ * Feature: Use PSR-4
+ * Feature: PHP 7.0 support in continuous integration
+ * Doc: Update of the README
+
+
+07/09/2016 v2.2.0
+--------------
+
+ * Fix: Reset state between each parsing
+
+
+19/02/2016 v2.1.11
+--------------
+
+ * Fix: Empty table cell conversion
+
+
+10/02/2016 v2.1.10
+--------------
+
+ * Fix: Handle nested table.
+
+
+01/04/2015 v2.1.9
+--------------
+
+ * Fix: Handle HTML breaks & spaces in a less destructive way.
+
+
+26/03/2015 v2.1.8
+--------------
+
+ * Fix: Use alternative italic character
+ * Fix: Handle HTML breaks inside another tag
+ * Fix: Handle HTML spaces around tags
+
+
+07/11/2014 v2.1.7
+--------------
+
+ * Change composer name to "elephant418/markdownify"
+
+
+14/07/2014 v2.1.6
+--------------
+
+ * Fix: Simulate a paragraph for inline text preceding block element
+ * Fix: Nested lists
+ * Fix: setKeepHTML method
+ * Feature: PHP 5.5 & 5.6 support in continuous integration
+
+
+16/03/2014 v2.1.5
+--------------
+
+Add display settings
+
+ * Test: Add tests for footnotes after every paragraph or not
+ * Feature: Allow to display link reference in paragraph, without footnotes
+
+
+27/02/2014 v2.1.4
+--------------
+
+Improve how ConverterExtra handle id & class attributes:
+
+ * Feature: Allow id & class attributes on links
+ * Feature: Allow class attributes on headings \ No newline at end of file
diff --git a/library/markdownify/LICENSE_LGPL.txt b/vendor/pixel418/markdownify/LICENSE
index 5ab7695ab..5ab7695ab 100644
--- a/library/markdownify/LICENSE_LGPL.txt
+++ b/vendor/pixel418/markdownify/LICENSE
diff --git a/vendor/pixel418/markdownify/README.md b/vendor/pixel418/markdownify/README.md
new file mode 100644
index 000000000..8855b0d05
--- /dev/null
+++ b/vendor/pixel418/markdownify/README.md
@@ -0,0 +1,63 @@
+# Markdownify
+
+[![Build Status](https://travis-ci.org/Elephant418/Markdownify.png?branch=master)](https://travis-ci.org/Elephant418/Markdownify?branch=master)
+[![Total Downloads](https://poser.pugx.org/pixel418/markdownify/downloads)](https://packagist.org/packages/pixel418/markdownify)
+[![License LGPL](https://poser.pugx.org/pixel418/markdownify/license)](https://opensource.org/licenses/lgpl-2.1.php)
+
+The HTML to Markdown converter for PHP
+
+[Code example](#code-example) | [How to Install](#how-to-install) | [How to Contribute](#how-to-contribute) | [Author & Community](#author--community)
+
+
+
+Code example
+--------
+
+### Markdown
+
+```php
+$converter = new Markdownify\Converter;
+$converter->parseString('<h1>Heading</h1>');
+// Returns: # Heading
+```
+
+### Markdown Extra [as defined by @michelf](http://michelf.ca/projects/php-markdown/extra/)
+
+```php
+$converter = new Markdownify\ConverterExtra;
+$converter->parseString('<h1 id="md">Heading</h1>');
+// Returns: # Heading {#md}
+```
+
+
+
+How to Install
+--------
+
+This library package requires `PHP 5.3` or later.<br>
+Install [Composer](http://getcomposer.org/doc/01-basic-usage.md#installation) and run the following command to get the latest version:
+
+```sh
+composer require pixel418/markdownify
+```
+
+
+
+How to Contribute
+--------
+
+1. Fork the Markdownify repository
+2. Create a new branch for each feature or improvement
+3. Send a pull request from each feature branch to the **v2.x** branch
+
+If you don't know much about pull request, you can read [the Github article](https://help.github.com/articles/using-pull-requests)
+
+
+
+Author & Community
+--------
+
+Markdownify is under [LGPL License](http://opensource.org/licenses/LGPL-2.1)<br>
+It was created by [Milian Wolff](http://milianw.de)<br>
+It was converted to a Symfony Bundle by [Peter Kruithof](https://github.com/pkruithof)<br>
+It is maintained by [Thomas ZILLIOX](http://tzi.fr)
diff --git a/vendor/pixel418/markdownify/composer.json b/vendor/pixel418/markdownify/composer.json
new file mode 100644
index 000000000..71d9f3565
--- /dev/null
+++ b/vendor/pixel418/markdownify/composer.json
@@ -0,0 +1,38 @@
+{
+ "name": "pixel418/markdownify",
+ "type": "lib",
+ "description": "The HTML to Markdown converter for PHP ",
+ "keywords": ["markdown", "markdownify"],
+ "license": "LGPL",
+ "homepage": "https://github.com/elephant418/Markdownify",
+ "authors": [
+ {
+ "name": "Milian Wolff",
+ "email": "mail@milianw.de",
+ "homepage": "http://milianw.de"
+
+ },
+ {
+ "name": "Peter Kruithof",
+ "email": "pkruithof@gmail.com",
+ "homepage": "http://pkruithof.tumblr.com/"
+ },
+ {
+ "name": "Thomas Zilliox",
+ "email": "hello@tzi.fr",
+ "homepage": "http://tzi.fr"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8"
+ },
+ "autoload": {
+ "psr-4": {
+ "Markdownify\\": "src",
+ "Test\\Markdownify\\": "test"
+ }
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/Converter.php b/vendor/pixel418/markdownify/src/Converter.php
new file mode 100644
index 000000000..77c62dc7e
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/Converter.php
@@ -0,0 +1,1400 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+/**
+ * default configuration
+ */
+define('MDFY_BODYWIDTH', false);
+define('MDFY_KEEPHTML', true);
+
+/**
+ * HTML to Markdown converter class
+ */
+class Converter
+{
+ /**
+ * html parser object
+ *
+ * @var parseHTML
+ */
+ protected $parser;
+
+ /**
+ * markdown output
+ *
+ * @var string
+ */
+ protected $output;
+
+ /**
+ * stack with tags which where not converted to html
+ *
+ * @var array<string>
+ */
+ protected $notConverted = array();
+
+ /**
+ * skip conversion to markdown
+ *
+ * @var bool
+ */
+ protected $skipConversion = false;
+
+ /* options */
+
+ /**
+ * keep html tags which cannot be converted to markdown
+ *
+ * @var bool
+ */
+ protected $keepHTML = false;
+
+ /**
+ * wrap output, set to 0 to skip wrapping
+ *
+ * @var int
+ */
+ protected $bodyWidth = 0;
+
+ /**
+ * minimum body width
+ *
+ * @var int
+ */
+ protected $minBodyWidth = 25;
+
+ /**
+ * position where the link reference will be displayed
+ *
+ *
+ * @var int
+ */
+ protected $linkPosition;
+ const LINK_AFTER_CONTENT = 0;
+ const LINK_AFTER_PARAGRAPH = 1;
+ const LINK_IN_PARAGRAPH = 2;
+
+ /**
+ * stores current buffers
+ *
+ * @var array<string>
+ */
+ protected $buffer = array();
+
+ /**
+ * stores current buffers
+ *
+ * @var array<string>
+ */
+ protected $footnotes = array();
+
+ /**
+ * tags with elements which can be handled by markdown
+ *
+ * @var array<string>
+ */
+ protected $isMarkdownable = array(
+ 'p' => array(),
+ 'ul' => array(),
+ 'ol' => array(),
+ 'li' => array(),
+ 'br' => array(),
+ 'blockquote' => array(),
+ 'code' => array(),
+ 'pre' => array(),
+ 'a' => array(
+ 'href' => 'required',
+ 'title' => 'optional',
+ ),
+ 'strong' => array(),
+ 'b' => array(),
+ 'em' => array(),
+ 'i' => array(),
+ 'img' => array(
+ 'src' => 'required',
+ 'alt' => 'optional',
+ 'title' => 'optional',
+ ),
+ 'h1' => array(),
+ 'h2' => array(),
+ 'h3' => array(),
+ 'h4' => array(),
+ 'h5' => array(),
+ 'h6' => array(),
+ 'hr' => array(),
+ );
+
+ /**
+ * html tags to be ignored (contents will be parsed)
+ *
+ * @var array<string>
+ */
+ protected $ignore = array(
+ 'html',
+ 'body',
+ );
+
+ /**
+ * html tags to be dropped (contents will not be parsed!)
+ *
+ * @var array<string>
+ */
+ protected $drop = array(
+ 'script',
+ 'head',
+ 'style',
+ 'form',
+ 'area',
+ 'object',
+ 'param',
+ 'iframe',
+ );
+
+ /**
+ * html block tags that allow inline & block children
+ *
+ * @var array<string>
+ */
+ protected $allowMixedChildren = array(
+ 'li'
+ );
+
+ /**
+ * Markdown indents which could be wrapped
+ * @note: use strings in regex format
+ *
+ * @var array<string>
+ */
+ protected $wrappableIndents = array(
+ '\* ', // ul
+ '\d. ', // ol
+ '\d\d. ', // ol
+ '> ', // blockquote
+ '', // p
+ );
+
+ /**
+ * list of chars which have to be escaped in normal text
+ * @note: use strings in regex format
+ *
+ * @var array
+ *
+ * TODO: what's with block chars / sequences at the beginning of a block?
+ */
+ protected $escapeInText = array(
+ '\*\*([^*]+)\*\*' => '\*\*$1\*\*', // strong
+ '\*([^*]+)\*' => '\*$1\*', // em
+ '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', // strong
+ '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', // em
+ '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0', // hr
+ '`' => '\`', // code
+ '\[(.+)\](\s*\()' => '\[$1\]$2', // links: [text] (url) => [text\] (url)
+ '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', // links: [text][id] => [text\][id\]
+ '^#(#{0,5}) ' => '\#$1 ', // header
+ );
+
+ /**
+ * wether last processed node was a block tag or not
+ *
+ * @var bool
+ */
+ protected $lastWasBlockTag = false;
+
+ /**
+ * name of last closed tag
+ *
+ * @var string
+ */
+ protected $lastClosedTag = '';
+
+ /**
+ * number of line breaks before next inline output
+ */
+ protected $lineBreaks = 0;
+
+ /**
+ * node stack, e.g. for <a> and <abbr> tags
+ *
+ * @var array<array>
+ */
+ protected $stack = array();
+
+ /**
+ * current indentation
+ *
+ * @var string
+ */
+ protected $indent = '';
+
+ /**
+ * constructor, set options, setup parser
+ *
+ * @param int $linkPosition define the position of links
+ * @param int $bodyWidth whether or not to wrap the output to the given width
+ * defaults to false
+ * @param bool $keepHTML whether to keep non markdownable HTML or to discard it
+ * defaults to true (HTML will be kept)
+ * @return void
+ */
+ public function __construct($linkPosition = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
+ {
+ $this->linkPosition = $linkPosition;
+ $this->keepHTML = $keepHTML;
+
+ if ($bodyWidth > $this->minBodyWidth) {
+ $this->bodyWidth = intval($bodyWidth);
+ } else {
+ $this->bodyWidth = false;
+ }
+
+ $this->parser = new Parser;
+ $this->parser->noTagsInCode = true;
+
+ // we don't have to do this every time
+ $search = array();
+ $replace = array();
+ foreach ($this->escapeInText as $s => $r) {
+ array_push($search, '@(?<!\\\)' . $s . '@U');
+ array_push($replace, $r);
+ }
+ $this->escapeInText = array(
+ 'search' => $search,
+ 'replace' => $replace
+ );
+ }
+
+ /**
+ * parse a HTML string
+ *
+ * @param string $html
+ * @return string markdown formatted
+ */
+ public function parseString($html)
+ {
+ $this->resetState();
+
+ $this->parser->html = $html;
+ $this->parse();
+
+ return $this->output;
+ }
+
+ /**
+ * set the position where the link reference will be displayed
+ *
+ * @param int $linkPosition
+ * @return void
+ */
+ public function setLinkPosition($linkPosition)
+ {
+ $this->linkPosition = $linkPosition;
+ }
+
+ /**
+ * set keep HTML tags which cannot be converted to markdown
+ *
+ * @param bool $linkPosition
+ * @return void
+ */
+ public function setKeepHTML($keepHTML)
+ {
+ $this->keepHTML = $keepHTML;
+ }
+
+ /**
+ * iterate through the nodes and decide what we
+ * shall do with the current node
+ *
+ * @param void
+ * @return void
+ */
+ protected function parse()
+ {
+ $this->output = '';
+ // drop tags
+ $this->parser->html = preg_replace('#<(' . implode('|', $this->drop) . ')[^>]*>.*</\\1>#sU', '', $this->parser->html);
+ while ($this->parser->nextNode()) {
+ switch ($this->parser->nodeType) {
+ case 'doctype':
+ break;
+ case 'pi':
+ case 'comment':
+ if ($this->keepHTML) {
+ $this->flushLinebreaks();
+ $this->out($this->parser->node);
+ $this->setLineBreaks(2);
+ }
+ // else drop
+ break;
+ case 'text':
+ $this->handleText();
+ break;
+ case 'tag':
+ if (in_array($this->parser->tagName, $this->ignore)) {
+ break;
+ }
+ // If the previous tag was not a block element, we simulate a paragraph tag
+ if ($this->parser->isBlockElement && $this->parser->isNextToInlineContext && !in_array($this->parent(), $this->allowMixedChildren)) {
+ $this->setLineBreaks(2);
+ }
+ if ($this->parser->isStartTag) {
+ $this->flushLinebreaks();
+ }
+ if ($this->skipConversion) {
+ $this->isMarkdownable(); // update notConverted
+ $this->handleTagToText();
+ continue;
+ }
+
+ // block elements
+ if (!$this->parser->keepWhitespace && $this->parser->isBlockElement) {
+ $this->fixBlockElementSpacing();
+ }
+
+ // inline elements
+ if (!$this->parser->keepWhitespace && $this->parser->isInlineContext) {
+ $this->fixInlineElementSpacing();
+ }
+
+ if ($this->isMarkdownable()) {
+ if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
+ if (!empty($this->buffer)) {
+ $str =& $this->buffer[count($this->buffer) - 1];
+ } else {
+ $str =& $this->output;
+ }
+ if (substr($str, -strlen($this->indent) - 1) != "\n" . $this->indent) {
+ $str .= "\n" . $this->indent;
+ }
+ }
+ $func = 'handleTag_' . $this->parser->tagName;
+ $this->$func();
+ if ($this->linkPosition == self::LINK_AFTER_PARAGRAPH && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
+ $this->flushFootnotes();
+ }
+ if (!$this->parser->isStartTag) {
+ $this->lastClosedTag = $this->parser->tagName;
+ }
+ } else {
+ $this->handleTagToText();
+ $this->lastClosedTag = '';
+ }
+ break;
+ default:
+ trigger_error('invalid node type', E_USER_ERROR);
+ break;
+ }
+ $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
+ }
+ if (!empty($this->buffer)) {
+ // trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
+ while (!empty($this->buffer)) {
+ $this->out($this->unbuffer());
+ }
+ }
+ // cleanup
+ $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
+ // end parsing, flush stacked tags
+ $this->flushFootnotes();
+ $this->stack = array();
+ }
+
+ /**
+ * check if current tag can be converted to Markdown
+ *
+ * @param void
+ * @return bool
+ */
+ protected function isMarkdownable()
+ {
+ if (!isset($this->isMarkdownable[$this->parser->tagName])) {
+ // simply not markdownable
+
+ return false;
+ }
+ if ($this->parser->isStartTag) {
+ $return = true;
+ if ($this->keepHTML) {
+ $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
+ if (!empty($diff)) {
+ // non markdownable attributes given
+ $return = false;
+ }
+ }
+ if ($return) {
+ foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
+ if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
+ // required markdown attribute not given
+ $return = false;
+ break;
+ }
+ }
+ }
+ if (!$return) {
+ array_push($this->notConverted, $this->parser->tagName . '::' . implode('/', $this->parser->openTags));
+ }
+
+ return $return;
+ } else {
+ if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
+ array_pop($this->notConverted);
+
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ /**
+ * output footnotes
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushFootnotes()
+ {
+ $out = false;
+ foreach ($this->footnotes as $k => $tag) {
+ if (!isset($tag['unstacked'])) {
+ if (!$out) {
+ $out = true;
+ $this->out("\n\n", true);
+ } else {
+ $this->out("\n", true);
+ }
+ $this->out(' [' . $tag['linkID'] . ']: ' . $this->getLinkReference($tag), true);
+ $tag['unstacked'] = true;
+ $this->footnotes[$k] = $tag;
+ }
+ }
+ }
+
+ /**
+ * return formated link reference
+ *
+ * @param array $tag
+ * @return string link reference
+ */
+ protected function getLinkReference($tag)
+ {
+ return $tag['href'] . (isset($tag['title']) ? ' "' . $tag['title'] . '"' : '');
+ }
+
+ /**
+ * flush enqued linebreaks
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushLinebreaks()
+ {
+ if ($this->lineBreaks && !empty($this->output)) {
+ $this->out(str_repeat("\n" . $this->indent, $this->lineBreaks), true);
+ }
+ $this->lineBreaks = 0;
+ }
+
+ /**
+ * handle non Markdownable tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTagToText()
+ {
+ if (!$this->keepHTML) {
+ if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
+ $this->setLineBreaks(2);
+ }
+ } else {
+ // dont convert to markdown inside this tag
+ /** TODO: markdown extra **/
+ if (!$this->parser->isEmptyTag) {
+ if ($this->parser->isStartTag) {
+ if (!$this->skipConversion) {
+ $this->skipConversion = $this->parser->tagName . '::' . implode('/', $this->parser->openTags);
+ }
+ } else {
+ if ($this->skipConversion == $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
+ $this->skipConversion = false;
+ }
+ }
+ }
+
+ if ($this->parser->isBlockElement) {
+ if ($this->parser->isStartTag) {
+ // looks like ins or del are block elements now
+ if (in_array($this->parent(), array('ins', 'del'))) {
+ $this->out("\n", true);
+ $this->indent(' ');
+ }
+ // don't indent inside <pre> tags
+ if ($this->parser->tagName == 'pre') {
+ $this->out($this->parser->node);
+ static $indent;
+ $indent = $this->indent;
+ $this->indent = '';
+ } else {
+ $this->out($this->parser->node . "\n" . $this->indent);
+ if (!$this->parser->isEmptyTag) {
+ $this->indent(' ');
+ } else {
+ $this->setLineBreaks(1);
+ }
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ } else {
+ if (!$this->parser->keepWhitespace) {
+ $this->output = rtrim($this->output);
+ }
+ if ($this->parser->tagName != 'pre') {
+ $this->indent(' ');
+ $this->out("\n" . $this->indent . $this->parser->node);
+ } else {
+ // reset indentation
+ $this->out($this->parser->node);
+ static $indent;
+ $this->indent = $indent;
+ }
+
+ if (in_array($this->parent(), array('ins', 'del'))) {
+ // ins or del was block element
+ $this->out("\n");
+ $this->indent(' ');
+ }
+ if ($this->parser->tagName == 'li') {
+ $this->setLineBreaks(1);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ }
+ } else {
+ $this->out($this->parser->node);
+ }
+ if (in_array($this->parser->tagName, array('code', 'pre'))) {
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ } else {
+ // add stuff so cleanup just reverses this
+ $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
+ }
+ }
+ }
+ }
+
+ /**
+ * handle plain text
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleText()
+ {
+ if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
+ $this->parser->node = str_replace("\n", "\n" . $this->indent, $this->parser->node);
+ }
+ if (!$this->hasParent('code') && !$this->hasParent('pre')) {
+ // entity decode
+ $this->parser->node = $this->decode($this->parser->node);
+ if (!$this->skipConversion) {
+ // escape some chars in normal Text
+ $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
+ }
+ } else {
+ $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
+ }
+ $this->out($this->parser->node);
+ $this->lastClosedTag = '';
+ }
+
+ /**
+ * handle <em> and <i> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_em()
+ {
+ $this->out('_', true);
+ }
+
+ protected function handleTag_i()
+ {
+ $this->handleTag_em();
+ }
+
+ /**
+ * handle <strong> and <b> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_strong()
+ {
+ $this->out('**', true);
+ }
+
+ protected function handleTag_b()
+ {
+ $this->handleTag_strong();
+ }
+
+ /**
+ * handle <h1> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h1()
+ {
+ $this->handleHeader(1);
+ }
+
+ /**
+ * handle <h2> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h2()
+ {
+ $this->handleHeader(2);
+ }
+
+ /**
+ * handle <h3> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h3()
+ {
+ $this->handleHeader(3);
+ }
+
+ /**
+ * handle <h4> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h4()
+ {
+ $this->handleHeader(4);
+ }
+
+ /**
+ * handle <h5> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h5()
+ {
+ $this->handleHeader(5);
+ }
+
+ /**
+ * handle <h6> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_h6()
+ {
+ $this->handleHeader(6);
+ }
+
+ /**
+ * handle header tags (<h1> - <h6>)
+ *
+ * @param int $level 1-6
+ * @return void
+ */
+ protected function handleHeader($level)
+ {
+ if ($this->parser->isStartTag) {
+ $this->out(str_repeat('#', $level) . ' ', true);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <p> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_p()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <a> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a()
+ {
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ $this->handleTag_a_parser();
+ $this->stack();
+ } else {
+ $tag = $this->unstack();
+ $buffer = $this->unbuffer();
+ $this->handleTag_a_converter($tag, $buffer);
+ $this->out($this->handleTag_a_converter($tag, $buffer), true);
+ }
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a_parser()
+ {
+ if (isset($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+ } else {
+ $this->parser->tagAttributes['title'] = null;
+ }
+ $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
+ }
+
+ /**
+ * handle <a> tags conversion
+ *
+ * @param array $tag
+ * @param string $buffer
+ * @return string The markdownified link
+ */
+ protected function handleTag_a_converter($tag, $buffer)
+ {
+ if (empty($tag['href']) && empty($tag['title'])) {
+ // empty links... testcase mania, who would possibly do anything like that?!
+ return '[' . $buffer . ']()';
+ }
+
+ if ($buffer == $tag['href'] && empty($tag['title'])) {
+ // <http://example.com>
+ return '<' . $buffer . '>';
+ }
+
+ $bufferDecoded = $this->decode(trim($buffer));
+ if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:' . $bufferDecoded == $tag['href']) {
+ if (is_null($tag['title'])) {
+ // <mail@example.com>
+ return '<' . $bufferDecoded . '>';
+ }
+ // [mail@example.com][1]
+ // ...
+ // [1]: mailto:mail@example.com Title
+ $tag['href'] = 'mailto:' . $bufferDecoded;
+ }
+
+ if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
+ return '[' . $buffer . '](' . $this->getLinkReference($tag) . ')';
+ }
+
+ // [This link][id]
+ foreach ($this->footnotes as $tag2) {
+ if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
+ $tag['linkID'] = $tag2['linkID'];
+ break;
+ }
+ }
+ if (!isset($tag['linkID'])) {
+ $tag['linkID'] = count($this->footnotes) + 1;
+ array_push($this->footnotes, $tag);
+ }
+
+ return '[' . $buffer . '][' . $tag['linkID'] . ']';
+ }
+
+ /**
+ * handle <img /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_img()
+ {
+ if (!$this->parser->isStartTag) {
+ return; // just to be sure this is really an empty tag...
+ }
+
+ if (isset($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
+ } else {
+ $this->parser->tagAttributes['title'] = null;
+ }
+ if (isset($this->parser->tagAttributes['alt'])) {
+ $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
+ } else {
+ $this->parser->tagAttributes['alt'] = null;
+ }
+
+ if (empty($this->parser->tagAttributes['src'])) {
+ // support for "empty" images... dunno if this is really needed
+ // but there are some test cases which do that...
+ if (!empty($this->parser->tagAttributes['title'])) {
+ $this->parser->tagAttributes['title'] = ' ' . $this->parser->tagAttributes['title'] . ' ';
+ }
+ $this->out('![' . $this->parser->tagAttributes['alt'] . '](' . $this->parser->tagAttributes['title'] . ')', true);
+
+ return;
+ } else {
+ $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
+ }
+
+ $out = '![' . $this->parser->tagAttributes['alt'] . ']';
+ if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
+ $out .= '(' . $this->parser->tagAttributes['src'];
+ if ($this->parser->tagAttributes['title']) {
+ $out .= ' "' . $this->parser->tagAttributes['title'] . '"';
+ }
+ $out .= ')';
+ $this->out($out, true);
+ return;
+ }
+
+ // ![This image][id]
+ $link_id = false;
+ if (!empty($this->footnotes)) {
+ foreach ($this->footnotes as $tag) {
+ if ($tag['href'] == $this->parser->tagAttributes['src']
+ && $tag['title'] === $this->parser->tagAttributes['title']
+ ) {
+ $link_id = $tag['linkID'];
+ break;
+ }
+ }
+ }
+ if (!$link_id) {
+ $link_id = count($this->footnotes) + 1;
+ $tag = array(
+ 'href' => $this->parser->tagAttributes['src'],
+ 'linkID' => $link_id,
+ 'title' => $this->parser->tagAttributes['title']
+ );
+ array_push($this->footnotes, $tag);
+ }
+ $out .= '[' . $link_id . ']';
+
+ $this->out($out, true);
+ }
+
+ /**
+ * handle <code> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_code()
+ {
+ if ($this->hasParent('pre')) {
+ // ignore code blocks inside <pre>
+
+ return;
+ }
+ if ($this->parser->isStartTag) {
+ $this->buffer();
+ } else {
+ $buffer = $this->unbuffer();
+ // use as many backticks as needed
+ preg_match_all('#`+#', $buffer, $matches);
+ if (!empty($matches[0])) {
+ rsort($matches[0]);
+
+ $ticks = '`';
+ while (true) {
+ if (!in_array($ticks, $matches[0])) {
+ break;
+ }
+ $ticks .= '`';
+ }
+ } else {
+ $ticks = '`';
+ }
+ if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
+ $buffer = ' ' . $buffer . ' ';
+ }
+ $this->out($ticks . $buffer . $ticks, true);
+ }
+ }
+
+ /**
+ * handle <pre> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_pre()
+ {
+ if ($this->keepHTML && $this->parser->isStartTag) {
+ // check if a simple <code> follows
+ if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
+ // this is no standard markdown code block
+ $this->handleTagToText();
+
+ return;
+ }
+ }
+ $this->indent(' ');
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ } else {
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ }
+
+ /**
+ * handle <blockquote> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_blockquote()
+ {
+ $this->indent('> ');
+ }
+
+ /**
+ * handle <ul> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_ul()
+ {
+ if ($this->parser->isStartTag) {
+ $this->stack();
+ if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
+ $this->out("\n" . $this->indent . '<!-- -->' . "\n" . $this->indent . "\n" . $this->indent);
+ }
+ } else {
+ $this->unstack();
+ if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
+ // dont make Markdown add unneeded paragraphs
+ $this->setLineBreaks(2);
+ }
+ }
+ }
+
+ /**
+ * handle <ul> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_ol()
+ {
+ // same as above
+ $this->parser->tagAttributes['num'] = 0;
+ $this->handleTag_ul();
+ }
+
+ /**
+ * handle <li> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_li()
+ {
+ if ($this->parent() == 'ol') {
+ $parent =& $this->getStacked('ol');
+ if ($this->parser->isStartTag) {
+ $parent['num']++;
+ $this->out(str_repeat(' ', 3 - strlen($parent['num'])) . $parent['num'] . '. ', true);
+ }
+ } else {
+ if ($this->parser->isStartTag) {
+ $this->out(' * ', true);
+ }
+ }
+ $this->indent(' ', false);
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(1);
+ }
+ }
+
+ /**
+ * handle <hr /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_hr()
+ {
+ if (!$this->parser->isStartTag) {
+ return; // just to be sure this really is an empty tag
+ }
+ $this->out('* * *', true);
+ $this->setLineBreaks(2);
+ }
+
+ /**
+ * handle <br /> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_br()
+ {
+ $this->out(" \n" . $this->indent, true);
+ $this->parser->html = ltrim($this->parser->html);
+ }
+
+ /**
+ * add current node to the stack
+ * this only stores the attributes
+ *
+ * @param void
+ * @return void
+ */
+ protected function stack()
+ {
+ if (!isset($this->stack[$this->parser->tagName])) {
+ $this->stack[$this->parser->tagName] = array();
+ }
+ array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
+ }
+
+ /**
+ * remove current tag from stack
+ *
+ * @param void
+ * @return array
+ */
+ protected function unstack()
+ {
+ if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
+ trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
+ }
+
+ return array_pop($this->stack[$this->parser->tagName]);
+ }
+
+ /**
+ * get last stacked element of type $tagName
+ *
+ * @param string $tagName
+ * @return array
+ */
+ protected function &getStacked($tagName)
+ {
+ // no end() so it can be referenced
+ return $this->stack[$tagName][count($this->stack[$tagName]) - 1];
+ }
+
+ /**
+ * set number of line breaks before next start tag
+ *
+ * @param int $number
+ * @return void
+ */
+ protected function setLineBreaks($number)
+ {
+ if ($this->lineBreaks < $number) {
+ $this->lineBreaks = $number;
+ }
+ }
+
+ /**
+ * buffer next parser output until unbuffer() is called
+ *
+ * @param void
+ * @return void
+ */
+ protected function buffer()
+ {
+ array_push($this->buffer, '');
+ }
+
+ /**
+ * end current buffer and return buffered output
+ *
+ * @param void
+ * @return string
+ */
+ protected function unbuffer()
+ {
+ return array_pop($this->buffer);
+ }
+
+ /**
+ * append string to the correct var, either
+ * directly to $this->output or to the current
+ * buffers
+ *
+ * @param string $put
+ * @param boolean $nowrap
+ * @return void
+ */
+ protected function out($put, $nowrap = false)
+ {
+ if (empty($put)) {
+ return;
+ }
+ if (!empty($this->buffer)) {
+ $this->buffer[count($this->buffer) - 1] .= $put;
+ } else {
+ if ($this->bodyWidth && !$this->parser->keepWhitespace) { // wrap lines
+ // get last line
+ $pos = strrpos($this->output, "\n");
+ if ($pos === false) {
+ $line = $this->output;
+ } else {
+ $line = substr($this->output, $pos);
+ }
+
+ if ($nowrap) {
+ if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
+ $this->output .= "\n" . $this->indent . $put;
+ } else {
+ $this->output .= $put;
+ }
+
+ return;
+ } else {
+ $put .= "\n"; // make sure we get all lines in the while below
+ $lineLen = $this->strlen($line);
+ while ($pos = strpos($put, "\n")) {
+ $putLine = substr($put, 0, $pos + 1);
+ $put = substr($put, $pos + 1);
+ $putLen = $this->strlen($putLine);
+ if ($lineLen + $putLen < $this->bodyWidth) {
+ $this->output .= $putLine;
+ $lineLen = $putLen;
+ } else {
+ $split = preg_split('#^(.{0,' . ($this->bodyWidth - $lineLen) . '})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
+ $this->output .= rtrim($split[1][0]) . "\n" . $this->indent . $this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n" . $this->indent, false);
+ }
+ }
+ $this->output = substr($this->output, 0, -1);
+
+ return;
+ }
+ } else {
+ $this->output .= $put;
+ }
+ }
+ }
+
+ /**
+ * indent next output (start tag) or unindent (end tag)
+ *
+ * @param string $str indentation
+ * @param bool $output add indendation to output
+ * @return void
+ */
+ protected function indent($str, $output = true)
+ {
+ if ($this->parser->isStartTag) {
+ $this->indent .= $str;
+ if ($output) {
+ $this->out($str, true);
+ }
+ } else {
+ $this->indent = substr($this->indent, 0, -strlen($str));
+ }
+ }
+
+ /**
+ * decode email addresses
+ *
+ * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
+ * @author Milian Wolff <http://milianw.de>
+ */
+ protected function decode($text, $quote_style = ENT_QUOTES)
+ {
+ return htmlspecialchars_decode($text, $quote_style);
+ }
+
+ /**
+ * callback for decode() which converts a hexadecimal entity to UTF-8
+ *
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function _decode_hex($matches)
+ {
+ return $this->unichr(hexdec($matches[1]));
+ }
+
+ /**
+ * callback for decode() which converts a numerical entity to UTF-8
+ *
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function _decode_numeric($matches)
+ {
+ return $this->unichr($matches[1]);
+ }
+
+ /**
+ * UTF-8 chr() which supports numeric entities
+ *
+ * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
+ * @param array $matches
+ * @return string UTF-8 encoded
+ */
+ protected function unichr($dec)
+ {
+ if ($dec < 128) {
+ $utf = chr($dec);
+ } elseif ($dec < 2048) {
+ $utf = chr(192 + (($dec - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ } else {
+ $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
+ $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
+ $utf .= chr(128 + ($dec % 64));
+ }
+
+ return $utf;
+ }
+
+ /**
+ * UTF-8 strlen()
+ *
+ * @param string $str
+ * @return int
+ *
+ * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
+ * @author Milian Wolff <http://milianw.de>
+ */
+ protected function strlen($str)
+ {
+ if (function_exists('mb_strlen')) {
+ return mb_strlen($str, 'UTF-8');
+ } else {
+ return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
+ }
+ }
+
+ /**
+ * wordwrap for utf8 encoded strings
+ *
+ * @param string $str
+ * @param integer $len
+ * @param string $what
+ * @return string
+ */
+ protected function wordwrap($str, $width, $break, $cut = false)
+ {
+ if (!$cut) {
+ $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,' . $width . '}\b#';
+ } else {
+ $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){' . $width . '}#';
+ }
+ $return = '';
+ while (preg_match($regexp, $str, $matches)) {
+ $string = $matches[0];
+ $str = ltrim(substr($str, strlen($string)));
+ if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
+ $string .= $str[0];
+ $str = ltrim(substr($str, 1));
+ }
+ $return .= $string . $break;
+ }
+
+ return $return . ltrim($str);
+ }
+
+ /**
+ * check if current node has a $tagName as parent (somewhere, not only the direct parent)
+ *
+ * @param string $tagName
+ * @return bool
+ */
+ protected function hasParent($tagName)
+ {
+ return in_array($tagName, $this->parser->openTags);
+ }
+
+ /**
+ * get tagName of direct parent tag
+ *
+ * @param void
+ * @return string $tagName
+ */
+ protected function parent()
+ {
+ return end($this->parser->openTags);
+ }
+
+ /**
+ * Trims whitespace in block-level elements, on the left side.
+ */
+ protected function fixBlockElementSpacing()
+ {
+ if ($this->parser->isStartTag) {
+ $this->parser->html = ltrim($this->parser->html);
+ }
+ }
+
+ /**
+ * Moves leading/trailing whitespace from inline elements outside of the
+ * element. This is to fix cases like `<strong> Text</strong>`, which if
+ * converted to `** strong**` would be incorrect Markdown.
+ *
+ * Examples:
+ *
+ * * leading: `<strong> Text</strong>` becomes ` <strong>Text</strong>`
+ * * trailing: `<strong>Text </strong>` becomes `<strong>Text</strong> `
+ */
+ protected function fixInlineElementSpacing()
+ {
+ if ($this->parser->isStartTag) {
+ // move spaces after the start element to before the element
+ if (preg_match('~^(\s+)~', $this->parser->html, $matches)) {
+ $this->out($matches[1]);
+ $this->parser->html = ltrim($this->parser->html, " \t\0\x0B");
+ }
+ } else {
+ if (!empty($this->buffer)) {
+ $str =& $this->buffer[count($this->buffer) - 1];
+ } else {
+ $str =& $this->output;
+ }
+
+ // move spaces before the end element to after the element
+ if (preg_match('~(\s+)$~', $str, $matches)) {
+ $str = rtrim($str, " \t\0\x0B");
+ $this->parser->html = $matches[1] . $this->parser->html;
+ }
+ }
+ }
+
+ /**
+ * Resetting the state forces the instance to behave as a fresh instance.
+ * Ideal for running within a loop where you want to maintain a single instance.
+ */
+ protected function resetState()
+ {
+ $this->notConverted = array();
+ $this->skipConversion = false;
+ $this->buffer = array();
+ $this->indent = '';
+ $this->stack = array();
+ $this->lineBreaks = 0;
+ $this->lastClosedTag = '';
+ $this->lastWasBlockTag = false;
+ $this->footnotes = array();
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/ConverterExtra.php b/vendor/pixel418/markdownify/src/ConverterExtra.php
new file mode 100644
index 000000000..733955448
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/ConverterExtra.php
@@ -0,0 +1,573 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+class ConverterExtra extends Converter
+{
+
+ /**
+ * table data, including rows with content and the maximum width of each col
+ *
+ * @var array
+ */
+ protected $table = array();
+
+ /**
+ * current col
+ *
+ * @var int
+ */
+ protected $col = -1;
+
+ /**
+ * current row
+ *
+ * @var int
+ */
+ protected $row = 0;
+
+ /**
+ * constructor, see Markdownify::Markdownify() for more information
+ */
+ public function __construct($linksAfterEachParagraph = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
+ {
+ parent::__construct($linksAfterEachParagraph, $bodyWidth, $keepHTML);
+
+ // new markdownable tags & attributes
+ // header ids: # foo {bar}
+ $this->isMarkdownable['h1']['id'] = 'optional';
+ $this->isMarkdownable['h1']['class'] = 'optional';
+ $this->isMarkdownable['h2']['id'] = 'optional';
+ $this->isMarkdownable['h2']['class'] = 'optional';
+ $this->isMarkdownable['h3']['id'] = 'optional';
+ $this->isMarkdownable['h3']['class'] = 'optional';
+ $this->isMarkdownable['h4']['id'] = 'optional';
+ $this->isMarkdownable['h4']['class'] = 'optional';
+ $this->isMarkdownable['h5']['id'] = 'optional';
+ $this->isMarkdownable['h5']['class'] = 'optional';
+ $this->isMarkdownable['h6']['id'] = 'optional';
+ $this->isMarkdownable['h6']['class'] = 'optional';
+ // tables
+ $this->isMarkdownable['table'] = array();
+ $this->isMarkdownable['th'] = array(
+ 'align' => 'optional',
+ );
+ $this->isMarkdownable['td'] = array(
+ 'align' => 'optional',
+ );
+ $this->isMarkdownable['tr'] = array();
+ array_push($this->ignore, 'thead');
+ array_push($this->ignore, 'tbody');
+ array_push($this->ignore, 'tfoot');
+ // definition lists
+ $this->isMarkdownable['dl'] = array();
+ $this->isMarkdownable['dd'] = array();
+ $this->isMarkdownable['dt'] = array();
+ // link class
+ $this->isMarkdownable['a']['id'] = 'optional';
+ $this->isMarkdownable['a']['class'] = 'optional';
+ // footnotes
+ $this->isMarkdownable['fnref'] = array(
+ 'target' => 'required',
+ );
+ $this->isMarkdownable['footnotes'] = array();
+ $this->isMarkdownable['fn'] = array(
+ 'name' => 'required',
+ );
+ $this->parser->blockElements['fnref'] = false;
+ $this->parser->blockElements['fn'] = true;
+ $this->parser->blockElements['footnotes'] = true;
+ // abbr
+ $this->isMarkdownable['abbr'] = array(
+ 'title' => 'required',
+ );
+ // build RegEx lookahead to decide wether table can pe parsed or not
+ $inlineTags = array_keys($this->parser->blockElements, false);
+ $colContents = '(?:[^<]|<(?:' . implode('|', $inlineTags) . '|[^a-z]))*';
+ $this->tableLookaheadHeader = '{
+ ^\s*(?:<thead\s*>)?\s* # open optional thead
+ <tr\s*>\s*(?: # start required row with headers
+ <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*> # header with optional align
+ \s*' . $colContents . '\s* # contents
+ </th>\s* # close header
+ )+</tr> # close row with headers
+ \s*(?:</thead>)? # close optional thead
+ }sxi';
+ $this->tdSubstitute = '\s*' . $colContents . '\s* # contents
+ </td>\s*';
+ $this->tableLookaheadBody = '{
+ \s*(?:<tbody\s*>)?\s* # open optional tbody
+ (?:<tr\s*>\s* # start row
+ %s # cols to be substituted
+ </tr>)+ # close row
+ \s*(?:</tbody>)? # close optional tbody
+ \s*</table> # close table
+ }sxi';
+ }
+
+ /**
+ * handle header tags (<h1> - <h6>)
+ *
+ * @param int $level 1-6
+ * @return void
+ */
+ protected function handleHeader($level)
+ {
+ if ($this->parser->isStartTag) {
+ $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
+ $this->stack();
+ } else {
+ $tag = $this->unstack();
+ if (!empty($tag['cssSelector'])) {
+ // {#id.class}
+ $this->out(' {' . $tag['cssSelector'] . '}');
+ }
+ }
+ parent::handleHeader($level);
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_a_parser()
+ {
+ parent::handleTag_a_parser();
+ $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
+ }
+
+ /**
+ * handle <a> tags conversion
+ *
+ * @param array $tag
+ * @param string $buffer
+ * @return string The markdownified link
+ */
+ protected function handleTag_a_converter($tag, $buffer)
+ {
+ $output = parent::handleTag_a_converter($tag, $buffer);
+ if (!empty($tag['cssSelector'])) {
+ // [This link][id]{#id.class}
+ $output .= '{' . $tag['cssSelector'] . '}';
+ }
+
+ return $output;
+ }
+
+ /**
+ * handle <abbr> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_abbr()
+ {
+ if ($this->parser->isStartTag) {
+ $this->stack();
+ $this->buffer();
+ } else {
+ $tag = $this->unstack();
+ $tag['text'] = $this->unbuffer();
+ $add = true;
+ foreach ($this->stack['abbr'] as $stacked) {
+ if ($stacked['text'] == $tag['text']) {
+ /** TODO: differing abbr definitions, i.e. different titles for same text **/
+ $add = false;
+ break;
+ }
+ }
+ $this->out($tag['text']);
+ if ($add) {
+ array_push($this->stack['abbr'], $tag);
+ }
+ }
+ }
+
+ /**
+ * flush stacked abbr tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function flushStacked_abbr()
+ {
+ $out = array();
+ foreach ($this->stack['abbr'] as $k => $tag) {
+ if (!isset($tag['unstacked'])) {
+ array_push($out, ' *[' . $tag['text'] . ']: ' . $tag['title']);
+ $tag['unstacked'] = true;
+ $this->stack['abbr'][$k] = $tag;
+ }
+ }
+ if (!empty($out)) {
+ $this->out("\n\n" . implode("\n", $out));
+ }
+ }
+
+ /**
+ * handle <table> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_table()
+ {
+ if ($this->parser->isStartTag) {
+ // check if upcoming table can be converted
+ if ($this->keepHTML) {
+ if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
+ // header seems good, now check body
+ // get align & number of cols
+ preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
+ $regEx = '';
+ $i = 1;
+ $aligns = array();
+ foreach ($cols[2] as $align) {
+ $align = strtolower($align);
+ array_push($aligns, $align);
+ if (empty($align)) {
+ $align = 'left'; // default value
+ }
+ $td = '\s+align=("|\')' . $align . '\\' . $i;
+ $i++;
+ if ($align == 'left') {
+ // look for empty align or left
+ $td = '(?:' . $td . ')?';
+ }
+ $td = '<td' . $td . '\s*>';
+ $regEx .= $td . $this->tdSubstitute;
+ }
+ $regEx = sprintf($this->tableLookaheadBody, $regEx);
+ if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
+ // this is a markdownable table tag!
+ $this->table = array(
+ 'rows' => array(),
+ 'col_widths' => array(),
+ 'aligns' => $aligns,
+ );
+ $this->row = 0;
+ } else {
+ // non markdownable table
+ $this->handleTagToText();
+ }
+ } else {
+ // non markdownable table
+ $this->handleTagToText();
+ }
+ } else {
+ $this->table = array(
+ 'rows' => array(),
+ 'col_widths' => array(),
+ 'aligns' => array(),
+ );
+ $this->row = 0;
+ }
+ } else {
+ // finally build the table in Markdown Extra syntax
+ $separator = array();
+ if (!isset($this->table['aligns'])) {
+ $this->table['aligns'] = array();
+ }
+ // seperator with correct align identifiers
+ foreach ($this->table['aligns'] as $col => $align) {
+ if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
+ break;
+ }
+ $left = ' ';
+ $right = ' ';
+ switch ($align) {
+ case 'left':
+ $left = ':';
+ break;
+ case 'center':
+ $right = ':';
+ $left = ':';
+ case 'right':
+ $right = ':';
+ break;
+ }
+ array_push($separator, $left . str_repeat('-', $this->table['col_widths'][$col]) . $right);
+ }
+ $separator = '|' . implode('|', $separator) . '|';
+
+ $rows = array();
+ // add padding
+ array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
+ $header = array_shift($this->table['rows']);
+ array_push($rows, '| ' . implode(' | ', $header) . ' |');
+ array_push($rows, $separator);
+ foreach ($this->table['rows'] as $row) {
+ array_push($rows, '| ' . implode(' | ', $row) . ' |');
+ }
+ $this->out(implode("\n" . $this->indent, $rows));
+ $this->table = array();
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * properly pad content so it is aligned as whished
+ * should be used with array_walk_recursive on $this->table['rows']
+ *
+ * @param string &$content
+ * @param int $col
+ * @return void
+ */
+ protected function alignTdContent(&$content, $col)
+ {
+ if (!isset($this->table['aligns'][$col])) {
+ $this->table['aligns'][$col] = 'left';
+ }
+ switch ($this->table['aligns'][$col]) {
+ default:
+ case 'left':
+ $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
+ break;
+ case 'right':
+ $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)) . $content;
+ break;
+ case 'center':
+ $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
+ $left = floor($paddingNeeded / 2);
+ $right = $paddingNeeded - $left;
+ $content = str_repeat(' ', $left) . $content . str_repeat(' ', $right);
+ break;
+ }
+ }
+
+ /**
+ * handle <tr> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_tr()
+ {
+ if ($this->parser->isStartTag) {
+ $this->col = -1;
+ } else {
+ $this->row++;
+ }
+ }
+
+ /**
+ * handle <td> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_td()
+ {
+ if ($this->parser->isStartTag) {
+ $this->col++;
+ if (!isset($this->table['col_widths'][$this->col])) {
+ $this->table['col_widths'][$this->col] = 0;
+ }
+ $this->buffer();
+ } else {
+ $buffer = trim($this->unbuffer());
+ if (!isset($this->table['col_widths'][$this->col])) {
+ $this->table['col_widths'][$this->col] = 0;
+ }
+ $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
+ $this->table['rows'][$this->row][$this->col] = $buffer;
+ }
+ }
+
+ /**
+ * handle <th> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_th()
+ {
+ if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col + 1])) {
+ if (isset($this->parser->tagAttributes['align'])) {
+ $this->table['aligns'][$this->col + 1] = $this->parser->tagAttributes['align'];
+ } else {
+ $this->table['aligns'][$this->col + 1] = '';
+ }
+ }
+ $this->handleTag_td();
+ }
+
+ /**
+ * handle <dl> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_dl()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * handle <dt> tags
+ *
+ * @param void
+ * @return void
+ **/
+ protected function handleTag_dt()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(1);
+ }
+ }
+
+ /**
+ * handle <dd> tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_dd()
+ {
+ if ($this->parser->isStartTag) {
+ if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
+ // next comes a paragraph, so we'll need an extra line
+ $this->out("\n" . $this->indent);
+ } elseif (substr($this->output, -2) == "\n\n") {
+ $this->output = substr($this->output, 0, -1);
+ }
+ $this->out(': ');
+ $this->indent(' ', false);
+ } else {
+ // lookahead for next dt
+ if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
+ $this->setLineBreaks(2);
+ } else {
+ $this->setLineBreaks(1);
+ }
+ $this->indent(' ');
+ }
+ }
+
+ /**
+ * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_fnref()
+ {
+ $this->out('[^' . $this->parser->tagAttributes['target'] . ']');
+ }
+
+ /**
+ * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
+ * and markdownify_extra::_makeFootnotes())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_fn()
+ {
+ if ($this->parser->isStartTag) {
+ $this->out('[^' . $this->parser->tagAttributes['name'] . ']:');
+ $this->setLineBreaks(1);
+ } else {
+ $this->setLineBreaks(2);
+ }
+ $this->indent(' ');
+ }
+
+ /**
+ * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
+ * and markdownify_extra::_makeFootnotes())
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleTag_footnotes()
+ {
+ if (!$this->parser->isStartTag) {
+ $this->setLineBreaks(2);
+ }
+ }
+
+ /**
+ * parse a HTML string, clean up footnotes prior
+ *
+ * @param string $HTML input
+ * @return string Markdown formatted output
+ */
+ public function parseString($html)
+ {
+ /** TODO: custom markdown-extra options, e.g. titles & classes **/
+ // <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
+ // => <fnref target="..." />
+ $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
+ // <div class="footnotes">
+ // <hr />
+ // <ol>
+ //
+ // <li id="fn:...">...</li>
+ // ...
+ //
+ // </ol>
+ // </div>
+ // =>
+ // <footnotes>
+ // <fn name="...">...</fn>
+ // ...
+ // </footnotes>
+ $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
+
+ return parent::parseString($html);
+ }
+
+ /**
+ * replace HTML representation of footnotes with something more easily parsable
+ *
+ * @note this is a callback to be used in parseString()
+ *
+ * @param array $matches
+ * @return string
+ */
+ protected function _makeFootnotes($matches)
+ {
+ // <li id="fn:1">
+ // ...
+ // <a href="#fnref:block" rev="footnote">&#8617;</a></p>
+ // </li>
+ // => <fn name="1">...</fn>
+ // remove footnote link
+ $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
+ // remove empty paragraph
+ $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
+ // <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
+ $fns = str_replace('<li id="fn:', '<fn name="', $fns);
+
+ $fns = '<footnotes>' . $fns . '</footnotes>';
+
+ return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
+ }
+
+ /**
+ * handle <a> tags parsing
+ *
+ * @param void
+ * @return void
+ */
+ protected function getCurrentCssSelector()
+ {
+ $cssSelector = '';
+ if (isset($this->parser->tagAttributes['id'])) {
+ $cssSelector .= '#' . $this->decode($this->parser->tagAttributes['id']);
+ }
+ if (isset($this->parser->tagAttributes['class'])) {
+ $classes = explode(' ', $this->decode($this->parser->tagAttributes['class']));
+ $classes = array_filter($classes);
+ $cssSelector .= '.' . join('.', $classes);
+ }
+ return $cssSelector;
+ }
+}
diff --git a/vendor/pixel418/markdownify/src/Parser.php b/vendor/pixel418/markdownify/src/Parser.php
new file mode 100644
index 000000000..90fcdf9f8
--- /dev/null
+++ b/vendor/pixel418/markdownify/src/Parser.php
@@ -0,0 +1,564 @@
+<?php
+
+/* This file is part of the Markdownify project, which is under LGPL license */
+
+namespace Markdownify;
+
+class Parser
+{
+ public static $skipWhitespace = true;
+ public static $a_ord;
+ public static $z_ord;
+ public static $special_ords;
+
+ /**
+ * tags which are always empty (<br /> etc.)
+ *
+ * @var array<string>
+ */
+ public $emptyTags = array(
+ 'br',
+ 'hr',
+ 'input',
+ 'img',
+ 'area',
+ 'link',
+ 'meta',
+ 'param',
+ );
+
+ /**
+ * tags with preformatted text
+ * whitespaces wont be touched in them
+ *
+ * @var array<string>
+ */
+ public $preformattedTags = array(
+ 'script',
+ 'style',
+ 'pre',
+ 'code',
+ );
+
+ /**
+ * supress HTML tags inside preformatted tags (see above)
+ *
+ * @var bool
+ */
+ public $noTagsInCode = false;
+
+ /**
+ * html to be parsed
+ *
+ * @var string
+ */
+ public $html = '';
+
+ /**
+ * node type:
+ *
+ * - tag (see isStartTag)
+ * - text (includes cdata)
+ * - comment
+ * - doctype
+ * - pi (processing instruction)
+ *
+ * @var string
+ */
+ public $nodeType = '';
+
+ /**
+ * current node content, i.e. either a
+ * simple string (text node), or something like
+ * <tag attrib="value"...>
+ *
+ * @var string
+ */
+ public $node = '';
+
+ /**
+ * wether current node is an opening tag (<a>) or not (</a>)
+ * set to NULL if current node is not a tag
+ * NOTE: empty tags (<br />) set this to true as well!
+ *
+ * @var bool | null
+ */
+ public $isStartTag = null;
+
+ /**
+ * wether current node is an empty tag (<br />) or not (<a></a>)
+ *
+ * @var bool | null
+ */
+ public $isEmptyTag = null;
+
+ /**
+ * tag name
+ *
+ * @var string | null
+ */
+ public $tagName = '';
+
+ /**
+ * attributes of current tag
+ *
+ * @var array (attribName=>value) | null
+ */
+ public $tagAttributes = null;
+
+ /**
+ * whether or not the actual context is a inline context
+ *
+ * @var bool | null
+ */
+ public $isInlineContext = null;
+
+ /**
+ * whether the current tag is a block element
+ *
+ * @var bool | null
+ */
+ public $isBlockElement = null;
+
+ /**
+ * whether the previous tag (browser) is a block element
+ *
+ * @var bool | null
+ */
+ public $isNextToInlineContext = null;
+
+ /**
+ * keep whitespace
+ *
+ * @var int
+ */
+ public $keepWhitespace = 0;
+
+ /**
+ * list of open tags
+ * count this to get current depth
+ *
+ * @var array
+ */
+ public $openTags = array();
+
+ /**
+ * list of block elements
+ *
+ * @var array
+ * TODO: what shall we do with <del> and <ins> ?!
+ */
+ public $blockElements = array(
+ // tag name => <bool> is block
+ // block elements
+ 'address' => true,
+ 'blockquote' => true,
+ 'center' => true,
+ 'del' => true,
+ 'dir' => true,
+ 'div' => true,
+ 'dl' => true,
+ 'fieldset' => true,
+ 'form' => true,
+ 'h1' => true,
+ 'h2' => true,
+ 'h3' => true,
+ 'h4' => true,
+ 'h5' => true,
+ 'h6' => true,
+ 'hr' => true,
+ 'ins' => true,
+ 'isindex' => true,
+ 'menu' => true,
+ 'noframes' => true,
+ 'noscript' => true,
+ 'ol' => true,
+ 'p' => true,
+ 'pre' => true,
+ 'table' => true,
+ 'ul' => true,
+ // set table elements and list items to block as well
+ 'thead' => true,
+ 'tbody' => true,
+ 'tfoot' => true,
+ 'td' => true,
+ 'tr' => true,
+ 'th' => true,
+ 'li' => true,
+ 'dd' => true,
+ 'dt' => true,
+ // header items and html / body as well
+ 'html' => true,
+ 'body' => true,
+ 'head' => true,
+ 'meta' => true,
+ 'link' => true,
+ 'style' => true,
+ 'title' => true,
+ // unfancy media tags, when indented should be rendered as block
+ 'map' => true,
+ 'object' => true,
+ 'param' => true,
+ 'embed' => true,
+ 'area' => true,
+ // inline elements
+ 'a' => false,
+ 'abbr' => false,
+ 'acronym' => false,
+ 'applet' => false,
+ 'b' => false,
+ 'basefont' => false,
+ 'bdo' => false,
+ 'big' => false,
+ 'br' => false,
+ 'button' => false,
+ 'cite' => false,
+ 'code' => false,
+ 'del' => false,
+ 'dfn' => false,
+ 'em' => false,
+ 'font' => false,
+ 'i' => false,
+ 'img' => false,
+ 'ins' => false,
+ 'input' => false,
+ 'iframe' => false,
+ 'kbd' => false,
+ 'label' => false,
+ 'q' => false,
+ 'samp' => false,
+ 'script' => false,
+ 'select' => false,
+ 'small' => false,
+ 'span' => false,
+ 'strong' => false,
+ 'sub' => false,
+ 'sup' => false,
+ 'textarea' => false,
+ 'tt' => false,
+ 'var' => false,
+ );
+
+ /**
+ * get next node, set $this->html prior!
+ *
+ * @param void
+ * @return bool
+ */
+ public function nextNode()
+ {
+ if (empty($this->html)) {
+ // we are done with parsing the html string
+
+ return false;
+ }
+
+ if ($this->isStartTag && !$this->isEmptyTag) {
+ array_push($this->openTags, $this->tagName);
+ if (in_array($this->tagName, $this->preformattedTags)) {
+ // dont truncate whitespaces for <code> or <pre> contents
+ $this->keepWhitespace++;
+ }
+ }
+
+ if ($this->html[0] == '<') {
+ $token = substr($this->html, 0, 9);
+ if (substr($token, 0, 2) == '<?') {
+ // xml prolog or other pi's
+ /** TODO **/
+ // trigger_error('this might need some work', E_USER_NOTICE);
+ $pos = strpos($this->html, '>');
+ $this->setNode('pi', $pos + 1);
+
+ return true;
+ }
+ if (substr($token, 0, 4) == '<!--') {
+ // comment
+ $pos = strpos($this->html, '-->');
+ if ($pos === false) {
+ // could not find a closing -->, use next gt instead
+ // this is firefox' behaviour
+ $pos = strpos($this->html, '>') + 1;
+ } else {
+ $pos += 3;
+ }
+ $this->setNode('comment', $pos);
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($token == '<!DOCTYPE') {
+ // doctype
+ $this->setNode('doctype', strpos($this->html, '>') + 1);
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($token == '<![CDATA[') {
+ // cdata, use text node
+
+ // remove leading <![CDATA[
+ $this->html = substr($this->html, 9);
+
+ $this->setNode('text', strpos($this->html, ']]>') + 3);
+
+ // remove trailing ]]> and trim
+ $this->node = substr($this->node, 0, -3);
+ $this->handleWhitespaces();
+
+ static::$skipWhitespace = true;
+
+ return true;
+ }
+ if ($this->parseTag()) {
+ // seems to be a tag
+ // handle whitespaces
+ if ($this->isBlockElement) {
+ static::$skipWhitespace = true;
+ } else {
+ static::$skipWhitespace = false;
+ }
+
+ return true;
+ }
+ }
+ if ($this->keepWhitespace) {
+ static::$skipWhitespace = false;
+ }
+ // when we get here it seems to be a text node
+ $pos = strpos($this->html, '<');
+ if ($pos === false) {
+ $pos = strlen($this->html);
+ }
+ $this->setNode('text', $pos);
+ $this->handleWhitespaces();
+ if (static::$skipWhitespace && $this->node == ' ') {
+ return $this->nextNode();
+ }
+ $this->isInlineContext = true;
+ static::$skipWhitespace = false;
+
+ return true;
+ }
+
+ /**
+ * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
+ *
+ * @param void
+ * @return bool
+ */
+ protected function parseTag()
+ {
+ if (!isset(static::$a_ord)) {
+ static::$a_ord = ord('a');
+ static::$z_ord = ord('z');
+ static::$special_ords = array(
+ ord(':'), // for xml:lang
+ ord('-'), // for http-equiv
+ );
+ }
+
+ $tagName = '';
+
+ $pos = 1;
+ $isStartTag = $this->html[$pos] != '/';
+ if (!$isStartTag) {
+ $pos++;
+ }
+ // get tagName
+ while (isset($this->html[$pos])) {
+ $pos_ord = ord(strtolower($this->html[$pos]));
+ if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
+ $tagName .= $this->html[$pos];
+ $pos++;
+ } else {
+ $pos--;
+ break;
+ }
+ }
+
+ $tagName = strtolower($tagName);
+ if (empty($tagName) || !isset($this->blockElements[$tagName])) {
+ // something went wrong => invalid tag
+ $this->invalidTag();
+
+ return false;
+ }
+ if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
+ // we supress all HTML tags inside code tags
+ $this->invalidTag();
+
+ return false;
+ }
+
+ // get tag attributes
+ /** TODO: in html 4 attributes do not need to be quoted **/
+ $isEmptyTag = false;
+ $attributes = array();
+ $currAttrib = '';
+ while (isset($this->html[$pos + 1])) {
+ $pos++;
+ // close tag
+ if ($this->html[$pos] == '>' || $this->html[$pos] . $this->html[$pos + 1] == '/>') {
+ if ($this->html[$pos] == '/') {
+ $isEmptyTag = true;
+ $pos++;
+ }
+ break;
+ }
+
+ $pos_ord = ord(strtolower($this->html[$pos]));
+ if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || in_array($pos_ord, static::$special_ords)) {
+ // attribute name
+ $currAttrib .= $this->html[$pos];
+ } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
+ // drop whitespace
+ } elseif (in_array($this->html[$pos] . $this->html[$pos + 1], array('="', "='"))) {
+ // get attribute value
+ $pos++;
+ $await = $this->html[$pos]; // single or double quote
+ $pos++;
+ $value = '';
+ while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
+ $value .= $this->html[$pos];
+ $pos++;
+ }
+ $attributes[$currAttrib] = $value;
+ $currAttrib = '';
+ } else {
+ $this->invalidTag();
+
+ return false;
+ }
+ }
+ if ($this->html[$pos] != '>') {
+ $this->invalidTag();
+
+ return false;
+ }
+
+ if (!empty($currAttrib)) {
+ // html 4 allows something like <option selected> instead of <option selected="selected">
+ $attributes[$currAttrib] = $currAttrib;
+ }
+ if (!$isStartTag) {
+ if (!empty($attributes) || $tagName != end($this->openTags)) {
+ // end tags must not contain any attributes
+ // or maybe we did not expect a different tag to be closed
+ $this->invalidTag();
+
+ return false;
+ }
+ array_pop($this->openTags);
+ if (in_array($tagName, $this->preformattedTags)) {
+ $this->keepWhitespace--;
+ }
+ }
+ $pos++;
+ $this->node = substr($this->html, 0, $pos);
+ $this->html = substr($this->html, $pos);
+ $this->tagName = $tagName;
+ $this->tagAttributes = $attributes;
+ $this->isStartTag = $isStartTag;
+ $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
+ if ($this->isEmptyTag) {
+ // might be not well formed
+ $this->node = preg_replace('# */? *>$#', ' />', $this->node);
+ }
+ $this->nodeType = 'tag';
+ $this->isBlockElement = $this->blockElements[$tagName];
+ $this->isNextToInlineContext = $isStartTag && $this->isInlineContext;
+ $this->isInlineContext = !$this->isBlockElement;
+ return true;
+ }
+
+ /**
+ * handle invalid tags
+ *
+ * @param void
+ * @return void
+ */
+ protected function invalidTag()
+ {
+ $this->html = substr_replace($this->html, '&lt;', 0, 1);
+ }
+
+ /**
+ * update all vars and make $this->html shorter
+ *
+ * @param string $type see description for $this->nodeType
+ * @param int $pos to which position shall we cut?
+ * @return void
+ */
+ protected function setNode($type, $pos)
+ {
+ if ($this->nodeType == 'tag') {
+ // set tag specific vars to null
+ // $type == tag should not be called here
+ // see this::parseTag() for more
+ $this->tagName = null;
+ $this->tagAttributes = null;
+ $this->isStartTag = null;
+ $this->isEmptyTag = null;
+ $this->isBlockElement = null;
+
+ }
+ $this->nodeType = $type;
+ $this->node = substr($this->html, 0, $pos);
+ $this->html = substr($this->html, $pos);
+ }
+
+ /**
+ * check if $this->html begins with $str
+ *
+ * @param string $str
+ * @return bool
+ */
+ protected function match($str)
+ {
+ return substr($this->html, 0, strlen($str)) == $str;
+ }
+
+ /**
+ * truncate whitespaces
+ *
+ * @param void
+ * @return void
+ */
+ protected function handleWhitespaces()
+ {
+ if ($this->keepWhitespace) {
+ // <pre> or <code> before...
+
+ return;
+ }
+ // truncate multiple whitespaces to a single one
+ $this->node = preg_replace('#\s+#s', ' ', $this->node);
+ }
+
+ /**
+ * normalize self::node
+ *
+ * @param void
+ * @return void
+ */
+ protected function normalizeNode()
+ {
+ $this->node = '<';
+ if (!$this->isStartTag) {
+ $this->node .= '/' . $this->tagName . '>';
+
+ return;
+ }
+ $this->node .= $this->tagName;
+ foreach ($this->tagAttributes as $name => $value) {
+ $this->node .= ' ' . $name . '="' . str_replace('"', '&quot;', $value) . '"';
+ }
+ if ($this->isEmptyTag) {
+ $this->node .= ' /';
+ }
+ $this->node .= '>';
+ }
+}
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
index f1ebb204e..bbce5339f 100644
--- a/view/css/bootstrap-red.css
+++ b/view/css/bootstrap-red.css
@@ -4,66 +4,79 @@
nav .badge {
position: absolute;
- top: 1px;
- left: 1px;
- font-size: 10px;
- line-height: 20px;
- padding: 0px 5px;
- height: 20px;
- min-width: 20px;
- border-radius: 10px;
+ font-size: 0.75rem;
}
-#navbar-collapse-1 i,
-.navbar-header i {
- font-size: 14px;
+@media screen and (min-width: 767px) {
+ nav .badge {
+ top: 0px;
+ left: 0px;
+ }
}
-nav .navbar-header img {
- height: 49px;
- width: 49px;
- margin-top: 1px;
+@media screen and (max-width: 767px) {
+ nav .badge {
+ top: 0.5rem;
+ left: 1.5rem;
+ }
}
-/* nav overrides end */
+.widget .badge {
+ font-size: 100%;
+}
+.nav-item.nav-item-hack {
+ height: 2.3rem;
+}
+
+.navbar-toggler-right {
+ padding: 0.2rem 0;
+}
-aside .nav-pills > li > a,
-.response-list .nav-pills > li > a {
- padding: 6px 10px;
+#navbar-collapse-1 i {
+ font-size: 1rem;
}
nav .dropdown-menu {
- margin-top: 0px;
max-height: 70vh;
overflow: auto;
}
-nav .navbar-collapse.in .dropdown-menu {
- max-height: none;
- overflow: none;
+nav.navbar {
+ max-height: 100vh;
}
-.wall-item-tools .dropdown-menu {
- min-width: auto;
+#navbar-collapse-2 {
+ flex-basis: 100%;
+ max-height: 70vh;
}
-.nav-tabs.nav-justified > li {
- white-space: nowrap;
+#navbar-collapse-2.show {
+ overflow: auto;
+}
+
+.navbar-inverse .navbar-toggler {
+ color: rgba(255,255,255,1);
+}
+/* nav overrides end */
+
+.btn-outline-secondary {
+ color: #aaa;
+}
+
+.wall-item-tools .dropdown-menu {
+ min-width: auto;
}
code {
white-space: normal;
}
-.form-control {
- font-size: unset;
+.form-group label {
+ font-weight: bold;
}
-.panel-group {
- margin-bottom: 0px;
+small,
+.small {
+ font-size: 0.75rem;
}
-
-/* Bootstrap assumes that checkboxes are on the left of labels, while it's usually the opposite in Red */
-.field.checkbox input[type="checkbox"] { margin-left: 0px; }
-.field.checkbox label { padding-left: 0px; font-weight: 700}
diff --git a/view/css/conversation.css b/view/css/conversation.css
index aec457302..08f23c4d0 100644
--- a/view/css/conversation.css
+++ b/view/css/conversation.css
@@ -3,7 +3,7 @@
.jothidden input[type="text"] {
border: 0px;
margin: 0px;
- height: 39px;
+ height: 2.5rem;
width: 100%;
}
@@ -23,15 +23,15 @@
#jot-title-wrap input,
#jot-pagetitle-wrap input {
- padding: 10px;
+ padding: 0.5rem;
}
#profile-jot-text {
resize: none;
border-width: 0px;
- height: 39px;
- line-height: 19px;
- padding: 10px;
+ height: 2.5rem;
+ line-height: 1.5rem;
+ padding: 0.5rem;
width: 100%;
display: inherit;
}
@@ -60,29 +60,11 @@
}
#profile-jot-text-loading {
- float: left;
padding: 30px 0px 0px 12px;
}
#profile-jot-submit-wrapper {
border-top: 1px solid #ccc;
- padding: 10px;
-}
-
-#profile-jot-perms-end {
- height: 30px;
-}
-
-#profile-jot-wrapper {
- margin-bottom: 30px;
-}
-
-#profile-jot-plugin-wrapper {
- margin-top: 10px;
-}
-
-#profile-rotator-wrapper {
- float: left;
}
#profile-rotator {
@@ -91,22 +73,11 @@
/* conversation */
-.thread-wrapper.toplevel_item {
- margin-bottom: 20px;
-}
/* conv_item */
-.wall-item-head {
- padding: 10px 10px 0.5em 10px;
-}
-
-.wall-item-content {
- padding: 0.5em 10px;
-}
-
-.wall-item-tools {
- padding: 0.5em 10px 10px 10px;
+.wall-item-head-new {
+ border-top: 0.2rem solid #0275d8;
}
.wall-item-info {
@@ -119,10 +90,6 @@
margin-left:10px;
}
-.lockview-panel {
- padding: 3px 20px;
-}
-
.wall-item-lock {
float: left;
}
@@ -137,6 +104,12 @@ a.wall-item-name-link {
text-overflow: ellipsis;
}
+.wall-item-ago,
+.wall-item-ago i {
+ font-size: 0.75rem;
+ line-height: 1;
+}
+
.wall-item-ago .fa-check {
cursor: pointer;
}
@@ -145,41 +118,24 @@ a.wall-item-name-link {
overflow: hidden;
}
-.wall-item-content h1,
-.wall-item-content h2 {
- font-size: 1.319em;
-}
-
-.wall-item-title h3,
-.wall-item-content h3,
-.wall-item-content h4 {
- font-size: 1.112em;
-}
-
.wall-item-content img {
max-width: 100%;
}
-.wall-item-title h3 {
+.wall-item-title.h3 {
font-weight: bold;
margin: 0px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
+ word-wrap: break-word;
}
-.wall-item-title-end {
- clear: both;
+.wall-item-title.bg-primary a {
+ color: #fff;
}
.wall-item-body {
word-wrap: break-word;
}
-.body-tags {
- margin-top: 5px;
-}
-
.item-tool {
cursor: pointer;
}
@@ -212,91 +168,59 @@ a.wall-item-name-link {
}
.ivoted {
- color: #337AB7;
+ color: #0275d8;
}
.item-highlight {
- border-left: 3px solid #337AB7;
+ border-left: 0.2rem solid #0275d8;
}
.item-highlight .wall-item-head,
.item-highlight .wall-item-content,
.item-highlight .wall-item-tools {
- padding-left: 7px;
+ padding-left: 0.3rem;
}
/* comment_item */
.comment-edit-text-empty,
.comment-edit-text-full {
+ padding: 0.5rem;
width: 100%;
display: inherit;
}
.comment-edit-text-empty {
- padding: 0px 8px;
- line-height: 28px;
- height: 30px;
+ height: 2rem;
+ line-height: 1;
overflow: hidden;
resize: none;
-
}
.comment-edit-text-full {
- padding: 8px;
- height: 150px;
+ height: 7rem;
+ line-height: 1.25;
overflow: auto;
resize: vertical;
}
-.qcomment {
- border: 1px solid #EEE;
- padding: 3px;
- margin-top: 15px;
- margin-left: 25px;
- width: 125px;
- overflow-y: auto;
-}
-
-.qcomment option {
- width: 125px;
- overflow-x: hidden;
-}
-
-.qcomment {
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-.qcomment:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-.comment-tools {
- display: none;
- margin-top: 7px;
-}
-
+.comment-tools,
.comment-edit-preview {
display: none;
- margin-top: 7px;
}
/* disable link handling for unknown entries */
-.dropdown-menu > li > a.disabled {
+.dropdown-menu a.disabled {
pointer-events: none;
cursor: default;
}
.item-verified {
color: darkgreen;
- font-size: 1em !important;
}
.item-forged {
color: #FF0000;
- font-size: 1em !important;
}
/* event item */
diff --git a/view/css/default.css b/view/css/default.css
index a51461201..fc6da54f9 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -18,7 +18,7 @@ aside {
position: relative;
display: table-cell;
vertical-align: top;
- padding: 71px 7px 0px 7px;
+ padding: 4.5rem 7px 0px 7px;
}
section {
@@ -26,5 +26,5 @@ section {
width: 100%;
display: table-cell;
vertical-align: top;
- padding: 71px 7px 200px 7px;
+ padding: 4.5rem 7px 200px 7px;
}
diff --git a/view/css/mod_apps.css b/view/css/mod_apps.css
index 0a231bc84..5e6000fb4 100644
--- a/view/css/mod_apps.css
+++ b/view/css/mod_apps.css
@@ -1,8 +1,7 @@
.app-container {
float: left;
- width: 150px;
- height: 180px;
- padding: 20px;
+ width: 148px;
+ margin: 20px;
}
.app-name {
diff --git a/view/css/mod_chat.css b/view/css/mod_chat.css
index 57aecd557..c56091102 100644
--- a/view/css/mod_chat.css
+++ b/view/css/mod_chat.css
@@ -16,6 +16,10 @@
text-align: right;
}
+#chatrooms-index td:nth-child(3){
+ white-space: nowrap;
+}
+
#chatrooms-index th:nth-child(4),
#chatrooms-index td:nth-child(4){
padding: 7px 10px 7px 7px;
diff --git a/view/css/mod_events.css b/view/css/mod_events.css
index f0b5c0166..6fccf3f44 100644
--- a/view/css/mod_events.css
+++ b/view/css/mod_events.css
@@ -21,11 +21,6 @@
border-color: #ccc !important;
}
-#events-spinner .spinner {
- margin-top: 9px;
- margin-bottom: -9px;
-}
-
.bootstrap-tagsinput {
width: 100%;
padding: 6px 12px;
diff --git a/view/css/mod_help.css b/view/css/mod_help.css
index f59a40894..c0b0bafa3 100644
--- a/view/css/mod_help.css
+++ b/view/css/mod_help.css
@@ -11,14 +11,6 @@
padding-bottom: 0.3em;
}
-#doco-content h4 {
- text-decoration: underline;
-}
-
-#doco-content h5 {
- text-decoration: underline;
-}
-
#region_1 .widget ul ul {
list-style-type: none;
}
diff --git a/view/css/mod_mail.css b/view/css/mod_mail.css
index c1874edac..8072b4668 100644
--- a/view/css/mod_mail.css
+++ b/view/css/mod_mail.css
@@ -1,34 +1,3 @@
-.mail-conv-sender {
- float: left;
- margin-right: 10px;
- margin-bottom: 10px;
-}
-
-.mail-conv-sender img{
- width: 32px;
- height: 32px;
-}
-
-.mail-conv-sender-name {
- font-weight: bold;
-}
-
-.mail-conv-body {
- margin-bottom: 10px;
-}
-
.mail-conv-body img {
max-width: 100%;
}
-
-#prvmail-rotator {
- margin: 15px;
-}
-
-#prvmail-text {
- height: 15.0em;
-}
-
-.mail-conv-outside-wrapper {
- margin-bottom: 20px;
-}
diff --git a/view/css/mod_webpages.css b/view/css/mod_webpages.css
index 805d95dc2..f665800f1 100644
--- a/view/css/mod_webpages.css
+++ b/view/css/mod_webpages.css
@@ -6,27 +6,31 @@
width: 100%;
}
-#webpage-list-table th:nth-child(1){
+#webpage-list-table th:nth-child(1) {
padding: 7px 3px 7px 10px;
white-space: nowrap;
}
-#webpage-list-table td:nth-child(1){
+#webpage-list-table td:nth-child(1) {
padding: 7px 3px 7px 10px;
}
-#webpage-list-table th:nth-child(2){
+#webpage-list-table th:nth-child(2) {
+ white-space: nowrap;
+}
+
+#webpage-list-table td:nth-child(3) {
white-space: nowrap;
}
#webpage-list-table th:nth-child(7),
-#webpage-list-table td:nth-child(7){
+#webpage-list-table td:nth-child(7) {
padding: 7px 3px;
white-space: nowrap;
}
#webpage-list-table th:nth-child(8),
-#webpage-list-table td:nth-child(8){
+#webpage-list-table td:nth-child(8) {
padding: 7px 10px 7px 7px;
white-space: nowrap;
}
@@ -192,4 +196,4 @@
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
filter: alpha(opacity=100);
opacity: 1;
-} \ No newline at end of file
+}
diff --git a/view/css/mod_wiki.css b/view/css/mod_wiki.css
index 83f17c820..b44ec4fd8 100644
--- a/view/css/mod_wiki.css
+++ b/view/css/mod_wiki.css
@@ -41,6 +41,7 @@
#wikis-index th:nth-child(3),
#wikis-index td:nth-child(3){
padding: 7px 10px 7px 7px;
+ white-space: nowrap;
}
#wikis-index th:nth-child(4),
diff --git a/view/css/widgets.css b/view/css/widgets.css
index 9b97d8bf7..6cd61ae6f 100644
--- a/view/css/widgets.css
+++ b/view/css/widgets.css
@@ -1,17 +1,15 @@
.widget {
- margin-bottom: 10px;
- padding: 10px;
+ margin-bottom: 1rem;
+ padding: 0.5rem;
}
.widget h3 {
margin-top: 0px;
}
-.widget-input {
- width: 100%;
- border-top-right-radius: 0px;
- border-bottom-right-radius: 0px;
- border-right: 0px;
+.widget .active .wall-item-ago,
+.widget .active .dropdown-sub-text {
+ color: #fff;
}
.tags {
@@ -20,34 +18,15 @@
.widget-nav-pills-icons {
opacity: 0;
- padding: 6px 10px;
float: right;
- position: relative;
- z-index:1;
}
-
.widget-nav-pills-checkbox {
- padding: 6px 10px;
+ padding: 0.6rem 1.4rem;
float: right;
- position: relative;
- z-index:1;
cursor: pointer;
}
-i.widget-nav-pills-icons,
-i.widget-nav-pills-checkbox {
- margin-top: 2px;
-}
-
-.widget-nav-pills-icons:hover + a {
- background-color: #eee;
-}
-
-.widget-nav-pills-checkbox:hover + a {
- background-color: #eee;
-}
-
li:hover .widget-nav-pills-icons {
opacity: 1;
}
@@ -150,16 +129,6 @@ li:hover .group-edit-icon {
width: 250px;
}
-/* events tools */
-
-#event-upload-form {
- margin-top: 10px;
-}
-
-#event-upload-choose {
- width: 100%;
-}
-
/* cover photo */
#cover-photo {
@@ -174,20 +143,22 @@ li:hover .group-edit-icon {
bottom: 0px;
left: 0px;
width: 100%;
- padding: 15px;
+ padding: 1rem;
+}
+
+#cover-photo-caption h1,
+#cover-photo-caption h3 {
color: #fff;
font-weight: bold;
- text-shadow: 1px 1px 3px rgba(0,0,0,.7);
+ text-shadow: 1px 1px 3px rgba(0,0,0,0.5);
}
-.cover-photo-title {
- font-size: 30px;
+a.wikilist {
+ z-index: 1;
}
-.cover-photo-subtitle {
- font-size: 20px;
-}
+/* mail list */
-a.wikilist {
- z-index: 1;
+.active .conv-participants {
+ color: #fff;
}
diff --git a/view/de/hmessages.po b/view/de/hmessages.po
index fbdb33166..62f7fe602 100644
--- a/view/de/hmessages.po
+++ b/view/de/hmessages.po
@@ -8,13 +8,13 @@
# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2013
# do.t <tobias@tonstrom.de>, 2014
# Einer von Vielen <tom@jfellow.net>, 2013
-# Ettore Atalan <atalanttore@googlemail.com>, 2015-2016
+# Ettore Atalan <atalanttore@googlemail.com>, 2015-2017
# Frank Dieckmann <frank@lumina-verte.org>, 2013
# Harald Klimach <harald@klimachs.de>, 2016
# JooBee <d13@raclan.de>, 2014
# Kai <kai@proppower.de>, 2015
# Oliver <post@toktan.org>, 2015-2016
-# Phellmes <forum@suschka.de>, 2014,2016
+# Phellmes <forum@suschka.de>, 2014,2016-2017
# sasiflo <transiflex@sasiflo.de>, 2014
# Steff <steff@digitalesecho.de>, 2015-2016
# Tobias Diekershoff <tobias.diekershoff@gmx.net>, 2016
@@ -25,8 +25,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-12-09 00:05-0800\n"
-"PO-Revision-Date: 2016-12-10 12:27+0000\n"
+"POT-Creation-Date: 2017-02-17 00:05-0800\n"
+"PO-Revision-Date: 2017-02-22 13:47+0000\n"
"Last-Translator: Phellmes <forum@suschka.de>\n"
"Language-Team: German (http://www.transifex.com/Friendica/red-matrix/language/de/)\n"
"MIME-Version: 1.0\n"
@@ -35,90 +35,90 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:227
+#: ../../Zotlabs/Access/PermissionRoles.php:248
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr "Soziales Netzwerk"
-#: ../../Zotlabs/Access/PermissionRoles.php:228
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr "Soziales Netzwerk - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:229
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr "Soziales Netzwerk - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:230
+#: ../../Zotlabs/Access/PermissionRoles.php:251
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr "Soziales Netzwerk - Privat"
-#: ../../Zotlabs/Access/PermissionRoles.php:233
+#: ../../Zotlabs/Access/PermissionRoles.php:254
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr "Forum"
-#: ../../Zotlabs/Access/PermissionRoles.php:234
+#: ../../Zotlabs/Access/PermissionRoles.php:255
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr "Forum - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:235
+#: ../../Zotlabs/Access/PermissionRoles.php:256
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr "Forum - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:236
+#: ../../Zotlabs/Access/PermissionRoles.php:257
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr "Forum - Privat"
-#: ../../Zotlabs/Access/PermissionRoles.php:239
+#: ../../Zotlabs/Access/PermissionRoles.php:260
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr "Teilen von Feeds"
-#: ../../Zotlabs/Access/PermissionRoles.php:240
+#: ../../Zotlabs/Access/PermissionRoles.php:261
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr "Feeds - Weitgehend öffentlich"
-#: ../../Zotlabs/Access/PermissionRoles.php:241
+#: ../../Zotlabs/Access/PermissionRoles.php:262
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr "Feeds - Beschränkt"
-#: ../../Zotlabs/Access/PermissionRoles.php:244
+#: ../../Zotlabs/Access/PermissionRoles.php:265
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr "Für besondere Zwecke"
-#: ../../Zotlabs/Access/PermissionRoles.php:245
+#: ../../Zotlabs/Access/PermissionRoles.php:266
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr "Speziell - Mitteilungs-Kanal (keine Kommentare)"
-#: ../../Zotlabs/Access/PermissionRoles.php:246
+#: ../../Zotlabs/Access/PermissionRoles.php:267
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr "Speziell - Gruppenarchiv"
-#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../Zotlabs/Module/Register.php:213
+#: ../../Zotlabs/Access/PermissionRoles.php:270
+#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:879
#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:445
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../Zotlabs/Module/Settings/Channel.php:463
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:949
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
+#: ../../include/selectors.php:66 ../../include/selectors.php:104
+#: ../../include/selectors.php:140 ../../include/connections.php:901
+#: ../../include/connections.php:908 ../../include/permissions.php:949
msgid "Other"
msgstr "Andere"
-#: ../../Zotlabs/Access/PermissionRoles.php:250
+#: ../../Zotlabs/Access/PermissionRoles.php:271
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr "Benutzerdefiniert/Expertenmodus"
@@ -152,38 +152,46 @@ msgid "Can view my channel webpages"
msgstr "Kann die Webseiten meines Kanals sehen"
#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr "Kann meine Wiki-Seiten sehen"
+
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can create/edit my channel webpages"
msgstr "Kann Webseiten in meinem Kanal erstellen/ändern"
-#: ../../Zotlabs/Access/Permissions.php:54
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr "Kann meine Wiki-Seiten bearbeiten"
+
+#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can post on my channel (wall) page"
msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr "Darf meine Beiträge kommentieren und mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr "Kann mir private Nachrichten schicken"
-#: ../../Zotlabs/Access/Permissions.php:57
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can like/dislike profiles and profile things"
msgstr "Kann Profile und Profilsachen mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:58
+#: ../../Zotlabs/Access/Permissions.php:60
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Kann an alle meine Verbindungen via @-Erwähnungen Nachrichten weiterleiten"
-#: ../../Zotlabs/Access/Permissions.php:59
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can chat with me"
msgstr "Kann mit mir chatten"
-#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
msgstr "Kann meine öffentlichen Beiträge als Quellen für Kanäle verwenden"
-#: ../../Zotlabs/Access/Permissions.php:61
+#: ../../Zotlabs/Access/Permissions.php:63
msgid "Can administer my channel"
msgstr "Kann meinen Kanal administrieren"
@@ -191,7 +199,7 @@ msgstr "Kann meinen Kanal administrieren"
msgid "parent"
msgstr "Ãœbergeordnetes Verzeichnis"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2695
msgid "Collection"
msgstr "Sammlung"
@@ -215,20 +223,19 @@ msgstr "Posteingang für überwachte Kalender"
msgid "Schedule Outbox"
msgstr "Postausgang für überwachte Kalender"
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
-#: ../../Zotlabs/Module/Photos.php:1249
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:490
-#: ../../Zotlabs/Lib/Apps.php:565
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
+#: ../../Zotlabs/Module/Photos.php:1244
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:559
+#: ../../Zotlabs/Lib/Apps.php:637
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/widgets.php:1754 ../../include/conversation.php:1047
+#: ../../include/conversation.php:1177 ../../include/widgets.php:1714
msgid "Unknown"
msgstr "Unbekannt"
#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:96
-#: ../../include/conversation.php:1699
+#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
msgid "Files"
msgstr "Dateien"
@@ -241,44 +248,48 @@ msgid "Shared"
msgstr "Geteilt"
#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:882
+#: ../../Zotlabs/Module/New_channel.php:147
#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../Zotlabs/Module/Webpages.php:243
#: ../../extend/addon/addon/cdav/include/widgets.php:127
#: ../../extend/addon/addon/cdav/include/widgets.php:164
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
-#: ../../include/widgets.php:969
msgid "Create"
msgstr "Erstelle"
#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
+#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Profile_photo.php:412
#: ../../Zotlabs/Module/Embedphotos.php:157
#: ../../extend/addon/addon/cdav/include/widgets.php:132
#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1767
+#: ../../include/widgets.php:1727
msgid "Upload"
msgstr "Hochladen"
#: ../../Zotlabs/Storage/Browser.php:233
#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
+#: ../../Zotlabs/Module/Connedit.php:867
+#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:170
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
#: ../../Zotlabs/Module/Chat.php:250
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:132
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
+#: ../../include/widgets.php:990
msgid "Name"
msgstr "Name"
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:171
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
msgid "Type"
msgstr "Typ"
#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1408
msgid "Size"
msgstr "Größe"
@@ -287,43 +298,46 @@ msgstr "Größe"
msgid "Last Modified"
msgstr "Zuletzt geändert"
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../Zotlabs/Module/Connections.php:290
-#: ../../Zotlabs/Module/Connections.php:310
+#: ../../Zotlabs/Storage/Browser.php:238 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Module/Editblock.php:109
+#: ../../Zotlabs/Module/Connections.php:300
+#: ../../Zotlabs/Module/Connections.php:320
#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
-#: ../../Zotlabs/Module/Wiki.php:252
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Module/Wiki.php:163
+#: ../../Zotlabs/Module/Wiki.php:273
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/Apps.php:341
-#: ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Lib/Apps.php:357
#: ../../extend/addon/addon/cdav/include/widgets.php:125
#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../include/channel.php:961 ../../include/channel.php:965
-#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
-#: ../../include/menu.php:113 ../../include/widgets.php:965
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
+#: ../../include/menu.php:113 ../../include/channel.php:1044
+#: ../../include/channel.php:1048 ../../include/page_widgets.php:9
+#: ../../include/page_widgets.php:39
msgid "Edit"
msgstr "Bearbeiten"
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
-#: ../../Zotlabs/Module/Connections.php:263
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Photos.php:1174
+#: ../../Zotlabs/Module/Editblock.php:134
+#: ../../Zotlabs/Module/Connections.php:271
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
-#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:242
+#: ../../Zotlabs/Module/Connedit.php:626 ../../Zotlabs/Module/Connedit.php:884
+#: ../../Zotlabs/Module/Group.php:177 ../../Zotlabs/Module/Blocks.php:162
+#: ../../Zotlabs/Module/Webpages.php:246
#: ../../Zotlabs/Module/Settings/Oauth.php:150
-#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/Apps.php:342
-#: ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
+#: ../../Zotlabs/Lib/Apps.php:358
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:676
+#: ../../include/conversation.php:656
msgid "Delete"
msgstr "Löschen"
@@ -353,12 +367,24 @@ msgstr "Datei hochladen"
msgid "Drop files here to immediately upload"
msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
-#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Group.php:72 ../../Zotlabs/Module/Dreport.php:10
+#: ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
+msgid "Permission denied"
+msgstr "Keine Berechtigung"
+
+#: ../../Zotlabs/Web/WebServer.php:128 ../../Zotlabs/Web/Router.php:67
#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
-#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Authtest.php:16
+#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
#: ../../Zotlabs/Module/Cover_photo.php:290
@@ -367,83 +393,69 @@ msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
-#: ../../Zotlabs/Module/Editwebpage.php:126
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
-#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:75
+#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
#: ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
-#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1098
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:135
+#: ../../Zotlabs/Module/Filestorage.php:120
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
-#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
-#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
-#: ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Manage.php:10 ../../Zotlabs/Module/Mitem.php:115
+#: ../../Zotlabs/Module/Appman.php:81 ../../Zotlabs/Module/Mood.php:116
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:636
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Invite.php:17
+#: ../../Zotlabs/Module/Invite.php:94 ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104 ../../Zotlabs/Module/Setup.php:212
#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
-#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
-#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Profile_photo.php:273
-#: ../../Zotlabs/Module/Profile_photo.php:286
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
-#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
+#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
+#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Profile.php:70
+#: ../../Zotlabs/Module/Profile.php:87 ../../Zotlabs/Module/Blocks.php:73
+#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
+#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
+#: ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Profile_photo.php:274
+#: ../../Zotlabs/Module/Profile_photo.php:287
+#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
+#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Message.php:18
#: ../../Zotlabs/Module/Service_limits.php:11
#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
-#: ../../Zotlabs/Module/Wiki.php:302 ../../Zotlabs/Module/Sources.php:74
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:49
+#: ../../Zotlabs/Module/Wiki.php:214 ../../Zotlabs/Module/Wiki.php:313
+#: ../../Zotlabs/Module/Wiki.php:318 ../../Zotlabs/Module/Sources.php:74
#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Mail.php:164
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
-#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Lib/Chatroom.php:137
#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
#: ../../extend/addon/addon/keepout/keepout.php:36
#: ../../extend/addon/addon/pumpio/pumpio.php:40
#: ../../extend/addon/addon/openid/Mod_Id.php:53
#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../include/items.php:3422 ../../include/attach.php:142
-#: ../../include/attach.php:189 ../../include/attach.php:253
-#: ../../include/attach.php:267 ../../include/attach.php:274
-#: ../../include/attach.php:341 ../../include/attach.php:355
-#: ../../include/attach.php:362 ../../include/attach.php:439
-#: ../../include/attach.php:906 ../../include/attach.php:977
-#: ../../include/attach.php:1135 ../../include/photos.php:27
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
+#: ../../include/attach.php:144 ../../include/attach.php:191
+#: ../../include/attach.php:255 ../../include/attach.php:269
+#: ../../include/attach.php:276 ../../include/attach.php:343
+#: ../../include/attach.php:357 ../../include/attach.php:364
+#: ../../include/attach.php:441 ../../include/attach.php:908
+#: ../../include/attach.php:979 ../../include/attach.php:1137
+#: ../../include/photos.php:27 ../../include/items.php:3445
msgid "Permission denied."
msgstr "Berechtigung verweigert."
-#: ../../Zotlabs/Web/Router.php:148 ../../include/help.php:63
-msgid "Not Found"
-msgstr "Nicht gefunden"
-
-#: ../../Zotlabs/Web/Router.php:151 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
-#: ../../include/help.php:66
+#: ../../Zotlabs/Web/Router.php:152 ../../Zotlabs/Module/Display.php:124
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Lib/NativeWikiPage.php:502 ../../include/help.php:66
msgid "Page not found."
msgstr "Seite nicht gefunden."
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
-#: ../../include/items.php:327
-msgid "Permission denied"
-msgstr "Keine Berechtigung"
-
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please"
@@ -452,19 +464,19 @@ msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angeme
#: ../../Zotlabs/Zot/Auth.php:250
#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:183
+#: ../../extend/addon/addon/openid/Mod_Openid.php:178
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
+#: ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
-#: ../../Zotlabs/Module/Filestorage.php:59
-#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../Zotlabs/Module/Hcard.php:12
#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:862
+#: ../../include/channel.php:945
msgid "Requested profile is not available."
msgstr "Das angefragte Profil ist nicht verfügbar."
@@ -472,13 +484,21 @@ msgstr "Das angefragte Profil ist nicht verfügbar."
msgid "Some blurb about what to do when you're new here"
msgstr "Ein Hinweis, was man tun kann, wenn man neu hier ist"
-#: ../../Zotlabs/Module/Chatsvc.php:117
-msgid "Away"
-msgstr "Abwesend"
+#: ../../Zotlabs/Module/Display.php:17 ../../Zotlabs/Module/Photos.php:508
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Ratings.php:83
+#: ../../Zotlabs/Module/Directory.php:64
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr "Öffentlichen Zugriff verweigert."
-#: ../../Zotlabs/Module/Chatsvc.php:122
-msgid "Online"
-msgstr "Online"
+#: ../../Zotlabs/Module/Display.php:38 ../../Zotlabs/Module/Admin.php:60
+#: ../../Zotlabs/Module/Admin/Themes.php:69
+#: ../../Zotlabs/Module/Admin/Plugins.php:254
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3366
+msgid "Item not found."
+msgstr "Element nicht gefunden."
#: ../../Zotlabs/Module/Register.php:49
msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
@@ -610,8 +630,8 @@ msgstr "Registrierung"
msgid "Membership on this site is by invitation only."
msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
-#: ../../boot.php:1701
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
+#: ../../boot.php:1713
msgid "Register"
msgstr "Registrieren"
@@ -626,60 +646,82 @@ msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Abs
msgid "Fetching URL returns error: %1$s"
msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profil-Ãœbereinstimmungen"
+#: ../../Zotlabs/Module/Photos.php:82
+msgid "Page owner information could not be retrieved."
+msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
+
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:220
+#: ../../include/photo/photo_driver.php:730
+msgid "Profile Photos"
+msgstr "Profilfotos"
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu."
+#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
+msgid "Album not found."
+msgstr "Album nicht gefunden."
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "interessiert sich für:"
+#: ../../Zotlabs/Module/Photos.php:112
+msgid "Delete Album"
+msgstr "Album löschen"
-#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
-#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
-#: ../../include/connections.php:78 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../include/conversation.php:971
-msgid "Connect"
-msgstr "Verbinden"
+#: ../../Zotlabs/Module/Photos.php:133
+msgid ""
+"Multiple storage folders exist with this album name, but within different "
+"directories. Please remove the desired folder or folders using the Files "
+"manager"
+msgstr "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager"
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Keine Ãœbereinstimmungen"
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
+msgid "Delete Photo"
+msgstr "Foto löschen"
-#: ../../Zotlabs/Module/Connedit.php:82
-msgid "Could not access contact record."
-msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
+#: ../../Zotlabs/Module/Photos.php:519
+msgid "No photos selected"
+msgstr "Keine Fotos ausgewählt"
-#: ../../Zotlabs/Module/Connedit.php:106
-msgid "Could not locate selected profile."
-msgstr "Gewähltes Profil nicht gefunden."
+#: ../../Zotlabs/Module/Photos.php:568
+msgid "Access to this item is restricted."
+msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
-#: ../../Zotlabs/Module/Connedit.php:258
-msgid "Connection updated."
-msgstr "Verbindung aktualisiert."
+#: ../../Zotlabs/Module/Photos.php:607
+#, php-format
+msgid "%1$.2f MB of %2$.2f MB photo storage used."
+msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Connedit.php:260
-msgid "Failed to update connection record."
-msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+#: ../../Zotlabs/Module/Photos.php:610
+#, php-format
+msgid "%1$.2f MB photo storage used."
+msgstr "%1$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Connedit.php:310
-msgid "is now connected to"
-msgstr "ist jetzt verbunden mit"
+#: ../../Zotlabs/Module/Photos.php:646
+msgid "Upload Photos"
+msgstr "Fotos hochladen"
-#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
-#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Photos.php:650
+msgid "Enter an album name"
+msgstr "Namen für ein neues Album eingeben"
+
+#: ../../Zotlabs/Module/Photos.php:651
+msgid "or select an existing album (doubleclick)"
+msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
+
+#: ../../Zotlabs/Module/Photos.php:652
+msgid "Create a status post for this upload"
+msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
+
+#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:218
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Connedit.php:402 ../../Zotlabs/Module/Connedit.php:740
+#: ../../Zotlabs/Module/Filestorage.php:160
#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
-#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Events.php:470
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
#: ../../extend/addon/addon/dwpost/dwpost.php:73
#: ../../extend/addon/addon/dwpost/dwpost.php:85
#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
@@ -724,24 +766,26 @@ msgstr "ist jetzt verbunden mit"
#: ../../extend/addon/addon/wppost/wppost.php:105
#: ../../extend/addon/addon/wppost/wppost.php:109
#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+#: ../../extend/addon/addon/cdav/cdav.php:234
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
msgid "No"
msgstr "Nein"
-#: ../../Zotlabs/Module/Connedit.php:411
-#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Admin/Site.php:220
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Connedit.php:402
+#: ../../Zotlabs/Module/Filestorage.php:160
#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
-#: ../../Zotlabs/Module/Settings/Channel.php:289
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Profiles.php:682
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Events.php:470
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
#: ../../extend/addon/addon/dwpost/dwpost.php:73
#: ../../extend/addon/addon/dwpost/dwpost.php:85
#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
@@ -786,308 +830,72 @@ msgstr "Nein"
#: ../../extend/addon/addon/wppost/wppost.php:105
#: ../../extend/addon/addon/wppost/wppost.php:109
#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../include/widgets.php:978 ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1723
+#: ../../extend/addon/addon/cdav/cdav.php:234
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1736
msgid "Yes"
msgstr "Ja"
-#: ../../Zotlabs/Module/Connedit.php:443
-msgid "Could not access address book record."
-msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
-
-#: ../../Zotlabs/Module/Connedit.php:463
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
-
-#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
-#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
-#: ../../Zotlabs/Module/Connedit.php:518
-msgid "Unable to set address book parameters."
-msgstr "Konnte die Adressbuch-Parameter nicht setzen."
-
-#: ../../Zotlabs/Module/Connedit.php:542
-msgid "Connection has been removed."
-msgstr "Verbindung wurde gelöscht."
-
-#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:221
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-#: ../../include/nav.php:89 ../../include/conversation.php:969
-msgid "View Profile"
-msgstr "Profil ansehen"
-
-#: ../../Zotlabs/Module/Connedit.php:585
-#, php-format
-msgid "View %s's profile"
-msgstr "%ss Profil ansehen"
-
-#: ../../Zotlabs/Module/Connedit.php:589
-msgid "Refresh Permissions"
-msgstr "Zugriffsrechte neu laden"
-
-#: ../../Zotlabs/Module/Connedit.php:592
-msgid "Fetch updated permissions"
-msgstr "Aktualisierte Zugriffsrechte abfragen"
-
-#: ../../Zotlabs/Module/Connedit.php:596
-msgid "Recent Activity"
-msgstr "Kürzliche Aktivitäten"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "View recent posts and comments"
-msgstr "Betrachte die neuesten Beiträge und Kommentare"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-#: ../../Zotlabs/Module/Admin/Accounts.php:175
-msgid "Unblock"
-msgstr "Freigeben"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-#: ../../Zotlabs/Module/Admin/Accounts.php:174
-msgid "Block"
-msgstr "Blockieren"
-
-#: ../../Zotlabs/Module/Connedit.php:606
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen"
-
-#: ../../Zotlabs/Module/Connedit.php:607
-msgid "This connection is blocked!"
-msgstr "Die Verbindung ist geblockt!"
-
-#: ../../Zotlabs/Module/Connedit.php:611
-msgid "Unignore"
-msgstr "Nicht ignorieren"
-
-#: ../../Zotlabs/Module/Connedit.php:611
-#: ../../Zotlabs/Module/Connections.php:277
-msgid "Ignore"
-msgstr "Ignorieren"
-
-#: ../../Zotlabs/Module/Connedit.php:614
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen"
-
-#: ../../Zotlabs/Module/Connedit.php:615
-msgid "This connection is ignored!"
-msgstr "Die Verbindung wird ignoriert!"
-
-#: ../../Zotlabs/Module/Connedit.php:619
-msgid "Unarchive"
-msgstr "Aus Archiv zurückholen"
-
-#: ../../Zotlabs/Module/Connedit.php:619
-msgid "Archive"
-msgstr "Archivieren"
-
-#: ../../Zotlabs/Module/Connedit.php:622
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)"
-
-#: ../../Zotlabs/Module/Connedit.php:623
-msgid "This connection is archived!"
-msgstr "Die Verbindung ist archiviert!"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-msgid "Unhide"
-msgstr "Wieder sichtbar machen"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-msgid "Hide"
-msgstr "Verstecken"
-
-#: ../../Zotlabs/Module/Connedit.php:630
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
-
-#: ../../Zotlabs/Module/Connedit.php:631
-msgid "This connection is hidden!"
-msgstr "Die Verbindung ist versteckt!"
-
-#: ../../Zotlabs/Module/Connedit.php:638
-msgid "Delete this connection"
-msgstr "Verbindung löschen"
-
-#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
-msgid "Me"
-msgstr "Ich"
-
-#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
-msgid "Family"
-msgstr "Familie"
-
-#: ../../Zotlabs/Module/Connedit.php:657
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-#: ../../include/widgets.php:531
-msgid "Friends"
-msgstr "Freunde"
-
-#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
-msgid "Acquaintances"
-msgstr "Bekannte"
-
-#: ../../Zotlabs/Module/Connedit.php:659
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
-msgid "All"
-msgstr "Alle"
-
-#: ../../Zotlabs/Module/Connedit.php:716
-msgid "Approve this connection"
-msgstr "Verbindung genehmigen"
-
-#: ../../Zotlabs/Module/Connedit.php:716
-msgid "Accept connection to allow communication"
-msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
-
-#: ../../Zotlabs/Module/Connedit.php:721
-msgid "Set Affinity"
-msgstr "Beziehung festlegen"
-
-#: ../../Zotlabs/Module/Connedit.php:724
-msgid "Set Profile"
-msgstr "Profil festlegen"
-
-#: ../../Zotlabs/Module/Connedit.php:727
-msgid "Set Affinity & Profile"
-msgstr "Beziehung und Profile festlegen"
-
-#: ../../Zotlabs/Module/Connedit.php:776
-msgid "none"
-msgstr "Keine"
-
-#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
-msgid "Connection Default Permissions"
-msgstr "Standardzugriffsrechte für neue Verbindungen:"
-
-#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
-#, php-format
-msgid "Connection: %s"
-msgstr "Verbindung: %s"
-
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Apply these permissions automatically"
-msgstr "Diese Berechtigungen automatisch anwenden"
-
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Connection requests will be approved without your interaction"
-msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
-
-#: ../../Zotlabs/Module/Connedit.php:784
-msgid "This connection's primary address is"
-msgstr "Die Hauptadresse der Verbindung ist"
-
-#: ../../Zotlabs/Module/Connedit.php:785
-msgid "Available locations:"
-msgstr "Verfügbare Klone:"
-
-#: ../../Zotlabs/Module/Connedit.php:789
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
-
-#: ../../Zotlabs/Module/Connedit.php:790
-msgid "Connection Tools"
-msgstr "Verbindungswerkzeuge"
-
-#: ../../Zotlabs/Module/Connedit.php:792
-msgid "Slide to adjust your degree of friendship"
-msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
-
-#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Bewertung"
-
-#: ../../Zotlabs/Module/Connedit.php:794
-msgid "Slide to adjust your rating"
-msgstr "Verschieben, um Deine Bewertung einzustellen"
-
-#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
-msgid "Optionally explain your rating"
-msgstr "Optional kannst Du Deine Bewertung begründen"
-
-#: ../../Zotlabs/Module/Connedit.php:797
-msgid "Custom Filter"
-msgstr "Benutzerdefinierter Filter"
-
-#: ../../Zotlabs/Module/Connedit.php:798
-msgid "Only import posts with this text"
-msgstr "Nur Beiträge mit diesem Text importieren"
-
-#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
-
-#: ../../Zotlabs/Module/Connedit.php:799
-msgid "Do not import posts with this text"
-msgstr "Beiträge mit diesem Text nicht importieren"
-
-#: ../../Zotlabs/Module/Connedit.php:801
-msgid "This information is public!"
-msgstr "Diese Information ist öffentlich!"
+#: ../../Zotlabs/Module/Photos.php:653
+msgid "Caption (optional):"
+msgstr "Beschriftung (optional):"
-#: ../../Zotlabs/Module/Connedit.php:806
-msgid "Connection Pending Approval"
-msgstr "Verbindung wartet auf Bestätigung"
+#: ../../Zotlabs/Module/Photos.php:654
+msgid "Description (optional):"
+msgstr "Beschreibung (optional):"
-#: ../../Zotlabs/Module/Connedit.php:809
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "geerbt"
+#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Connedit.php:637
+#: ../../Zotlabs/Module/Filestorage.php:152 ../../Zotlabs/Module/Thing.php:313
+#: ../../Zotlabs/Module/Thing.php:363 ../../Zotlabs/Module/Chat.php:234
+#: ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Berechtigungen"
-#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
+#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
#: ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Plugins.php:429
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Security.php:104
#: ../../Zotlabs/Module/Admin/Themes.php:156
#: ../../Zotlabs/Module/Admin/Account_edit.php:74
#: ../../Zotlabs/Module/Admin/Accounts.php:166
#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:126
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:384
-#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
-#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
+#: ../../Zotlabs/Module/Admin/Site.php:260
+#: ../../Zotlabs/Module/Admin/Plugins.php:433
+#: ../../Zotlabs/Module/Locs.php:121 ../../Zotlabs/Module/Connedit.php:847
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Import_items.php:122
+#: ../../Zotlabs/Module/Import.php:507 ../../Zotlabs/Module/Mitem.php:243
+#: ../../Zotlabs/Module/Appman.php:133 ../../Zotlabs/Module/Mood.php:139
+#: ../../Zotlabs/Module/Profiles.php:722 ../../Zotlabs/Module/Invite.php:149
#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
-#: ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Rate.php:166 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Wiki.php:167
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Channel.php:455
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Channel.php:476
#: ../../Zotlabs/Module/Settings/Display.php:196
+#: ../../Zotlabs/Module/Settings/Permcats.php:112
#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Mail.php:413 ../../Zotlabs/Module/Chat.php:196
#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../Zotlabs/Lib/ThreadItem.php:731
#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/diaspora/diaspora.php:714
#: ../../extend/addon/addon/dwpost/dwpost.php:89
#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
#: ../../extend/addon/addon/friendica/friendica.php:128
#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
#: ../../extend/addon/addon/hubwall/hubwall.php:95
#: ../../extend/addon/addon/ijpost/ijpost.php:89
#: ../../extend/addon/addon/irc/irc.php:53
@@ -1099,7 +907,7 @@ msgstr "geerbt"
#: ../../extend/addon/addon/nofed/nofed.php:80
#: ../../extend/addon/addon/nsabait/nsabait.php:161
#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
#: ../../extend/addon/addon/pageheader/pageheader.php:48
#: ../../extend/addon/addon/piwik/piwik.php:95
@@ -1117,7 +925,7 @@ msgstr "geerbt"
#: ../../extend/addon/addon/statusnet/statusnet.php:380
#: ../../extend/addon/addon/statusnet/statusnet.php:432
#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:114
+#: ../../extend/addon/addon/superblock/superblock.php:118
#: ../../extend/addon/addon/twitter/twitter.php:217
#: ../../extend/addon/addon/twitter/twitter.php:259
#: ../../extend/addon/addon/visage/visage.php:170
@@ -1126,205 +934,331 @@ msgstr "geerbt"
#: ../../extend/addon/addon/cdav/cdav.php:246
#: ../../extend/addon/addon/likebanner/likebanner.php:57
#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../include/js_strings.php:22 ../../include/widgets.php:796
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
+#: ../../include/widgets.php:815 ../../include/js_strings.php:22
#: ../../view/theme/redbasic/php/config.php:106
msgid "Submit"
msgstr "Absenden"
-#: ../../Zotlabs/Module/Connedit.php:811
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
+#: ../../Zotlabs/Module/Photos.php:685
+msgid "Album name could not be decoded"
+msgstr "Albumname konnte nicht dekodiert werden"
-#: ../../Zotlabs/Module/Connedit.php:813
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Deren Einstellungen"
+#: ../../Zotlabs/Module/Photos.php:729
+msgid "Contact Photos"
+msgstr "Kontakt-Bilder"
-#: ../../Zotlabs/Module/Connedit.php:814
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Meine Einstellungen"
+#: ../../Zotlabs/Module/Photos.php:752
+msgid "Show Newest First"
+msgstr "Neueste zuerst anzeigen"
-#: ../../Zotlabs/Module/Connedit.php:816
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-msgid "Individual Permissions"
-msgstr "Individuelle Zugriffsrechte"
+#: ../../Zotlabs/Module/Photos.php:754
+msgid "Show Oldest First"
+msgstr "Älteste zuerst anzeigen"
-#: ../../Zotlabs/Module/Connedit.php:817
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
+#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1708
+msgid "View Photo"
+msgstr "Foto ansehen"
-#: ../../Zotlabs/Module/Connedit.php:818
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
+#: ../../Zotlabs/Module/Photos.php:809
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1725
+msgid "Edit Album"
+msgstr "Album bearbeiten"
-#: ../../Zotlabs/Module/Connedit.php:819
-msgid "Last update:"
-msgstr "Letzte Aktualisierung:"
+#: ../../Zotlabs/Module/Photos.php:856
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
-msgstr "Ungültige Beitrags-ID (mid)"
+#: ../../Zotlabs/Module/Photos.php:858
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
-msgstr "keine Ergebnisse"
+#: ../../Zotlabs/Module/Photos.php:916
+msgid "Use as profile photo"
+msgstr "Als Profilfoto verwenden"
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
-msgstr "Kanal-Sync verarbeitet"
+#: ../../Zotlabs/Module/Photos.php:917
+msgid "Use as cover photo"
+msgstr "Als Titelbild verwenden"
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "zur Warteschlange hinzugefügt"
+#: ../../Zotlabs/Module/Photos.php:924
+msgid "Private Photo"
+msgstr "Privates Foto"
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "zugestellt"
+#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:689
+#: ../../Zotlabs/Module/Events.php:698
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Voriges"
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "für Zustellung akzeptiert"
+#: ../../Zotlabs/Module/Photos.php:939
+msgid "View Full Size"
+msgstr "In voller Größe anzeigen"
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "aktualisiert"
+#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Nächste"
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "Aktualisierung ignoriert"
+#: ../../Zotlabs/Module/Photos.php:984
+#: ../../Zotlabs/Module/Admin/Plugins.php:450
+#: ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:114
+msgid "Remove"
+msgstr "Entfernen"
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "Zugriff verweigert"
+#: ../../Zotlabs/Module/Photos.php:1028
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "Empfänger nicht gefunden."
+#: ../../Zotlabs/Module/Photos.php:1030
+msgid "Rotate CW (right)"
+msgstr "Drehen im UZS (rechts)"
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "Mail widerrufen"
+#: ../../Zotlabs/Module/Photos.php:1031
+msgid "Rotate CCW (left)"
+msgstr "Drehen gegen UZS (links)"
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "Doppelte Mail erhalten"
+#: ../../Zotlabs/Module/Photos.php:1034
+msgid "Move photo to album"
+msgstr "Foto in Album verschieben"
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "Mail zugestellt"
+#: ../../Zotlabs/Module/Photos.php:1035
+msgid "Enter a new album name"
+msgstr "Gib einen Namen für ein neues Album ein"
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Zustellungsbericht für %1$s"
+#: ../../Zotlabs/Module/Photos.php:1036
+msgid "or select an existing one (doubleclick)"
+msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Optionen"
+#: ../../Zotlabs/Module/Photos.php:1039
+msgid "Caption"
+msgstr "Bildunterschrift"
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
-msgstr "Erneut zustellen"
+#: ../../Zotlabs/Module/Photos.php:1041
+msgid "Add a Tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Lesezeichen hinzugefügt"
+#: ../../Zotlabs/Module/Photos.php:1049
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
+msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Meine Lesezeichen"
+#: ../../Zotlabs/Module/Photos.php:1052
+msgid "Flag as adult in album view"
+msgstr "In der Albumansicht als nicht jugendfrei markieren"
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Lesezeichen meiner Kontakte"
+#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
+msgid "I like this (toggle)"
+msgstr "Mir gefällt das (Umschalter)"
+
+#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
+msgid "I don't like this (toggle)"
+msgstr "Mir gefällt das nicht (Umschalter)"
+
+#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Blocks.php:161
+#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:245
+#: ../../extend/addon/addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1378
+msgid "Share"
+msgstr "Teilen"
+
+#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
+#: ../../include/conversation.php:738
+msgid "Please wait"
+msgstr "Bitte warten"
+
+#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
+#: ../../Zotlabs/Lib/ThreadItem.php:728
+msgid "This is you"
+msgstr "Das bist Du"
+
+#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../../Zotlabs/Module/Photos.php:1094 ../../Zotlabs/Module/Events.php:478
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../include/conversation.php:1347 ../../include/page_widgets.php:43
+msgid "Preview"
+msgstr "Vorschau"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Likes"
+msgstr "Gefällt mir"
+
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
+msgctxt "title"
+msgid "Dislikes"
+msgstr "Gefällt mir nicht"
+
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Agree"
+msgstr "Zustimmungen"
+
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Disagree"
+msgstr "Ablehnungen"
+
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
+msgctxt "title"
+msgid "Abstain"
+msgstr "Enthaltungen"
+
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Attending"
+msgstr "Zusagen"
+
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Not attending"
+msgstr "Absagen"
+
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
+msgctxt "title"
+msgid "Might attend"
+msgstr "Vielleicht"
+
+#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
+#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
+#: ../../include/conversation.php:1928
+msgid "View all"
+msgstr "Alles anzeigen"
+
+#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
+#: ../../include/channel.php:1273
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Gefällt mir"
+msgstr[1] "Gefällt mir"
+
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1955
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "Gefällt nicht"
+msgstr[1] "Gefällt nicht"
+
+#: ../../Zotlabs/Module/Photos.php:1236
+msgid "Photo Tools"
+msgstr "Fotowerkzeuge"
+
+#: ../../Zotlabs/Module/Photos.php:1245
+msgid "In This Photo:"
+msgstr "Auf diesem Foto:"
+
+#: ../../Zotlabs/Module/Photos.php:1250
+msgid "Map"
+msgstr "Karte"
+
+#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
+msgctxt "noun"
+msgid "Likes"
+msgstr "Gefällt mir"
+
+#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "Gefällt nicht"
+
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
+#: ../../include/acl_selectors.php:220
+msgid "Close"
+msgstr "Schließen"
-#: ../../Zotlabs/Module/Acl.php:313
+#: ../../Zotlabs/Module/Photos.php:1341
+msgid "View Album"
+msgstr "Album ansehen"
+
+#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
+#: ../../Zotlabs/Module/Photos.php:1366
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
+
+#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editblock.php:79
+#: ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editwebpage.php:80
+msgid "Item not found"
+msgstr "Element nicht gefunden"
+
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Element kann nicht bearbeitet werden."
+
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
+msgstr "Bearbeite Beitrag"
+
+#: ../../Zotlabs/Module/Acl.php:117 ../../Zotlabs/Module/Lockview.php:117
+#: ../../Zotlabs/Module/Lockview.php:153 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr "Profil"
+
+#: ../../Zotlabs/Module/Acl.php:344
msgid "network"
msgstr "Netzwerk"
-#: ../../Zotlabs/Module/Acl.php:323
+#: ../../Zotlabs/Module/Acl.php:354
msgid "RSS"
msgstr "RSS"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Klon nicht gefunden."
-
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
-
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Suche in der Dokumentation"
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Synchronisiere Klone"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
+msgid "About"
+msgstr "Ãœber"
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Keine Klon-Adressen gefunden."
+#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Mitglieder"
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Klon-Adressen verwalten"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administratoren"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
-#: ../../Zotlabs/Module/Events.php:468
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ort"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Entwickler"
-#: ../../Zotlabs/Module/Locs.php:118
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Profiles.php:464
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Adresse"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutorials"
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primär"
-
-#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
-msgid "Drop"
-msgstr "Löschen"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "$Projectname-Dokumentation"
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Jetzt synchronisieren"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Inhalt"
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Lesezeichen hinzugefügt"
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
+#: ../../Zotlabs/Module/Bookmarks.php:75
+msgid "My Bookmarks"
+msgstr "Meine Lesezeichen"
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
+#: ../../Zotlabs/Module/Bookmarks.php:86
+msgid "My Connections Bookmarks"
+msgstr "Lesezeichen meiner Kontakte"
#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
msgid "Continue"
@@ -1369,12 +1303,112 @@ msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
msgid "Restricted or Premium Channel"
msgstr "Eingeschränkter oder Premium-Kanal"
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "Anzahl der Konten"
+
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "Anzahl der blockierten Konten"
+
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "Anzahl der abgelaufenen Konten"
+
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "Anzahl der ablaufenden Konten"
+
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "Anzahl der Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "Anzahl der primären Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "Anzahl der Klone"
+
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Nachrichten-Warteschlangen"
+
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Die installierte Software sollte aktualisiert werden"
+
+#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Themes.php:120
+#: ../../Zotlabs/Module/Admin/Themes.php:154
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:258
+#: ../../Zotlabs/Module/Admin/Plugins.php:336
+#: ../../Zotlabs/Module/Admin/Plugins.php:431
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Registrierte Konten"
+
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Ausstehende Registrierungen"
+
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Registrierte Kanäle"
+
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Aktive Plug-Ins"
+
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Version"
+
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Repository-Version (master)"
+
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Repository-Version (dev)"
+
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
+msgstr "Block-Name"
+
+#: ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
+#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:207
+#: ../../include/conversation.php:1295
+msgid "Insert web link"
+msgstr "Link einfügen"
+
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
+msgid "Title (optional)"
+msgstr "Titel (optional)"
+
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
+msgstr "Block bearbeiten"
+
#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
msgid "Invalid item."
msgstr "Ungültiges Element."
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Chanview.php:96
#: ../../Zotlabs/Module/Wall_upload.php:31
msgid "Channel not found."
msgstr "Kanal nicht gefunden."
@@ -1399,91 +1433,67 @@ msgstr "– auswählen –"
#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
-#: ../../include/text.php:999 ../../include/widgets.php:201
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:202
+#: ../../include/text.php:1005 ../../include/text.php:1017
msgid "Save"
msgstr "Speichern"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Neuen Kanal anlegen"
-
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
-#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr "Neu anlegen"
-
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:214
-#: ../../include/nav.php:209
-msgid "Channel Manager"
-msgstr "Kanal-Manager"
-
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Aktueller Kanal"
-
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
-
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Standard Kanal"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "hat Dir eine private Nachricht geschickt"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Zum Standard machen"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "hat deinen Kanal hinzugefügt"
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d neue Nachrichten"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "l, d. F, G:i \\U\\h\\r"
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d neue Vorstellungen"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[Heute]"
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Delegierte Kanäle"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "hat einen Termin veröffentlicht"
#: ../../Zotlabs/Module/Connections.php:56
#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
+#: ../../Zotlabs/Module/Connections.php:250
msgid "Blocked"
msgstr "Blockiert"
#: ../../Zotlabs/Module/Connections.php:61
#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
+#: ../../Zotlabs/Module/Connections.php:249
msgid "Ignored"
msgstr "Ignoriert"
#: ../../Zotlabs/Module/Connections.php:66
#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
+#: ../../Zotlabs/Module/Connections.php:248
msgid "Hidden"
msgstr "Versteckt"
#: ../../Zotlabs/Module/Connections.php:71
#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
+#: ../../Zotlabs/Module/Connections.php:247
msgid "Archived"
msgstr "Archiviert"
#: ../../Zotlabs/Module/Connections.php:76
#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1594
+#: ../../include/conversation.php:1724
msgid "New"
msgstr "Neu"
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107
+#: ../../Zotlabs/Module/Connedit.php:674 ../../include/widgets.php:544
+msgid "All"
+msgstr "Alle"
+
#: ../../Zotlabs/Module/Connections.php:138
msgid "New Connections"
msgstr "Neue Verbindungen"
@@ -1493,7 +1503,7 @@ msgid "Show pending (new) connections"
msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
+#: ../../Zotlabs/Module/Profperm.php:140
msgid "All Connections"
msgstr "Alle Verbindungen"
@@ -1517,79 +1527,88 @@ msgstr "Nur archivierte Verbindungen anzeigen"
msgid "Only show hidden connections"
msgstr "Nur versteckte Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:238
+#: ../../Zotlabs/Module/Connections.php:246
msgid "Pending approval"
msgstr "Wartet auf Genehmigung"
-#: ../../Zotlabs/Module/Connections.php:254
+#: ../../Zotlabs/Module/Connections.php:262
#, php-format
msgid "%1$s [%2$s]"
msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Connections.php:255
+#: ../../Zotlabs/Module/Connections.php:263
msgid "Edit connection"
msgstr "Verbindung bearbeiten"
-#: ../../Zotlabs/Module/Connections.php:256
+#: ../../Zotlabs/Module/Connections.php:264
msgid "Delete connection"
msgstr "Verbindung löschen"
-#: ../../Zotlabs/Module/Connections.php:265
+#: ../../Zotlabs/Module/Connections.php:273
msgid "Channel address"
msgstr "Kanaladresse"
-#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Connections.php:275
msgid "Network"
msgstr "Netzwerk"
-#: ../../Zotlabs/Module/Connections.php:270
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Call"
+msgstr "Anruf"
+
+#: ../../Zotlabs/Module/Connections.php:280
msgid "Status"
msgstr "Status"
-#: ../../Zotlabs/Module/Connections.php:272
+#: ../../Zotlabs/Module/Connections.php:282
msgid "Connected"
msgstr "Verbunden"
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:284
msgid "Approve connection"
msgstr "Verbindung genehmigen"
-#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Connections.php:285
#: ../../Zotlabs/Module/Admin/Accounts.php:171
msgid "Approve"
msgstr "Genehmigen"
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:286
msgid "Ignore connection"
msgstr "Verbindung ignorieren"
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:287
+#: ../../Zotlabs/Module/Connedit.php:602
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../../Zotlabs/Module/Connections.php:288
msgid "Recent activity"
msgstr "Kürzliche Aktivitäten"
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:209
-#: ../../include/nav.php:189 ../../include/text.php:916
+#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:934 ../../include/nav.php:203
msgid "Connections"
msgstr "Verbindungen"
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/nav.php:168
-#: ../../include/text.php:986 ../../include/text.php:998
-#: ../../include/widgets.php:315 ../../include/acl_selectors.php:203
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:237 ../../include/acl_selectors.php:213
+#: ../../include/widgets.php:316 ../../include/text.php:1004
+#: ../../include/text.php:1016 ../../include/nav.php:180
msgid "Search"
msgstr "Suche"
-#: ../../Zotlabs/Module/Connections.php:307
+#: ../../Zotlabs/Module/Connections.php:317
msgid "Search your connections"
msgstr "Verbindungen durchsuchen"
-#: ../../Zotlabs/Module/Connections.php:308
+#: ../../Zotlabs/Module/Connections.php:318
msgid "Connections search"
msgstr "Verbindung suchen"
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../Zotlabs/Module/Directory.php:391
-#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+#: ../../Zotlabs/Module/Connections.php:319
+#: ../../Zotlabs/Module/Directory.php:392
+#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
msgid "Find"
msgstr "Finde"
@@ -1609,61 +1628,61 @@ msgid "Image resize failed."
msgstr "Bild-Anpassung fehlgeschlagen."
#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+#: ../../Zotlabs/Module/Profile_photo.php:197 ../../include/photos.php:149
msgid "Unable to process image"
msgstr "Kann Bild nicht verarbeiten"
#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:231
+#: ../../Zotlabs/Module/Profile_photo.php:232
msgid "Image upload failed."
msgstr "Hochladen des Bilds fehlgeschlagen."
#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:250
+#: ../../Zotlabs/Module/Profile_photo.php:251
msgid "Unable to process image."
msgstr "Kann Bild nicht verarbeiten."
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4276
msgid "female"
msgstr "weiblich"
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4277
#, php-format
msgid "%1$s updated her %2$s"
msgstr "%1$s hat ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4278
msgid "male"
msgstr "männlich"
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4279
#, php-format
msgid "%1$s updated his %2$s"
msgstr "%1$s hat sein %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4281
#, php-format
msgid "%1$s updated their %2$s"
msgstr "%1$s hat sein/ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
msgid "cover photo"
msgstr "Cover Foto"
#: ../../Zotlabs/Module/Cover_photo.php:303
#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Profile_photo.php:352
+#: ../../Zotlabs/Module/Profile_photo.php:312
+#: ../../Zotlabs/Module/Profile_photo.php:354
msgid "Photo not available."
msgstr "Foto nicht verfügbar."
#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:407
+#: ../../Zotlabs/Module/Profile_photo.php:409
msgid "Upload File:"
msgstr "Datei hochladen:"
#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:408
+#: ../../Zotlabs/Module/Profile_photo.php:410
msgid "Select a profile:"
msgstr "Wähle ein Profil:"
@@ -1672,33 +1691,33 @@ msgid "Upload Cover Photo"
msgstr "Cover Foto hochladen"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
-#: ../../Zotlabs/Module/Settings/Channel.php:399
+#: ../../Zotlabs/Module/Profile_photo.php:418
+#: ../../Zotlabs/Module/Settings/Channel.php:404
msgid "or"
msgstr "oder"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Profile_photo.php:418
msgid "skip this step"
msgstr "diesen Schritt überspringen"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Profile_photo.php:418
msgid "select a photo from your photo albums"
msgstr "ein Foto aus meinen Fotoalben"
#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:435
+#: ../../Zotlabs/Module/Profile_photo.php:437
msgid "Crop Image"
msgstr "Bild zuschneiden"
#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:436
+#: ../../Zotlabs/Module/Profile_photo.php:438
msgid "Please adjust the image cropping for optimum viewing."
msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:438
+#: ../../Zotlabs/Module/Profile_photo.php:440
msgid "Done Editing"
msgstr "Bearbeitung fertigstellen"
@@ -1727,20 +1746,8 @@ msgstr "Zusätzliche Funktionen verwalten"
msgid "Log settings updated."
msgstr "Protokoll-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
-msgid "Administration"
-msgstr "Administration"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1658
-#: ../../include/widgets.php:1668
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1618
+#: ../../include/widgets.php:1628
msgid "Logs"
msgstr "Protokolle"
@@ -1766,156 +1773,6 @@ msgstr "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverz
msgid "Log level"
msgstr "Protokollstufe"
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
-#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
-msgid "Item not found."
-msgstr "Element nicht gefunden."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plug-In %s deaktiviert."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plug-In %s aktiviert."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-msgid "Disable"
-msgstr "Deaktivieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
-#: ../../Zotlabs/Module/Admin/Themes.php:95
-msgid "Enable"
-msgstr "Aktivieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1636
-msgid "Plugins"
-msgstr "Plug-Ins"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-msgid "Toggle"
-msgstr "Umschalten"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:339
-#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:211 ../../include/widgets.php:680
-msgid "Settings"
-msgstr "Einstellungen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-msgid "Author: "
-msgstr "Autor: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-msgid "Maintainer: "
-msgstr "Betreuer:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
-msgstr "Minimale Version des Projekts:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
-msgstr "Maximale Version des Projekts:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
-msgstr "Minimale PHP Version:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
-msgstr "Kompatible Serverrollen: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
-msgstr "Benötigt:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-msgid "Disabled - version incompatibility"
-msgstr "Abgeschaltet - Versionsinkompatibilität"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:402
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr "Gib die öffentliche Git-Repository-URL des Plugin-Repository an."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:403
-msgid "Plugin repo git URL"
-msgstr "Plugin-Repository Git URL"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:404
-msgid "Custom repo name"
-msgstr "Benutzerdefinierter Repository-Name"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:404
-msgid "(optional)"
-msgstr "(optional)"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:405
-msgid "Download Plugin Repo"
-msgstr "Plugin-Repository herunterladen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:412
-msgid "Install new repo"
-msgstr "Neues Repository installieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:334
-msgid "Install"
-msgstr "Installieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:414
-#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Wiki.php:242 ../../Zotlabs/Module/Wiki.php:277
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../include/conversation.php:1264 ../../include/conversation.php:1313
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:435
-msgid "Manage Repos"
-msgstr "Repositorien verwalten"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:436
-msgid "Installed Plugin Repositories"
-msgstr "Installierte Plugin-Repositorien"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Install a New Plugin Repository"
-msgstr "Ein neues Plugin-Repository installieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:443
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:334
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Aktualisieren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:444
-msgid "Switch branch"
-msgstr "Zweig/Branch wechseln"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:445
-#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:110
-msgid "Remove"
-msgstr "Entfernen"
-
#: ../../Zotlabs/Module/Admin/Profs.php:69
msgid "New Profile Field"
msgstr "Neues Profilfeld"
@@ -1963,7 +1820,7 @@ msgstr "Feld-Definition nicht gefunden"
msgid "Edit Profile Field"
msgstr "Profilfeld bearbeiten"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1639
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1599
msgid "Profile Fields"
msgstr "Profil Felder"
@@ -1991,34 +1848,6 @@ msgstr "Benutzerdefinierte Felder"
msgid "Create Custom Field"
msgstr "Erstelle benutzerdefiniertes Feld"
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Queue Statistics"
-msgstr "Warteschlangenstatistiken"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Total Entries"
-msgstr "Einträge insgesamt"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Priority"
-msgstr "Priorität"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Destination URL"
-msgstr "Ziel-URL"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Mark hub permanently offline"
-msgstr "Hub als permanent offline markieren"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Empty queue for this hub"
-msgstr "Warteschlange für diesen Hub leeren"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:42
-msgid "Last known contact"
-msgstr "Letzter Kontakt"
-
#: ../../Zotlabs/Module/Admin/Security.php:77
msgid ""
"By default, unfiltered HTML is allowed in embedded media. This is inherently"
@@ -2043,7 +1872,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr "Alle anderen eingebetteten Inhalte werden gefiltert, <strong>es sei denn</strong>, eingebettete Inhalte von einer bestimmten Seite sind explizit blockiert."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1634
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1594
msgid "Security"
msgstr "Sicherheit"
@@ -2089,7 +1918,7 @@ msgstr "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deine
#: ../../Zotlabs/Module/Admin/Security.php:94
msgid "Allow communications only from these sites"
-msgstr "Kommunikation nur von diesen Seiten erlauben"
+msgstr "Kommunikation nur von diesen Servern/Domains erlauben"
#: ../../Zotlabs/Module/Admin/Security.php:94
msgid ""
@@ -2099,7 +1928,7 @@ msgstr "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend
#: ../../Zotlabs/Module/Admin/Security.php:95
msgid "Block communications from these sites"
-msgstr "Kommunikation von diesen Seiten blockieren"
+msgstr "Kommunikation von diesen Servern/Domains blockieren"
#: ../../Zotlabs/Module/Admin/Security.php:96
msgid "Allow communications only from these channels"
@@ -2129,7 +1958,7 @@ msgstr "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt
#: ../../Zotlabs/Module/Admin/Security.php:100
msgid "Block embedded HTML from these domains"
-msgstr "Eingebettete HTML Inhalte von diesen Seiten blockieren"
+msgstr "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren"
#: ../../Zotlabs/Module/Admin/Themes.php:18
msgid "Theme settings updated."
@@ -2139,15 +1968,46 @@ msgstr "Theme-Einstellungen aktualisiert."
msgid "No themes found."
msgstr "Keine Theme gefunden."
+#: ../../Zotlabs/Module/Admin/Themes.php:93
+#: ../../Zotlabs/Module/Admin/Plugins.php:305
+msgid "Disable"
+msgstr "Deaktivieren"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:95
+#: ../../Zotlabs/Module/Admin/Plugins.php:308
+msgid "Enable"
+msgstr "Aktivieren"
+
#: ../../Zotlabs/Module/Admin/Themes.php:114
msgid "Screenshot"
msgstr "Bildschirmfoto"
#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1637
+#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1597
msgid "Themes"
msgstr "Themes"
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Plugins.php:338
+msgid "Toggle"
+msgstr "Umschalten"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Plugins.php:339 ../../Zotlabs/Lib/Apps.php:223
+#: ../../include/widgets.php:699 ../../include/nav.php:225
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:132
+#: ../../Zotlabs/Module/Admin/Plugins.php:346
+msgid "Author: "
+msgstr "Autor: "
+
+#: ../../Zotlabs/Module/Admin/Themes.php:133
+#: ../../Zotlabs/Module/Admin/Plugins.php:347
+msgid "Maintainer: "
+msgstr "Betreuer:"
+
#: ../../Zotlabs/Module/Admin/Themes.php:160
msgid "[Experimental]"
msgstr "[Experimentell]"
@@ -2227,7 +2087,7 @@ msgid "Account '%s' unblocked"
msgstr "Konto '%s' freigegeben"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1632
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1592
msgid "Accounts"
msgstr "Konten"
@@ -2246,12 +2106,13 @@ msgstr "Antragsdatum"
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:871
#: ../../extend/addon/addon/redred/redred.php:107
#: ../../extend/addon/addon/rtof/rtof.php:93
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
#: ../../extend/addon/addon/openid/MysqlProvider.php:56
#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2237
+#: ../../include/network.php:2247
msgid "Email"
msgstr "E-Mail"
@@ -2263,11 +2124,21 @@ msgstr "Keine Registrierungen."
msgid "Deny"
msgstr "Verweigern"
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+#: ../../Zotlabs/Module/Connedit.php:594
+msgid "Block"
+msgstr "Blockieren"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+#: ../../Zotlabs/Module/Connedit.php:594
+msgid "Unblock"
+msgstr "Freigeben"
+
#: ../../Zotlabs/Module/Admin/Accounts.php:180
msgid "ID"
msgstr "ID"
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
msgid "All Channels"
msgstr "Alle Kanäle"
@@ -2349,7 +2220,7 @@ msgstr "Code für Kanal '%s' freigegeben"
msgid "Channel '%s' code disallowed"
msgstr "Code für Kanal '%s' gesperrt"
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1633
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1593
msgid "Channels"
msgstr "Kanäle"
@@ -2370,7 +2241,7 @@ msgid "Disallow Code"
msgstr "Code sperren"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1671
+#: ../../include/conversation.php:1815
msgid "Channel"
msgstr "Kanal"
@@ -2378,6 +2249,13 @@ msgstr "Kanal"
msgid "UID"
msgstr "UID"
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:874
+#: ../../Zotlabs/Module/Profiles.php:503
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Adresse"
+
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2434,7 +2312,7 @@ msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
msgid "Site settings updated."
msgstr "Site-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2931
msgid "Default"
msgstr "Standard"
@@ -2507,7 +2385,7 @@ msgstr "Experte - Ich kann Computercode schreiben"
msgid "Wizard - I probably know more than you do"
msgstr "Zauberer - ich kann wahrscheinlich mehr als Du"
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1631
+#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1591
msgid "Site"
msgstr "Seite"
@@ -2801,61 +2679,152 @@ msgstr "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) In
msgid "0 for no expiration of imported content"
msgstr "0 = keine Löschung importierter Inhalte"
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1454
-msgid "Public Hubs"
-msgstr "Öffentliche Hubs"
+#: ../../Zotlabs/Module/Admin/Plugins.php:284
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plug-In %s deaktiviert."
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plug-In %s aktiviert."
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Hub-URL"
+#: ../../Zotlabs/Module/Admin/Plugins.php:337
+#: ../../Zotlabs/Module/Admin/Plugins.php:432 ../../include/widgets.php:1596
+msgid "Plugins"
+msgstr "Plug-Ins"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Zugriffstyp"
+#: ../../Zotlabs/Module/Admin/Plugins.php:348
+msgid "Minimum project version: "
+msgstr "Minimale Version des Projekts:"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Registrierungsrichtlinien"
+#: ../../Zotlabs/Module/Admin/Plugins.php:349
+msgid "Maximum project version: "
+msgstr "Maximale Version des Projekts:"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Statistiken"
+#: ../../Zotlabs/Module/Admin/Plugins.php:350
+msgid "Minimum PHP version: "
+msgstr "Minimale PHP Version:"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+msgid "Compatible Server Roles: "
+msgstr "Kompatible Serverrollen: "
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:974
-msgid "Ratings"
-msgstr "Bewertungen"
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+msgid "Requires: "
+msgstr "Benötigt:"
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Bewerten"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+#: ../../Zotlabs/Module/Admin/Plugins.php:437
+msgid "Disabled - version incompatibility"
+msgstr "Abgeschaltet - Versionsinkompatibilität"
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
-#: ../../include/page_widgets.php:42 ../../include/widgets.php:967
-msgid "View"
-msgstr "Ansicht"
+#: ../../Zotlabs/Module/Admin/Plugins.php:406
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Gib die öffentliche Git-Repository-URL des Plugin-Repository an."
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editpost.php:24
-msgid "Item not found"
-msgstr "Element nicht gefunden"
+#: ../../Zotlabs/Module/Admin/Plugins.php:407
+msgid "Plugin repo git URL"
+msgstr "Plugin-Repository Git URL"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:408
+msgid "Custom repo name"
+msgstr "Benutzerdefinierter Repository-Name"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:408
+msgid "(optional)"
+msgstr "(optional)"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:409
+msgid "Download Plugin Repo"
+msgstr "Plugin-Repository herunterladen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:416
+msgid "Install new repo"
+msgstr "Neues Repository installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:417 ../../Zotlabs/Lib/Apps.php:348
+msgid "Install"
+msgstr "Installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:418
+#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Wiki.php:263
+#: ../../Zotlabs/Module/Wiki.php:288
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:440
+msgid "Manage Repos"
+msgstr "Repositorien verwalten"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:441
+msgid "Installed Plugin Repositories"
+msgstr "Installierte Plugin-Repositorien"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Install a New Plugin Repository"
+msgstr "Ein neues Plugin-Repository installieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:448
+#: ../../Zotlabs/Module/Connedit.php:883
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:449
+msgid "Switch branch"
+msgstr "Zweig/Branch wechseln"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Warteschlangenstatistiken"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Einträge insgesamt"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Priorität"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "Ziel-URL"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Hub als permanent offline markieren"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Warteschlange für diesen Hub leeren"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Letzter Kontakt"
+
+#: ../../Zotlabs/Module/Search.php:223
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Beiträge mit Schlagwort: %s"
+
+#: ../../Zotlabs/Module/Search.php:225
+#, php-format
+msgid "Search results for: %s"
+msgstr "Suchergebnisse für: %s"
#: ../../Zotlabs/Module/Editlayout.php:127
#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
@@ -2875,38 +2844,122 @@ msgstr "Layout bearbeiten"
msgid "Page link"
msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:258
-#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1165
-msgid "Insert web link"
-msgstr "Link einfügen"
-
#: ../../Zotlabs/Module/Editwebpage.php:169
msgid "Edit Webpage"
msgstr "Webseite bearbeiten"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:222
-#: ../../include/nav.php:95 ../../include/conversation.php:1692
-msgid "Photos"
-msgstr "Fotos"
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Mögen/Nicht mögen"
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
-#: ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-msgid "You must be logged in to see this page."
-msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
-msgstr "Beiträge und Kommentare"
+#: ../../Zotlabs/Module/Like.php:25
+msgid ""
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
-msgstr "Nur Beiträge"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Ungültige Anfrage."
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
+msgid "channel"
+msgstr "Kanal"
+
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "Sache"
+
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Kanal nicht vorhanden."
+
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Die vorherige Aktion wurde rückgängig gemacht."
+
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../Zotlabs/Module/Tagger.php:47
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
+#: ../../include/conversation.php:120 ../../include/text.php:1953
+msgid "photo"
+msgstr "Foto"
+
+#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
+#: ../../extend/addon/addon/diaspora/inbound.php:1794
+#: ../../include/conversation.php:148 ../../include/text.php:1959
+msgid "status"
+msgstr "Status"
+
+#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Events.php:260
+#: ../../Zotlabs/Module/Tagger.php:51 ../../include/conversation.php:123
+#: ../../include/text.php:1956 ../../include/event.php:1000
+msgid "event"
+msgstr "Termin"
+
+#: ../../Zotlabs/Module/Like.php:419
+#: ../../extend/addon/addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:164
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s"
+
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s nicht"
+
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s stimmt %2$ss %3$s zu"
+
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s lehnt %2$ss %3$s ab"
+
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s enthält sich zu %2$ss %3$s"
+
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s teil"
+
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
+
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
+
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Aktion durchgeführt."
+
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Vielen Dank."
+
+#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+msgid "This site is not a directory server"
+msgstr "Diese Webseite ist kein Verzeichnisserver"
+
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
#: ../../Zotlabs/Module/Network.php:96
msgid "No such group"
@@ -2972,18 +3025,22 @@ msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
msgid "Submit and proceed"
msgstr "Absenden und fortfahren"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2284
msgid "Menus"
msgstr "Menüs"
+#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
+msgid "Drop"
+msgstr "Löschen"
+
#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
+#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:255
#: ../../include/page_widgets.php:47
msgid "Created"
msgstr "Erstellt"
#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:252
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
#: ../../include/page_widgets.php:48
msgid "Edited"
msgstr "Geändert"
@@ -3045,98 +3102,545 @@ msgstr "Erlaube Lesezeichen"
msgid "Not found."
msgstr "Nicht gefunden."
-#: ../../Zotlabs/Module/Appman.php:37 ../../Zotlabs/Module/Appman.php:53
-msgid "App installed."
-msgstr "App installiert."
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Klon nicht gefunden."
-#: ../../Zotlabs/Module/Appman.php:46
-msgid "Malformed app."
-msgstr "Fehlerhafte App."
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Nachschlagen des Kanal-Ortes fehlgeschlagen"
-#: ../../Zotlabs/Module/Appman.php:104
-msgid "Embed code"
-msgstr "Code einbetten"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst."
-#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
-msgid "Edit App"
-msgstr "App bearbeiten"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Synchronisiere Klone"
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Create App"
-msgstr "App erstellen"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Keine Klon-Adressen gefunden."
-#: ../../Zotlabs/Module/Appman.php:115
-msgid "Name of app"
-msgstr "Name der App"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Klon-Adressen verwalten"
-#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
-#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr "Benötigt"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Profiles.php:510 ../../Zotlabs/Module/Profiles.php:733
+#: ../../Zotlabs/Module/Events.php:475
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ort"
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Location (URL) of app"
-msgstr "Ort (URL) der App"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primär"
-#: ../../Zotlabs/Module/Appman.php:117 ../../Zotlabs/Module/Rbmark.php:101
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:133
-msgid "Description"
-msgstr "Beschreibung"
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Jetzt synchronisieren"
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "Photo icon URL"
-msgstr "URL zum Icon"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!"
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 Pixel – optional"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst."
-#: ../../Zotlabs/Module/Appman.php:119
-msgid "Categories (optional, comma separated list)"
-msgstr "Kategorien (optional, kommagetrennte Liste)"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
-#: ../../Zotlabs/Module/Appman.php:120
-msgid "Version ID"
-msgstr "Versions-ID"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1415
+msgid "Public Hubs"
+msgstr "Öffentliche Hubs"
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Price of app"
-msgstr "Preis der App"
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im $Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen."
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) to purchase app"
-msgstr "Ort (URL), um die App zu kaufen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
-msgid "Edit post"
-msgstr "Bearbeite Beitrag"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Zugriffstyp"
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
-msgstr "Suche in der Dokumentation"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registrierungsrichtlinien"
-#: ../../Zotlabs/Module/Help.php:82
-msgid "$Projectname Documentation"
-msgstr "$Projectname-Dokumentation"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Statistiken"
-#: ../../Zotlabs/Module/Ffsapi.php:12
-msgid "Share content from Firefox to $Projectname"
-msgstr "Inhalte von Firefox nach $Projectname teilen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Ffsapi.php:15
-msgid "Activate the Firefox $Projectname provider"
-msgstr "Aktiviert den $Projectname-Provider für firefox"
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:941 ../../include/conversation.php:1099
+msgid "Ratings"
+msgstr "Bewertungen"
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr "Apps"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Bewerten"
+
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Wiki.php:165
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Ansicht"
+
+#: ../../Zotlabs/Module/Connedit.php:82
+msgid "Could not access contact record."
+msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
+
+#: ../../Zotlabs/Module/Connedit.php:112
+msgid "Could not locate selected profile."
+msgstr "Gewähltes Profil nicht gefunden."
+
+#: ../../Zotlabs/Module/Connedit.php:249
+msgid "Connection updated."
+msgstr "Verbindung aktualisiert."
+
+#: ../../Zotlabs/Module/Connedit.php:251
+msgid "Failed to update connection record."
+msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
+
+#: ../../Zotlabs/Module/Connedit.php:301
+msgid "is now connected to"
+msgstr "ist jetzt verbunden mit"
+
+#: ../../Zotlabs/Module/Connedit.php:434
+msgid "Could not access address book record."
+msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
+
+#: ../../Zotlabs/Module/Connedit.php:454
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
+
+#: ../../Zotlabs/Module/Connedit.php:469 ../../Zotlabs/Module/Connedit.php:478
+#: ../../Zotlabs/Module/Connedit.php:487 ../../Zotlabs/Module/Connedit.php:496
+#: ../../Zotlabs/Module/Connedit.php:509
+msgid "Unable to set address book parameters."
+msgstr "Konnte die Adressbuch-Parameter nicht setzen."
+
+#: ../../Zotlabs/Module/Connedit.php:533
+msgid "Connection has been removed."
+msgstr "Verbindung wurde gelöscht."
+
+#: ../../Zotlabs/Module/Connedit.php:573 ../../Zotlabs/Lib/Apps.php:228
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:936 ../../include/conversation.php:1049
+#: ../../include/nav.php:103
+msgid "View Profile"
+msgstr "Profil ansehen"
+
+#: ../../Zotlabs/Module/Connedit.php:576
+#, php-format
+msgid "View %s's profile"
+msgstr "%ss Profil ansehen"
+
+#: ../../Zotlabs/Module/Connedit.php:580
+msgid "Refresh Permissions"
+msgstr "Zugriffsrechte neu laden"
+
+#: ../../Zotlabs/Module/Connedit.php:583
+msgid "Fetch updated permissions"
+msgstr "Aktualisierte Zugriffsrechte abfragen"
+
+#: ../../Zotlabs/Module/Connedit.php:587
+msgid "Recent Activity"
+msgstr "Kürzliche Aktivitäten"
+
+#: ../../Zotlabs/Module/Connedit.php:590
+msgid "View recent posts and comments"
+msgstr "Betrachte die neuesten Beiträge und Kommentare"
+
+#: ../../Zotlabs/Module/Connedit.php:597
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen"
+
+#: ../../Zotlabs/Module/Connedit.php:598
+msgid "This connection is blocked!"
+msgstr "Die Verbindung ist geblockt!"
+
+#: ../../Zotlabs/Module/Connedit.php:602
+msgid "Unignore"
+msgstr "Nicht ignorieren"
+
+#: ../../Zotlabs/Module/Connedit.php:605
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen"
+
+#: ../../Zotlabs/Module/Connedit.php:606
+msgid "This connection is ignored!"
+msgstr "Die Verbindung wird ignoriert!"
+
+#: ../../Zotlabs/Module/Connedit.php:610
+msgid "Unarchive"
+msgstr "Aus Archiv zurückholen"
+
+#: ../../Zotlabs/Module/Connedit.php:610
+msgid "Archive"
+msgstr "Archivieren"
+
+#: ../../Zotlabs/Module/Connedit.php:613
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)"
+
+#: ../../Zotlabs/Module/Connedit.php:614
+msgid "This connection is archived!"
+msgstr "Die Verbindung ist archiviert!"
+
+#: ../../Zotlabs/Module/Connedit.php:618
+msgid "Unhide"
+msgstr "Wieder sichtbar machen"
+
+#: ../../Zotlabs/Module/Connedit.php:618
+msgid "Hide"
+msgstr "Verstecken"
+
+#: ../../Zotlabs/Module/Connedit.php:621
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Diese Verbindung vor anderen Verbindungen verstecken/zeigen"
+
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "This connection is hidden!"
+msgstr "Die Verbindung ist versteckt!"
+
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Delete this connection"
+msgstr "Verbindung löschen"
+
+#: ../../Zotlabs/Module/Connedit.php:640
+msgid "Open Individual Permissions section by default"
+msgstr "Öffne standardmäßig den Bereich für individuelle Berechtigungen"
+
+#: ../../Zotlabs/Module/Connedit.php:663
+msgid "Affinity"
+msgstr "Beziehung"
+
+#: ../../Zotlabs/Module/Connedit.php:666
+msgid "Open Set Affinity section by default"
+msgstr "Öffne standardmäßig den Bereich für Beziehungsgrad-Einstellungen"
+
+#: ../../Zotlabs/Module/Connedit.php:670 ../../include/widgets.php:540
+msgid "Me"
+msgstr "Ich"
+
+#: ../../Zotlabs/Module/Connedit.php:671 ../../include/widgets.php:541
+msgid "Family"
+msgstr "Familie"
+
+#: ../../Zotlabs/Module/Connedit.php:672
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../include/selectors.php:123 ../../include/widgets.php:542
+#: ../../include/channel.php:408 ../../include/channel.php:409
+#: ../../include/channel.php:416
+msgid "Friends"
+msgstr "Freunde"
+
+#: ../../Zotlabs/Module/Connedit.php:673 ../../include/widgets.php:543
+msgid "Acquaintances"
+msgstr "Bekannte"
+
+#: ../../Zotlabs/Module/Connedit.php:700
+msgid "Filter"
+msgstr "Filter"
+
+#: ../../Zotlabs/Module/Connedit.php:703
+msgid "Open Custom Filter section by default"
+msgstr "Öffne standardmäßig den Bereich für benutzerdefinierte Filter"
+
+#: ../../Zotlabs/Module/Connedit.php:740
+msgid "Approve this connection"
+msgstr "Verbindung genehmigen"
+
+#: ../../Zotlabs/Module/Connedit.php:740
+msgid "Accept connection to allow communication"
+msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
+
+#: ../../Zotlabs/Module/Connedit.php:745
+msgid "Set Affinity"
+msgstr "Beziehung festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:748
+msgid "Set Profile"
+msgstr "Profil festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:751
+msgid "Set Affinity & Profile"
+msgstr "Beziehung und Profile festlegen"
+
+#: ../../Zotlabs/Module/Connedit.php:809
+msgid "none"
+msgstr "Keine"
+
+#: ../../Zotlabs/Module/Connedit.php:812 ../../include/widgets.php:675
+msgid "Connection Default Permissions"
+msgstr "Standardzugriffsrechte für neue Verbindungen:"
+
+#: ../../Zotlabs/Module/Connedit.php:812 ../../include/items.php:3932
+#, php-format
+msgid "Connection: %s"
+msgstr "Verbindung: %s"
+
+#: ../../Zotlabs/Module/Connedit.php:813
+msgid "Apply these permissions automatically"
+msgstr "Diese Berechtigungen automatisch anwenden"
+
+#: ../../Zotlabs/Module/Connedit.php:813
+msgid "Connection requests will be approved without your interaction"
+msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
+
+#: ../../Zotlabs/Module/Connedit.php:814
+msgid "Permission role"
+msgstr "Berechtigungsrolle"
+
+#: ../../Zotlabs/Module/Connedit.php:815
+msgid "Add permission role"
+msgstr "Berechtigungsrolle hinzufügen"
+
+#: ../../Zotlabs/Module/Connedit.php:821
+msgid "This connection's primary address is"
+msgstr "Die Hauptadresse der Verbindung ist"
+
+#: ../../Zotlabs/Module/Connedit.php:822
+msgid "Available locations:"
+msgstr "Verfügbare Klone:"
+
+#: ../../Zotlabs/Module/Connedit.php:826
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
+
+#: ../../Zotlabs/Module/Connedit.php:827
+msgid "Connection Tools"
+msgstr "Verbindungswerkzeuge"
+
+#: ../../Zotlabs/Module/Connedit.php:829
+msgid "Slide to adjust your degree of friendship"
+msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
+
+#: ../../Zotlabs/Module/Connedit.php:830 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Bewertung"
+
+#: ../../Zotlabs/Module/Connedit.php:831
+msgid "Slide to adjust your rating"
+msgstr "Verschieben, um Deine Bewertung einzustellen"
+
+#: ../../Zotlabs/Module/Connedit.php:832 ../../Zotlabs/Module/Connedit.php:837
+msgid "Optionally explain your rating"
+msgstr "Optional kannst Du Deine Bewertung begründen"
+
+#: ../../Zotlabs/Module/Connedit.php:834
+msgid "Custom Filter"
+msgstr "Benutzerdefinierter Filter"
+
+#: ../../Zotlabs/Module/Connedit.php:835
+msgid "Only import posts with this text"
+msgstr "Nur Beiträge mit diesem Text importieren"
+
+#: ../../Zotlabs/Module/Connedit.php:835 ../../Zotlabs/Module/Connedit.php:836
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
+
+#: ../../Zotlabs/Module/Connedit.php:836
+msgid "Do not import posts with this text"
+msgstr "Beiträge mit diesem Text nicht importieren"
+
+#: ../../Zotlabs/Module/Connedit.php:838
+msgid "This information is public!"
+msgstr "Diese Information ist öffentlich!"
+
+#: ../../Zotlabs/Module/Connedit.php:843
+msgid "Connection Pending Approval"
+msgstr "Verbindung wartet auf Bestätigung"
+
+#: ../../Zotlabs/Module/Connedit.php:846
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Settings/Permcats.php:107
+msgid "inherited"
+msgstr "geerbt"
+
+#: ../../Zotlabs/Module/Connedit.php:848
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird."
+
+#: ../../Zotlabs/Module/Connedit.php:850
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr "Deren Einstellungen"
+
+#: ../../Zotlabs/Module/Connedit.php:851
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+msgid "My Settings"
+msgstr "Meine Einstellungen"
+
+#: ../../Zotlabs/Module/Connedit.php:853
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+msgid "Individual Permissions"
+msgstr "Individuelle Zugriffsrechte"
+
+#: ../../Zotlabs/Module/Connedit.php:854
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Settings/Permcats.php:111
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden."
+
+#: ../../Zotlabs/Module/Connedit.php:855
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
+
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "Last update:"
+msgstr "Letzte Aktualisierung:"
+
+#: ../../Zotlabs/Module/Connedit.php:865
+msgid "Details"
+msgstr "Details"
+
+#: ../../Zotlabs/Module/Connedit.php:868
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organisation"
+
+#: ../../Zotlabs/Module/Connedit.php:869
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Titel"
+
+#: ../../Zotlabs/Module/Connedit.php:870
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Telefon"
+
+#: ../../Zotlabs/Module/Connedit.php:872
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Sofortnachrichtendienst"
+
+#: ../../Zotlabs/Module/Connedit.php:873
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Webseite"
+
+#: ../../Zotlabs/Module/Connedit.php:875
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Hinweis"
+
+#: ../../Zotlabs/Module/Connedit.php:876
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../include/connections.php:894
+msgid "Mobile"
+msgstr "Mobil"
+
+#: ../../Zotlabs/Module/Connedit.php:877
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../include/connections.php:895
+msgid "Home"
+msgstr "Home"
+
+#: ../../Zotlabs/Module/Connedit.php:878
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../include/connections.php:898
+msgid "Work"
+msgstr "Arbeit"
+
+#: ../../Zotlabs/Module/Connedit.php:880
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
+msgstr "Kontakt hinzufügen"
+
+#: ../../Zotlabs/Module/Connedit.php:881
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Feld hinzufügen"
+
+#: ../../Zotlabs/Module/Connedit.php:886
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "Postfach"
+
+#: ../../Zotlabs/Module/Connedit.php:887
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Zusätzlich"
+
+#: ../../Zotlabs/Module/Connedit.php:888
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Straße"
+
+#: ../../Zotlabs/Module/Connedit.php:889
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Ortschaft"
+
+#: ../../Zotlabs/Module/Connedit.php:890
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Region"
+
+#: ../../Zotlabs/Module/Connedit.php:891
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Postleitzahl"
+
+#: ../../Zotlabs/Module/Connedit.php:892 ../../Zotlabs/Module/Profiles.php:756
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "Land"
#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../extend/addon/addon/opensearch/opensearch.php:42
msgid "$Projectname"
msgstr "$Projectname"
@@ -3157,13 +3661,6 @@ msgstr "Datei nicht gefunden."
msgid "Edit file permissions"
msgstr "Dateiberechtigungen bearbeiten"
-#: ../../Zotlabs/Module/Filestorage.php:152
-#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
-#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
-msgid "Permissions"
-msgstr "Berechtigungen"
-
#: ../../Zotlabs/Module/Filestorage.php:159
msgid "Set/edit permissions"
msgstr "Berechtigungen setzen/ändern"
@@ -3196,273 +3693,164 @@ msgstr "URL zu dieser Datei anzeigen"
msgid "Notify your contacts about this file"
msgstr "Meine Kontakte über diese Datei benachrichtigen"
-#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
-#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
-#: ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
-msgstr "Öffentlichen Zugriff verweigert."
-
-#: ../../Zotlabs/Module/Directory.php:245
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d Bewertung"
-msgstr[1] "%d Bewertungen"
-
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Gender: "
-msgstr "Geschlecht:"
-
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Status: "
-msgstr "Status:"
-
-#: ../../Zotlabs/Module/Directory.php:260
-msgid "Homepage: "
-msgstr "Webseite:"
-
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
-msgid "Age:"
-msgstr "Alter:"
-
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
-#: ../../include/event.php:52 ../../include/event.php:84
-#: ../../include/bb2diaspora.php:520
-msgid "Location:"
-msgstr "Ort:"
-
-#: ../../Zotlabs/Module/Directory.php:320
-msgid "Description:"
-msgstr "Beschreibung:"
-
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
-msgid "Hometown:"
-msgstr "Heimatstadt:"
-
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
-msgid "About:"
-msgstr "Ãœber:"
-
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Public Forum:"
-msgstr "Öffentliches Forum:"
-
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Keywords: "
-msgstr "Schlüsselwörter:"
-
-#: ../../Zotlabs/Module/Directory.php:335
-msgid "Don't suggest"
-msgstr "Nicht vorschlagen"
-
-#: ../../Zotlabs/Module/Directory.php:337
-msgid "Common connections:"
-msgstr "Gemeinsame Verbindungen:"
-
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Global Directory"
-msgstr "Globales Verzeichnis"
-
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Local Directory"
-msgstr "Lokales Verzeichnis"
-
-#: ../../Zotlabs/Module/Directory.php:392
-msgid "Finding:"
-msgstr "Ergebnisse:"
-
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Kanal-Vorschläge"
-
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "next page"
-msgstr "nächste Seite"
-
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "previous page"
-msgstr "vorherige Seite"
-
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Sort options"
-msgstr "Sortieroptionen"
-
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Alphabetic"
-msgstr "alphabetisch"
-
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Reverse Alphabetic"
-msgstr "Entgegengesetzt alphabetisch"
-
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Newest to Oldest"
-msgstr "Neueste zuerst"
-
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Oldest to Newest"
-msgstr "Älteste zuerst"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1836
+msgid "Photos"
+msgstr "Fotos"
-#: ../../Zotlabs/Module/Directory.php:419
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
+#: ../../Zotlabs/Module/Apps.php:45 ../../include/widgets.php:102
+#: ../../include/nav.php:178
+msgid "Apps"
+msgstr "Apps"
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
-msgstr "Originalbeitrag nicht gefunden."
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Berechtigung verweigert."
-#: ../../Zotlabs/Module/Item.php:447
-msgid "Empty post discarded."
-msgstr "Leeren Beitrag verworfen."
+#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:605
+msgid "l, F j"
+msgstr "l, j. F"
-#: ../../Zotlabs/Module/Item.php:489
-msgid "Executable content type not permitted to this channel."
-msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
+#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:660
+#: ../../include/text.php:1761
+msgid "Link to Source"
+msgstr "Link zur Quelle"
-#: ../../Zotlabs/Module/Item.php:871
-msgid "Duplicate post suppressed."
-msgstr "Doppelter Beitrag unterdrückt."
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
+msgid "Edit Event"
+msgstr "Termin bearbeiten"
-#: ../../Zotlabs/Module/Item.php:1013
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag nicht gespeichert."
+#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:688
+msgid "Create Event"
+msgstr "Termin anlegen"
-#: ../../Zotlabs/Module/Item.php:1137
-msgid "Unable to obtain post information from database."
-msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:691
+#: ../../include/channel.php:1370
+msgid "Export"
+msgstr "Exportieren"
-#: ../../Zotlabs/Module/Item.php:1144
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2307
+msgid "Import"
+msgstr "Import"
-#: ../../Zotlabs/Module/Item.php:1151
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:700
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Heute"
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
-msgstr "auf Vollbildmodus umschalten"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Gruppe wurde erstellt."
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
-msgstr "Kanal hinzugefügt."
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Gruppe konnte nicht erstellt werden."
-#: ../../Zotlabs/Module/Mail.php:38
-msgid "Unable to lookup recipient."
-msgstr "Konnte den Empfänger nicht finden."
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3899
+msgid "Privacy group not found."
+msgstr "Gruppe nicht gefunden."
-#: ../../Zotlabs/Module/Mail.php:45
-msgid "Unable to communicate with requested channel."
-msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Gruppe wurde aktualisiert."
-#: ../../Zotlabs/Module/Mail.php:52
-msgid "Cannot verify requested channel."
-msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Erstelle eine Gruppe für Kanäle."
-#: ../../Zotlabs/Module/Mail.php:70
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Gruppenname:"
-#: ../../Zotlabs/Module/Mail.php:149
-msgid "Messages"
-msgstr "Nachrichten"
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Mitglieder sind sichtbar für andere Kanäle"
-#: ../../Zotlabs/Module/Mail.php:184
-msgid "Message recalled."
-msgstr "Nachricht widerrufen."
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Gruppe wurde entfernt."
-#: ../../Zotlabs/Module/Mail.php:197
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Gruppe konnte nicht entfernt werden."
-#: ../../Zotlabs/Module/Mail.php:211 ../../Zotlabs/Module/Mail.php:320
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1200
-msgid "Please enter a link URL:"
-msgstr "Gib eine URL ein:"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Gruppeneditor"
-#: ../../Zotlabs/Module/Mail.php:212 ../../Zotlabs/Module/Mail.php:321
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verfällt YYYY-MM-DD HH;MM"
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Alle verbundenen Kanäle"
-#: ../../Zotlabs/Module/Mail.php:240
-msgid "Requested channel is not in this network"
-msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
-#: ../../Zotlabs/Module/Mail.php:248
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Ungültige Beitrags-ID (mid)"
-#: ../../Zotlabs/Module/Mail.php:249 ../../Zotlabs/Module/Mail.php:374
-msgid "To:"
-msgstr "An:"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "keine Ergebnisse"
-#: ../../Zotlabs/Module/Mail.php:252 ../../Zotlabs/Module/Mail.php:376
-msgid "Subject:"
-msgstr "Betreff:"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "Kanal-Sync verarbeitet"
-#: ../../Zotlabs/Module/Mail.php:255 ../../Zotlabs/Module/Invite.php:138
-msgid "Your message:"
-msgstr "Deine Nachricht:"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "zur Warteschlange hinzugefügt"
-#: ../../Zotlabs/Module/Mail.php:257 ../../Zotlabs/Module/Mail.php:382
-#: ../../include/conversation.php:1260
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "zugestellt"
-#: ../../Zotlabs/Module/Mail.php:259
-msgid "Send"
-msgstr "Absenden"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "für Zustellung akzeptiert"
-#: ../../Zotlabs/Module/Mail.php:262 ../../Zotlabs/Module/Mail.php:387
-#: ../../include/conversation.php:1305
-msgid "Set expiration date"
-msgstr "Verfallsdatum"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "aktualisiert"
-#: ../../Zotlabs/Module/Mail.php:264 ../../Zotlabs/Module/Mail.php:389
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
-#: ../../include/conversation.php:1310
-msgid "Encrypt text"
-msgstr "Text verschlüsseln"
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "Aktualisierung ignoriert"
-#: ../../Zotlabs/Module/Mail.php:346
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "Zugriff verweigert"
-#: ../../Zotlabs/Module/Mail.php:347
-msgid "Delivery report"
-msgstr "Zustellungsbericht"
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "Empfänger nicht gefunden."
-#: ../../Zotlabs/Module/Mail.php:348
-msgid "Recall message"
-msgstr "Nachricht widerrufen"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "Mail widerrufen"
-#: ../../Zotlabs/Module/Mail.php:350
-msgid "Message has been recalled."
-msgstr "Die Nachricht wurde widerrufen."
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "Doppelte Mail erhalten"
-#: ../../Zotlabs/Module/Mail.php:367
-msgid "Delete Conversation"
-msgstr "Unterhaltung löschen"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "Mail zugestellt"
-#: ../../Zotlabs/Module/Mail.php:369
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten."
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Zustellungsbericht für %1$s"
-#: ../../Zotlabs/Module/Mail.php:373
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Optionen"
-#: ../../Zotlabs/Module/Mail.php:378
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Deine Nachricht für %s (%s):"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Erneut zustellen"
#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
msgid "webpage"
@@ -3490,22 +3878,21 @@ msgstr "Element für %s installiert"
msgid "%s element installation failed"
msgstr "Installation des Elements %s fehlgeschlagen"
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
+#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:57
msgid "Nothing to import."
msgstr "Nichts zu importieren."
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
-#: ../../Zotlabs/Module/Import.php:98
+#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:69
+#: ../../Zotlabs/Module/Import.php:84
msgid "Unable to download data from old server"
msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-#: ../../Zotlabs/Module/Import_items.php:72
-#: ../../Zotlabs/Module/Import.php:105
+#: ../../Zotlabs/Module/Import_items.php:72 ../../Zotlabs/Module/Import.php:91
msgid "Imported file is empty."
msgstr "Die importierte Datei ist leer."
#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:127
+#: ../../Zotlabs/Module/Import.php:111
#, php-format
msgid "Warning: Database versions differ by %1$d updates."
msgstr "Achtung: Datenbankversionen unterscheiden sich um %1$d Aktualisierungen."
@@ -3524,161 +3911,139 @@ msgid ""
msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren."
#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:532
+#: ../../Zotlabs/Module/Import.php:495
msgid "File to Upload"
msgstr "Hochzuladende Datei:"
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Einladungslimit überschritten."
-
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Keine gültige Email Adresse."
-
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr "Schließe Dich uns auf $Projectname an!"
-
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines $Projectname-Servers."
-
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Nachricht konnte nicht zugestellt werden."
-
-#: ../../Zotlabs/Module/Invite.php:86
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
-
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren verfügbare Einladungen"
-
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr "Einladungen senden"
-
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr "Email-Adressen eintragen, eine pro Zeile:"
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr "Schließe Dich uns auf $Projectname an!"
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Neuen Kanal anlegen"
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:813
+#: ../../Zotlabs/Module/Wiki.php:166 ../../Zotlabs/Module/Chat.php:255
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Create New"
+msgstr "Neu anlegen"
-#: ../../Zotlabs/Module/Invite.php:142
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:223
+msgid "Channel Manager"
+msgstr "Kanal-Manager"
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Aktueller Kanal"
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr "oder besuche"
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr "3. Klicke auf [Verbinden]"
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Standard Kanal"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Block-Name"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Zum Standard machen"
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1276
-msgid "Title (optional)"
-msgstr "Titel (optional)"
+#: ../../Zotlabs/Module/Manage.php:172
+#, php-format
+msgid "%d new messages"
+msgstr "%d neue Nachrichten"
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Block bearbeiten"
+#: ../../Zotlabs/Module/Manage.php:173
+#, php-format
+msgid "%d new introductions"
+msgstr "%d neue Vorstellungen"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Gruppe wurde erstellt."
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Delegierte Kanäle"
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Gruppe konnte nicht erstellt werden."
+#: ../../Zotlabs/Module/Import.php:134
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3876
-msgid "Privacy group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../Zotlabs/Module/Import.php:149
+msgid "No channel. Import failed."
+msgstr "Kein Kanal. Import fehlgeschlagen."
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Gruppe wurde aktualisiert."
+#: ../../Zotlabs/Module/Import.php:467
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Erstelle eine Gruppe für Kanäle."
+#: ../../Zotlabs/Module/Import.php:488
+msgid "You must be logged in to use this feature."
+msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Gruppenname:"
+#: ../../Zotlabs/Module/Import.php:493
+msgid "Import Channel"
+msgstr "Kanal importieren"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Mitglieder sind sichtbar für andere Kanäle"
+#: ../../Zotlabs/Module/Import.php:494
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Gruppe wurde entfernt."
+#: ../../Zotlabs/Module/Import.php:496
+msgid "Or provide the old server/hub details"
+msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Gruppe konnte nicht entfernt werden."
+#: ../../Zotlabs/Module/Import.php:497
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Gruppeneditor"
+#: ../../Zotlabs/Module/Import.php:498
+msgid "Your old login email address"
+msgstr "Deine alte Login-E-Mail-Adresse"
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../Zotlabs/Module/Import.php:499
+msgid "Your old login password"
+msgstr "Dein altes Passwort"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Alle verbundenen Kanäle"
+#: ../../Zotlabs/Module/Import.php:500
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
+#: ../../Zotlabs/Module/Import.php:501
+msgid "Make this hub my primary location"
+msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Identifikator"
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Move this channel (disable all previous locations)"
+msgstr "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)"
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Profil-Sichtbarkeits-Editor"
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)"
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
-msgid "Profile"
-msgstr "Profil"
+#: ../../Zotlabs/Module/Import.php:504
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Sichtbar für:"
#: ../../Zotlabs/Module/Magic.php:71
msgid "Hub not found."
@@ -3701,7 +4066,7 @@ msgid "Menu Item Permissions"
msgstr "Zugriffsrechte des Menü-Elements"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:489
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "(click to open/close)"
msgstr "(zum öffnen/schließen anklicken)"
@@ -3801,6 +4166,72 @@ msgstr "Bearbeite Menü-Bestandteil"
msgid "Link text"
msgstr "Link Text"
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:54
+msgid "App installed."
+msgstr "App installiert."
+
+#: ../../Zotlabs/Module/Appman.php:47
+msgid "Malformed app."
+msgstr "Fehlerhafte App."
+
+#: ../../Zotlabs/Module/Appman.php:110
+msgid "Embed code"
+msgstr "Code einbetten"
+
+#: ../../Zotlabs/Module/Appman.php:116
+msgid "Edit App"
+msgstr "App bearbeiten"
+
+#: ../../Zotlabs/Module/Appman.php:116
+msgid "Create App"
+msgstr "App erstellen"
+
+#: ../../Zotlabs/Module/Appman.php:121
+msgid "Name of app"
+msgstr "Name der App"
+
+#: ../../Zotlabs/Module/Appman.php:121 ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Profiles.php:744 ../../Zotlabs/Module/Profiles.php:748
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Benötigt"
+
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Location (URL) of app"
+msgstr "Ort (URL) der App"
+
+#: ../../Zotlabs/Module/Appman.php:123 ../../Zotlabs/Module/Events.php:473
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
+msgid "Description"
+msgstr "Beschreibung"
+
+#: ../../Zotlabs/Module/Appman.php:124
+msgid "Photo icon URL"
+msgstr "URL zum Icon"
+
+#: ../../Zotlabs/Module/Appman.php:124
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 Pixel – optional"
+
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Categories (optional, comma separated list)"
+msgstr "Kategorien (optional, kommagetrennte Liste)"
+
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Version ID"
+msgstr "Versions-ID"
+
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Price of app"
+msgstr "Preis der App"
+
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Location (URL) to purchase app"
+msgstr "Ort (URL), um die App zu kaufen"
+
#: ../../Zotlabs/Module/Ratings.php:70
msgid "No ratings"
msgstr "Keine Bewertungen"
@@ -3827,7 +4258,7 @@ msgctxt "mood"
msgid "%1$s is %2$s"
msgstr "%1$s ist %2$s"
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:227
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
msgid "Mood"
msgstr "Laune"
@@ -3836,326 +4267,431 @@ msgid "Set your current mood and tell your friends"
msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:35
+#: ../../Zotlabs/Module/Notifications.php:38
msgid "No more system notifications."
msgstr "Keine System-Benachrichtigungen mehr."
#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:39
+#: ../../Zotlabs/Module/Notifications.php:42
msgid "System Notifications"
msgstr "System-Benachrichtigungen"
-#: ../../Zotlabs/Module/Photos.php:82
-msgid "Page owner information could not be retrieved."
-msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:660
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
-#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:219
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
-#: ../../include/photo/photo_driver.php:728
-msgid "Profile Photos"
-msgstr "Profilfotos"
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
-#: ../../Zotlabs/Module/Photos.php:103 ../../Zotlabs/Module/Photos.php:129
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../Zotlabs/Module/Photos.php:112
-msgid "Delete Album"
-msgstr "Album löschen"
+#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
+msgid "New profile created."
+msgstr "Neues Profil erstellt."
-#: ../../Zotlabs/Module/Photos.php:133
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager"
+#: ../../Zotlabs/Module/Profiles.php:111
+msgid "Profile unavailable to clone."
+msgstr "Profil kann nicht geklont werden."
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: ../../Zotlabs/Module/Profiles.php:146
+msgid "Profile unavailable to export."
+msgstr "Dieses Profil kann nicht exportiert werden."
-#: ../../Zotlabs/Module/Photos.php:520
-msgid "No photos selected"
-msgstr "Keine Fotos ausgewählt"
+#: ../../Zotlabs/Module/Profiles.php:252
+msgid "Profile Name is required."
+msgstr "Profil-Name erforderlich."
-#: ../../Zotlabs/Module/Photos.php:569
-msgid "Access to this item is restricted."
-msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
+#: ../../Zotlabs/Module/Profiles.php:460
+msgid "Marital Status"
+msgstr "Familienstand"
-#: ../../Zotlabs/Module/Photos.php:608
-#, php-format
-msgid "%1$.2f MB of %2$.2f MB photo storage used."
-msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
+#: ../../Zotlabs/Module/Profiles.php:464
+msgid "Romantic Partner"
+msgstr "Romantische Partner"
-#: ../../Zotlabs/Module/Photos.php:611
-#, php-format
-msgid "%1$.2f MB photo storage used."
-msgstr "%1$.2f MB Foto-Speicher belegt."
+#: ../../Zotlabs/Module/Profiles.php:468 ../../Zotlabs/Module/Profiles.php:771
+msgid "Likes"
+msgstr "Gefällt"
-#: ../../Zotlabs/Module/Photos.php:647
-msgid "Upload Photos"
-msgstr "Fotos hochladen"
+#: ../../Zotlabs/Module/Profiles.php:472 ../../Zotlabs/Module/Profiles.php:772
+msgid "Dislikes"
+msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Photos.php:651
-msgid "Enter an album name"
-msgstr "Namen für ein neues Album eingeben"
+#: ../../Zotlabs/Module/Profiles.php:476 ../../Zotlabs/Module/Profiles.php:779
+msgid "Work/Employment"
+msgstr "Arbeit/Anstellung"
-#: ../../Zotlabs/Module/Photos.php:652
-msgid "or select an existing album (doubleclick)"
-msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
+#: ../../Zotlabs/Module/Profiles.php:479
+msgid "Religion"
+msgstr "Religion"
-#: ../../Zotlabs/Module/Photos.php:653
-msgid "Create a status post for this upload"
-msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
+#: ../../Zotlabs/Module/Profiles.php:483
+msgid "Political Views"
+msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Photos.php:654
-msgid "Caption (optional):"
-msgstr "Beschriftung (optional):"
+#: ../../Zotlabs/Module/Profiles.php:487
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Geschlecht"
-#: ../../Zotlabs/Module/Photos.php:655
-msgid "Description (optional):"
-msgstr "Beschreibung (optional):"
+#: ../../Zotlabs/Module/Profiles.php:491
+msgid "Sexual Preference"
+msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Photos.php:686
-msgid "Album name could not be decoded"
-msgstr "Albumname konnte nicht dekodiert werden"
+#: ../../Zotlabs/Module/Profiles.php:495
+msgid "Homepage"
+msgstr "Webseite"
-#: ../../Zotlabs/Module/Photos.php:734
-msgid "Contact Photos"
-msgstr "Kontakt-Bilder"
+#: ../../Zotlabs/Module/Profiles.php:499
+msgid "Interests"
+msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Photos.php:757
-msgid "Show Newest First"
-msgstr "Neueste zuerst anzeigen"
+#: ../../Zotlabs/Module/Profiles.php:595
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
-#: ../../Zotlabs/Module/Photos.php:759
-msgid "Show Oldest First"
-msgstr "Älteste zuerst anzeigen"
+#: ../../Zotlabs/Module/Profiles.php:679
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Deine Verbindungen vor Betrachtern dieses Profils verbergen"
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1748
-msgid "View Photo"
-msgstr "Foto ansehen"
+#: ../../Zotlabs/Module/Profiles.php:721
+msgid "Edit Profile Details"
+msgstr "Bearbeite Profil-Details"
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1765
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../Zotlabs/Module/Profiles.php:723
+msgid "View this profile"
+msgstr "Dieses Profil ansehen"
-#: ../../Zotlabs/Module/Photos.php:861
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
+#: ../../Zotlabs/Module/Profiles.php:724 ../../Zotlabs/Module/Profiles.php:806
+#: ../../include/channel.php:1066
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:863
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../Zotlabs/Module/Profiles.php:725
+msgid "Profile Tools"
+msgstr "Profilwerkzeuge"
-#: ../../Zotlabs/Module/Photos.php:921
-msgid "Use as profile photo"
-msgstr "Als Profilfoto verwenden"
+#: ../../Zotlabs/Module/Profiles.php:726
+msgid "Change cover photo"
+msgstr "Titelbild ändern"
-#: ../../Zotlabs/Module/Photos.php:922
-msgid "Use as cover photo"
-msgstr "Als Titelbild verwenden"
+#: ../../Zotlabs/Module/Profiles.php:727 ../../include/channel.php:1037
+msgid "Change profile photo"
+msgstr "Profilfoto ändern"
-#: ../../Zotlabs/Module/Photos.php:929
-msgid "Private Photo"
-msgstr "Privates Foto"
+#: ../../Zotlabs/Module/Profiles.php:728
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
-#: ../../Zotlabs/Module/Events.php:689
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Voriges"
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Clone this profile"
+msgstr "Dieses Profil klonen"
-#: ../../Zotlabs/Module/Photos.php:944
-msgid "View Full Size"
-msgstr "In voller Größe anzeigen"
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
-#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
-#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Nächste"
+#: ../../Zotlabs/Module/Profiles.php:731
+msgid "Add profile things"
+msgstr "Sachen zum Profil hinzufügen"
-#: ../../Zotlabs/Module/Photos.php:1033
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../Zotlabs/Module/Profiles.php:732 ../../include/conversation.php:1715
+#: ../../include/widgets.php:105
+msgid "Personal"
+msgstr "Persönlich"
-#: ../../Zotlabs/Module/Photos.php:1035
-msgid "Rotate CW (right)"
-msgstr "Drehen im UZS (rechts)"
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Relation"
+msgstr "Beziehung"
-#: ../../Zotlabs/Module/Photos.php:1036
-msgid "Rotate CCW (left)"
-msgstr "Drehen gegen UZS (links)"
+#: ../../Zotlabs/Module/Profiles.php:735 ../../include/datetime.php:55
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
-#: ../../Zotlabs/Module/Photos.php:1039
-msgid "Move photo to album"
-msgstr "Foto in Album verschieben"
+#: ../../Zotlabs/Module/Profiles.php:737
+msgid "Import profile from file"
+msgstr "Profil aus einer Datei importieren"
-#: ../../Zotlabs/Module/Photos.php:1040
-msgid "Enter a new album name"
-msgstr "Gib einen Namen für ein neues Album ein"
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Export profile to file"
+msgstr "Profil in eine Datei exportieren"
-#: ../../Zotlabs/Module/Photos.php:1041
-msgid "or select an existing one (doubleclick)"
-msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
+#: ../../Zotlabs/Module/Profiles.php:739
+msgid "Your gender"
+msgstr "Dein Geschlecht"
-#: ../../Zotlabs/Module/Photos.php:1044
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../Zotlabs/Module/Profiles.php:740
+msgid "Marital status"
+msgstr "Familienstand"
-#: ../../Zotlabs/Module/Photos.php:1046
-msgid "Add a Tag"
-msgstr "Schlagwort hinzufügen"
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Sexual preference"
+msgstr "Sexuelle Orientierung"
-#: ../../Zotlabs/Module/Photos.php:1054
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
-msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Profile name"
+msgstr "Profilname"
-#: ../../Zotlabs/Module/Photos.php:1057
-msgid "Flag as adult in album view"
-msgstr "In der Albumansicht als nicht jugendfrei markieren"
+#: ../../Zotlabs/Module/Profiles.php:746
+msgid "This is your default profile."
+msgstr "Das ist Dein Standardprofil."
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
-msgid "I like this (toggle)"
-msgstr "Mir gefällt das (Umschalter)"
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "Your full name"
+msgstr "Dein voller Name"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
-msgid "I don't like this (toggle)"
-msgstr "Mir gefällt das nicht (Umschalter)"
+#: ../../Zotlabs/Module/Profiles.php:749
+msgid "Title/Description"
+msgstr "Titel/Beschreibung"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
-#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1248
-msgid "Share"
-msgstr "Teilen"
+#: ../../Zotlabs/Module/Profiles.php:752
+msgid "Street address"
+msgstr "Straße und Hausnummer"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
-#: ../../include/conversation.php:757
-msgid "Please wait"
-msgstr "Bitte warten"
+#: ../../Zotlabs/Module/Profiles.php:753
+msgid "Locality/City"
+msgstr "Wohnort"
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:726
-msgid "This is you"
-msgstr "Das bist Du"
+#: ../../Zotlabs/Module/Profiles.php:754
+msgid "Region/State"
+msgstr "Region/Bundesstaat"
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../Zotlabs/Module/Profiles.php:755
+msgid "Postal/Zip code"
+msgstr "Postleitzahl"
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1217
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../Zotlabs/Module/Profiles.php:761
+msgid "Who (if applicable)"
+msgstr "Wer (falls anwendbar)"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
-msgctxt "title"
-msgid "Likes"
-msgstr "Gefällt mir"
+#: ../../Zotlabs/Module/Profiles.php:761
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:593
-msgctxt "title"
-msgid "Dislikes"
-msgstr "Gefällt mir nicht"
+#: ../../Zotlabs/Module/Profiles.php:762
+msgid "Since (date)"
+msgstr "Seit (Datum)"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
-msgctxt "title"
-msgid "Agree"
-msgstr "Zustimmungen"
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Tell us about yourself"
+msgstr "Erzähle uns ein wenig von Dir"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
-msgctxt "title"
-msgid "Disagree"
-msgstr "Ablehnungen"
+#: ../../Zotlabs/Module/Profiles.php:766
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "Homepage-URL"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:594
-msgctxt "title"
-msgid "Abstain"
-msgstr "Enthaltungen"
+#: ../../Zotlabs/Module/Profiles.php:767
+msgid "Hometown"
+msgstr "Heimatort"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
-msgctxt "title"
-msgid "Attending"
-msgstr "Zusagen"
+#: ../../Zotlabs/Module/Profiles.php:768
+msgid "Political views"
+msgstr "Politische Ansichten"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
-msgctxt "title"
-msgid "Not attending"
-msgstr "Absagen"
+#: ../../Zotlabs/Module/Profiles.php:769
+msgid "Religious views"
+msgstr "Religiöse Ansichten"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:595
-msgctxt "title"
-msgid "Might attend"
-msgstr "Vielleicht"
+#: ../../Zotlabs/Module/Profiles.php:770
+msgid "Keywords used in directory listings"
+msgstr "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden"
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
-#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1783
-msgid "View all"
-msgstr "Alles anzeigen"
+#: ../../Zotlabs/Module/Profiles.php:770
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Angeln Fotografie Software"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
-#: ../../include/conversation.php:1807
-msgctxt "noun"
-msgid "Like"
-msgid_plural "Likes"
-msgstr[0] "Gefällt mir"
-msgstr[1] "Gefällt mir"
+#: ../../Zotlabs/Module/Profiles.php:773
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1810
-msgctxt "noun"
-msgid "Dislike"
-msgid_plural "Dislikes"
-msgstr[0] "Gefällt nicht"
-msgstr[1] "Gefällt nicht"
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Books, literature"
+msgstr "Bücher, Literatur"
-#: ../../Zotlabs/Module/Photos.php:1241
-msgid "Photo Tools"
-msgstr "Fotowerkzeuge"
+#: ../../Zotlabs/Module/Profiles.php:775
+msgid "Television"
+msgstr "Fernsehen"
-#: ../../Zotlabs/Module/Photos.php:1250
-msgid "In This Photo:"
-msgstr "Auf diesem Foto:"
+#: ../../Zotlabs/Module/Profiles.php:776
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Film/Tanz/Kultur/Unterhaltung"
-#: ../../Zotlabs/Module/Photos.php:1255
-msgid "Map"
-msgstr "Karte"
+#: ../../Zotlabs/Module/Profiles.php:777
+msgid "Hobbies/Interests"
+msgstr "Hobbys/Interessen"
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
-msgctxt "noun"
-msgid "Likes"
-msgstr "Gefällt mir"
+#: ../../Zotlabs/Module/Profiles.php:778
+msgid "Love/Romance"
+msgstr "Liebe/Romantik"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
-msgctxt "noun"
-msgid "Dislikes"
-msgstr "Gefällt nicht"
+#: ../../Zotlabs/Module/Profiles.php:780
+msgid "School/Education"
+msgstr "Schule/Ausbildung"
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
-#: ../../include/acl_selectors.php:210
-msgid "Close"
-msgstr "Schließen"
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Contact information and social networks"
+msgstr "Kontaktinformation und soziale Netzwerke"
-#: ../../Zotlabs/Module/Photos.php:1343
-msgid "View Album"
-msgstr "Album ansehen"
+#: ../../Zotlabs/Module/Profiles.php:782
+msgid "My other channels"
+msgstr "Meine anderen Kanäle"
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../Zotlabs/Module/Profiles.php:802 ../../include/channel.php:1062
+msgid "Profile Image"
+msgstr "Profilfoto:"
+
+#: ../../Zotlabs/Module/Profiles.php:812 ../../include/channel.php:1044
+#: ../../include/nav.php:105
+msgid "Edit Profiles"
+msgstr "Profile bearbeiten"
+
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Zugriff für die Anwendung autorisieren"
+
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
+
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Zum Weitermachen, bitte einloggen."
+
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
+
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Einladungslimit überschritten."
+
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Keine gültige Email Adresse."
+
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Schließe Dich uns auf $Projectname an!"
+
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines $Projectname-Servers."
+
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : Nachricht konnte nicht zugestellt werden."
+
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
+
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren verfügbare Einladungen"
+
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Einladungen senden"
+
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Email-Adressen eintragen, eine pro Zeile:"
+
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
+msgid "Your message:"
+msgstr "Deine Nachricht:"
+
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Schließe Dich uns auf $Projectname an!"
+
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
+
+#: ../../Zotlabs/Module/Invite.php:142
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
+
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
+
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "oder besuche"
+
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Klicke auf [Verbinden]"
+
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Ãœber diese Seite"
+
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Seitenname"
+
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1972
+msgid "Administrator"
+msgstr "Administrator"
+
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Software und Projektinformationen"
+
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Diese Website wird bereitgestellt durch $Projectname"
+
+#: ../../Zotlabs/Module/Siteinfo.php:30
+msgid ""
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot"
+
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Projekt-Website"
+
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Entwickler-Website"
+
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Einen neuen Kanal anlegen"
+
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
+
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
#: ../../Zotlabs/Module/Setup.php:176
msgid "$Projectname Server - Setup"
@@ -4186,7 +4722,7 @@ msgid ""
msgstr "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren."
#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:745
+#: ../../Zotlabs/Module/Setup.php:750
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Lies die Datei \"install/INSTALL.txt\"."
@@ -4361,193 +4897,193 @@ msgstr "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/e
msgid "Generate encryption keys"
msgstr "Verschlüsselungsschlüssel erzeugen"
-#: ../../Zotlabs/Module/Setup.php:500
+#: ../../Zotlabs/Module/Setup.php:505
msgid "libCurl PHP module"
msgstr "libCurl-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:501
+#: ../../Zotlabs/Module/Setup.php:506
msgid "GD graphics PHP module"
msgstr "GD-Grafik-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:502
+#: ../../Zotlabs/Module/Setup.php:507
msgid "OpenSSL PHP module"
msgstr "OpenSSL-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:503
+#: ../../Zotlabs/Module/Setup.php:508
msgid "PDO database PHP module"
msgstr "PDO-Datenbank-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:504
+#: ../../Zotlabs/Module/Setup.php:509
msgid "mb_string PHP module"
msgstr "mb_string-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:510
msgid "xml PHP module"
msgstr "xml-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
msgid "Apache mod_rewrite module"
msgstr "Apache-mod_rewrite-Modul"
-#: ../../Zotlabs/Module/Setup.php:509
+#: ../../Zotlabs/Module/Setup.php:514
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
msgid "exec"
msgstr "exec"
-#: ../../Zotlabs/Module/Setup.php:515
+#: ../../Zotlabs/Module/Setup.php:520
msgid ""
"Error: exec is required but is either not installed or has been disabled in "
"php.ini"
msgstr "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
msgid "shell_exec"
msgstr "shell_exec"
-#: ../../Zotlabs/Module/Setup.php:521
+#: ../../Zotlabs/Module/Setup.php:526
msgid ""
"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
msgstr "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Setup.php:529
+#: ../../Zotlabs/Module/Setup.php:534
msgid "Error: libCURL PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:533
+#: ../../Zotlabs/Module/Setup.php:538
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr "Fehler: Das PHP-Modul GD-Grafik mit JPEG-Unterstützung wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:537
+#: ../../Zotlabs/Module/Setup.php:542
msgid "Error: openssl PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:541
+#: ../../Zotlabs/Module/Setup.php:546
msgid "Error: PDO database PHP module required but not installed."
msgstr "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:545
+#: ../../Zotlabs/Module/Setup.php:550
msgid "Error: mb_string PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:549
+#: ../../Zotlabs/Module/Setup.php:554
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:567
+#: ../../Zotlabs/Module/Setup.php:572
msgid ""
"The web installer needs to be able to create a file called \".htconfig.php\""
" in the top folder of your web server and it is unable to do so."
msgstr "Der Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht."
-#: ../../Zotlabs/Module/Setup.php:568
+#: ../../Zotlabs/Module/Setup.php:573
msgid ""
"This is most often a permission setting, as the web server may not be able "
"to write files in your folder - even if you can."
msgstr "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
-#: ../../Zotlabs/Module/Setup.php:569
+#: ../../Zotlabs/Module/Setup.php:574
msgid ""
"At the end of this procedure, we will give you a text to save in a file "
"named .htconfig.php in your Red top folder."
msgstr "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst."
-#: ../../Zotlabs/Module/Setup.php:570
+#: ../../Zotlabs/Module/Setup.php:575
msgid ""
"You can alternatively skip this procedure and perform a manual installation."
" Please see the file \"install/INSTALL.txt\" for instructions."
msgstr "Alternativ kannst Du diesen Schritt überspringen und die Installation manuell vornehmen. Lies dazu die Datei install/INSTALL.txt."
-#: ../../Zotlabs/Module/Setup.php:573
+#: ../../Zotlabs/Module/Setup.php:578
msgid ".htconfig.php is writable"
msgstr ".htconfig.php ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:587
+#: ../../Zotlabs/Module/Setup.php:592
msgid ""
"This software uses the Smarty3 template engine to render its web views. "
"Smarty3 compiles templates to PHP to speed up rendering."
msgstr "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
-#: ../../Zotlabs/Module/Setup.php:588
+#: ../../Zotlabs/Module/Setup.php:593
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has"
" write access to this folder."
msgstr "Bitte stelle sicher, dass der Nutzer, unter dem der Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
-#: ../../Zotlabs/Module/Setup.php:590
+#: ../../Zotlabs/Module/Setup.php:595
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält."
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Setup.php:598
#, php-format
msgid "%s is writable"
msgstr "%s ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:609
+#: ../../Zotlabs/Module/Setup.php:614
msgid ""
"This software uses the store directory to save uploaded files. The web "
"server needs to have write access to the store directory under the top level"
" web folder"
msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:613
+#: ../../Zotlabs/Module/Setup.php:618
msgid "store is writable"
msgstr "store ist schreibbar"
-#: ../../Zotlabs/Module/Setup.php:646
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access"
" to this site."
msgstr "Das SSL-Zertifikat konnte nicht validiert werden. Korrigiere das Zertifikat oder deaktiviere den HTTPS-Zugriff auf diesen Server."
-#: ../../Zotlabs/Module/Setup.php:647
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich."
-#: ../../Zotlabs/Module/Setup.php:648
+#: ../../Zotlabs/Module/Setup.php:653
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können."
-#: ../../Zotlabs/Module/Setup.php:649
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer $Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird)."
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:655
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen."
-#: ../../Zotlabs/Module/Setup.php:651
+#: ../../Zotlabs/Module/Setup.php:656
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind."
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:658
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -4555,73 +5091,49 @@ msgid ""
"server communications."
msgstr "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern."
-#: ../../Zotlabs/Module/Setup.php:655
+#: ../../Zotlabs/Module/Setup.php:660
msgid "SSL certificate validation"
msgstr "SSL Zertifikatverifizierung"
-#: ../../Zotlabs/Module/Setup.php:661
+#: ../../Zotlabs/Module/Setup.php:666
msgid ""
"Url rewrite in .htaccess is not working. Check your server "
"configuration.Test: "
msgstr "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:"
-#: ../../Zotlabs/Module/Setup.php:664
+#: ../../Zotlabs/Module/Setup.php:669
msgid "Url rewrite is working"
msgstr "Url rewrite funktioniert"
-#: ../../Zotlabs/Module/Setup.php:678
+#: ../../Zotlabs/Module/Setup.php:683
msgid ""
"The database configuration file \".htconfig.php\" could not be written. "
"Please use the enclosed text to create a configuration file in your web "
"server root."
msgstr "Die Datenbank-Konfigurationsdatei „.htconfig.php“ konnte nicht geschrieben werden. Bitte verwende den unten angegebenen Text, um die Konfigurationsdatei im Stammverzeichnis des Webservers anzulegen."
-#: ../../Zotlabs/Module/Setup.php:702
+#: ../../Zotlabs/Module/Setup.php:707
#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:352
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
msgid "Errors encountered creating database tables."
msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../Zotlabs/Module/Setup.php:743
+#: ../../Zotlabs/Module/Setup.php:748
msgid "<h1>What next</h1>"
msgstr "<h1>Was als Nächstes</h1>"
-#: ../../Zotlabs/Module/Setup.php:744
+#: ../../Zotlabs/Module/Setup.php:749
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
msgstr "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten."
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Element kann nicht bearbeitet werden."
-
-#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
-msgid "This site is not a directory server"
-msgstr "Diese Webseite ist kein Verzeichnisserver"
-
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Einen neuen Kanal anlegen"
-
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen."
-
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server."
-
-#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
msgid "Mark all system notifications seen"
msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:228
-#: ../../include/conversation.php:975
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:942 ../../include/conversation.php:1109
msgid "Poke"
msgstr "Anstupsen"
@@ -4649,293 +5161,47 @@ msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
msgid "Make this post private"
msgstr "Diesen Beitrag privat machen"
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
-#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
-
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
-
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
-msgid "Profile-"
-msgstr "Profil-"
-
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
-msgid "New profile created."
-msgstr "Neues Profil erstellt."
-
-#: ../../Zotlabs/Module/Profiles.php:110
-msgid "Profile unavailable to clone."
-msgstr "Profil kann nicht geklont werden."
-
-#: ../../Zotlabs/Module/Profiles.php:145
-msgid "Profile unavailable to export."
-msgstr "Dieses Profil kann nicht exportiert werden."
-
-#: ../../Zotlabs/Module/Profiles.php:250
-msgid "Profile Name is required."
-msgstr "Profil-Name erforderlich."
-
-#: ../../Zotlabs/Module/Profiles.php:421
-msgid "Marital Status"
-msgstr "Familienstand"
-
-#: ../../Zotlabs/Module/Profiles.php:425
-msgid "Romantic Partner"
-msgstr "Romantische Partner"
-
-#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
-msgid "Likes"
-msgstr "Gefällt"
-
-#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
-msgid "Dislikes"
-msgstr "Gefällt nicht"
-
-#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
-msgid "Work/Employment"
-msgstr "Arbeit/Anstellung"
-
-#: ../../Zotlabs/Module/Profiles.php:440
-msgid "Religion"
-msgstr "Religion"
-
-#: ../../Zotlabs/Module/Profiles.php:444
-msgid "Political Views"
-msgstr "Politische Ansichten"
-
-#: ../../Zotlabs/Module/Profiles.php:448
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
-msgid "Gender"
-msgstr "Geschlecht"
-
-#: ../../Zotlabs/Module/Profiles.php:452
-msgid "Sexual Preference"
-msgstr "Sexuelle Orientierung"
-
-#: ../../Zotlabs/Module/Profiles.php:456
-msgid "Homepage"
-msgstr "Webseite"
-
-#: ../../Zotlabs/Module/Profiles.php:460
-msgid "Interests"
-msgstr "Hobbys/Interessen"
-
-#: ../../Zotlabs/Module/Profiles.php:554
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
-
-#: ../../Zotlabs/Module/Profiles.php:638
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Deine Verbindungen vor Betrachtern dieses Profils verbergen"
-
-#: ../../Zotlabs/Module/Profiles.php:680
-msgid "Edit Profile Details"
-msgstr "Bearbeite Profil-Details"
-
-#: ../../Zotlabs/Module/Profiles.php:682
-msgid "View this profile"
-msgstr "Dieses Profil ansehen"
-
-#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
-#: ../../include/channel.php:983
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
-
-#: ../../Zotlabs/Module/Profiles.php:684
-msgid "Profile Tools"
-msgstr "Profilwerkzeuge"
-
-#: ../../Zotlabs/Module/Profiles.php:685
-msgid "Change cover photo"
-msgstr "Titelbild ändern"
-
-#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
-msgid "Change profile photo"
-msgstr "Profilfoto ändern"
-
-#: ../../Zotlabs/Module/Profiles.php:687
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-
-#: ../../Zotlabs/Module/Profiles.php:688
-msgid "Clone this profile"
-msgstr "Dieses Profil klonen"
-
-#: ../../Zotlabs/Module/Profiles.php:689
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
-
-#: ../../Zotlabs/Module/Profiles.php:690
-msgid "Add profile things"
-msgstr "Sachen zum Profil hinzufügen"
-
-#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
-#: ../../include/conversation.php:1585
-msgid "Personal"
-msgstr "Persönlich"
-
-#: ../../Zotlabs/Module/Profiles.php:693
-msgid "Relation"
-msgstr "Beziehung"
-
-#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
-
-#: ../../Zotlabs/Module/Profiles.php:696
-msgid "Import profile from file"
-msgstr "Profil aus einer Datei importieren"
-
-#: ../../Zotlabs/Module/Profiles.php:697
-msgid "Export profile to file"
-msgstr "Profil in eine Datei exportieren"
-
-#: ../../Zotlabs/Module/Profiles.php:698
-msgid "Your gender"
-msgstr "Dein Geschlecht"
-
-#: ../../Zotlabs/Module/Profiles.php:699
-msgid "Marital status"
-msgstr "Familienstand"
-
-#: ../../Zotlabs/Module/Profiles.php:700
-msgid "Sexual preference"
-msgstr "Sexuelle Orientierung"
-
-#: ../../Zotlabs/Module/Profiles.php:703
-msgid "Profile name"
-msgstr "Profilname"
-
-#: ../../Zotlabs/Module/Profiles.php:705
-msgid "This is your default profile."
-msgstr "Das ist Dein Standardprofil."
-
-#: ../../Zotlabs/Module/Profiles.php:707
-msgid "Your full name"
-msgstr "Dein voller Name"
-
-#: ../../Zotlabs/Module/Profiles.php:708
-msgid "Title/Description"
-msgstr "Titel/Beschreibung"
-
-#: ../../Zotlabs/Module/Profiles.php:711
-msgid "Street address"
-msgstr "Straße und Hausnummer"
-
-#: ../../Zotlabs/Module/Profiles.php:712
-msgid "Locality/City"
-msgstr "Wohnort"
-
-#: ../../Zotlabs/Module/Profiles.php:713
-msgid "Region/State"
-msgstr "Region/Bundesstaat"
-
-#: ../../Zotlabs/Module/Profiles.php:714
-msgid "Postal/Zip code"
-msgstr "Postleitzahl"
-
-#: ../../Zotlabs/Module/Profiles.php:715
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
-msgstr "Land"
-
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Who (if applicable)"
-msgstr "Wer (falls anwendbar)"
-
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Since (date)"
-msgstr "Seit (Datum)"
-
-#: ../../Zotlabs/Module/Profiles.php:724
-msgid "Tell us about yourself"
-msgstr "Erzähle uns ein wenig von Dir"
-
-#: ../../Zotlabs/Module/Profiles.php:725
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
-msgid "Homepage URL"
-msgstr "Homepage-URL"
-
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Hometown"
-msgstr "Heimatort"
-
-#: ../../Zotlabs/Module/Profiles.php:727
-msgid "Political views"
-msgstr "Politische Ansichten"
-
-#: ../../Zotlabs/Module/Profiles.php:728
-msgid "Religious views"
-msgstr "Religiöse Ansichten"
-
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Keywords used in directory listings"
-msgstr "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden"
-
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Angeln Fotografie Software"
-
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
-
-#: ../../Zotlabs/Module/Profiles.php:733
-msgid "Books, literature"
-msgstr "Bücher, Literatur"
-
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Television"
-msgstr "Fernsehen"
-
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Film/Tanz/Kultur/Unterhaltung"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Konnte Deinen Server nicht finden."
-#: ../../Zotlabs/Module/Profiles.php:736
-msgid "Hobbies/Interests"
-msgstr "Hobbys/Interessen"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Veröffentlichung erfolgreich."
-#: ../../Zotlabs/Module/Profiles.php:737
-msgid "Love/Romance"
-msgstr "Liebe/Romantik"
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Originalbeitrag nicht gefunden."
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "School/Education"
-msgstr "Schule/Ausbildung"
+#: ../../Zotlabs/Module/Item.php:450
+msgid "Empty post discarded."
+msgstr "Leeren Beitrag verworfen."
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Contact information and social networks"
-msgstr "Kontaktinformation und soziale Netzwerke"
+#: ../../Zotlabs/Module/Item.php:492
+msgid "Executable content type not permitted to this channel."
+msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "My other channels"
-msgstr "Meine anderen Kanäle"
+#: ../../Zotlabs/Module/Item.php:842
+msgid "Duplicate post suppressed."
+msgstr "Doppelter Beitrag unterdrückt."
-#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
-msgid "Profile Image"
-msgstr "Profilfoto:"
+#: ../../Zotlabs/Module/Item.php:984
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag nicht gespeichert."
-#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
-#: ../../include/nav.php:91
-msgid "Edit Profiles"
-msgstr "Profile bearbeiten"
+#: ../../Zotlabs/Module/Item.php:1114
+msgid "Unable to obtain post information from database."
+msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Konnte Deinen Server nicht finden."
+#: ../../Zotlabs/Module/Item.php:1121
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht."
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Veröffentlichung erfolgreich."
+#: ../../Zotlabs/Module/Item.php:1128
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
msgid "This setting requires special processing and editing has been blocked."
@@ -4952,7 +5218,11 @@ msgid ""
" to correctly use this feature."
msgstr "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird."
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
+#: ../../Zotlabs/Module/Profile.php:78
+msgid "vcard"
+msgstr "VCard"
+
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2283
msgid "Blocks"
msgstr "Blöcke"
@@ -4960,12 +5230,12 @@ msgstr "Blöcke"
msgid "Block Title"
msgstr "Titel des Blocks"
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2285
msgid "Layouts"
msgstr "Layouts"
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/nav.php:162 ../../include/help.php:53
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:174 ../../include/help.php:53
#: ../../include/help.php:59
msgid "Help"
msgstr "Hilfe"
@@ -4999,141 +5269,158 @@ msgstr "Bewertung (öffentlich sichtbar)"
msgid "Optionally explain your rating (this information is public)"
msgstr "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)"
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Mögen/Nicht mögen"
+#: ../../Zotlabs/Module/Profile_photo.php:190
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:295
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Diese Aktion kann nur von Mitgliedern ausgeführt werden."
+#: ../../Zotlabs/Module/Profile_photo.php:411
+msgid "Use Photo for Profile"
+msgstr "Foto für Profil verwenden"
-#: ../../Zotlabs/Module/Like.php:25
-msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner $Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues $Projectname-Mitglied</a>."
+#: ../../Zotlabs/Module/Profile_photo.php:411
+msgid "Upload Profile Photo"
+msgstr "Lade neues Profilfoto hoch"
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Ungültige Anfrage."
+#: ../../Zotlabs/Module/Profile_photo.php:412
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Verwenden"
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "Kanal"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Kalendereinträge wurden importiert."
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "Sache"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Keine Kalendereinträge gefunden."
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Kanal nicht vorhanden."
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "Termin-Ende liegt vor dem Beginn."
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Die vorherige Aktion wurde rückgängig gemacht."
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "Vorschau konnte nicht erzeugt werden."
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47
-#: ../../extend/addon/addon/diaspora/inbound.php:1792
-#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/text.php:1940 ../../include/conversation.php:120
-msgid "photo"
-msgstr "Foto"
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Titel und Startzeit des Termins sind erforderlich."
-#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
-#: ../../extend/addon/addon/diaspora/inbound.php:1792
-#: ../../include/text.php:1946 ../../include/conversation.php:148
-msgid "status"
-msgstr "Status"
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Termin nicht gefunden."
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
-#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
-#: ../../include/event.php:961 ../../include/conversation.php:123
-msgid "event"
-msgstr "Termin"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Termintitel bearbeiten"
-#: ../../Zotlabs/Module/Like.php:419
-#: ../../extend/addon/addon/diaspora/inbound.php:1821
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s"
+#: ../../Zotlabs/Module/Events.php:460
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Termintitel"
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s gefällt %2$ss %3$s nicht"
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (Kommagetrennte Liste)"
-#: ../../Zotlabs/Module/Like.php:423
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s stimmt %2$ss %3$s zu"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Kategorie bearbeiten"
-#: ../../Zotlabs/Module/Like.php:425
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s lehnt %2$ss %3$s ab"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Kategorie"
-#: ../../Zotlabs/Module/Like.php:427
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s enthält sich zu %2$ss %3$s"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Startdatum und -zeit bearbeiten"
-#: ../../Zotlabs/Module/Like.php:429
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s teil"
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Startdatum und -zeit"
-#: ../../Zotlabs/Module/Like.php:431
-#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
-#: ../../Zotlabs/Module/Like.php:433
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Enddatum und -zeit bearbeiten"
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Action completed."
-msgstr "Aktion durchgeführt."
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Enddatum und -zeit"
-#: ../../Zotlabs/Module/Like.php:539
-msgid "Thank you."
-msgstr "Vielen Dank."
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "An die Zeitzone des Betrachters anpassen"
-#: ../../Zotlabs/Module/Profile_photo.php:186
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
+#: ../../Zotlabs/Module/Events.php:471
msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Use Photo for Profile"
-msgstr "Foto für Profil verwenden"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Beschreibung bearbeiten"
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload Profile Photo"
-msgstr "Lade neues Profilfoto hoch"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Ort bearbeiten"
-#: ../../Zotlabs/Module/Profile_photo.php:410
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
-msgid "Use"
-msgstr "Verwenden"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
+msgid "Permission settings"
+msgstr "Berechtigungs-Einstellungen"
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Beiträge mit Schlagwort: %s"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Zeitzone:"
-#: ../../Zotlabs/Module/Search.php:225
-#, php-format
-msgid "Search results for: %s"
-msgstr "Suchergebnisse für: %s"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Weitere Optionen"
+
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Termin bearbeiten"
+
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Termin löschen"
+
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "Kalender"
+
+#: ../../Zotlabs/Module/Events.php:695
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Monat"
+
+#: ../../Zotlabs/Module/Events.php:696
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Woche"
+
+#: ../../Zotlabs/Module/Events.php:697
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Tag"
+
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Termin gelöscht"
+
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Termin konnte nicht gelöscht werden"
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
@@ -5147,81 +5434,47 @@ msgstr "Gemeinsame Verbindungen"
msgid "No connections in common."
msgstr "Keine gemeinsamen Verbindungen."
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Zugriff für die Anwendung autorisieren"
-
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
-
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Zum Weitermachen, bitte einloggen."
-
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
-
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "hat Dir eine private Nachricht geschickt"
-
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "hat deinen Kanal hinzugefügt"
-
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "l, d. F, G:i \\U\\h\\r"
-
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[Heute]"
-
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "hat einen Termin veröffentlicht"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "auf Vollbildmodus umschalten"
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
-msgstr "Ãœber diese Seite"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Identifikator"
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
-msgstr "Seitenname"
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Profil-Sichtbarkeits-Editor"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
-msgid "Administrator"
-msgstr "Administrator"
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
+msgid "Profile"
+msgstr "Profil"
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
-msgstr "Software und Projektinformationen"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
-msgstr "Diese Website wird bereitgestellt durch $Projectname"
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Sichtbar für"
-#: ../../Zotlabs/Module/Siteinfo.php:30
-msgid ""
-"Federated and decentralised networking and identity services provided by Zot"
-msgstr "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot"
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:400
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
+msgid "You must be logged in to see this page."
+msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
-#: ../../Zotlabs/Module/Siteinfo.php:32
-#, php-format
-msgid "Version %s"
-msgstr "Version %s"
+#: ../../Zotlabs/Module/Channel.php:44
+msgid "Posts and comments"
+msgstr "Beiträge und Kommentare"
-#: ../../Zotlabs/Module/Siteinfo.php:33
-msgid "Project homepage"
-msgstr "Projekt-Website"
+#: ../../Zotlabs/Module/Channel.php:45
+msgid "Only posts"
+msgstr "Nur Beiträge"
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Developer homepage"
-msgstr "Entwickler-Website"
+#: ../../Zotlabs/Module/Channel.php:104
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
#: ../../Zotlabs/Module/Lostpass.php:19
msgid "No valid account found."
@@ -5247,7 +5500,7 @@ msgid ""
"Password reset failed."
msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1727
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1740
msgid "Password Reset"
msgstr "Zurücksetzen des Kennworts"
@@ -5312,23 +5565,23 @@ msgstr "URL des Lesezeichens"
msgid "Or enter new bookmark folder name"
msgstr "Oder gib einen neuen Namen für den Lesezeichenordner ein"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
#: ../../Zotlabs/Module/Rmagic.php:35
msgid "Authentication failed."
msgstr "Authentifizierung fehlgeschlagen."
-#: ../../Zotlabs/Module/Rmagic.php:75
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1991
msgid "Remote Authentication"
msgstr "Entfernte Authentifizierung"
-#: ../../Zotlabs/Module/Rmagic.php:76
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1992
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
-#: ../../Zotlabs/Module/Rmagic.php:77
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1993
msgid "Authenticate"
msgstr "Authentifizieren"
@@ -5408,22 +5661,22 @@ msgstr "Modulname:"
msgid "Layout Help"
msgstr "Layout-Hilfe"
-#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
msgid "Export Channel"
msgstr "Kanal exportieren"
-#: ../../Zotlabs/Module/Uexport.php:57
+#: ../../Zotlabs/Module/Uexport.php:59
msgid ""
"Export your basic channel information to a file. This acts as a backup of "
"your connections, permissions, profile and basic data, which can be used to "
"import your data to a new server hub, but does not contain your content."
msgstr "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält."
-#: ../../Zotlabs/Module/Uexport.php:58
+#: ../../Zotlabs/Module/Uexport.php:60
msgid "Export Content"
msgstr "Kanal und Inhalte exportieren"
-#: ../../Zotlabs/Module/Uexport.php:59
+#: ../../Zotlabs/Module/Uexport.php:61
msgid ""
"Export your channel information and recent content to a JSON backup that can"
" be restored or imported to another server hub. This backs up all of your "
@@ -5432,11 +5685,11 @@ msgid ""
" this download to begin."
msgstr "Exportiert Deine Kanal-Informationen sowie alle zugehörigen Inhalte in eine JSON-Sicherungsdatei. Die sichert alle Verbindungen, Berechtigungen, Profildaten und Deine Beiträge aus mehreren Monaten. Diese Datei kann SEHR groß werden! Bitte habe ein wenig Geduld – es kann mehrere Minuten dauern, bis der Download startet."
-#: ../../Zotlabs/Module/Uexport.php:60
+#: ../../Zotlabs/Module/Uexport.php:63
msgid "Export your posts from a given year."
msgstr "Exportiert die Beiträge des angegebenen Jahres."
-#: ../../Zotlabs/Module/Uexport.php:62
+#: ../../Zotlabs/Module/Uexport.php:65
msgid ""
"You may also export your posts and conversations for a particular year or "
"month. Adjust the date in your browser location bar to select other dates. "
@@ -5444,21 +5697,21 @@ msgid ""
"please try again selecting a more limited date range."
msgstr "Du kannst auch die Beiträge und Konversationen eines bestimmten Jahres oder Monats exportieren. Ändere das Datum in der Adresszeile Deines Browsers, um andere Zeiträume zu wählen. Falls der Export fehlschlägt (vermutlich, weil auf diesem Hub nicht genügend Speicher zur Verfügung steht), versuche es noch einmal mit einer kleineren Zeitspanne."
-#: ../../Zotlabs/Module/Uexport.php:63
+#: ../../Zotlabs/Module/Uexport.php:66
#, php-format
msgid ""
"To select all posts for a given year, such as this year, visit <a "
"href=\"%1$s\">%2$s</a>"
msgstr "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1$s\">%2$s</a>."
-#: ../../Zotlabs/Module/Uexport.php:64
+#: ../../Zotlabs/Module/Uexport.php:67
#, php-format
msgid ""
"To select all posts for a given month, such as January of this year, visit "
"<a href=\"%1$s\">%2$s</a>"
msgstr "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1$s\">%2$s</a>."
-#: ../../Zotlabs/Module/Uexport.php:65
+#: ../../Zotlabs/Module/Uexport.php:68
#, php-format
msgid ""
"These content files may be imported or restored by visiting <a "
@@ -5466,115 +5719,126 @@ msgid ""
" please import or restore these in date order (oldest first)."
msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1$s\">%2$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst."
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Berechtigung verweigert."
+#: ../../Zotlabs/Module/Directory.php:246
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d Bewertung"
+msgstr[1] "%d Bewertungen"
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
-msgid "l, F j"
-msgstr "l, j. F"
+#: ../../Zotlabs/Module/Directory.php:257
+msgid "Gender: "
+msgstr "Geschlecht:"
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
-#: ../../include/text.php:1748
-msgid "Link to Source"
-msgstr "Link zur Quelle"
+#: ../../Zotlabs/Module/Directory.php:259
+msgid "Status: "
+msgstr "Status:"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
-msgid "Edit Event"
-msgstr "Termin bearbeiten"
+#: ../../Zotlabs/Module/Directory.php:261
+msgid "Homepage: "
+msgstr "Webseite:"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
-msgid "Create Event"
-msgstr "Termin anlegen"
+#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
+msgid "Age:"
+msgstr "Alter:"
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
-msgid "Export"
-msgstr "Exportieren"
+#: ../../Zotlabs/Module/Directory.php:315 ../../include/markdown.php:561
+#: ../../include/channel.php:1134 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
+msgstr "Ort:"
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
-msgid "Import"
-msgstr "Import"
+#: ../../Zotlabs/Module/Directory.php:321
+msgid "Description:"
+msgstr "Beschreibung:"
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Heute"
+#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
+msgid "Hometown:"
+msgstr "Heimatstadt:"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "Anzahl der Konten"
+#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
+msgid "About:"
+msgstr "Ãœber:"
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "Anzahl der blockierten Konten"
+#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
+#: ../../include/connections.php:110 ../../include/conversation.php:938
+#: ../../include/conversation.php:1069 ../../include/widgets.php:148
+#: ../../include/widgets.php:185 ../../include/channel.php:1119
+msgid "Connect"
+msgstr "Verbinden"
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "Anzahl der abgelaufenen Konten"
+#: ../../Zotlabs/Module/Directory.php:330
+msgid "Public Forum:"
+msgstr "Öffentliches Forum:"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "Anzahl der ablaufenden Konten"
+#: ../../Zotlabs/Module/Directory.php:333
+msgid "Keywords: "
+msgstr "Schlüsselwörter:"
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "Anzahl der Kanäle"
+#: ../../Zotlabs/Module/Directory.php:336
+msgid "Don't suggest"
+msgstr "Nicht vorschlagen"
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "Anzahl der primären Kanäle"
+#: ../../Zotlabs/Module/Directory.php:338
+msgid "Common connections:"
+msgstr "Gemeinsame Verbindungen:"
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "Anzahl der Klone"
+#: ../../Zotlabs/Module/Directory.php:387
+msgid "Global Directory"
+msgstr "Globales Verzeichnis"
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr "Nachrichten-Warteschlangen"
+#: ../../Zotlabs/Module/Directory.php:387
+msgid "Local Directory"
+msgstr "Lokales Verzeichnis"
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr "Die installierte Software sollte aktualisiert werden"
+#: ../../Zotlabs/Module/Directory.php:393
+msgid "Finding:"
+msgstr "Ergebnisse:"
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr "Zusammenfassung"
+#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Kanal-Vorschläge"
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr "Registrierte Konten"
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "next page"
+msgstr "nächste Seite"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr "Ausstehende Registrierungen"
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "previous page"
+msgstr "vorherige Seite"
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr "Registrierte Kanäle"
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Sort options"
+msgstr "Sortieroptionen"
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr "Aktive Plug-Ins"
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Alphabetic"
+msgstr "alphabetisch"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr "Version"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Reverse Alphabetic"
+msgstr "Entgegengesetzt alphabetisch"
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr "Repository-Version (master)"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Newest to Oldest"
+msgstr "Neueste zuerst"
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr "Repository-Version (dev)"
+#: ../../Zotlabs/Module/Directory.php:403
+msgid "Oldest to Newest"
+msgstr "Älteste zuerst"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
+#: ../../Zotlabs/Module/Directory.php:420
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
+msgstr "Abwesend"
+
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
+msgstr "Online"
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
@@ -5596,40 +5860,40 @@ msgstr "Webseitenelemente exportieren"
msgid "Export selected"
msgstr "Exportieren ausgewählt"
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:109 ../../include/conversation.php:1745
+#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1889
msgid "Webpages"
msgstr "Webseiten"
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
+#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
msgid "Actions"
msgstr "Aktionen"
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
msgid "Page Link"
msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Webpages.php:250
+#: ../../Zotlabs/Module/Webpages.php:254
msgid "Page Title"
msgstr "Seitentitel"
-#: ../../Zotlabs/Module/Webpages.php:280
+#: ../../Zotlabs/Module/Webpages.php:284
msgid "Invalid file type."
msgstr "Ungültiger Dateityp."
-#: ../../Zotlabs/Module/Webpages.php:292
+#: ../../Zotlabs/Module/Webpages.php:296
msgid "Error opening zip file"
msgstr "Fehler beim Öffnen der ZIP-Datei"
-#: ../../Zotlabs/Module/Webpages.php:303
+#: ../../Zotlabs/Module/Webpages.php:307
msgid "Invalid folder path."
msgstr "Ungültiger Ordnerpfad."
-#: ../../Zotlabs/Module/Webpages.php:330
+#: ../../Zotlabs/Module/Webpages.php:334
msgid "No webpage elements detected."
msgstr "Keine Webseitenelemente erkannt."
-#: ../../Zotlabs/Module/Webpages.php:405
+#: ../../Zotlabs/Module/Webpages.php:409
msgid "Import complete."
msgstr "Import abgeschlossen."
@@ -5658,7 +5922,7 @@ msgid ""
msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:575
msgid "Remove Channel"
msgstr "Kanal löschen"
@@ -5678,132 +5942,182 @@ msgstr "Alle Dateien löschen"
msgid "Remove this file"
msgstr "Diese Datei löschen"
-#: ../../Zotlabs/Module/Wiki.php:34
+#: ../../Zotlabs/Module/Wiki.php:29
+msgid "Profile Unavailable."
+msgstr "Profil nicht verfügbar."
+
+#: ../../Zotlabs/Module/Wiki.php:43
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
msgid "Not found"
msgstr "Nicht gefunden"
-#: ../../Zotlabs/Module/Wiki.php:55
+#: ../../Zotlabs/Module/Wiki.php:67
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
msgid "Invalid channel"
msgstr "Ungültiger Kanal"
-#: ../../Zotlabs/Module/Wiki.php:100
-msgid "Error retrieving wiki"
-msgstr "Fehler beim Abrufen des Wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:107
-msgid "Error creating zip file export folder"
-msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "
-
-#: ../../Zotlabs/Module/Wiki.php:125
-msgid "Error downloading wiki: "
-msgstr "Fehler beim Herunterladen des Wiki:"
-
-#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
-#: ../../include/conversation.php:1755
+#: ../../Zotlabs/Module/Wiki.php:158
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
+#: ../../include/conversation.php:1900
msgid "Wikis"
msgstr "Wikis"
-#: ../../Zotlabs/Module/Wiki.php:145 ../../include/widgets.php:966
+#: ../../Zotlabs/Module/Wiki.php:164
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
msgid "Download"
msgstr "Herunterladen"
-#: ../../Zotlabs/Module/Wiki.php:149 ../../include/widgets.php:970
+#: ../../Zotlabs/Module/Wiki.php:168
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
msgid "Wiki name"
msgstr "Name des Wiki"
-#: ../../Zotlabs/Module/Wiki.php:150
+#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
msgid "Content type"
msgstr "Inhaltstyp"
-#: ../../Zotlabs/Module/Wiki.php:159
+#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
msgid "Create a status post for this wiki"
msgstr "Erzeuge einen Statusbeitrag für dieses Wiki"
-#: ../../Zotlabs/Module/Wiki.php:178
+#: ../../Zotlabs/Module/Wiki.php:203
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
msgid "Wiki not found"
msgstr "Wiki nicht gefunden"
-#: ../../Zotlabs/Module/Wiki.php:203
+#: ../../Zotlabs/Module/Wiki.php:227
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
msgid "Rename page"
msgstr "Seite umbenennen"
-#: ../../Zotlabs/Module/Wiki.php:207
+#: ../../Zotlabs/Module/Wiki.php:231
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
msgid "Error retrieving page content"
msgstr "Fehler beim Abrufen des Seiteninhalts"
-#: ../../Zotlabs/Module/Wiki.php:240
+#: ../../Zotlabs/Module/Wiki.php:261
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
msgid "Revision Comparison"
msgstr "Revisionsvergleich"
-#: ../../Zotlabs/Module/Wiki.php:241
+#: ../../Zotlabs/Module/Wiki.php:262
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
msgid "Revert"
msgstr "Rückgängig machen"
-#: ../../Zotlabs/Module/Wiki.php:250
-msgid "Choose an available wiki from the list on the left."
-msgstr "Wähle ein vorhandenes Wiki aus der Liste auf der linken Seite aus."
+#: ../../Zotlabs/Module/Wiki.php:266
+msgid "Short description of your changes (optional)"
+msgstr "Kurze Beschreibung Ihrer Änderungen (optional)"
-#: ../../Zotlabs/Module/Wiki.php:252
+#: ../../Zotlabs/Module/Wiki.php:273
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
msgid "Source"
msgstr "Quelle"
-#: ../../Zotlabs/Module/Wiki.php:269
+#: ../../Zotlabs/Module/Wiki.php:281
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
msgid "New page name"
msgstr "Neuer Seitenname"
-#: ../../Zotlabs/Module/Wiki.php:275 ../../include/conversation.php:1169
+#: ../../Zotlabs/Module/Wiki.php:286
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
+#: ../../include/conversation.php:1299
msgid "Embed image from photo albums"
msgstr "Bild aus Fotoalben einbetten"
-#: ../../Zotlabs/Module/Wiki.php:276 ../../include/conversation.php:1263
+#: ../../Zotlabs/Module/Wiki.php:287
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1393
msgid "Embed an image from your albums"
msgstr "Betten Sie ein Bild aus Ihren Alben ein"
-#: ../../Zotlabs/Module/Wiki.php:278 ../../include/conversation.php:1265
-#: ../../include/conversation.php:1312
+#: ../../Zotlabs/Module/Wiki.php:289
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
+#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
msgid "OK"
msgstr "Ok"
-#: ../../Zotlabs/Module/Wiki.php:279 ../../include/conversation.php:1205
+#: ../../Zotlabs/Module/Wiki.php:290
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1335
msgid "Choose images to embed"
msgstr "Wählen Sie Bilder zum Einbetten aus"
-#: ../../Zotlabs/Module/Wiki.php:280 ../../include/conversation.php:1206
+#: ../../Zotlabs/Module/Wiki.php:291
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1336
msgid "Choose an album"
msgstr "Wählen Sie ein Album aus"
-#: ../../Zotlabs/Module/Wiki.php:281 ../../include/conversation.php:1207
-msgid "Choose a different album..."
-msgstr "Wählen Sie ein anderes Album aus..."
+#: ../../Zotlabs/Module/Wiki.php:292
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
+msgid "Choose a different album"
+msgstr "Wählen Sie ein anderes Album aus"
-#: ../../Zotlabs/Module/Wiki.php:282 ../../include/conversation.php:1208
+#: ../../Zotlabs/Module/Wiki.php:293
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
+#: ../../include/conversation.php:1338
msgid "Error getting album list"
msgstr "Fehler beim Holen der Albenliste"
-#: ../../Zotlabs/Module/Wiki.php:283 ../../include/conversation.php:1209
+#: ../../Zotlabs/Module/Wiki.php:294
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1339
msgid "Error getting photo link"
msgstr "Fehler beim Holen des Fotolinks"
-#: ../../Zotlabs/Module/Wiki.php:284 ../../include/conversation.php:1210
+#: ../../Zotlabs/Module/Wiki.php:295
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1340
msgid "Error getting album"
msgstr "Fehler beim Holen des Albums"
-#: ../../Zotlabs/Module/Wiki.php:348
+#: ../../Zotlabs/Module/Wiki.php:364
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
msgid "Error creating wiki. Invalid name."
msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name."
-#: ../../Zotlabs/Module/Wiki.php:359
+#: ../../Zotlabs/Module/Wiki.php:376
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
msgid "Wiki created, but error creating Home page."
msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"
-#: ../../Zotlabs/Module/Wiki.php:364
+#: ../../Zotlabs/Module/Wiki.php:383
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
msgid "Error creating wiki"
msgstr "Fehler beim Erstellen des Wiki"
-#: ../../Zotlabs/Module/Wiki.php:410
+#: ../../Zotlabs/Module/Wiki.php:395
+msgid "Wiki delete permission denied."
+msgstr "Wiki-Löschberechtigung verweigert."
+
+#: ../../Zotlabs/Module/Wiki.php:405
+msgid "Error deleting wiki"
+msgstr "Fehler beim Löschen des Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:431
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
msgid "New page created"
msgstr "Neue Seite erstellt"
+#: ../../Zotlabs/Module/Wiki.php:546
+msgid "Cannot delete Home"
+msgstr "Kann die Startseite nicht löschen"
+
+#: ../../Zotlabs/Module/Wiki.php:610
+msgid "Current Revision"
+msgstr "Aktuelle Revision"
+
+#: ../../Zotlabs/Module/Wiki.php:610
+msgid "Selected Revision"
+msgstr "Ausgewählte Revision"
+
+#: ../../Zotlabs/Module/Wiki.php:660
+msgid "You must be authenticated."
+msgstr "Sie müssen authenzifiziert sein."
+
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
@@ -5820,8 +6134,8 @@ msgstr "Quelle aktualisiert."
msgid "*"
msgstr "*"
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/features.php:195
-#: ../../include/widgets.php:672
+#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:691
+#: ../../include/features.php:213
msgid "Channel Sources"
msgstr "Kanal-Quellen"
@@ -5898,7 +6212,7 @@ msgid ""
"hours."
msgstr "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es in 24 Stunden noch einmal."
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:149
+#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:150
msgid "Ignore/Hide"
msgstr "Ignorieren/Verstecken"
@@ -5906,12 +6220,12 @@ msgstr "Ignorieren/Verstecken"
msgid "post"
msgstr "Beitrag"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
-#: ../../include/conversation.php:150
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
+#: ../../include/text.php:1961
msgid "comment"
msgstr "Kommentar"
-#: ../../Zotlabs/Module/Tagger.php:100
+#: ../../Zotlabs/Module/Tagger.php:95
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr "%1$s hat %2$ss %3$s mit %4$s verschlagwortet"
@@ -5993,49 +6307,6 @@ msgstr "Kein Name"
msgid "Remove authorization"
msgstr "Authorisierung aufheben"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Dieser Kanal ist auf %d Token begrenzt"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Name und Passwort sind erforderlich."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token gespeichert."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr "Gastzugangstoken"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Anmeldename"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Anmeldepasswort"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Läuft ab (jjjj-mm-tt)"
-
#: ../../Zotlabs/Module/Settings/Account.php:20
msgid "Not valid email."
msgstr "Keine gültige E-Mail Adresse."
@@ -6101,7 +6372,7 @@ msgid "Used to provide a member experience matched to your comfort level"
msgstr "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten."
#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:462
+#: ../../Zotlabs/Module/Settings/Channel.php:483
msgid "Email Address:"
msgstr "Email Adresse:"
@@ -6109,7 +6380,74 @@ msgstr "Email Adresse:"
msgid "Remove this account including all its channels"
msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
-#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#, php-format
+msgid "This channel is limited to %d tokens"
+msgstr "Dieser Kanal ist auf %d Token begrenzt"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Name und Passwort sind erforderlich."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token gespeichert."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:658
+msgid "Guest Access Tokens"
+msgstr "Gastzugangstoken"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Anmeldename"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Anmeldepasswort"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Läuft ab (jjjj-mm-tt)"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert."
+
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "Keine Funktions-Einstellungen konfiguriert"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Voreinstellung für maximalen Beziehungsgrad"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Voreinstellung für minimalen Beziehungsgrad"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Beziehungsgrad-Schieberegler-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Funktions-/Addon-Einstellungen"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:251
#: ../../extend/addon/addon/logrot/logrot.php:54
#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
@@ -6120,361 +6458,369 @@ msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Settings/Channel.php:307
+#: ../../Zotlabs/Module/Settings/Channel.php:312
msgid "Nobody except yourself"
msgstr "Niemand außer Dir selbst"
-#: ../../Zotlabs/Module/Settings/Channel.php:308
+#: ../../Zotlabs/Module/Settings/Channel.php:313
msgid "Only those you specifically allow"
msgstr "Nur die, denen Du es explizit erlaubst"
-#: ../../Zotlabs/Module/Settings/Channel.php:309
+#: ../../Zotlabs/Module/Settings/Channel.php:314
msgid "Approved connections"
msgstr "Angenommene Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:310
+#: ../../Zotlabs/Module/Settings/Channel.php:315
msgid "Any connections"
msgstr "Beliebige Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:311
+#: ../../Zotlabs/Module/Settings/Channel.php:316
msgid "Anybody on this website"
msgstr "Jeder auf dieser Website"
-#: ../../Zotlabs/Module/Settings/Channel.php:312
+#: ../../Zotlabs/Module/Settings/Channel.php:317
msgid "Anybody in this network"
msgstr "Alle $Projectname-Mitglieder"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
+#: ../../Zotlabs/Module/Settings/Channel.php:318
msgid "Anybody authenticated"
msgstr "Jeder authentifizierte"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
+#: ../../Zotlabs/Module/Settings/Channel.php:319
msgid "Anybody on the internet"
msgstr "Jeder im Internet"
-#: ../../Zotlabs/Module/Settings/Channel.php:390
+#: ../../Zotlabs/Module/Settings/Channel.php:395
msgid "Publish your default profile in the network directory"
msgstr "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
+#: ../../Zotlabs/Module/Settings/Channel.php:400
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
-#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Settings/Channel.php:409
msgid "Your channel address is"
msgstr "Deine Kanal-Adresse lautet"
-#: ../../Zotlabs/Module/Settings/Channel.php:407
+#: ../../Zotlabs/Module/Settings/Channel.php:412
msgid "Your files/photos are accessible via WebDAV at"
msgstr "Deine Dateien/Fotos sind via WebDAV verfügbar auf"
-#: ../../Zotlabs/Module/Settings/Channel.php:453
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Channel Settings"
msgstr "Kanal-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:460
+#: ../../Zotlabs/Module/Settings/Channel.php:481
msgid "Basic Settings"
msgstr "Grundeinstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
-#: ../../include/channel.php:1172
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1255
msgid "Full Name:"
msgstr "Voller Name:"
-#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Settings/Channel.php:484
msgid "Your Timezone:"
msgstr "Ihre Zeitzone:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Default Post Location:"
msgstr "Standardstandort:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Geographical location to display on your posts"
msgstr "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll"
-#: ../../Zotlabs/Module/Settings/Channel.php:465
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "Use Browser Location:"
msgstr "Standort des Browsers verwenden:"
-#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Adult Content"
msgstr "Nicht jugendfreie Inhalte"
-#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)"
-#: ../../Zotlabs/Module/Settings/Channel.php:469
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:472
+#: ../../Zotlabs/Module/Settings/Channel.php:493
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:495
msgid "Hide my online presence"
msgstr "Meine Online-Präsenz verbergen"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:495
msgid "Prevents displaying in your profile that you are online"
msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid "Simple Privacy Settings:"
msgstr "Einfache Privatsphäre-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:477
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:478
+#: ../../Zotlabs/Module/Settings/Channel.php:499
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:500
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privat – <em>Standard privat, nie offen oder öffentlich</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:480
+#: ../../Zotlabs/Module/Settings/Channel.php:501
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Blockiert – <em>Alle standardmäßig blockiert</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Allow others to tag your posts"
msgstr "Erlaube anderen, Deine Beiträge zu verschlagworten"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:505
msgid "Channel Permission Limits"
msgstr "Kanal-Berechtigungslimits"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "Expire other channel content after this many days"
msgstr "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "0 or blank to use the website limit."
msgstr "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
#, php-format
msgid "This website expires after %d days."
msgstr "Diese Webseite läuft nach %d Tagen ab."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "This website does not expire imported content."
msgstr "Diese Webseite lässt importierte Inhalte nicht verfallen."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "The website limit takes precedence if lower than your limit."
msgstr "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "May reduce spam activity"
msgstr "Kann die Spam-Aktivität verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "Default Access Control List (ACL)"
msgstr "Standard-Zugriffsberechtigungsliste (ACL)"
-#: ../../Zotlabs/Module/Settings/Channel.php:490
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Use my default audience setting for the type of object published"
msgstr "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "Channel permissions category:"
msgstr "Zugriffsrechte-Kategorie des Kanals:"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr "Standard-Berechtigungsgruppe"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
msgid "Maximum private messages per day from unknown people:"
msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:525
msgid "Useful to reduce spamming"
msgstr "Nützlich, um Spam zu verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:506
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Notification Settings"
msgstr "Benachrichtigungs-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "By default post a status message when:"
msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "accepting a friend request"
msgstr "Du eine Verbindungsanfrage annimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "joining a forum/community"
msgstr "Du einem Forum beitrittst"
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "making an <em>interesting</em> profile change"
msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "Send a notification email when:"
msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:512
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "You receive a connection request"
msgstr "Du eine Verbindungsanfrage erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:513
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "Your connections are confirmed"
msgstr "Eine Verbindung bestätigt wurde"
-#: ../../Zotlabs/Module/Settings/Channel.php:514
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "Someone writes on your profile wall"
msgstr "Jemand auf Deine Pinnwand schreibt"
-#: ../../Zotlabs/Module/Settings/Channel.php:515
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "Someone writes a followup comment"
msgstr "Jemand einen Beitrag kommentiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:516
+#: ../../Zotlabs/Module/Settings/Channel.php:538
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:517
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "You receive a friend suggestion"
msgstr "Du einen Kontaktvorschlag erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "You are tagged in a post"
msgstr "Du in einem Beitrag erwähnt wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "You are poked/prodded/etc. in a post"
msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:522
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
+msgstr "Jemand mag Ihren Beitrag/Kommentar"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Show visual notifications including:"
msgstr "Visuelle Benachrichtigungen anzeigen für:"
-#: ../../Zotlabs/Module/Settings/Channel.php:524
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Unseen grid activity"
msgstr "Ungesehene Netzwerk-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Unseen channel activity"
msgstr "Ungesehene Kanal-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Unseen private messages"
msgstr "Ungelesene persönliche Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
-#: ../../Zotlabs/Module/Settings/Channel.php:531
-#: ../../Zotlabs/Module/Settings/Channel.php:532
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Empfohlen"
-#: ../../Zotlabs/Module/Settings/Channel.php:527
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Upcoming events"
msgstr "Baldige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Events today"
msgstr "Heutige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Upcoming birthdays"
msgstr "Baldige Geburtstage"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Not available in all themes"
msgstr "Nicht in allen Themes verfügbar"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:554
msgid "System (personal) notifications"
msgstr "System – (persönliche) Benachrichtigungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:555
msgid "System info messages"
msgstr "System – Info-Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "System critical alerts"
msgstr "System – kritische Warnungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:557
msgid "New connections"
msgstr "Neue Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:558
msgid "System Registrations"
msgstr "System – Registrierungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "Notify me of events this many days in advance"
msgstr "Benachrichtige mich zu Terminen so viele Tage im Voraus"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "Must be greater than 0"
msgstr "Muss größer als 0 sein"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:567
msgid "Advanced Account/Page Type Settings"
msgstr "Erweiterte Account- und Seitenart-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:568
msgid "Change the behaviour of this account for special situations"
msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../Zotlabs/Module/Settings/Channel.php:542
+#: ../../Zotlabs/Module/Settings/Channel.php:570
msgid "Miscellaneous Settings"
msgstr "Sonstige Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:571
msgid "Default photo upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Fotos"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
-#: ../../Zotlabs/Module/Settings/Channel.php:544
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "%Y - current year, %m - current month"
msgstr "%Y - aktuelles Jahr, %m - aktueller Monat"
-#: ../../Zotlabs/Module/Settings/Channel.php:544
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "Default file upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Dateien"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:574
msgid "Personal menu to display in your channel pages"
msgstr "Eigenes Menü zur Anzeige auf den Seiten deines Kanals"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:576
msgid "Remove this channel."
msgstr "Diesen Kanal löschen"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "Firefox Share $Projectname provider"
msgstr "$Projectname-Provider für Firefox Share"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:578
msgid "Start calendar week on monday"
msgstr "Montag als erster Tag der Kalenderwoche"
@@ -6554,8 +6900,8 @@ msgid "Manual conversation updates"
msgstr "Manuelle Konversationsaktualisierung"
#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is automatic, which may increase screen jumping"
-msgstr "Voreinstellung ist Automatisch, was aber das Springen der Seitenanzeige erhöhen kann."
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen."
#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Link post titles to source"
@@ -6591,13 +6937,23 @@ msgstr "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick verg
msgid "Grid page max height of content (in pixels)"
msgstr "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite"
-#: ../../Zotlabs/Module/Settings/Featured.php:24
-msgid "No feature settings configured"
-msgstr "Keine Funktions-Einstellungen konfiguriert"
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Berechtigungsrolle gespeichert."
-#: ../../Zotlabs/Module/Settings/Featured.php:31
-msgid "Feature/Addon Settings"
-msgstr "Funktions-/Addon-Einstellungen"
+#: ../../Zotlabs/Module/Settings/Permcats.php:63
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:96
+msgid "Permission Categories"
+msgstr "Berechtigungsrollen"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:104
+msgid "Permission Name"
+msgstr "Name der Berechtigungsrolle"
#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
msgid "Tag removed"
@@ -6668,78 +7024,113 @@ msgstr "URL eines Fotos der Sache (optional)"
msgid "Add Thing to your Profile"
msgstr "Die Sache Deinem Profil hinzufügen"
-#: ../../Zotlabs/Module/Import.php:33
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Dein Vertrag erlaubt nur %d Kanäle."
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "Konnte den Empfänger nicht finden."
-#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../Zotlabs/Module/Import.php:167
-msgid "No channel. Import failed."
-msgstr "Kein Kanal. Import fehlgeschlagen."
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
-#: ../../Zotlabs/Module/Import.php:503
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Import abgeschlossen."
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-#: ../../Zotlabs/Module/Import.php:525
-msgid "You must be logged in to use this feature."
-msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Nachrichten"
-#: ../../Zotlabs/Module/Import.php:530
-msgid "Import Channel"
-msgstr "Kanal importieren"
+#: ../../Zotlabs/Module/Mail.php:213
+msgid "Message recalled."
+msgstr "Nachricht widerrufen."
-#: ../../Zotlabs/Module/Import.php:531
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
+#: ../../Zotlabs/Module/Mail.php:226
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
-#: ../../Zotlabs/Module/Import.php:533
-msgid "Or provide the old server/hub details"
-msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
+#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
+#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1330
+msgid "Please enter a link URL:"
+msgstr "Gib eine URL ein:"
-#: ../../Zotlabs/Module/Import.php:534
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
+#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verfällt YYYY-MM-DD HH;MM"
-#: ../../Zotlabs/Module/Import.php:535
-msgid "Your old login email address"
-msgstr "Deine alte Login-E-Mail-Adresse"
+#: ../../Zotlabs/Module/Mail.php:269
+msgid "Requested channel is not in this network"
+msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
-#: ../../Zotlabs/Module/Import.php:536
-msgid "Your old login password"
-msgstr "Dein altes Passwort"
+#: ../../Zotlabs/Module/Mail.php:277
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
-#: ../../Zotlabs/Module/Import.php:537
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
+#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
+msgid "To:"
+msgstr "An:"
-#: ../../Zotlabs/Module/Import.php:538
-msgid "Make this hub my primary location"
-msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
+#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../Zotlabs/Module/Import.php:539
-msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher"
+#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
+#: ../../include/conversation.php:1390
+msgid "Attach file"
+msgstr "Datei anhängen"
+
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Send"
+msgstr "Absenden"
-#: ../../Zotlabs/Module/Import.php:540
+#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
+#: ../../include/conversation.php:1435
+msgid "Set expiration date"
+msgstr "Verfallsdatum"
+
+#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:743
+#: ../../include/conversation.php:1440
+msgid "Encrypt text"
+msgstr "Text verschlüsseln"
+
+#: ../../Zotlabs/Module/Mail.php:375
+msgid "Delete message"
+msgstr "Nachricht löschen"
+
+#: ../../Zotlabs/Module/Mail.php:376
+msgid "Delivery report"
+msgstr "Zustellungsbericht"
+
+#: ../../Zotlabs/Module/Mail.php:377
+msgid "Recall message"
+msgstr "Nachricht widerrufen"
+
+#: ../../Zotlabs/Module/Mail.php:379
+msgid "Message has been recalled."
+msgstr "Die Nachricht wurde widerrufen."
+
+#: ../../Zotlabs/Module/Mail.php:396
+msgid "Delete Conversation"
+msgstr "Unterhaltung löschen"
+
+#: ../../Zotlabs/Module/Mail.php:398
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen."
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten."
+
+#: ../../Zotlabs/Module/Mail.php:402
+msgid "Send Reply"
+msgstr "Antwort senden"
+
+#: ../../Zotlabs/Module/Mail.php:407
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Deine Nachricht für %s (%s):"
#: ../../Zotlabs/Module/Viewconnections.php:65
msgid "No connections."
@@ -6819,257 +7210,248 @@ msgstr "Xchan-Suche"
msgid "Lookup xchan beginning with (or webbie): "
msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Kalendereinträge wurden importiert."
-
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Keine Kalendereinträge gefunden."
-
-#: ../../Zotlabs/Module/Events.php:106
-msgid "Event can not end before it has started."
-msgstr "Termin-Ende liegt vor dem Beginn."
-
-#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
-#: ../../Zotlabs/Module/Events.php:139
-msgid "Unable to generate preview."
-msgstr "Vorschau konnte nicht erzeugt werden."
-
-#: ../../Zotlabs/Module/Events.php:115
-msgid "Event title and start time are required."
-msgstr "Titel und Startzeit des Termins sind erforderlich."
-
-#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
-msgid "Event not found."
-msgstr "Termin nicht gefunden."
-
-#: ../../Zotlabs/Module/Events.php:453
-msgid "Edit event title"
-msgstr "Termintitel bearbeiten"
-
-#: ../../Zotlabs/Module/Events.php:453
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Termintitel"
-
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (Kommagetrennte Liste)"
-
-#: ../../Zotlabs/Module/Events.php:456
-msgid "Edit Category"
-msgstr "Kategorie bearbeiten"
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Der Chatraum hat keinen Namen"
-#: ../../Zotlabs/Module/Events.php:456
-msgid "Category"
-msgstr "Kategorie"
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Name des Chatraums bereits vergeben"
-#: ../../Zotlabs/Module/Events.php:459
-msgid "Edit start date and time"
-msgstr "Startdatum und -zeit bearbeiten"
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Ungültiger Raumbezeichner."
-#: ../../Zotlabs/Module/Events.php:459
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Startdatum und -zeit"
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Chatraum konnte nicht gefunden werden."
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
-msgid "Finish date and time are not known or not relevant"
-msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "Der Chatraum ist voll"
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Edit finish date and time"
-msgstr "Enddatum und -zeit bearbeiten"
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1924
+msgid "$Projectname Notification"
+msgstr "$Projectname-Benachrichtigung"
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time"
-msgstr "Enddatum und -zeit"
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1925
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
-msgid "Adjust for viewer timezone"
-msgstr "An die Zeitzone des Betrachters anpassen"
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1927
+msgid "Thank You,"
+msgstr "Danke."
-#: ../../Zotlabs/Module/Events.php:464
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien."
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1929
+#, php-format
+msgid "%s Administrator"
+msgstr "der Administrator von %s"
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit Description"
-msgstr "Beschreibung bearbeiten"
+#: ../../Zotlabs/Lib/Enotify.php:116
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../Zotlabs/Module/Events.php:468
-msgid "Edit Location"
-msgstr "Ort bearbeiten"
+#: ../../Zotlabs/Lib/Enotify.php:120
+#, php-format
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Benachrichtigung] Neue Mail empfangen auf %s"
-#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1280
-msgid "Permission settings"
-msgstr "Berechtigungs-Einstellungen"
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s hat Dir eine private Nachricht auf %3$s gesendet."
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
-msgstr "Weitere Optionen"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s hat Dir %2$s geschickt."
-#: ../../Zotlabs/Module/Events.php:624
-msgid "Edit event"
-msgstr "Termin bearbeiten"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "eine private Nachricht"
-#: ../../Zotlabs/Module/Events.php:626
-msgid "Delete event"
-msgstr "Termin löschen"
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
-#: ../../Zotlabs/Module/Events.php:660
-msgid "calendar"
-msgstr "Kalender"
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]einen %4$s[/zrl] kommentiert"
-#: ../../Zotlabs/Module/Events.php:686
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Monat"
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
-#: ../../Zotlabs/Module/Events.php:687
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Woche"
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen %4$s[/zrl] kommentiert"
-#: ../../Zotlabs/Module/Events.php:688
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Tag"
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
-#: ../../Zotlabs/Module/Events.php:722
-msgid "Event removed"
-msgstr "Termin gelöscht"
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
-#: ../../Zotlabs/Module/Events.php:725
-msgid "Failed to remove event"
-msgstr "Termin konnte nicht gelöscht werden"
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
+#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
+#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Der Chatraum hat keinen Namen"
+#: ../../Zotlabs/Lib/Enotify.php:273
+#, php-format
+msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
+msgstr ""
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Name des Chatraums bereits vergeben"
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Benachrichtigung] Gefällt mir in Unterhaltung #%1$d von %2$s erhalten"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Ungültiger Raumbezeichner."
+#: ../../Zotlabs/Lib/Enotify.php:289
+#, php-format
+msgid "%1$s, %2$s liked an item/conversation you created."
+msgstr "%1$s, %2$s gefällt ein Beitrag oder eine Unterhaltung von Dir"
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
-msgstr "Chatraum konnte nicht gefunden werden."
+#: ../../Zotlabs/Lib/Enotify.php:300
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand"
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "Der Chatraum ist voll"
+#: ../../Zotlabs/Lib/Enotify.php:302
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s hat auf Deine Pinnwand auf %3$s geschrieben"
-#: ../../Zotlabs/Lib/Apps.php:205
-msgid "Site Admin"
-msgstr "Hub-Administration"
+#: ../../Zotlabs/Lib/Enotify.php:304
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s hat auf [zrl=%3$s]Deine Pinnwand[/zrl] geschrieben"
-#: ../../Zotlabs/Lib/Apps.php:206
-#: ../../extend/addon/addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr "Fehler melden"
+#: ../../Zotlabs/Lib/Enotify.php:328
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Benachrichtigung] %s hat Dich erwähnt"
-#: ../../Zotlabs/Lib/Apps.php:207
-msgid "View Bookmarks"
-msgstr "Lesezeichen ansehen"
+#: ../../Zotlabs/Lib/Enotify.php:329
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
-#: ../../Zotlabs/Lib/Apps.php:208
-msgid "My Chatrooms"
-msgstr "Meine Chaträume"
+#: ../../Zotlabs/Lib/Enotify.php:330
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]hat Dich erwähnt[/zrl]."
-#: ../../Zotlabs/Lib/Apps.php:210
-msgid "Firefox Share"
-msgstr "Teilen-Knopf für Firefox"
+#: ../../Zotlabs/Lib/Enotify.php:342
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Benachrichtigung] %1$s hat Dich angestupst"
-#: ../../Zotlabs/Lib/Apps.php:211
-msgid "Remote Diagnostics"
-msgstr "Ferndiagnose"
+#: ../../Zotlabs/Lib/Enotify.php:343
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
-#: ../../Zotlabs/Lib/Apps.php:212 ../../include/features.php:319
-msgid "Suggest Channels"
-msgstr "Kanäle vorschlagen"
+#: ../../Zotlabs/Lib/Enotify.php:344
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]hat Dich angestupst[/zrl]."
-#: ../../Zotlabs/Lib/Apps.php:213 ../../include/nav.php:115
-#: ../../boot.php:1719
-msgid "Login"
-msgstr "Anmelden"
+#: ../../Zotlabs/Lib/Enotify.php:360
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet"
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:182
-msgid "Grid"
-msgstr "Grid"
+#: ../../Zotlabs/Lib/Enotify.php:361
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:99
-#: ../../include/conversation.php:1758
-msgid "Wiki"
-msgstr "Wiki"
+#: ../../Zotlabs/Lib/Enotify.php:362
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen Beitrag[/zrl] verschlagwortet"
-#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:185
-msgid "Channel Home"
-msgstr "Mein Kanal"
+#: ../../Zotlabs/Lib/Enotify.php:374
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Benachrichtigung] Verbindungsanfrage erhalten"
-#: ../../Zotlabs/Lib/Apps.php:223 ../../include/nav.php:204
-#: ../../include/conversation.php:1709 ../../include/conversation.php:1712
-msgid "Events"
-msgstr "Termine"
+#: ../../Zotlabs/Lib/Enotify.php:375
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, Du hast eine neue Verbindungsanfrage von '%2$s' auf %3$s erhalten"
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:170
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../Zotlabs/Lib/Enotify.php:376
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, Du hast [zrl=%2$s]eine neue Verbindungsanfrage[/zrl] von %3$s erhalten."
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:196
-msgid "Mail"
-msgstr "Mail"
+#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Du kannst Dir das Profil unter %s ansehen"
-#: ../../Zotlabs/Lib/Apps.php:229 ../../include/nav.php:99
-msgid "Chat"
-msgstr "Chat"
+#: ../../Zotlabs/Lib/Enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen."
-#: ../../Zotlabs/Lib/Apps.php:231
-msgid "Probe"
-msgstr "Testen"
+#: ../../Zotlabs/Lib/Enotify.php:389
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten"
-#: ../../Zotlabs/Lib/Apps.php:232
-msgid "Suggest"
-msgstr "Empfehlen"
+#: ../../Zotlabs/Lib/Enotify.php:390
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
-#: ../../Zotlabs/Lib/Apps.php:233
-msgid "Random Channel"
-msgstr "Zufälliger Kanal"
+#: ../../Zotlabs/Lib/Enotify.php:391
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, Du hast [zrl=%2$s]einen Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
-#: ../../Zotlabs/Lib/Apps.php:234
-msgid "Invite"
-msgstr "Einladen"
+#: ../../Zotlabs/Lib/Enotify.php:397
+msgid "Name:"
+msgstr "Name:"
-#: ../../Zotlabs/Lib/Apps.php:235 ../../include/widgets.php:1635
-msgid "Features"
-msgstr "Funktionen"
+#: ../../Zotlabs/Lib/Enotify.php:398
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../Zotlabs/Lib/Apps.php:236
-#: ../../extend/addon/addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Sprache"
+#: ../../Zotlabs/Lib/Enotify.php:401
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
-#: ../../Zotlabs/Lib/Apps.php:237
-msgid "Post"
-msgstr "Beitrag schreiben"
+#: ../../Zotlabs/Lib/Enotify.php:619
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Benachrichtigung]"
-#: ../../Zotlabs/Lib/Apps.php:238
-#: ../../extend/addon/addon/openid/MysqlProvider.php:58
-#: ../../extend/addon/addon/openid/MysqlProvider.php:59
-#: ../../extend/addon/addon/openid/MysqlProvider.php:60
-msgid "Profile Photo"
-msgstr "Profilfoto"
+#: ../../Zotlabs/Lib/Enotify.php:779
+msgid "created a new post"
+msgstr "Neuer Beitrag wurde erzeugt"
-#: ../../Zotlabs/Lib/Apps.php:339
-msgid "Purchase"
-msgstr "Kaufen"
+#: ../../Zotlabs/Lib/Enotify.php:780
+#, php-format
+msgid "commented on %s's post"
+msgstr "hat %s's Beitrag kommentiert"
#: ../../Zotlabs/Lib/PermissionDescription.php:34
#: ../../include/acl_selectors.php:128
@@ -7077,7 +7459,7 @@ msgid "Visible to your default audience"
msgstr "Standard-Sichtbarkeit gemäß Kanaleinstellungen"
#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:191
+#: ../../include/acl_selectors.php:201
msgid "Only me"
msgstr "Nur ich"
@@ -7134,11 +7516,11 @@ msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Dateien und F
msgid "This is your default setting for the audience of your webpages"
msgstr "Dies ist Deine Voreinstellung für die Sichtbarkeit Deiner Webseiten."
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:683
+#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
msgid "Private Message"
msgstr "Private Nachricht"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:675
+#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:655
msgid "Select"
msgstr "Auswählen"
@@ -7186,11 +7568,11 @@ msgstr "Markierungsstatus (Stern) umschalten"
msgid "starred"
msgstr "markiert"
-#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:690
+#: ../../Zotlabs/Lib/ThreadItem.php:239 ../../include/conversation.php:670
msgid "Message signature validated"
msgstr "Signatur überprüft"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:691
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:671
msgid "Message signature incorrect"
msgstr "Signatur nicht korrekt"
@@ -7246,294 +7628,281 @@ msgstr "Wall-to-Wall"
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
-#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:736
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
#, php-format
msgid "from %s"
msgstr "via %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
#, php-format
msgid "last edited: %s"
msgstr "zuletzt bearbeitet: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:740
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
#, php-format
msgid "Expires: %s"
msgstr "Verfällt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:358
+#: ../../Zotlabs/Lib/ThreadItem.php:360
msgid "Attend"
msgstr "Zusagen"
-#: ../../Zotlabs/Lib/ThreadItem.php:359
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "Attendance Options"
msgstr "Zusageoptionen"
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:362
msgid "Vote"
msgstr "Abstimmen"
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:363
msgid "Voting Options"
msgstr "Abstimmungsoptionen"
-#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../Zotlabs/Lib/ThreadItem.php:383
#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Favoriten speichern"
-#: ../../Zotlabs/Lib/ThreadItem.php:382
+#: ../../Zotlabs/Lib/ThreadItem.php:384
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:391
+#: ../../Zotlabs/Lib/ThreadItem.php:393
msgid "Mark all seen"
msgstr "Alle als gelesen markieren"
-#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mehr anzeigen"
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1255
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
msgid "Bold"
msgstr "Fett"
-#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1256
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
msgid "Italic"
msgstr "Kursiv"
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1257
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
msgid "Underline"
msgstr "Unterstrichen"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1258
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
msgid "Quote"
msgstr "Zitat"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1259
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
msgid "Code"
msgstr "Code"
-#: ../../Zotlabs/Lib/ThreadItem.php:735
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Image"
msgstr "Bild"
-#: ../../Zotlabs/Lib/ThreadItem.php:736
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Insert Link"
msgstr "Link einfügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Video"
msgstr "Video"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
-msgid "$Projectname Notification"
-msgstr "$Projectname-Benachrichtigung"
-
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1915
-msgid "$projectname"
-msgstr "$projectname"
-
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
-msgid "Thank You,"
-msgstr "Danke."
-
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
-
-#: ../../Zotlabs/Lib/Enotify.php:116
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
-
-#: ../../Zotlabs/Lib/Enotify.php:120
-#, php-format
-msgid "[$Projectname:Notify] New mail received at %s"
-msgstr "[$Projectname:Benachrichtigung] Neue Mail empfangen auf %s"
-
-#: ../../Zotlabs/Lib/Enotify.php:122
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, %2$s hat Dir eine private Nachricht auf %3$s gesendet."
-
-#: ../../Zotlabs/Lib/Enotify.php:123
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s hat Dir %2$s geschickt."
-
-#: ../../Zotlabs/Lib/Enotify.php:123
-msgid "a private message"
-msgstr "eine private Nachricht"
-
-#: ../../Zotlabs/Lib/Enotify.php:124
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
-
-#: ../../Zotlabs/Lib/Enotify.php:183
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]einen %4$s[/zrl] kommentiert"
-
-#: ../../Zotlabs/Lib/Enotify.php:191
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
-
-#: ../../Zotlabs/Lib/Enotify.php:200
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen %4$s[/zrl] kommentiert"
-
-#: ../../Zotlabs/Lib/Enotify.php:211
-#, php-format
-msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
+msgstr "Hub-Administration"
-#: ../../Zotlabs/Lib/Enotify.php:212
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
+#: ../../Zotlabs/Lib/Apps.php:213
+#: ../../extend/addon/addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Fehler melden"
-#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:230
-#: ../../Zotlabs/Lib/Enotify.php:256 ../../Zotlabs/Lib/Enotify.php:274
-#: ../../Zotlabs/Lib/Enotify.php:288
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
+msgstr "Lesezeichen ansehen"
-#: ../../Zotlabs/Lib/Enotify.php:221
-#, php-format
-msgid "[$Projectname:Notify] %s posted to your profile wall"
-msgstr "[$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
+msgstr "Meine Chaträume"
-#: ../../Zotlabs/Lib/Enotify.php:223
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s hat auf Deine Pinnwand auf %3$s geschrieben"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
+msgstr "Teilen-Knopf für Firefox"
-#: ../../Zotlabs/Lib/Enotify.php:225
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s hat auf [zrl=%3$s]Deine Pinnwand[/zrl] geschrieben"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
+msgstr "Ferndiagnose"
-#: ../../Zotlabs/Lib/Enotify.php:249
-#, php-format
-msgid "[$Projectname:Notify] %s tagged you"
-msgstr "[$Projectname:Benachrichtigung] %s hat Dich erwähnt"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
+msgstr "Kanäle vorschlagen"
-#: ../../Zotlabs/Lib/Enotify.php:250
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
+#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
+#: ../../boot.php:1732
+msgid "Login"
+msgstr "Anmelden"
-#: ../../Zotlabs/Lib/Enotify.php:251
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]hat Dich erwähnt[/zrl]."
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
+msgid "Grid"
+msgstr "Grid"
-#: ../../Zotlabs/Lib/Enotify.php:263
-#, php-format
-msgid "[$Projectname:Notify] %1$s poked you"
-msgstr "[$Projectname:Benachrichtigung] %1$s hat Dich angestupst"
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
+#: ../../include/features.php:99
+msgid "Wiki"
+msgstr "Wiki"
-#: ../../Zotlabs/Lib/Enotify.php:264
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
+msgid "Channel Home"
+msgstr "Mein Kanal"
-#: ../../Zotlabs/Lib/Enotify.php:265
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]hat Dich angestupst[/zrl]."
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
+#: ../../include/conversation.php:1856 ../../include/nav.php:218
+msgid "Events"
+msgstr "Termine"
-#: ../../Zotlabs/Lib/Enotify.php:281
-#, php-format
-msgid "[$Projectname:Notify] %s tagged your post"
-msgstr "[$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet"
+#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
+msgid "Directory"
+msgstr "Verzeichnis"
-#: ../../Zotlabs/Lib/Enotify.php:282
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
+msgid "Mail"
+msgstr "Mail"
-#: ../../Zotlabs/Lib/Enotify.php:283
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen Beitrag[/zrl] verschlagwortet"
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
+msgstr "Chat"
-#: ../../Zotlabs/Lib/Enotify.php:295
-msgid "[$Projectname:Notify] Introduction received"
-msgstr "[$Projectname:Benachrichtigung] Verbindungsanfrage erhalten"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
+msgstr "Testen"
-#: ../../Zotlabs/Lib/Enotify.php:296
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, Du hast eine neue Verbindungsanfrage von '%2$s' auf %3$s erhalten"
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
+msgstr "Empfehlen"
-#: ../../Zotlabs/Lib/Enotify.php:297
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, Du hast [zrl=%2$s]eine neue Verbindungsanfrage[/zrl] von %3$s erhalten."
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
+msgstr "Zufälliger Kanal"
-#: ../../Zotlabs/Lib/Enotify.php:301 ../../Zotlabs/Lib/Enotify.php:320
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Du kannst Dir das Profil unter %s ansehen"
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
+msgstr "Einladen"
-#: ../../Zotlabs/Lib/Enotify.php:303
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen."
+#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1595
+msgid "Features"
+msgstr "Funktionen"
-#: ../../Zotlabs/Lib/Enotify.php:310
-msgid "[$Projectname:Notify] Friend suggestion received"
-msgstr "[$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten"
+#: ../../Zotlabs/Lib/Apps.php:243
+#: ../../extend/addon/addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Sprache"
-#: ../../Zotlabs/Lib/Enotify.php:311
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
+msgstr "Beitrag schreiben"
-#: ../../Zotlabs/Lib/Enotify.php:312
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, Du hast [zrl=%2$s]einen Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
+#: ../../Zotlabs/Lib/Apps.php:245
+#: ../../extend/addon/addon/openid/MysqlProvider.php:58
+#: ../../extend/addon/addon/openid/MysqlProvider.php:59
+#: ../../extend/addon/addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
+msgstr "Profilfoto"
-#: ../../Zotlabs/Lib/Enotify.php:318
-msgid "Name:"
-msgstr "Name:"
+#: ../../Zotlabs/Lib/Apps.php:355
+msgid "Purchase"
+msgstr "Kaufen"
-#: ../../Zotlabs/Lib/Enotify.php:319
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../Zotlabs/Lib/Apps.php:359
+msgid "Undelete"
+msgstr "Wieder hergestellt"
-#: ../../Zotlabs/Lib/Enotify.php:322
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../Zotlabs/Lib/NativeWiki.php:126
+msgid "Wiki files deleted successfully"
+msgstr "Wiki-Dateien erfolgreich gelöscht"
-#: ../../Zotlabs/Lib/Enotify.php:540
-msgid "[$Projectname:Notify]"
-msgstr "[$Projectname:Benachrichtigung]"
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "Standard"
-#: ../../Zotlabs/Lib/Enotify.php:700
-msgid "created a new post"
-msgstr "Neuer Beitrag wurde erzeugt"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "Abonnent"
+
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "Beitragender"
+
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "Autor"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:31
+#: ../../Zotlabs/Lib/NativeWikiPage.php:62
+msgid "(No Title)"
+msgstr "(Kein Titel)"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:76
+msgid "Wiki page create failed."
+msgstr "Anlegen der Wiki-Seite fehlgeschlagen."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:89
+msgid "Wiki not found."
+msgstr "Wiki nicht gefunden."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:100
+msgid "Destination name already exists"
+msgstr "Zielname bereits vorhanden"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:126
+#: ../../Zotlabs/Lib/NativeWikiPage.php:345
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:156
+msgid "Error reading page content"
+msgstr "Fehler beim Lesen des Seiteninhalts"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:338
+#: ../../Zotlabs/Lib/NativeWikiPage.php:383
+#: ../../Zotlabs/Lib/NativeWikiPage.php:450
+#: ../../Zotlabs/Lib/NativeWikiPage.php:491
+msgid "Error reading wiki"
+msgstr "Fehler beim Lesen des Wiki"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:371
+msgid "Page update failed."
+msgstr "Seitenaktualisierung fehlgeschlagen."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:405
+msgid "Nothing deleted"
+msgstr "Nichts gelöscht"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:471
+msgid "Compare: object not found."
+msgstr "Vergleichen: Objekt nicht gefunden."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:477
+msgid "Page updated"
+msgstr "Seite aktualisiert"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:480
+msgid "Untitled"
+msgstr "Ohne Titel"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:486
+msgid "Wiki resource_id required for git commit"
+msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:701
-#, php-format
-msgid "commented on %s's post"
-msgstr "hat %s's Beitrag kommentiert"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:557
+#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
+#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
msgid "Flag Adult Photos"
@@ -7591,27 +7960,36 @@ msgstr "Linkshänder-Besaitung anzeigen"
msgid "Quick Reference"
msgstr "Schnellreferenz"
-#: ../../extend/addon/addon/diaspora/diaspora.php:671
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr "Kein Benutzername in der Importdatei gefunden."
+
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
+#: ../../include/import.php:51
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:677
msgid "Diaspora Protocol Settings updated."
msgstr "Diaspora-Protokolleinstellungen aktualisiert."
-#: ../../extend/addon/addon/diaspora/diaspora.php:692
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
msgid "Enable the Diaspora protocol for this channel"
msgstr "Diaspora-Protokoll für diesen Kanal aktivieren"
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
msgid "Allow any Diaspora member to comment on your public posts"
msgstr "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren"
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
+#: ../../extend/addon/addon/diaspora/diaspora.php:704
msgid "Prevent your hashtags from being redirected to other sites"
msgstr "Verhindern, dass Deine hashtags zu anderen Seiten umgeleitet werden"
-#: ../../extend/addon/addon/diaspora/diaspora.php:705
+#: ../../extend/addon/addon/diaspora/diaspora.php:709
msgid "Followed hashtags (comma separated, do not include the #)"
msgstr "Verfolgte Hashtags (Komma separierte Liste, ohne die #)"
-#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/diaspora/diaspora.php:714
msgid "Diaspora Protocol Settings"
msgstr "Diaspora-Protokolleinstellungen"
@@ -7941,7 +8319,7 @@ msgstr "Die Vorstellung wurde bereits akzeptiert."
#: ../../extend/addon/addon/friendica/dfrn_request.php:123
#: ../../extend/addon/addon/friendica/dfrn_request.php:528
msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
+msgstr "Die angegebenen Profil Lokalität ist nicht gültig oder enthält keine Profil-Informationen."
#: ../../extend/addon/addon/friendica/dfrn_request.php:128
#: ../../extend/addon/addon/friendica/dfrn_request.php:533
@@ -7951,15 +8329,15 @@ msgstr ""
#: ../../extend/addon/addon/friendica/dfrn_request.php:130
#: ../../extend/addon/addon/friendica/dfrn_request.php:535
msgid "Warning: profile location has no profile photo."
-msgstr ""
+msgstr "Warnung: Beim angegebenen Profil liegt kein Profil-Bild bei."
#: ../../extend/addon/addon/friendica/dfrn_request.php:133
#: ../../extend/addon/addon/friendica/dfrn_request.php:538
#, php-format
msgid "%d required parameter was not found at the given location"
msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Konnte %d benötigten Parameter an der angegebenen Stelle nicht finden."
+msgstr[1] "Konnte %d benötigte Parameter an der angegebenen Stelle nicht finden."
#: ../../extend/addon/addon/friendica/dfrn_request.php:180
msgid "Introduction complete."
@@ -8000,7 +8378,7 @@ msgstr "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert
#: ../../extend/addon/addon/friendica/dfrn_request.php:473
msgid "Unable to resolve your name at the provided location."
-msgstr ""
+msgstr "Konnte deinen Namen nicht bei der angegebenen Stelle ermitteln."
#: ../../extend/addon/addon/friendica/dfrn_request.php:486
msgid "You have already introduced yourself here."
@@ -8094,7 +8472,7 @@ msgid "Add a personal note:"
msgstr "Eine persönliche Nachricht hinterlassen:"
#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2232 ../../include/network.php:2233
+#: ../../include/network.php:2242 ../../include/network.php:2243
msgid "Friendica"
msgstr "Friendica"
@@ -8103,7 +8481,7 @@ msgid "StatusNet/Federated Social Web"
msgstr "StatusNet/Föderierte Soziale Netzwerke"
#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2238
+#: ../../include/network.php:2248
msgid "Diaspora"
msgstr "Diaspora"
@@ -8123,7 +8501,7 @@ msgid "Submit Request"
msgstr "Anfrage absenden"
#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
msgid "GNU-Social Protocol Settings updated."
msgstr "GNU Social Protokoll Einstellungen aktualisiert"
@@ -8132,17 +8510,17 @@ msgid "Enable the (experimental) GNU-Social protocol for this channel"
msgstr "GNU Social Protokoll (experimentell) für diesen Kanal aktualisieren"
#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
msgid "GNU-Social Protocol Settings"
msgstr "GNU Social Protokoll Einstellungen"
#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
msgid "Follow"
msgstr "Folgen"
#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
#, php-format
msgid "%1$s is now following %2$s"
msgstr "%1$s folgt nun %2$s"
@@ -8167,10 +8545,6 @@ msgstr "Friendica-Anmeldebenutzername"
msgid "Friendica Login Password"
msgstr "Friendica-Anmeldepasswort"
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
-msgid "Enable the GNU-Social protocol for this channel"
-msgstr "GNU Social Protokoll für diesen Kanal aktualisieren"
-
#: ../../extend/addon/addon/hubwall/hubwall.php:19
msgid "Send email to all members"
msgstr "E-Mail an alle Mitglieder senden"
@@ -8237,7 +8611,7 @@ msgstr "InsaneJournal-Einstellungen gespeichert."
#: ../../extend/addon/addon/irc/irc.php:45
msgid "Channels to auto connect"
-msgstr ""
+msgstr "Kanäle zur automatischen Verbindung"
#: ../../extend/addon/addon/irc/irc.php:45
#: ../../extend/addon/addon/irc/irc.php:49
@@ -8262,7 +8636,7 @@ msgid "IRC Chatroom"
msgstr "IRC-Chatraum"
#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1056 ../../include/channel.php:1218
+#: ../../include/channel.php:1139 ../../include/channel.php:1301
msgid "Status:"
msgstr "Status:"
@@ -8312,11 +8686,6 @@ msgstr "Interne Liste der Jabber Adressen von Kontakten löschen"
msgid "Configuration Help"
msgstr "Konfigurationshilfe"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
-msgid "Add Contact"
-msgstr "Kontakt hinzufügen"
-
#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
msgid "Jappix Mini Settings"
msgstr "Jappix Mini Einstellungen"
@@ -8579,11 +8948,11 @@ msgstr "ermordet"
#: ../../extend/addon/addon/morepokes/morepokes.php:24
msgid "worship"
-msgstr ""
+msgstr "Anbetung"
#: ../../extend/addon/addon/morepokes/morepokes.php:24
msgid "worshipped"
-msgstr ""
+msgstr "angebetet"
#: ../../extend/addon/addon/morepokes/morepokes.php:25
msgid "kiss"
@@ -8724,7 +9093,7 @@ msgstr "Nsabait-Einstellungen aktualisiert."
#: ../../extend/addon/addon/nsabait/nsabait.php:157
msgid "Enable NSAbait Plugin"
-msgstr ""
+msgstr "Aktiviere das NSAbait Plugin"
#: ../../extend/addon/addon/nsabait/nsabait.php:161
msgid "NSAbait Settings"
@@ -8746,10 +9115,10 @@ msgstr "Inhaltsfilter aktivieren"
#: ../../extend/addon/addon/nsfw/nsfw.php:88
msgid "Comma separated list of keywords to hide"
-msgstr ""
+msgstr "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen."
#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Use /expression/ to provide regular expressions"
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
msgstr ""
#: ../../extend/addon/addon/nsfw/nsfw.php:92
@@ -8770,109 +9139,109 @@ msgstr "Möglicherweise nicht jugendfreie Inhalte"
#: ../../extend/addon/addon/nsfw/nsfw.php:211
#, php-format
-msgid "%s - click to open/close"
-msgstr "%s - zum öffnen/schließen anklicken"
+msgid "%s - view"
+msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
msgid "System defaults:"
msgstr "Systemstandardeinstellungen:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
msgid "Preferred Clipart IDs"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
msgid "List of preferred clipart ids. These will be shown first."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
msgid "Default Search Term"
-msgstr ""
+msgstr "Standard-Suchbegriff"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
msgid "The default search term. These will be shown second."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
msgid "Return After"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
msgid "Page to load after image selection."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/channel.php:965 ../../include/nav.php:93
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+#: ../../include/channel.php:1048 ../../include/nav.php:107
msgid "Edit Profile"
msgstr "Profile bearbeiten"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
msgid "Profile List"
msgstr "Profilliste"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
msgid "Order of Preferred"
msgstr "Bevorzugte Reihenfolge"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
msgid "Sort order of preferred clipart ids."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
msgid "Newest first"
msgstr "Neueste zuerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
msgid "As entered"
msgstr "Wie eingegeben"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
msgid "Order of other"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
msgid "Sort order of other clipart ids."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
msgid "Most downloaded first"
msgstr "Meist heruntergeladene zuerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
msgid "Most liked first"
msgstr "Beliebteste zuerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
msgid "Preferred IDs Message"
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
msgid "Message to display above preferred results."
msgstr ""
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
msgid "Uploaded by: "
msgstr "Hochgeladen von: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
msgid "Drawn by: "
msgstr "Gezeichnet von: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
msgid "Or select from a free OpenClipart.org image:"
-msgstr ""
+msgstr "Oder wähle ein freies Bild von OpenClipart.org:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
msgid "Search Term"
msgstr "Suchbegriff"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
msgid "Unknown error. Please try again later."
msgstr "Unbekannter Fehler. Bitte versuchen Sie es später erneut."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:305
msgid "Profile photo updated successfully."
msgstr "Profilfoto erfolgreich aktualisiert."
@@ -9055,7 +9424,7 @@ msgstr "QR-Generator"
#: ../../extend/addon/addon/qrator/qrator.php:64
msgid "Enter some text"
-msgstr ""
+msgstr "Etwas Text eingeben"
#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
msgid "Enable Rainbowtag"
@@ -9234,7 +9603,7 @@ msgstr ""
#: ../../extend/addon/addon/skeleton/skeleton.php:59
msgid "Some setting"
-msgstr ""
+msgstr "Einige Einstellungen"
#: ../../extend/addon/addon/skeleton/skeleton.php:61
msgid "A setting"
@@ -9411,23 +9780,23 @@ msgstr "API-URL"
msgid "Application name"
msgstr "Anwendungsname"
-#: ../../extend/addon/addon/superblock/superblock.php:106
+#: ../../extend/addon/addon/superblock/superblock.php:110
msgid "Currently blocked"
msgstr "Derzeit blockiert"
-#: ../../extend/addon/addon/superblock/superblock.php:108
+#: ../../extend/addon/addon/superblock/superblock.php:112
msgid "No channels currently blocked"
msgstr "Momentan sind keine Kanäle blockiert"
-#: ../../extend/addon/addon/superblock/superblock.php:114
+#: ../../extend/addon/addon/superblock/superblock.php:118
msgid "\"Superblock\" Settings"
msgstr "\"Superblock\"-Einstellungen"
-#: ../../extend/addon/addon/superblock/superblock.php:279
+#: ../../extend/addon/addon/superblock/superblock.php:322
msgid "Block Completely"
msgstr "Vollständig blockieren"
-#: ../../extend/addon/addon/superblock/superblock.php:326
+#: ../../extend/addon/addon/superblock/superblock.php:371
msgid "superblock settings updated"
msgstr "Superblock Einstellungen aktualisiert"
@@ -9489,7 +9858,7 @@ msgstr "Sie haben gewonnen!"
#: ../../extend/addon/addon/tictac/tictac.php:200
#: ../../extend/addon/addon/tictac/tictac.php:225
msgid "\"Cat\" game!"
-msgstr ""
+msgstr "\"Katzen\"-Spiel!"
#: ../../extend/addon/addon/tictac/tictac.php:223
msgid "I won!"
@@ -9664,7 +10033,7 @@ msgstr "Twitter-Einstellungen aktualisiert."
msgid ""
"No consumer key pair for Twitter found. Please contact your site "
"administrator."
-msgstr ""
+msgstr "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator."
#: ../../extend/addon/addon/twitter/twitter.php:205
msgid ""
@@ -9751,7 +10120,7 @@ msgstr "Bitte rufe die Visage Einstellungen auf %s auf"
#: ../../extend/addon/addon/visage/visage.php:99
msgid "your feature settings page"
-msgstr ""
+msgstr "Die Funktions-Einstellungsseite"
#: ../../extend/addon/addon/visage/visage.php:112
msgid "No entries."
@@ -9928,71 +10297,6 @@ msgstr "Adressbuch importieren"
msgid "Select an addressbook to import to"
msgstr "Adressbuch zum Hineinimportieren auswählen"
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr ""
-
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Standardkalender"
-
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Standardadressbuch"
-
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
-
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
-
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
-
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
-
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "CalDAV/CardDAV-Einstellungen"
-
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-msgid "Mobile"
-msgstr "Mobil"
-
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
-msgid "Home"
-msgstr "Home"
-
-#: ../../extend/addon/addon/cdav/cdav.php:272
-msgid "Home, Voice"
-msgstr "Zuhause, Sprache"
-
-#: ../../extend/addon/addon/cdav/cdav.php:273
-msgid "Home, Fax"
-msgstr "Zuhause, Fax"
-
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-msgid "Work"
-msgstr "Arbeit"
-
-#: ../../extend/addon/addon/cdav/cdav.php:275
-msgid "Work, Voice"
-msgstr "Arbeit, Sprache"
-
-#: ../../extend/addon/addon/cdav/cdav.php:276
-msgid "Work, Fax"
-msgstr "Arbeit, Fax"
-
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
msgid "INVALID EVENT DISMISSED!"
msgstr "UNGÃœLTIGEN TERMIN ABGELEHNT!"
@@ -10065,58 +10369,59 @@ msgstr "Alles löschen"
msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr "Organisation"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Titel"
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr "Telefon"
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Standardkalender"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr ""
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Standardadressbuch"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr "Webseite"
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr "Hinweis"
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr "Feld hinzufügen"
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr ""
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr "Zusätzlich"
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "CalDAV/CardDAV-Einstellungen"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr "Straße"
+#: ../../extend/addon/addon/cdav/cdav.php:272
+#: ../../include/connections.php:896
+msgid "Home, Voice"
+msgstr "Zuhause, Sprache"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr "Ortschaft"
+#: ../../extend/addon/addon/cdav/cdav.php:273
+#: ../../include/connections.php:897
+msgid "Home, Fax"
+msgstr "Zuhause, Fax"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr "Region"
+#: ../../extend/addon/addon/cdav/cdav.php:275
+#: ../../include/connections.php:899
+msgid "Work, Voice"
+msgstr "Arbeit, Sprache"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr "Postleitzahl"
+#: ../../extend/addon/addon/cdav/cdav.php:276
+#: ../../include/connections.php:900
+msgid "Work, Fax"
+msgstr "Arbeit, Fax"
#: ../../extend/addon/addon/chess/chess.php:276
#: ../../extend/addon/addon/chess/chess.php:430
@@ -10148,7 +10453,7 @@ msgstr "Sie müssen weiß oder schwarz auswählen."
msgid "Error creating new game."
msgstr "Fehler beim Erstellen eines neuen Spiels."
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:899
msgid "Requested channel is not available."
msgstr "Angeforderte Kanal nicht verfügbar."
@@ -10190,15 +10495,6 @@ msgstr "Männlich"
msgid "Female"
msgstr "Weiblich"
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben."
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:193
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Login fehlgeschlagen."
-
#: ../../extend/addon/addon/openid/MysqlProvider.php:52
msgid "First Name"
msgstr "Vorname"
@@ -10265,6 +10561,15 @@ msgstr "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmel
msgid "The error message was:"
msgstr "Die Fehlermeldung war:"
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-Protokollfehler. Keine Kennung zurückgegeben."
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:188
+#: ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Login fehlgeschlagen."
+
#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
#, php-format
msgid "Reconnecting %d connections"
@@ -10324,71 +10629,96 @@ msgid ""
"from Mapbox instead of the default OpenStreetMap tile server."
msgstr "Wenn Du ein Mapbox Zugangs-Token eingibst, werden die Kartendaten (Kacheln) damit von Mapbox geladen, anstatt von OpenStreetMap, welches die Voreinstellung ist."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:122
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
msgid "Rendezvous"
msgstr "Rendezvous"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:127
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
msgid ""
"This identity has been deleted by another member due to inactivity. Please "
"press the \"New identity\" button or refresh the page to register a new "
"identity. You may use the same name."
msgstr "Diese Identität wurde von einem anderen Mitglied aufgrund von Inaktivität gelöscht. Bitte klicke auf \"Neue Identität\" oder aktualisiere die Website im Browser, um eine neue Identität zu registrieren. Du kannst dabei den selben Namen verwenden."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:128
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
msgid "Welcome to Rendezvous!"
msgstr "Willkommen bei Rendezvous!"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:129
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
msgid ""
"Enter your name to join this rendezvous. To begin sharing your location with"
" the other members, tap the GPS control. When your location is discovered, a"
" red dot will appear and others will be able to see you on the map."
msgstr "Gib Deinen Namen ein, um diesem Rendezvous beizutreten. Um Deinen Standort mit anderen Mitgliedern zu teilen, klicke auf das GPS Symbol. Sobald Dein Standort ermittelt ist, erscheint ein roter Punkt, und die Anderen werden Dich auf der Karte sehen können."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:131
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
msgid "Let's meet here"
msgstr "Lasst uns hier treffen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:134
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
msgid "New marker"
msgstr "Neue Markierung"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:135
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
msgid "Edit marker"
msgstr "Markierung bearbeiten"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:136
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
msgid "New identity"
msgstr "Neue Identität"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:137
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
msgid "Delete marker"
msgstr "Markierung löschen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:138
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
msgid "Delete member"
msgstr "Mitglied löschen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:139
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
msgid "Edit proximity alert"
msgstr "Annäherungsalarm bearbeiten"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
msgid ""
"A proximity alert will be issued when this member is within a certain radius"
" of you.<br><br>Enter a radius in meters (0 to disable):"
msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:140
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
msgid "distance"
msgstr "Entfernung"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:150
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr ""
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+msgid ""
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Annäherungsalarm für Markierung"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Erinnerungshinweis"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
+msgid ""
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest..."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
msgid "Add new rendezvous"
msgstr "Neues Rendezvous hinzufügen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:151
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
msgid ""
"Create a new rendezvous and share the access link with those you wish to "
"invite to the group. Those who open the link become members of the "
@@ -10396,19 +10726,240 @@ msgid ""
" share their own locations with the group."
msgstr "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen."
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Kein Benutzername in der Importdatei gefunden."
+#: ../../extend/addon/addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr ""
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen."
+#: ../../extend/addon/addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Inhalte von Firefox nach $Projectname teilen"
+
+#: ../../extend/addon/addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
+msgstr ""
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
+msgid "Error retrieving wiki"
+msgstr "Fehler beim Abrufen des Wiki"
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
+msgid "Error creating zip file export folder"
+msgstr "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses "
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
+msgid "Error downloading wiki: "
+msgstr "Fehler beim Herunterladen des Wiki:"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
+#: ../../include/widgets.php:970
+msgid "Wiki Pages"
+msgstr "Wikiseiten"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
+#: ../../include/widgets.php:976
+msgid "Add new page"
+msgstr "Neue Seite hinzufügen"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
+#: ../../include/widgets.php:977
+msgid "Page name"
+msgstr "Seitenname"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
+#: ../../include/widgets.php:927
+msgid "Wiki List"
+msgstr "Wikiliste"
+
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "GNU Social Protokoll für diesen Kanal aktualisieren"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1187
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Suche %1$s (%2$s)"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1187
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:43
+msgid "Search $Projectname"
+msgstr ""
#: ../../include/dba/dba_driver.php:187
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
+#: ../../include/language.php:367 ../../include/text.php:1783
+msgid "default"
+msgstr "Standard"
+
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Wähle eine alternative Sprache"
+
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Ungültige E-Mail-Adresse"
+
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt"
+
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
+
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Eine Einladung wird benötigt."
+
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "Die Einladung konnte nicht bestätigt werden."
+
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Bitte gib die benötigten Informationen ein."
+
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
+
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr "Registrierungsbestätigung für %s"
+
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registrierungsanfrage auf %s"
+
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "Dein Registrierungspasswort"
+
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registrierungsdetails für %s"
+
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Nutzerkonto bestätigt."
+
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrierung für %s wurde widerrufen"
+
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Klicke hier, um das Upgrade durchzuführen."
+
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
+
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
+
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "Wer kann das sehen?"
+
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Benutzerdefinierte Auswahl"
+
+#: ../../include/acl_selectors.php:210
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
+
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Anzeigen"
+
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "Nicht anzeigen"
+
+#: ../../include/acl_selectors.php:245
+#, php-format
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
+
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+#: ../../include/widgets.php:46 ../../include/widgets.php:469
+#: ../../include/contact_widgets.php:91
+msgid "Categories"
+msgstr "Kategorien"
+
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Schlagwörter"
+
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Schlüsselwörter"
+
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "habe"
+
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "hat"
+
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "will"
+
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "will"
+
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "gefällt"
+
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "missfällt"
+
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: ../../include/markdown.php:539 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y, H:i"
+
+#: ../../include/markdown.php:541
+msgid "$Projectname event notification:"
+msgstr "$Projectname-Terminbenachrichtigung:"
+
+#: ../../include/markdown.php:545 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr "Beginnt:"
+
+#: ../../include/markdown.php:553 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Endet:"
+
#: ../../include/datetime.php:147
msgid "Birthday"
msgstr "Geburtstag"
@@ -10421,7 +10972,7 @@ msgstr "Alter:"
msgid "YYYY-MM-DD or MM-DD"
msgstr "JJJJ-MM-TT oder MM-TT"
-#: ../../include/datetime.php:286 ../../boot.php:2563
+#: ../../include/datetime.php:286 ../../boot.php:2578
msgid "never"
msgstr "Nie"
@@ -10494,90 +11045,6 @@ msgstr "%1$ss Geburtstag"
msgid "Happy Birthday %1$s"
msgstr "Alles Gute zum Geburtstag, %1$s"
-#: ../../include/account.php:35
-msgid "Not a valid email address"
-msgstr "Ungültige E-Mail-Adresse"
-
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt"
-
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
-msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
-
-#: ../../include/account.php:75
-msgid "An invitation is required."
-msgstr "Eine Einladung wird benötigt."
-
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
-msgstr "Die Einladung konnte nicht bestätigt werden."
-
-#: ../../include/account.php:130
-msgid "Please enter the required information."
-msgstr "Bitte gib die benötigten Informationen ein."
-
-#: ../../include/account.php:198
-msgid "Failed to store account information."
-msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
-
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Registrierungsbestätigung für %s"
-
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
-msgstr "Registrierungsanfrage auf %s"
-
-#: ../../include/account.php:352
-msgid "your registration password"
-msgstr "Dein Registrierungspasswort"
-
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
-msgstr "Registrierungsdetails für %s"
-
-#: ../../include/account.php:431
-msgid "Account approved."
-msgstr "Nutzerkonto bestätigt."
-
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrierung für %s wurde widerrufen"
-
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
-msgstr "Klicke hier, um das Upgrade durchzuführen."
-
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
-msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
-
-#: ../../include/message.php:20
-msgid "No recipient provided."
-msgstr "Kein Empfänger angegeben"
-
-#: ../../include/message.php:25
-msgid "[no subject]"
-msgstr "[no subject]"
-
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
-msgstr "Kann Absender nicht bestimmen."
-
-#: ../../include/message.php:223
-msgid "Stored post could not be verified."
-msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
-
#: ../../include/selectors.php:30
msgid "Frequently"
msgstr "Häufig"
@@ -10818,1026 +11285,735 @@ msgstr "Interessiert mich nicht"
msgid "Ask me"
msgstr "Frag mich mal"
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
-msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-
-#: ../../include/channel.php:67
-msgid "Empty name"
-msgstr "Namensfeld leer"
-
-#: ../../include/channel.php:70
-msgid "Name too long"
-msgstr "Name ist zu lang"
-
-#: ../../include/channel.php:181
-msgid "No account identifier"
-msgstr "Keine Account-Kennung"
-
-#: ../../include/channel.php:193
-msgid "Nickname is required."
-msgstr "Spitzname ist erforderlich."
-
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
-msgstr "Reservierter Kurzname. Bitte wähle einen anderen."
-
-#: ../../include/channel.php:212
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."
-
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
-msgstr "Kann die erstellte Identität nicht empfangen"
-
-#: ../../include/channel.php:341
-msgid "Default Profile"
-msgstr "Standard-Profil"
-
-#: ../../include/channel.php:962
-msgid "Create New Profile"
-msgstr "Neues Profil erstellen"
-
-#: ../../include/channel.php:982
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
-
-#: ../../include/channel.php:1055 ../../include/channel.php:1174
-msgid "Gender:"
-msgstr "Geschlecht:"
-
-#: ../../include/channel.php:1057 ../../include/channel.php:1229
-msgid "Homepage:"
-msgstr "Homepage:"
-
-#: ../../include/channel.php:1058
-msgid "Online Now"
-msgstr "gerade online"
-
-#: ../../include/channel.php:1179
-msgid "Like this channel"
-msgstr "Dieser Kanal gefällt mir"
-
-#: ../../include/channel.php:1203
-msgid "j F, Y"
-msgstr "j. F Y"
-
-#: ../../include/channel.php:1204
-msgid "j F"
-msgstr "j. F"
-
-#: ../../include/channel.php:1211
-msgid "Birthday:"
-msgstr "Geburtstag:"
-
-#: ../../include/channel.php:1224
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "seit %1$d %2$s"
-
-#: ../../include/channel.php:1227
-msgid "Sexual Preference:"
-msgstr "Sexuelle Orientierung:"
-
-#: ../../include/channel.php:1233
-msgid "Tags:"
-msgstr "Schlagworte:"
-
-#: ../../include/channel.php:1235
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
-
-#: ../../include/channel.php:1237
-msgid "Religion:"
-msgstr "Religion:"
-
-#: ../../include/channel.php:1241
-msgid "Hobbies/Interests:"
-msgstr "Hobbys/Interessen:"
-
-#: ../../include/channel.php:1243
-msgid "Likes:"
-msgstr "Gefällt:"
-
-#: ../../include/channel.php:1245
-msgid "Dislikes:"
-msgstr "Gefällt nicht:"
-
-#: ../../include/channel.php:1247
-msgid "Contact information and Social Networks:"
-msgstr "Kontaktinformation und soziale Netzwerke:"
-
-#: ../../include/channel.php:1249
-msgid "My other channels:"
-msgstr "Meine anderen Kanäle:"
-
-#: ../../include/channel.php:1251
-msgid "Musical interests:"
-msgstr "Musikalische Interessen:"
-
-#: ../../include/channel.php:1253
-msgid "Books, literature:"
-msgstr "Bücher, Literatur:"
-
-#: ../../include/channel.php:1255
-msgid "Television:"
-msgstr "Fernsehen:"
-
-#: ../../include/channel.php:1257
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/Tanz/Kultur/Unterhaltung:"
-
-#: ../../include/channel.php:1259
-msgid "Love/Romance:"
-msgstr "Liebe/Romantik:"
-
-#: ../../include/channel.php:1261
-msgid "Work/employment:"
-msgstr "Arbeit/Anstellung:"
-
-#: ../../include/channel.php:1263
-msgid "School/education:"
-msgstr "Schule/Ausbildung:"
-
-#: ../../include/channel.php:1284
-msgid "Like this thing"
-msgstr "Gefällt mir"
-
-#: ../../include/connections.php:95
+#: ../../include/connections.php:127
msgid "New window"
msgstr "Neues Fenster"
-#: ../../include/connections.php:96
+#: ../../include/connections.php:128
msgid "Open the selected location in a different window or browser tab"
msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"
-#: ../../include/connections.php:214
+#: ../../include/connections.php:246
#, php-format
msgid "User '%s' deleted"
msgstr "Benutzer '%s' gelöscht"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Verzeichnisoptionen"
-
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Sicherer Modus"
-
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Nur öffentliche Foren"
-
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Nur dieser Hub"
-
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1718
-msgid "Logout"
-msgstr "Abmelden"
-
-#: ../../include/nav.php:85 ../../include/nav.php:118
-msgid "End this session"
-msgstr "Beende diese Sitzung"
-
-#: ../../include/nav.php:88
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
-
-#: ../../include/nav.php:89
-msgid "Your profile page"
-msgstr "Deine Profilseite"
-
-#: ../../include/nav.php:91
-msgid "Manage/Edit profiles"
-msgstr "Profile verwalten"
-
-#: ../../include/nav.php:93
-msgid "Edit your profile"
-msgstr "Profil bearbeiten"
+#: ../../include/conversation.php:204
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ist jetzt mit %2$s verbunden"
-#: ../../include/nav.php:95
-msgid "Your photos"
-msgstr "Deine Bilder"
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s stupste %2$s an"
-#: ../../include/nav.php:96
-msgid "Your files"
-msgstr "Deine Dateien"
+#: ../../include/conversation.php:243 ../../include/text.php:1092
+#: ../../include/text.php:1097
+msgid "poked"
+msgstr "stupste"
-#: ../../include/nav.php:99
-msgid "Your chatrooms"
-msgstr "Deine Chaträume"
+#: ../../include/conversation.php:690
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "%ss Profil auf %s ansehen"
-#: ../../include/nav.php:105 ../../include/conversation.php:1735
-msgid "Bookmarks"
-msgstr "Lesezeichen"
+#: ../../include/conversation.php:710
+msgid "Categories:"
+msgstr "Kategorien:"
-#: ../../include/nav.php:105
-msgid "Your bookmarks"
-msgstr "Deine Lesezeichen"
+#: ../../include/conversation.php:711
+msgid "Filed under:"
+msgstr "Gespeichert unter:"
-#: ../../include/nav.php:109
-msgid "Your webpages"
-msgstr "Deine Webseiten"
+#: ../../include/conversation.php:736
+msgid "View in context"
+msgstr "Im Zusammenhang anschauen"
-#: ../../include/nav.php:111
-msgid "Your wikis"
-msgstr "Ihre Wikis"
+#: ../../include/conversation.php:832
+msgid "remove"
+msgstr "lösche"
-#: ../../include/nav.php:115
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../include/conversation.php:836 ../../include/nav.php:292
+msgid "Loading..."
+msgstr "Lädt ..."
-#: ../../include/nav.php:131
-msgid "Remote authentication"
-msgstr "Ãœber Konto auf anderem Server einloggen"
+#: ../../include/conversation.php:837
+msgid "Delete Selected Items"
+msgstr "Lösche die ausgewählten Elemente"
-#: ../../include/nav.php:131
-msgid "Click to authenticate to your home hub"
-msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
+#: ../../include/conversation.php:930 ../../include/conversation.php:972
+msgid "View Source"
+msgstr "Quelle anzeigen"
-#: ../../include/nav.php:143
-msgid "Get me home"
-msgstr "Bringe mich nach Hause (eigener Kanal)"
+#: ../../include/conversation.php:931 ../../include/conversation.php:982
+msgid "Follow Thread"
+msgstr "Unterhaltung folgen"
-#: ../../include/nav.php:145
-msgid "Log me out of this site"
-msgstr "Logge mich von dieser Seite aus"
+#: ../../include/conversation.php:932 ../../include/conversation.php:991
+msgid "Unfollow Thread"
+msgstr "Unterhaltung nicht mehr folgen"
-#: ../../include/nav.php:150
-msgid "Create an account"
-msgstr "Erzeuge ein Konto"
+#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+msgid "Activity/Posts"
+msgstr "Aktivitäten/Beiträge"
-#: ../../include/nav.php:162
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+msgid "Edit Connection"
+msgstr "Verbindung bearbeiten"
-#: ../../include/nav.php:166
-msgid "Applications, utilities, links, games"
-msgstr "Anwendungen (Apps), Zubehör, Links, Spiele"
+#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+msgid "Message"
+msgstr "Nachricht"
-#: ../../include/nav.php:168
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../include/conversation.php:1223
+#, php-format
+msgid "%s likes this."
+msgstr "%s gefällt das."
-#: ../../include/nav.php:170
-msgid "Channel Directory"
-msgstr "Kanal-Verzeichnis"
+#: ../../include/conversation.php:1223
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s gefällt das nicht."
-#: ../../include/nav.php:182
-msgid "Your grid"
-msgstr "Dein Grid"
+#: ../../include/conversation.php:1227
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
-#: ../../include/nav.php:183
-msgid "Mark all grid notifications seen"
-msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
+#: ../../include/conversation.php:1229
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
+msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
-#: ../../include/nav.php:185
-msgid "Channel home"
-msgstr "Mein Kanal"
+#: ../../include/conversation.php:1235
+msgid "and"
+msgstr "und"
-#: ../../include/nav.php:186
-msgid "Mark all channel notifications seen"
-msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
+#: ../../include/conversation.php:1238
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", und %d andere"
-#: ../../include/nav.php:192
-msgid "Notices"
-msgstr "Benachrichtigungen"
+#: ../../include/conversation.php:1239
+#, php-format
+msgid "%s like this."
+msgstr "%s gefällt das."
-#: ../../include/nav.php:192
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../include/conversation.php:1239
+#, php-format
+msgid "%s don't like this."
+msgstr "%s gefällt das nicht."
-#: ../../include/nav.php:193
-msgid "See all notifications"
-msgstr "Alle Benachrichtigungen ansehen"
+#: ../../include/conversation.php:1282
+msgid "Set your location"
+msgstr "Standort"
-#: ../../include/nav.php:196
-msgid "Private mail"
-msgstr "Persönliche Mail"
+#: ../../include/conversation.php:1283
+msgid "Clear browser location"
+msgstr "Browser-Standort löschen"
-#: ../../include/nav.php:197
-msgid "See all private messages"
-msgstr "Alle persönlichen Nachrichten ansehen"
+#: ../../include/conversation.php:1331
+msgid "Tag term:"
+msgstr "Schlagwort:"
-#: ../../include/nav.php:198
-msgid "Mark all private messages seen"
-msgstr "Markiere alle persönlichen Nachrichten als gesehen"
+#: ../../include/conversation.php:1332
+msgid "Where are you right now?"
+msgstr "Wo bist Du jetzt grade?"
-#: ../../include/nav.php:199 ../../include/widgets.php:700
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../include/conversation.php:1337
+msgid "Choose a different album..."
+msgstr "Wählen Sie ein anderes Album aus..."
-#: ../../include/nav.php:200 ../../include/widgets.php:705
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../include/conversation.php:1341
+msgid "Comments enabled"
+msgstr "Kommentare aktiviert"
-#: ../../include/nav.php:201 ../../include/widgets.php:710
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../include/conversation.php:1342
+msgid "Comments disabled"
+msgstr "Kommentare deaktiviert"
-#: ../../include/nav.php:204
-msgid "Event Calendar"
-msgstr "Terminkalender"
+#: ../../include/conversation.php:1380
+msgid "Page link name"
+msgstr "Link zur Seite"
-#: ../../include/nav.php:205
-msgid "See all events"
-msgstr "Alle Termine ansehen"
+#: ../../include/conversation.php:1383
+msgid "Post as"
+msgstr "Veröffentlichen als"
-#: ../../include/nav.php:206
-msgid "Mark all events seen"
-msgstr "Markiere alle Termine als gesehen"
+#: ../../include/conversation.php:1397
+msgid "Toggle voting"
+msgstr "Umfragewerkzeug aktivieren"
-#: ../../include/nav.php:209
-msgid "Manage Your Channels"
-msgstr "Verwalte Deine Kanäle"
+#: ../../include/conversation.php:1400
+msgid "Disable comments"
+msgstr "Kommentare deaktivieren"
-#: ../../include/nav.php:211
-msgid "Account/Channel Settings"
-msgstr "Konto-/Kanal-Einstellungen"
+#: ../../include/conversation.php:1401
+msgid "Toggle comments"
+msgstr "Kommentare umschalten"
-#: ../../include/nav.php:219 ../../include/widgets.php:1665
-msgid "Admin"
-msgstr "Administration"
+#: ../../include/conversation.php:1409
+msgid "Categories (optional, comma-separated list)"
+msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../include/nav.php:219
-msgid "Site Setup and Configuration"
-msgstr "Seiten-Einrichtung und -Konfiguration"
+#: ../../include/conversation.php:1432
+msgid "Other networks and post services"
+msgstr "Andere Netzwerke und Platformen"
-#: ../../include/nav.php:250 ../../include/conversation.php:869
-msgid "Loading..."
-msgstr "Lädt ..."
+#: ../../include/conversation.php:1438
+msgid "Set publish date"
+msgstr "Veröffentlichungsdatum festlegen"
-#: ../../include/nav.php:255
-msgid "@name, #tag, ?doc, content"
-msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
+#: ../../include/conversation.php:1692
+msgid "Discover"
+msgstr "Entdecken"
-#: ../../include/nav.php:256
-msgid "Please wait..."
-msgstr "Bitte warten..."
+#: ../../include/conversation.php:1695
+msgid "Imported public streams"
+msgstr "Importierte öffentliche Beiträge"
-#: ../../include/features.php:58
-msgid "General Features"
-msgstr "Allgemeine Funktionen"
+#: ../../include/conversation.php:1700
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
-#: ../../include/features.php:63
-msgid "Multiple Profiles"
-msgstr "Mehrfachprofile"
+#: ../../include/conversation.php:1703
+msgid "Sort by Comment Date"
+msgstr "Nach Kommentardatum sortiert"
-#: ../../include/features.php:64
-msgid "Ability to create multiple profiles"
-msgstr "Ermöglicht das Anlegen mehrerer Profile pro Kanal"
+#: ../../include/conversation.php:1707
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
-#: ../../include/features.php:72
-msgid "Advanced Profiles"
-msgstr "Erweiterte Profile"
+#: ../../include/conversation.php:1710
+msgid "Sort by Post Date"
+msgstr "Nach Beitragsdatum sortiert"
-#: ../../include/features.php:73
-msgid "Additional profile sections and selections"
-msgstr "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung"
+#: ../../include/conversation.php:1718
+msgid "Posts that mention or involve you"
+msgstr "Beiträge mit Beteiligung Deinerseits"
-#: ../../include/features.php:81
-msgid "Profile Import/Export"
-msgstr "Profil-Import/Export"
+#: ../../include/conversation.php:1727
+msgid "Activity Stream - by date"
+msgstr "Activity Stream – nach Datum sortiert"
-#: ../../include/features.php:82
-msgid "Save and load profile details across sites/channels"
-msgstr "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren"
+#: ../../include/conversation.php:1733
+msgid "Starred"
+msgstr "Markiert"
-#: ../../include/features.php:90
-msgid "Web Pages"
-msgstr "Webseiten"
+#: ../../include/conversation.php:1736
+msgid "Favourite Posts"
+msgstr "Markierte Beiträge"
-#: ../../include/features.php:91
-msgid "Provide managed web pages on your channel"
-msgstr "Ermöglicht das Erstellen von Webseiten in Deinem Kanal"
+#: ../../include/conversation.php:1743
+msgid "Spam"
+msgstr "Spam"
-#: ../../include/features.php:100
-msgid "Provide a wiki for your channel"
-msgstr "Stelle ein Wiki in Deinem Kanal zur Verfügung"
+#: ../../include/conversation.php:1746
+msgid "Posts flagged as SPAM"
+msgstr "Nachrichten, die als SPAM markiert wurden"
-#: ../../include/features.php:117
-msgid "Private Notes"
-msgstr "Private Notizen"
+#: ../../include/conversation.php:1818
+msgid "Status Messages and Posts"
+msgstr "Statusnachrichten und Beiträge"
-#: ../../include/features.php:118
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"
+#: ../../include/conversation.php:1830
+msgid "Profile Details"
+msgstr "Profil-Details"
-#: ../../include/features.php:126
-msgid "Navigation Channel Select"
-msgstr "Kanal-Auswahl in der Navigationsleiste"
+#: ../../include/conversation.php:1839 ../../include/photos.php:515
+msgid "Photo Albums"
+msgstr "Fotoalben"
-#: ../../include/features.php:127
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"
+#: ../../include/conversation.php:1846
+msgid "Files and Storage"
+msgstr "Dateien und Speicher"
-#: ../../include/features.php:135
-msgid "Photo Location"
-msgstr "Aufnahmeort"
+#: ../../include/conversation.php:1866 ../../include/conversation.php:1869
+#: ../../include/widgets.php:902
+msgid "Chatrooms"
+msgstr "Chaträume"
-#: ../../include/features.php:136
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte"
+#: ../../include/conversation.php:1879
+msgid "Bookmarks"
+msgstr "Lesezeichen"
-#: ../../include/features.php:144
-msgid "Access Controlled Chatrooms"
-msgstr "Zugriffskontrollierte Chaträume"
+#: ../../include/conversation.php:1882
+msgid "Saved Bookmarks"
+msgstr "Gespeicherte Lesezeichen"
-#: ../../include/features.php:145
-msgid "Provide chatrooms and chat services with access control."
-msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an."
+#: ../../include/conversation.php:1892
+msgid "View Webpages"
+msgstr "Webseiten anzeigen"
-#: ../../include/features.php:153
-msgid "Smart Birthdays"
-msgstr "Smarte Geburtstage"
+#: ../../include/conversation.php:1958
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Zusage"
+msgstr[1] "Zusagen"
-#: ../../include/features.php:154
-msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind."
+#: ../../include/conversation.php:1961
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "Absage"
+msgstr[1] "Absagen"
-#: ../../include/features.php:162
-msgid "Advanced Directory Search"
-msgstr "Erweiterte Verzeichnissuche"
+#: ../../include/conversation.php:1964
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] " Unentschlossen"
+msgstr[1] "Unentschlossene"
-#: ../../include/features.php:163
-msgid "Allows creation of complex directory search queries"
-msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen"
+#: ../../include/conversation.php:1967
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "Zustimmung"
+msgstr[1] "Zustimmungen"
-#: ../../include/features.php:171
-msgid "Advanced Theme and Layout Settings"
-msgstr "Erweiterte Design- und Layout-Einstellungen"
+#: ../../include/conversation.php:1970
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "Ablehnung"
+msgstr[1] "Ablehnungen"
-#: ../../include/features.php:172
-msgid "Allows fine tuning of themes and page layouts"
-msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts"
+#: ../../include/conversation.php:1973
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "Enthaltung"
+msgstr[1] "Enthaltungen"
-#: ../../include/features.php:182
-msgid "Post Composition Features"
-msgstr "Nachbearbeitungsfunktionen"
+#: ../../include/message.php:32
+msgid "Unable to determine sender."
+msgstr "Kann Absender nicht bestimmen."
-#: ../../include/features.php:186
-msgid "Large Photos"
-msgstr "Große Fotos"
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "Kein Empfänger angegeben"
-#: ../../include/features.php:187
-msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet."
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[no subject]"
-#: ../../include/features.php:196
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds"
+#: ../../include/message.php:225
+msgid "Stored post could not be verified."
+msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
-#: ../../include/features.php:204
-msgid "Even More Encryption"
-msgstr "Noch mehr Verschlüsselung"
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "Gast:"
-#: ../../include/features.php:205
+#: ../../include/security.php:532
msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)"
-
-#: ../../include/features.php:213
-msgid "Enable Voting Tools"
-msgstr "Umfragewerkzeuge aktivieren"
-
-#: ../../include/features.php:214
-msgid "Provide a class of post which others can vote on"
-msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)"
-
-#: ../../include/features.php:222
-msgid "Disable Comments"
-msgstr "Kommentare deaktivieren"
-
-#: ../../include/features.php:223
-msgid "Provide the option to disable comments for a post"
-msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten"
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
-#: ../../include/features.php:231
-msgid "Delayed Posting"
-msgstr "Verzögertes Senden"
+#: ../../include/widgets.php:103
+msgid "System"
+msgstr "System"
-#: ../../include/features.php:232
-msgid "Allow posts to be published at a later date"
-msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen"
+#: ../../include/widgets.php:106
+msgid "New App"
+msgstr "Neue App"
-#: ../../include/features.php:240
-msgid "Content Expiration"
-msgstr "Verfall von Inhalten"
+#: ../../include/widgets.php:107
+msgid "Edit Apps"
+msgstr "Apps bearbeiten"
-#: ../../include/features.php:241
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum."
+#: ../../include/widgets.php:155
+msgid "Suggestions"
+msgstr "Vorschläge"
-#: ../../include/features.php:249
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Doppelte Beiträge unterdrücken"
+#: ../../include/widgets.php:156
+msgid "See more..."
+msgstr "Mehr anzeigen …"
-#: ../../include/features.php:250
-msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden."
+#: ../../include/widgets.php:176
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen."
-#: ../../include/features.php:261
-msgid "Network and Stream Filtering"
-msgstr "Netzwerk- und Stream-Filter"
+#: ../../include/widgets.php:182
+msgid "Add New Connection"
+msgstr "Neue Verbindung hinzufügen"
-#: ../../include/features.php:265
-msgid "Search by Date"
-msgstr "Suche nach Datum"
+#: ../../include/widgets.php:183
+msgid "Enter channel address"
+msgstr "Adresse des Kanals eingeben"
-#: ../../include/features.php:266
-msgid "Ability to select posts by date ranges"
-msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
+#: ../../include/widgets.php:184
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Beispiele: bob@beispiel.com, http://beispiel.com/barbara"
-#: ../../include/features.php:274 ../../include/group.php:311
-msgid "Privacy Groups"
-msgstr "Gruppen"
+#: ../../include/widgets.php:200
+msgid "Notes"
+msgstr "Notizen"
-#: ../../include/features.php:275
-msgid "Enable management and selection of privacy groups"
-msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
+#: ../../include/widgets.php:276
+msgid "Remove term"
+msgstr "Eintrag löschen"
-#: ../../include/features.php:283 ../../include/widgets.php:283
+#: ../../include/widgets.php:284 ../../include/features.php:301
msgid "Saved Searches"
msgstr "Gespeicherte Suchanfragen"
-#: ../../include/features.php:284
-msgid "Save search terms for re-use"
-msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung"
-
-#: ../../include/features.php:292
-msgid "Network Personal Tab"
-msgstr "Persönlicher Netzwerkreiter"
-
-#: ../../include/features.php:293
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast"
-
-#: ../../include/features.php:301
-msgid "Network New Tab"
-msgstr "Netzwerkreiter Neu"
-
-#: ../../include/features.php:302
-msgid "Enable tab to display all new Network activity"
-msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt"
-
-#: ../../include/features.php:310
-msgid "Affinity Tool"
-msgstr "Beziehungs-Tool"
-
-#: ../../include/features.php:311
-msgid "Filter stream activity by depth of relationships"
-msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann"
-
-#: ../../include/features.php:320
-msgid "Show friend and connection suggestions"
-msgstr "Freund- und Verbindungsvorschläge anzeigen"
-
-#: ../../include/features.php:328
-msgid "Connection Filtering"
-msgstr "Filter für Verbindungen"
-
-#: ../../include/features.php:329
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)"
-
-#: ../../include/features.php:341
-msgid "Post/Comment Tools"
-msgstr "Beitrag-/Kommentar-Tools"
-
-#: ../../include/features.php:345
-msgid "Community Tagging"
-msgstr "Gemeinschaftliches Verschlagworten"
-
-#: ../../include/features.php:346
-msgid "Ability to tag existing posts"
-msgstr "Ermöglicht das Verschlagworten existierender Beiträge"
-
-#: ../../include/features.php:354
-msgid "Post Categories"
-msgstr "Beitrags-Kategorien"
-
-#: ../../include/features.php:355
-msgid "Add categories to your posts"
-msgstr "Aktiviert Kategorien für Beiträge"
-
-#: ../../include/features.php:363
-msgid "Emoji Reactions"
-msgstr "Emoji Reaktionen"
-
-#: ../../include/features.php:364
-msgid "Add emoji reaction ability to posts"
-msgstr "Aktiviert Emoji-Reaktionen für Beiträge"
+#: ../../include/widgets.php:285 ../../include/group.php:336
+msgid "add"
+msgstr "hinzufügen"
-#: ../../include/features.php:372 ../../include/contact_widgets.php:53
-#: ../../include/widgets.php:346
+#: ../../include/widgets.php:347 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
msgid "Saved Folders"
msgstr "Gespeicherte Ordner"
-#: ../../include/features.php:373
-msgid "Ability to file posts under folders"
-msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-
-#: ../../include/features.php:381
-msgid "Dislike Posts"
-msgstr "Gefällt-mir-nicht-Beiträge"
-
-#: ../../include/features.php:382
-msgid "Ability to dislike posts/comments"
-msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche"
-
-#: ../../include/features.php:390
-msgid "Star Posts"
-msgstr "Beiträge mit Sternchen versehen"
-
-#: ../../include/features.php:391
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol"
-
-#: ../../include/features.php:399
-msgid "Tag Cloud"
-msgstr "Schlagwort-Wolke"
-
-#: ../../include/features.php:400
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite"
-
-#: ../../include/features.php:412
-msgid "Premium Channel"
-msgstr "Premium-Kanal"
-
-#: ../../include/features.php:413
-msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
-
-#: ../../include/text.php:460
-msgid "prev"
-msgstr "vorherige"
-
-#: ../../include/text.php:462
-msgid "first"
-msgstr "erste"
-
-#: ../../include/text.php:491
-msgid "last"
-msgstr "letzte"
-
-#: ../../include/text.php:494
-msgid "next"
-msgstr "nächste"
-
-#: ../../include/text.php:505
-msgid "older"
-msgstr "älter"
-
-#: ../../include/text.php:507
-msgid "newer"
-msgstr "neuer"
-
-#: ../../include/text.php:904
-msgid "No connections"
-msgstr "Keine Verbindungen"
+#: ../../include/widgets.php:350 ../../include/widgets.php:472
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Alles"
-#: ../../include/text.php:929
-#, php-format
-msgid "View all %s connections"
-msgstr "Alle Verbindungen von %s anzeigen"
+#: ../../include/widgets.php:391
+msgid "Archives"
+msgstr "Archive"
-#: ../../include/text.php:1074 ../../include/text.php:1079
-msgid "poke"
-msgstr "anstupsen"
+#: ../../include/widgets.php:563
+msgid "Refresh"
+msgstr "Aktualisieren"
-#: ../../include/text.php:1074 ../../include/text.php:1079
-#: ../../include/conversation.php:243
-msgid "poked"
-msgstr "stupste"
+#: ../../include/widgets.php:603
+msgid "Account settings"
+msgstr "Konto-Einstellungen"
-#: ../../include/text.php:1080
-msgid "ping"
-msgstr "anpingen"
+#: ../../include/widgets.php:609
+msgid "Channel settings"
+msgstr "Kanal-Einstellungen"
-#: ../../include/text.php:1080
-msgid "pinged"
-msgstr "pingte"
+#: ../../include/widgets.php:618
+msgid "Additional features"
+msgstr "Zusätzliche Funktionen"
-#: ../../include/text.php:1081
-msgid "prod"
-msgstr "knuffen"
+#: ../../include/widgets.php:625
+msgid "Feature/Addon settings"
+msgstr "Plugin-Einstellungen"
-#: ../../include/text.php:1081
-msgid "prodded"
-msgstr "knuffte"
+#: ../../include/widgets.php:631
+msgid "Display settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../include/text.php:1082
-msgid "slap"
-msgstr "ohrfeigen"
+#: ../../include/widgets.php:638
+msgid "Manage locations"
+msgstr "Klon-Adressen verwalten"
-#: ../../include/text.php:1082
-msgid "slapped"
-msgstr "ohrfeigte"
+#: ../../include/widgets.php:645
+msgid "Export channel"
+msgstr "Kanal exportieren"
-#: ../../include/text.php:1083
-msgid "finger"
-msgstr "befummeln"
+#: ../../include/widgets.php:651
+msgid "Connected apps"
+msgstr "Verbundene Apps"
-#: ../../include/text.php:1083
-msgid "fingered"
-msgstr "befummelte"
+#: ../../include/widgets.php:666 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Berechtigungsrollen"
-#: ../../include/text.php:1084
-msgid "rebuff"
-msgstr "eine Abfuhr erteilen"
+#: ../../include/widgets.php:683
+msgid "Premium Channel Settings"
+msgstr "Premium-Kanal-Einstellungen"
-#: ../../include/text.php:1084
-msgid "rebuffed"
-msgstr "zurückgewiesen"
+#: ../../include/widgets.php:712
+msgid "Private Mail Menu"
+msgstr "Private Nachrichten"
-#: ../../include/text.php:1096
-msgid "happy"
-msgstr "glücklich"
+#: ../../include/widgets.php:714
+msgid "Combined View"
+msgstr "Kombinierte Anzeige"
-#: ../../include/text.php:1097
-msgid "sad"
-msgstr "traurig"
+#: ../../include/widgets.php:719 ../../include/nav.php:213
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../include/text.php:1098
-msgid "mellow"
-msgstr "sanft"
+#: ../../include/widgets.php:724 ../../include/nav.php:214
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../include/text.php:1099
-msgid "tired"
-msgstr "müde"
+#: ../../include/widgets.php:729 ../../include/nav.php:215
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../include/text.php:1100
-msgid "perky"
-msgstr "frech"
+#: ../../include/widgets.php:746 ../../include/widgets.php:758
+msgid "Conversations"
+msgstr "Konversationen"
-#: ../../include/text.php:1101
-msgid "angry"
-msgstr "sauer"
+#: ../../include/widgets.php:750
+msgid "Received Messages"
+msgstr "Erhaltene Nachrichten"
-#: ../../include/text.php:1102
-msgid "stupefied"
-msgstr "verblüfft"
+#: ../../include/widgets.php:754
+msgid "Sent Messages"
+msgstr "Gesendete Nachrichten"
-#: ../../include/text.php:1103
-msgid "puzzled"
-msgstr "verwirrt"
+#: ../../include/widgets.php:768
+msgid "No messages."
+msgstr "Keine Nachrichten."
-#: ../../include/text.php:1104
-msgid "interested"
-msgstr "interessiert"
+#: ../../include/widgets.php:786
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
-#: ../../include/text.php:1105
-msgid "bitter"
-msgstr "verbittert"
+#: ../../include/widgets.php:812
+msgid "Events Tools"
+msgstr "Kalenderwerkzeuge"
-#: ../../include/text.php:1106
-msgid "cheerful"
-msgstr "fröhlich"
+#: ../../include/widgets.php:813
+msgid "Export Calendar"
+msgstr "Kalender exportieren"
-#: ../../include/text.php:1107
-msgid "alive"
-msgstr "lebendig"
+#: ../../include/widgets.php:814
+msgid "Import Calendar"
+msgstr "Kalender importieren"
-#: ../../include/text.php:1108
-msgid "annoyed"
-msgstr "verärgert"
+#: ../../include/widgets.php:906
+msgid "Overview"
+msgstr "Ãœbersicht"
-#: ../../include/text.php:1109
-msgid "anxious"
-msgstr "unruhig"
+#: ../../include/widgets.php:913
+msgid "Chat Members"
+msgstr "Chatmitglieder"
-#: ../../include/text.php:1110
-msgid "cranky"
-msgstr "schrullig"
+#: ../../include/widgets.php:991
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Nachricht"
-#: ../../include/text.php:1111
-msgid "disturbed"
-msgstr "verstört"
+#: ../../include/widgets.php:1013
+msgid "Bookmarked Chatrooms"
+msgstr "Gespeicherte Chatrooms"
-#: ../../include/text.php:1112
-msgid "frustrated"
-msgstr "frustriert"
+#: ../../include/widgets.php:1044
+msgid "Suggested Chatrooms"
+msgstr "Chatraum-Vorschläge"
-#: ../../include/text.php:1113
-msgid "depressed"
-msgstr "deprimiert"
+#: ../../include/widgets.php:1189 ../../include/widgets.php:1301
+msgid "photo/image"
+msgstr "Foto/Bild"
-#: ../../include/text.php:1114
-msgid "motivated"
-msgstr "motiviert"
+#: ../../include/widgets.php:1244
+msgid "Click to show more"
+msgstr "Klick, um mehr anzuzeigen"
-#: ../../include/text.php:1115
-msgid "relaxed"
-msgstr "entspannt"
+#: ../../include/widgets.php:1395
+msgid "Rating Tools"
+msgstr "Bewertungswerkzeuge"
-#: ../../include/text.php:1116
-msgid "surprised"
-msgstr "überrascht"
+#: ../../include/widgets.php:1399 ../../include/widgets.php:1401
+msgid "Rate Me"
+msgstr "Bewerte mich"
-#: ../../include/text.php:1303 ../../include/js_strings.php:70
-msgid "Monday"
-msgstr "Montag"
+#: ../../include/widgets.php:1404
+msgid "View Ratings"
+msgstr "Bewertungen ansehen"
-#: ../../include/text.php:1303 ../../include/js_strings.php:71
-msgid "Tuesday"
-msgstr "Dienstag"
+#: ../../include/widgets.php:1497
+msgid "Forums"
+msgstr "Foren"
-#: ../../include/text.php:1303 ../../include/js_strings.php:72
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: ../../include/widgets.php:1526
+msgid "Tasks"
+msgstr "Aufgaben"
-#: ../../include/text.php:1303 ../../include/js_strings.php:73
-msgid "Thursday"
-msgstr "Donnerstag"
+#: ../../include/widgets.php:1592 ../../include/widgets.php:1630
+msgid "Member registrations waiting for confirmation"
+msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
-#: ../../include/text.php:1303 ../../include/js_strings.php:74
-msgid "Friday"
-msgstr "Freitag"
+#: ../../include/widgets.php:1598
+msgid "Inspect queue"
+msgstr "Warteschlange kontrollieren"
-#: ../../include/text.php:1303 ../../include/js_strings.php:75
-msgid "Saturday"
-msgstr "Samstag"
+#: ../../include/widgets.php:1600
+msgid "DB updates"
+msgstr "DB-Aktualisierungen"
-#: ../../include/text.php:1303 ../../include/js_strings.php:69
-msgid "Sunday"
-msgstr "Sonntag"
+#: ../../include/widgets.php:1625 ../../include/nav.php:233
+msgid "Admin"
+msgstr "Administration"
-#: ../../include/text.php:1307 ../../include/js_strings.php:45
-msgid "January"
-msgstr "Januar"
+#: ../../include/widgets.php:1626
+msgid "Plugin Features"
+msgstr "Plug-In Funktionen"
-#: ../../include/text.php:1307 ../../include/js_strings.php:46
-msgid "February"
-msgstr "Februar"
+#: ../../include/zot.php:652
+msgid "Invalid data packet"
+msgstr "Ungültiges Datenpaket"
-#: ../../include/text.php:1307 ../../include/js_strings.php:47
-msgid "March"
-msgstr "März"
+#: ../../include/zot.php:668
+msgid "Unable to verify channel signature"
+msgstr "Konnte die Signatur des Kanals nicht verifizieren"
-#: ../../include/text.php:1307 ../../include/js_strings.php:48
-msgid "April"
-msgstr "April"
+#: ../../include/zot.php:2319
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
-#: ../../include/text.php:1307
-msgid "May"
-msgstr "Mai"
+#: ../../include/zot.php:3725
+msgid "invalid target signature"
+msgstr "Ungültige Signatur des Ziels"
-#: ../../include/text.php:1307 ../../include/js_strings.php:50
-msgid "June"
-msgstr "Juni"
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
+msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-#: ../../include/text.php:1307 ../../include/js_strings.php:51
-msgid "July"
-msgstr "Juli"
+#: ../../include/channel.php:67
+msgid "Empty name"
+msgstr "Namensfeld leer"
-#: ../../include/text.php:1307 ../../include/js_strings.php:52
-msgid "August"
-msgstr "August"
+#: ../../include/channel.php:70
+msgid "Name too long"
+msgstr "Name ist zu lang"
-#: ../../include/text.php:1307 ../../include/js_strings.php:53
-msgid "September"
-msgstr "September"
+#: ../../include/channel.php:181
+msgid "No account identifier"
+msgstr "Keine Account-Kennung"
-#: ../../include/text.php:1307 ../../include/js_strings.php:54
-msgid "October"
-msgstr "Oktober"
+#: ../../include/channel.php:193
+msgid "Nickname is required."
+msgstr "Spitzname ist erforderlich."
-#: ../../include/text.php:1307 ../../include/js_strings.php:55
-msgid "November"
-msgstr "November"
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
+msgstr "Reservierter Kurzname. Bitte wähle einen anderen."
-#: ../../include/text.php:1307 ../../include/js_strings.php:56
-msgid "December"
-msgstr "Dezember"
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Der Spitzname enthält nicht-unterstütze Zeichen oder wird bereits auf dieser Seite genutzt."
-#: ../../include/text.php:1384 ../../include/text.php:1388
-msgid "Unknown Attachment"
-msgstr "Unbekannter Anhang"
+#: ../../include/channel.php:272
+msgid "Unable to retrieve created identity"
+msgstr "Kann die erstellte Identität nicht empfangen"
-#: ../../include/text.php:1390
-msgid "unknown"
-msgstr "unbekannt"
+#: ../../include/channel.php:344
+msgid "Default Profile"
+msgstr "Standard-Profil"
-#: ../../include/text.php:1426
-msgid "remove category"
-msgstr "Kategorie entfernen"
+#: ../../include/channel.php:1045
+msgid "Create New Profile"
+msgstr "Neues Profil erstellen"
-#: ../../include/text.php:1503
-msgid "remove from file"
-msgstr "aus der Datei entfernen"
+#: ../../include/channel.php:1065
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../include/text.php:1770 ../../include/language.php:367
-msgid "default"
-msgstr "Standard"
+#: ../../include/channel.php:1138 ../../include/channel.php:1257
+msgid "Gender:"
+msgstr "Geschlecht:"
-#: ../../include/text.php:1778
-msgid "Page layout"
-msgstr "Seiten-Layout"
+#: ../../include/channel.php:1140 ../../include/channel.php:1312
+msgid "Homepage:"
+msgstr "Homepage:"
-#: ../../include/text.php:1778
-msgid "You can create your own with the layouts tool"
-msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
+#: ../../include/channel.php:1141
+msgid "Online Now"
+msgstr "gerade online"
-#: ../../include/text.php:1820
-msgid "Page content type"
-msgstr "Art des Seiteninhalts"
+#: ../../include/channel.php:1262
+msgid "Like this channel"
+msgstr "Dieser Kanal gefällt mir"
-#: ../../include/text.php:1953
-msgid "activity"
-msgstr "Aktivität"
+#: ../../include/channel.php:1286
+msgid "j F, Y"
+msgstr "j. F Y"
-#: ../../include/text.php:2267
-msgid "Design Tools"
-msgstr "Gestaltungswerkzeuge"
+#: ../../include/channel.php:1287
+msgid "j F"
+msgstr "j. F"
-#: ../../include/text.php:2273
-msgid "Pages"
-msgstr "Seiten"
+#: ../../include/channel.php:1294
+msgid "Birthday:"
+msgstr "Geburtstag:"
-#: ../../include/text.php:2295
-msgid "Import website..."
-msgstr "Webseite importieren..."
+#: ../../include/channel.php:1307
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "seit %1$d %2$s"
-#: ../../include/text.php:2296
-msgid "Select folder to import"
-msgstr "Ordner zum Importieren auswählen"
+#: ../../include/channel.php:1310
+msgid "Sexual Preference:"
+msgstr "Sexuelle Orientierung:"
-#: ../../include/text.php:2297
-msgid "Import from a zipped folder:"
-msgstr "Aus einem gezippten Ordner importieren:"
+#: ../../include/channel.php:1316
+msgid "Tags:"
+msgstr "Schlagworte:"
-#: ../../include/text.php:2298
-msgid "Import from cloud files:"
-msgstr "Aus Cloud-Dateien importieren:"
+#: ../../include/channel.php:1318
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
-#: ../../include/text.php:2299
-msgid "/cloud/channel/path/to/folder"
-msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
+#: ../../include/channel.php:1320
+msgid "Religion:"
+msgstr "Religion:"
-#: ../../include/text.php:2300
-msgid "Enter path to website files"
-msgstr "Pfad zu Webseitendateien eingeben"
+#: ../../include/channel.php:1324
+msgid "Hobbies/Interests:"
+msgstr "Hobbys/Interessen:"
-#: ../../include/text.php:2301
-msgid "Select folder"
-msgstr "Ordner auswählen"
+#: ../../include/channel.php:1326
+msgid "Likes:"
+msgstr "Gefällt:"
-#: ../../include/text.php:2302
-msgid "Export website..."
-msgstr "Webseite exportieren..."
+#: ../../include/channel.php:1328
+msgid "Dislikes:"
+msgstr "Gefällt nicht:"
-#: ../../include/text.php:2303
-msgid "Export to a zip file"
-msgstr "In eine ZIP-Datei exportieren"
+#: ../../include/channel.php:1330
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../include/text.php:2304
-msgid "website.zip"
-msgstr "website.zip"
+#: ../../include/channel.php:1332
+msgid "My other channels:"
+msgstr "Meine anderen Kanäle:"
-#: ../../include/text.php:2305
-msgid "Enter a name for the zip file."
-msgstr "Geben Sie einen für die ZIP-Datei ein."
+#: ../../include/channel.php:1334
+msgid "Musical interests:"
+msgstr "Musikalische Interessen:"
-#: ../../include/text.php:2306
-msgid "Export to cloud files"
-msgstr "In Cloud-Dateien exportieren"
+#: ../../include/channel.php:1336
+msgid "Books, literature:"
+msgstr "Bücher, Literatur:"
-#: ../../include/text.php:2307
-msgid "/path/to/export/folder"
-msgstr "/Pfad/zum/exportierenden/Ordner"
+#: ../../include/channel.php:1338
+msgid "Television:"
+msgstr "Fernsehen:"
-#: ../../include/text.php:2308
-msgid "Enter a path to a cloud files destination."
-msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
+#: ../../include/channel.php:1340
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../include/text.php:2309
-msgid "Specify folder"
-msgstr "Ordner angeben"
+#: ../../include/channel.php:1342
+msgid "Love/Romance:"
+msgstr "Liebe/Romantik:"
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "%1$ss Lesezeichen"
+#: ../../include/channel.php:1344
+msgid "Work/employment:"
+msgstr "Arbeit/Anstellung:"
-#: ../../include/wiki.php:545 ../../include/bbcode.php:552
-#: ../../include/bbcode.php:683
-msgid "Different viewers will see this text differently"
-msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
+#: ../../include/channel.php:1346
+msgid "School/education:"
+msgstr "Schule/Ausbildung:"
-#: ../../include/help.php:31
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../include/channel.php:1369
+msgid "Like this thing"
+msgstr "Gefällt mir"
#: ../../include/page_widgets.php:7
msgid "New Page"
@@ -11878,17 +12054,6 @@ msgstr "Lade Freunde ein"
msgid "Advanced example: name=fred and country=iceland"
msgstr "Fortgeschrittenes Beispiel: name=fred and country=iceland"
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-msgid "Everything"
-msgstr "Alles"
-
-#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
-#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
-#: ../../include/widgets.php:465
-msgid "Categories"
-msgstr "Kategorien"
-
#: ../../include/contact_widgets.php:122
#, php-format
msgid "%d connection in common"
@@ -12040,11 +12205,55 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
+#: ../../include/js_strings.php:45 ../../include/text.php:1325
+msgid "January"
+msgstr "Januar"
+
+#: ../../include/js_strings.php:46 ../../include/text.php:1325
+msgid "February"
+msgstr "Februar"
+
+#: ../../include/js_strings.php:47 ../../include/text.php:1325
+msgid "March"
+msgstr "März"
+
+#: ../../include/js_strings.php:48 ../../include/text.php:1325
+msgid "April"
+msgstr "April"
+
#: ../../include/js_strings.php:49
msgctxt "long"
msgid "May"
msgstr "Mai"
+#: ../../include/js_strings.php:50 ../../include/text.php:1325
+msgid "June"
+msgstr "Juni"
+
+#: ../../include/js_strings.php:51 ../../include/text.php:1325
+msgid "July"
+msgstr "Juli"
+
+#: ../../include/js_strings.php:52 ../../include/text.php:1325
+msgid "August"
+msgstr "August"
+
+#: ../../include/js_strings.php:53 ../../include/text.php:1325
+msgid "September"
+msgstr "September"
+
+#: ../../include/js_strings.php:54 ../../include/text.php:1325
+msgid "October"
+msgstr "Oktober"
+
+#: ../../include/js_strings.php:55 ../../include/text.php:1325
+msgid "November"
+msgstr "November"
+
+#: ../../include/js_strings.php:56 ../../include/text.php:1325
+msgid "December"
+msgstr "Dezember"
+
#: ../../include/js_strings.php:57
msgid "Jan"
msgstr "Jan"
@@ -12094,6 +12303,34 @@ msgstr "Nov"
msgid "Dec"
msgstr "Dez"
+#: ../../include/js_strings.php:69 ../../include/text.php:1321
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: ../../include/js_strings.php:70 ../../include/text.php:1321
+msgid "Monday"
+msgstr "Montag"
+
+#: ../../include/js_strings.php:71 ../../include/text.php:1321
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: ../../include/js_strings.php:72 ../../include/text.php:1321
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: ../../include/js_strings.php:73 ../../include/text.php:1321
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: ../../include/js_strings.php:74 ../../include/text.php:1321
+msgid "Friday"
+msgstr "Freitag"
+
+#: ../../include/js_strings.php:75 ../../include/text.php:1321
+msgid "Saturday"
+msgstr "Samstag"
+
#: ../../include/js_strings.php:76
msgid "Sun"
msgstr "So"
@@ -12147,683 +12384,823 @@ msgctxt "calendar"
msgid "All day"
msgstr "Ganztägig"
-#: ../../include/network.php:729
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Verzeichnisoptionen"
+
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Sicherer Modus"
+
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Nur öffentliche Foren"
+
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Nur dieser Hub"
+
+#: ../../include/attach.php:250 ../../include/attach.php:338
+msgid "Item was not found."
+msgstr "Beitrag wurde nicht gefunden."
+
+#: ../../include/attach.php:499
+msgid "No source file."
+msgstr "Keine Quelldatei."
+
+#: ../../include/attach.php:521
+msgid "Cannot locate file to replace"
+msgstr "Kann Datei zum Ersetzen nicht finden"
+
+#: ../../include/attach.php:539
+msgid "Cannot locate file to revise/update"
+msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
+
+#: ../../include/attach.php:670
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Datei überschreitet das Größen-Limit von %d"
+
+#: ../../include/attach.php:684
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
+
+#: ../../include/attach.php:854
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
+
+#: ../../include/attach.php:867
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
+
+#: ../../include/attach.php:922 ../../include/attach.php:938
+msgid "Path not available."
+msgstr "Pfad nicht verfügbar."
+
+#: ../../include/attach.php:984 ../../include/attach.php:1142
+msgid "Empty pathname"
+msgstr "Leere Pfadangabe"
+
+#: ../../include/attach.php:1010
+msgid "duplicate filename or path"
+msgstr "doppelter Dateiname oder Pfad"
+
+#: ../../include/attach.php:1032
+msgid "Path not found."
+msgstr "Pfad nicht gefunden."
+
+#: ../../include/attach.php:1096
+msgid "mkdir failed."
+msgstr "mkdir fehlgeschlagen."
+
+#: ../../include/attach.php:1100
+msgid "database storage failed."
+msgstr "Speichern in der Datenbank fehlgeschlagen."
+
+#: ../../include/attach.php:1148
+msgid "Empty path"
+msgstr "Leere Pfadangabe"
+
+#: ../../include/network.php:733
msgid "view full size"
msgstr "In Vollbildansicht anschauen"
-#: ../../include/network.php:1978
+#: ../../include/network.php:1988
msgid "No Subject"
msgstr "Kein Betreff"
-#: ../../include/network.php:2234
+#: ../../include/network.php:2244
msgid "OStatus"
msgstr "OStatus"
-#: ../../include/network.php:2235
+#: ../../include/network.php:2245
msgid "GNU-Social"
msgstr "GNU-Social"
-#: ../../include/network.php:2236
+#: ../../include/network.php:2246
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/network.php:2239
+#: ../../include/network.php:2249
msgid "Facebook"
msgstr "Facebook"
-#: ../../include/network.php:2240
+#: ../../include/network.php:2250
msgid "Zot"
msgstr "Zot!"
-#: ../../include/network.php:2241
+#: ../../include/network.php:2251
msgid "LinkedIn"
msgstr "LinkedIn"
-#: ../../include/network.php:2242
+#: ../../include/network.php:2252
msgid "XMPP/IM"
msgstr "XMPP/IM"
-#: ../../include/network.php:2243
+#: ../../include/network.php:2253
msgid "MySpace"
msgstr "MySpace"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Schlagwörter"
+#: ../../include/oembed.php:308
+msgid " by "
+msgstr "von"
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Schlüsselwörter"
+#: ../../include/oembed.php:309
+msgid " on "
+msgstr "am"
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "habe"
+#: ../../include/oembed.php:338
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "hat"
+#: ../../include/oembed.php:347
+msgid "Embedding disabled"
+msgstr "Einbetten deaktiviert"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "will"
+#: ../../include/photos.php:115
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "will"
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "gefällt"
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
+msgstr "Fotospeicherung fehlgeschlagen."
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "missfällt"
+#: ../../include/photos.php:300
+msgid "a new photo"
+msgstr "ein neues Foto"
-#: ../../include/import.php:30
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
+#: ../../include/photos.php:304
+#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
+#: ../../include/photos.php:519
+msgid "Upload New Photos"
+msgstr "Neue Fotos hochladen"
-#: ../../include/import.php:1354
-msgid "Unable to import element \""
-msgstr "Element konnte nicht importiert werden."
+#: ../../include/text.php:460
+msgid "prev"
+msgstr "vorherige"
-#: ../../include/security.php:117
-msgid "guest:"
-msgstr "Gast:"
+#: ../../include/text.php:462
+msgid "first"
+msgstr "erste"
-#: ../../include/security.php:535
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
+#: ../../include/text.php:491
+msgid "last"
+msgstr "letzte"
-#: ../../include/zot.php:662
-msgid "Invalid data packet"
-msgstr "Ungültiges Datenpaket"
+#: ../../include/text.php:494
+msgid "next"
+msgstr "nächste"
-#: ../../include/zot.php:678
-msgid "Unable to verify channel signature"
-msgstr "Konnte die Signatur des Kanals nicht verifizieren"
+#: ../../include/text.php:505
+msgid "older"
+msgstr "älter"
+
+#: ../../include/text.php:507
+msgid "newer"
+msgstr "neuer"
-#: ../../include/zot.php:2320
+#: ../../include/text.php:922
+msgid "No connections"
+msgstr "Keine Verbindungen"
+
+#: ../../include/text.php:947
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
+msgid "View all %s connections"
+msgstr "Alle Verbindungen von %s anzeigen"
-#: ../../include/zot.php:3718
-msgid "invalid target signature"
-msgstr "Ungültige Signatur des Ziels"
+#: ../../include/text.php:1092 ../../include/text.php:1097
+msgid "poke"
+msgstr "anstupsen"
-#: ../../include/items.php:837 ../../include/items.php:882
-msgid "(Unknown)"
-msgstr "(Unbekannt)"
+#: ../../include/text.php:1098
+msgid "ping"
+msgstr "anpingen"
-#: ../../include/items.php:1080
-msgid "Visible to anybody on the internet."
-msgstr "Für jeden im Internet sichtbar."
+#: ../../include/text.php:1098
+msgid "pinged"
+msgstr "pingte"
-#: ../../include/items.php:1082
-msgid "Visible to you only."
-msgstr "Nur für Dich sichtbar."
+#: ../../include/text.php:1099
+msgid "prod"
+msgstr "knuffen"
-#: ../../include/items.php:1084
-msgid "Visible to anybody in this network."
-msgstr "Für jedes $Projectname-Mitglied sichtbar."
+#: ../../include/text.php:1099
+msgid "prodded"
+msgstr "knuffte"
-#: ../../include/items.php:1086
-msgid "Visible to anybody authenticated."
-msgstr "Für jeden sichtbar, der angemeldet ist."
+#: ../../include/text.php:1100
+msgid "slap"
+msgstr "ohrfeigen"
-#: ../../include/items.php:1088
-#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Für jeden auf %s sichtbar."
+#: ../../include/text.php:1100
+msgid "slapped"
+msgstr "ohrfeigte"
-#: ../../include/items.php:1090
-msgid "Visible to all connections."
-msgstr "Für alle Verbindungen sichtbar."
+#: ../../include/text.php:1101
+msgid "finger"
+msgstr "befummeln"
-#: ../../include/items.php:1092
-msgid "Visible to approved connections."
-msgstr "Nur für akzeptierte Verbindungen sichtbar."
+#: ../../include/text.php:1101
+msgid "fingered"
+msgstr "befummelte"
-#: ../../include/items.php:1094
-msgid "Visible to specific connections."
-msgstr "Sichtbar für bestimmte Verbindungen."
+#: ../../include/text.php:1102
+msgid "rebuff"
+msgstr "eine Abfuhr erteilen"
-#: ../../include/items.php:3892
-msgid "Privacy group is empty."
-msgstr "Gruppe ist leer."
+#: ../../include/text.php:1102
+msgid "rebuffed"
+msgstr "zurückgewiesen"
-#: ../../include/items.php:3899
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Gruppe: %s"
+#: ../../include/text.php:1114
+msgid "happy"
+msgstr "glücklich"
-#: ../../include/items.php:3911
-msgid "Connection not found."
-msgstr "Die Verbindung wurde nicht gefunden."
+#: ../../include/text.php:1115
+msgid "sad"
+msgstr "traurig"
-#: ../../include/items.php:4260
-msgid "profile photo"
-msgstr "Profilfoto"
+#: ../../include/text.php:1116
+msgid "mellow"
+msgstr "sanft"
-#: ../../include/items.php:4456
-#, php-format
-msgid "[Edited %s]"
-msgstr "[%s wurde bearbeitet]"
+#: ../../include/text.php:1117
+msgid "tired"
+msgstr "müde"
-#: ../../include/items.php:4456
-msgctxt "edit_activity"
-msgid "Post"
-msgstr "Beitrag"
+#: ../../include/text.php:1118
+msgid "perky"
+msgstr "frech"
-#: ../../include/items.php:4456
-msgctxt "edit_activity"
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../include/text.php:1119
+msgid "angry"
+msgstr "sauer"
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Ausgeloggt."
+#: ../../include/text.php:1120
+msgid "stupefied"
+msgstr "verblüfft"
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Authentifizierung fehlgeschlagen"
+#: ../../include/text.php:1121
+msgid "puzzled"
+msgstr "verwirrt"
-#: ../../include/activities.php:41
-msgid " and "
-msgstr "und"
+#: ../../include/text.php:1122
+msgid "interested"
+msgstr "interessiert"
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "öffentliches Profil"
+#: ../../include/text.php:1123
+msgid "bitter"
+msgstr "verbittert"
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
+#: ../../include/text.php:1124
+msgid "cheerful"
+msgstr "fröhlich"
-#: ../../include/activities.php:59
-#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Besuche %1$s's %2$s"
+#: ../../include/text.php:1125
+msgid "alive"
+msgstr "lebendig"
-#: ../../include/activities.php:62
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
+#: ../../include/text.php:1126
+msgid "annoyed"
+msgstr "verärgert"
-#: ../../include/attach.php:248 ../../include/attach.php:336
-msgid "Item was not found."
-msgstr "Beitrag wurde nicht gefunden."
+#: ../../include/text.php:1127
+msgid "anxious"
+msgstr "unruhig"
-#: ../../include/attach.php:497
-msgid "No source file."
-msgstr "Keine Quelldatei."
+#: ../../include/text.php:1128
+msgid "cranky"
+msgstr "schrullig"
-#: ../../include/attach.php:519
-msgid "Cannot locate file to replace"
-msgstr "Kann Datei zum Ersetzen nicht finden"
+#: ../../include/text.php:1129
+msgid "disturbed"
+msgstr "verstört"
-#: ../../include/attach.php:537
-msgid "Cannot locate file to revise/update"
-msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
+#: ../../include/text.php:1130
+msgid "frustrated"
+msgstr "frustriert"
-#: ../../include/attach.php:668
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Datei überschreitet das Größen-Limit von %d"
+#: ../../include/text.php:1131
+msgid "depressed"
+msgstr "deprimiert"
-#: ../../include/attach.php:682
-#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
+#: ../../include/text.php:1132
+msgid "motivated"
+msgstr "motiviert"
-#: ../../include/attach.php:852
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
+#: ../../include/text.php:1133
+msgid "relaxed"
+msgstr "entspannt"
-#: ../../include/attach.php:865
-msgid "Stored file could not be verified. Upload failed."
-msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
+#: ../../include/text.php:1134
+msgid "surprised"
+msgstr "überrascht"
-#: ../../include/attach.php:920 ../../include/attach.php:936
-msgid "Path not available."
-msgstr "Pfad nicht verfügbar."
+#: ../../include/text.php:1325
+msgid "May"
+msgstr "Mai"
-#: ../../include/attach.php:982 ../../include/attach.php:1140
-msgid "Empty pathname"
-msgstr "Leere Pfadangabe"
+#: ../../include/text.php:1402 ../../include/text.php:1406
+msgid "Unknown Attachment"
+msgstr "Unbekannter Anhang"
-#: ../../include/attach.php:1008
-msgid "duplicate filename or path"
-msgstr "doppelter Dateiname oder Pfad"
+#: ../../include/text.php:1408
+msgid "unknown"
+msgstr "unbekannt"
-#: ../../include/attach.php:1030
-msgid "Path not found."
-msgstr "Pfad nicht gefunden."
+#: ../../include/text.php:1444
+msgid "remove category"
+msgstr "Kategorie entfernen"
-#: ../../include/attach.php:1094
-msgid "mkdir failed."
-msgstr "mkdir fehlgeschlagen."
+#: ../../include/text.php:1521
+msgid "remove from file"
+msgstr "aus der Datei entfernen"
-#: ../../include/attach.php:1098
-msgid "database storage failed."
-msgstr "Speichern in der Datenbank fehlgeschlagen."
+#: ../../include/text.php:1791
+msgid "Page layout"
+msgstr "Seiten-Layout"
-#: ../../include/attach.php:1146
-msgid "Empty path"
-msgstr "Leere Pfadangabe"
+#: ../../include/text.php:1791
+msgid "You can create your own with the layouts tool"
+msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
-#: ../../include/event.php:22 ../../include/event.php:69
-#: ../../include/bb2diaspora.php:498
-msgid "l F d, Y \\@ g:i A"
-msgstr "l, d. F Y, H:i"
+#: ../../include/text.php:1833
+msgid "Page content type"
+msgstr "Art des Seiteninhalts"
-#: ../../include/event.php:30 ../../include/event.php:73
-#: ../../include/bb2diaspora.php:504
-msgid "Starts:"
-msgstr "Beginnt:"
+#: ../../include/text.php:1966
+msgid "activity"
+msgstr "Aktivität"
-#: ../../include/event.php:40 ../../include/event.php:77
-#: ../../include/bb2diaspora.php:512
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../include/text.php:2280
+msgid "Design Tools"
+msgstr "Gestaltungswerkzeuge"
-#: ../../include/event.php:824
-msgid "This event has been added to your calendar."
-msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
+#: ../../include/text.php:2286
+msgid "Pages"
+msgstr "Seiten"
-#: ../../include/event.php:1024
-msgid "Not specified"
-msgstr "Keine Angabe"
+#: ../../include/text.php:2308
+msgid "Import website..."
+msgstr "Webseite importieren..."
-#: ../../include/event.php:1025
-msgid "Needs Action"
-msgstr "Aktion erforderlich"
+#: ../../include/text.php:2309
+msgid "Select folder to import"
+msgstr "Ordner zum Importieren auswählen"
-#: ../../include/event.php:1026
-msgid "Completed"
-msgstr "Abgeschlossen"
+#: ../../include/text.php:2310
+msgid "Import from a zipped folder:"
+msgstr "Aus einem gezippten Ordner importieren:"
-#: ../../include/event.php:1027
-msgid "In Process"
-msgstr "In Bearbeitung"
+#: ../../include/text.php:2311
+msgid "Import from cloud files:"
+msgstr "Aus Cloud-Dateien importieren:"
-#: ../../include/event.php:1028
-msgid "Cancelled"
-msgstr "gestrichen"
+#: ../../include/text.php:2312
+msgid "/cloud/channel/path/to/folder"
+msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
-msgstr "Der Kanal ist auf dieser Seite blockiert "
+#: ../../include/text.php:2313
+msgid "Enter path to website files"
+msgstr "Pfad zu Webseitendateien eingeben"
-#: ../../include/follow.php:32
-msgid "Channel location missing."
-msgstr "Adresse des Kanals fehlt."
+#: ../../include/text.php:2314
+msgid "Select folder"
+msgstr "Ordner auswählen"
-#: ../../include/follow.php:80
-msgid "Response from remote channel was incomplete."
-msgstr "Antwort des entfernten Kanals war unvollständig."
+#: ../../include/text.php:2315
+msgid "Export website..."
+msgstr "Webseite exportieren..."
-#: ../../include/follow.php:97
-msgid "Channel was deleted and no longer exists."
-msgstr "Kanal wurde gelöscht und existiert nicht mehr."
+#: ../../include/text.php:2316
+msgid "Export to a zip file"
+msgstr "In eine ZIP-Datei exportieren"
-#: ../../include/follow.php:147 ../../include/follow.php:183
-msgid "Protocol disabled."
-msgstr "Protokoll deaktiviert."
+#: ../../include/text.php:2317
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/follow.php:171
-msgid "Channel discovery failed."
-msgstr "Kanalsuche fehlgeschlagen"
+#: ../../include/text.php:2318
+msgid "Enter a name for the zip file."
+msgstr "Geben Sie einen für die ZIP-Datei ein."
-#: ../../include/follow.php:210
-msgid "Cannot connect to yourself."
-msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
+#: ../../include/text.php:2319
+msgid "Export to cloud files"
+msgstr "In Cloud-Dateien exportieren"
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
+#: ../../include/text.php:2320
+msgid "/path/to/export/folder"
+msgstr "/Pfad/zum/exportierenden/Ordner"
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
+#: ../../include/text.php:2321
+msgid "Enter a path to a cloud files destination."
+msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "Bearbeiten"
+#: ../../include/text.php:2322
+msgid "Specify folder"
+msgstr "Ordner angeben"
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Gruppe ändern"
+#: ../../include/nav.php:88
+msgid "Remote authentication"
+msgstr "Ãœber Konto auf anderem Server einloggen"
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Gruppe hinzufügen"
+#: ../../include/nav.php:88
+msgid "Click to authenticate to your home hub"
+msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Kanäle, die in keiner Gruppe sind"
+#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1731
+msgid "Logout"
+msgstr "Abmelden"
-#: ../../include/group.php:316 ../../include/widgets.php:284
-msgid "add"
-msgstr "hinzufügen"
+#: ../../include/nav.php:99 ../../include/nav.php:140
+msgid "End this session"
+msgstr "Beende diese Sitzung"
-#: ../../include/language.php:380
-msgid "Select an alternate language"
-msgstr "Wähle eine alternative Sprache"
+#: ../../include/nav.php:103
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
+#: ../../include/nav.php:105
+msgid "Manage/Edit profiles"
+msgstr "Profile verwalten"
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../include/nav.php:107
+msgid "Edit your profile"
+msgstr "Profil bearbeiten"
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr "Fotospeicherung fehlgeschlagen."
+#: ../../include/nav.php:130
+msgid "Sign in"
+msgstr "Anmelden"
-#: ../../include/photos.php:300
-msgid "a new photo"
-msgstr "ein neues Foto"
+#: ../../include/nav.php:155
+msgid "Get me home"
+msgstr "Bringe mich nach Hause (eigener Kanal)"
-#: ../../include/photos.php:304
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
+#: ../../include/nav.php:157
+msgid "Log me out of this site"
+msgstr "Logge mich von dieser Seite aus"
-#: ../../include/photos.php:507 ../../include/conversation.php:1695
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: ../../include/nav.php:162
+msgid "Create an account"
+msgstr "Erzeuge ein Konto"
-#: ../../include/photos.php:511
-msgid "Upload New Photos"
-msgstr "Neue Fotos hochladen"
+#: ../../include/nav.php:174
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
-#: ../../include/widgets.php:103
-msgid "System"
-msgstr "System"
+#: ../../include/nav.php:178
+msgid "Applications, utilities, links, games"
+msgstr "Anwendungen (Apps), Zubehör, Links, Spiele"
-#: ../../include/widgets.php:106
-msgid "New App"
-msgstr "Neue App"
+#: ../../include/nav.php:180
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/widgets.php:154
-msgid "Suggestions"
-msgstr "Vorschläge"
+#: ../../include/nav.php:182
+msgid "Channel Directory"
+msgstr "Kanal-Verzeichnis"
-#: ../../include/widgets.php:155
-msgid "See more..."
-msgstr "Mehr anzeigen …"
+#: ../../include/nav.php:194
+msgid "Your grid"
+msgstr "Dein Grid"
-#: ../../include/widgets.php:175
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen."
+#: ../../include/nav.php:195
+msgid "View your network/grid"
+msgstr "Zeige Dein Netzwerk/Grid an"
-#: ../../include/widgets.php:181
-msgid "Add New Connection"
-msgstr "Neue Verbindung hinzufügen"
+#: ../../include/nav.php:196
+msgid "Mark all grid notifications seen"
+msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
-#: ../../include/widgets.php:182
-msgid "Enter channel address"
-msgstr "Adresse des Kanals eingeben"
+#: ../../include/nav.php:198
+msgid "Channel home"
+msgstr "Mein Kanal"
-#: ../../include/widgets.php:183
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Beispiele: bob@beispiel.com, http://beispiel.com/barbara"
+#: ../../include/nav.php:199
+msgid "View your channel home"
+msgstr "Zeige Deine Kanalseite an"
-#: ../../include/widgets.php:199
-msgid "Notes"
-msgstr "Notizen"
+#: ../../include/nav.php:200
+msgid "Mark all channel notifications seen"
+msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
-#: ../../include/widgets.php:275
-msgid "Remove term"
-msgstr "Eintrag löschen"
+#: ../../include/nav.php:206
+msgid "Notices"
+msgstr "Benachrichtigungen"
-#: ../../include/widgets.php:390
-msgid "Archives"
-msgstr "Archive"
+#: ../../include/nav.php:206
+msgid "Notifications"
+msgstr "Benachrichtigungen"
-#: ../../include/widgets.php:552
-msgid "Refresh"
-msgstr "Aktualisieren"
+#: ../../include/nav.php:207
+msgid "View all notifications"
+msgstr "Alle Benachrichtigungen ansehen"
-#: ../../include/widgets.php:592
-msgid "Account settings"
-msgstr "Konto-Einstellungen"
+#: ../../include/nav.php:210
+msgid "Private mail"
+msgstr "Persönliche Mail"
-#: ../../include/widgets.php:598
-msgid "Channel settings"
-msgstr "Kanal-Einstellungen"
+#: ../../include/nav.php:211
+msgid "View your private messages"
+msgstr "Zeige Deine persönlichen Nachrichten an"
-#: ../../include/widgets.php:607
-msgid "Additional features"
-msgstr "Zusätzliche Funktionen"
+#: ../../include/nav.php:212
+msgid "Mark all private messages seen"
+msgstr "Markiere alle persönlichen Nachrichten als gesehen"
-#: ../../include/widgets.php:614
-msgid "Feature/Addon settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/nav.php:218
+msgid "Event Calendar"
+msgstr "Terminkalender"
-#: ../../include/widgets.php:620
-msgid "Display settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/nav.php:219
+msgid "View events"
+msgstr "Termine ansehen"
-#: ../../include/widgets.php:627
-msgid "Manage locations"
-msgstr "Klon-Adressen verwalten"
+#: ../../include/nav.php:220
+msgid "Mark all events seen"
+msgstr "Markiere alle Termine als gesehen"
-#: ../../include/widgets.php:634
-msgid "Export channel"
-msgstr "Kanal exportieren"
+#: ../../include/nav.php:223
+msgid "Manage Your Channels"
+msgstr "Verwalte Deine Kanäle"
-#: ../../include/widgets.php:640
-msgid "Connected apps"
-msgstr "Verbundene Apps"
+#: ../../include/nav.php:225
+msgid "Account/Channel Settings"
+msgstr "Konto-/Kanal-Einstellungen"
-#: ../../include/widgets.php:664
-msgid "Premium Channel Settings"
-msgstr "Premium-Kanal-Einstellungen"
+#: ../../include/nav.php:233
+msgid "Site Setup and Configuration"
+msgstr "Seiten-Einrichtung und -Konfiguration"
-#: ../../include/widgets.php:693
-msgid "Private Mail Menu"
-msgstr "Private Nachrichten"
+#: ../../include/nav.php:288
+msgid "Documentation"
+msgstr "Dokumentation"
-#: ../../include/widgets.php:695
-msgid "Combined View"
-msgstr "Kombinierte Anzeige"
+#: ../../include/nav.php:297
+msgid "@name, #tag, ?doc, content"
+msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/widgets.php:727 ../../include/widgets.php:739
-msgid "Conversations"
-msgstr "Konversationen"
+#: ../../include/nav.php:298
+msgid "Please wait..."
+msgstr "Bitte warten..."
-#: ../../include/widgets.php:731
-msgid "Received Messages"
-msgstr "Erhaltene Nachrichten"
+#: ../../include/import.php:30
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen."
-#: ../../include/widgets.php:735
-msgid "Sent Messages"
-msgstr "Gesendete Nachrichten"
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
+msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
-#: ../../include/widgets.php:749
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-#: ../../include/widgets.php:767
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: ../../include/import.php:1373
+msgid "Unable to import element \""
+msgstr "Element konnte nicht importiert werden."
-#: ../../include/widgets.php:793
-msgid "Events Tools"
-msgstr "Kalenderwerkzeuge"
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Ausgeloggt."
-#: ../../include/widgets.php:794
-msgid "Export Calendar"
-msgstr "Kalender exportieren"
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Authentifizierung fehlgeschlagen"
-#: ../../include/widgets.php:795
-msgid "Import Calendar"
-msgstr "Kalender importieren"
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "Der Kanal ist auf dieser Seite blockiert "
-#: ../../include/widgets.php:883 ../../include/conversation.php:1722
-#: ../../include/conversation.php:1725
-msgid "Chatrooms"
-msgstr "Chaträume"
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Adresse des Kanals fehlt."
-#: ../../include/widgets.php:887
-msgid "Overview"
-msgstr "Ãœbersicht"
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "Antwort des entfernten Kanals war unvollständig."
-#: ../../include/widgets.php:894
-msgid "Chat Members"
-msgstr "Chatmitglieder"
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanal wurde gelöscht und existiert nicht mehr."
-#: ../../include/widgets.php:960
-msgid "Wiki List"
-msgstr "Wikiliste"
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protokoll deaktiviert."
-#: ../../include/widgets.php:968
-msgid "Create new wiki"
-msgstr "Neues Wiki erstellen"
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "Kanalsuche fehlgeschlagen"
-#: ../../include/widgets.php:978
-msgid "Send notification"
-msgstr "Benachrichtigung senden"
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
-#: ../../include/widgets.php:1014
-msgid "Wiki Pages"
-msgstr "Wikiseiten"
+#: ../../include/activities.php:41
+msgid " and "
+msgstr "und"
-#: ../../include/widgets.php:1019
-msgid "Add new page"
-msgstr "Neue Seite hinzufügen"
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "öffentliches Profil"
-#: ../../include/widgets.php:1020
-msgid "Page name"
-msgstr "Seitenname"
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
-#: ../../include/widgets.php:1052
-msgid "Bookmarked Chatrooms"
-msgstr "Gespeicherte Chatrooms"
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besuche %1$s's %2$s"
-#: ../../include/widgets.php:1083
-msgid "Suggested Chatrooms"
-msgstr "Chatraum-Vorschläge"
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
-#: ../../include/widgets.php:1228 ../../include/widgets.php:1340
-msgid "photo/image"
-msgstr "Foto/Bild"
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
+#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
+#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
+#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
+#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
+#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
+#: ../../include/bbcode.php:1079
+msgid "Image/photo"
+msgstr "Bild/Foto"
-#: ../../include/widgets.php:1283
-msgid "Click to show more"
-msgstr "Klick, um mehr anzuzeigen"
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+msgid "Encrypted content"
+msgstr "Verschlüsselter Inhalt"
-#: ../../include/widgets.php:1434
-msgid "Rating Tools"
-msgstr "Bewertungswerkzeuge"
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Element %s installieren: "
-#: ../../include/widgets.php:1438 ../../include/widgets.php:1440
-msgid "Rate Me"
-msgstr "Bewerte mich"
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."
-#: ../../include/widgets.php:1443
-msgid "View Ratings"
-msgstr "Bewertungen ansehen"
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schrieb den folgenden %2$s %3$s"
-#: ../../include/widgets.php:1536
-msgid "Forums"
-msgstr "Foren"
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Klicke zum Öffnen/Schließen"
-#: ../../include/widgets.php:1565
-msgid "Tasks"
-msgstr "Aufgaben"
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "Spoiler"
-#: ../../include/widgets.php:1576
-msgid "Documentation"
-msgstr "Dokumentation"
+#: ../../include/bbcode.php:1028
+msgid "$1 wrote:"
+msgstr "$1 schrieb:"
-#: ../../include/widgets.php:1632 ../../include/widgets.php:1670
-msgid "Member registrations waiting for confirmation"
-msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "%1$ss Lesezeichen"
-#: ../../include/widgets.php:1638
-msgid "Inspect queue"
-msgstr "Warteschlange kontrollieren"
+#: ../../include/group.php:26
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen."
-#: ../../include/widgets.php:1640
-msgid "DB updates"
-msgstr "DB-Aktualisierungen"
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
-#: ../../include/widgets.php:1666
-msgid "Plugin Features"
-msgstr "Plug-In Funktionen"
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "Bearbeiten"
-#: ../../include/acl_selectors.php:198
-msgid "Who can see this?"
-msgstr "Wer kann das sehen?"
+#: ../../include/group.php:331 ../../include/features.php:292
+msgid "Privacy Groups"
+msgstr "Gruppen"
-#: ../../include/acl_selectors.php:199
-msgid "Custom selection"
-msgstr "Benutzerdefinierte Auswahl"
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Gruppe ändern"
-#: ../../include/acl_selectors.php:200
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen."
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Gruppe hinzufügen"
-#: ../../include/acl_selectors.php:201
-msgid "Show"
-msgstr "Anzeigen"
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Kanäle, die in keiner Gruppe sind"
-#: ../../include/acl_selectors.php:202
-msgid "Don't show"
-msgstr "Nicht anzeigen"
+#: ../../include/event.php:863
+msgid "This event has been added to your calendar."
+msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
+
+#: ../../include/event.php:1063
+msgid "Not specified"
+msgstr "Keine Angabe"
-#: ../../include/acl_selectors.php:235
+#: ../../include/event.php:1064
+msgid "Needs Action"
+msgstr "Aktion erforderlich"
+
+#: ../../include/event.php:1065
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+#: ../../include/event.php:1066
+msgid "In Process"
+msgstr "In Bearbeitung"
+
+#: ../../include/event.php:1067
+msgid "Cancelled"
+msgstr "gestrichen"
+
+#: ../../include/items.php:841 ../../include/items.php:888
+msgid "(Unknown)"
+msgstr "(Unbekannt)"
+
+#: ../../include/items.php:1089
+msgid "Visible to anybody on the internet."
+msgstr "Für jeden im Internet sichtbar."
+
+#: ../../include/items.php:1091
+msgid "Visible to you only."
+msgstr "Nur für Dich sichtbar."
+
+#: ../../include/items.php:1093
+msgid "Visible to anybody in this network."
+msgstr "Für jedes $Projectname-Mitglied sichtbar."
+
+#: ../../include/items.php:1095
+msgid "Visible to anybody authenticated."
+msgstr "Für jeden sichtbar, der angemeldet ist."
+
+#: ../../include/items.php:1097
#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
+msgid "Visible to anybody on %s."
+msgstr "Für jeden auf %s sichtbar."
-#: ../../include/oembed.php:312
-msgid " by "
-msgstr "von"
+#: ../../include/items.php:1099
+msgid "Visible to all connections."
+msgstr "Für alle Verbindungen sichtbar."
-#: ../../include/oembed.php:313
-msgid " on "
-msgstr "am"
+#: ../../include/items.php:1101
+msgid "Visible to approved connections."
+msgstr "Nur für akzeptierte Verbindungen sichtbar."
-#: ../../include/oembed.php:342
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../include/items.php:1103
+msgid "Visible to specific connections."
+msgstr "Sichtbar für bestimmte Verbindungen."
-#: ../../include/oembed.php:351
-msgid "Embedding disabled"
-msgstr "Einbetten deaktiviert"
+#: ../../include/items.php:3915
+msgid "Privacy group is empty."
+msgstr "Gruppe ist leer."
-#: ../../include/bb2diaspora.php:403
-msgid "Attachments:"
-msgstr "Anhänge:"
+#: ../../include/items.php:3922
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Gruppe: %s"
-#: ../../include/bb2diaspora.php:500
-msgid "$Projectname event notification:"
-msgstr "$Projectname-Terminbenachrichtigung:"
+#: ../../include/items.php:3934
+msgid "Connection not found."
+msgstr "Die Verbindung wurde nicht gefunden."
+
+#: ../../include/items.php:4283
+msgid "profile photo"
+msgstr "Profilfoto"
+
+#: ../../include/items.php:4479
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s wurde bearbeitet]"
+
+#: ../../include/items.php:4479
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Beitrag"
+
+#: ../../include/items.php:4479
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Kommentar"
#: ../../include/permissions.php:35
msgid "Can view my normal stream and posts"
@@ -12878,322 +13255,318 @@ msgid ""
"Extremely advanced. Leave this alone unless you know what you are doing"
msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s ist jetzt mit %2$s verbunden"
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Allgemeine Funktionen"
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s stupste %2$s an"
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Mehrfachprofile"
-#: ../../include/conversation.php:710
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "%ss Profil auf %s ansehen"
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Ermöglicht das Anlegen mehrerer Profile pro Kanal"
-#: ../../include/conversation.php:729
-msgid "Categories:"
-msgstr "Kategorien:"
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Erweiterte Profile"
-#: ../../include/conversation.php:730
-msgid "Filed under:"
-msgstr "Gespeichert unter:"
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung"
-#: ../../include/conversation.php:755
-msgid "View in context"
-msgstr "Im Zusammenhang anschauen"
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Profil-Import/Export"
-#: ../../include/conversation.php:865
-msgid "remove"
-msgstr "lösche"
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren"
-#: ../../include/conversation.php:870
-msgid "Delete Selected Items"
-msgstr "Lösche die ausgewählten Elemente"
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Webseiten"
-#: ../../include/conversation.php:963
-msgid "View Source"
-msgstr "Quelle anzeigen"
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Ermöglicht das Erstellen von Webseiten in Deinem Kanal"
-#: ../../include/conversation.php:964
-msgid "Follow Thread"
-msgstr "Unterhaltung folgen"
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Stelle ein Wiki in Deinem Kanal zur Verfügung"
-#: ../../include/conversation.php:965
-msgid "Unfollow Thread"
-msgstr "Unterhaltung nicht mehr folgen"
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Private Notizen"
-#: ../../include/conversation.php:970
-msgid "Activity/Posts"
-msgstr "Aktivitäten/Beiträge"
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"
-#: ../../include/conversation.php:972
-msgid "Edit Connection"
-msgstr "Verbindung bearbeiten"
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Kanal-Auswahl in der Navigationsleiste"
-#: ../../include/conversation.php:973
-msgid "Message"
-msgstr "Nachricht"
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s likes this."
-msgstr "%s gefällt das."
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Aufnahmeort"
-#: ../../include/conversation.php:1093
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s gefällt das nicht."
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte"
-#: ../../include/conversation.php:1097
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "<span %1$s>%2$d Person</span> gefällt das."
-msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das."
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Zugriffskontrollierte Chaträume"
-#: ../../include/conversation.php:1099
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "<span %1$s>%2$d Person</span> gefällt das nicht."
-msgstr[1] "<span %1$s>%2$d Leuten</span> gefällt das nicht."
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an."
-#: ../../include/conversation.php:1105
-msgid "and"
-msgstr "und"
+#: ../../include/features.php:154
+msgid "Provide alternate connection permission roles."
+msgstr "Stelle benutzerdefinierte Berechtigungsrollen für Verbindungen zur Verfügung."
-#: ../../include/conversation.php:1108
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ""
-msgstr[1] ", und %d andere"
+#: ../../include/features.php:162
+msgid "Smart Birthdays"
+msgstr "Smarte Geburtstage"
-#: ../../include/conversation.php:1109
-#, php-format
-msgid "%s like this."
-msgstr "%s gefällt das."
+#: ../../include/features.php:163
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind."
-#: ../../include/conversation.php:1109
-#, php-format
-msgid "%s don't like this."
-msgstr "%s gefällt das nicht."
+#: ../../include/features.php:171
+msgid "Event Timezone Selection"
+msgstr "Termin-Zeitzonenauswahl"
-#: ../../include/conversation.php:1152
-msgid "Set your location"
-msgstr "Standort"
+#: ../../include/features.php:172
+msgid "Allow event creation in timezones other than your own."
+msgstr ""
-#: ../../include/conversation.php:1153
-msgid "Clear browser location"
-msgstr "Browser-Standort löschen"
+#: ../../include/features.php:180
+msgid "Advanced Directory Search"
+msgstr "Erweiterte Verzeichnissuche"
-#: ../../include/conversation.php:1201
-msgid "Tag term:"
-msgstr "Schlagwort:"
+#: ../../include/features.php:181
+msgid "Allows creation of complex directory search queries"
+msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen"
-#: ../../include/conversation.php:1202
-msgid "Where are you right now?"
-msgstr "Wo bist Du jetzt grade?"
+#: ../../include/features.php:189
+msgid "Advanced Theme and Layout Settings"
+msgstr "Erweiterte Design- und Layout-Einstellungen"
-#: ../../include/conversation.php:1211
-msgid "Comments enabled"
-msgstr "Kommentare aktiviert"
+#: ../../include/features.php:190
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts"
-#: ../../include/conversation.php:1212
-msgid "Comments disabled"
-msgstr "Kommentare deaktiviert"
+#: ../../include/features.php:200
+msgid "Post Composition Features"
+msgstr "Nachbearbeitungsfunktionen"
-#: ../../include/conversation.php:1250
-msgid "Page link name"
-msgstr "Link zur Seite"
+#: ../../include/features.php:204
+msgid "Large Photos"
+msgstr "Große Fotos"
-#: ../../include/conversation.php:1253
-msgid "Post as"
-msgstr "Veröffentlichen als"
+#: ../../include/features.php:205
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet."
-#: ../../include/conversation.php:1267
-msgid "Toggle voting"
-msgstr "Umfragewerkzeug aktivieren"
+#: ../../include/features.php:214
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds"
-#: ../../include/conversation.php:1270
-msgid "Disable comments"
+#: ../../include/features.php:222
+msgid "Even More Encryption"
+msgstr "Noch mehr Verschlüsselung"
+
+#: ../../include/features.php:223
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)"
+
+#: ../../include/features.php:231
+msgid "Enable Voting Tools"
+msgstr "Umfragewerkzeuge aktivieren"
+
+#: ../../include/features.php:232
+msgid "Provide a class of post which others can vote on"
+msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)"
+
+#: ../../include/features.php:240
+msgid "Disable Comments"
msgstr "Kommentare deaktivieren"
-#: ../../include/conversation.php:1271
-msgid "Toggle comments"
-msgstr "Kommentare umschalten"
+#: ../../include/features.php:241
+msgid "Provide the option to disable comments for a post"
+msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten"
-#: ../../include/conversation.php:1279
-msgid "Categories (optional, comma-separated list)"
-msgstr "Kategorien (optional, kommagetrennte Liste)"
+#: ../../include/features.php:249
+msgid "Delayed Posting"
+msgstr "Verzögertes Senden"
-#: ../../include/conversation.php:1302
-msgid "Other networks and post services"
-msgstr "Andere Netzwerke und Platformen"
+#: ../../include/features.php:250
+msgid "Allow posts to be published at a later date"
+msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen"
-#: ../../include/conversation.php:1308
-msgid "Set publish date"
-msgstr "Veröffentlichungsdatum festlegen"
+#: ../../include/features.php:258
+msgid "Content Expiration"
+msgstr "Verfall von Inhalten"
-#: ../../include/conversation.php:1562
-msgid "Discover"
-msgstr "Entdecken"
+#: ../../include/features.php:259
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum."
-#: ../../include/conversation.php:1565
-msgid "Imported public streams"
-msgstr "Importierte öffentliche Beiträge"
+#: ../../include/features.php:267
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Doppelte Beiträge unterdrücken"
-#: ../../include/conversation.php:1570
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../include/features.php:268
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden."
-#: ../../include/conversation.php:1573
-msgid "Sort by Comment Date"
-msgstr "Nach Kommentardatum sortiert"
+#: ../../include/features.php:279
+msgid "Network and Stream Filtering"
+msgstr "Netzwerk- und Stream-Filter"
-#: ../../include/conversation.php:1577
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../include/features.php:283
+msgid "Search by Date"
+msgstr "Suche nach Datum"
-#: ../../include/conversation.php:1580
-msgid "Sort by Post Date"
-msgstr "Nach Beitragsdatum sortiert"
+#: ../../include/features.php:284
+msgid "Ability to select posts by date ranges"
+msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
-#: ../../include/conversation.php:1588
-msgid "Posts that mention or involve you"
-msgstr "Beiträge mit Beteiligung Deinerseits"
+#: ../../include/features.php:293
+msgid "Enable management and selection of privacy groups"
+msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
-#: ../../include/conversation.php:1597
-msgid "Activity Stream - by date"
-msgstr "Activity Stream – nach Datum sortiert"
+#: ../../include/features.php:302
+msgid "Save search terms for re-use"
+msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung"
-#: ../../include/conversation.php:1603
-msgid "Starred"
-msgstr "Markiert"
+#: ../../include/features.php:310
+msgid "Network Personal Tab"
+msgstr "Persönlicher Netzwerkreiter"
-#: ../../include/conversation.php:1606
-msgid "Favourite Posts"
-msgstr "Markierte Beiträge"
+#: ../../include/features.php:311
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast"
-#: ../../include/conversation.php:1613
-msgid "Spam"
-msgstr "Spam"
+#: ../../include/features.php:319
+msgid "Network New Tab"
+msgstr "Netzwerkreiter Neu"
-#: ../../include/conversation.php:1616
-msgid "Posts flagged as SPAM"
-msgstr "Nachrichten, die als SPAM markiert wurden"
+#: ../../include/features.php:320
+msgid "Enable tab to display all new Network activity"
+msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt"
-#: ../../include/conversation.php:1674
-msgid "Status Messages and Posts"
-msgstr "Statusnachrichten und Beiträge"
+#: ../../include/features.php:328
+msgid "Affinity Tool"
+msgstr "Beziehungs-Tool"
-#: ../../include/conversation.php:1683
-msgid "About"
-msgstr "Ãœber"
+#: ../../include/features.php:329
+msgid "Filter stream activity by depth of relationships"
+msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann"
-#: ../../include/conversation.php:1686
-msgid "Profile Details"
-msgstr "Profil-Details"
+#: ../../include/features.php:338
+msgid "Show friend and connection suggestions"
+msgstr "Freund- und Verbindungsvorschläge anzeigen"
-#: ../../include/conversation.php:1702
-msgid "Files and Storage"
-msgstr "Dateien und Speicher"
+#: ../../include/features.php:346
+msgid "Connection Filtering"
+msgstr "Filter für Verbindungen"
-#: ../../include/conversation.php:1738
-msgid "Saved Bookmarks"
-msgstr "Gespeicherte Lesezeichen"
+#: ../../include/features.php:347
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)"
-#: ../../include/conversation.php:1748
-msgid "Manage Webpages"
-msgstr "Webseiten verwalten"
+#: ../../include/features.php:359
+msgid "Post/Comment Tools"
+msgstr "Beitrag-/Kommentar-Tools"
-#: ../../include/conversation.php:1813
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Zusage"
-msgstr[1] "Zusagen"
+#: ../../include/features.php:363
+msgid "Community Tagging"
+msgstr "Gemeinschaftliches Verschlagworten"
-#: ../../include/conversation.php:1816
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "Absage"
-msgstr[1] "Absagen"
+#: ../../include/features.php:364
+msgid "Ability to tag existing posts"
+msgstr "Ermöglicht das Verschlagworten existierender Beiträge"
-#: ../../include/conversation.php:1819
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] " Unentschlossen"
-msgstr[1] "Unentschlossene"
+#: ../../include/features.php:372
+msgid "Post Categories"
+msgstr "Beitrags-Kategorien"
-#: ../../include/conversation.php:1822
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "Zustimmung"
-msgstr[1] "Zustimmungen"
+#: ../../include/features.php:373
+msgid "Add categories to your posts"
+msgstr "Aktiviert Kategorien für Beiträge"
-#: ../../include/conversation.php:1825
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "Ablehnung"
-msgstr[1] "Ablehnungen"
+#: ../../include/features.php:381
+msgid "Emoji Reactions"
+msgstr "Emoji Reaktionen"
-#: ../../include/conversation.php:1828
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "Enthaltung"
-msgstr[1] "Enthaltungen"
+#: ../../include/features.php:382
+msgid "Add emoji reaction ability to posts"
+msgstr "Aktiviert Emoji-Reaktionen für Beiträge"
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
-#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
-#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
-#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
-#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
-#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
-#: ../../include/bbcode.php:1001
-msgid "Image/photo"
-msgstr "Bild/Foto"
+#: ../../include/features.php:391
+msgid "Ability to file posts under folders"
+msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
-msgid "Encrypted content"
-msgstr "Verschlüsselter Inhalt"
+#: ../../include/features.php:399
+msgid "Dislike Posts"
+msgstr "Gefällt-mir-nicht-Beiträge"
-#: ../../include/bbcode.php:189
-#, php-format
-msgid "Install %s element: "
-msgstr "Element %s installieren: "
+#: ../../include/features.php:400
+msgid "Ability to dislike posts/comments"
+msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche"
-#: ../../include/bbcode.php:193
-#, php-format
-msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."
+#: ../../include/features.php:408
+msgid "Star Posts"
+msgstr "Beiträge mit Sternchen versehen"
-#: ../../include/bbcode.php:272
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s schrieb den folgenden %2$s %3$s"
+#: ../../include/features.php:409
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol"
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
-msgid "Click to open/close"
-msgstr "Klicke zum Öffnen/Schließen"
+#: ../../include/features.php:417
+msgid "Tag Cloud"
+msgstr "Schlagwort-Wolke"
-#: ../../include/bbcode.php:357
-msgid "spoiler"
-msgstr "Spoiler"
+#: ../../include/features.php:418
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite"
-#: ../../include/bbcode.php:950
-msgid "$1 wrote:"
-msgstr "$1 schrieb:"
+#: ../../include/features.php:430
+msgid "Premium Channel"
+msgstr "Premium-Kanal"
+
+#: ../../include/features.php:431
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
+
+#: ../../include/help.php:31
+msgid "Help:"
+msgstr "Hilfe:"
+
+#: ../../include/help.php:63
+msgid "Not Found"
+msgstr "Nicht gefunden"
+
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "Quellkanal nicht gefunden."
#: ../../view/theme/redbasic/php/config.php:9
msgid "Focus (Hubzilla default)"
@@ -13327,66 +13700,54 @@ msgstr "Größe der Avatare von Themenstartern"
msgid "Set size of followup author photos"
msgstr "Größe der Avatare von Kommentatoren"
-#: ../../boot.php:1175
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Suche %1$s (%2$s)"
-
-#: ../../boot.php:1175
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../boot.php:1493
+#: ../../boot.php:1505
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../boot.php:1496
+#: ../../boot.php:1508
#, php-format
msgid "Update Error at %s"
msgstr "Aktualisierungsfehler auf %s"
-#: ../../boot.php:1700
-msgid ""
-"Create an account to access services and applications within the Hubzilla"
-msgstr "Erstelle ein Konto, um Anwendungen und Dienste innerhalb von Hubzilla nutzen zu können."
+#: ../../boot.php:1712
+msgid "Create an account to access services and applications"
+msgstr "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können."
-#: ../../boot.php:1721
+#: ../../boot.php:1734
msgid "Login/Email"
msgstr "Anmelden/E-Mail"
-#: ../../boot.php:1722
+#: ../../boot.php:1735
msgid "Password"
msgstr "Kennwort"
-#: ../../boot.php:1723
+#: ../../boot.php:1736
msgid "Remember me"
msgstr "Angaben speichern"
-#: ../../boot.php:1726
+#: ../../boot.php:1739
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:2287
+#: ../../boot.php:2300
msgid "toggle mobile"
msgstr "auf/von mobile Ansicht wechseln"
-#: ../../boot.php:2442
+#: ../../boot.php:2455
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben."
-#: ../../boot.php:2445
+#: ../../boot.php:2458
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Website-SSL-Fehler für %s"
-#: ../../boot.php:2562
+#: ../../boot.php:2577
msgid "Cron/Scheduled tasks not running."
msgstr "Cron-Aufgaben laufen nicht."
-#: ../../boot.php:2566
+#: ../../boot.php:2581
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Cron-Aufgaben für %s laufen nicht"
diff --git a/view/de/hstrings.php b/view/de/hstrings.php
index 5d2a987ae..c01d28f13 100644
--- a/view/de/hstrings.php
+++ b/view/de/hstrings.php
@@ -28,7 +28,9 @@ App::$strings["Can view my connections"] = "Kann meine Verbindungen sehen";
App::$strings["Can view my file storage and photos"] = "Kann meine Datei- und Bilderordner sehen";
App::$strings["Can upload/modify my file storage and photos"] = "Kann in meine Datei- und Bilderordner hochladen/ändern";
App::$strings["Can view my channel webpages"] = "Kann die Webseiten meines Kanals sehen";
+App::$strings["Can view my wiki pages"] = "Kann meine Wiki-Seiten sehen";
App::$strings["Can create/edit my channel webpages"] = "Kann Webseiten in meinem Kanal erstellen/ändern";
+App::$strings["Can write to my wiki pages"] = "Kann meine Wiki-Seiten bearbeiten";
App::$strings["Can post on my channel (wall) page"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
App::$strings["Can comment on or like my posts"] = "Darf meine Beiträge kommentieren und mögen/nicht mögen";
App::$strings["Can send me private mail messages"] = "Kann mir private Nachrichten schicken";
@@ -62,16 +64,15 @@ App::$strings["WARNING:"] = "WARNUNG:";
App::$strings["Create new folder"] = "Neuen Ordner anlegen";
App::$strings["Upload file"] = "Datei hochladen";
App::$strings["Drop files here to immediately upload"] = "Dateien zum sofortigen Hochladen hier fallen lassen";
+App::$strings["Permission denied"] = "Keine Berechtigung";
App::$strings["Permission denied."] = "Berechtigung verweigert.";
-App::$strings["Not Found"] = "Nicht gefunden";
App::$strings["Page not found."] = "Seite nicht gefunden.";
-App::$strings["Permission denied"] = "Keine Berechtigung";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut.";
App::$strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
App::$strings["Requested profile is not available."] = "Das angefragte Profil ist nicht verfügbar.";
App::$strings["Some blurb about what to do when you're new here"] = "Ein Hinweis, was man tun kann, wenn man neu hier ist";
-App::$strings["Away"] = "Abwesend";
-App::$strings["Online"] = "Online";
+App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert.";
+App::$strings["Item not found."] = "Element nicht gefunden.";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
App::$strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
@@ -103,118 +104,100 @@ App::$strings["Membership on this site is by invitation only."] = "Mitgliedschaf
App::$strings["Register"] = "Registrieren";
App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Absenden des Formulars. Wenn Du auf eine Login-Seite zurückgeleitet wirst, prüfe bitte Deinen Posteingang auf neue Mails mit entsprechenden Hinweisen.";
App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
-App::$strings["Profile Match"] = "Profil-Ãœbereinstimmungen";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu.";
-App::$strings["is interested in:"] = "interessiert sich für:";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["No matches"] = "Keine Ãœbereinstimmungen";
-App::$strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
-App::$strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
-App::$strings["Connection updated."] = "Verbindung aktualisiert.";
-App::$strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
-App::$strings["is now connected to"] = "ist jetzt verbunden mit";
+App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
+App::$strings["Profile Photos"] = "Profilfotos";
+App::$strings["Album not found."] = "Album nicht gefunden.";
+App::$strings["Delete Album"] = "Album löschen";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager";
+App::$strings["Delete Photo"] = "Foto löschen";
+App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
+App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
+App::$strings["Upload Photos"] = "Fotos hochladen";
+App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
+App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
+App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
App::$strings["No"] = "Nein";
App::$strings["Yes"] = "Ja";
-App::$strings["Could not access address book record."] = "Konnte nicht auf den Adressbuch-Eintrag zugreifen.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
-App::$strings["Unable to set address book parameters."] = "Konnte die Adressbuch-Parameter nicht setzen.";
-App::$strings["Connection has been removed."] = "Verbindung wurde gelöscht.";
-App::$strings["View Profile"] = "Profil ansehen";
-App::$strings["View %s's profile"] = "%ss Profil ansehen";
-App::$strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
-App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
-App::$strings["Recent Activity"] = "Kürzliche Aktivitäten";
-App::$strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
-App::$strings["Unblock"] = "Freigeben";
-App::$strings["Block"] = "Blockieren";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen";
-App::$strings["This connection is blocked!"] = "Die Verbindung ist geblockt!";
-App::$strings["Unignore"] = "Nicht ignorieren";
-App::$strings["Ignore"] = "Ignorieren";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen";
-App::$strings["This connection is ignored!"] = "Die Verbindung wird ignoriert!";
-App::$strings["Unarchive"] = "Aus Archiv zurückholen";
-App::$strings["Archive"] = "Archivieren";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)";
-App::$strings["This connection is archived!"] = "Die Verbindung ist archiviert!";
-App::$strings["Unhide"] = "Wieder sichtbar machen";
-App::$strings["Hide"] = "Verstecken";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Diese Verbindung vor anderen Verbindungen verstecken/zeigen";
-App::$strings["This connection is hidden!"] = "Die Verbindung ist versteckt!";
-App::$strings["Delete this connection"] = "Verbindung löschen";
-App::$strings["Me"] = "Ich";
-App::$strings["Family"] = "Familie";
-App::$strings["Friends"] = "Freunde";
-App::$strings["Acquaintances"] = "Bekannte";
-App::$strings["All"] = "Alle";
-App::$strings["Approve this connection"] = "Verbindung genehmigen";
-App::$strings["Accept connection to allow communication"] = "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen";
-App::$strings["Set Affinity"] = "Beziehung festlegen";
-App::$strings["Set Profile"] = "Profil festlegen";
-App::$strings["Set Affinity & Profile"] = "Beziehung und Profile festlegen";
-App::$strings["none"] = "Keine";
-App::$strings["Connection Default Permissions"] = "Standardzugriffsrechte für neue Verbindungen:";
-App::$strings["Connection: %s"] = "Verbindung: %s";
-App::$strings["Apply these permissions automatically"] = "Diese Berechtigungen automatisch anwenden";
-App::$strings["Connection requests will be approved without your interaction"] = "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist.";
-App::$strings["This connection's primary address is"] = "Die Hauptadresse der Verbindung ist";
-App::$strings["Available locations:"] = "Verfügbare Klone:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet.";
-App::$strings["Connection Tools"] = "Verbindungswerkzeuge";
-App::$strings["Slide to adjust your degree of friendship"] = "Verschieben, um den Grad der Freundschaft zu einzustellen";
-App::$strings["Rating"] = "Bewertung";
-App::$strings["Slide to adjust your rating"] = "Verschieben, um Deine Bewertung einzustellen";
-App::$strings["Optionally explain your rating"] = "Optional kannst Du Deine Bewertung begründen";
-App::$strings["Custom Filter"] = "Benutzerdefinierter Filter";
-App::$strings["Only import posts with this text"] = "Nur Beiträge mit diesem Text importieren";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren.";
-App::$strings["Do not import posts with this text"] = "Beiträge mit diesem Text nicht importieren";
-App::$strings["This information is public!"] = "Diese Information ist öffentlich!";
-App::$strings["Connection Pending Approval"] = "Verbindung wartet auf Bestätigung";
-App::$strings["inherited"] = "geerbt";
+App::$strings["Caption (optional):"] = "Beschriftung (optional):";
+App::$strings["Description (optional):"] = "Beschreibung (optional):";
+App::$strings["Permissions"] = "Berechtigungen";
App::$strings["Submit"] = "Absenden";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
-App::$strings["Their Settings"] = "Deren Einstellungen";
-App::$strings["My Settings"] = "Meine Einstellungen";
-App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
-App::$strings["Last update:"] = "Letzte Aktualisierung:";
-App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
-App::$strings["no results"] = "keine Ergebnisse";
-App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
-App::$strings["queued"] = "zur Warteschlange hinzugefügt";
-App::$strings["posted"] = "zugestellt";
-App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
-App::$strings["updated"] = "aktualisiert";
-App::$strings["update ignored"] = "Aktualisierung ignoriert";
-App::$strings["permission denied"] = "Zugriff verweigert";
-App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
-App::$strings["mail recalled"] = "Mail widerrufen";
-App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
-App::$strings["mail delivered"] = "Mail zugestellt";
-App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
-App::$strings["Options"] = "Optionen";
-App::$strings["Redeliver"] = "Erneut zustellen";
+App::$strings["Album name could not be decoded"] = "Albumname konnte nicht dekodiert werden";
+App::$strings["Contact Photos"] = "Kontakt-Bilder";
+App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
+App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
+App::$strings["View Photo"] = "Foto ansehen";
+App::$strings["Edit Album"] = "Album bearbeiten";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
+App::$strings["Photo not available"] = "Foto nicht verfügbar";
+App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
+App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
+App::$strings["Private Photo"] = "Privates Foto";
+App::$strings["Previous"] = "Voriges";
+App::$strings["View Full Size"] = "In voller Größe anzeigen";
+App::$strings["Next"] = "Nächste";
+App::$strings["Remove"] = "Entfernen";
+App::$strings["Edit photo"] = "Foto bearbeiten";
+App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
+App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
+App::$strings["Move photo to album"] = "Foto in Album verschieben";
+App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
+App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
+App::$strings["Caption"] = "Bildunterschrift";
+App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
+App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
+App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
+App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
+App::$strings["Share"] = "Teilen";
+App::$strings["Please wait"] = "Bitte warten";
+App::$strings["This is you"] = "Das bist Du";
+App::$strings["Comment"] = "Kommentar";
+App::$strings["Preview"] = "Vorschau";
+App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
+App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
+App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
+App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
+App::$strings["__ctx:title__ Attending"] = "Zusagen";
+App::$strings["__ctx:title__ Not attending"] = "Absagen";
+App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
+App::$strings["View all"] = "Alles anzeigen";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Gefällt mir",
+ 1 => "Gefällt mir",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "Gefällt nicht",
+ 1 => "Gefällt nicht",
+);
+App::$strings["Photo Tools"] = "Fotowerkzeuge";
+App::$strings["In This Photo:"] = "Auf diesem Foto:";
+App::$strings["Map"] = "Karte";
+App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
+App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
+App::$strings["Close"] = "Schließen";
+App::$strings["View Album"] = "Album ansehen";
+App::$strings["Recent Photos"] = "Neueste Fotos";
+App::$strings["Item not found"] = "Element nicht gefunden";
+App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
+App::$strings["Edit post"] = "Bearbeite Beitrag";
+App::$strings["__ctx:acl__ Profile"] = "Profil";
+App::$strings["network"] = "Netzwerk";
+App::$strings["RSS"] = "RSS";
+App::$strings["Documentation Search"] = "Suche in der Dokumentation";
+App::$strings["About"] = "Ãœber";
+App::$strings["Members"] = "Mitglieder";
+App::$strings["Administrators"] = "Administratoren";
+App::$strings["Developers"] = "Entwickler";
+App::$strings["Tutorials"] = "Tutorials";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
+App::$strings["Contents"] = "Inhalt";
App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
App::$strings["My Bookmarks"] = "Meine Lesezeichen";
App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
-App::$strings["network"] = "Netzwerk";
-App::$strings["RSS"] = "RSS";
-App::$strings["Location not found."] = "Klon nicht gefunden.";
-App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
-App::$strings["Syncing locations"] = "Synchronisiere Klone";
-App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
-App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
-App::$strings["Location"] = "Ort";
-App::$strings["Address"] = "Adresse";
-App::$strings["Primary"] = "Primär";
-App::$strings["Drop"] = "Löschen";
-App::$strings["Sync Now"] = "Jetzt synchronisieren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
App::$strings["Continue"] = "Fortfahren";
App::$strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
App::$strings["Enable premium channel connection restrictions"] = "Einschränkungen für einen Premium-Kanal aktivieren";
@@ -224,28 +207,45 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Indem ich fortfahre, bestätige ich die Erfüllung aller Anweisungen auf dieser Seite.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)";
App::$strings["Restricted or Premium Channel"] = "Eingeschränkter oder Premium-Kanal";
+App::$strings["# Accounts"] = "Anzahl der Konten";
+App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
+App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
+App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
+App::$strings["# Channels"] = "Anzahl der Kanäle";
+App::$strings["# primary"] = "Anzahl der primären Kanäle";
+App::$strings["# clones"] = "Anzahl der Klone";
+App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
+App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
+App::$strings["Administration"] = "Administration";
+App::$strings["Summary"] = "Zusammenfassung";
+App::$strings["Registered accounts"] = "Registrierte Konten";
+App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
+App::$strings["Registered channels"] = "Registrierte Kanäle";
+App::$strings["Active plugins"] = "Aktive Plug-Ins";
+App::$strings["Version"] = "Version";
+App::$strings["Repository version (master)"] = "Repository-Version (master)";
+App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
+App::$strings["Block Name"] = "Block-Name";
+App::$strings["Insert web link"] = "Link einfügen";
+App::$strings["Title (optional)"] = "Titel (optional)";
+App::$strings["Edit Block"] = "Block bearbeiten";
App::$strings["Invalid item."] = "Ungültiges Element.";
App::$strings["Channel not found."] = "Kanal nicht gefunden.";
App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
App::$strings["Save to Folder:"] = "Speichern in Ordner:";
App::$strings["- select -"] = "– auswählen –";
App::$strings["Save"] = "Speichern";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
-App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
-App::$strings["Create New"] = "Neu anlegen";
-App::$strings["Channel Manager"] = "Kanal-Manager";
-App::$strings["Current Channel"] = "Aktueller Kanal";
-App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
-App::$strings["Default Channel"] = "Standard Kanal";
-App::$strings["Make Default"] = "Zum Standard machen";
-App::$strings["%d new messages"] = "%d neue Nachrichten";
-App::$strings["%d new introductions"] = "%d neue Vorstellungen";
-App::$strings["Delegated Channel"] = "Delegierte Kanäle";
+App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
+App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
+App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
+App::$strings["[today]"] = "[Heute]";
+App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
App::$strings["Blocked"] = "Blockiert";
App::$strings["Ignored"] = "Ignoriert";
App::$strings["Hidden"] = "Versteckt";
App::$strings["Archived"] = "Archiviert";
App::$strings["New"] = "Neu";
+App::$strings["All"] = "Alle";
App::$strings["New Connections"] = "Neue Verbindungen";
App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindungsanfragen anzeigen";
App::$strings["All Connections"] = "Alle Verbindungen";
@@ -260,11 +260,13 @@ App::$strings["Edit connection"] = "Verbindung bearbeiten";
App::$strings["Delete connection"] = "Verbindung löschen";
App::$strings["Channel address"] = "Kanaladresse";
App::$strings["Network"] = "Netzwerk";
+App::$strings["Call"] = "Anruf";
App::$strings["Status"] = "Status";
App::$strings["Connected"] = "Verbunden";
App::$strings["Approve connection"] = "Verbindung genehmigen";
App::$strings["Approve"] = "Genehmigen";
App::$strings["Ignore connection"] = "Verbindung ignorieren";
+App::$strings["Ignore"] = "Ignorieren";
App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
App::$strings["Connections"] = "Verbindungen";
App::$strings["Search"] = "Suche";
@@ -298,43 +300,12 @@ App::$strings["On"] = "An";
App::$strings["Lock feature %s"] = "Blockiere die Funktion %s";
App::$strings["Manage Additional Features"] = "Zusätzliche Funktionen verwalten";
App::$strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
-App::$strings["Administration"] = "Administration";
App::$strings["Logs"] = "Protokolle";
App::$strings["Clear"] = "Leeren";
App::$strings["Debugging"] = "Debugging";
App::$strings["Log file"] = "Protokolldatei";
App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Muss für den Web-Server schreibbar sein. Relativ zum Hubzilla-Stammverzeichnis.";
App::$strings["Log level"] = "Protokollstufe";
-App::$strings["Item not found."] = "Element nicht gefunden.";
-App::$strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
-App::$strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
-App::$strings["Disable"] = "Deaktivieren";
-App::$strings["Enable"] = "Aktivieren";
-App::$strings["Plugins"] = "Plug-Ins";
-App::$strings["Toggle"] = "Umschalten";
-App::$strings["Settings"] = "Einstellungen";
-App::$strings["Author: "] = "Autor: ";
-App::$strings["Maintainer: "] = "Betreuer:";
-App::$strings["Minimum project version: "] = "Minimale Version des Projekts:";
-App::$strings["Maximum project version: "] = "Maximale Version des Projekts:";
-App::$strings["Minimum PHP version: "] = "Minimale PHP Version:";
-App::$strings["Compatible Server Roles: "] = "Kompatible Serverrollen: ";
-App::$strings["Requires: "] = "Benötigt:";
-App::$strings["Disabled - version incompatibility"] = "Abgeschaltet - Versionsinkompatibilität";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "Gib die öffentliche Git-Repository-URL des Plugin-Repository an.";
-App::$strings["Plugin repo git URL"] = "Plugin-Repository Git URL";
-App::$strings["Custom repo name"] = "Benutzerdefinierter Repository-Name";
-App::$strings["(optional)"] = "(optional)";
-App::$strings["Download Plugin Repo"] = "Plugin-Repository herunterladen";
-App::$strings["Install new repo"] = "Neues Repository installieren";
-App::$strings["Install"] = "Installieren";
-App::$strings["Cancel"] = "Abbrechen";
-App::$strings["Manage Repos"] = "Repositorien verwalten";
-App::$strings["Installed Plugin Repositories"] = "Installierte Plugin-Repositorien";
-App::$strings["Install a New Plugin Repository"] = "Ein neues Plugin-Repository installieren";
-App::$strings["Update"] = "Aktualisieren";
-App::$strings["Switch branch"] = "Zweig/Branch wechseln";
-App::$strings["Remove"] = "Entfernen";
App::$strings["New Profile Field"] = "Neues Profilfeld";
App::$strings["Field nickname"] = "Kurzname für das Feld";
App::$strings["System name of field"] = "Systemname des Feldes";
@@ -352,13 +323,6 @@ App::$strings["(In addition to basic fields)"] = "(zusätzlich zu notwendige Fel
App::$strings["All available fields"] = "Alle verfügbaren Felder";
App::$strings["Custom Fields"] = "Benutzerdefinierte Felder";
App::$strings["Create Custom Field"] = "Erstelle benutzerdefiniertes Feld";
-App::$strings["Queue Statistics"] = "Warteschlangenstatistiken";
-App::$strings["Total Entries"] = "Einträge insgesamt";
-App::$strings["Priority"] = "Priorität";
-App::$strings["Destination URL"] = "Ziel-URL";
-App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markieren";
-App::$strings["Empty queue for this hub"] = "Warteschlange für diesen Hub leeren";
-App::$strings["Last known contact"] = "Letzter Kontakt";
App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Standardmäßig wird ungefiltertes HTML in eingebetteten Inhalten zugelassen. Das ist prinzipiell unsicher.";
App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Die empfohlene Einstellung ist, ungefiltertes HTML nur von den nachfolgenden Webseiten zu erlauben:";
App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
@@ -372,20 +336,26 @@ App::$strings["Allowed email domains"] = "Erlaubte Domains für E-Mails";
App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für E-Mail-Adressen bei der Registrierung erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
App::$strings["Not allowed email domains"] = "Nicht erlaubte Domains für E-Mails";
App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Domains in E-Mail-Adressen, die keine Erlaubnis erhalten, sich auf Deinem Hub zu registrieren. Mehrere Domains können durch Kommas getrennt werden. Platzhalter (*/?) sind möglich. Keine Eingabe bedeutet keine Einschränkung, unabhängig davon, ob unter erlaubte Domains etwas eingegeben wurde.";
-App::$strings["Allow communications only from these sites"] = "Kommunikation nur von diesen Seiten erlauben";
+App::$strings["Allow communications only from these sites"] = "Kommunikation nur von diesen Servern/Domains erlauben";
App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Ein Eintrag pro Zeile. Lasse das Feld leer, um Kommunikation grundlegend von überall her zu erlauben.";
-App::$strings["Block communications from these sites"] = "Kommunikation von diesen Seiten blockieren";
+App::$strings["Block communications from these sites"] = "Kommunikation von diesen Servern/Domains blockieren";
App::$strings["Allow communications only from these channels"] = "Kommunikation nur von diesen Kanälen erlauben";
App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Ein Kanal (hash) pro Zeile. Leerlassen um jeden Kanal zuzulassen. ";
App::$strings["Block communications from these channels"] = "Kommunikation von folgenden Kanälen blockieren";
App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Erlaube Einbettungen nur von sicheren (SSL) Webseiten und Links.";
App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Erlaube Einbettung von Inhalten mit ungefiltertem HTML nur von diesen Domains";
App::$strings["One site per line. By default embedded content is filtered."] = "Eine Website/Domain pro Zeile. Standardmäßig wird eingebetteter Inhalt gefiltert.";
-App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inhalte von diesen Seiten blockieren";
+App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inhalte von diesen Servern/Domains blockieren";
App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
App::$strings["No themes found."] = "Keine Theme gefunden.";
+App::$strings["Disable"] = "Deaktivieren";
+App::$strings["Enable"] = "Aktivieren";
App::$strings["Screenshot"] = "Bildschirmfoto";
App::$strings["Themes"] = "Themes";
+App::$strings["Toggle"] = "Umschalten";
+App::$strings["Settings"] = "Einstellungen";
+App::$strings["Author: "] = "Autor: ";
+App::$strings["Maintainer: "] = "Betreuer:";
App::$strings["[Experimental]"] = "[Experimentell]";
App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
App::$strings["Password changed for account %d."] = "Passwort für Konto %d geändert.";
@@ -416,6 +386,8 @@ App::$strings["Request date"] = "Antragsdatum";
App::$strings["Email"] = "E-Mail";
App::$strings["No registrations."] = "Keine Registrierungen.";
App::$strings["Deny"] = "Verweigern";
+App::$strings["Block"] = "Blockieren";
+App::$strings["Unblock"] = "Freigeben";
App::$strings["ID"] = "ID";
App::$strings["All Channels"] = "Alle Kanäle";
App::$strings["Register date"] = "Registrierungs-Datum";
@@ -449,6 +421,7 @@ App::$strings["Allow Code"] = "Code erlauben";
App::$strings["Disallow Code"] = "Code sperren";
App::$strings["Channel"] = "Kanal";
App::$strings["UID"] = "UID";
+App::$strings["Address"] = "Adresse";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?";
App::$strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
@@ -543,28 +516,65 @@ App::$strings["Maximum Load Average"] = "Maximales Load Average";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen";
App::$strings["0 for no expiration of imported content"] = "0 = keine Löschung importierter Inhalte";
-App::$strings["Public Hubs"] = "Öffentliche Hubs";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
-App::$strings["Hub URL"] = "Hub-URL";
-App::$strings["Access Type"] = "Zugriffstyp";
-App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
-App::$strings["Stats"] = "Statistiken";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Bewertungen";
-App::$strings["Rate"] = "Bewerten";
-App::$strings["View"] = "Ansicht";
-App::$strings["Item not found"] = "Element nicht gefunden";
+App::$strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
+App::$strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
+App::$strings["Plugins"] = "Plug-Ins";
+App::$strings["Minimum project version: "] = "Minimale Version des Projekts:";
+App::$strings["Maximum project version: "] = "Maximale Version des Projekts:";
+App::$strings["Minimum PHP version: "] = "Minimale PHP Version:";
+App::$strings["Compatible Server Roles: "] = "Kompatible Serverrollen: ";
+App::$strings["Requires: "] = "Benötigt:";
+App::$strings["Disabled - version incompatibility"] = "Abgeschaltet - Versionsinkompatibilität";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Gib die öffentliche Git-Repository-URL des Plugin-Repository an.";
+App::$strings["Plugin repo git URL"] = "Plugin-Repository Git URL";
+App::$strings["Custom repo name"] = "Benutzerdefinierter Repository-Name";
+App::$strings["(optional)"] = "(optional)";
+App::$strings["Download Plugin Repo"] = "Plugin-Repository herunterladen";
+App::$strings["Install new repo"] = "Neues Repository installieren";
+App::$strings["Install"] = "Installieren";
+App::$strings["Cancel"] = "Abbrechen";
+App::$strings["Manage Repos"] = "Repositorien verwalten";
+App::$strings["Installed Plugin Repositories"] = "Installierte Plugin-Repositorien";
+App::$strings["Install a New Plugin Repository"] = "Ein neues Plugin-Repository installieren";
+App::$strings["Update"] = "Aktualisieren";
+App::$strings["Switch branch"] = "Zweig/Branch wechseln";
+App::$strings["Queue Statistics"] = "Warteschlangenstatistiken";
+App::$strings["Total Entries"] = "Einträge insgesamt";
+App::$strings["Priority"] = "Priorität";
+App::$strings["Destination URL"] = "Ziel-URL";
+App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markieren";
+App::$strings["Empty queue for this hub"] = "Warteschlange für diesen Hub leeren";
+App::$strings["Last known contact"] = "Letzter Kontakt";
+App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
+App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
App::$strings["Layout Name"] = "Layout-Name";
App::$strings["Layout Description (Optional)"] = "Layout-Beschreibung (optional)";
App::$strings["Edit Layout"] = "Layout bearbeiten";
App::$strings["Page link"] = "Seiten-Link";
-App::$strings["Insert web link"] = "Link einfügen";
App::$strings["Edit Webpage"] = "Webseite bearbeiten";
-App::$strings["Photos"] = "Fotos";
-App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
-App::$strings["Posts and comments"] = "Beiträge und Kommentare";
-App::$strings["Only posts"] = "Nur Beiträge";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
+App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
+App::$strings["Invalid request."] = "Ungültige Anfrage.";
+App::$strings["channel"] = "Kanal";
+App::$strings["thing"] = "Sache";
+App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
+App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
+App::$strings["photo"] = "Foto";
+App::$strings["status"] = "Status";
+App::$strings["event"] = "Termin";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
+App::$strings["Action completed."] = "Aktion durchgeführt.";
+App::$strings["Thank you."] = "Vielen Dank.";
+App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
+App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
App::$strings["No such group"] = "Gruppe nicht gefunden";
App::$strings["No such channel"] = "Kanal nicht gefunden";
App::$strings["forum"] = "Forum";
@@ -582,6 +592,7 @@ App::$strings["Allow Bookmarks"] = "Lesezeichen erlauben";
App::$strings["Menu may be used to store saved bookmarks"] = "Im Menü können gespeicherte Lesezeichen abgelegt werden";
App::$strings["Submit and proceed"] = "Absenden und fortfahren";
App::$strings["Menus"] = "Menüs";
+App::$strings["Drop"] = "Löschen";
App::$strings["Created"] = "Erstellt";
App::$strings["Edited"] = "Geändert";
App::$strings["Bookmarks allowed"] = "Lesezeichen erlaubt";
@@ -598,33 +609,124 @@ App::$strings["Menu title"] = "Menü Titel";
App::$strings["Menu title as seen by others"] = "Menü Titel wie er von anderen gesehen wird";
App::$strings["Allow bookmarks"] = "Erlaube Lesezeichen";
App::$strings["Not found."] = "Nicht gefunden.";
-App::$strings["App installed."] = "App installiert.";
-App::$strings["Malformed app."] = "Fehlerhafte App.";
-App::$strings["Embed code"] = "Code einbetten";
-App::$strings["Edit App"] = "App bearbeiten";
-App::$strings["Create App"] = "App erstellen";
-App::$strings["Name of app"] = "Name der App";
-App::$strings["Required"] = "Benötigt";
-App::$strings["Location (URL) of app"] = "Ort (URL) der App";
-App::$strings["Description"] = "Beschreibung";
-App::$strings["Photo icon URL"] = "URL zum Icon";
-App::$strings["80 x 80 pixels - optional"] = "80 x 80 Pixel – optional";
-App::$strings["Categories (optional, comma separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
-App::$strings["Version ID"] = "Versions-ID";
-App::$strings["Price of app"] = "Preis der App";
-App::$strings["Location (URL) to purchase app"] = "Ort (URL), um die App zu kaufen";
-App::$strings["Edit post"] = "Bearbeite Beitrag";
-App::$strings["Documentation Search"] = "Suche in der Dokumentation";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-Dokumentation";
-App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Aktiviert den \$Projectname-Provider für firefox";
-App::$strings["Apps"] = "Apps";
+App::$strings["Location not found."] = "Klon nicht gefunden.";
+App::$strings["Location lookup failed."] = "Nachschlagen des Kanal-Ortes fehlgeschlagen";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Bitte mache einen anderen Kanal-Ort zum primären Ort, bevor Du den primären Ort löschst.";
+App::$strings["Syncing locations"] = "Synchronisiere Klone";
+App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
+App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
+App::$strings["Location"] = "Ort";
+App::$strings["Primary"] = "Primär";
+App::$strings["Sync Now"] = "Jetzt synchronisieren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
+App::$strings["Public Hubs"] = "Öffentliche Hubs";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Die hier aufgeführten Hubs sind öffentlich und erlauben die Registrierung im \$Projectname Netzwerk. Alle Hubs dieses Netzwerks sind miteinander verbunden, so dass die Mitgliedschaft auf einem Hub die Verbindung zu beliebigen Seiten und Kanälen auf anderen Hubs ermöglicht. Es könnte sein, dass einige dieser Hubs kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den Seiten der einzelnen Hubs <strong>könnten</strong> jeweils nähere Informationen dazu stehen.";
+App::$strings["Hub URL"] = "Hub-URL";
+App::$strings["Access Type"] = "Zugriffstyp";
+App::$strings["Registration Policy"] = "Registrierungsrichtlinien";
+App::$strings["Stats"] = "Statistiken";
+App::$strings["Software"] = "Software";
+App::$strings["Ratings"] = "Bewertungen";
+App::$strings["Rate"] = "Bewerten";
+App::$strings["View"] = "Ansicht";
+App::$strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
+App::$strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
+App::$strings["Connection updated."] = "Verbindung aktualisiert.";
+App::$strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
+App::$strings["is now connected to"] = "ist jetzt verbunden mit";
+App::$strings["Could not access address book record."] = "Konnte nicht auf den Adressbuch-Eintrag zugreifen.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
+App::$strings["Unable to set address book parameters."] = "Konnte die Adressbuch-Parameter nicht setzen.";
+App::$strings["Connection has been removed."] = "Verbindung wurde gelöscht.";
+App::$strings["View Profile"] = "Profil ansehen";
+App::$strings["View %s's profile"] = "%ss Profil ansehen";
+App::$strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
+App::$strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
+App::$strings["Recent Activity"] = "Kürzliche Aktivitäten";
+App::$strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Jegliche Kommunikation mit dieser Verbindung blockieren/zulassen";
+App::$strings["This connection is blocked!"] = "Die Verbindung ist geblockt!";
+App::$strings["Unignore"] = "Nicht ignorieren";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Jegliche eingehende Kommunikation von dieser Verbindung ignorieren/zulassen";
+App::$strings["This connection is ignored!"] = "Die Verbindung wird ignoriert!";
+App::$strings["Unarchive"] = "Aus Archiv zurückholen";
+App::$strings["Archive"] = "Archivieren";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Verbindung archivieren/aus dem Archiv zurückholen (Archiv = Kanal als erloschen markieren, aber die Beiträge behalten)";
+App::$strings["This connection is archived!"] = "Die Verbindung ist archiviert!";
+App::$strings["Unhide"] = "Wieder sichtbar machen";
+App::$strings["Hide"] = "Verstecken";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Diese Verbindung vor anderen Verbindungen verstecken/zeigen";
+App::$strings["This connection is hidden!"] = "Die Verbindung ist versteckt!";
+App::$strings["Delete this connection"] = "Verbindung löschen";
+App::$strings["Open Individual Permissions section by default"] = "Öffne standardmäßig den Bereich für individuelle Berechtigungen";
+App::$strings["Affinity"] = "Beziehung";
+App::$strings["Open Set Affinity section by default"] = "Öffne standardmäßig den Bereich für Beziehungsgrad-Einstellungen";
+App::$strings["Me"] = "Ich";
+App::$strings["Family"] = "Familie";
+App::$strings["Friends"] = "Freunde";
+App::$strings["Acquaintances"] = "Bekannte";
+App::$strings["Filter"] = "Filter";
+App::$strings["Open Custom Filter section by default"] = "Öffne standardmäßig den Bereich für benutzerdefinierte Filter";
+App::$strings["Approve this connection"] = "Verbindung genehmigen";
+App::$strings["Accept connection to allow communication"] = "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen";
+App::$strings["Set Affinity"] = "Beziehung festlegen";
+App::$strings["Set Profile"] = "Profil festlegen";
+App::$strings["Set Affinity & Profile"] = "Beziehung und Profile festlegen";
+App::$strings["none"] = "Keine";
+App::$strings["Connection Default Permissions"] = "Standardzugriffsrechte für neue Verbindungen:";
+App::$strings["Connection: %s"] = "Verbindung: %s";
+App::$strings["Apply these permissions automatically"] = "Diese Berechtigungen automatisch anwenden";
+App::$strings["Connection requests will be approved without your interaction"] = "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist.";
+App::$strings["Permission role"] = "Berechtigungsrolle";
+App::$strings["Add permission role"] = "Berechtigungsrolle hinzufügen";
+App::$strings["This connection's primary address is"] = "Die Hauptadresse der Verbindung ist";
+App::$strings["Available locations:"] = "Verfügbare Klone:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet.";
+App::$strings["Connection Tools"] = "Verbindungswerkzeuge";
+App::$strings["Slide to adjust your degree of friendship"] = "Verschieben, um den Grad der Freundschaft zu einzustellen";
+App::$strings["Rating"] = "Bewertung";
+App::$strings["Slide to adjust your rating"] = "Verschieben, um Deine Bewertung einzustellen";
+App::$strings["Optionally explain your rating"] = "Optional kannst Du Deine Bewertung begründen";
+App::$strings["Custom Filter"] = "Benutzerdefinierter Filter";
+App::$strings["Only import posts with this text"] = "Nur Beiträge mit diesem Text importieren";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren.";
+App::$strings["Do not import posts with this text"] = "Beiträge mit diesem Text nicht importieren";
+App::$strings["This information is public!"] = "Diese Information ist öffentlich!";
+App::$strings["Connection Pending Approval"] = "Verbindung wartet auf Bestätigung";
+App::$strings["inherited"] = "geerbt";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle ein Profil, das wir %s zeigen sollen, wenn Deine Profilseite über eine verifizierte Verbindung aufgerufen wird.";
+App::$strings["Their Settings"] = "Deren Einstellungen";
+App::$strings["My Settings"] = "Meine Einstellungen";
+App::$strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals vererbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung und können hier nicht verändert werden.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
+App::$strings["Last update:"] = "Letzte Aktualisierung:";
+App::$strings["Details"] = "Details";
+App::$strings["Organisation"] = "Organisation";
+App::$strings["Title"] = "Titel";
+App::$strings["Phone"] = "Telefon";
+App::$strings["Instant messenger"] = "Sofortnachrichtendienst";
+App::$strings["Website"] = "Webseite";
+App::$strings["Note"] = "Hinweis";
+App::$strings["Mobile"] = "Mobil";
+App::$strings["Home"] = "Home";
+App::$strings["Work"] = "Arbeit";
+App::$strings["Add Contact"] = "Kontakt hinzufügen";
+App::$strings["Add Field"] = "Feld hinzufügen";
+App::$strings["P.O. Box"] = "Postfach";
+App::$strings["Additional"] = "Zusätzlich";
+App::$strings["Street"] = "Straße";
+App::$strings["Locality"] = "Ortschaft";
+App::$strings["Region"] = "Region";
+App::$strings["ZIP Code"] = "Postleitzahl";
+App::$strings["Country"] = "Land";
App::$strings["\$Projectname"] = "\$Projectname";
App::$strings["Welcome to %s"] = "Willkommen auf %s";
App::$strings["Permission Denied."] = "Zugriff verweigert.";
App::$strings["File not found."] = "Datei nicht gefunden.";
App::$strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
-App::$strings["Permissions"] = "Berechtigungen";
App::$strings["Set/edit permissions"] = "Berechtigungen setzen/ändern";
App::$strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
App::$strings["Return to file list"] = "Zurück zur Dateiliste";
@@ -633,71 +735,44 @@ App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL v
App::$strings["Share this file"] = "Diese Datei freigeben";
App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
-App::$strings["Public access denied."] = "Öffentlichen Zugriff verweigert.";
-App::$strings["%d rating"] = array(
- 0 => "%d Bewertung",
- 1 => "%d Bewertungen",
-);
-App::$strings["Gender: "] = "Geschlecht:";
-App::$strings["Status: "] = "Status:";
-App::$strings["Homepage: "] = "Webseite:";
-App::$strings["Age:"] = "Alter:";
-App::$strings["Location:"] = "Ort:";
-App::$strings["Description:"] = "Beschreibung:";
-App::$strings["Hometown:"] = "Heimatstadt:";
-App::$strings["About:"] = "Ãœber:";
-App::$strings["Public Forum:"] = "Öffentliches Forum:";
-App::$strings["Keywords: "] = "Schlüsselwörter:";
-App::$strings["Don't suggest"] = "Nicht vorschlagen";
-App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
-App::$strings["Global Directory"] = "Globales Verzeichnis";
-App::$strings["Local Directory"] = "Lokales Verzeichnis";
-App::$strings["Finding:"] = "Ergebnisse:";
-App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
-App::$strings["next page"] = "nächste Seite";
-App::$strings["previous page"] = "vorherige Seite";
-App::$strings["Sort options"] = "Sortieroptionen";
-App::$strings["Alphabetic"] = "alphabetisch";
-App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
-App::$strings["Newest to Oldest"] = "Neueste zuerst";
-App::$strings["Oldest to Newest"] = "Älteste zuerst";
-App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
-App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
-App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
-App::$strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
-App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
-App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
-App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
-App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
-App::$strings["Channel added."] = "Kanal hinzugefügt.";
-App::$strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
-App::$strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
-App::$strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
-App::$strings["Messages"] = "Nachrichten";
-App::$strings["Message recalled."] = "Nachricht widerrufen.";
-App::$strings["Conversation removed."] = "Unterhaltung gelöscht.";
-App::$strings["Please enter a link URL:"] = "Gib eine URL ein:";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verfällt YYYY-MM-DD HH;MM";
-App::$strings["Requested channel is not in this network"] = "Angeforderter Kanal ist nicht in diesem Netzwerk.";
-App::$strings["Send Private Message"] = "Private Nachricht senden";
-App::$strings["To:"] = "An:";
-App::$strings["Subject:"] = "Betreff:";
-App::$strings["Your message:"] = "Deine Nachricht:";
-App::$strings["Attach file"] = "Datei anhängen";
-App::$strings["Send"] = "Absenden";
-App::$strings["Set expiration date"] = "Verfallsdatum";
-App::$strings["Encrypt text"] = "Text verschlüsseln";
-App::$strings["Delete message"] = "Nachricht löschen";
-App::$strings["Delivery report"] = "Zustellungsbericht";
-App::$strings["Recall message"] = "Nachricht widerrufen";
-App::$strings["Message has been recalled."] = "Die Nachricht wurde widerrufen.";
-App::$strings["Delete Conversation"] = "Unterhaltung löschen";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten.";
-App::$strings["Send Reply"] = "Antwort senden";
-App::$strings["Your message for %s (%s):"] = "Deine Nachricht für %s (%s):";
+App::$strings["Photos"] = "Fotos";
+App::$strings["Apps"] = "Apps";
+App::$strings["Permissions denied."] = "Berechtigung verweigert.";
+App::$strings["l, F j"] = "l, j. F";
+App::$strings["Link to Source"] = "Link zur Quelle";
+App::$strings["Edit Event"] = "Termin bearbeiten";
+App::$strings["Create Event"] = "Termin anlegen";
+App::$strings["Export"] = "Exportieren";
+App::$strings["Import"] = "Import";
+App::$strings["Today"] = "Heute";
+App::$strings["Privacy group created."] = "Gruppe wurde erstellt.";
+App::$strings["Could not create privacy group."] = "Gruppe konnte nicht erstellt werden.";
+App::$strings["Privacy group not found."] = "Gruppe nicht gefunden.";
+App::$strings["Privacy group updated."] = "Gruppe wurde aktualisiert.";
+App::$strings["Create a group of channels."] = "Erstelle eine Gruppe für Kanäle.";
+App::$strings["Privacy group name: "] = "Gruppenname:";
+App::$strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
+App::$strings["Privacy group removed."] = "Gruppe wurde entfernt.";
+App::$strings["Unable to remove privacy group."] = "Gruppe konnte nicht entfernt werden.";
+App::$strings["Privacy group editor"] = "Gruppeneditor";
+App::$strings["All Connected Channels"] = "Alle verbundenen Kanäle";
+App::$strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
+App::$strings["Invalid message"] = "Ungültige Beitrags-ID (mid)";
+App::$strings["no results"] = "keine Ergebnisse";
+App::$strings["channel sync processed"] = "Kanal-Sync verarbeitet";
+App::$strings["queued"] = "zur Warteschlange hinzugefügt";
+App::$strings["posted"] = "zugestellt";
+App::$strings["accepted for delivery"] = "für Zustellung akzeptiert";
+App::$strings["updated"] = "aktualisiert";
+App::$strings["update ignored"] = "Aktualisierung ignoriert";
+App::$strings["permission denied"] = "Zugriff verweigert";
+App::$strings["recipient not found"] = "Empfänger nicht gefunden.";
+App::$strings["mail recalled"] = "Mail widerrufen";
+App::$strings["duplicate mail received"] = "Doppelte Mail erhalten";
+App::$strings["mail delivered"] = "Mail zugestellt";
+App::$strings["Delivery report for %1\$s"] = "Zustellungsbericht für %1\$s";
+App::$strings["Options"] = "Optionen";
+App::$strings["Redeliver"] = "Erneut zustellen";
App::$strings["webpage"] = "Webseite";
App::$strings["block"] = "Block";
App::$strings["layout"] = "Layout";
@@ -712,45 +787,34 @@ App::$strings["Import completed"] = "Import abgeschlossen";
App::$strings["Import Items"] = "Beiträge importieren";
App::$strings["Use this form to import existing posts and content from an export file."] = "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren.";
App::$strings["File to Upload"] = "Hochzuladende Datei:";
-App::$strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
-App::$strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
-App::$strings["Please join us on \$Projectname"] = "Schließe Dich uns auf \$Projectname an!";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines \$Projectname-Servers.";
-App::$strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
-App::$strings["%d message sent."] = array(
- 0 => "%d Nachricht gesendet.",
- 1 => "%d Nachrichten gesendet.",
-);
-App::$strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
-App::$strings["Send invitations"] = "Einladungen senden";
-App::$strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
-App::$strings["Please join my community on \$Projectname."] = "Schließe Dich uns auf \$Projectname an!";
-App::$strings["You will need to supply this invitation code:"] = "Bitte verwende bei der Registrierung den folgenden Einladungscode:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registriere Dich auf einem beliebigen \$Projectname-Hub (sie sind alle miteinander verbunden)";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Gib meine \$Projectname-Adresse im Suchfeld ein.";
-App::$strings["or visit"] = "oder besuche";
-App::$strings["3. Click [Connect]"] = "3. Klicke auf [Verbinden]";
-App::$strings["Block Name"] = "Block-Name";
-App::$strings["Title (optional)"] = "Titel (optional)";
-App::$strings["Edit Block"] = "Block bearbeiten";
-App::$strings["Privacy group created."] = "Gruppe wurde erstellt.";
-App::$strings["Could not create privacy group."] = "Gruppe konnte nicht erstellt werden.";
-App::$strings["Privacy group not found."] = "Gruppe nicht gefunden.";
-App::$strings["Privacy group updated."] = "Gruppe wurde aktualisiert.";
-App::$strings["Create a group of channels."] = "Erstelle eine Gruppe für Kanäle.";
-App::$strings["Privacy group name: "] = "Gruppenname:";
-App::$strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
-App::$strings["Privacy group removed."] = "Gruppe wurde entfernt.";
-App::$strings["Unable to remove privacy group."] = "Gruppe konnte nicht entfernt werden.";
-App::$strings["Privacy group editor"] = "Gruppeneditor";
-App::$strings["Members"] = "Mitglieder";
-App::$strings["All Connected Channels"] = "Alle verbundenen Kanäle";
-App::$strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
-App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
-App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
-App::$strings["Profile"] = "Profil";
-App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
-App::$strings["Visible To"] = "Sichtbar für";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
+App::$strings["Create a new channel"] = "Neuen Kanal anlegen";
+App::$strings["Create New"] = "Neu anlegen";
+App::$strings["Channel Manager"] = "Kanal-Manager";
+App::$strings["Current Channel"] = "Aktueller Kanal";
+App::$strings["Switch to one of your channels by selecting it."] = "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst.";
+App::$strings["Default Channel"] = "Standard Kanal";
+App::$strings["Make Default"] = "Zum Standard machen";
+App::$strings["%d new messages"] = "%d neue Nachrichten";
+App::$strings["%d new introductions"] = "%d neue Vorstellungen";
+App::$strings["Delegated Channel"] = "Delegierte Kanäle";
+App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
+App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
+App::$strings["Import completed."] = "Import abgeschlossen.";
+App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
+App::$strings["Import Channel"] = "Kanal importieren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
+App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
+App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
+App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
+App::$strings["Your old login password"] = "Dein altes Passwort";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
+App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
+App::$strings["Move this channel (disable all previous locations)"] = "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
+App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
+App::$strings["Visible to:"] = "Sichtbar für:";
App::$strings["Hub not found."] = "Server nicht gefunden.";
App::$strings["Unable to create element."] = "Element konnte nicht erstellt werden.";
App::$strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
@@ -781,6 +845,21 @@ App::$strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
App::$strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
App::$strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
App::$strings["Link text"] = "Link Text";
+App::$strings["App installed."] = "App installiert.";
+App::$strings["Malformed app."] = "Fehlerhafte App.";
+App::$strings["Embed code"] = "Code einbetten";
+App::$strings["Edit App"] = "App bearbeiten";
+App::$strings["Create App"] = "App erstellen";
+App::$strings["Name of app"] = "Name der App";
+App::$strings["Required"] = "Benötigt";
+App::$strings["Location (URL) of app"] = "Ort (URL) der App";
+App::$strings["Description"] = "Beschreibung";
+App::$strings["Photo icon URL"] = "URL zum Icon";
+App::$strings["80 x 80 pixels - optional"] = "80 x 80 Pixel – optional";
+App::$strings["Categories (optional, comma separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
+App::$strings["Version ID"] = "Versions-ID";
+App::$strings["Price of app"] = "Preis der App";
+App::$strings["Location (URL) to purchase app"] = "Ort (URL), um die App zu kaufen";
App::$strings["No ratings"] = "Keine Bewertungen";
App::$strings["Rating: "] = "Bewertung: ";
App::$strings["Website: "] = "Webseite: ";
@@ -791,78 +870,108 @@ App::$strings["Mood"] = "Laune";
App::$strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
App::$strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
App::$strings["System Notifications"] = "System-Benachrichtigungen";
-App::$strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
-App::$strings["Profile Photos"] = "Profilfotos";
-App::$strings["Album not found."] = "Album nicht gefunden.";
-App::$strings["Delete Album"] = "Album löschen";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Mehrere Speicherordner mit diesem Albumnamen sind bereits vorhanden, aber in verschiedenen Verzeichnissen. Bitte entfernen Sie den oder die gewünschten Ordner mit dem Dateimanager";
-App::$strings["Delete Photo"] = "Foto löschen";
-App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
-App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
-App::$strings["Upload Photos"] = "Fotos hochladen";
-App::$strings["Enter an album name"] = "Namen für ein neues Album eingeben";
-App::$strings["or select an existing album (doubleclick)"] = "oder ein bereits vorhandenes auswählen (Doppelklick)";
-App::$strings["Create a status post for this upload"] = "Einen Statusbeitrag für diesen Upload erzeugen";
-App::$strings["Caption (optional):"] = "Beschriftung (optional):";
-App::$strings["Description (optional):"] = "Beschreibung (optional):";
-App::$strings["Album name could not be decoded"] = "Albumname konnte nicht dekodiert werden";
-App::$strings["Contact Photos"] = "Kontakt-Bilder";
-App::$strings["Show Newest First"] = "Neueste zuerst anzeigen";
-App::$strings["Show Oldest First"] = "Älteste zuerst anzeigen";
-App::$strings["View Photo"] = "Foto ansehen";
-App::$strings["Edit Album"] = "Album bearbeiten";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
-App::$strings["Photo not available"] = "Foto nicht verfügbar";
-App::$strings["Use as profile photo"] = "Als Profilfoto verwenden";
-App::$strings["Use as cover photo"] = "Als Titelbild verwenden";
-App::$strings["Private Photo"] = "Privates Foto";
-App::$strings["Previous"] = "Voriges";
-App::$strings["View Full Size"] = "In voller Größe anzeigen";
-App::$strings["Next"] = "Nächste";
-App::$strings["Edit photo"] = "Foto bearbeiten";
-App::$strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
-App::$strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
-App::$strings["Move photo to album"] = "Foto in Album verschieben";
-App::$strings["Enter a new album name"] = "Gib einen Namen für ein neues Album ein";
-App::$strings["or select an existing one (doubleclick)"] = "oder wähle ein bereits vorhandenes aus (Doppelklick)";
-App::$strings["Caption"] = "Bildunterschrift";
-App::$strings["Add a Tag"] = "Schlagwort hinzufügen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Beispiele: @ben, @Karl_Prester, @lieschen@example.com";
-App::$strings["Flag as adult in album view"] = "In der Albumansicht als nicht jugendfrei markieren";
-App::$strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
-App::$strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
-App::$strings["Share"] = "Teilen";
-App::$strings["Please wait"] = "Bitte warten";
-App::$strings["This is you"] = "Das bist Du";
-App::$strings["Comment"] = "Kommentar";
-App::$strings["Preview"] = "Vorschau";
-App::$strings["__ctx:title__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:title__ Dislikes"] = "Gefällt mir nicht";
-App::$strings["__ctx:title__ Agree"] = "Zustimmungen";
-App::$strings["__ctx:title__ Disagree"] = "Ablehnungen";
-App::$strings["__ctx:title__ Abstain"] = "Enthaltungen";
-App::$strings["__ctx:title__ Attending"] = "Zusagen";
-App::$strings["__ctx:title__ Not attending"] = "Absagen";
-App::$strings["__ctx:title__ Might attend"] = "Vielleicht";
-App::$strings["View all"] = "Alles anzeigen";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Gefällt mir",
- 1 => "Gefällt mir",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "Gefällt nicht",
- 1 => "Gefällt nicht",
+App::$strings["Profile not found."] = "Profil nicht gefunden.";
+App::$strings["Profile deleted."] = "Profil gelöscht.";
+App::$strings["Profile-"] = "Profil-";
+App::$strings["New profile created."] = "Neues Profil erstellt.";
+App::$strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
+App::$strings["Profile unavailable to export."] = "Dieses Profil kann nicht exportiert werden.";
+App::$strings["Profile Name is required."] = "Profil-Name erforderlich.";
+App::$strings["Marital Status"] = "Familienstand";
+App::$strings["Romantic Partner"] = "Romantische Partner";
+App::$strings["Likes"] = "Gefällt";
+App::$strings["Dislikes"] = "Gefällt nicht";
+App::$strings["Work/Employment"] = "Arbeit/Anstellung";
+App::$strings["Religion"] = "Religion";
+App::$strings["Political Views"] = "Politische Ansichten";
+App::$strings["Gender"] = "Geschlecht";
+App::$strings["Sexual Preference"] = "Sexuelle Orientierung";
+App::$strings["Homepage"] = "Webseite";
+App::$strings["Interests"] = "Hobbys/Interessen";
+App::$strings["Profile updated."] = "Profil aktualisiert.";
+App::$strings["Hide your connections list from viewers of this profile"] = "Deine Verbindungen vor Betrachtern dieses Profils verbergen";
+App::$strings["Edit Profile Details"] = "Bearbeite Profil-Details";
+App::$strings["View this profile"] = "Dieses Profil ansehen";
+App::$strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+App::$strings["Profile Tools"] = "Profilwerkzeuge";
+App::$strings["Change cover photo"] = "Titelbild ändern";
+App::$strings["Change profile photo"] = "Profilfoto ändern";
+App::$strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
+App::$strings["Clone this profile"] = "Dieses Profil klonen";
+App::$strings["Delete this profile"] = "Dieses Profil löschen";
+App::$strings["Add profile things"] = "Sachen zum Profil hinzufügen";
+App::$strings["Personal"] = "Persönlich";
+App::$strings["Relation"] = "Beziehung";
+App::$strings["Miscellaneous"] = "Verschiedenes";
+App::$strings["Import profile from file"] = "Profil aus einer Datei importieren";
+App::$strings["Export profile to file"] = "Profil in eine Datei exportieren";
+App::$strings["Your gender"] = "Dein Geschlecht";
+App::$strings["Marital status"] = "Familienstand";
+App::$strings["Sexual preference"] = "Sexuelle Orientierung";
+App::$strings["Profile name"] = "Profilname";
+App::$strings["This is your default profile."] = "Das ist Dein Standardprofil.";
+App::$strings["Your full name"] = "Dein voller Name";
+App::$strings["Title/Description"] = "Titel/Beschreibung";
+App::$strings["Street address"] = "Straße und Hausnummer";
+App::$strings["Locality/City"] = "Wohnort";
+App::$strings["Region/State"] = "Region/Bundesstaat";
+App::$strings["Postal/Zip code"] = "Postleitzahl";
+App::$strings["Who (if applicable)"] = "Wer (falls anwendbar)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
+App::$strings["Since (date)"] = "Seit (Datum)";
+App::$strings["Tell us about yourself"] = "Erzähle uns ein wenig von Dir";
+App::$strings["Homepage URL"] = "Homepage-URL";
+App::$strings["Hometown"] = "Heimatort";
+App::$strings["Political views"] = "Politische Ansichten";
+App::$strings["Religious views"] = "Religiöse Ansichten";
+App::$strings["Keywords used in directory listings"] = "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden";
+App::$strings["Example: fishing photography software"] = "Beispiel: Angeln Fotografie Software";
+App::$strings["Musical interests"] = "Musikalische Interessen";
+App::$strings["Books, literature"] = "Bücher, Literatur";
+App::$strings["Television"] = "Fernsehen";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
+App::$strings["Hobbies/Interests"] = "Hobbys/Interessen";
+App::$strings["Love/Romance"] = "Liebe/Romantik";
+App::$strings["School/Education"] = "Schule/Ausbildung";
+App::$strings["Contact information and social networks"] = "Kontaktinformation und soziale Netzwerke";
+App::$strings["My other channels"] = "Meine anderen Kanäle";
+App::$strings["Profile Image"] = "Profilfoto:";
+App::$strings["Edit Profiles"] = "Profile bearbeiten";
+App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
+App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
+App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
+App::$strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
+App::$strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
+App::$strings["Please join us on \$Projectname"] = "Schließe Dich uns auf \$Projectname an!";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines \$Projectname-Servers.";
+App::$strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d Nachricht gesendet.",
+ 1 => "%d Nachrichten gesendet.",
);
-App::$strings["Photo Tools"] = "Fotowerkzeuge";
-App::$strings["In This Photo:"] = "Auf diesem Foto:";
-App::$strings["Map"] = "Karte";
-App::$strings["__ctx:noun__ Likes"] = "Gefällt mir";
-App::$strings["__ctx:noun__ Dislikes"] = "Gefällt nicht";
-App::$strings["Close"] = "Schließen";
-App::$strings["View Album"] = "Album ansehen";
-App::$strings["Recent Photos"] = "Neueste Fotos";
+App::$strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
+App::$strings["Send invitations"] = "Einladungen senden";
+App::$strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
+App::$strings["Your message:"] = "Deine Nachricht:";
+App::$strings["Please join my community on \$Projectname."] = "Schließe Dich uns auf \$Projectname an!";
+App::$strings["You will need to supply this invitation code:"] = "Bitte verwende bei der Registrierung den folgenden Einladungscode:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registriere Dich auf einem beliebigen \$Projectname-Hub (sie sind alle miteinander verbunden)";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Gib meine \$Projectname-Adresse im Suchfeld ein.";
+App::$strings["or visit"] = "oder besuche";
+App::$strings["3. Click [Connect]"] = "3. Klicke auf [Verbinden]";
+App::$strings["About this site"] = "Ãœber diese Seite";
+App::$strings["Site Name"] = "Seitenname";
+App::$strings["Administrator"] = "Administrator";
+App::$strings["Software and Project information"] = "Software und Projektinformationen";
+App::$strings["This site is powered by \$Projectname"] = "Diese Website wird bereitgestellt durch \$Projectname";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot";
+App::$strings["Version %s"] = "Version %s";
+App::$strings["Project homepage"] = "Projekt-Website";
+App::$strings["Developer homepage"] = "Entwickler-Website";
+App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
+App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
+App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
App::$strings["\$Projectname Server - Setup"] = "\$Projectname Server-Einrichtung";
App::$strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Konnte die angegebene Webseiten-URL nicht erreichen. Möglicherweise ein Problem mit dem SSL-Zertifikat oder dem DNS.";
@@ -951,11 +1060,6 @@ App::$strings["The database configuration file \".htconfig.php\" could not be wr
App::$strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
App::$strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten.";
-App::$strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
-App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
-App::$strings["Create Channel"] = "Einen neuen Kanal anlegen";
-App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Ein Kanal ist Deine Identität in diesem Netzwerk. Er kann eine Person, ein Blog oder ein Forum repräsentieren, nur um ein paar Beispiele zu nennen. Kanäle können Verbindungen miteinander eingehen, um Informationen zu teilen, jeweils basierend auf sehr detaillierten Berechtigungseinstellungen.";
-App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "oder <a href=\"import\">importiere einen bestehenden Kanal</a> von einem anderen Server.";
App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
App::$strings["Poke"] = "Anstupsen";
App::$strings["Poke somebody"] = "Jemanden anstupsen";
@@ -964,79 +1068,20 @@ App::$strings["Poke, prod or do other things to somebody"] = "Jemanden anstupsen
App::$strings["Recipient"] = "Empfänger";
App::$strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
App::$strings["Make this post private"] = "Diesen Beitrag privat machen";
-App::$strings["Profile not found."] = "Profil nicht gefunden.";
-App::$strings["Profile deleted."] = "Profil gelöscht.";
-App::$strings["Profile-"] = "Profil-";
-App::$strings["New profile created."] = "Neues Profil erstellt.";
-App::$strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
-App::$strings["Profile unavailable to export."] = "Dieses Profil kann nicht exportiert werden.";
-App::$strings["Profile Name is required."] = "Profil-Name erforderlich.";
-App::$strings["Marital Status"] = "Familienstand";
-App::$strings["Romantic Partner"] = "Romantische Partner";
-App::$strings["Likes"] = "Gefällt";
-App::$strings["Dislikes"] = "Gefällt nicht";
-App::$strings["Work/Employment"] = "Arbeit/Anstellung";
-App::$strings["Religion"] = "Religion";
-App::$strings["Political Views"] = "Politische Ansichten";
-App::$strings["Gender"] = "Geschlecht";
-App::$strings["Sexual Preference"] = "Sexuelle Orientierung";
-App::$strings["Homepage"] = "Webseite";
-App::$strings["Interests"] = "Hobbys/Interessen";
-App::$strings["Profile updated."] = "Profil aktualisiert.";
-App::$strings["Hide your connections list from viewers of this profile"] = "Deine Verbindungen vor Betrachtern dieses Profils verbergen";
-App::$strings["Edit Profile Details"] = "Bearbeite Profil-Details";
-App::$strings["View this profile"] = "Dieses Profil ansehen";
-App::$strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-App::$strings["Profile Tools"] = "Profilwerkzeuge";
-App::$strings["Change cover photo"] = "Titelbild ändern";
-App::$strings["Change profile photo"] = "Profilfoto ändern";
-App::$strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
-App::$strings["Clone this profile"] = "Dieses Profil klonen";
-App::$strings["Delete this profile"] = "Dieses Profil löschen";
-App::$strings["Add profile things"] = "Sachen zum Profil hinzufügen";
-App::$strings["Personal"] = "Persönlich";
-App::$strings["Relation"] = "Beziehung";
-App::$strings["Miscellaneous"] = "Verschiedenes";
-App::$strings["Import profile from file"] = "Profil aus einer Datei importieren";
-App::$strings["Export profile to file"] = "Profil in eine Datei exportieren";
-App::$strings["Your gender"] = "Dein Geschlecht";
-App::$strings["Marital status"] = "Familienstand";
-App::$strings["Sexual preference"] = "Sexuelle Orientierung";
-App::$strings["Profile name"] = "Profilname";
-App::$strings["This is your default profile."] = "Das ist Dein Standardprofil.";
-App::$strings["Your full name"] = "Dein voller Name";
-App::$strings["Title/Description"] = "Titel/Beschreibung";
-App::$strings["Street address"] = "Straße und Hausnummer";
-App::$strings["Locality/City"] = "Wohnort";
-App::$strings["Region/State"] = "Region/Bundesstaat";
-App::$strings["Postal/Zip code"] = "Postleitzahl";
-App::$strings["Country"] = "Land";
-App::$strings["Who (if applicable)"] = "Wer (falls anwendbar)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
-App::$strings["Since (date)"] = "Seit (Datum)";
-App::$strings["Tell us about yourself"] = "Erzähle uns ein wenig von Dir";
-App::$strings["Homepage URL"] = "Homepage-URL";
-App::$strings["Hometown"] = "Heimatort";
-App::$strings["Political views"] = "Politische Ansichten";
-App::$strings["Religious views"] = "Religiöse Ansichten";
-App::$strings["Keywords used in directory listings"] = "Schlüsselwörter, die in Verzeichnis-Auflistungen verwendet werden";
-App::$strings["Example: fishing photography software"] = "Beispiel: Angeln Fotografie Software";
-App::$strings["Musical interests"] = "Musikalische Interessen";
-App::$strings["Books, literature"] = "Bücher, Literatur";
-App::$strings["Television"] = "Fernsehen";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
-App::$strings["Hobbies/Interests"] = "Hobbys/Interessen";
-App::$strings["Love/Romance"] = "Liebe/Romantik";
-App::$strings["School/Education"] = "Schule/Ausbildung";
-App::$strings["Contact information and social networks"] = "Kontaktinformation und soziale Netzwerke";
-App::$strings["My other channels"] = "Meine anderen Kanäle";
-App::$strings["Profile Image"] = "Profilfoto:";
-App::$strings["Edit Profiles"] = "Profile bearbeiten";
App::$strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
App::$strings["Post successful."] = "Veröffentlichung erfolgreich.";
+App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
+App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
+App::$strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
+App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
+App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
App::$strings["This setting requires special processing and editing has been blocked."] = "Diese Einstellung erfordert eine besondere Verarbeitung und ist blockiert.";
App::$strings["Configuration Editor"] = "Konfigurationseditor";
App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Warnung: Einige Einstellungen können Deinen Kanal funktionsunfähig machen. Bitte verlasse diese Seite, es sei denn Du bist vertraut damit, wie dieses Feature korrekt verwendet wird.";
+App::$strings["vcard"] = "VCard";
App::$strings["Blocks"] = "Blöcke";
App::$strings["Block Title"] = "Titel des Blocks";
App::$strings["Layouts"] = "Layouts";
@@ -1048,54 +1093,54 @@ App::$strings["Website:"] = "Webseite:";
App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanal [%s] (auf diesem Server noch unbekannt)";
App::$strings["Rating (this information is public)"] = "Bewertung (öffentlich sichtbar)";
App::$strings["Optionally explain your rating (this information is public)"] = "Optional kannst du deine Bewertung erklären (öffentlich sichtbar)";
-App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
-App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
-App::$strings["Invalid request."] = "Ungültige Anfrage.";
-App::$strings["channel"] = "Kanal";
-App::$strings["thing"] = "Sache";
-App::$strings["Channel unavailable."] = "Kanal nicht vorhanden.";
-App::$strings["Previous action reversed."] = "Die vorherige Aktion wurde rückgängig gemacht.";
-App::$strings["photo"] = "Foto";
-App::$strings["status"] = "Status";
-App::$strings["event"] = "Termin";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s stimmt %2\$ss %3\$s zu";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s lehnt %2\$ss %3\$s ab";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s enthält sich zu %2\$ss %3\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s teil";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %3\$s nicht teil";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
-App::$strings["Action completed."] = "Aktion durchgeführt.";
-App::$strings["Thank you."] = "Vielen Dank.";
App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird.";
App::$strings["Use Photo for Profile"] = "Foto für Profil verwenden";
App::$strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
App::$strings["Use"] = "Verwenden";
-App::$strings["Items tagged with: %s"] = "Beiträge mit Schlagwort: %s";
-App::$strings["Search results for: %s"] = "Suchergebnisse für: %s";
+App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
+App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
+App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
+App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
+App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
+App::$strings["Event not found."] = "Termin nicht gefunden.";
+App::$strings["Edit event title"] = "Termintitel bearbeiten";
+App::$strings["Event title"] = "Termintitel";
+App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
+App::$strings["Edit Category"] = "Kategorie bearbeiten";
+App::$strings["Category"] = "Kategorie";
+App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
+App::$strings["Start date and time"] = "Startdatum und -zeit";
+App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
+App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
+App::$strings["Finish date and time"] = "Enddatum und -zeit";
+App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
+App::$strings["Edit Description"] = "Beschreibung bearbeiten";
+App::$strings["Edit Location"] = "Ort bearbeiten";
+App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
+App::$strings["Timezone:"] = "Zeitzone:";
+App::$strings["Advanced Options"] = "Weitere Optionen";
+App::$strings["Edit event"] = "Termin bearbeiten";
+App::$strings["Delete event"] = "Termin löschen";
+App::$strings["calendar"] = "Kalender";
+App::$strings["Month"] = "Monat";
+App::$strings["Week"] = "Woche";
+App::$strings["Day"] = "Tag";
+App::$strings["Event removed"] = "Termin gelöscht";
+App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
App::$strings["No channel."] = "Kein Kanal.";
App::$strings["Common connections"] = "Gemeinsame Verbindungen";
App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
-App::$strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
-App::$strings["Return to your app and insert this Security Code:"] = "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:";
-App::$strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest Du dieser Anwendung erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?";
-App::$strings["sent you a private message"] = "hat Dir eine private Nachricht geschickt";
-App::$strings["added your channel"] = "hat deinen Kanal hinzugefügt";
-App::$strings["g A l F d"] = "l, d. F, G:i \\U\\h\\r";
-App::$strings["[today]"] = "[Heute]";
-App::$strings["posted an event"] = "hat einen Termin veröffentlicht";
-App::$strings["About this site"] = "Ãœber diese Seite";
-App::$strings["Site Name"] = "Seitenname";
-App::$strings["Administrator"] = "Administrator";
-App::$strings["Software and Project information"] = "Software und Projektinformationen";
-App::$strings["This site is powered by \$Projectname"] = "Diese Website wird bereitgestellt durch \$Projectname";
-App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot";
-App::$strings["Version %s"] = "Version %s";
-App::$strings["Project homepage"] = "Projekt-Website";
-App::$strings["Developer homepage"] = "Entwickler-Website";
+App::$strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
+App::$strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
+App::$strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
+App::$strings["Profile"] = "Profil";
+App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
+App::$strings["Visible To"] = "Sichtbar für";
+App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
+App::$strings["Posts and comments"] = "Beiträge und Kommentare";
+App::$strings["Only posts"] = "Nur Beiträge";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
App::$strings["No valid account found."] = "Kein gültiges Konto gefunden.";
App::$strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
App::$strings["Site Member (%s)"] = "Nutzer (%s)";
@@ -1116,7 +1161,7 @@ App::$strings["Select a bookmark folder"] = "Lesezeichenordner wählen";
App::$strings["Save Bookmark"] = "Lesezeichen speichern";
App::$strings["URL of bookmark"] = "URL des Lesezeichens";
App::$strings["Or enter new bookmark folder name"] = "Oder gib einen neuen Namen für den Lesezeichenordner ein";
-App::$strings["This directory server requires an access token"] = "Dieser Verzeichnisserver benötigt einen Zugriffstoken";
+App::$strings["Channel added."] = "Kanal hinzugefügt.";
App::$strings["Authentication failed."] = "Authentifizierung fehlgeschlagen.";
App::$strings["Remote Authentication"] = "Entfernte Authentifizierung";
App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z. B. channel@example.com)";
@@ -1146,33 +1191,37 @@ App::$strings["You may also export your posts and conversations for a particular
App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Jahres, zum Beispiel dieses Jahres, auszuwählen, klicke <a href=\"%1\$s\">%2\$s</a>.";
App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Um alle Beiträge eines bestimmten Monats auszuwählen, zum Beispiel vom Januar diesen Jahres, klicke <a href=\"%1\$s\">%2\$s</a>.";
App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a href=\"%1\$s\">%2\$s</a> auf jeglichem Hub besuchst, der diesen Kanal enthält. Das funktioniert am besten, wenn Du dabei die zeitliche Reihenfolge einhältst, also die Sicherungen für den ältesten Zeitraum zuerst importierst.";
-App::$strings["Permissions denied."] = "Berechtigung verweigert.";
-App::$strings["l, F j"] = "l, j. F";
-App::$strings["Link to Source"] = "Link zur Quelle";
-App::$strings["Edit Event"] = "Termin bearbeiten";
-App::$strings["Create Event"] = "Termin anlegen";
-App::$strings["Export"] = "Exportieren";
-App::$strings["Import"] = "Import";
-App::$strings["Today"] = "Heute";
-App::$strings["# Accounts"] = "Anzahl der Konten";
-App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
-App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
-App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
-App::$strings["# Channels"] = "Anzahl der Kanäle";
-App::$strings["# primary"] = "Anzahl der primären Kanäle";
-App::$strings["# clones"] = "Anzahl der Klone";
-App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
-App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
-App::$strings["Summary"] = "Zusammenfassung";
-App::$strings["Registered accounts"] = "Registrierte Konten";
-App::$strings["Pending registrations"] = "Ausstehende Registrierungen";
-App::$strings["Registered channels"] = "Registrierte Kanäle";
-App::$strings["Active plugins"] = "Aktive Plug-Ins";
-App::$strings["Version"] = "Version";
-App::$strings["Repository version (master)"] = "Repository-Version (master)";
-App::$strings["Repository version (dev)"] = "Repository-Version (dev)";
-App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
-App::$strings["Visible to:"] = "Sichtbar für:";
+App::$strings["%d rating"] = array(
+ 0 => "%d Bewertung",
+ 1 => "%d Bewertungen",
+);
+App::$strings["Gender: "] = "Geschlecht:";
+App::$strings["Status: "] = "Status:";
+App::$strings["Homepage: "] = "Webseite:";
+App::$strings["Age:"] = "Alter:";
+App::$strings["Location:"] = "Ort:";
+App::$strings["Description:"] = "Beschreibung:";
+App::$strings["Hometown:"] = "Heimatstadt:";
+App::$strings["About:"] = "Ãœber:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["Public Forum:"] = "Öffentliches Forum:";
+App::$strings["Keywords: "] = "Schlüsselwörter:";
+App::$strings["Don't suggest"] = "Nicht vorschlagen";
+App::$strings["Common connections:"] = "Gemeinsame Verbindungen:";
+App::$strings["Global Directory"] = "Globales Verzeichnis";
+App::$strings["Local Directory"] = "Lokales Verzeichnis";
+App::$strings["Finding:"] = "Ergebnisse:";
+App::$strings["Channel Suggestions"] = "Kanal-Vorschläge";
+App::$strings["next page"] = "nächste Seite";
+App::$strings["previous page"] = "vorherige Seite";
+App::$strings["Sort options"] = "Sortieroptionen";
+App::$strings["Alphabetic"] = "alphabetisch";
+App::$strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
+App::$strings["Newest to Oldest"] = "Neueste zuerst";
+App::$strings["Oldest to Newest"] = "Älteste zuerst";
+App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
+App::$strings["Away"] = "Abwesend";
+App::$strings["Online"] = "Online";
App::$strings["No service class restrictions found."] = "Keine Dienstklassenbeschränkungen gefunden.";
App::$strings["Import Webpage Elements"] = "Webseitenelemente importieren";
App::$strings["Import selected"] = "Import ausgewählt";
@@ -1197,11 +1246,9 @@ App::$strings["Files: shared with me"] = "Dateien, die mit mir geteilt wurden";
App::$strings["NEW"] = "NEU";
App::$strings["Remove all files"] = "Alle Dateien löschen";
App::$strings["Remove this file"] = "Diese Datei löschen";
+App::$strings["Profile Unavailable."] = "Profil nicht verfügbar.";
App::$strings["Not found"] = "Nicht gefunden";
App::$strings["Invalid channel"] = "Ungültiger Kanal";
-App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
-App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
-App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:";
App::$strings["Wikis"] = "Wikis";
App::$strings["Download"] = "Herunterladen";
App::$strings["Wiki name"] = "Name des Wiki";
@@ -1212,7 +1259,7 @@ App::$strings["Rename page"] = "Seite umbenennen";
App::$strings["Error retrieving page content"] = "Fehler beim Abrufen des Seiteninhalts";
App::$strings["Revision Comparison"] = "Revisionsvergleich";
App::$strings["Revert"] = "Rückgängig machen";
-App::$strings["Choose an available wiki from the list on the left."] = "Wähle ein vorhandenes Wiki aus der Liste auf der linken Seite aus.";
+App::$strings["Short description of your changes (optional)"] = "Kurze Beschreibung Ihrer Änderungen (optional)";
App::$strings["Source"] = "Quelle";
App::$strings["New page name"] = "Neuer Seitenname";
App::$strings["Embed image from photo albums"] = "Bild aus Fotoalben einbetten";
@@ -1220,14 +1267,20 @@ App::$strings["Embed an image from your albums"] = "Betten Sie ein Bild aus Ihre
App::$strings["OK"] = "Ok";
App::$strings["Choose images to embed"] = "Wählen Sie Bilder zum Einbetten aus";
App::$strings["Choose an album"] = "Wählen Sie ein Album aus";
-App::$strings["Choose a different album..."] = "Wählen Sie ein anderes Album aus...";
+App::$strings["Choose a different album"] = "Wählen Sie ein anderes Album aus";
App::$strings["Error getting album list"] = "Fehler beim Holen der Albenliste";
App::$strings["Error getting photo link"] = "Fehler beim Holen des Fotolinks";
App::$strings["Error getting album"] = "Fehler beim Holen des Albums";
App::$strings["Error creating wiki. Invalid name."] = "Fehler beim Erstellen des Wiki. Ungültiger Name.";
App::$strings["Wiki created, but error creating Home page."] = "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite";
App::$strings["Error creating wiki"] = "Fehler beim Erstellen des Wiki";
+App::$strings["Wiki delete permission denied."] = "Wiki-Löschberechtigung verweigert.";
+App::$strings["Error deleting wiki"] = "Fehler beim Löschen des Wiki";
App::$strings["New page created"] = "Neue Seite erstellt";
+App::$strings["Cannot delete Home"] = "Kann die Startseite nicht löschen";
+App::$strings["Current Revision"] = "Aktuelle Revision";
+App::$strings["Selected Revision"] = "Ausgewählte Revision";
+App::$strings["You must be authenticated."] = "Sie müssen authenzifiziert sein.";
App::$strings["Failed to create source. No channel selected."] = "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt.";
App::$strings["Source created."] = "Quelle erstellt.";
App::$strings["Source updated."] = "Quelle aktualisiert.";
@@ -1269,15 +1322,6 @@ App::$strings["Connected Apps"] = "Verbundene Apps";
App::$strings["Client key starts with"] = "Client Key beginnt mit";
App::$strings["No name"] = "Kein Name";
App::$strings["Remove authorization"] = "Authorisierung aufheben";
-App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
-App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
-App::$strings["Token saved."] = "Token gespeichert.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
-App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
-App::$strings["Login Name"] = "Anmeldename";
-App::$strings["Login Password"] = "Anmeldepasswort";
-App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
App::$strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
App::$strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
App::$strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
@@ -1296,6 +1340,21 @@ App::$strings["Your technical skill level"] = "Deine technische Qualifikationsst
App::$strings["Used to provide a member experience matched to your comfort level"] = "Dies wird verwendet, um Dir eine Benutzererfahrung passend zu Deiner technischen Qualifikationsstufe zu bieten.";
App::$strings["Email Address:"] = "Email Adresse:";
App::$strings["Remove this account including all its channels"] = "Dieses Konto inklusive all seiner Kanäle löschen";
+App::$strings["This channel is limited to %d tokens"] = "Dieser Kanal ist auf %d Token begrenzt";
+App::$strings["Name and Password are required."] = "Name und Passwort sind erforderlich.";
+App::$strings["Token saved."] = "Token gespeichert.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Mit diesem Formular kannst Du temporäre Zugangs-IDs anlegen, um Inhalte mit Nicht-Mitgliedern zu teilen. Die IDs können in Berechtigungslisten (ACLs) verwendet werden, und Besucher können sich damit einloggen, um auf private Inhalte zuzugreifen.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:";
+App::$strings["Guest Access Tokens"] = "Gastzugangstoken";
+App::$strings["Login Name"] = "Anmeldename";
+App::$strings["Login Password"] = "Anmeldepasswort";
+App::$strings["Expires (yyyy-mm-dd)"] = "Läuft ab (jjjj-mm-tt)";
+App::$strings["Affinity Slider settings updated."] = "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert.";
+App::$strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
+App::$strings["Default maximum affinity level"] = "Voreinstellung für maximalen Beziehungsgrad";
+App::$strings["Default minimum affinity level"] = "Voreinstellung für minimalen Beziehungsgrad";
+App::$strings["Affinity Slider Settings"] = "Beziehungsgrad-Schieberegler-Einstellungen";
+App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
App::$strings["Settings updated."] = "Einstellungen aktualisiert.";
App::$strings["Nobody except yourself"] = "Niemand außer Dir selbst";
App::$strings["Only those you specifically allow"] = "Nur die, denen Du es explizit erlaubst";
@@ -1340,6 +1399,7 @@ App::$strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern
App::$strings["Default Access Control List (ACL)"] = "Standard-Zugriffsberechtigungsliste (ACL)";
App::$strings["Use my default audience setting for the type of object published"] = "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps";
App::$strings["Channel permissions category:"] = "Zugriffsrechte-Kategorie des Kanals:";
+App::$strings["Default Permissions Group"] = "Standard-Berechtigungsgruppe";
App::$strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:";
App::$strings["Useful to reduce spamming"] = "Nützlich, um Spam zu verringern";
App::$strings["Notification Settings"] = "Benachrichtigungs-Einstellungen";
@@ -1356,6 +1416,7 @@ App::$strings["You receive a private message"] = "Du eine private Nachricht erhÃ
App::$strings["You receive a friend suggestion"] = "Du einen Kontaktvorschlag erhältst";
App::$strings["You are tagged in a post"] = "Du in einem Beitrag erwähnt wurdest";
App::$strings["You are poked/prodded/etc. in a post"] = "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest";
+App::$strings["Someone likes your post/comment"] = "Jemand mag Ihren Beitrag/Kommentar";
App::$strings["Show visual notifications including:"] = "Visuelle Benachrichtigungen anzeigen für:";
App::$strings["Unseen grid activity"] = "Ungesehene Netzwerk-Aktivität";
App::$strings["Unseen channel activity"] = "Ungesehene Kanal-Aktivität";
@@ -1401,7 +1462,7 @@ App::$strings["Maximum number of conversations to load at any time:"] = "Maximal
App::$strings["Maximum of 100 items"] = "Maximum: 100 Beiträge";
App::$strings["Show emoticons (smilies) as images"] = "Emoticons (Smilies) als Bilder anzeigen";
App::$strings["Manual conversation updates"] = "Manuelle Konversationsaktualisierung";
-App::$strings["Default is automatic, which may increase screen jumping"] = "Voreinstellung ist Automatisch, was aber das Springen der Seitenanzeige erhöhen kann.";
+App::$strings["Default is on, turning this off may increase screen jumping"] = "Voreinstellung ist An, dies abzuschalten kann das unerwartete Springen der Seitenanzeige erhöhen.";
App::$strings["Link post titles to source"] = "Beitragstitel zum Originalbeitrag verlinken";
App::$strings["System Page Layout Editor - (advanced)"] = "System-Seitenlayout-Editor (für Experten)";
App::$strings["Use blog/list mode on channel page"] = "Blog-/Listenmodus auf der Kanalseite verwenden";
@@ -1410,8 +1471,10 @@ App::$strings["Use blog/list mode on grid page"] = "Blog-/Listenmodus auf der Ne
App::$strings["Channel page max height of content (in pixels)"] = "Maximale Höhe von Beitragsblöcken auf der Kanalseite (in Pixeln)";
App::$strings["click to expand content exceeding this height"] = "Blöcke, deren Inhalt diese Höhe überschreitet, können per Klick vergrößert werden.";
App::$strings["Grid page max height of content (in pixels)"] = "Maximale Höhe (in Pixel) des Inhalts der Netzwerkseite";
-App::$strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
-App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
+App::$strings["Permission category saved."] = "Berechtigungsrolle gespeichert.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen.";
+App::$strings["Permission Categories"] = "Berechtigungsrollen";
+App::$strings["Permission Name"] = "Name der Berechtigungsrolle";
App::$strings["Tag removed"] = "Schlagwort entfernt";
App::$strings["Remove Item Tag"] = "Schlagwort entfernen";
App::$strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
@@ -1429,21 +1492,31 @@ App::$strings["Name of thing e.g. something"] = "Name der Sache, z. B. irgendwas
App::$strings["URL of thing (optional)"] = "URL der Sache (optional)";
App::$strings["URL for photo of thing (optional)"] = "URL eines Fotos der Sache (optional)";
App::$strings["Add Thing to your Profile"] = "Die Sache Deinem Profil hinzufügen";
-App::$strings["Your service plan only allows %d channels."] = "Dein Vertrag erlaubt nur %d Kanäle.";
-App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
-App::$strings["No channel. Import failed."] = "Kein Kanal. Import fehlgeschlagen.";
-App::$strings["Import completed."] = "Import abgeschlossen.";
-App::$strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
-App::$strings["Import Channel"] = "Kanal importieren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren.";
-App::$strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen \$Projectname-Hubs ein";
-App::$strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
-App::$strings["Your old login email address"] = "Deine alte Login-E-Mail-Adresse";
-App::$strings["Your old login password"] = "Dein altes Passwort";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige \$Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein.";
-App::$strings["Make this hub my primary location"] = "Dieser $Pojectname-Hub ist mein primärer Hub.";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importiere bestehende Beiträge falls möglich (experimentell - begrenzt durch zur Verfügung stehenden Speicher";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur einmal ab und lasse diese Seite bis zur Fertigstellung offen.";
+App::$strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
+App::$strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
+App::$strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
+App::$strings["Messages"] = "Nachrichten";
+App::$strings["Message recalled."] = "Nachricht widerrufen.";
+App::$strings["Conversation removed."] = "Unterhaltung gelöscht.";
+App::$strings["Please enter a link URL:"] = "Gib eine URL ein:";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Verfällt YYYY-MM-DD HH;MM";
+App::$strings["Requested channel is not in this network"] = "Angeforderter Kanal ist nicht in diesem Netzwerk.";
+App::$strings["Send Private Message"] = "Private Nachricht senden";
+App::$strings["To:"] = "An:";
+App::$strings["Subject:"] = "Betreff:";
+App::$strings["Attach file"] = "Datei anhängen";
+App::$strings["Send"] = "Absenden";
+App::$strings["Set expiration date"] = "Verfallsdatum";
+App::$strings["Encrypt text"] = "Text verschlüsseln";
+App::$strings["Delete message"] = "Nachricht löschen";
+App::$strings["Delivery report"] = "Zustellungsbericht";
+App::$strings["Recall message"] = "Nachricht widerrufen";
+App::$strings["Message has been recalled."] = "Die Nachricht wurde widerrufen.";
+App::$strings["Delete Conversation"] = "Unterhaltung löschen";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Keine sichere Kommunikation verfügbar. <strong>Eventuell</strong> kannst Du auf der Profilseite des Absenders antworten.";
+App::$strings["Send Reply"] = "Antwort senden";
+App::$strings["Your message for %s (%s):"] = "Deine Nachricht für %s (%s):";
App::$strings["No connections."] = "Keine Verbindungen.";
App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
App::$strings["View Connections"] = "Verbindungen anzeigen";
@@ -1463,65 +1536,56 @@ App::$strings["Expiration"] = "Verfall";
App::$strings["min"] = "min";
App::$strings["Xchan Lookup"] = "Xchan-Suche";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
-App::$strings["Calendar entries imported."] = "Kalendereinträge wurden importiert.";
-App::$strings["No calendar entries found."] = "Keine Kalendereinträge gefunden.";
-App::$strings["Event can not end before it has started."] = "Termin-Ende liegt vor dem Beginn.";
-App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt werden.";
-App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
-App::$strings["Event not found."] = "Termin nicht gefunden.";
-App::$strings["Edit event title"] = "Termintitel bearbeiten";
-App::$strings["Event title"] = "Termintitel";
-App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
-App::$strings["Edit Category"] = "Kategorie bearbeiten";
-App::$strings["Category"] = "Kategorie";
-App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
-App::$strings["Start date and time"] = "Startdatum und -zeit";
-App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
-App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
-App::$strings["Finish date and time"] = "Enddatum und -zeit";
-App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
-App::$strings["Edit Description"] = "Beschreibung bearbeiten";
-App::$strings["Edit Location"] = "Ort bearbeiten";
-App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
-App::$strings["Advanced Options"] = "Weitere Optionen";
-App::$strings["Edit event"] = "Termin bearbeiten";
-App::$strings["Delete event"] = "Termin löschen";
-App::$strings["calendar"] = "Kalender";
-App::$strings["Month"] = "Monat";
-App::$strings["Week"] = "Woche";
-App::$strings["Day"] = "Tag";
-App::$strings["Event removed"] = "Termin gelöscht";
-App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
App::$strings["Missing room name"] = "Der Chatraum hat keinen Namen";
App::$strings["Duplicate room name"] = "Name des Chatraums bereits vergeben";
App::$strings["Invalid room specifier."] = "Ungültiger Raumbezeichner.";
App::$strings["Room not found."] = "Chatraum konnte nicht gefunden werden.";
App::$strings["Room is full"] = "Der Chatraum ist voll";
-App::$strings["Site Admin"] = "Hub-Administration";
-App::$strings["Report Bug"] = "Fehler melden";
-App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
-App::$strings["My Chatrooms"] = "Meine Chaträume";
-App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
-App::$strings["Remote Diagnostics"] = "Ferndiagnose";
-App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
-App::$strings["Login"] = "Anmelden";
-App::$strings["Grid"] = "Grid";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mein Kanal";
-App::$strings["Events"] = "Termine";
-App::$strings["Directory"] = "Verzeichnis";
-App::$strings["Mail"] = "Mail";
-App::$strings["Chat"] = "Chat";
-App::$strings["Probe"] = "Testen";
-App::$strings["Suggest"] = "Empfehlen";
-App::$strings["Random Channel"] = "Zufälliger Kanal";
-App::$strings["Invite"] = "Einladen";
-App::$strings["Features"] = "Funktionen";
-App::$strings["Language"] = "Sprache";
-App::$strings["Post"] = "Beitrag schreiben";
-App::$strings["Profile Photo"] = "Profilfoto";
-App::$strings["Purchase"] = "Kaufen";
+App::$strings["\$Projectname Notification"] = "\$Projectname-Benachrichtigung";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Danke.";
+App::$strings["%s Administrator"] = "der Administrator von %s";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Benachrichtigung] Neue Mail empfangen auf %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat Dir eine private Nachricht auf %3\$s gesendet.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s hat Dir %2\$s geschickt.";
+App::$strings["a private message"] = "eine private Nachricht";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]einen %4\$s[/zrl] kommentiert";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen %4\$s[/zrl] kommentiert";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "";
+App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Gefällt mir in Unterhaltung #%1\$d von %2\$s erhalten";
+App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s gefällt ein Beitrag oder eine Unterhaltung von Dir";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf Deine Pinnwand auf %3\$s geschrieben";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]Deine Pinnwand[/zrl] geschrieben";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Benachrichtigung] %s hat Dich erwähnt";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s erwähnt";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat Dich erwähnt[/zrl].";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Benachrichtigung] %1\$s hat Dich angestupst";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s angestupst";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat Dich angestupst[/zrl].";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat Deinen Beitrag auf %3\$s verschlagwortet";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen Beitrag[/zrl] verschlagwortet";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Benachrichtigung] Verbindungsanfrage erhalten";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, Du hast eine neue Verbindungsanfrage von '%2\$s' auf %3\$s erhalten";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, Du hast [zrl=%2\$s]eine neue Verbindungsanfrage[/zrl] von %3\$s erhalten.";
+App::$strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen.";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, Du hast einen Kontaktvorschlag von „%2\$s“ auf %3\$s erhalten";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, Du hast [zrl=%2\$s]einen Kontaktvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
+App::$strings["Name:"] = "Name:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Benachrichtigung]";
+App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
+App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
App::$strings["Visible to your default audience"] = "Standard-Sichtbarkeit gemäß Kanaleinstellungen";
App::$strings["Only me"] = "Nur ich";
App::$strings["Public"] = "Öffentlich";
@@ -1585,48 +1649,50 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Bild";
App::$strings["Insert Link"] = "Link einfügen";
App::$strings["Video"] = "Video";
-App::$strings["\$Projectname Notification"] = "\$Projectname-Benachrichtigung";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Danke.";
-App::$strings["%s Administrator"] = "der Administrator von %s";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Benachrichtigung] Neue Mail empfangen auf %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat Dir eine private Nachricht auf %3\$s gesendet.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s hat Dir %2\$s geschickt.";
-App::$strings["a private message"] = "eine private Nachricht";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]einen %4\$s[/zrl] kommentiert";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen %4\$s[/zrl] kommentiert";
-App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
-App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf Deine Pinnwand auf %3\$s geschrieben";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]Deine Pinnwand[/zrl] geschrieben";
-App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Benachrichtigung] %s hat Dich erwähnt";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s erwähnt";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat Dich erwähnt[/zrl].";
-App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Benachrichtigung] %1\$s hat Dich angestupst";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s angestupst";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat Dich angestupst[/zrl].";
-App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat Deinen Beitrag auf %3\$s verschlagwortet";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen Beitrag[/zrl] verschlagwortet";
-App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Benachrichtigung] Verbindungsanfrage erhalten";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, Du hast eine neue Verbindungsanfrage von '%2\$s' auf %3\$s erhalten";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, Du hast [zrl=%2\$s]eine neue Verbindungsanfrage[/zrl] von %3\$s erhalten.";
-App::$strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen.";
-App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, Du hast einen Kontaktvorschlag von „%2\$s“ auf %3\$s erhalten";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, Du hast [zrl=%2\$s]einen Kontaktvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
-App::$strings["Name:"] = "Name:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
-App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Benachrichtigung]";
-App::$strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
-App::$strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
+App::$strings["Site Admin"] = "Hub-Administration";
+App::$strings["Report Bug"] = "Fehler melden";
+App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
+App::$strings["My Chatrooms"] = "Meine Chaträume";
+App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
+App::$strings["Remote Diagnostics"] = "Ferndiagnose";
+App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
+App::$strings["Login"] = "Anmelden";
+App::$strings["Grid"] = "Grid";
+App::$strings["Wiki"] = "Wiki";
+App::$strings["Channel Home"] = "Mein Kanal";
+App::$strings["Events"] = "Termine";
+App::$strings["Directory"] = "Verzeichnis";
+App::$strings["Mail"] = "Mail";
+App::$strings["Chat"] = "Chat";
+App::$strings["Probe"] = "Testen";
+App::$strings["Suggest"] = "Empfehlen";
+App::$strings["Random Channel"] = "Zufälliger Kanal";
+App::$strings["Invite"] = "Einladen";
+App::$strings["Features"] = "Funktionen";
+App::$strings["Language"] = "Sprache";
+App::$strings["Post"] = "Beitrag schreiben";
+App::$strings["Profile Photo"] = "Profilfoto";
+App::$strings["Purchase"] = "Kaufen";
+App::$strings["Undelete"] = "Wieder hergestellt";
+App::$strings["Wiki files deleted successfully"] = "Wiki-Dateien erfolgreich gelöscht";
+App::$strings["__ctx:permcat__ default"] = "Standard";
+App::$strings["__ctx:permcat__ follower"] = "Abonnent";
+App::$strings["__ctx:permcat__ contributor"] = "Beitragender";
+App::$strings["__ctx:permcat__ publisher"] = "Autor";
+App::$strings["(No Title)"] = "(Kein Titel)";
+App::$strings["Wiki page create failed."] = "Anlegen der Wiki-Seite fehlgeschlagen.";
+App::$strings["Wiki not found."] = "Wiki nicht gefunden.";
+App::$strings["Destination name already exists"] = "Zielname bereits vorhanden";
+App::$strings["Page not found"] = "Seite nicht gefunden";
+App::$strings["Error reading page content"] = "Fehler beim Lesen des Seiteninhalts";
+App::$strings["Error reading wiki"] = "Fehler beim Lesen des Wiki";
+App::$strings["Page update failed."] = "Seitenaktualisierung fehlgeschlagen.";
+App::$strings["Nothing deleted"] = "Nichts gelöscht";
+App::$strings["Compare: object not found."] = "Vergleichen: Objekt nicht gefunden.";
+App::$strings["Page updated"] = "Seite aktualisiert";
+App::$strings["Untitled"] = "Ohne Titel";
+App::$strings["Wiki resource_id required for git commit"] = "";
+App::$strings["Different viewers will see this text differently"] = "Verschiedene Betrachter werden diesen Text unterschiedlich sehen";
App::$strings["Flag Adult Photos"] = "Nicht jugendfreie Fotos markieren";
App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Stellt eine Option zum Verstecken von Fotos mit unangemessenen Inhalten in der Standard-Albumansicht bereit";
App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "";
@@ -1638,6 +1704,8 @@ App::$strings["Tuning"] = "Stimmen";
App::$strings["Chord name: example: Em7"] = "Beispiel Akkord Name: Em7";
App::$strings["Show for left handed stringing"] = "Linkshänder-Besaitung anzeigen";
App::$strings["Quick Reference"] = "Schnellreferenz";
+App::$strings["No username found in import file."] = "Kein Benutzername in der Importdatei gefunden.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
App::$strings["Diaspora Protocol Settings updated."] = "Diaspora-Protokolleinstellungen aktualisiert.";
App::$strings["Enable the Diaspora protocol for this channel"] = "Diaspora-Protokoll für diesen Kanal aktivieren";
App::$strings["Allow any Diaspora member to comment on your public posts"] = "Jedem Diaspora-Mitglied erlauben, Deine öffentlichen Beiträge zu kommentieren";
@@ -1716,12 +1784,12 @@ App::$strings["[Name Withheld]"] = "[Name zurück gehalten]";
App::$strings["%1\$s has joined %2\$s"] = "%1\$s ist %2\$s beigetreten";
App::$strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s willkommen";
App::$strings["This introduction has already been accepted."] = "Die Vorstellung wurde bereits akzeptiert.";
-App::$strings["Profile location is not valid or does not contain profile information."] = "";
+App::$strings["Profile location is not valid or does not contain profile information."] = "Die angegebenen Profil Lokalität ist nicht gültig oder enthält keine Profil-Informationen.";
App::$strings["Warning: profile location has no identifiable owner name."] = "";
-App::$strings["Warning: profile location has no profile photo."] = "";
+App::$strings["Warning: profile location has no profile photo."] = "Warnung: Beim angegebenen Profil liegt kein Profil-Bild bei.";
App::$strings["%d required parameter was not found at the given location"] = array(
- 0 => "",
- 1 => "",
+ 0 => "Konnte %d benötigten Parameter an der angegebenen Stelle nicht finden.",
+ 1 => "Konnte %d benötigte Parameter an der angegebenen Stelle nicht finden.",
);
App::$strings["Introduction complete."] = "Einführung abgeschlossen.";
App::$strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
@@ -1732,7 +1800,7 @@ App::$strings["Friends are advised to please try again in 24 hours."] = "Freunde
App::$strings["Invalid locator"] = "";
App::$strings["Invalid email address."] = "Ungültige E-Mail-Adresse.";
App::$strings["This account has not been configured for email. Request failed."] = "Dieser Account wurde nicht für E-Mail konfiguriert. Anfrage gescheitert.";
-App::$strings["Unable to resolve your name at the provided location."] = "";
+App::$strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen nicht bei der angegebenen Stelle ermitteln.";
App::$strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
App::$strings["Apparently you are already friends with %s."] = "Anscheinend bist du bereits mit %s in Kontakt.";
App::$strings["Invalid profile URL."] = "Ungültige Profil-URL.";
@@ -1768,7 +1836,6 @@ App::$strings["This will import all your Friendica photo albums to this Red chan
App::$strings["Friendica Server base URL"] = "BasisURL des Friendica Servers";
App::$strings["Friendica Login Username"] = "Friendica-Anmeldebenutzername";
App::$strings["Friendica Login Password"] = "Friendica-Anmeldepasswort";
-App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU Social Protokoll für diesen Kanal aktualisieren";
App::$strings["Send email to all members"] = "E-Mail an alle Mitglieder senden";
App::$strings["$1%s Administrator"] = "$1%s Administrator";
App::$strings["No recipients found."] = "Keine Empfänger gefunden.";
@@ -1784,7 +1851,7 @@ App::$strings["InsaneJournal password"] = "InsaneJournal-Passwort";
App::$strings["Post to InsaneJournal by default"] = "Standardmäßig bei InsaneJournal veröffentlichen";
App::$strings["InsaneJournal Post Settings"] = "InsaneJournal-Beitragseinstellungen";
App::$strings["Insane Journal Settings saved."] = "InsaneJournal-Einstellungen gespeichert.";
-App::$strings["Channels to auto connect"] = "";
+App::$strings["Channels to auto connect"] = "Kanäle zur automatischen Verbindung";
App::$strings["Comma separated list"] = "Kommagetrennte Liste";
App::$strings["Popular Channels"] = "Beliebte Kanäle";
App::$strings["IRC Settings"] = "IRC-Einstellungen";
@@ -1802,7 +1869,6 @@ App::$strings["Hubzilla password"] = "Hubzilla-Passwort";
App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "";
App::$strings["Purge internal list of jabber addresses of contacts"] = "Interne Liste der Jabber Adressen von Kontakten löschen";
App::$strings["Configuration Help"] = "Konfigurationshilfe";
-App::$strings["Add Contact"] = "Kontakt hinzufügen";
App::$strings["Jappix Mini Settings"] = "Jappix Mini Einstellungen";
App::$strings["Upload a file"] = "Datei hochladen";
App::$strings["Drop files here to upload"] = "Dateien zum Hochladen hier fallen lassen";
@@ -1868,8 +1934,8 @@ App::$strings["hug"] = "umarmen";
App::$strings["hugged"] = "umarmt";
App::$strings["murder"] = "ermorden";
App::$strings["murdered"] = "ermordet";
-App::$strings["worship"] = "";
-App::$strings["worshipped"] = "";
+App::$strings["worship"] = "Anbetung";
+App::$strings["worshipped"] = "angebetet";
App::$strings["kiss"] = "küssen";
App::$strings["kissed"] = "geküsst";
App::$strings["tempt"] = "verlocken";
@@ -1904,21 +1970,21 @@ App::$strings["Allow Federation Toggle"] = "";
App::$strings["Federate posts by default"] = "";
App::$strings["NoFed Settings"] = "NoFed-Einstellungen";
App::$strings["Nsabait Settings updated."] = "Nsabait-Einstellungen aktualisiert.";
-App::$strings["Enable NSAbait Plugin"] = "";
+App::$strings["Enable NSAbait Plugin"] = "Aktiviere das NSAbait Plugin";
App::$strings["NSAbait Settings"] = "NSAbait-Einstellungen";
App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "";
App::$strings["Enable Content filter"] = "Inhaltsfilter aktivieren";
-App::$strings["Comma separated list of keywords to hide"] = "";
-App::$strings["Use /expression/ to provide regular expressions"] = "";
+App::$strings["Comma separated list of keywords to hide"] = "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen.";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "";
App::$strings["Not Safe For Work Settings"] = "Not Safe For Work Einstellungen";
App::$strings["General Purpose Content Filter"] = "Allzweck-Inhaltsfilter";
App::$strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert.";
App::$strings["Possible adult content"] = "Möglicherweise nicht jugendfreie Inhalte";
-App::$strings["%s - click to open/close"] = "%s - zum öffnen/schließen anklicken";
+App::$strings["%s - view"] = "";
App::$strings["System defaults:"] = "Systemstandardeinstellungen:";
App::$strings["Preferred Clipart IDs"] = "";
App::$strings["List of preferred clipart ids. These will be shown first."] = "";
-App::$strings["Default Search Term"] = "";
+App::$strings["Default Search Term"] = "Standard-Suchbegriff";
App::$strings["The default search term. These will be shown second."] = "";
App::$strings["Return After"] = "";
App::$strings["Page to load after image selection."] = "";
@@ -1936,7 +2002,7 @@ App::$strings["Preferred IDs Message"] = "";
App::$strings["Message to display above preferred results."] = "";
App::$strings["Uploaded by: "] = "Hochgeladen von: ";
App::$strings["Drawn by: "] = "Gezeichnet von: ";
-App::$strings["Or select from a free OpenClipart.org image:"] = "";
+App::$strings["Or select from a free OpenClipart.org image:"] = "Oder wähle ein freies Bild von OpenClipart.org:";
App::$strings["Search Term"] = "Suchbegriff";
App::$strings["Unknown error. Please try again later."] = "Unbekannter Fehler. Bitte versuchen Sie es später erneut.";
App::$strings["Profile photo updated successfully."] = "Profilfoto erfolgreich aktualisiert.";
@@ -1981,7 +2047,7 @@ App::$strings["Pump.io Post Settings"] = "Pump.io-Beitragseinstellungen";
App::$strings["PumpIO Settings saved."] = "PumpIO-Einstellungen gespeichert.";
App::$strings["QR code"] = "QR-Code";
App::$strings["QR Generator"] = "QR-Generator";
-App::$strings["Enter some text"] = "";
+App::$strings["Enter some text"] = "Etwas Text eingeben";
App::$strings["Enable Rainbowtag"] = "Rainbowtag aktivieren";
App::$strings["Rainbowtag Settings"] = "Rainbowtag-Einstellungen";
App::$strings["Rainbowtag Settings saved."] = "Rainbowtag-Einstellungen gespeichert.";
@@ -2024,7 +2090,7 @@ App::$strings["Friendica password"] = "Friendica-Passwort";
App::$strings["Hubzilla to Friendica Post Settings"] = "";
App::$strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
-App::$strings["Some setting"] = "";
+App::$strings["Some setting"] = "Einige Einstellungen";
App::$strings["A setting"] = "Eine Einstellung";
App::$strings["Skeleton Settings"] = "";
App::$strings["Deactivate the feature"] = "Diese Funktion abschalten";
@@ -2079,7 +2145,7 @@ App::$strings["The handicap game disables the center position on the middle leve
App::$strings["You go first..."] = "Du darfst anfangen...";
App::$strings["I'm going first this time..."] = "Diesmal werde ich anfangen...";
App::$strings["You won!"] = "Sie haben gewonnen!";
-App::$strings["\"Cat\" game!"] = "";
+App::$strings["\"Cat\" game!"] = "\"Katzen\"-Spiel!";
App::$strings["I won!"] = "Ich habe gewonnen!";
App::$strings["Edit your profile and change settings."] = "Bearbeite dein Profil und ändere die Einstellungen.";
App::$strings["Click here to see activity from your connections."] = "Klicke hier, um die Aktivitäten Deiner Verbindungen zu sehen.";
@@ -2118,7 +2184,7 @@ App::$strings["Danger! It seems someone tried to forge a message! This message i
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen.";
App::$strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
App::$strings["Twitter settings updated."] = "Twitter-Einstellungen aktualisiert.";
-App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator.";
App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "";
App::$strings["Log in with Twitter"] = "Mit Twitter anmelden";
App::$strings["Copy the PIN from Twitter here"] = "PIN von Twitter hier her kopieren";
@@ -2136,7 +2202,7 @@ App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] =
App::$strings["Recent Channel/Profile Viewers"] = "Kürzliche Kanal/Profil Besucher";
App::$strings["This plugin/addon has not been configured."] = "Dieses Plugin/Addon wurde noch nicht konfiguriert.";
App::$strings["Please visit the Visage settings on %s"] = "Bitte rufe die Visage Einstellungen auf %s auf";
-App::$strings["your feature settings page"] = "";
+App::$strings["your feature settings page"] = "Die Funktions-Einstellungsseite";
App::$strings["No entries."] = "Keine Einträge.";
App::$strings["Enable Visage Visitor Logging"] = "Aktiviere das Visage-Besucher Logging";
App::$strings["Visage Settings"] = "Visage-Einstellungen";
@@ -2180,21 +2246,6 @@ App::$strings["Addressbook Name"] = "Adressbuchname";
App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
App::$strings["Import addressbook"] = "Adressbuch importieren";
App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
-App::$strings["Errors encountered creating database table: "] = "";
-App::$strings["Default Calendar"] = "Standardkalender";
-App::$strings["Default Addressbook"] = "Standardadressbuch";
-App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
-App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
-App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
-App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
-App::$strings["Mobile"] = "Mobil";
-App::$strings["Home"] = "Home";
-App::$strings["Home, Voice"] = "Zuhause, Sprache";
-App::$strings["Home, Fax"] = "Zuhause, Fax";
-App::$strings["Work"] = "Arbeit";
-App::$strings["Work, Voice"] = "Arbeit, Sprache";
-App::$strings["Work, Fax"] = "Arbeit, Fax";
App::$strings["INVALID EVENT DISMISSED!"] = "UNGÃœLTIGEN TERMIN ABGELEHNT!";
App::$strings["Summary: "] = "Zusammenfassung:";
App::$strings["Date: "] = "Datum:";
@@ -2212,19 +2263,18 @@ App::$strings["Less"] = "Weniger";
App::$strings["Select calendar"] = "Kalender auswählen";
App::$strings["Delete all"] = "Alles löschen";
App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
-App::$strings["Organisation"] = "Organisation";
-App::$strings["Title"] = "Titel";
-App::$strings["Phone"] = "Telefon";
-App::$strings["Instant messenger"] = "";
-App::$strings["Website"] = "Webseite";
-App::$strings["Note"] = "Hinweis";
-App::$strings["Add Field"] = "Feld hinzufügen";
-App::$strings["P.O. Box"] = "";
-App::$strings["Additional"] = "Zusätzlich";
-App::$strings["Street"] = "Straße";
-App::$strings["Locality"] = "Ortschaft";
-App::$strings["Region"] = "Region";
-App::$strings["ZIP Code"] = "Postleitzahl";
+App::$strings["Errors encountered creating database table: "] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
+App::$strings["Default Calendar"] = "Standardkalender";
+App::$strings["Default Addressbook"] = "Standardadressbuch";
+App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
+App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
+App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
+App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
+App::$strings["Home, Voice"] = "Zuhause, Sprache";
+App::$strings["Home, Fax"] = "Zuhause, Fax";
+App::$strings["Work, Voice"] = "Arbeit, Sprache";
+App::$strings["Work, Fax"] = "Arbeit, Fax";
App::$strings["Invalid game."] = "Ungültiges Spiel.";
App::$strings["You are not a player in this game."] = "Sie sind kein Spieler in diesem Spiel.";
App::$strings["You must be a local channel to create a game."] = "Um ein Spiel zu eröffnen, musst du ein lokaler Kanal sein";
@@ -2242,8 +2292,6 @@ App::$strings["Like us on Hubzilla"] = "Like us on Hubzilla";
App::$strings["Embed:"] = "Einbetten";
App::$strings["Male"] = "Männlich";
App::$strings["Female"] = "Weiblich";
-App::$strings["OpenID protocol error. No ID returned."] = "OpenID-Protokollfehler. Keine Kennung zurückgegeben.";
-App::$strings["Login failed."] = "Login fehlgeschlagen.";
App::$strings["First Name"] = "Vorname";
App::$strings["Last Name"] = "Nachname";
App::$strings["Full Name"] = "Voller Name";
@@ -2260,6 +2308,8 @@ App::$strings["Birth Day"] = "Geburtstag";
App::$strings["Birthdate"] = "Geburtsdatum";
App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Wir haben ein Problem mit der OpenID festgestellt, mit der Du Dich anmelden wolltest. Bitte überprüfe sie noch einmal.";
App::$strings["The error message was:"] = "Die Fehlermeldung war:";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-Protokollfehler. Keine Kennung zurückgegeben.";
+App::$strings["Login failed."] = "Login fehlgeschlagen.";
App::$strings["Reconnecting %d connections"] = "Erneuere %d Verbindungen";
App::$strings["Diaspora Reconnect"] = "";
App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
@@ -2286,11 +2336,66 @@ App::$strings["Delete member"] = "Mitglied löschen";
App::$strings["Edit proximity alert"] = "Annäherungsalarm bearbeiten";
App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald sich dieses Mitglied innerhalb eines bestimmten Radius von Dir aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
App::$strings["distance"] = "Entfernung";
+App::$strings["Proximity alert distance (meters)"] = "";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Ein Annäherungsalarm wird ausgelöst werden, sobald Du Dich innerhalb eines bestimmten Radius der Markierung aufhält.<br><br>Gib einen Radius in Metern ein (0 zum Abschalten der Funktion):";
+App::$strings["Marker proximity alert"] = "Annäherungsalarm für Markierung";
+App::$strings["Reminder note"] = "Erinnerungshinweis";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Gib eine Nachricht ein, die angezeigt werden soll, wenn Du Dich in der festgelegten Nähe befindest...";
App::$strings["Add new rendezvous"] = "Neues Rendezvous hinzufügen";
App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Erstelle ein neues Rendezvous und teile den Zugriffslink mit allen, die Du in die Gruppe einladen möchtest. Die, die den Link öffnen, werden Mitglieder des Rendezvous. Sie können die Standorte der anderen Mitglieder sehen, Marker zur Karte hinzufügen oder ihre eigenen Standorte mit der Gruppe teilen.";
-App::$strings["No username found in import file."] = "Kein Benutzername in der Importdatei gefunden.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
+App::$strings["Install Firefox Sharing Tools"] = "";
+App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "";
+App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
+App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
+App::$strings["Error downloading wiki: "] = "Fehler beim Herunterladen des Wiki:";
+App::$strings["Wiki Pages"] = "Wikiseiten";
+App::$strings["Add new page"] = "Neue Seite hinzufügen";
+App::$strings["Page name"] = "Seitenname";
+App::$strings["Wiki List"] = "Wikiliste";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU Social Protokoll für diesen Kanal aktualisieren";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Search \$Projectname"] = "";
App::$strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
+App::$strings["default"] = "Standard";
+App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
+App::$strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
+App::$strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt";
+App::$strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
+App::$strings["An invitation is required."] = "Eine Einladung wird benötigt.";
+App::$strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden.";
+App::$strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
+App::$strings["Failed to store account information."] = "Speichern der Nutzerkontodaten fehlgeschlagen.";
+App::$strings["Registration confirmation for %s"] = "Registrierungsbestätigung für %s";
+App::$strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
+App::$strings["your registration password"] = "Dein Registrierungspasswort";
+App::$strings["Registration details for %s"] = "Registrierungsdetails für %s";
+App::$strings["Account approved."] = "Nutzerkonto bestätigt.";
+App::$strings["Registration revoked for %s"] = "Registrierung für %s wurde widerrufen";
+App::$strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
+App::$strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
+App::$strings["Who can see this?"] = "Wer kann das sehen?";
+App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen.";
+App::$strings["Show"] = "Anzeigen";
+App::$strings["Don't show"] = "Nicht anzeigen";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann.";
+App::$strings["Categories"] = "Kategorien";
+App::$strings["Tags"] = "Schlagwörter";
+App::$strings["Keywords"] = "Schlüsselwörter";
+App::$strings["have"] = "habe";
+App::$strings["has"] = "hat";
+App::$strings["want"] = "will";
+App::$strings["wants"] = "will";
+App::$strings["likes"] = "gefällt";
+App::$strings["dislikes"] = "missfällt";
+App::$strings["Attachments:"] = "Anhänge:";
+App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
+App::$strings["\$Projectname event notification:"] = "\$Projectname-Terminbenachrichtigung:";
+App::$strings["Starts:"] = "Beginnt:";
+App::$strings["Finishes:"] = "Endet:";
App::$strings["Birthday"] = "Geburtstag";
App::$strings["Age: "] = "Alter:";
App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-TT oder MM-TT";
@@ -2327,26 +2432,6 @@ App::$strings["__ctx:relative_date__ second"] = array(
);
App::$strings["%1\$s's birthday"] = "%1\$ss Geburtstag";
App::$strings["Happy Birthday %1\$s"] = "Alles Gute zum Geburtstag, %1\$s";
-App::$strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
-App::$strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist auf dieser Seite nicht erlaubt";
-App::$strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
-App::$strings["An invitation is required."] = "Eine Einladung wird benötigt.";
-App::$strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden.";
-App::$strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
-App::$strings["Failed to store account information."] = "Speichern der Nutzerkontodaten fehlgeschlagen.";
-App::$strings["Registration confirmation for %s"] = "Registrierungsbestätigung für %s";
-App::$strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
-App::$strings["your registration password"] = "Dein Registrierungspasswort";
-App::$strings["Registration details for %s"] = "Registrierungsdetails für %s";
-App::$strings["Account approved."] = "Nutzerkonto bestätigt.";
-App::$strings["Registration revoked for %s"] = "Registrierung für %s wurde widerrufen";
-App::$strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
-App::$strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
-App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
-App::$strings["[no subject]"] = "[no subject]";
-App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
-App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
App::$strings["Frequently"] = "Häufig";
App::$strings["Hourly"] = "Stündlich";
App::$strings["Twice daily"] = "Zwei Mal am Tag";
@@ -2407,6 +2492,168 @@ App::$strings["Uncertain"] = "Ungewiss";
App::$strings["It's complicated"] = "Es ist kompliziert";
App::$strings["Don't care"] = "Interessiert mich nicht";
App::$strings["Ask me"] = "Frag mich mal";
+App::$strings["New window"] = "Neues Fenster";
+App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
+App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
+App::$strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s an";
+App::$strings["poked"] = "stupste";
+App::$strings["View %s's profile @ %s"] = "%ss Profil auf %s ansehen";
+App::$strings["Categories:"] = "Kategorien:";
+App::$strings["Filed under:"] = "Gespeichert unter:";
+App::$strings["View in context"] = "Im Zusammenhang anschauen";
+App::$strings["remove"] = "lösche";
+App::$strings["Loading..."] = "Lädt ...";
+App::$strings["Delete Selected Items"] = "Lösche die ausgewählten Elemente";
+App::$strings["View Source"] = "Quelle anzeigen";
+App::$strings["Follow Thread"] = "Unterhaltung folgen";
+App::$strings["Unfollow Thread"] = "Unterhaltung nicht mehr folgen";
+App::$strings["Activity/Posts"] = "Aktivitäten/Beiträge";
+App::$strings["Edit Connection"] = "Verbindung bearbeiten";
+App::$strings["Message"] = "Nachricht";
+App::$strings["%s likes this."] = "%s gefällt das.";
+App::$strings["%s doesn't like this."] = "%s gefällt das nicht.";
+App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das.",
+);
+App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das nicht.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das nicht.",
+);
+App::$strings["and"] = "und";
+App::$strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => ", und %d andere",
+);
+App::$strings["%s like this."] = "%s gefällt das.";
+App::$strings["%s don't like this."] = "%s gefällt das nicht.";
+App::$strings["Set your location"] = "Standort";
+App::$strings["Clear browser location"] = "Browser-Standort löschen";
+App::$strings["Tag term:"] = "Schlagwort:";
+App::$strings["Where are you right now?"] = "Wo bist Du jetzt grade?";
+App::$strings["Choose a different album..."] = "Wählen Sie ein anderes Album aus...";
+App::$strings["Comments enabled"] = "Kommentare aktiviert";
+App::$strings["Comments disabled"] = "Kommentare deaktiviert";
+App::$strings["Page link name"] = "Link zur Seite";
+App::$strings["Post as"] = "Veröffentlichen als";
+App::$strings["Toggle voting"] = "Umfragewerkzeug aktivieren";
+App::$strings["Disable comments"] = "Kommentare deaktivieren";
+App::$strings["Toggle comments"] = "Kommentare umschalten";
+App::$strings["Categories (optional, comma-separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
+App::$strings["Other networks and post services"] = "Andere Netzwerke und Platformen";
+App::$strings["Set publish date"] = "Veröffentlichungsdatum festlegen";
+App::$strings["Discover"] = "Entdecken";
+App::$strings["Imported public streams"] = "Importierte öffentliche Beiträge";
+App::$strings["Commented Order"] = "Neueste Kommentare";
+App::$strings["Sort by Comment Date"] = "Nach Kommentardatum sortiert";
+App::$strings["Posted Order"] = "Neueste Beiträge";
+App::$strings["Sort by Post Date"] = "Nach Beitragsdatum sortiert";
+App::$strings["Posts that mention or involve you"] = "Beiträge mit Beteiligung Deinerseits";
+App::$strings["Activity Stream - by date"] = "Activity Stream – nach Datum sortiert";
+App::$strings["Starred"] = "Markiert";
+App::$strings["Favourite Posts"] = "Markierte Beiträge";
+App::$strings["Spam"] = "Spam";
+App::$strings["Posts flagged as SPAM"] = "Nachrichten, die als SPAM markiert wurden";
+App::$strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
+App::$strings["Profile Details"] = "Profil-Details";
+App::$strings["Photo Albums"] = "Fotoalben";
+App::$strings["Files and Storage"] = "Dateien und Speicher";
+App::$strings["Chatrooms"] = "Chaträume";
+App::$strings["Bookmarks"] = "Lesezeichen";
+App::$strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen";
+App::$strings["View Webpages"] = "Webseiten anzeigen";
+App::$strings["__ctx:noun__ Attending"] = array(
+ 0 => "Zusage",
+ 1 => "Zusagen",
+);
+App::$strings["__ctx:noun__ Not Attending"] = array(
+ 0 => "Absage",
+ 1 => "Absagen",
+);
+App::$strings["__ctx:noun__ Undecided"] = array(
+ 0 => " Unentschlossen",
+ 1 => "Unentschlossene",
+);
+App::$strings["__ctx:noun__ Agree"] = array(
+ 0 => "Zustimmung",
+ 1 => "Zustimmungen",
+);
+App::$strings["__ctx:noun__ Disagree"] = array(
+ 0 => "Ablehnung",
+ 1 => "Ablehnungen",
+);
+App::$strings["__ctx:noun__ Abstain"] = array(
+ 0 => "Enthaltung",
+ 1 => "Enthaltungen",
+);
+App::$strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
+App::$strings["No recipient provided."] = "Kein Empfänger angegeben";
+App::$strings["[no subject]"] = "[no subject]";
+App::$strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
+App::$strings["guest:"] = "Gast:";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
+App::$strings["System"] = "System";
+App::$strings["New App"] = "Neue App";
+App::$strings["Edit Apps"] = "Apps bearbeiten";
+App::$strings["Suggestions"] = "Vorschläge";
+App::$strings["See more..."] = "Mehr anzeigen …";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
+App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
+App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
+App::$strings["Notes"] = "Notizen";
+App::$strings["Remove term"] = "Eintrag löschen";
+App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
+App::$strings["add"] = "hinzufügen";
+App::$strings["Saved Folders"] = "Gespeicherte Ordner";
+App::$strings["Everything"] = "Alles";
+App::$strings["Archives"] = "Archive";
+App::$strings["Refresh"] = "Aktualisieren";
+App::$strings["Account settings"] = "Konto-Einstellungen";
+App::$strings["Channel settings"] = "Kanal-Einstellungen";
+App::$strings["Additional features"] = "Zusätzliche Funktionen";
+App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
+App::$strings["Display settings"] = "Anzeige-Einstellungen";
+App::$strings["Manage locations"] = "Klon-Adressen verwalten";
+App::$strings["Export channel"] = "Kanal exportieren";
+App::$strings["Connected apps"] = "Verbundene Apps";
+App::$strings["Permission Groups"] = "Berechtigungsrollen";
+App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
+App::$strings["Private Mail Menu"] = "Private Nachrichten";
+App::$strings["Combined View"] = "Kombinierte Anzeige";
+App::$strings["Inbox"] = "Eingang";
+App::$strings["Outbox"] = "Ausgang";
+App::$strings["New Message"] = "Neue Nachricht";
+App::$strings["Conversations"] = "Konversationen";
+App::$strings["Received Messages"] = "Erhaltene Nachrichten";
+App::$strings["Sent Messages"] = "Gesendete Nachrichten";
+App::$strings["No messages."] = "Keine Nachrichten.";
+App::$strings["Delete conversation"] = "Unterhaltung löschen";
+App::$strings["Events Tools"] = "Kalenderwerkzeuge";
+App::$strings["Export Calendar"] = "Kalender exportieren";
+App::$strings["Import Calendar"] = "Kalender importieren";
+App::$strings["Overview"] = "Ãœbersicht";
+App::$strings["Chat Members"] = "Chatmitglieder";
+App::$strings["__ctx:wiki_history__ Message"] = "Nachricht";
+App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
+App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
+App::$strings["photo/image"] = "Foto/Bild";
+App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
+App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
+App::$strings["Rate Me"] = "Bewerte mich";
+App::$strings["View Ratings"] = "Bewertungen ansehen";
+App::$strings["Forums"] = "Foren";
+App::$strings["Tasks"] = "Aufgaben";
+App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
+App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
+App::$strings["DB updates"] = "DB-Aktualisierungen";
+App::$strings["Admin"] = "Administration";
+App::$strings["Plugin Features"] = "Plug-In Funktionen";
+App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
+App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
+App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
+App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
App::$strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
App::$strings["Empty name"] = "Namensfeld leer";
App::$strings["Name too long"] = "Name ist zu lang";
@@ -2443,221 +2690,6 @@ App::$strings["Love/Romance:"] = "Liebe/Romantik:";
App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
App::$strings["School/education:"] = "Schule/Ausbildung:";
App::$strings["Like this thing"] = "Gefällt mir";
-App::$strings["New window"] = "Neues Fenster";
-App::$strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab";
-App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
-App::$strings["Directory Options"] = "Verzeichnisoptionen";
-App::$strings["Safe Mode"] = "Sicherer Modus";
-App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
-App::$strings["This Website Only"] = "Nur dieser Hub";
-App::$strings["Logout"] = "Abmelden";
-App::$strings["End this session"] = "Beende diese Sitzung";
-App::$strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-App::$strings["Your profile page"] = "Deine Profilseite";
-App::$strings["Manage/Edit profiles"] = "Profile verwalten";
-App::$strings["Edit your profile"] = "Profil bearbeiten";
-App::$strings["Your photos"] = "Deine Bilder";
-App::$strings["Your files"] = "Deine Dateien";
-App::$strings["Your chatrooms"] = "Deine Chaträume";
-App::$strings["Bookmarks"] = "Lesezeichen";
-App::$strings["Your bookmarks"] = "Deine Lesezeichen";
-App::$strings["Your webpages"] = "Deine Webseiten";
-App::$strings["Your wikis"] = "Ihre Wikis";
-App::$strings["Sign in"] = "Anmelden";
-App::$strings["Remote authentication"] = "Ãœber Konto auf anderem Server einloggen";
-App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
-App::$strings["Get me home"] = "Bringe mich nach Hause (eigener Kanal)";
-App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus";
-App::$strings["Create an account"] = "Erzeuge ein Konto";
-App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
-App::$strings["Applications, utilities, links, games"] = "Anwendungen (Apps), Zubehör, Links, Spiele";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Channel Directory"] = "Kanal-Verzeichnis";
-App::$strings["Your grid"] = "Dein Grid";
-App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
-App::$strings["Channel home"] = "Mein Kanal";
-App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
-App::$strings["Notices"] = "Benachrichtigungen";
-App::$strings["Notifications"] = "Benachrichtigungen";
-App::$strings["See all notifications"] = "Alle Benachrichtigungen ansehen";
-App::$strings["Private mail"] = "Persönliche Mail";
-App::$strings["See all private messages"] = "Alle persönlichen Nachrichten ansehen";
-App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
-App::$strings["Inbox"] = "Eingang";
-App::$strings["Outbox"] = "Ausgang";
-App::$strings["New Message"] = "Neue Nachricht";
-App::$strings["Event Calendar"] = "Terminkalender";
-App::$strings["See all events"] = "Alle Termine ansehen";
-App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
-App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
-App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
-App::$strings["Admin"] = "Administration";
-App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
-App::$strings["Loading..."] = "Lädt ...";
-App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
-App::$strings["Please wait..."] = "Bitte warten...";
-App::$strings["General Features"] = "Allgemeine Funktionen";
-App::$strings["Multiple Profiles"] = "Mehrfachprofile";
-App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal";
-App::$strings["Advanced Profiles"] = "Erweiterte Profile";
-App::$strings["Additional profile sections and selections"] = "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung";
-App::$strings["Profile Import/Export"] = "Profil-Import/Export";
-App::$strings["Save and load profile details across sites/channels"] = "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren";
-App::$strings["Web Pages"] = "Webseiten";
-App::$strings["Provide managed web pages on your channel"] = "Ermöglicht das Erstellen von Webseiten in Deinem Kanal";
-App::$strings["Provide a wiki for your channel"] = "Stelle ein Wiki in Deinem Kanal zur Verfügung";
-App::$strings["Private Notes"] = "Private Notizen";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)";
-App::$strings["Navigation Channel Select"] = "Kanal-Auswahl in der Navigationsleiste";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü";
-App::$strings["Photo Location"] = "Aufnahmeort";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte";
-App::$strings["Access Controlled Chatrooms"] = "Zugriffskontrollierte Chaträume";
-App::$strings["Provide chatrooms and chat services with access control."] = "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an.";
-App::$strings["Smart Birthdays"] = "Smarte Geburtstage";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind.";
-App::$strings["Advanced Directory Search"] = "Erweiterte Verzeichnissuche";
-App::$strings["Allows creation of complex directory search queries"] = "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen";
-App::$strings["Advanced Theme and Layout Settings"] = "Erweiterte Design- und Layout-Einstellungen";
-App::$strings["Allows fine tuning of themes and page layouts"] = "Erlaubt die Feineinstellung von Designs und Seitenlayouts";
-App::$strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
-App::$strings["Large Photos"] = "Große Fotos";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet.";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds";
-App::$strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)";
-App::$strings["Enable Voting Tools"] = "Umfragewerkzeuge aktivieren";
-App::$strings["Provide a class of post which others can vote on"] = "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)";
-App::$strings["Disable Comments"] = "Kommentare deaktivieren";
-App::$strings["Provide the option to disable comments for a post"] = "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten";
-App::$strings["Delayed Posting"] = "Verzögertes Senden";
-App::$strings["Allow posts to be published at a later date"] = "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen";
-App::$strings["Content Expiration"] = "Verfall von Inhalten";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum.";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Doppelte Beiträge unterdrücken";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden.";
-App::$strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
-App::$strings["Search by Date"] = "Suche nach Datum";
-App::$strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
-App::$strings["Privacy Groups"] = "Gruppen";
-App::$strings["Enable management and selection of privacy groups"] = "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren";
-App::$strings["Saved Searches"] = "Gespeicherte Suchanfragen";
-App::$strings["Save search terms for re-use"] = "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung";
-App::$strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast";
-App::$strings["Network New Tab"] = "Netzwerkreiter Neu";
-App::$strings["Enable tab to display all new Network activity"] = "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt";
-App::$strings["Affinity Tool"] = "Beziehungs-Tool";
-App::$strings["Filter stream activity by depth of relationships"] = "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann";
-App::$strings["Show friend and connection suggestions"] = "Freund- und Verbindungsvorschläge anzeigen";
-App::$strings["Connection Filtering"] = "Filter für Verbindungen";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)";
-App::$strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
-App::$strings["Community Tagging"] = "Gemeinschaftliches Verschlagworten";
-App::$strings["Ability to tag existing posts"] = "Ermöglicht das Verschlagworten existierender Beiträge";
-App::$strings["Post Categories"] = "Beitrags-Kategorien";
-App::$strings["Add categories to your posts"] = "Aktiviert Kategorien für Beiträge";
-App::$strings["Emoji Reactions"] = "Emoji Reaktionen";
-App::$strings["Add emoji reaction ability to posts"] = "Aktiviert Emoji-Reaktionen für Beiträge";
-App::$strings["Saved Folders"] = "Gespeicherte Ordner";
-App::$strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
-App::$strings["Dislike Posts"] = "Gefällt-mir-nicht-Beiträge";
-App::$strings["Ability to dislike posts/comments"] = "Aktiviert die „Gefällt mir nicht“-Schaltfläche";
-App::$strings["Star Posts"] = "Beiträge mit Sternchen versehen";
-App::$strings["Ability to mark special posts with a star indicator"] = "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol";
-App::$strings["Tag Cloud"] = "Schlagwort-Wolke";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite";
-App::$strings["Premium Channel"] = "Premium-Kanal";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen";
-App::$strings["prev"] = "vorherige";
-App::$strings["first"] = "erste";
-App::$strings["last"] = "letzte";
-App::$strings["next"] = "nächste";
-App::$strings["older"] = "älter";
-App::$strings["newer"] = "neuer";
-App::$strings["No connections"] = "Keine Verbindungen";
-App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
-App::$strings["poke"] = "anstupsen";
-App::$strings["poked"] = "stupste";
-App::$strings["ping"] = "anpingen";
-App::$strings["pinged"] = "pingte";
-App::$strings["prod"] = "knuffen";
-App::$strings["prodded"] = "knuffte";
-App::$strings["slap"] = "ohrfeigen";
-App::$strings["slapped"] = "ohrfeigte";
-App::$strings["finger"] = "befummeln";
-App::$strings["fingered"] = "befummelte";
-App::$strings["rebuff"] = "eine Abfuhr erteilen";
-App::$strings["rebuffed"] = "zurückgewiesen";
-App::$strings["happy"] = "glücklich";
-App::$strings["sad"] = "traurig";
-App::$strings["mellow"] = "sanft";
-App::$strings["tired"] = "müde";
-App::$strings["perky"] = "frech";
-App::$strings["angry"] = "sauer";
-App::$strings["stupefied"] = "verblüfft";
-App::$strings["puzzled"] = "verwirrt";
-App::$strings["interested"] = "interessiert";
-App::$strings["bitter"] = "verbittert";
-App::$strings["cheerful"] = "fröhlich";
-App::$strings["alive"] = "lebendig";
-App::$strings["annoyed"] = "verärgert";
-App::$strings["anxious"] = "unruhig";
-App::$strings["cranky"] = "schrullig";
-App::$strings["disturbed"] = "verstört";
-App::$strings["frustrated"] = "frustriert";
-App::$strings["depressed"] = "deprimiert";
-App::$strings["motivated"] = "motiviert";
-App::$strings["relaxed"] = "entspannt";
-App::$strings["surprised"] = "überrascht";
-App::$strings["Monday"] = "Montag";
-App::$strings["Tuesday"] = "Dienstag";
-App::$strings["Wednesday"] = "Mittwoch";
-App::$strings["Thursday"] = "Donnerstag";
-App::$strings["Friday"] = "Freitag";
-App::$strings["Saturday"] = "Samstag";
-App::$strings["Sunday"] = "Sonntag";
-App::$strings["January"] = "Januar";
-App::$strings["February"] = "Februar";
-App::$strings["March"] = "März";
-App::$strings["April"] = "April";
-App::$strings["May"] = "Mai";
-App::$strings["June"] = "Juni";
-App::$strings["July"] = "Juli";
-App::$strings["August"] = "August";
-App::$strings["September"] = "September";
-App::$strings["October"] = "Oktober";
-App::$strings["November"] = "November";
-App::$strings["December"] = "Dezember";
-App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
-App::$strings["unknown"] = "unbekannt";
-App::$strings["remove category"] = "Kategorie entfernen";
-App::$strings["remove from file"] = "aus der Datei entfernen";
-App::$strings["default"] = "Standard";
-App::$strings["Page layout"] = "Seiten-Layout";
-App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
-App::$strings["Page content type"] = "Art des Seiteninhalts";
-App::$strings["activity"] = "Aktivität";
-App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
-App::$strings["Pages"] = "Seiten";
-App::$strings["Import website..."] = "Webseite importieren...";
-App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
-App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
-App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
-App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
-App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
-App::$strings["Select folder"] = "Ordner auswählen";
-App::$strings["Export website..."] = "Webseite exportieren...";
-App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
-App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
-App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
-App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
-App::$strings["Specify folder"] = "Ordner angeben";
-App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
-App::$strings["Different viewers will see this text differently"] = "Verschiedene Betrachter werden diesen Text unterschiedlich sehen";
-App::$strings["Help:"] = "Hilfe:";
App::$strings["New Page"] = "Neue Seite";
App::$strings["%d invitation available"] = array(
0 => "%d Einladung verfügbar",
@@ -2670,8 +2702,6 @@ App::$strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morg
App::$strings["Random Profile"] = "Zufallsprofil";
App::$strings["Invite Friends"] = "Lade Freunde ein";
App::$strings["Advanced example: name=fred and country=iceland"] = "Fortgeschrittenes Beispiel: name=fred and country=iceland";
-App::$strings["Everything"] = "Alles";
-App::$strings["Categories"] = "Kategorien";
App::$strings["%d connection in common"] = array(
0 => "%d gemeinsame Verbindung",
1 => "%d gemeinsame Verbindungen",
@@ -2710,7 +2740,18 @@ App::$strings["about a year"] = "ungefähr ein Jahr";
App::$strings["%d years"] = "%d Jahre";
App::$strings[" "] = " ";
App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["January"] = "Januar";
+App::$strings["February"] = "Februar";
+App::$strings["March"] = "März";
+App::$strings["April"] = "April";
App::$strings["__ctx:long__ May"] = "Mai";
+App::$strings["June"] = "Juni";
+App::$strings["July"] = "Juli";
+App::$strings["August"] = "August";
+App::$strings["September"] = "September";
+App::$strings["October"] = "Oktober";
+App::$strings["November"] = "November";
+App::$strings["December"] = "Dezember";
App::$strings["Jan"] = "Jan";
App::$strings["Feb"] = "Feb";
App::$strings["Mar"] = "Mär";
@@ -2723,6 +2764,13 @@ App::$strings["Sep"] = "Sep";
App::$strings["Oct"] = "Okt";
App::$strings["Nov"] = "Nov";
App::$strings["Dec"] = "Dez";
+App::$strings["Sunday"] = "Sonntag";
+App::$strings["Monday"] = "Montag";
+App::$strings["Tuesday"] = "Dienstag";
+App::$strings["Wednesday"] = "Mittwoch";
+App::$strings["Thursday"] = "Donnerstag";
+App::$strings["Friday"] = "Freitag";
+App::$strings["Saturday"] = "Samstag";
App::$strings["Sun"] = "So";
App::$strings["Mon"] = "Mo";
App::$strings["Tue"] = "Di";
@@ -2735,6 +2783,25 @@ App::$strings["__ctx:calendar__ month"] = "Monat";
App::$strings["__ctx:calendar__ week"] = "Woche";
App::$strings["__ctx:calendar__ day"] = "Tag";
App::$strings["__ctx:calendar__ All day"] = "Ganztägig";
+App::$strings["Directory Options"] = "Verzeichnisoptionen";
+App::$strings["Safe Mode"] = "Sicherer Modus";
+App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
+App::$strings["This Website Only"] = "Nur dieser Hub";
+App::$strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
+App::$strings["No source file."] = "Keine Quelldatei.";
+App::$strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
+App::$strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
+App::$strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
+App::$strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
+App::$strings["Path not available."] = "Pfad nicht verfügbar.";
+App::$strings["Empty pathname"] = "Leere Pfadangabe";
+App::$strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
+App::$strings["Path not found."] = "Pfad nicht gefunden.";
+App::$strings["mkdir failed."] = "mkdir fehlgeschlagen.";
+App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
+App::$strings["Empty path"] = "Leere Pfadangabe";
App::$strings["view full size"] = "In Vollbildansicht anschauen";
App::$strings["No Subject"] = "Kein Betreff";
App::$strings["OStatus"] = "OStatus";
@@ -2745,23 +2812,158 @@ App::$strings["Zot"] = "Zot!";
App::$strings["LinkedIn"] = "LinkedIn";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings["Tags"] = "Schlagwörter";
-App::$strings["Keywords"] = "Schlüsselwörter";
-App::$strings["have"] = "habe";
-App::$strings["has"] = "hat";
-App::$strings["want"] = "will";
-App::$strings["wants"] = "will";
-App::$strings["likes"] = "gefällt";
-App::$strings["dislikes"] = "missfällt";
+App::$strings[" by "] = "von";
+App::$strings[" on "] = "am";
+App::$strings["Embedded content"] = "Eingebetteter Inhalt";
+App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
+App::$strings["Image file is empty."] = "Bilddatei ist leer.";
+App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
+App::$strings["a new photo"] = "ein neues Foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
+App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
+App::$strings["prev"] = "vorherige";
+App::$strings["first"] = "erste";
+App::$strings["last"] = "letzte";
+App::$strings["next"] = "nächste";
+App::$strings["older"] = "älter";
+App::$strings["newer"] = "neuer";
+App::$strings["No connections"] = "Keine Verbindungen";
+App::$strings["View all %s connections"] = "Alle Verbindungen von %s anzeigen";
+App::$strings["poke"] = "anstupsen";
+App::$strings["ping"] = "anpingen";
+App::$strings["pinged"] = "pingte";
+App::$strings["prod"] = "knuffen";
+App::$strings["prodded"] = "knuffte";
+App::$strings["slap"] = "ohrfeigen";
+App::$strings["slapped"] = "ohrfeigte";
+App::$strings["finger"] = "befummeln";
+App::$strings["fingered"] = "befummelte";
+App::$strings["rebuff"] = "eine Abfuhr erteilen";
+App::$strings["rebuffed"] = "zurückgewiesen";
+App::$strings["happy"] = "glücklich";
+App::$strings["sad"] = "traurig";
+App::$strings["mellow"] = "sanft";
+App::$strings["tired"] = "müde";
+App::$strings["perky"] = "frech";
+App::$strings["angry"] = "sauer";
+App::$strings["stupefied"] = "verblüfft";
+App::$strings["puzzled"] = "verwirrt";
+App::$strings["interested"] = "interessiert";
+App::$strings["bitter"] = "verbittert";
+App::$strings["cheerful"] = "fröhlich";
+App::$strings["alive"] = "lebendig";
+App::$strings["annoyed"] = "verärgert";
+App::$strings["anxious"] = "unruhig";
+App::$strings["cranky"] = "schrullig";
+App::$strings["disturbed"] = "verstört";
+App::$strings["frustrated"] = "frustriert";
+App::$strings["depressed"] = "deprimiert";
+App::$strings["motivated"] = "motiviert";
+App::$strings["relaxed"] = "entspannt";
+App::$strings["surprised"] = "überrascht";
+App::$strings["May"] = "Mai";
+App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
+App::$strings["unknown"] = "unbekannt";
+App::$strings["remove category"] = "Kategorie entfernen";
+App::$strings["remove from file"] = "aus der Datei entfernen";
+App::$strings["Page layout"] = "Seiten-Layout";
+App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
+App::$strings["Page content type"] = "Art des Seiteninhalts";
+App::$strings["activity"] = "Aktivität";
+App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
+App::$strings["Pages"] = "Seiten";
+App::$strings["Import website..."] = "Webseite importieren...";
+App::$strings["Select folder to import"] = "Ordner zum Importieren auswählen";
+App::$strings["Import from a zipped folder:"] = "Aus einem gezippten Ordner importieren:";
+App::$strings["Import from cloud files:"] = "Aus Cloud-Dateien importieren:";
+App::$strings["/cloud/channel/path/to/folder"] = "/Cloud/Kanal/Pfad/zum/Ordner";
+App::$strings["Enter path to website files"] = "Pfad zu Webseitendateien eingeben";
+App::$strings["Select folder"] = "Ordner auswählen";
+App::$strings["Export website..."] = "Webseite exportieren...";
+App::$strings["Export to a zip file"] = "In eine ZIP-Datei exportieren";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Geben Sie einen für die ZIP-Datei ein.";
+App::$strings["Export to cloud files"] = "In Cloud-Dateien exportieren";
+App::$strings["/path/to/export/folder"] = "/Pfad/zum/exportierenden/Ordner";
+App::$strings["Enter a path to a cloud files destination."] = "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein.";
+App::$strings["Specify folder"] = "Ordner angeben";
+App::$strings["Remote authentication"] = "Ãœber Konto auf anderem Server einloggen";
+App::$strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
+App::$strings["Logout"] = "Abmelden";
+App::$strings["End this session"] = "Beende diese Sitzung";
+App::$strings["Your profile page"] = "Deine Profilseite";
+App::$strings["Manage/Edit profiles"] = "Profile verwalten";
+App::$strings["Edit your profile"] = "Profil bearbeiten";
+App::$strings["Sign in"] = "Anmelden";
+App::$strings["Get me home"] = "Bringe mich nach Hause (eigener Kanal)";
+App::$strings["Log me out of this site"] = "Logge mich von dieser Seite aus";
+App::$strings["Create an account"] = "Erzeuge ein Konto";
+App::$strings["Help and documentation"] = "Hilfe und Dokumentation";
+App::$strings["Applications, utilities, links, games"] = "Anwendungen (Apps), Zubehör, Links, Spiele";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Channel Directory"] = "Kanal-Verzeichnis";
+App::$strings["Your grid"] = "Dein Grid";
+App::$strings["View your network/grid"] = "Zeige Dein Netzwerk/Grid an";
+App::$strings["Mark all grid notifications seen"] = "Alle Grid-Benachrichtigungen als angesehen markieren";
+App::$strings["Channel home"] = "Mein Kanal";
+App::$strings["View your channel home"] = "Zeige Deine Kanalseite an";
+App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
+App::$strings["Notices"] = "Benachrichtigungen";
+App::$strings["Notifications"] = "Benachrichtigungen";
+App::$strings["View all notifications"] = "Alle Benachrichtigungen ansehen";
+App::$strings["Private mail"] = "Persönliche Mail";
+App::$strings["View your private messages"] = "Zeige Deine persönlichen Nachrichten an";
+App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
+App::$strings["Event Calendar"] = "Terminkalender";
+App::$strings["View events"] = "Termine ansehen";
+App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
+App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
+App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
+App::$strings["Documentation"] = "Dokumentation";
+App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
+App::$strings["Please wait..."] = "Bitte warten...";
App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kann keinen doppelten Kanal-Identifikator auf diesem System erzeugen (Spitzname oder Hash schon belegt). Import fehlgeschlagen.";
App::$strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
+App::$strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
App::$strings["Unable to import element \""] = "Element konnte nicht importiert werden.";
-App::$strings["guest:"] = "Gast:";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Das Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde.";
-App::$strings["Invalid data packet"] = "Ungültiges Datenpaket";
-App::$strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
-App::$strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
-App::$strings["invalid target signature"] = "Ungültige Signatur des Ziels";
+App::$strings["Logged out."] = "Ausgeloggt.";
+App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
+App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
+App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
+App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
+App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelöscht und existiert nicht mehr.";
+App::$strings["Protocol disabled."] = "Protokoll deaktiviert.";
+App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen";
+App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
+App::$strings[" and "] = "und";
+App::$strings["public profile"] = "öffentliches Profil";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
+App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+App::$strings["Image/photo"] = "Bild/Foto";
+App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
+App::$strings["Install %s element: "] = "Element %s installieren: ";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
+App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
+App::$strings["spoiler"] = "Spoiler";
+App::$strings["$1 wrote:"] = "$1 schrieb:";
+App::$strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
+App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
+App::$strings["edit"] = "Bearbeiten";
+App::$strings["Privacy Groups"] = "Gruppen";
+App::$strings["Edit group"] = "Gruppe ändern";
+App::$strings["Add privacy group"] = "Gruppe hinzufügen";
+App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
+App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
+App::$strings["Not specified"] = "Keine Angabe";
+App::$strings["Needs Action"] = "Aktion erforderlich";
+App::$strings["Completed"] = "Abgeschlossen";
+App::$strings["In Process"] = "In Bearbeitung";
+App::$strings["Cancelled"] = "gestrichen";
App::$strings["(Unknown)"] = "(Unbekannt)";
App::$strings["Visible to anybody on the internet."] = "Für jeden im Internet sichtbar.";
App::$strings["Visible to you only."] = "Nur für Dich sichtbar.";
@@ -2778,125 +2980,6 @@ App::$strings["profile photo"] = "Profilfoto";
App::$strings["[Edited %s]"] = "[%s wurde bearbeitet]";
App::$strings["__ctx:edit_activity__ Post"] = "Beitrag";
App::$strings["__ctx:edit_activity__ Comment"] = "Kommentar";
-App::$strings["Logged out."] = "Ausgeloggt.";
-App::$strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
-App::$strings[" and "] = "und";
-App::$strings["public profile"] = "öffentliches Profil";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
-App::$strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
-App::$strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
-App::$strings["No source file."] = "Keine Quelldatei.";
-App::$strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
-App::$strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
-App::$strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
-App::$strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
-App::$strings["Path not available."] = "Pfad nicht verfügbar.";
-App::$strings["Empty pathname"] = "Leere Pfadangabe";
-App::$strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
-App::$strings["Path not found."] = "Pfad nicht gefunden.";
-App::$strings["mkdir failed."] = "mkdir fehlgeschlagen.";
-App::$strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
-App::$strings["Empty path"] = "Leere Pfadangabe";
-App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
-App::$strings["Starts:"] = "Beginnt:";
-App::$strings["Finishes:"] = "Endet:";
-App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
-App::$strings["Not specified"] = "Keine Angabe";
-App::$strings["Needs Action"] = "Aktion erforderlich";
-App::$strings["Completed"] = "Abgeschlossen";
-App::$strings["In Process"] = "In Bearbeitung";
-App::$strings["Cancelled"] = "gestrichen";
-App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
-App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
-App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
-App::$strings["Channel was deleted and no longer exists."] = "Kanal wurde gelöscht und existiert nicht mehr.";
-App::$strings["Protocol disabled."] = "Protokoll deaktiviert.";
-App::$strings["Channel discovery failed."] = "Kanalsuche fehlgeschlagen";
-App::$strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die gelöscht wurde. Es <strong>könnten</strong> von damals noch Elemente (Beiträge, Dateien etc.) vorhanden sein, die allen jetzigen und zukünftigen Mitgliedern dieser Gruppe den Zugriff erlauben. Wenn das nicht Deine Absicht ist, erstelle bitte eine neue Gruppe mit einem anderen Namen.";
-App::$strings["Add new connections to this privacy group"] = "Neue Verbindung zu dieser Gruppe hinzufügen";
-App::$strings["edit"] = "Bearbeiten";
-App::$strings["Edit group"] = "Gruppe ändern";
-App::$strings["Add privacy group"] = "Gruppe hinzufügen";
-App::$strings["Channels not in any privacy group"] = "Kanäle, die in keiner Gruppe sind";
-App::$strings["add"] = "hinzufügen";
-App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
-App::$strings["Image file is empty."] = "Bilddatei ist leer.";
-App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
-App::$strings["a new photo"] = "ein neues Foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s hat %2\$s auf %3\$s veröffentlicht";
-App::$strings["Photo Albums"] = "Fotoalben";
-App::$strings["Upload New Photos"] = "Neue Fotos hochladen";
-App::$strings["System"] = "System";
-App::$strings["New App"] = "Neue App";
-App::$strings["Suggestions"] = "Vorschläge";
-App::$strings["See more..."] = "Mehr anzeigen …";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
-App::$strings["Add New Connection"] = "Neue Verbindung hinzufügen";
-App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
-App::$strings["Notes"] = "Notizen";
-App::$strings["Remove term"] = "Eintrag löschen";
-App::$strings["Archives"] = "Archive";
-App::$strings["Refresh"] = "Aktualisieren";
-App::$strings["Account settings"] = "Konto-Einstellungen";
-App::$strings["Channel settings"] = "Kanal-Einstellungen";
-App::$strings["Additional features"] = "Zusätzliche Funktionen";
-App::$strings["Feature/Addon settings"] = "Plugin-Einstellungen";
-App::$strings["Display settings"] = "Anzeige-Einstellungen";
-App::$strings["Manage locations"] = "Klon-Adressen verwalten";
-App::$strings["Export channel"] = "Kanal exportieren";
-App::$strings["Connected apps"] = "Verbundene Apps";
-App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
-App::$strings["Private Mail Menu"] = "Private Nachrichten";
-App::$strings["Combined View"] = "Kombinierte Anzeige";
-App::$strings["Conversations"] = "Konversationen";
-App::$strings["Received Messages"] = "Erhaltene Nachrichten";
-App::$strings["Sent Messages"] = "Gesendete Nachrichten";
-App::$strings["No messages."] = "Keine Nachrichten.";
-App::$strings["Delete conversation"] = "Unterhaltung löschen";
-App::$strings["Events Tools"] = "Kalenderwerkzeuge";
-App::$strings["Export Calendar"] = "Kalender exportieren";
-App::$strings["Import Calendar"] = "Kalender importieren";
-App::$strings["Chatrooms"] = "Chaträume";
-App::$strings["Overview"] = "Ãœbersicht";
-App::$strings["Chat Members"] = "Chatmitglieder";
-App::$strings["Wiki List"] = "Wikiliste";
-App::$strings["Create new wiki"] = "Neues Wiki erstellen";
-App::$strings["Send notification"] = "Benachrichtigung senden";
-App::$strings["Wiki Pages"] = "Wikiseiten";
-App::$strings["Add new page"] = "Neue Seite hinzufügen";
-App::$strings["Page name"] = "Seitenname";
-App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
-App::$strings["Suggested Chatrooms"] = "Chatraum-Vorschläge";
-App::$strings["photo/image"] = "Foto/Bild";
-App::$strings["Click to show more"] = "Klick, um mehr anzuzeigen";
-App::$strings["Rating Tools"] = "Bewertungswerkzeuge";
-App::$strings["Rate Me"] = "Bewerte mich";
-App::$strings["View Ratings"] = "Bewertungen ansehen";
-App::$strings["Forums"] = "Foren";
-App::$strings["Tasks"] = "Aufgaben";
-App::$strings["Documentation"] = "Dokumentation";
-App::$strings["Member registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
-App::$strings["Inspect queue"] = "Warteschlange kontrollieren";
-App::$strings["DB updates"] = "DB-Aktualisierungen";
-App::$strings["Plugin Features"] = "Plug-In Funktionen";
-App::$strings["Who can see this?"] = "Wer kann das sehen?";
-App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Wähle \"Anzeigen\", um Betrachtung zuzulassen. \"Nicht anzeigen\" überstimmt und limitiert den Aktionsradius von \"Anzeigen\" für Ausnahmen.";
-App::$strings["Show"] = "Anzeigen";
-App::$strings["Don't show"] = "Nicht anzeigen";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann.";
-App::$strings[" by "] = "von";
-App::$strings[" on "] = "am";
-App::$strings["Embedded content"] = "Eingebetteter Inhalt";
-App::$strings["Embedding disabled"] = "Einbetten deaktiviert";
-App::$strings["Attachments:"] = "Anhänge:";
-App::$strings["\$Projectname event notification:"] = "\$Projectname-Terminbenachrichtigung:";
App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
@@ -2910,101 +2993,82 @@ App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
-App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
-App::$strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s an";
-App::$strings["View %s's profile @ %s"] = "%ss Profil auf %s ansehen";
-App::$strings["Categories:"] = "Kategorien:";
-App::$strings["Filed under:"] = "Gespeichert unter:";
-App::$strings["View in context"] = "Im Zusammenhang anschauen";
-App::$strings["remove"] = "lösche";
-App::$strings["Delete Selected Items"] = "Lösche die ausgewählten Elemente";
-App::$strings["View Source"] = "Quelle anzeigen";
-App::$strings["Follow Thread"] = "Unterhaltung folgen";
-App::$strings["Unfollow Thread"] = "Unterhaltung nicht mehr folgen";
-App::$strings["Activity/Posts"] = "Aktivitäten/Beiträge";
-App::$strings["Edit Connection"] = "Verbindung bearbeiten";
-App::$strings["Message"] = "Nachricht";
-App::$strings["%s likes this."] = "%s gefällt das.";
-App::$strings["%s doesn't like this."] = "%s gefällt das nicht.";
-App::$strings["<span %1\$s>%2\$d people</span> like this."] = array(
- 0 => "<span %1\$s>%2\$d Person</span> gefällt das.",
- 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das.",
-);
-App::$strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
- 0 => "<span %1\$s>%2\$d Person</span> gefällt das nicht.",
- 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das nicht.",
-);
-App::$strings["and"] = "und";
-App::$strings[", and %d other people"] = array(
- 0 => "",
- 1 => ", und %d andere",
-);
-App::$strings["%s like this."] = "%s gefällt das.";
-App::$strings["%s don't like this."] = "%s gefällt das nicht.";
-App::$strings["Set your location"] = "Standort";
-App::$strings["Clear browser location"] = "Browser-Standort löschen";
-App::$strings["Tag term:"] = "Schlagwort:";
-App::$strings["Where are you right now?"] = "Wo bist Du jetzt grade?";
-App::$strings["Comments enabled"] = "Kommentare aktiviert";
-App::$strings["Comments disabled"] = "Kommentare deaktiviert";
-App::$strings["Page link name"] = "Link zur Seite";
-App::$strings["Post as"] = "Veröffentlichen als";
-App::$strings["Toggle voting"] = "Umfragewerkzeug aktivieren";
-App::$strings["Disable comments"] = "Kommentare deaktivieren";
-App::$strings["Toggle comments"] = "Kommentare umschalten";
-App::$strings["Categories (optional, comma-separated list)"] = "Kategorien (optional, kommagetrennte Liste)";
-App::$strings["Other networks and post services"] = "Andere Netzwerke und Platformen";
-App::$strings["Set publish date"] = "Veröffentlichungsdatum festlegen";
-App::$strings["Discover"] = "Entdecken";
-App::$strings["Imported public streams"] = "Importierte öffentliche Beiträge";
-App::$strings["Commented Order"] = "Neueste Kommentare";
-App::$strings["Sort by Comment Date"] = "Nach Kommentardatum sortiert";
-App::$strings["Posted Order"] = "Neueste Beiträge";
-App::$strings["Sort by Post Date"] = "Nach Beitragsdatum sortiert";
-App::$strings["Posts that mention or involve you"] = "Beiträge mit Beteiligung Deinerseits";
-App::$strings["Activity Stream - by date"] = "Activity Stream – nach Datum sortiert";
-App::$strings["Starred"] = "Markiert";
-App::$strings["Favourite Posts"] = "Markierte Beiträge";
-App::$strings["Spam"] = "Spam";
-App::$strings["Posts flagged as SPAM"] = "Nachrichten, die als SPAM markiert wurden";
-App::$strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
-App::$strings["About"] = "Ãœber";
-App::$strings["Profile Details"] = "Profil-Details";
-App::$strings["Files and Storage"] = "Dateien und Speicher";
-App::$strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen";
-App::$strings["Manage Webpages"] = "Webseiten verwalten";
-App::$strings["__ctx:noun__ Attending"] = array(
- 0 => "Zusage",
- 1 => "Zusagen",
-);
-App::$strings["__ctx:noun__ Not Attending"] = array(
- 0 => "Absage",
- 1 => "Absagen",
-);
-App::$strings["__ctx:noun__ Undecided"] = array(
- 0 => " Unentschlossen",
- 1 => "Unentschlossene",
-);
-App::$strings["__ctx:noun__ Agree"] = array(
- 0 => "Zustimmung",
- 1 => "Zustimmungen",
-);
-App::$strings["__ctx:noun__ Disagree"] = array(
- 0 => "Ablehnung",
- 1 => "Ablehnungen",
-);
-App::$strings["__ctx:noun__ Abstain"] = array(
- 0 => "Enthaltung",
- 1 => "Enthaltungen",
-);
-App::$strings["Image/photo"] = "Bild/Foto";
-App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
-App::$strings["Install %s element: "] = "Element %s installieren: ";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
-App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
-App::$strings["spoiler"] = "Spoiler";
-App::$strings["$1 wrote:"] = "$1 schrieb:";
+App::$strings["General Features"] = "Allgemeine Funktionen";
+App::$strings["Multiple Profiles"] = "Mehrfachprofile";
+App::$strings["Ability to create multiple profiles"] = "Ermöglicht das Anlegen mehrerer Profile pro Kanal";
+App::$strings["Advanced Profiles"] = "Erweiterte Profile";
+App::$strings["Additional profile sections and selections"] = "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung";
+App::$strings["Profile Import/Export"] = "Profil-Import/Export";
+App::$strings["Save and load profile details across sites/channels"] = "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren";
+App::$strings["Web Pages"] = "Webseiten";
+App::$strings["Provide managed web pages on your channel"] = "Ermöglicht das Erstellen von Webseiten in Deinem Kanal";
+App::$strings["Provide a wiki for your channel"] = "Stelle ein Wiki in Deinem Kanal zur Verfügung";
+App::$strings["Private Notes"] = "Private Notizen";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)";
+App::$strings["Navigation Channel Select"] = "Kanal-Auswahl in der Navigationsleiste";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü";
+App::$strings["Photo Location"] = "Aufnahmeort";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte";
+App::$strings["Access Controlled Chatrooms"] = "Zugriffskontrollierte Chaträume";
+App::$strings["Provide chatrooms and chat services with access control."] = "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an.";
+App::$strings["Provide alternate connection permission roles."] = "Stelle benutzerdefinierte Berechtigungsrollen für Verbindungen zur Verfügung.";
+App::$strings["Smart Birthdays"] = "Smarte Geburtstage";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind.";
+App::$strings["Event Timezone Selection"] = "Termin-Zeitzonenauswahl";
+App::$strings["Allow event creation in timezones other than your own."] = "";
+App::$strings["Advanced Directory Search"] = "Erweiterte Verzeichnissuche";
+App::$strings["Allows creation of complex directory search queries"] = "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen";
+App::$strings["Advanced Theme and Layout Settings"] = "Erweiterte Design- und Layout-Einstellungen";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Erlaubt die Feineinstellung von Designs und Seitenlayouts";
+App::$strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
+App::$strings["Large Photos"] = "Große Fotos";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet.";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds";
+App::$strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)";
+App::$strings["Enable Voting Tools"] = "Umfragewerkzeuge aktivieren";
+App::$strings["Provide a class of post which others can vote on"] = "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)";
+App::$strings["Disable Comments"] = "Kommentare deaktivieren";
+App::$strings["Provide the option to disable comments for a post"] = "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten";
+App::$strings["Delayed Posting"] = "Verzögertes Senden";
+App::$strings["Allow posts to be published at a later date"] = "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen";
+App::$strings["Content Expiration"] = "Verfall von Inhalten";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum.";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Doppelte Beiträge unterdrücken";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden.";
+App::$strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
+App::$strings["Search by Date"] = "Suche nach Datum";
+App::$strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
+App::$strings["Enable management and selection of privacy groups"] = "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren";
+App::$strings["Save search terms for re-use"] = "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung";
+App::$strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast";
+App::$strings["Network New Tab"] = "Netzwerkreiter Neu";
+App::$strings["Enable tab to display all new Network activity"] = "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt";
+App::$strings["Affinity Tool"] = "Beziehungs-Tool";
+App::$strings["Filter stream activity by depth of relationships"] = "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann";
+App::$strings["Show friend and connection suggestions"] = "Freund- und Verbindungsvorschläge anzeigen";
+App::$strings["Connection Filtering"] = "Filter für Verbindungen";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)";
+App::$strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
+App::$strings["Community Tagging"] = "Gemeinschaftliches Verschlagworten";
+App::$strings["Ability to tag existing posts"] = "Ermöglicht das Verschlagworten existierender Beiträge";
+App::$strings["Post Categories"] = "Beitrags-Kategorien";
+App::$strings["Add categories to your posts"] = "Aktiviert Kategorien für Beiträge";
+App::$strings["Emoji Reactions"] = "Emoji Reaktionen";
+App::$strings["Add emoji reaction ability to posts"] = "Aktiviert Emoji-Reaktionen für Beiträge";
+App::$strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
+App::$strings["Dislike Posts"] = "Gefällt-mir-nicht-Beiträge";
+App::$strings["Ability to dislike posts/comments"] = "Aktiviert die „Gefällt mir nicht“-Schaltfläche";
+App::$strings["Star Posts"] = "Beiträge mit Sternchen versehen";
+App::$strings["Ability to mark special posts with a star indicator"] = "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol";
+App::$strings["Tag Cloud"] = "Schlagwort-Wolke";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite";
+App::$strings["Premium Channel"] = "Premium-Kanal";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen";
+App::$strings["Help:"] = "Hilfe:";
+App::$strings["Not Found"] = "Nicht gefunden";
+App::$strings["Source channel not found."] = "Quellkanal nicht gefunden.";
App::$strings["Focus (Hubzilla default)"] = "Focus (Voreinstellung für Hubzilla)";
App::$strings["Theme settings"] = "Theme-Einstellungen";
App::$strings["Narrow navbar"] = "Schmale Navigationsleiste";
@@ -3038,11 +3102,9 @@ App::$strings["Left align page content"] = "Seiteninhalt linksbündig anzeigen";
App::$strings["Set minimum opacity of nav bar - to hide it"] = "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)";
App::$strings["Set size of conversation author photo"] = "Größe der Avatare von Themenstartern";
App::$strings["Set size of followup author photos"] = "Größe der Avatare von Kommentatoren";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen.";
App::$strings["Update Error at %s"] = "Aktualisierungsfehler auf %s";
-App::$strings["Create an account to access services and applications within the Hubzilla"] = "Erstelle ein Konto, um Anwendungen und Dienste innerhalb von Hubzilla nutzen zu können.";
+App::$strings["Create an account to access services and applications"] = "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können.";
App::$strings["Login/Email"] = "Anmelden/E-Mail";
App::$strings["Password"] = "Kennwort";
App::$strings["Remember me"] = "Angaben speichern";
diff --git a/view/fr/hmessages.po b/view/fr/hmessages.po
index 73d711700..6f0453f9d 100644
--- a/view/fr/hmessages.po
+++ b/view/fr/hmessages.po
@@ -1,16 +1,18 @@
-# Hubzilla Project
-# Copyright (C) 2012-2014 the Hubzilla Project
-# This file is distributed under the same license as the Red package.
+# hubzilla
+# Copyright (C) 2012-2016 hubzilla
+# This file is distributed under the same license as the hubzilla package.
#
# Translators:
# kris1373 <aktosc@gmail.com>, 2015-2016
-# Raymond Monret <raymond.monret@retmesagxo.net>, 2016
+# rmonret <raymond.monret@retmesagxo.net>, 2016
+# rmonret <raymond.monret@retmesagxo.net>, 2017
+# Seraph Ino, 2016
msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-10 00:02-0700\n"
-"PO-Revision-Date: 2016-06-10 09:14+0000\n"
+"POT-Creation-Date: 2017-03-31 10:53+0200\n"
+"PO-Revision-Date: 2017-04-01 09:31+0000\n"
"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/Friendica/red-matrix/language/fr/)\n"
"MIME-Version: 1.0\n"
@@ -19,496 +21,1825 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:239
-msgid "parent"
-msgstr "retour"
+#: ../../Zotlabs/Access/Permissions.php:46
+msgid "Can view my channel stream and posts"
+msgstr "Peut voir mon canal et mes publicatiosn"
-#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2620
-msgid "Collection"
-msgstr "Groupe de contacts"
+#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+msgid "Can send me their channel stream and posts"
+msgstr "Peuvent m'envoyer leur flux et les publications de leur canal"
-#: ../../Zotlabs/Storage/Browser.php:134
-msgid "Principal"
-msgstr "Principal"
+#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+msgid "Can view my default channel profile"
+msgstr "Peut voir le profil par défaut du canal."
-#: ../../Zotlabs/Storage/Browser.php:137
-msgid "Addressbook"
-msgstr "Carnet d'adresse"
+#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+msgid "Can view my connections"
+msgstr "Peut voir mes contacts"
-#: ../../Zotlabs/Storage/Browser.php:140
-msgid "Calendar"
-msgstr "Calendrier"
+#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+msgid "Can view my file storage and photos"
+msgstr "Peut voir mes fichiers et photos"
-#: ../../Zotlabs/Storage/Browser.php:143
-msgid "Schedule Inbox"
-msgstr "Calendrier - Messages entrants"
+#: ../../Zotlabs/Access/Permissions.php:51
+msgid "Can upload/modify my file storage and photos"
+msgstr "Peut télécharger/modifier mes fichiers et mes photos"
-#: ../../Zotlabs/Storage/Browser.php:146
-msgid "Schedule Outbox"
-msgstr "Calendrier - Messages sortants"
+#: ../../Zotlabs/Access/Permissions.php:52
+msgid "Can view my channel webpages"
+msgstr "Peut voir les pages web de mon canal"
-#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Module/Photos.php:798
-#: ../../Zotlabs/Module/Photos.php:1243 ../../Zotlabs/Lib/Apps.php:486
-#: ../../Zotlabs/Lib/Apps.php:561 ../../include/widgets.php:1505
-#: ../../include/conversation.php:1032
-msgid "Unknown"
-msgstr "Inconnu"
+#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr "Peut voir les pages de mon wiki"
-#: ../../Zotlabs/Storage/Browser.php:226 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:216 ../../include/nav.php:93
-#: ../../include/conversation.php:1639
-msgid "Files"
-msgstr "Fichiers"
+#: ../../Zotlabs/Access/Permissions.php:54
+msgid "Can create/edit my channel webpages"
+msgstr "Peut créer ou modifier les pages web de mon canal"
-#: ../../Zotlabs/Storage/Browser.php:227
-msgid "Total"
-msgstr "Total"
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr "Peut écrire sur mon wiki"
-#: ../../Zotlabs/Storage/Browser.php:229
-msgid "Shared"
-msgstr "Partagé"
+#: ../../Zotlabs/Access/Permissions.php:56
+msgid "Can post on my channel (wall) page"
+msgstr "Peut écrire sur le mur de mon canal (mur)"
-#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:306
-#: ../../Zotlabs/Module/Blocks.php:156 ../../Zotlabs/Module/Layouts.php:182
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:142
-#: ../../Zotlabs/Module/Webpages.php:186
-msgid "Create"
-msgstr "Créer"
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+msgid "Can comment on or like my posts"
+msgstr "Peuvent commenter et/ou aimer mes publications"
-#: ../../Zotlabs/Storage/Browser.php:231 ../../Zotlabs/Storage/Browser.php:308
-#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Photos.php:825 ../../Zotlabs/Module/Photos.php:1364
-#: ../../Zotlabs/Module/Profile_photo.php:368 ../../include/widgets.php:1518
-msgid "Upload"
-msgstr "Envoyer"
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+msgid "Can send me private mail messages"
+msgstr "Peuvent m'envoyer des messages privés"
-#: ../../Zotlabs/Storage/Browser.php:235 ../../Zotlabs/Module/Chat.php:247
-#: ../../Zotlabs/Module/Admin.php:1223 ../../Zotlabs/Module/Settings.php:592
-#: ../../Zotlabs/Module/Settings.php:618
-#: ../../Zotlabs/Module/Sharedwithme.php:99
-msgid "Name"
-msgstr "Nom"
+#: ../../Zotlabs/Access/Permissions.php:59
+msgid "Can like/dislike profiles and profile things"
+msgstr "Peut aimer ou détester des profiles"
-#: ../../Zotlabs/Storage/Browser.php:236
-msgid "Type"
-msgstr "Type"
+#: ../../Zotlabs/Access/Permissions.php:60
+msgid "Can forward to all my channel connections via @+ mentions in posts"
+msgstr "Peut faire suivre à tous mes contacts avec la mention @+ dans une publication"
-#: ../../Zotlabs/Storage/Browser.php:237
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1344
-msgid "Size"
-msgstr "Taille"
+#: ../../Zotlabs/Access/Permissions.php:61
+msgid "Can chat with me"
+msgstr "Peut discuter avec moi"
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-msgid "Last Modified"
-msgstr "Modifié le"
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+msgid "Can source my public posts in derived channels"
+msgstr "Peut rediriger mes publications publiques vers des canaux dérivés"
-#: ../../Zotlabs/Storage/Browser.php:240 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Editblock.php:109
-#: ../../Zotlabs/Module/Connections.php:290
-#: ../../Zotlabs/Module/Connections.php:310
-#: ../../Zotlabs/Module/Editpost.php:84
-#: ../../Zotlabs/Module/Editlayout.php:113
-#: ../../Zotlabs/Module/Editwebpage.php:146
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Admin.php:2113 ../../Zotlabs/Module/Settings.php:652
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Webpages.php:187
-#: ../../Zotlabs/Lib/Apps.php:337 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../include/channel.php:937 ../../include/channel.php:941
-#: ../../include/menu.php:108 ../../include/page_widgets.php:8
-#: ../../include/page_widgets.php:36
-msgid "Edit"
-msgstr "Modifier"
+#: ../../Zotlabs/Access/Permissions.php:63
+msgid "Can administer my channel"
+msgstr "Peut administrer mon canal"
-#: ../../Zotlabs/Storage/Browser.php:241 ../../Zotlabs/Module/Blocks.php:159
-#: ../../Zotlabs/Module/Connedit.php:572
-#: ../../Zotlabs/Module/Editblock.php:134
-#: ../../Zotlabs/Module/Connections.php:263
-#: ../../Zotlabs/Module/Editlayout.php:136
-#: ../../Zotlabs/Module/Editwebpage.php:170 ../../Zotlabs/Module/Group.php:177
-#: ../../Zotlabs/Module/Photos.php:1173 ../../Zotlabs/Module/Admin.php:1039
-#: ../../Zotlabs/Module/Admin.php:1213 ../../Zotlabs/Module/Admin.php:2114
-#: ../../Zotlabs/Module/Settings.php:653 ../../Zotlabs/Module/Thing.php:261
-#: ../../Zotlabs/Module/Webpages.php:189 ../../Zotlabs/Lib/Apps.php:338
-#: ../../Zotlabs/Lib/ThreadItem.php:126 ../../include/conversation.php:657
-msgid "Delete"
-msgstr "Supprimer"
+#: ../../Zotlabs/Access/PermissionRoles.php:248
+#: ../../include/permissions.php:945
+msgid "Social Networking"
+msgstr "Réseau social"
-#: ../../Zotlabs/Storage/Browser.php:285
-#, php-format
-msgid "You are using %1$s of your available file storage."
-msgstr "Vous utilisez %1$s de votre espace de stockage."
+#: ../../Zotlabs/Access/PermissionRoles.php:249
+#: ../../include/permissions.php:945
+msgid "Social - Mostly Public"
+msgstr "Social - principalement public"
-#: ../../Zotlabs/Storage/Browser.php:290
-#, php-format
-msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
-msgstr "Vous utilisez %1$s sur %2$s d'espace disponible. (%3$s&#37;)"
+#: ../../Zotlabs/Access/PermissionRoles.php:250
+#: ../../include/permissions.php:945
+msgid "Social - Restricted"
+msgstr "Social - restreint"
-#: ../../Zotlabs/Storage/Browser.php:302
-msgid "WARNING:"
-msgstr "AVERTISSEMENT&nbsp;:"
+#: ../../Zotlabs/Access/PermissionRoles.php:251
+#: ../../include/permissions.php:945
+msgid "Social - Private"
+msgstr "Social - privé"
-#: ../../Zotlabs/Storage/Browser.php:305
-msgid "Create new folder"
-msgstr "Nouveau dossier"
+#: ../../Zotlabs/Access/PermissionRoles.php:254
+#: ../../include/permissions.php:946
+msgid "Community Forum"
+msgstr "Forum communautaire"
-#: ../../Zotlabs/Storage/Browser.php:307
-msgid "Upload file"
-msgstr "Téléverser un fichier"
+#: ../../Zotlabs/Access/PermissionRoles.php:255
+#: ../../include/permissions.php:946
+msgid "Forum - Mostly Public"
+msgstr "Forum - principalement public"
-#: ../../Zotlabs/Web/WebServer.php:120 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:49 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Like.php:284 ../../Zotlabs/Module/Import_items.php:112
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../include/items.php:385
-msgid "Permission denied"
-msgstr "Accès refusé"
+#: ../../Zotlabs/Access/PermissionRoles.php:256
+#: ../../include/permissions.php:946
+msgid "Forum - Restricted"
+msgstr "Forum - restreint"
-#: ../../Zotlabs/Web/WebServer.php:121 ../../Zotlabs/Web/Router.php:65
-#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Blocks.php:73
-#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Channel.php:105
-#: ../../Zotlabs/Module/Channel.php:226 ../../Zotlabs/Module/Channel.php:267
-#: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Bookmarks.php:61
-#: ../../Zotlabs/Module/Connedit.php:366 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Connections.php:33
-#: ../../Zotlabs/Module/Cover_photo.php:277
-#: ../../Zotlabs/Module/Cover_photo.php:290
-#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Events.php:265
-#: ../../Zotlabs/Module/Editlayout.php:67
-#: ../../Zotlabs/Module/Editlayout.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:69
-#: ../../Zotlabs/Module/Editwebpage.php:90
-#: ../../Zotlabs/Module/Editwebpage.php:105
-#: ../../Zotlabs/Module/Editwebpage.php:127 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Api.php:13 ../../Zotlabs/Module/Api.php:18
-#: ../../Zotlabs/Module/Filestorage.php:24
-#: ../../Zotlabs/Module/Filestorage.php:79
-#: ../../Zotlabs/Module/Filestorage.php:94
-#: ../../Zotlabs/Module/Filestorage.php:121 ../../Zotlabs/Module/Item.php:210
-#: ../../Zotlabs/Module/Item.php:218 ../../Zotlabs/Module/Item.php:1070
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Id.php:76
-#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Invite.php:17
-#: ../../Zotlabs/Module/Invite.php:91 ../../Zotlabs/Module/Locs.php:87
-#: ../../Zotlabs/Module/Mail.php:129 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Network.php:17
-#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/New_channel.php:77
-#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Notifications.php:70
-#: ../../Zotlabs/Module/Photos.php:75 ../../Zotlabs/Module/Page.php:35
-#: ../../Zotlabs/Module/Page.php:90 ../../Zotlabs/Module/Pdledit.php:26
-#: ../../Zotlabs/Module/Poke.php:137 ../../Zotlabs/Module/Profile.php:68
-#: ../../Zotlabs/Module/Profile.php:76 ../../Zotlabs/Module/Profiles.php:203
-#: ../../Zotlabs/Module/Profiles.php:601
-#: ../../Zotlabs/Module/Profile_photo.php:256
-#: ../../Zotlabs/Module/Profile_photo.php:269
-#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Appman.php:75
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Regmod.php:21
-#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Settings.php:572 ../../Zotlabs/Module/Setup.php:215
-#: ../../Zotlabs/Module/Sharedwithme.php:11
-#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
-#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
-#: ../../Zotlabs/Module/Thing.php:331
-#: ../../Zotlabs/Module/Viewconnections.php:25
-#: ../../Zotlabs/Module/Viewconnections.php:30
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Webpages.php:74
-#: ../../Zotlabs/Lib/Chatroom.php:137 ../../include/items.php:3438
-#: ../../include/attach.php:141 ../../include/attach.php:189
-#: ../../include/attach.php:252 ../../include/attach.php:266
-#: ../../include/attach.php:273 ../../include/attach.php:338
-#: ../../include/attach.php:352 ../../include/attach.php:359
-#: ../../include/attach.php:437 ../../include/attach.php:895
-#: ../../include/attach.php:966 ../../include/attach.php:1118
-#: ../../include/photos.php:27
-msgid "Permission denied."
-msgstr "Permission refusée."
+#: ../../Zotlabs/Access/PermissionRoles.php:257
+#: ../../include/permissions.php:946
+msgid "Forum - Private"
+msgstr "Forum - privé"
-#: ../../Zotlabs/Web/Router.php:146 ../../Zotlabs/Module/Help.php:94
-msgid "Not Found"
-msgstr "Introuvable"
+#: ../../Zotlabs/Access/PermissionRoles.php:260
+#: ../../include/permissions.php:947
+msgid "Feed Republish"
+msgstr "Republication de flux"
-#: ../../Zotlabs/Web/Router.php:149 ../../Zotlabs/Module/Block.php:79
-#: ../../Zotlabs/Module/Display.php:117 ../../Zotlabs/Module/Help.php:97
-#: ../../Zotlabs/Module/Page.php:93
-msgid "Page not found."
-msgstr "Page introuvable."
+#: ../../Zotlabs/Access/PermissionRoles.php:261
+#: ../../include/permissions.php:947
+msgid "Feed - Mostly Public"
+msgstr "Flux - principalement public"
-#: ../../Zotlabs/Zot/Auth.php:138
-msgid ""
-"Remote authentication blocked. You are logged into this site locally. Please"
-" logout and retry."
-msgstr "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer."
+#: ../../Zotlabs/Access/PermissionRoles.php:262
+#: ../../include/permissions.php:947
+msgid "Feed - Restricted"
+msgstr "Flux - restreint"
-#: ../../Zotlabs/Zot/Auth.php:246 ../../Zotlabs/Module/Openid.php:76
-#: ../../Zotlabs/Module/Openid.php:183
-#, php-format
-msgid "Welcome %s. Remote authentication successful."
-msgstr "Bienvenue %s. L'authentification distante a fonctionné."
+#: ../../Zotlabs/Access/PermissionRoles.php:265
+#: ../../include/permissions.php:948
+msgid "Special Purpose"
+msgstr "Utilisation spécifique"
+
+#: ../../Zotlabs/Access/PermissionRoles.php:266
+#: ../../include/permissions.php:948
+msgid "Special - Celebrity/Soapbox"
+msgstr "Spécial - célébrité/vitrine"
-#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
-#: ../../Zotlabs/Module/Editlayout.php:31
-#: ../../Zotlabs/Module/Editwebpage.php:33
-#: ../../Zotlabs/Module/Filestorage.php:60 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Profile.php:20
-#: ../../Zotlabs/Module/Webpages.php:34 ../../include/channel.php:837
+#: ../../Zotlabs/Access/PermissionRoles.php:267
+#: ../../include/permissions.php:948
+msgid "Special - Group Repository"
+msgstr "Spécial - dépôt partagé"
+
+#: ../../Zotlabs/Access/PermissionRoles.php:270
+#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
+#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
+#: ../../include/selectors.php:49 ../../include/selectors.php:66
+#: ../../include/selectors.php:104 ../../include/selectors.php:140
+#: ../../include/permissions.php:949 ../../include/connections.php:675
+#: ../../include/connections.php:682
+msgid "Other"
+msgstr "Autre"
+
+#: ../../Zotlabs/Access/PermissionRoles.php:271
+#: ../../include/permissions.php:949
+msgid "Custom/Expert Mode"
+msgstr "Mode expert/spécifique"
+
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17
+#: ../../Zotlabs/Module/Achievements.php:15 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
+#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
+#: ../../Zotlabs/Module/Webpages.php:33
+#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:943
msgid "Requested profile is not available."
msgstr "Profil demandé non disponible."
-#: ../../Zotlabs/Module/Achievements.php:38
-msgid "Some blurb about what to do when you're new here"
-msgstr "Quelques mots sur quoi faire quand on est nouveau ici"
+#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
+#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
+#: ../../Zotlabs/Module/Editlayout.php:67
+#: ../../Zotlabs/Module/Editlayout.php:90 ../../Zotlabs/Module/Channel.php:115
+#: ../../Zotlabs/Module/Channel.php:245 ../../Zotlabs/Module/Channel.php:285
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Locs.php:87
+#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Events.php:271
+#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
+#: ../../Zotlabs/Module/New_channel.php:77
+#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
+#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
+#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
+#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Profile_photo.php:280
+#: ../../Zotlabs/Module/Profile_photo.php:293
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:220
+#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1037
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
+#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
+#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Editwebpage.php:68
+#: ../../Zotlabs/Module/Editwebpage.php:89
+#: ../../Zotlabs/Module/Editwebpage.php:104
+#: ../../Zotlabs/Module/Editwebpage.php:126 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
+#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Cover_photo.php:281
+#: ../../Zotlabs/Module/Cover_photo.php:294
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Filestorage.php:78
+#: ../../Zotlabs/Module/Filestorage.php:93
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Viewconnections.php:28
+#: ../../Zotlabs/Module/Viewconnections.php:33
+#: ../../Zotlabs/Module/Service_limits.php:11
+#: ../../Zotlabs/Module/Rate.php:113 ../../Zotlabs/Module/Notifications.php:11
+#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
+#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
+#: ../../addon/gitwiki/Mod_Gitwiki.php:196
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
+#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:344 ../../include/attach.php:358
+#: ../../include/attach.php:365 ../../include/attach.php:442
+#: ../../include/attach.php:909 ../../include/attach.php:983
+#: ../../include/attach.php:1148 ../../include/items.php:3457
+#: ../../include/photos.php:27
+msgid "Permission denied."
+msgstr "Permission refusée."
-#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:152
-#: ../../Zotlabs/Module/Editblock.php:108
+#: ../../Zotlabs/Module/Blocks.php:97 ../../Zotlabs/Module/Blocks.php:155
+#: ../../Zotlabs/Module/Editblock.php:113
msgid "Block Name"
msgstr "Nom du Bloc"
-#: ../../Zotlabs/Module/Blocks.php:151 ../../include/text.php:2265
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2275
msgid "Blocks"
msgstr "Blocs"
-#: ../../Zotlabs/Module/Blocks.php:153
+#: ../../Zotlabs/Module/Blocks.php:156
msgid "Block Title"
msgstr "Titre du bloc"
-#: ../../Zotlabs/Module/Blocks.php:154 ../../Zotlabs/Module/Layouts.php:188
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:198
-#: ../../include/page_widgets.php:44
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
+#: ../../include/page_widgets.php:47
msgid "Created"
msgstr "Créé(e)"
-#: ../../Zotlabs/Module/Blocks.php:155 ../../Zotlabs/Module/Layouts.php:189
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:199
-#: ../../include/page_widgets.php:45
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
+#: ../../include/page_widgets.php:48
msgid "Edited"
msgstr "Modifié(e)"
-#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191
-#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Module/Webpages.php:188
-#: ../../include/conversation.php:1208
+#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:925 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
+#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
+#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
+#: ../../addon/cdav/include/widgets.php:127
+#: ../../addon/cdav/include/widgets.php:164
+msgid "Create"
+msgstr "Créer"
+
+#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Editlayout.php:114
+#: ../../Zotlabs/Module/Admin/Profs.php:154
+#: ../../Zotlabs/Module/Settings/Oauth.php:149
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
+#: ../../Zotlabs/Module/Connections.php:296
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
+#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Layouts.php:193
+#: ../../Zotlabs/Module/Editwebpage.php:147
+#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:357 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:238
+#: ../../addon/cdav/include/widgets.php:125
+#: ../../addon/cdav/include/widgets.php:161
+#: ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1042
+#: ../../include/channel.php:1046 ../../include/menu.php:113
+#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+msgid "Edit"
+msgstr "Modifier"
+
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
+#: ../../addon/cdav/include/widgets.php:123
+#: ../../include/conversation.php:1311
msgid "Share"
msgstr "Partager"
-#: ../../Zotlabs/Module/Blocks.php:163 ../../Zotlabs/Module/Layouts.php:195
-#: ../../Zotlabs/Module/Pubsites.php:47 ../../Zotlabs/Module/Webpages.php:193
-#: ../../include/page_widgets.php:39
+#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Admin/Accounts.php:173
+#: ../../Zotlabs/Module/Admin/Channels.php:149
+#: ../../Zotlabs/Module/Admin/Profs.php:155
+#: ../../Zotlabs/Module/Settings/Oauth.php:150
+#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
+#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:658
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Profiles.php:803
+#: ../../Zotlabs/Module/Editwebpage.php:172
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
+#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
+#: ../../include/conversation.php:654
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
msgid "View"
msgstr "Voir"
-#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Block.php:43
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:33
-msgid "Channel not found."
-msgstr "Canal introuvable."
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Limite du nombre total d'invitation dépassée."
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permissions refusées."
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s&nbsp;: adresse courriel invalide."
+
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Rejoignez-nous sur $Projectname"
+
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Limite d'invitations dépassée. Merci de contacter l'administration de votre site."
+
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s&nbsp;: Échec de distribution du message."
+
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d message envoyé."
+msgstr[1] "%d messages envoyés."
+
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "Vous ne disposez plus d'aucune invitation"
+
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Envoyer des invitations"
+
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Entrez les adresses de courriel, une par ligne&nbsp;:"
+
+#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:284
+msgid "Your message:"
+msgstr "Votre message&nbsp;:"
+
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Rejoignez ma communauté sur $Projectname."
+
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Vous devrez fournir le code suivant&nbsp;:"
+
+#: ../../Zotlabs/Module/Invite.php:142
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Enregistrez-vous sur n'importe quel serveur $Projectname (ils sont tous inter-connectés)"
+
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Saisissez l'adresse de mon canal $Projectname dans la barre de recherche du site."
+
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "ou rendez-vous sur"
+
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Cliquez sur [Ajouter]"
+
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Import_items.php:126
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Themes.php:158
+#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Import.php:511 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
+#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
+#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Connedit.php:890 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:425
+#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:84
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:133
+#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../addon/openclipatar/openclipatar.php:53
+#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
+#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
+#: ../../addon/mailhost/mailhost.php:40
+#: ../../addon/likebanner/likebanner.php:57
+#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
+#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
+#: ../../addon/diaspora/diaspora.php:714
+#: ../../addon/gitwiki/Mod_Gitwiki.php:155
+#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
+#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
+#: ../../addon/openstreetmap/openstreetmap.php:168
+#: ../../addon/rtof/rtof.php:101 ../../addon/jappixmini/jappixmini.php:371
+#: ../../addon/superblock/superblock.php:120 ../../addon/nofed/nofed.php:80
+#: ../../addon/redred/redred.php:119 ../../addon/logrot/logrot.php:35
+#: ../../addon/frphotos/frphotos.php:96 ../../addon/chords/Mod_Chords.php:60
+#: ../../addon/libertree/libertree.php:85
+#: ../../addon/flattrwidget/flattrwidget.php:124
+#: ../../addon/statusnet/statusnet.php:322
+#: ../../addon/statusnet/statusnet.php:380
+#: ../../addon/statusnet/statusnet.php:432
+#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
+#: ../../addon/twitter/twitter.php:259
+#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
+#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
+#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
+#: ../../include/js_strings.php:22
+msgid "Submit"
+msgstr "Envoyer"
+
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr "Élément introuvable"
+
+#: ../../Zotlabs/Module/Editlayout.php:128
+#: ../../Zotlabs/Module/Layouts.php:129 ../../Zotlabs/Module/Layouts.php:189
+msgid "Layout Name"
+msgstr "Nom de la mise en page"
+
+#: ../../Zotlabs/Module/Editlayout.php:129
+#: ../../Zotlabs/Module/Layouts.php:132
+msgid "Layout Description (Optional)"
+msgstr "Description de la mise en page (facultatif)"
+
+#: ../../Zotlabs/Module/Editlayout.php:137
+msgid "Edit Layout"
+msgstr "Modifier la mise en page"
+
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
+#: ../../Zotlabs/Module/Import_items.php:118 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
+#: ../../addon/redphotos/redphotos.php:119
+#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
+#: ../../include/items.php:327
+msgid "Permission denied"
+msgstr "Accès refusé"
+
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Identifiant de profil invalide."
+
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Éditeur de visibilité de profil"
+
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1360
+msgid "Profile"
+msgstr "Profil"
+
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Cliquer sur un contact pour l'ajouter ou le retirer."
-#: ../../Zotlabs/Module/Cal.php:259 ../../Zotlabs/Module/Events.php:588
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Visible par"
+
+#: ../../Zotlabs/Module/Profperm.php:140
+#: ../../Zotlabs/Module/Connections.php:141
+msgid "All Connections"
+msgstr "Tous les contacts"
+
+#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
+msgid "This site is not a directory server"
+msgstr "Ce site n'est pas un serveur d'annuaire"
+
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../addon/gitwiki/Mod_Gitwiki.php:28 ../../addon/chess/chess.php:403
+msgid "You must be logged in to see this page."
+msgstr "Vous devez vous connecter pour voir cette page."
+
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
+msgstr "Publications et commentaires"
+
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
+msgstr "Seulement les publications"
+
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permissions insuffisantes. Demande redirigée vers la page du profil."
+
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
+msgstr "Exporter le canal"
+
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus."
+
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr "Exporter le contenu"
+
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence."
+
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr "Exporter vos publications d'une année en particulier"
+
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit."
+
+#: ../../Zotlabs/Module/Uexport.php:66
+#, php-format
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1$s\">%2$s</a>"
+
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1$s\">%2$s</a>"
+
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1$s\">%2$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord)."
+
+#: ../../Zotlabs/Module/Search.php:17 ../../Zotlabs/Module/Photos.php:490
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Directory.php:63
+#: ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Viewconnections.php:23
+msgid "Public access denied."
+msgstr "Accès public refusé."
+
+#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
+#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
+#: ../../include/text.php:1027 ../../include/text.php:1039
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:160
+msgid "Search"
+msgstr "Recherche"
+
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Eléments étiquetés avec&nbsp;: %s"
+
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
+msgstr "Résultats de recherche pour&nbsp;: %s"
+
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Emplacement introuvable."
+
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Echec de la recherche de l'emplacement."
+
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel."
+
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Synchronisation des emplacements"
+
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Emplacement(s) introuvable."
+
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Gérer les emplacements des canaux"
+
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
+#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Emplacement"
+
+#: ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Adresse"
+
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primaire"
+
+#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
+msgid "Drop"
+msgstr "Supprimer"
+
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Synchronisez maintenant"
+
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Merci d'attendre plusieurs minutes entre opérations successives."
+
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal."
+
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif."
+
+#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
+msgid "Menu not found."
+msgstr "Menu introuvable."
+
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Impossible de créer l'entrée."
+
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "Impossible de mettre à jour l'entrée de menu."
+
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "Impossible d'ajouter l'entrée de menu."
+
+#: ../../Zotlabs/Module/Mitem.php:120 ../../Zotlabs/Module/Menu.php:166
+#: ../../Zotlabs/Module/Xchan.php:41
+msgid "Not found."
+msgstr "Introuvable."
+
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
+msgstr "Permissions de l'entrée de menu"
+
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
+msgstr "(cliquer pour ouvrir/fermer)"
+
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
+msgstr "Nom du lien"
+
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
+msgstr "Lien ou sous-menu cible"
+
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
+msgstr "Utiliser l'authentification distante, quand disponible"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Connedit.php:783 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "No"
+msgstr "Non"
+
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
+#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Removeme.php:63
+#: ../../Zotlabs/Module/Admin/Site.php:239
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:399
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+#: ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1635
+#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
+#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
+#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
+#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
+#: ../../addon/dwpost/dwpost.php:85 ../../addon/ljpost/ljpost.php:70
+#: ../../addon/ljpost/ljpost.php:82 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../addon/rainbowtag/rainbowtag.php:81 ../../addon/visage/visage.php:166
+#: ../../addon/nsabait/nsabait.php:157 ../../addon/rtof/rtof.php:81
+#: ../../addon/rtof/rtof.php:85 ../../addon/jappixmini/jappixmini.php:309
+#: ../../addon/jappixmini/jappixmini.php:313
+#: ../../addon/jappixmini/jappixmini.php:343
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+#: ../../addon/jappixmini/jappixmini.php:359 ../../addon/nofed/nofed.php:72
+#: ../../addon/nofed/nofed.php:76 ../../addon/redred/redred.php:95
+#: ../../addon/redred/redred.php:99 ../../addon/libertree/libertree.php:69
+#: ../../addon/libertree/libertree.php:81
+#: ../../addon/flattrwidget/flattrwidget.php:120
+#: ../../addon/statusnet/statusnet.php:389
+#: ../../addon/statusnet/statusnet.php:411
+#: ../../addon/statusnet/statusnet.php:415
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
+#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
+#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
+#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145
+msgid "Yes"
+msgstr "Oui"
+
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
+msgstr "Ouvrir le lien dans une nouvelle fenêtre"
+
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
+msgstr "Ordre dans la liste"
+
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Les nombres les plus élevés seront au bas de la liste"
+
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
+msgstr "Vadiler et terminer"
+
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
+msgstr "Valider et continuer"
+
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
+msgstr "Menu&nbsp;:"
+
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
+msgstr "Cible du lien"
+
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
+msgstr "Modifier le menu"
+
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
+msgstr "Modifier l'entrée"
+
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
+msgstr "Supprimer l'entrée"
+
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
+msgstr "Nouvelle entrée"
+
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
+msgstr "Éditer ce bloc de menu"
+
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
+msgstr "Ajouter une entrée au menu"
+
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
+msgstr "Supprimer cette entrée du menu"
+
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
+msgstr "Modifier cette entrée du menu"
+
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
+msgstr "Entrée de menu introuvable."
+
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
+msgstr "Entrée de menu supprimée."
+
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
+msgstr "Impossible de supprimer l'entrée de menu."
+
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
+msgstr "Modifier l'entrée de menu"
+
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
+msgstr "Texte du lien"
+
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Entrées du calendrier importées."
+
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Aucune entrée du calendrier trouvée."
+
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "La fin de l'événement ne peut être antérieure à son début."
+
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "Impossible de générer l'aperçu."
+
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Un titre et une date de début sont requises pour l'événement."
+
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Événement introuvable."
+
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
+#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
+#: ../../include/text.php:1948 ../../include/event.php:1141
+msgid "event"
+msgstr "événement"
+
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Modifier le titre de l'événement"
+
+#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Titre de l'événement"
+
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Requis"
+
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Catégories (séparées par des virgules)"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Modifier la catégorie"
+
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Catégorie"
+
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Modifier la date et l'heure de début"
+
+#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Date et heure de début"
+
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "Date et heure de fin inconnues ou sans objet"
+
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Modifier la date et l'heure de fin"
+
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Date et heure de fin"
+
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "Ajuster au fuseau horaire du visiteur"
+
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde."
+
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Modifier la description"
+
+#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
+msgid "Description"
+msgstr "Description"
+
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Modifier l'emplacement"
+
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
+#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
+#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+msgid "Preview"
+msgstr "Aperçu"
+
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+msgid "Permission settings"
+msgstr "Gérer les autorisations"
+
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Fuseau horaire&nbsp;:"
+
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Options avancées"
+
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:264
msgid "l, F j"
msgstr "l, F j"
-#: ../../Zotlabs/Module/Cal.php:308 ../../Zotlabs/Module/Events.php:637
-#: ../../include/text.php:1732
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Modifier l'événement"
+
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Supprimer l'événement"
+
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
+#: ../../include/text.php:1767
msgid "Link to Source"
msgstr "Lien vers la Source"
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:665
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "calendrier"
+
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
msgid "Edit Event"
msgstr "Modifier l'événement"
-#: ../../Zotlabs/Module/Cal.php:331 ../../Zotlabs/Module/Events.php:665
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:336
msgid "Create Event"
msgstr "Créer un événement"
-#: ../../Zotlabs/Module/Cal.php:332 ../../Zotlabs/Module/Cal.php:339
-#: ../../Zotlabs/Module/Events.php:666 ../../Zotlabs/Module/Events.php:673
-#: ../../Zotlabs/Module/Photos.php:949
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
+#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
msgid "Previous"
msgstr "Précédent"
-#: ../../Zotlabs/Module/Cal.php:333 ../../Zotlabs/Module/Cal.php:340
-#: ../../Zotlabs/Module/Events.php:667 ../../Zotlabs/Module/Events.php:674
-#: ../../Zotlabs/Module/Photos.php:958 ../../Zotlabs/Module/Setup.php:267
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
+#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
+#: ../../addon/cdav/Mod_Cdav.php:847
msgid "Next"
msgstr "Suivant"
-#: ../../Zotlabs/Module/Cal.php:334 ../../Zotlabs/Module/Events.php:668
-#: ../../include/widgets.php:755
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
+#: ../../include/channel.php:1363
msgid "Export"
msgstr "Export"
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Events.php:671
-#: ../../include/widgets.php:756
-msgid "Import"
-msgstr "Import"
+#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Mois"
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:238 ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Connedit.php:731 ../../Zotlabs/Module/Events.php:475
-#: ../../Zotlabs/Module/Events.php:672 ../../Zotlabs/Module/Group.php:85
-#: ../../Zotlabs/Module/Filestorage.php:162
-#: ../../Zotlabs/Module/Import.php:550
-#: ../../Zotlabs/Module/Import_items.php:120
-#: ../../Zotlabs/Module/Invite.php:146 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Mail.php:378 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Mitem.php:235 ../../Zotlabs/Module/Photos.php:677
-#: ../../Zotlabs/Module/Photos.php:1052 ../../Zotlabs/Module/Photos.php:1092
-#: ../../Zotlabs/Module/Photos.php:1210 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Pdledit.php:66 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Profiles.php:687 ../../Zotlabs/Module/Rate.php:170
-#: ../../Zotlabs/Module/Admin.php:492 ../../Zotlabs/Module/Admin.php:688
-#: ../../Zotlabs/Module/Admin.php:771 ../../Zotlabs/Module/Admin.php:1032
-#: ../../Zotlabs/Module/Admin.php:1211 ../../Zotlabs/Module/Admin.php:1421
-#: ../../Zotlabs/Module/Admin.php:1648 ../../Zotlabs/Module/Admin.php:1733
-#: ../../Zotlabs/Module/Admin.php:2116 ../../Zotlabs/Module/Appman.php:126
-#: ../../Zotlabs/Module/Settings.php:590 ../../Zotlabs/Module/Settings.php:703
-#: ../../Zotlabs/Module/Settings.php:731 ../../Zotlabs/Module/Settings.php:754
-#: ../../Zotlabs/Module/Settings.php:842
-#: ../../Zotlabs/Module/Settings.php:1034 ../../Zotlabs/Module/Setup.php:312
-#: ../../Zotlabs/Module/Setup.php:353 ../../Zotlabs/Module/Sources.php:114
-#: ../../Zotlabs/Module/Sources.php:149 ../../Zotlabs/Module/Thing.php:316
-#: ../../Zotlabs/Module/Thing.php:362 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Lib/ThreadItem.php:710 ../../include/widgets.php:757
-#: ../../include/widgets.php:769 ../../include/js_strings.php:22
-#: ../../view/theme/redbasic/php/config.php:99
-msgid "Submit"
-msgstr "Envoyer"
+#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Semaine"
-#: ../../Zotlabs/Module/Cal.php:341 ../../Zotlabs/Module/Events.php:675
+#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Jour"
+
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
+#: ../../addon/cdav/Mod_Cdav.php:848
msgid "Today"
msgstr "Aujourd'hui"
-#: ../../Zotlabs/Module/Channel.php:29 ../../Zotlabs/Module/Chat.php:25
-msgid "You must be logged in to see this page."
-msgstr "Vous devez vous connecter pour voir cette page."
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Événement supprimé"
-#: ../../Zotlabs/Module/Channel.php:41
-msgid "Posts and comments"
-msgstr ""
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Impossible de supprimer l'événement"
-#: ../../Zotlabs/Module/Channel.php:42
-msgid "Only posts"
-msgstr ""
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
+msgstr "Application installée."
-#: ../../Zotlabs/Module/Channel.php:102
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Permissions insuffisantes. Demande redirigée vers la page du profil."
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
+msgstr "Erreur de l'application - Malformée."
-#: ../../Zotlabs/Module/Chat.php:181
-msgid "Room not found"
-msgstr "Salon introuvable"
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
+msgstr "Imbriquer le code"
-#: ../../Zotlabs/Module/Chat.php:197
-msgid "Leave Room"
-msgstr "Quitter le salon"
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
+msgstr "Modifier l'application"
-#: ../../Zotlabs/Module/Chat.php:198
-msgid "Delete Room"
-msgstr ""
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
+msgstr "Créer une application"
-#: ../../Zotlabs/Module/Chat.php:199
-msgid "I am away right now"
-msgstr "Je suis absent en ce moment"
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
+msgstr "Nom de l'application"
-#: ../../Zotlabs/Module/Chat.php:200
-msgid "I am online"
-msgstr "Je suis en ligne"
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
+msgstr "Emplacement (URL) de l'application"
-#: ../../Zotlabs/Module/Chat.php:202
-msgid "Bookmark this room"
-msgstr "Marquer ce salon comme favori"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
+msgstr "URL de l'icône à utiliser pour cette photo"
-#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:205
-#: ../../Zotlabs/Module/Mail.php:314 ../../include/conversation.php:1176
-msgid "Please enter a link URL:"
-msgstr "Merci d'entrer l'URL d'un lien&nbsp;:"
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels - facultatif"
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:258
-#: ../../Zotlabs/Module/Mail.php:383 ../../Zotlabs/Lib/ThreadItem.php:722
-#: ../../include/conversation.php:1256
-msgid "Encrypt text"
-msgstr "Chiffrer le texte"
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
+msgstr "Catégories (séparées par des virgules)"
-#: ../../Zotlabs/Module/Chat.php:207 ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Editwebpage.php:147 ../../Zotlabs/Module/Mail.php:252
-#: ../../Zotlabs/Module/Mail.php:377 ../../include/conversation.php:1143
-msgid "Insert web link"
-msgstr "Insérer lien web"
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
+msgstr "Identifiant de version"
-#: ../../Zotlabs/Module/Chat.php:218
-msgid "Feature disabled."
-msgstr ""
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
+msgstr "Prix de l'application"
-#: ../../Zotlabs/Module/Chat.php:232
-msgid "New Chatroom"
-msgstr "Nouveau salon de discussion"
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
+msgstr "Emplacement (URL) pour l'achat de l'application"
-#: ../../Zotlabs/Module/Chat.php:233
-msgid "Chatroom name"
-msgstr ""
+#: ../../Zotlabs/Module/Regmod.php:15
+msgid "Please login."
+msgstr "Merci de vous connecter."
-#: ../../Zotlabs/Module/Chat.php:234
-msgid "Expiration of chats (minutes)"
-msgstr "Expiration des discussions (en minutes)"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Hub introuvable."
-#: ../../Zotlabs/Module/Chat.php:235 ../../Zotlabs/Module/Filestorage.php:153
-#: ../../Zotlabs/Module/Photos.php:671 ../../Zotlabs/Module/Photos.php:1045
-#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:359
-#: ../../include/acl_selectors.php:283
-msgid "Permissions"
-msgstr "Autorisations"
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
+#: ../../Zotlabs/Module/Like.php:370
+#: ../../addon/redphotos/redphotohelper.php:74
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:116
+#: ../../include/text.php:1945
+msgid "photo"
+msgstr "photo"
-#: ../../Zotlabs/Module/Chat.php:246
+#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
+#: ../../addon/diaspora/inbound.php:1794 ../../include/conversation.php:144
+#: ../../include/text.php:1951
+msgid "status"
+msgstr "état"
+
+#: ../../Zotlabs/Module/Subthread.php:118
#, php-format
-msgid "%1$s's Chatrooms"
-msgstr "Salons de %1$s"
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s suit %3$s de %2$s"
-#: ../../Zotlabs/Module/Chat.php:251
-msgid "No chatrooms available"
-msgstr ""
+#: ../../Zotlabs/Module/Subthread.php:120
+#, php-format
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s ne suit plus %3$s de %2$s"
-#: ../../Zotlabs/Module/Chat.php:252 ../../Zotlabs/Module/Manage.php:143
-#: ../../Zotlabs/Module/Profiles.php:778
-msgid "Create New"
-msgstr ""
+#: ../../Zotlabs/Module/Import_items.php:46 ../../Zotlabs/Module/Import.php:64
+msgid "Nothing to import."
+msgstr "Rien à importer."
-#: ../../Zotlabs/Module/Chat.php:255
-msgid "Expiration"
-msgstr ""
+#: ../../Zotlabs/Module/Import_items.php:70 ../../Zotlabs/Module/Import.php:79
+#: ../../Zotlabs/Module/Import.php:95
+msgid "Unable to download data from old server"
+msgstr "Impossible de récupérer les données de l'ancien serveur"
-#: ../../Zotlabs/Module/Chat.php:256
-msgid "min"
-msgstr ""
+#: ../../Zotlabs/Module/Import_items.php:75
+#: ../../Zotlabs/Module/Import.php:102
+msgid "Imported file is empty."
+msgstr "Le fichier importé est vide."
-#: ../../Zotlabs/Module/Chatsvc.php:117
-msgid "Away"
-msgstr "Absent"
+#: ../../Zotlabs/Module/Import_items.php:91
+#: ../../Zotlabs/Module/Import.php:121
+#, php-format
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Attention&nbsp;: les versions de bases de données diffèrent de %1$d mises à jour."
-#: ../../Zotlabs/Module/Chatsvc.php:122
-msgid "Online"
-msgstr "En ligne"
+#: ../../Zotlabs/Module/Import_items.php:106
+msgid "Import completed"
+msgstr "L'import est terminé."
-#: ../../Zotlabs/Module/Block.php:31 ../../Zotlabs/Module/Page.php:40
-msgid "Invalid item."
-msgstr "Élément invalide."
+#: ../../Zotlabs/Module/Import_items.php:123
+msgid "Import Items"
+msgstr "Importer"
-#: ../../Zotlabs/Module/Bookmarks.php:53
-msgid "Bookmark added"
-msgstr "Favori ajouté"
+#: ../../Zotlabs/Module/Import_items.php:124
+msgid ""
+"Use this form to import existing posts and content from an export file."
+msgstr "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export."
-#: ../../Zotlabs/Module/Bookmarks.php:75
-msgid "My Bookmarks"
-msgstr "Mes Favoris"
+#: ../../Zotlabs/Module/Import_items.php:125
+#: ../../Zotlabs/Module/Import.php:499
+msgid "File to Upload"
+msgstr "Fichier à envoyer"
-#: ../../Zotlabs/Module/Bookmarks.php:86
-msgid "My Connections Bookmarks"
-msgstr "Favoris de mes contacts"
+#: ../../Zotlabs/Module/New_channel.php:121
+#: ../../Zotlabs/Module/Manage.php:136
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Vous avez créé %1$.0f des %2$.0f canaux autorisés."
+
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Name or caption"
+msgstr "Nom ou libellé"
+
+#: ../../Zotlabs/Module/New_channel.php:134
+#: ../../Zotlabs/Module/Register.php:237
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
+msgstr "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\""
+
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+msgid "Choose a short nickname"
+msgstr "Choisissez un alias"
+
+#: ../../Zotlabs/Module/New_channel.php:136
+#: ../../Zotlabs/Module/Register.php:239
+#, php-format
+msgid ""
+"Your nickname will be used to create an easy to remember channel address "
+"e.g. nickname%s"
+msgstr "Votre pseudo sera utilisé pour créer une adresse de canal facile à mémoriser, par ex. pseudo%s"
+
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Channel role and privacy"
+msgstr "Rôle et confidentialité du canal"
+
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Select a channel role with your privacy requirements."
+msgstr "Sélectionner un rôle de canal adapté à vos besoins de confidentialité."
+
+#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Register.php:240
+msgid "Read more about roles"
+msgstr "En savoir plus sur les rôles"
+
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Créer le canal"
+
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines."
+
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur."
+
+#: ../../Zotlabs/Module/Removeme.php:35
+msgid ""
+"Channel removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte."
+
+#: ../../Zotlabs/Module/Removeme.php:60
+msgid "Remove This Channel"
+msgstr "Supprimer ce canal"
+
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "WARNING: "
+msgstr "AVERTISSEMENT&nbsp;:"
+
+#: ../../Zotlabs/Module/Removeme.php:61
+msgid "This channel will be completely removed from the network. "
+msgstr "Ce canal sera complètement supprimé du réseau."
+
+#: ../../Zotlabs/Module/Removeme.php:61
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid "This action is permanent and can not be undone!"
+msgstr "Cette action est permanente et irréversible&nbsp;!"
+
+#: ../../Zotlabs/Module/Removeme.php:62
+#: ../../Zotlabs/Module/Removeaccount.php:59
+msgid "Please enter your password for verification:"
+msgstr "Merci de saisir votre mot de passe pour vérification&nbsp;:"
+
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid "Remove this channel and all its clones from the network"
+msgstr "Supprimer ce canal ainsi que tous ses clones sur le réseau"
+
+#: ../../Zotlabs/Module/Removeme.php:63
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau"
+
+#: ../../Zotlabs/Module/Removeme.php:64
+#: ../../Zotlabs/Module/Settings/Channel.php:575
+msgid "Remove Channel"
+msgstr "Supprimer le canal"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:99
+msgid "Files: shared with me"
+msgstr "Fichiers&nbsp;: partagés avec moi"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:100
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:910
+#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:528
+#: ../../Zotlabs/Storage/Browser.php:233
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Nom"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:101
+msgid "NEW"
+msgstr "NOUVEAU"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:102
+#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1417
+msgid "Size"
+msgstr "Taille"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:103
+#: ../../Zotlabs/Storage/Browser.php:236
+msgid "Last Modified"
+msgstr "Modifié le"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:104
+msgid "Remove all files"
+msgstr "Supprimer tous les fichiers"
+
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+msgid "Remove this file"
+msgstr "Supprimer ce fichier"
+
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
+msgstr "Serveur $Projectname - configuration"
+
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
+msgstr "Impossible de se connecter à la base de données."
+
+#: ../../Zotlabs/Module/Setup.php:184
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS."
+
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
+msgstr "Impossible de créer la table."
+
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
+msgstr "La base de données de votre site a été installée."
+
+#: ../../Zotlabs/Module/Setup.php:200
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin)."
+
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Merci de consulter le fichier \"install/INSTALL.txt\"."
+
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
+msgstr "Vérification du système"
+
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
+msgstr "Re-vérifier"
+
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
+msgstr "Connexion à la base de données"
+
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "Pour installer $Projectname, nous avons besoin de savoir comment se connecter à votre base de données."
+
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres."
+
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer."
+
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
+msgstr "Nom du serveur de base de données"
+
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
+msgstr "Par défaut 127.0.0.1"
+
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
+msgstr "Port de la base de données"
+
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
+msgstr "Numéro TCP du port - utilisez 0 pour la valeur par défaut"
+
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
+msgstr "Identifiant de connexion à la Base de Données"
+
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
+msgstr "Mot de passe de connexion à la Base de Données"
+
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
+msgstr "Nom de la Base de Données"
+
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
+msgstr "Type de base de données"
+
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
+msgstr "Adresse de courriel de l'administrateur du site"
+
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web."
+
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
+msgstr "URL du site web"
+
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
+msgstr "Veuillez utiliser SSL/TLS (https) si disponible."
+
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
+msgstr "Veuillez choisir un fuseau horaire par défaut pour votre site"
+
+#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
+msgid "Basic/Minimal Social Networking"
+msgstr "Réseau social de base"
+
+#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
+msgid "Standard Configuration (default)"
+msgstr "Configuration standard par défaut"
+
+#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
+msgid "Professional"
+msgstr "Professionel"
+
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
+msgstr "Paramètres du site"
+
+#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
+msgid "Server Configuration/Role"
+msgstr "Configuration du site."
+
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
+msgstr "PHP version 5.5 ou supérieur est requis"
+
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
+msgstr "Version de PHP"
+
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Impossible de trouver une version CLI de PHP dans le PATH du serveur web."
+
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron."
+
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
+msgstr "Chemin vers l'éxecutable PHP"
+
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans."
+
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
+msgstr "PHP en ligne de commande (CLI)"
+
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire."
+
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée."
+
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
+msgstr "Elle est nécessaire pour la distribution des messages."
+
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
+
+#: ../../Zotlabs/Module/Setup.php:454
+#, php-format
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois."
+
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur."
+
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
+msgstr "Limites de téléversement de PHP"
+
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement"
+
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\"."
+
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
+msgstr "Générer les clefs de chiffrement"
+
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
+msgstr "module PHP libCurl"
+
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
+msgstr "module PHP GD graphics"
+
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
+msgstr "module PHP OpenSSL"
+
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
+msgstr "module PDO de la base de données PHP"
+
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
+msgstr "module PHP mb_string"
+
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
+msgstr "module PHP xml"
+
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
+msgstr "module Apache mod_rewrite"
+
+#: ../../Zotlabs/Module/Setup.php:514
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
+msgstr "exécuter"
+
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
+msgstr "shell_exec"
+
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:538
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé."
+
+#: ../../Zotlabs/Module/Setup.php:572
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable."
+
+#: ../../Zotlabs/Module/Setup.php:573
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit."
+
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de $Projectname."
+
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées."
+
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
+msgstr "Le fichier .htconfig.php est accessible en écriture"
+
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu."
+
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
+msgstr "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine."
+
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire."
+
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient."
+
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr "Permission d'écriture sur %s activée"
+
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine."
+
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
+msgstr "'store' est accessible en écriture"
+
+#: ../../Zotlabs/Module/Setup.php:650
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé)."
+
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!"
+
+#: ../../Zotlabs/Module/Setup.php:652
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub."
+
+#: ../../Zotlabs/Module/Setup.php:653
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité."
+
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis."
+
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide."
+
+#: ../../Zotlabs/Module/Setup.php:657
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
+msgstr "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs."
+
+#: ../../Zotlabs/Module/Setup.php:659
+msgid "SSL certificate validation"
+msgstr "Validation du certificat SSL/TLS"
+
+#: ../../Zotlabs/Module/Setup.php:665
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:"
+
+#: ../../Zotlabs/Module/Setup.php:668
+msgid "Url rewrite is working"
+msgstr "La réécriture d'URL fonctionne"
+
+#: ../../Zotlabs/Module/Setup.php:682
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web."
+
+#: ../../Zotlabs/Module/Setup.php:706
+#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+msgid "Errors encountered creating database tables."
+msgstr "Erreurs rencontrées pendant la création de tables de BDD."
+
+#: ../../Zotlabs/Module/Setup.php:746
+msgid "<h1>What next</h1>"
+msgstr "<h1>Et maintenant</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:747
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau."
#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
msgid "Continue"
@@ -553,2629 +1884,2842 @@ msgstr "(Aucune instruction spécifique n'a été fournie par le propriétaire d
msgid "Restricted or Premium Channel"
msgstr "Canal VIP ou restreint"
-#: ../../Zotlabs/Module/Connedit.php:80
-msgid "Could not access contact record."
-msgstr "Impossible d'accéder aux détails du contact."
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Statistiques de file d'attente"
-#: ../../Zotlabs/Module/Connedit.php:104
-msgid "Could not locate selected profile."
-msgstr "Impossible de localiser le profil sélectionné."
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Nombre d'entrées total"
-#: ../../Zotlabs/Module/Connedit.php:227
-msgid "Connection updated."
-msgstr "Contact mis à jour."
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Priorité"
-#: ../../Zotlabs/Module/Connedit.php:229
-msgid "Failed to update connection record."
-msgstr "Impossible de mettre à jour les détails du contact."
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "URL de destination"
-#: ../../Zotlabs/Module/Connedit.php:276
-msgid "is now connected to"
-msgstr "est maintenant connecté avec"
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Marquer le hub comme étant hors ligne de manière permanente"
-#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Connedit.php:654
-#: ../../Zotlabs/Module/Events.php:459 ../../Zotlabs/Module/Events.php:460
-#: ../../Zotlabs/Module/Events.php:469 ../../Zotlabs/Module/Api.php:89
-#: ../../Zotlabs/Module/Filestorage.php:157
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
-#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
-#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:666
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Admin.php:459
-#: ../../Zotlabs/Module/Removeme.php:61 ../../Zotlabs/Module/Settings.php:581
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1707
-msgid "No"
-msgstr "Non"
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Vider la file d'attente pour ce hub"
-#: ../../Zotlabs/Module/Connedit.php:379 ../../Zotlabs/Module/Events.php:459
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:469
-#: ../../Zotlabs/Module/Api.php:88 ../../Zotlabs/Module/Filestorage.php:157
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Mitem.php:158
-#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:232
-#: ../../Zotlabs/Module/Mitem.php:233 ../../Zotlabs/Module/Photos.php:666
-#: ../../Zotlabs/Module/Profiles.php:647 ../../Zotlabs/Module/Admin.php:461
-#: ../../Zotlabs/Module/Removeme.php:61 ../../Zotlabs/Module/Settings.php:581
-#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
-#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:105
-#: ../../view/theme/redbasic/php/config.php:130 ../../boot.php:1707
-msgid "Yes"
-msgstr "Oui"
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Dernier contact connu"
-#: ../../Zotlabs/Module/Connedit.php:411
-msgid "Could not access address book record."
-msgstr "Impossible d'accéder aux détails du carnet d'adresses."
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "Off"
+msgstr "Inactif"
-#: ../../Zotlabs/Module/Connedit.php:425
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Actualisation impossible - le canal est indisponible."
+#: ../../Zotlabs/Module/Admin/Features.php:55
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#: ../../Zotlabs/Module/Settings/Features.php:38
+msgid "On"
+msgstr "Actif"
-#: ../../Zotlabs/Module/Connedit.php:440 ../../Zotlabs/Module/Connedit.php:449
-#: ../../Zotlabs/Module/Connedit.php:458 ../../Zotlabs/Module/Connedit.php:467
-#: ../../Zotlabs/Module/Connedit.php:480
-msgid "Unable to set address book parameters."
-msgstr "Impossible de régler les paramètres du carnet d'adresses."
+#: ../../Zotlabs/Module/Admin/Features.php:56
+#, php-format
+msgid "Lock feature %s"
+msgstr "Verrouiller fonctionnalité %s"
-#: ../../Zotlabs/Module/Connedit.php:503
-msgid "Connection has been removed."
-msgstr "Le contact a été supprimé."
+#: ../../Zotlabs/Module/Admin/Features.php:64
+msgid "Manage Additional Features"
+msgstr "Gérer les fonctionnalités additionnelles"
-#: ../../Zotlabs/Module/Connedit.php:519 ../../Zotlabs/Lib/Apps.php:219
-#: ../../include/nav.php:86 ../../include/conversation.php:954
-msgid "View Profile"
-msgstr "Voir le profil"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:19
+msgid "Update has been marked successful"
+msgstr "La mise à jour a été marquée comme réussie"
-#: ../../Zotlabs/Module/Connedit.php:522
+#: ../../Zotlabs/Module/Admin/Dbsync.php:29
#, php-format
-msgid "View %s's profile"
-msgstr "Voir le profil de %s"
+msgid "Executing %s failed. Check system logs."
+msgstr "L'éxecution de %s a échoué. Merci de vérifier les journaux du système."
-#: ../../Zotlabs/Module/Connedit.php:526
-msgid "Refresh Permissions"
-msgstr "Actualiser les autorisations"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:32
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La mise à jour %s a été appliquée avec succès."
-#: ../../Zotlabs/Module/Connedit.php:529
-msgid "Fetch updated permissions"
-msgstr "Récupérer les autorisations les plus récentes"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:36
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non."
-#: ../../Zotlabs/Module/Connedit.php:533
-msgid "Recent Activity"
-msgstr "Activité récente"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:39
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "La fonction de mise à jour %s est introuvable."
-#: ../../Zotlabs/Module/Connedit.php:536
-msgid "View recent posts and comments"
-msgstr "Voir les publications et commentaires récents"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:55
+msgid "No failed updates."
+msgstr "Aucune mise à jour défaillante."
-#: ../../Zotlabs/Module/Connedit.php:540 ../../Zotlabs/Module/Admin.php:1041
-msgid "Unblock"
-msgstr "Débloquer"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:59
+msgid "Failed Updates"
+msgstr "Mises à jour défaillantes"
-#: ../../Zotlabs/Module/Connedit.php:540 ../../Zotlabs/Module/Admin.php:1040
-msgid "Block"
-msgstr "Bloquer"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:61
+msgid "Mark success (if update was manually applied)"
+msgstr "Marquer comme réussie (si la mise à jour a été réalisée manuellement)"
-#: ../../Zotlabs/Module/Connedit.php:543
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Bloquer ou débloquer toute communication avec ce contact"
+#: ../../Zotlabs/Module/Admin/Dbsync.php:62
+msgid "Attempt to execute this update step automatically"
+msgstr "Tenter de réaliser cette étape de mise à jour automatiquement"
-#: ../../Zotlabs/Module/Connedit.php:544
-msgid "This connection is blocked!"
-msgstr "Ce contact est bloqué&nbsp;!"
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
+#: ../../include/items.php:3378
+msgid "Item not found."
+msgstr "Élément introuvable"
-#: ../../Zotlabs/Module/Connedit.php:548
-msgid "Unignore"
-msgstr "Ne plus ignorer"
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Greffon %s désactivé."
-#: ../../Zotlabs/Module/Connedit.php:548
-#: ../../Zotlabs/Module/Connections.php:277
-#: ../../Zotlabs/Module/Notifications.php:55
-msgid "Ignore"
-msgstr "Ignorer"
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Greffon %s activé."
-#: ../../Zotlabs/Module/Connedit.php:551
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Ignorer ou ne plus ignorer toute communication venant de ce contact"
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
+#: ../../Zotlabs/Module/Admin/Themes.php:95
+msgid "Disable"
+msgstr "Désactiver"
-#: ../../Zotlabs/Module/Connedit.php:552
-msgid "This connection is ignored!"
-msgstr "Ce contact est ignoré&nbsp;!"
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
+msgid "Enable"
+msgstr "Activer"
-#: ../../Zotlabs/Module/Connedit.php:556
-msgid "Unarchive"
-msgstr "Désarchiver"
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin.php:137
+msgid "Administration"
+msgstr "Administration"
-#: ../../Zotlabs/Module/Connedit.php:556
-msgid "Archive"
-msgstr "Archiver"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437
+#: ../../Zotlabs/Widget/Admin.php:27
+msgid "Plugins"
+msgstr "Greffons"
-#: ../../Zotlabs/Module/Connedit.php:559
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiver ou désarchiver ce contact - le marquer comme inactif mais conserver le contenu"
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
+msgid "Toggle"
+msgstr "(Dés)activer"
-#: ../../Zotlabs/Module/Connedit.php:560
-msgid "This connection is archived!"
-msgstr "Ce contact est archivé&nbsp;!"
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:203
+msgid "Settings"
+msgstr "Paramètres"
-#: ../../Zotlabs/Module/Connedit.php:564
-msgid "Unhide"
-msgstr "Ne plus cacher"
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
+msgid "Author: "
+msgstr "Auteur&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:564
-msgid "Hide"
-msgstr "Cacher"
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
+msgid "Maintainer: "
+msgstr "Maintenu par&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:567
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
+msgstr "Version minimum du projet&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:568
-msgid "This connection is hidden!"
-msgstr "Ce contact est caché&nbsp;!"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
+msgstr "Version maximum du projet&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:575
-msgid "Delete this connection"
-msgstr "Supprimer ce contact"
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
+msgstr "Version minimum de PHP&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:590 ../../include/widgets.php:493
-msgid "Me"
-msgstr "Moi"
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
+msgstr "Rôles du serveur "
-#: ../../Zotlabs/Module/Connedit.php:591 ../../include/widgets.php:494
-msgid "Family"
-msgstr "Famille"
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
+msgstr "Requiert&nbsp;:"
-#: ../../Zotlabs/Module/Connedit.php:592 ../../Zotlabs/Module/Settings.php:342
-#: ../../Zotlabs/Module/Settings.php:346 ../../Zotlabs/Module/Settings.php:347
-#: ../../Zotlabs/Module/Settings.php:350 ../../Zotlabs/Module/Settings.php:361
-#: ../../include/widgets.php:495 ../../include/selectors.php:123
-#: ../../include/channel.php:389 ../../include/channel.php:390
-#: ../../include/channel.php:397
-msgid "Friends"
-msgstr "Amis"
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
+msgstr "Désactivé - version incompatible"
-#: ../../Zotlabs/Module/Connedit.php:593 ../../include/widgets.php:496
-msgid "Acquaintances"
-msgstr "Connaissances"
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Entrer l'URL du dépôt git public pour les greffons"
-#: ../../Zotlabs/Module/Connedit.php:594
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:497
-msgid "All"
-msgstr "Tous"
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
+msgstr "URL du git pour les plugin"
-#: ../../Zotlabs/Module/Connedit.php:654
-msgid "Approve this connection"
-msgstr "Autoriser ce contact"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
+msgstr "Nom du dépôt"
-#: ../../Zotlabs/Module/Connedit.php:654
-msgid "Accept connection to allow communication"
-msgstr "Accepter le contact pour permettre la communication"
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
+msgstr "(en option)"
-#: ../../Zotlabs/Module/Connedit.php:659
-msgid "Set Affinity"
-msgstr "Définir le degré d'affinité"
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr "Télécharger l'extension"
-#: ../../Zotlabs/Module/Connedit.php:662
-msgid "Set Profile"
-msgstr "Définir le profil"
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr "Installer un nouveau dépôt"
-#: ../../Zotlabs/Module/Connedit.php:665
-msgid "Set Affinity & Profile"
-msgstr "Définir le degré d'affinité et le profil"
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:348
+msgid "Install"
+msgstr "Installer"
-#: ../../Zotlabs/Module/Connedit.php:698
-msgid "none"
-msgstr "Aucun"
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
+#: ../../Zotlabs/Module/Connedit.php:928 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
+#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
+#: ../../include/conversation.php:1376
+msgid "Cancel"
+msgstr "Annuler"
-#: ../../Zotlabs/Module/Connedit.php:702 ../../include/widgets.php:614
-msgid "Connection Default Permissions"
-msgstr "Autorisations par défaut des contacts"
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr "Gérer les dépôts"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr "Dépôt des extensions installées"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr "Installer un nouveau dépôt pour extensions"
-#: ../../Zotlabs/Module/Connedit.php:702 ../../include/items.php:3926
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:348 ../../addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Mise à jour"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr "Changer de branche"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../addon/superblock/superblock.php:116
+msgid "Remove"
+msgstr "Retirer"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:36
#, php-format
-msgid "Connection: %s"
-msgstr "Contact&nbsp;: %s"
+msgid "%s account blocked/unblocked"
+msgid_plural "%s account blocked/unblocked"
+msgstr[0] "%s compte bloqué/débloqué"
+msgstr[1] "%s comptes bloqués/débloqués"
-#: ../../Zotlabs/Module/Connedit.php:703
-msgid "Apply these permissions automatically"
-msgstr "Appliquer ces permissions automatiquement"
+#: ../../Zotlabs/Module/Admin/Accounts.php:43
+#, php-format
+msgid "%s account deleted"
+msgid_plural "%s accounts deleted"
+msgstr[0] "%s compte supprimé"
+msgstr[1] "%s comptes supprimés"
-#: ../../Zotlabs/Module/Connedit.php:703
-msgid "Connection requests will be approved without your interaction"
-msgstr "Les demandes de contact seront approuvées automatiquement"
+#: ../../Zotlabs/Module/Admin/Accounts.php:79
+msgid "Account not found"
+msgstr "Compte introuvable"
-#: ../../Zotlabs/Module/Connedit.php:705
-msgid "This connection's primary address is"
-msgstr "L'adresse principale de ce contact est"
+#: ../../Zotlabs/Module/Admin/Accounts.php:90
+#, php-format
+msgid "Account '%s' deleted"
+msgstr "Compte '%s' supprimé"
-#: ../../Zotlabs/Module/Connedit.php:706
-msgid "Available locations:"
-msgstr "Emplacements disponibles&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Accounts.php:98
+#, php-format
+msgid "Account '%s' blocked"
+msgstr "Compte '%s' bloqué"
-#: ../../Zotlabs/Module/Connedit.php:710
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts."
+#: ../../Zotlabs/Module/Admin/Accounts.php:106
+#, php-format
+msgid "Account '%s' unblocked"
+msgstr "Compte '%s' débloqué"
-#: ../../Zotlabs/Module/Connedit.php:711
-msgid "Connection Tools"
-msgstr ""
+#: ../../Zotlabs/Module/Admin/Accounts.php:165
+#: ../../Zotlabs/Module/Admin/Accounts.php:178
+#: ../../Zotlabs/Widget/Admin.php:23
+msgid "Accounts"
+msgstr "Comptes"
-#: ../../Zotlabs/Module/Connedit.php:713
-msgid "Slide to adjust your degree of friendship"
-msgstr "Faites glisser pour ajuster votre proximité avec le contact"
+#: ../../Zotlabs/Module/Admin/Accounts.php:167
+#: ../../Zotlabs/Module/Admin/Channels.php:148
+msgid "select all"
+msgstr "tout sélectionner"
-#: ../../Zotlabs/Module/Connedit.php:714 ../../Zotlabs/Module/Rate.php:159
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Evaluation"
+#: ../../Zotlabs/Module/Admin/Accounts.php:168
+msgid "Registrations waiting for confirm"
+msgstr "Inscriptions en attente d'approbation"
-#: ../../Zotlabs/Module/Connedit.php:715
-msgid "Slide to adjust your rating"
-msgstr "Faîtes glisser pour ajuster votre note"
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+msgid "Request date"
+msgstr "Date de la demande"
-#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Module/Connedit.php:721
-msgid "Optionally explain your rating"
-msgstr "Explication facultative de votre évaluation"
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:2270
+msgid "Email"
+msgstr "Courriel"
-#: ../../Zotlabs/Module/Connedit.php:718
-msgid "Custom Filter"
-msgstr "Filtre personnalisé"
+#: ../../Zotlabs/Module/Admin/Accounts.php:170
+msgid "No registrations."
+msgstr "Pas d'inscriptions."
-#: ../../Zotlabs/Module/Connedit.php:719
-msgid "Only import posts with this text"
-msgstr "N'importer que les publications comprenant ce texte"
+#: ../../Zotlabs/Module/Admin/Accounts.php:171
+#: ../../Zotlabs/Module/Connections.php:281
+msgid "Approve"
+msgstr "Approuver"
-#: ../../Zotlabs/Module/Connedit.php:719 ../../Zotlabs/Module/Connedit.php:720
-msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "un mot par ligne ou #étiquettes ou /motif/ ou lang=xx, laisser vide pour importer toutes les publications"
+#: ../../Zotlabs/Module/Admin/Accounts.php:172
+msgid "Deny"
+msgstr "Refuser"
-#: ../../Zotlabs/Module/Connedit.php:720
-msgid "Do not import posts with this text"
-msgstr "Ne pas importer les publications comprenant ce texte"
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Block"
+msgstr "Bloquer"
-#: ../../Zotlabs/Module/Connedit.php:722
-msgid "This information is public!"
-msgstr "Cette information est publique&nbsp;!"
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+#: ../../Zotlabs/Module/Connedit.php:626
+msgid "Unblock"
+msgstr "Débloquer"
-#: ../../Zotlabs/Module/Connedit.php:727
-msgid "Connection Pending Approval"
-msgstr "Contact en attente d'approbation"
+#: ../../Zotlabs/Module/Admin/Accounts.php:180
+msgid "ID"
+msgstr "Identifiant"
-#: ../../Zotlabs/Module/Connedit.php:730
-msgid "inherited"
-msgstr "héritée"
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
+msgid "All Channels"
+msgstr "Tous les canaux"
-#: ../../Zotlabs/Module/Connedit.php:732
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée."
+#: ../../Zotlabs/Module/Admin/Accounts.php:183
+msgid "Register date"
+msgstr "Date d'inscription"
-#: ../../Zotlabs/Module/Connedit.php:734
-msgid "Their Settings"
-msgstr "Leurs paramètres"
+#: ../../Zotlabs/Module/Admin/Accounts.php:184
+msgid "Last login"
+msgstr "Dernière connexion"
-#: ../../Zotlabs/Module/Connedit.php:735
-msgid "My Settings"
-msgstr "Mes paramètres"
+#: ../../Zotlabs/Module/Admin/Accounts.php:185
+msgid "Expires"
+msgstr "Expire le"
-#: ../../Zotlabs/Module/Connedit.php:737
-msgid "Individual Permissions"
-msgstr "Permissions individuelles"
+#: ../../Zotlabs/Module/Admin/Accounts.php:186
+msgid "Service Class"
+msgstr "Classe de service"
-#: ../../Zotlabs/Module/Connedit.php:738
+#: ../../Zotlabs/Module/Admin/Accounts.php:188
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
+"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
+" on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Les comptes sélectionnés seront supprimés&nbsp;!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
-#: ../../Zotlabs/Module/Connedit.php:739
+#: ../../Zotlabs/Module/Admin/Accounts.php:189
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
+"The account {0} will be deleted!\\n\\nEverything this account has posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Le compte {0} sera supprimé&nbsp;!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
-#: ../../Zotlabs/Module/Connedit.php:740
-msgid "Last update:"
-msgstr "Dernière mise à jour&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Logs.php:28
+msgid "Log settings updated."
+msgstr "Paramètres du journal mis à jour."
-#: ../../Zotlabs/Module/Directory.php:63 ../../Zotlabs/Module/Display.php:17
-#: ../../Zotlabs/Module/Photos.php:522 ../../Zotlabs/Module/Ratings.php:86
-#: ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Viewconnections.php:20
-msgid "Public access denied."
-msgstr "Accès public refusé."
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../Zotlabs/Widget/Admin.php:48
+#: ../../Zotlabs/Widget/Admin.php:58
+msgid "Logs"
+msgstr "Journaux"
-#: ../../Zotlabs/Module/Directory.php:243
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d évaluation"
-msgstr[1] "%d évaluations"
+#: ../../Zotlabs/Module/Admin/Logs.php:85
+msgid "Clear"
+msgstr "Vider"
-#: ../../Zotlabs/Module/Directory.php:254
-msgid "Gender: "
-msgstr "Sexe/genre&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Logs.php:91
+msgid "Debugging"
+msgstr "Débogage"
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Status: "
-msgstr "État&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid "Log file"
+msgstr "Fichier du journal"
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Homepage: "
-msgstr "Site web&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Logs.php:92
+msgid ""
+"Must be writable by web server. Relative to your top-level webserver "
+"directory."
+msgstr "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site."
-#: ../../Zotlabs/Module/Directory.php:306 ../../include/channel.php:1183
-msgid "Age:"
-msgstr "Age&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Logs.php:93
+msgid "Log level"
+msgstr "Niveau de journalisation"
-#: ../../Zotlabs/Module/Directory.php:311 ../../include/event.php:52
-#: ../../include/event.php:84 ../../include/channel.php:1027
-#: ../../include/bb2diaspora.php:507
-msgid "Location:"
-msgstr "Emplacement&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:31
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channels censored/uncensored"
+msgstr[0] "%s canal censuré/dé-censuré"
+msgstr[1] "%s canaux censurés/dé-censurés"
-#: ../../Zotlabs/Module/Directory.php:317
-msgid "Description:"
-msgstr "Description&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:40
+#, php-format
+msgid "%s channel code allowed/disallowed"
+msgid_plural "%s channels code allowed/disallowed"
+msgstr[0] "code autorisé/interdit pour %s canal"
+msgstr[1] "code autorisé/interdit pour %s canaux"
-#: ../../Zotlabs/Module/Directory.php:322 ../../include/channel.php:1199
-msgid "Hometown:"
-msgstr "Ville natale&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:46
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s canal supprimé"
+msgstr[1] "%s canaux supprimés"
-#: ../../Zotlabs/Module/Directory.php:324 ../../include/channel.php:1207
-msgid "About:"
-msgstr "À propos&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:65
+msgid "Channel not found"
+msgstr "Canal introuvable"
-#: ../../Zotlabs/Module/Directory.php:325 ../../Zotlabs/Module/Match.php:68
-#: ../../Zotlabs/Module/Suggest.php:56 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../include/connections.php:78
-#: ../../include/conversation.php:956 ../../include/channel.php:1012
-msgid "Connect"
-msgstr "Ajouter/Suivre"
+#: ../../Zotlabs/Module/Admin/Channels.php:75
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Canal '%s' supprimé"
-#: ../../Zotlabs/Module/Directory.php:326
-msgid "Public Forum:"
-msgstr "Forum public&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Canal '%s' censuré"
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Keywords: "
-msgstr "Mots-clefs&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:87
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Canal '%s' non censuré"
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Don't suggest"
-msgstr "Ne pas suggérer"
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code allowed"
+msgstr "Code autorisé pour le canal '%s'"
-#: ../../Zotlabs/Module/Directory.php:334
-msgid "Common connections:"
-msgstr "Contacts en commun&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:98
+#, php-format
+msgid "Channel '%s' code disallowed"
+msgstr "Code interdit pour le canal '%s'"
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Global Directory"
-msgstr "Annuaire global"
+#: ../../Zotlabs/Module/Admin/Channels.php:146
+#: ../../Zotlabs/Widget/Admin.php:24
+msgid "Channels"
+msgstr "Canaux"
-#: ../../Zotlabs/Module/Directory.php:383
-msgid "Local Directory"
-msgstr "Annuaire local"
+#: ../../Zotlabs/Module/Admin/Channels.php:150
+msgid "Censor"
+msgstr "Censurer"
-#: ../../Zotlabs/Module/Directory.php:388
-#: ../../Zotlabs/Module/Directory.php:393
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../include/contact_widgets.php:23
-msgid "Find"
-msgstr "Trouver"
+#: ../../Zotlabs/Module/Admin/Channels.php:151
+msgid "Uncensor"
+msgstr "Ne plus censurer"
-#: ../../Zotlabs/Module/Directory.php:389
-msgid "Finding:"
-msgstr "Recherche&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Channels.php:152
+msgid "Allow Code"
+msgstr "Autoriser le code"
-#: ../../Zotlabs/Module/Directory.php:392 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Canaux suggérés"
+#: ../../Zotlabs/Module/Admin/Channels.php:153
+msgid "Disallow Code"
+msgstr "Interdire le code"
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "next page"
-msgstr "page suivante"
+#: ../../Zotlabs/Module/Admin/Channels.php:154
+#: ../../include/conversation.php:1751
+msgid "Channel"
+msgstr "Canal"
-#: ../../Zotlabs/Module/Directory.php:394
-msgid "previous page"
-msgstr "page précédente"
+#: ../../Zotlabs/Module/Admin/Channels.php:158
+msgid "UID"
+msgstr "UID"
-#: ../../Zotlabs/Module/Directory.php:395
-msgid "Sort options"
-msgstr "Options de tri"
+#: ../../Zotlabs/Module/Admin/Channels.php:162
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Les canaux sélectionnés seront supprimés&nbsp;!\\n\\nTout ce qui a été publié dans ces canaux sur ce site sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
-#: ../../Zotlabs/Module/Directory.php:396
-msgid "Alphabetic"
-msgstr "Alphabétique"
+#: ../../Zotlabs/Module/Admin/Channels.php:163
+msgid ""
+"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
+"channel on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Le canal {0} sera supprimé&nbsp;!\\n\\nTout ce qui a été publié sur ce canal sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr(e)&nbsp;?"
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "Reverse Alphabetic"
-msgstr "Alphabétique inversé"
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
+msgstr "Paramètres du thème mis à jour."
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Newest to Oldest"
-msgstr "Du plus récent au moins récent"
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
+msgstr "Aucun thème trouvé."
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Oldest to Newest"
-msgstr "Du moins récent du plus récent"
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
+msgstr "Capture d'écran"
-#: ../../Zotlabs/Module/Directory.php:416
-msgid "No entries (some entries may be hidden)."
-msgstr "Pas d'entrées (certaines peuvent être cachées)."
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
+msgid "Themes"
+msgstr "Thèmes"
-#: ../../Zotlabs/Module/Display.php:40 ../../Zotlabs/Module/Filestorage.php:33
-#: ../../Zotlabs/Module/Admin.php:164 ../../Zotlabs/Module/Admin.php:1255
-#: ../../Zotlabs/Module/Admin.php:1561 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3359
-msgid "Item not found."
-msgstr "Élément introuvable"
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
+msgstr "[Expérimental]"
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editpost.php:24 ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:81
-msgid "Item not found"
-msgstr "Élément introuvable"
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
+msgstr "[Non maintenu]"
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1228
-msgid "Title (optional)"
-msgstr "Titre (facultatif)"
+#: ../../Zotlabs/Module/Admin/Site.php:144
+msgid "Site settings updated."
+msgstr "Paramètres du site sauvegardés."
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Modifier le bloc"
+#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2923
+msgid "Default"
+msgstr "Défaut"
-#: ../../Zotlabs/Module/Common.php:14
-msgid "No channel."
-msgstr "Pas de canal."
+#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr ""
-#: ../../Zotlabs/Module/Common.php:43
-msgid "Common connections"
-msgstr "Contacts en commun"
+#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Settings/Display.php:151
+msgid "mobile"
+msgstr "mobile"
-#: ../../Zotlabs/Module/Common.php:48
-msgid "No connections in common."
-msgstr "Pas de contacts en commun."
+#: ../../Zotlabs/Module/Admin/Site.php:190
+msgid "experimental"
+msgstr "expérimental"
-#: ../../Zotlabs/Module/Connections.php:56
-#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
-msgid "Blocked"
-msgstr "Bloqué(e)"
+#: ../../Zotlabs/Module/Admin/Site.php:192
+msgid "unsupported"
+msgstr "non maintenu"
-#: ../../Zotlabs/Module/Connections.php:61
-#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
-msgid "Ignored"
-msgstr "Ignoré(e)"
+#: ../../Zotlabs/Module/Admin/Site.php:238
+msgid "Yes - with approval"
+msgstr "Oui - avec approbation"
-#: ../../Zotlabs/Module/Connections.php:66
-#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
-msgid "Hidden"
-msgstr "Caché"
+#: ../../Zotlabs/Module/Admin/Site.php:244
+msgid "My site is not a public server"
+msgstr "Mon site n'est pas un serveur public"
-#: ../../Zotlabs/Module/Connections.php:71
-#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
-msgid "Archived"
-msgstr "Archivé"
+#: ../../Zotlabs/Module/Admin/Site.php:245
+msgid "My site has paid access only"
+msgstr "Mon site est à accès payant uniquement"
-#: ../../Zotlabs/Module/Connections.php:76
-#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1535
-msgid "New"
-msgstr "Nouveautés"
+#: ../../Zotlabs/Module/Admin/Site.php:246
+msgid "My site has free access only"
+msgstr "Mon site est gratuit uniquement"
-#: ../../Zotlabs/Module/Connections.php:138
-msgid "New Connections"
-msgstr "Nouveaux contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:247
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "Mon site offre des comptes gratuits avec des améliorations payantes facultatives"
-#: ../../Zotlabs/Module/Connections.php:141
-msgid "Show pending (new) connections"
-msgstr "Voir les (nouveaux) contacts en attente"
+#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
+msgid "Beginner/Basic"
+msgstr "Pour débutant/ de base"
-#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
-msgid "All Connections"
-msgstr "Tous les contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
+msgid "Novice - not skilled but willing to learn"
+msgstr "Novice - pas qualifiés, mais prêt à apprendre"
-#: ../../Zotlabs/Module/Connections.php:148
-msgid "Show all connections"
-msgstr "Voir tous les contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
+msgid "Intermediate - somewhat comfortable"
+msgstr "Intermédiaire - assez confortable"
-#: ../../Zotlabs/Module/Connections.php:164
-msgid "Only show blocked connections"
-msgstr "Ne montrer que les contacts bloqués"
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
+msgid "Advanced - very comfortable"
+msgstr "Niveau avancé - trés confortable"
-#: ../../Zotlabs/Module/Connections.php:171
-msgid "Only show ignored connections"
-msgstr "Ne montrer que les contacts ignorés"
+#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
+msgid "Expert - I can write computer code"
+msgstr "Niveau expert - Je peux programmer"
-#: ../../Zotlabs/Module/Connections.php:178
-msgid "Only show archived connections"
-msgstr "Ne montrer que les contacts archivés"
+#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
+msgid "Wizard - I probably know more than you do"
+msgstr "Crack - J'en sais probablement plus que beaucoup"
-#: ../../Zotlabs/Module/Connections.php:185
-msgid "Only show hidden connections"
-msgstr "Ne montrer que les contacts cachés"
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
+msgid "Site"
+msgstr "Site"
-#: ../../Zotlabs/Module/Connections.php:238
-msgid "Pending approval"
-msgstr "En attente de validation"
+#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Register.php:253
+msgid "Registration"
+msgstr "Inscription"
-#: ../../Zotlabs/Module/Connections.php:254
-#, php-format
-msgid "%1$s [%2$s]"
-msgstr "%1$s [%2$s]"
+#: ../../Zotlabs/Module/Admin/Site.php:281
+msgid "File upload"
+msgstr "Envoi de fichier"
-#: ../../Zotlabs/Module/Connections.php:255
-msgid "Edit connection"
-msgstr "Modifier le contact"
+#: ../../Zotlabs/Module/Admin/Site.php:282
+msgid "Policies"
+msgstr "Stratégies"
-#: ../../Zotlabs/Module/Connections.php:256
-msgid "Delete connection"
-msgstr "Supprimer le contact"
+#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../include/contact_widgets.php:16
+msgid "Advanced"
+msgstr "Avancé"
-#: ../../Zotlabs/Module/Connections.php:265
-msgid "Channel address"
-msgstr "Adresse du canal"
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../addon/statusnet/statusnet.php:890
+msgid "Site name"
+msgstr "Nom du site"
-#: ../../Zotlabs/Module/Connections.php:267
-msgid "Network"
-msgstr "Réseau"
+#: ../../Zotlabs/Module/Admin/Site.php:291
+msgid "Site default technical skill level"
+msgstr "Niveau technique par défaut pour le site"
-#: ../../Zotlabs/Module/Connections.php:270 ../../Zotlabs/Module/Admin.php:710
-msgid "Status"
-msgstr "État"
+#: ../../Zotlabs/Module/Admin/Site.php:291
+msgid "Used to provide a member experience matched to technical comfort level"
+msgstr "Utilisé pour fournir une expérience utilisateur correspondant au niveau de confort technique"
-#: ../../Zotlabs/Module/Connections.php:272
-msgid "Connected"
-msgstr "Connecté"
+#: ../../Zotlabs/Module/Admin/Site.php:293
+msgid "Lock the technical skill level setting"
+msgstr "Bloque le niveau technique du paramétrage"
-#: ../../Zotlabs/Module/Connections.php:274
-msgid "Approve connection"
-msgstr "Valider le contact"
+#: ../../Zotlabs/Module/Admin/Site.php:293
+msgid "Members can set their own technical comfort level by default"
+msgstr "Les utilisateurs peuvent paramétrer leur propre niveau technique."
-#: ../../Zotlabs/Module/Connections.php:275
-#: ../../Zotlabs/Module/Admin.php:1037
-msgid "Approve"
-msgstr "Approuver"
+#: ../../Zotlabs/Module/Admin/Site.php:295
+msgid "Banner/Logo"
+msgstr "Bannière/logo"
-#: ../../Zotlabs/Module/Connections.php:276
-msgid "Ignore connection"
-msgstr "Ignorer le contact"
+#: ../../Zotlabs/Module/Admin/Site.php:296
+msgid "Administrator Information"
+msgstr "Informations de l'administrateur"
-#: ../../Zotlabs/Module/Connections.php:278
-msgid "Recent activity"
-msgstr "Activité récente"
+#: ../../Zotlabs/Module/Admin/Site.php:296
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Coordonnées de l'administrateur du site. Affichées sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici"
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:208
-#: ../../include/text.php:875 ../../include/nav.php:186
-msgid "Connections"
-msgstr "Contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Siteinfo.php:23
+msgid "Site Information"
+msgstr "Site information"
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:228 ../../include/text.php:945
-#: ../../include/text.php:957 ../../include/nav.php:165
-#: ../../include/acl_selectors.php:276
-msgid "Search"
-msgstr "Recherche"
+#: ../../Zotlabs/Module/Admin/Site.php:297
+msgid ""
+"Publicly visible description of this site. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Description du site visible publiquement. Affiché sur la page d'information du site. BBCode peut être utilisé ici."
-#: ../../Zotlabs/Module/Connections.php:307
-msgid "Search your connections"
-msgstr "Chercher parmi vos contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:298
+msgid "System language"
+msgstr "Langue du système"
-#: ../../Zotlabs/Module/Connections.php:308
-msgid "Connections search"
-msgstr "Chercher des contacts"
+#: ../../Zotlabs/Module/Admin/Site.php:299
+msgid "System theme"
+msgstr "Thème du système"
-#: ../../Zotlabs/Module/Cover_photo.php:58
-#: ../../Zotlabs/Module/Profile_photo.php:79
-msgid "Image uploaded but image cropping failed."
-msgstr "L'image a été téléversée, mais le recadrage a échoué."
+#: ../../Zotlabs/Module/Admin/Site.php:299
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>"
-#: ../../Zotlabs/Module/Cover_photo.php:134
-#: ../../Zotlabs/Module/Cover_photo.php:181
-msgid "Cover Photos"
-msgstr "Photos de couverture"
+#: ../../Zotlabs/Module/Admin/Site.php:300
+msgid "Mobile system theme"
+msgstr "Thème par défaut pour les mobiles"
-#: ../../Zotlabs/Module/Cover_photo.php:154
-#: ../../Zotlabs/Module/Profile_photo.php:133
-msgid "Image resize failed."
-msgstr "Le redimensionnement de l'image a échoué."
+#: ../../Zotlabs/Module/Admin/Site.php:300
+msgid "Theme for mobile devices"
+msgstr "Thème pour les mobiles"
-#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:192 ../../include/photos.php:144
-msgid "Unable to process image"
-msgstr "Impossible de traiter l'image"
+#: ../../Zotlabs/Module/Admin/Site.php:302
+msgid "Allow Feeds as Connections"
+msgstr "Autoriser les Flux (RSS) comme contacts"
-#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:217
-msgid "Image upload failed."
-msgstr "Le téléversement de l'image a échoué."
+#: ../../Zotlabs/Module/Admin/Site.php:302
+msgid "(Heavy system resource usage)"
+msgstr "(Impact important sur les ressources)"
-#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:236
-msgid "Unable to process image."
-msgstr "Impossible de traîter l'image."
+#: ../../Zotlabs/Module/Admin/Site.php:303
+msgid "Maximum image size"
+msgstr "Taille maximale des images"
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4270
-msgid "female"
-msgstr "femme"
+#: ../../Zotlabs/Module/Admin/Site.php:303
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite."
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4271
-#, php-format
-msgid "%1$s updated her %2$s"
-msgstr "%1$s a mis à jour son %2$s"
+#: ../../Zotlabs/Module/Admin/Site.php:304
+msgid "Does this site allow new member registration?"
+msgstr "Est-ce que l'enregistrement de nouveaux membres est autorisé sur ce site&nbsp;?"
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4272
-msgid "male"
-msgstr "homme"
+#: ../../Zotlabs/Module/Admin/Site.php:305
+msgid "Invitation only"
+msgstr "Sur invitation seulement"
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4273
-#, php-format
-msgid "%1$s updated his %2$s"
-msgstr "%1$s a mis à jour son %2$s"
+#: ../../Zotlabs/Module/Admin/Site.php:305
+msgid ""
+"Only allow new member registrations with an invitation code. Above register "
+"policy must be set to Yes."
+msgstr "N'autoriser que les nouvelles inscriptions avec code d'invitation. La stratégie d'inscription ci-dessus doit être mise sur \"Oui\"."
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4275
-#, php-format
-msgid "%1$s updated their %2$s"
-msgstr "%1$s a mis a jour sa %2$s"
+#: ../../Zotlabs/Module/Admin/Site.php:306
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "Quelle est la meilleure description des types de comptes proposés sur ce hub&nbsp;?"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1661
-msgid "cover photo"
-msgstr "Photo principale"
+#: ../../Zotlabs/Module/Admin/Site.php:307
+msgid "Register text"
+msgstr "Texte d'inscription"
-#: ../../Zotlabs/Module/Cover_photo.php:303
-#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:283
-#: ../../Zotlabs/Module/Profile_photo.php:324
-msgid "Photo not available."
-msgstr "Photo inaccessible."
+#: ../../Zotlabs/Module/Admin/Site.php:307
+msgid "Will be displayed prominently on the registration page."
+msgstr "Sera affiché de manière bien visible sur le formulaire d'inscription."
-#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:365
-msgid "Upload File:"
-msgstr "Téléverser fichier&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Site.php:308
+msgid "Site homepage to show visitors (default: login box)"
+msgstr "Page d'accueil du site à montrer aux visiteurs (par défaut&nbsp;: boîte de dialogue de connexion)"
-#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:366
-msgid "Select a profile:"
-msgstr "Choisir un profil&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Site.php:308
+msgid ""
+"example: 'public' to show public stream, 'page/sys/home' to show a system "
+"webpage called 'home' or 'include:home.html' to include a file."
+msgstr "exemple&nbsp;:'public' pour montrer le flux public, 'page/sys/home' pour montrer une page système appelée 'home' ou 'include:home.html' pour inclure un fichier."
-#: ../../Zotlabs/Module/Cover_photo.php:356
-msgid "Upload Cover Photo"
-msgstr "Téléverser une photo de couverture"
+#: ../../Zotlabs/Module/Admin/Site.php:309
+msgid "Preserve site homepage URL"
+msgstr "Préserver l'adresse d'accueil du site"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:374
-#: ../../Zotlabs/Module/Settings.php:985
-msgid "or"
-msgstr "ou"
+#: ../../Zotlabs/Module/Admin/Site.php:309
+msgid ""
+"Present the site homepage in a frame at the original location instead of "
+"redirecting"
+msgstr "Présenter la page d'accueil du site dans un cadre à l'adresse d'origine, plutôt que de rediriger"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:374
-msgid "skip this step"
-msgstr "passer cette étape"
+#: ../../Zotlabs/Module/Admin/Site.php:310
+msgid "Accounts abandoned after x days"
+msgstr "Les comptes sont abandonnés après x jours"
-#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:374
-msgid "select a photo from your photo albums"
-msgstr "choisir une photo dans vos albums"
+#: ../../Zotlabs/Module/Admin/Site.php:310
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Eviter de gaspiller les ressources du système en interrogeant des hubs distants pour des canaux abandonnés. Mettez 0 pour ne pas avoir de limite de temps."
-#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:390
-msgid "Crop Image"
-msgstr "Recadrer l'image"
+#: ../../Zotlabs/Module/Admin/Site.php:311
+msgid "Allowed friend domains"
+msgstr "Domaines amicaux autorisés"
-#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:391
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Merci d'ajuster le cadre pour une visualisation optimale."
+#: ../../Zotlabs/Module/Admin/Site.php:311
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Liste de noms de domaines séparés par des virgules pour lesquels ce site acceptera les demandes d'amitié. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
-#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:393
-msgid "Done Editing"
-msgstr "J'ai terminé"
+#: ../../Zotlabs/Module/Admin/Site.php:312
+msgid "Verify Email Addresses"
+msgstr "Demander vérification des adresses de courriel"
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Elément non modifiable"
+#: ../../Zotlabs/Module/Admin/Site.php:312
+msgid ""
+"Check to verify email addresses used in account registration (recommended)."
+msgstr "Cocher pour que les adresses utilisées à l'inscription soient vérifiées (recommandé)."
-#: ../../Zotlabs/Module/Editpost.php:106 ../../Zotlabs/Module/Rpost.php:135
-msgid "Edit post"
-msgstr "Modifier la publication"
+#: ../../Zotlabs/Module/Admin/Site.php:313
+msgid "Force publish"
+msgstr "Publicité forcée"
-#: ../../Zotlabs/Module/Events.php:26
-msgid "Calendar entries imported."
-msgstr "Entrées du calendrier importées."
+#: ../../Zotlabs/Module/Admin/Site.php:313
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Cocher pour forcer la publication de tous les profils du site dans l'annuaire."
-#: ../../Zotlabs/Module/Events.php:28
-msgid "No calendar entries found."
-msgstr "Aucune entrée du calendrier trouvée."
+#: ../../Zotlabs/Module/Admin/Site.php:314
+msgid "Import Public Streams"
+msgstr "Flux publics importés"
-#: ../../Zotlabs/Module/Events.php:105
-msgid "Event can not end before it has started."
-msgstr "La fin de l'événement ne peut être antérieure à son début."
+#: ../../Zotlabs/Module/Admin/Site.php:314
+msgid ""
+"Import and allow access to public content pulled from other sites. Warning: "
+"this content is unmoderated."
+msgstr "Importer du contenu public à partir d'autres sites et autoriser l'accès à ce contenu. Attention&nbsp;: ce contenu n'est pas modéré."
-#: ../../Zotlabs/Module/Events.php:107 ../../Zotlabs/Module/Events.php:116
-#: ../../Zotlabs/Module/Events.php:136
-msgid "Unable to generate preview."
-msgstr "Impossible de générer l'aperçu."
+#: ../../Zotlabs/Module/Admin/Site.php:315
+msgid "Login on Homepage"
+msgstr "Connexion sur la page d'accueil"
-#: ../../Zotlabs/Module/Events.php:114
-msgid "Event title and start time are required."
-msgstr "Un titre et une date de début sont requises pour l'événement."
+#: ../../Zotlabs/Module/Admin/Site.php:315
+msgid ""
+"Present a login box to visitors on the home page if no other content has "
+"been configured."
+msgstr "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré."
-#: ../../Zotlabs/Module/Events.php:134 ../../Zotlabs/Module/Events.php:259
-msgid "Event not found."
-msgstr "Événement introuvable."
+#: ../../Zotlabs/Module/Admin/Site.php:316
+msgid "Enable context help"
+msgstr "Permettre l'aide contextuelle"
-#: ../../Zotlabs/Module/Events.php:254 ../../Zotlabs/Module/Like.php:373
-#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:949
-#: ../../include/text.php:1943 ../../include/conversation.php:123
-msgid "event"
-msgstr "événement"
+#: ../../Zotlabs/Module/Admin/Site.php:316
+msgid ""
+"Display contextual help for the current page when the help button is "
+"pressed."
+msgstr "Afficher l'aide contextuel en cliquant sur le bouton aide."
-#: ../../Zotlabs/Module/Events.php:449
-msgid "Edit event title"
-msgstr "Modifier le titre de l'événement"
+#: ../../Zotlabs/Module/Admin/Site.php:318
+msgid "Reply-to email address for system generated email."
+msgstr ""
-#: ../../Zotlabs/Module/Events.php:449
-msgid "Event title"
-msgstr "Titre de l'événement"
+#: ../../Zotlabs/Module/Admin/Site.php:319
+msgid "Sender (From) email address for system generated email."
+msgstr ""
-#: ../../Zotlabs/Module/Events.php:449 ../../Zotlabs/Module/Events.php:454
-#: ../../Zotlabs/Module/Profiles.php:709 ../../Zotlabs/Module/Profiles.php:713
-#: ../../Zotlabs/Module/Appman.php:115 ../../Zotlabs/Module/Appman.php:116
-#: ../../include/datetime.php:245
-msgid "Required"
-msgstr "Requis"
+#: ../../Zotlabs/Module/Admin/Site.php:320
+msgid "Name of email sender for system generated email."
+msgstr ""
-#: ../../Zotlabs/Module/Events.php:451
-msgid "Categories (comma-separated list)"
-msgstr "Catégories (séparées par des virgules)"
+#: ../../Zotlabs/Module/Admin/Site.php:322
+msgid "Directory Server URL"
+msgstr "URL du serveur d'annuaire"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Edit Category"
-msgstr "Modifier la catégorie"
+#: ../../Zotlabs/Module/Admin/Site.php:322
+msgid "Default directory server"
+msgstr "Serveur d'annuaire par défaut"
-#: ../../Zotlabs/Module/Events.php:452
-msgid "Category"
-msgstr "Catégorie"
+#: ../../Zotlabs/Module/Admin/Site.php:324
+msgid "Proxy user"
+msgstr "Utilisateur du proxy"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Edit start date and time"
-msgstr "Modifier la date et l'heure de début"
+#: ../../Zotlabs/Module/Admin/Site.php:325
+msgid "Proxy URL"
+msgstr "URL du proxy"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Start date and time"
-msgstr "Date et heure de début"
+#: ../../Zotlabs/Module/Admin/Site.php:326
+msgid "Network timeout"
+msgstr "Délai maximal du réseau"
-#: ../../Zotlabs/Module/Events.php:456 ../../Zotlabs/Module/Events.php:459
-msgid "Finish date and time are not known or not relevant"
-msgstr "Date et heure de fin inconnues ou sans objet"
+#: ../../Zotlabs/Module/Admin/Site.php:326
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (non recommandé)."
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Edit finish date and time"
-msgstr "Modifier la date et l'heure de fin"
+#: ../../Zotlabs/Module/Admin/Site.php:327
+msgid "Delivery interval"
+msgstr "Intervalle de distribution"
-#: ../../Zotlabs/Module/Events.php:458
-msgid "Finish date and time"
-msgstr "Date et heure de fin"
+#: ../../Zotlabs/Module/Admin/Site.php:327
+msgid ""
+"Delay background delivery processes by this many seconds to reduce system "
+"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
+"for large dedicated servers."
+msgstr "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées&nbsp;: 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés."
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:461
-msgid "Adjust for viewer timezone"
-msgstr "Ajuster au fuseau horaire du visiteur"
+#: ../../Zotlabs/Module/Admin/Site.php:328
+msgid "Deliveries per process"
+msgstr "Distributions par processus"
-#: ../../Zotlabs/Module/Events.php:460
+#: ../../Zotlabs/Module/Admin/Site.php:328
msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde."
+"Number of deliveries to attempt in a single operating system process. Adjust"
+" if necessary to tune system performance. Recommend: 1-5."
+msgstr "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé&nbsp;:1-5."
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Edit Description"
-msgstr "Modifier la description"
+#: ../../Zotlabs/Module/Admin/Site.php:329
+msgid "Poll interval"
+msgstr "Intervalle de scrutation"
-#: ../../Zotlabs/Module/Events.php:462 ../../Zotlabs/Module/Appman.php:117
-#: ../../Zotlabs/Module/Rbmark.php:101
-msgid "Description"
-msgstr "Description"
+#: ../../Zotlabs/Module/Admin/Site.php:329
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Temporise le processus de scrutation en tâche de fond de tant de secondes, pour réduire la charge. Si 0, utilise l'intervalle de distribution."
-#: ../../Zotlabs/Module/Events.php:464
-msgid "Edit Location"
-msgstr "Modifier l'emplacement"
+#: ../../Zotlabs/Module/Admin/Site.php:330
+msgid "Maximum Load Average"
+msgstr "Charge maximale moyenne"
-#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Locs.php:117
-#: ../../Zotlabs/Module/Profiles.php:477 ../../Zotlabs/Module/Profiles.php:698
-#: ../../Zotlabs/Module/Pubsites.php:41 ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Emplacement"
+#: ../../Zotlabs/Module/Admin/Site.php:330
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50."
-#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:469
-msgid "Share this event"
-msgstr "Partager cet événement"
+#: ../../Zotlabs/Module/Admin/Site.php:331
+msgid "Expiration period in days for imported (grid/network) content"
+msgstr "Délai d'expiration pour le contenu importé (réseau)"
-#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Photos.php:1093
-#: ../../Zotlabs/Module/Webpages.php:194 ../../Zotlabs/Lib/ThreadItem.php:719
-#: ../../include/conversation.php:1187 ../../include/page_widgets.php:40
-msgid "Preview"
-msgstr "Aperçu"
+#: ../../Zotlabs/Module/Admin/Site.php:331
+msgid "0 for no expiration of imported content"
+msgstr "0 pour ne pas expirer le contenu importé"
-#: ../../Zotlabs/Module/Events.php:471 ../../include/conversation.php:1232
-msgid "Permission settings"
-msgstr "Gérer les autorisations"
+#: ../../Zotlabs/Module/Admin/Profs.php:69
+msgid "New Profile Field"
+msgstr "Nouveau champ de profil"
-#: ../../Zotlabs/Module/Events.php:476
-msgid "Advanced Options"
-msgstr "Options avancées"
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "Field nickname"
+msgstr "Nom court du champ"
-#: ../../Zotlabs/Module/Events.php:610
-msgid "Edit event"
-msgstr "Modifier l'événement"
+#: ../../Zotlabs/Module/Admin/Profs.php:70
+#: ../../Zotlabs/Module/Admin/Profs.php:90
+msgid "System name of field"
+msgstr "Nom système du champ"
-#: ../../Zotlabs/Module/Events.php:612
-msgid "Delete event"
-msgstr "Supprimer l'événement"
+#: ../../Zotlabs/Module/Admin/Profs.php:71
+#: ../../Zotlabs/Module/Admin/Profs.php:91
+msgid "Input type"
+msgstr "Type de champ"
-#: ../../Zotlabs/Module/Events.php:646
-msgid "calendar"
-msgstr "calendrier"
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Field Name"
+msgstr "Nom du champ"
-#: ../../Zotlabs/Module/Events.php:706
-msgid "Event removed"
-msgstr "Événement supprimé"
+#: ../../Zotlabs/Module/Admin/Profs.php:72
+#: ../../Zotlabs/Module/Admin/Profs.php:92
+msgid "Label on profile pages"
+msgstr "Étiquette sur les pages de profil"
-#: ../../Zotlabs/Module/Events.php:709
-msgid "Failed to remove event"
-msgstr "Impossible de supprimer l'événement"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Help text"
+msgstr "Aide à la saisie"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:220
-#: ../../include/nav.php:92 ../../include/conversation.php:1632
-msgid "Photos"
-msgstr "Photos"
+#: ../../Zotlabs/Module/Admin/Profs.php:73
+#: ../../Zotlabs/Module/Admin/Profs.php:93
+msgid "Additional info (optional)"
+msgstr "Informations additionnelles (facultatif)"
-#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Admin.php:1406 ../../Zotlabs/Module/Settings.php:591
-#: ../../Zotlabs/Module/Settings.php:617 ../../Zotlabs/Module/Tagrm.php:15
-#: ../../Zotlabs/Module/Tagrm.php:138 ../../include/conversation.php:1259
-msgid "Cancel"
-msgstr "Annuler"
+#: ../../Zotlabs/Module/Admin/Profs.php:74
+#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
+#: ../../include/text.php:1040
+msgid "Save"
+msgstr "Enregistrer"
-#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
-msgid "This site is not a directory server"
-msgstr "Ce site n'est pas un serveur d'annuaire"
+#: ../../Zotlabs/Module/Admin/Profs.php:83
+msgid "Field definition not found"
+msgstr "Définition du champ introuvable"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Ce serveur d'annuaire requiert un jeton d'accès"
+#: ../../Zotlabs/Module/Admin/Profs.php:89
+msgid "Edit Profile Field"
+msgstr "Modifier le champ de profil"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "Save to Folder:"
-msgstr "Classer dans le dossier&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../Zotlabs/Widget/Admin.php:30
+msgid "Profile Fields"
+msgstr "Champs de profil"
-#: ../../Zotlabs/Module/Filer.php:52
-msgid "- select -"
-msgstr "- choisir -"
+#: ../../Zotlabs/Module/Admin/Profs.php:148
+msgid "Basic Profile Fields"
+msgstr "Champs de profil de base"
-#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin.php:2033
-#: ../../Zotlabs/Module/Admin.php:2053 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:946
-#: ../../include/text.php:958 ../../include/widgets.php:201
-msgid "Save"
-msgstr "Enregistrer"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "Advanced Profile Fields"
+msgstr "Champs de profil avancés"
-#: ../../Zotlabs/Module/Dreport.php:27
-msgid "Invalid message"
-msgstr "Message non valide"
+#: ../../Zotlabs/Module/Admin/Profs.php:149
+msgid "(In addition to basic fields)"
+msgstr "(en plus des champs de base)"
-#: ../../Zotlabs/Module/Dreport.php:59
-msgid "no results"
-msgstr "aucun résultat"
+#: ../../Zotlabs/Module/Admin/Profs.php:151
+msgid "All available fields"
+msgstr "Tous les champs disponibles"
-#: ../../Zotlabs/Module/Dreport.php:64
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Rapport de distribution pour %1$s"
+#: ../../Zotlabs/Module/Admin/Profs.php:152
+msgid "Custom Fields"
+msgstr "Champs personnalisés"
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "channel sync processed"
-msgstr "Synchro de canal effectuée"
+#: ../../Zotlabs/Module/Admin/Profs.php:156
+msgid "Create Custom Field"
+msgstr "Créer un champ personnalisé"
-#: ../../Zotlabs/Module/Dreport.php:82
-msgid "queued"
-msgstr "mis dans la file d'attente"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:29
+#, php-format
+msgid "Password changed for account %d."
+msgstr "Le mot de passe a été modifié pour le compte %d."
-#: ../../Zotlabs/Module/Dreport.php:86
-msgid "posted"
-msgstr "publié"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:46
+msgid "Account settings updated."
+msgstr "Paramétrage du compte mis à jour"
-#: ../../Zotlabs/Module/Dreport.php:90
-msgid "accepted for delivery"
-msgstr "accepté pour la distribution"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:61
+msgid "Account not found."
+msgstr "Compte introuvable"
-#: ../../Zotlabs/Module/Dreport.php:94
-msgid "updated"
-msgstr "mis à jour"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:68
+msgid "Account Edit"
+msgstr "Modifier votre compte"
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "update ignored"
-msgstr "mise à jour ignorée"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:69
+msgid "New Password"
+msgstr "Nouveau mot de passe"
-#: ../../Zotlabs/Module/Dreport.php:100
-msgid "permission denied"
-msgstr "permission refusée"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:70
+msgid "New Password again"
+msgstr "Nouveau mot de passe (encore)"
-#: ../../Zotlabs/Module/Dreport.php:104
-msgid "recipient not found"
-msgstr "destinataire introuvable"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:71
+msgid "Technical skill level"
+msgstr "Niveau technique"
-#: ../../Zotlabs/Module/Dreport.php:107
-msgid "mail recalled"
-msgstr "courriel rappelé"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:72
+msgid "Account language (for emails)"
+msgstr "Langue de votre compte (pour email)"
-#: ../../Zotlabs/Module/Dreport.php:110
-msgid "duplicate mail received"
-msgstr "courriel reçu en double"
+#: ../../Zotlabs/Module/Admin/Account_edit.php:73
+msgid "Service class"
+msgstr "Classe de service"
-#: ../../Zotlabs/Module/Dreport.php:113
-msgid "mail delivered"
-msgstr "courriel distribué"
+#: ../../Zotlabs/Module/Admin/Security.php:77
+msgid ""
+"By default, unfiltered HTML is allowed in embedded media. This is inherently"
+" insecure."
+msgstr "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité."
-#: ../../Zotlabs/Module/Editlayout.php:126
-#: ../../Zotlabs/Module/Layouts.php:127 ../../Zotlabs/Module/Layouts.php:186
-msgid "Layout Name"
-msgstr "Nom de la mise en page"
+#: ../../Zotlabs/Module/Admin/Security.php:80
+msgid ""
+"The recommended setting is to only allow unfiltered HTML from the following "
+"sites:"
+msgstr "Ce paramétrage autorisant le HTML pour les sites suivants."
-#: ../../Zotlabs/Module/Editlayout.php:127
-#: ../../Zotlabs/Module/Layouts.php:130
-msgid "Layout Description (Optional)"
-msgstr "Description de la mise en page (facultatif)"
+#: ../../Zotlabs/Module/Admin/Security.php:81
+msgid ""
+"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
+" />https://vimeo.com/<br />https://soundcloud.com/<br />"
+msgstr "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"
-#: ../../Zotlabs/Module/Editlayout.php:135
-msgid "Edit Layout"
-msgstr "Modifier la mise en page"
+#: ../../Zotlabs/Module/Admin/Security.php:82
+msgid ""
+"All other embedded content will be filtered, <strong>unless</strong> "
+"embedded content from that site is explicitly blocked."
+msgstr "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués."
-#: ../../Zotlabs/Module/Editwebpage.php:143
-msgid "Page link"
-msgstr ""
+#: ../../Zotlabs/Module/Admin/Security.php:87
+#: ../../Zotlabs/Widget/Admin.php:25
+msgid "Security"
+msgstr "Sécurité"
-#: ../../Zotlabs/Module/Editwebpage.php:169
-msgid "Edit Webpage"
-msgstr "Modifier la page web"
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid "Block public"
+msgstr "Bloquer \"public\""
-#: ../../Zotlabs/Module/Follow.php:34
-msgid "Channel added."
-msgstr "Canal ajouté."
+#: ../../Zotlabs/Module/Admin/Security.php:89
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently authenticated."
+msgstr "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web."
-#: ../../Zotlabs/Module/Acl.php:227
-msgid "network"
-msgstr "réseau"
+#: ../../Zotlabs/Module/Admin/Security.php:90
+msgid "Set \"Transport Security\" HTTP header"
+msgstr "Paramétrer \"Transport Security\" pour l'entête HTTP"
-#: ../../Zotlabs/Module/Acl.php:237
-msgid "RSS"
-msgstr "RSS"
+#: ../../Zotlabs/Module/Admin/Security.php:91
+msgid "Set \"Content Security Policy\" HTTP header"
+msgstr "Paramétrer \"Content Security Policy\" pour l'entête HTTP"
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Groupe d'accès créé."
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid "Allowed email domains"
+msgstr "Domaines de courriels autorisés"
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Impossible de créer le groupe d'accès."
+#: ../../Zotlabs/Module/Admin/Security.php:92
+msgid ""
+"Comma separated list of domains which are allowed in email addresses for "
+"registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains"
+msgstr "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3893
-msgid "Privacy group not found."
-msgstr "Groupe d'accès introuvable."
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid "Not allowed email domains"
+msgstr "Domaines de courriel non autorisés"
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Groupe d'accès mis à jour."
+#: ../../Zotlabs/Module/Admin/Security.php:93
+msgid ""
+"Comma separated list of domains which are not allowed in email addresses for"
+" registrations to this site. Wildcards are accepted. Empty to allow any "
+"domains, unless allowed domains have been defined."
+msgstr "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis."
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Créer un groupe de canaux."
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid "Allow communications only from these sites"
+msgstr "N'autorisez que les communications venant de ces sites"
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Nom du groupe d'accès&nbsp;:"
+#: ../../Zotlabs/Module/Admin/Security.php:94
+msgid ""
+"One site per line. Leave empty to allow communication from anywhere by "
+"default"
+msgstr "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut."
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Les membres sont visibles par les autres canaux"
+#: ../../Zotlabs/Module/Admin/Security.php:95
+msgid "Block communications from these sites"
+msgstr "Bloquer les communications de ces sites"
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Groupe d'accès supprimé."
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid "Allow communications only from these channels"
+msgstr "N'autoriser que les communications de ces canaux"
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Impossible de supprimer le groupe d'accès."
+#: ../../Zotlabs/Module/Admin/Security.php:96
+msgid ""
+"One channel (hash) per line. Leave empty to allow from any channel by "
+"default"
+msgstr "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Editeur de groupe d'accès."
+#: ../../Zotlabs/Module/Admin/Security.php:97
+msgid "Block communications from these channels"
+msgstr "Bloquer les communications de ces canaux"
-#: ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Membres"
+#: ../../Zotlabs/Module/Admin/Security.php:98
+msgid "Only allow embeds from secure (SSL) websites and links."
+msgstr "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Tous les canaux connectés"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "Allow unfiltered embedded HTML content only from these domains"
+msgstr "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines"
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Cliquer sur un canal pour l'ajouter ou le supprimer"
+#: ../../Zotlabs/Module/Admin/Security.php:99
+msgid "One site per line. By default embedded content is filtered."
+msgstr "Un site par ligne. Par défaut le contenu embarqué est filtré."
-#: ../../Zotlabs/Module/Ffsapi.php:12
-msgid "Share content from Firefox to $Projectname"
-msgstr "Partager du contenu depuis Firefox avec $Projectname"
+#: ../../Zotlabs/Module/Admin/Security.php:100
+msgid "Block embedded HTML from these domains"
+msgstr "Bloquer le HTML embarqué à partir de ces domaines"
-#: ../../Zotlabs/Module/Ffsapi.php:15
-msgid "Activate the Firefox $Projectname provider"
-msgstr "Activer le connecteur $Projectname pour Firefox"
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Les informations distantes de confidentialité ne sont pas disponibles."
-#: ../../Zotlabs/Module/Api.php:61 ../../Zotlabs/Module/Api.php:85
-msgid "Authorize application connection"
-msgstr "Autoriser l'application à se connecter"
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Visible par&nbsp;:"
-#: ../../Zotlabs/Module/Api.php:62
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Merci de retourner vers votre application, et d'y insérer ce Code de Sécurité&nbsp;:"
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr ""
-#: ../../Zotlabs/Module/Api.php:72
-msgid "Please login to continue."
-msgstr "Merci de vous identifier pour continuer."
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Catégorie d'autorisation enregistrée."
-#: ../../Zotlabs/Module/Api.php:87
+#: ../../Zotlabs/Module/Settings/Permcats.php:61
msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?"
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts."
-#: ../../Zotlabs/Module/Help.php:26
-msgid "Documentation Search"
-msgstr "Chercher dans la documentation"
+#: ../../Zotlabs/Module/Settings/Permcats.php:94
+msgid "Permission Categories"
+msgstr "Catégories d'autorisation"
-#: ../../Zotlabs/Module/Help.php:67 ../../Zotlabs/Module/Help.php:73
-#: ../../Zotlabs/Module/Help.php:79
-msgid "Help:"
-msgstr "Aide&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Permcats.php:102
+msgid "Permission Name"
+msgstr "Nom de l'autorisation"
-#: ../../Zotlabs/Module/Help.php:85 ../../Zotlabs/Module/Help.php:90
-#: ../../Zotlabs/Module/Layouts.php:183 ../../Zotlabs/Lib/Apps.php:223
-#: ../../include/nav.php:159
-msgid "Help"
-msgstr "Aide"
+#: ../../Zotlabs/Module/Settings/Permcats.php:103
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+#: ../../Zotlabs/Module/Connedit.php:894
+msgid "My Settings"
+msgstr "Mes paramètres"
-#: ../../Zotlabs/Module/Help.php:120
-msgid "$Projectname Documentation"
-msgstr "Documentation $Projectname"
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid "inherited"
+msgstr "héritée"
-#: ../../Zotlabs/Module/Filestorage.php:88
-msgid "Permission Denied."
-msgstr "Permission refusée."
+#: ../../Zotlabs/Module/Settings/Permcats.php:108
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+#: ../../Zotlabs/Module/Connedit.php:896
+msgid "Individual Permissions"
+msgstr "Permissions individuelles"
-#: ../../Zotlabs/Module/Filestorage.php:104
-msgid "File not found."
-msgstr "Fichier introuvable."
+#: ../../Zotlabs/Module/Settings/Permcats.php:109
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
+#: ../../Zotlabs/Module/Connedit.php:897
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
-#: ../../Zotlabs/Module/Filestorage.php:147
-msgid "Edit file permissions"
-msgstr "Modifier les autorisations d'accès au fichier"
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81
+#: ../../Zotlabs/Module/Connedit.php:715 ../../Zotlabs/Widget/Affinity.php:28
+#: ../../include/selectors.php:123 ../../include/channel.php:406
+#: ../../include/channel.php:407 ../../include/channel.php:414
+msgid "Friends"
+msgstr "Amis"
-#: ../../Zotlabs/Module/Filestorage.php:156
-msgid "Set/edit permissions"
-msgstr "Définir/modifier les autorisations"
+#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../addon/rendezvous/rendezvous.php:82
+#: ../../addon/openstreetmap/openstreetmap.php:184
+#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
+#: ../../addon/twitter/twitter.php:766 ../../addon/piwik/piwik.php:116
+#: ../../addon/xmpp/xmpp.php:102
+msgid "Settings updated."
+msgstr "Paramètres mis à jour."
-#: ../../Zotlabs/Module/Filestorage.php:157
-msgid "Include all files and sub folders"
-msgstr "Inclure tous fichiers et sous-répertoires"
+#: ../../Zotlabs/Module/Settings/Channel.php:312
+msgid "Nobody except yourself"
+msgstr "Personne sauf vous"
-#: ../../Zotlabs/Module/Filestorage.php:158
-msgid "Return to file list"
-msgstr "Retourner à la liste des fichiers"
+#: ../../Zotlabs/Module/Settings/Channel.php:313
+msgid "Only those you specifically allow"
+msgstr "Seulement ceux que vous autorisez spécifiquement"
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Copiez/collez ce code pour joindre le fichier à une publication"
+#: ../../Zotlabs/Module/Settings/Channel.php:314
+msgid "Approved connections"
+msgstr "Contacts approuvés"
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web"
+#: ../../Zotlabs/Module/Settings/Channel.php:315
+msgid "Any connections"
+msgstr "Tous les contacts"
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Share this file"
-msgstr "Partager ce fichier"
+#: ../../Zotlabs/Module/Settings/Channel.php:316
+msgid "Anybody on this website"
+msgstr "Tous les utilisateurs du hub"
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Show URL to this file"
-msgstr "Montrer l'URL de ce fichier"
+#: ../../Zotlabs/Module/Settings/Channel.php:317
+msgid "Anybody in this network"
+msgstr "Tous les utilisateurs sur ce réseau"
-#: ../../Zotlabs/Module/Filestorage.php:165
-msgid "Notify your contacts about this file"
-msgstr "Notifier vos contacts à propos de ce fichier"
+#: ../../Zotlabs/Module/Settings/Channel.php:318
+msgid "Anybody authenticated"
+msgstr "Tous les utilisateurs authentifiés"
-#: ../../Zotlabs/Module/Apps.php:47 ../../include/widgets.php:102
-#: ../../include/nav.php:163
-msgid "Apps"
-msgstr "Applications"
+#: ../../Zotlabs/Module/Settings/Channel.php:319
+msgid "Anybody on the internet"
+msgstr "Tous les utilisateurs d'Internet"
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Élément indisponible."
+#: ../../Zotlabs/Module/Settings/Channel.php:395
+msgid "Publish your default profile in the network directory"
+msgstr "Publier votre profil par défaut dans l'annuaire du réseau"
-#: ../../Zotlabs/Module/Import.php:32
-#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Votre forfait n'autorise que %d canaux."
+#: ../../Zotlabs/Module/Settings/Channel.php:400
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?"
-#: ../../Zotlabs/Module/Import.php:70 ../../Zotlabs/Module/Import_items.php:42
-msgid "Nothing to import."
-msgstr "Rien à importer."
+#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "or"
+msgstr "ou"
-#: ../../Zotlabs/Module/Import.php:94 ../../Zotlabs/Module/Import_items.php:66
-msgid "Unable to download data from old server"
-msgstr "Impossible de récupérer les données de l'ancien serveur"
+#: ../../Zotlabs/Module/Settings/Channel.php:409
+msgid "Your channel address is"
+msgstr "L'adresse de votre canal est"
-#: ../../Zotlabs/Module/Import.php:100
-#: ../../Zotlabs/Module/Import_items.php:72
-msgid "Imported file is empty."
-msgstr "Le fichier importé est vide."
+#: ../../Zotlabs/Module/Settings/Channel.php:412
+msgid "Your files/photos are accessible via WebDAV at"
+msgstr "Vos fichiers/photos sont accessibles via WebDAV à"
-#: ../../Zotlabs/Module/Import.php:122
-#: ../../Zotlabs/Module/Import_items.php:86
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Attention&nbsp;: les versions de bases de données diffèrent de %1$d mises à jour."
+#: ../../Zotlabs/Module/Settings/Channel.php:474
+msgid "Channel Settings"
+msgstr "Paramètres du canal"
-#: ../../Zotlabs/Module/Import.php:150 ../../include/import.php:86
-msgid "Cloned channel not found. Import failed."
-msgstr "Canal cloné non trouvé. Echec de l'import."
+#: ../../Zotlabs/Module/Settings/Channel.php:481
+msgid "Basic Settings"
+msgstr "Paramètres standard"
-#: ../../Zotlabs/Module/Import.php:160
-msgid "No channel. Import failed."
-msgstr "Pas de canal. Echec de l'import."
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1248
+msgid "Full Name:"
+msgstr "Nom complet&nbsp;:"
-#: ../../Zotlabs/Module/Import.php:510
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "L'import est terminé."
+#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Account.php:119
+msgid "Email Address:"
+msgstr "Adresse de courriel&nbsp;:"
-#: ../../Zotlabs/Module/Import.php:532
-msgid "You must be logged in to use this feature."
-msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité."
+#: ../../Zotlabs/Module/Settings/Channel.php:484
+msgid "Your Timezone:"
+msgstr "Votre fureau horaire&nbsp;:"
-#: ../../Zotlabs/Module/Import.php:537
-msgid "Import Channel"
-msgstr "Importation de canal"
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Default Post Location:"
+msgstr "Emplacement de publication par défaut&nbsp;:"
-#: ../../Zotlabs/Module/Import.php:538
-msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import."
+#: ../../Zotlabs/Module/Settings/Channel.php:485
+msgid "Geographical location to display on your posts"
+msgstr "Emplacement géographique à afficher sur vos publications"
-#: ../../Zotlabs/Module/Import.php:539
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "File to Upload"
-msgstr "Fichier à envoyer"
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+msgid "Use Browser Location:"
+msgstr "Utiliser la géolocalisation du navigateur&nbsp;:"
-#: ../../Zotlabs/Module/Import.php:540
-msgid "Or provide the old server/hub details"
-msgstr "Ou fournissez les détails de l'ancien serveur/hub"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid "Adult Content"
+msgstr "Contenu \"adulte\""
-#: ../../Zotlabs/Module/Import.php:541
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Votre ancienne identité (zyx@exemple.com)"
+#: ../../Zotlabs/Module/Settings/Channel.php:488
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)"
-#: ../../Zotlabs/Module/Import.php:542
-msgid "Your old login email address"
-msgstr "Votre ancienne adresse de courriel"
+#: ../../Zotlabs/Module/Settings/Channel.php:490
+msgid "Security and Privacy Settings"
+msgstr "Paramètres de sécurité et de confidentialité"
-#: ../../Zotlabs/Module/Import.php:543
-msgid "Your old login password"
-msgstr "Votre ancien mot de passe"
+#: ../../Zotlabs/Module/Settings/Channel.php:493
+msgid "Your permissions are already configured. Click to view/adjust"
+msgstr "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster"
-#: ../../Zotlabs/Module/Import.php:544
-msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media."
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Hide my online presence"
+msgstr "Cacher ma présence en ligne"
-#: ../../Zotlabs/Module/Import.php:545
-msgid "Make this hub my primary location"
-msgstr "Faire de ce hub mon emplacement primaire"
+#: ../../Zotlabs/Module/Settings/Channel.php:495
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Cacher votre statut (en ligne/hors ligne) sur votre profil"
-#: ../../Zotlabs/Module/Import.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:497
+msgid "Simple Privacy Settings:"
+msgstr "Paramètres de confidentialité simplifiés&nbsp;:"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importer les publications existantes si possible (expérimental - limité par la mémoire disponible)"
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>"
-#: ../../Zotlabs/Module/Import.php:547
+#: ../../Zotlabs/Module/Settings/Channel.php:499
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin."
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>"
-#: ../../Zotlabs/Module/Item.php:178
-msgid "Unable to locate original post."
-msgstr "Impossible de localiser la publication initiale."
+#: ../../Zotlabs/Module/Settings/Channel.php:500
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privé - <em>privé par défaut, jamais ouvert ni public</em>"
-#: ../../Zotlabs/Module/Item.php:427
-msgid "Empty post discarded."
-msgstr "Publication vide annulée."
+#: ../../Zotlabs/Module/Settings/Channel.php:501
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>"
-#: ../../Zotlabs/Module/Item.php:467
-msgid "Executable content type not permitted to this channel."
-msgstr "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal."
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid "Allow others to tag your posts"
+msgstr "Autoriser les autres à \"étiqueter\" vos publications"
-#: ../../Zotlabs/Module/Item.php:847
-msgid "Duplicate post suppressed."
-msgstr "Publication en doublon supprimée."
+#: ../../Zotlabs/Module/Settings/Channel.php:503
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori "
-#: ../../Zotlabs/Module/Item.php:977
-msgid "System error. Post not saved."
-msgstr "Erreur système. Publication non sauvegardée."
+#: ../../Zotlabs/Module/Settings/Channel.php:505
+msgid "Channel Permission Limits"
+msgstr "Limites des permissions du canal"
-#: ../../Zotlabs/Module/Item.php:1241
-msgid "Unable to obtain post information from database."
-msgstr "Impossible d'obtenir les informations de publication depuis la base de données."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "Expire other channel content after this many days"
+msgstr "Faire expirer le contenu des autres canaux après n jours"
-#: ../../Zotlabs/Module/Item.php:1248
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Vous avez atteint votre limite de %1$.0f contributions \"racines\"."
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "0 or blank to use the website limit."
+msgstr "0 ou vide pour utiliser la limite du site web"
-#: ../../Zotlabs/Module/Item.php:1255
+#: ../../Zotlabs/Module/Settings/Channel.php:507
#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Vous avez atteint votre limite de %1$.0f pages web."
+msgid "This website expires after %d days."
+msgstr "Ce site web expirera après %d jours."
-#: ../../Zotlabs/Module/Layouts.php:181 ../../include/text.php:2267
-msgid "Layouts"
-msgstr "Mises-en-page"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "This website does not expire imported content."
+msgstr "Ce site web ne périme pas le contenu importé."
-#: ../../Zotlabs/Module/Layouts.php:183
-msgid "Comanche page description language help"
-msgstr "Aide sur le langage de description de page Comanche"
+#: ../../Zotlabs/Module/Settings/Channel.php:507
+msgid "The website limit takes precedence if lower than your limit."
+msgstr "La limite du site Web a priorité si elle est inférieure à votre limite."
-#: ../../Zotlabs/Module/Layouts.php:187
-msgid "Layout Description"
-msgstr "Description de la mise en page"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "Maximum Friend Requests/Day:"
+msgstr "Nombre maximum de demandes de contact par jour&nbsp;:"
-#: ../../Zotlabs/Module/Layouts.php:192
-msgid "Download PDL file"
-msgstr "Télécharger le fichier PDL"
+#: ../../Zotlabs/Module/Settings/Channel.php:508
+msgid "May reduce spam activity"
+msgstr "Contribue à réduire l'impact des indésirables"
-#: ../../Zotlabs/Module/Home.php:61 ../../Zotlabs/Module/Home.php:69
-#: ../../Zotlabs/Module/Siteinfo.php:65
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../Zotlabs/Module/Settings/Channel.php:509
+msgid "Default Access Control List (ACL)"
+msgstr "Default Access Control List (ACL)"
-#: ../../Zotlabs/Module/Home.php:79
-#, php-format
-msgid "Welcome to %s"
-msgstr "Bienvenue sur %s"
+#: ../../Zotlabs/Module/Settings/Channel.php:511
+msgid "Use my default audience setting for the type of object published"
+msgstr "Utiliser mon paramètre de publication par défaut pour le type d'objet publié"
-#: ../../Zotlabs/Module/Id.php:13
-msgid "First Name"
-msgstr "Prénom"
+#: ../../Zotlabs/Module/Settings/Channel.php:518
+msgid "Channel permissions category:"
+msgstr "Catégorie de permissions du canal&nbsp;:"
-#: ../../Zotlabs/Module/Id.php:14
-msgid "Last Name"
-msgstr "Nom de famille"
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr ""
-#: ../../Zotlabs/Module/Id.php:15
-msgid "Nickname"
-msgstr "Surnom"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:"
-#: ../../Zotlabs/Module/Id.php:16
-msgid "Full Name"
-msgstr "Nom complet"
+#: ../../Zotlabs/Module/Settings/Channel.php:525
+msgid "Useful to reduce spamming"
+msgstr "Utile pour réduire les indésirables"
-#: ../../Zotlabs/Module/Id.php:17 ../../Zotlabs/Module/Id.php:18
-#: ../../Zotlabs/Module/Admin.php:1035 ../../Zotlabs/Module/Admin.php:1047
-#: ../../include/network.php:2151 ../../boot.php:1705
-msgid "Email"
-msgstr "Courriel"
+#: ../../Zotlabs/Module/Settings/Channel.php:528
+msgid "Notification Settings"
+msgstr "Paramètres de notification"
-#: ../../Zotlabs/Module/Id.php:19 ../../Zotlabs/Module/Id.php:20
-#: ../../Zotlabs/Module/Id.php:21 ../../Zotlabs/Lib/Apps.php:236
-msgid "Profile Photo"
-msgstr "Photo du Profil"
+#: ../../Zotlabs/Module/Settings/Channel.php:529
+msgid "By default post a status message when:"
+msgstr "Par défaut, publier un statut quand&nbsp;:"
-#: ../../Zotlabs/Module/Id.php:22
-msgid "Profile Photo 16px"
-msgstr "Photo de profil 16px"
+#: ../../Zotlabs/Module/Settings/Channel.php:530
+msgid "accepting a friend request"
+msgstr "vous acceptez une demande de contact"
-#: ../../Zotlabs/Module/Id.php:23
-msgid "Profile Photo 32px"
-msgstr "Photo de profil 32px"
+#: ../../Zotlabs/Module/Settings/Channel.php:531
+msgid "joining a forum/community"
+msgstr "vous rejoignez un forum ou une communauté"
-#: ../../Zotlabs/Module/Id.php:24
-msgid "Profile Photo 48px"
-msgstr "Photo de profil 48px"
+#: ../../Zotlabs/Module/Settings/Channel.php:532
+msgid "making an <em>interesting</em> profile change"
+msgstr "vous faîtes une modification <em>intéressante</em> de votre profil"
-#: ../../Zotlabs/Module/Id.php:25
-msgid "Profile Photo 64px"
-msgstr "Photo de profil 64px"
+#: ../../Zotlabs/Module/Settings/Channel.php:533
+msgid "Send a notification email when:"
+msgstr "Envoyer un courriel de notification quand&nbsp;:"
-#: ../../Zotlabs/Module/Id.php:26
-msgid "Profile Photo 80px"
-msgstr "Photo de profil 80px"
+#: ../../Zotlabs/Module/Settings/Channel.php:534
+msgid "You receive a connection request"
+msgstr "Vous recevez une demande de contact"
-#: ../../Zotlabs/Module/Id.php:27
-msgid "Profile Photo 128px"
-msgstr "Photo de profil 128px"
+#: ../../Zotlabs/Module/Settings/Channel.php:535
+msgid "Your connections are confirmed"
+msgstr "Vos contacts sont confirmés"
-#: ../../Zotlabs/Module/Id.php:28
-msgid "Timezone"
-msgstr "Fuseau horaire"
+#: ../../Zotlabs/Module/Settings/Channel.php:536
+msgid "Someone writes on your profile wall"
+msgstr "Quelqu'un a écrit sur votre mur"
-#: ../../Zotlabs/Module/Id.php:29 ../../Zotlabs/Module/Profiles.php:731
-msgid "Homepage URL"
-msgstr "URL de mon site Internet&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Channel.php:537
+msgid "Someone writes a followup comment"
+msgstr "Quelqu'un a commenté vos publications"
-#: ../../Zotlabs/Module/Id.php:30 ../../Zotlabs/Lib/Apps.php:234
-msgid "Language"
-msgstr "Langue"
+#: ../../Zotlabs/Module/Settings/Channel.php:538
+msgid "You receive a private message"
+msgstr "Vous recevez un message privé"
-#: ../../Zotlabs/Module/Id.php:31
-msgid "Birth Year"
-msgstr "Année de naissance"
+#: ../../Zotlabs/Module/Settings/Channel.php:539
+msgid "You receive a friend suggestion"
+msgstr "Vous recevez une suggestion d'amitié/contact"
-#: ../../Zotlabs/Module/Id.php:32
-msgid "Birth Month"
-msgstr "Mois de naissance"
+#: ../../Zotlabs/Module/Settings/Channel.php:540
+msgid "You are tagged in a post"
+msgstr "Vous êtes étiqueté dans une publication"
-#: ../../Zotlabs/Module/Id.php:33
-msgid "Birth Day"
-msgstr "Jour de naissance"
+#: ../../Zotlabs/Module/Settings/Channel.php:541
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Vous êtes tapoté/encouragé/etc. dans une publication"
-#: ../../Zotlabs/Module/Id.php:34
-msgid "Birthdate"
-msgstr "Date de naissance"
+#: ../../Zotlabs/Module/Settings/Channel.php:543
+msgid "Someone likes your post/comment"
+msgstr "Quelqu'un aime votre publication/commentaire"
-#: ../../Zotlabs/Module/Id.php:35 ../../Zotlabs/Module/Profiles.php:454
-msgid "Gender"
-msgstr "Sexe"
+#: ../../Zotlabs/Module/Settings/Channel.php:546
+msgid "Show visual notifications including:"
+msgstr "Afficher des notifications visuelles y compris&nbsp;:"
-#: ../../Zotlabs/Module/Id.php:108 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
-msgid "Male"
-msgstr "Homme"
+#: ../../Zotlabs/Module/Settings/Channel.php:548
+msgid "Unseen grid activity"
+msgstr "Activité du réseau pas encore consultée"
-#: ../../Zotlabs/Module/Id.php:110 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
-msgid "Female"
-msgstr "Femme"
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+msgid "Unseen channel activity"
+msgstr "Activité non vue sur le canal"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:192
-msgid "webpage"
-msgstr "pages web"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+msgid "Unseen private messages"
+msgstr "Messages privés non lus"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:198
-msgid "block"
-msgstr "bloquer"
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Recommended"
+msgstr "Recommandé"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:195
-msgid "layout"
-msgstr "mise en page"
+#: ../../Zotlabs/Module/Settings/Channel.php:551
+msgid "Upcoming events"
+msgstr "Événements à venir"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:201
-msgid "menu"
-msgstr "menu"
+#: ../../Zotlabs/Module/Settings/Channel.php:552
+msgid "Events today"
+msgstr "Événements aujourd'hui"
-#: ../../Zotlabs/Module/Impel.php:196
-#, php-format
-msgid "%s element installed"
-msgstr "Elément %s installé"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Upcoming birthdays"
+msgstr "Anniversaires à venir"
-#: ../../Zotlabs/Module/Impel.php:199
-#, php-format
-msgid "%s element installation failed"
-msgstr "L'installation de l'élément %s a échoué"
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+msgid "Not available in all themes"
+msgstr "Pas disponible dans tous les thèmes"
-#: ../../Zotlabs/Module/Like.php:19
-msgid "Like/Dislike"
-msgstr "Aime/n'aime pas"
+#: ../../Zotlabs/Module/Settings/Channel.php:554
+msgid "System (personal) notifications"
+msgstr "Notifications système (personnelles)"
-#: ../../Zotlabs/Module/Like.php:24
-msgid "This action is restricted to members."
-msgstr "Cette action est réservée aux membres."
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+msgid "System info messages"
+msgstr "Messages d'info système"
-#: ../../Zotlabs/Module/Like.php:25
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+msgid "System critical alerts"
+msgstr "Alertes critiques système"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:557
+msgid "New connections"
+msgstr "Nouveaux contacts"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+msgid "System Registrations"
+msgstr "Inscriptions système"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid ""
-"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
-"href=\"register\">register as a new $Projectname member</a> to continue."
-msgstr "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de $Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de $Projectname </a> pour continuer."
+"Also show new wall posts, private messages and connections under Notices"
+msgstr "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications"
-#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
-#: ../../Zotlabs/Module/Like.php:169
-msgid "Invalid request."
-msgstr "Requête invalide."
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Notify me of events this many days in advance"
+msgstr "Me prévenir d’événements à venir tant de jours en avance"
-#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:126
-msgid "channel"
-msgstr "canal"
+#: ../../Zotlabs/Module/Settings/Channel.php:561
+msgid "Must be greater than 0"
+msgstr "Doit être supérieur à 0"
-#: ../../Zotlabs/Module/Like.php:146
-msgid "thing"
-msgstr "chose"
+#: ../../Zotlabs/Module/Settings/Channel.php:567
+msgid "Advanced Account/Page Type Settings"
+msgstr "Paramètres avancés de compte/type de page"
-#: ../../Zotlabs/Module/Like.php:192
-msgid "Channel unavailable."
-msgstr "Canal indisponible."
+#: ../../Zotlabs/Module/Settings/Channel.php:568
+msgid "Change the behaviour of this account for special situations"
+msgstr "Modifie le comportement de ce compte pour des situations particulières"
-#: ../../Zotlabs/Module/Like.php:240
-msgid "Previous action reversed."
-msgstr "Action précédente annulée."
+#: ../../Zotlabs/Module/Settings/Channel.php:570
+msgid "Miscellaneous Settings"
+msgstr "Paramètres divers"
-#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
-#: ../../Zotlabs/Module/Tagger.php:47 ../../include/text.php:1940
-#: ../../include/conversation.php:120
-msgid "photo"
-msgstr "photo"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+msgid "Default photo upload folder"
+msgstr "Répertoire par défaut pour les photos téléversées"
-#: ../../Zotlabs/Module/Like.php:371 ../../Zotlabs/Module/Subthread.php:87
-#: ../../include/text.php:1946 ../../include/conversation.php:148
-msgid "status"
-msgstr "état"
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "%Y - current year, %m - current month"
+msgstr "%Y - année en cours, %m - mois en cours"
-#: ../../Zotlabs/Module/Like.php:420 ../../include/conversation.php:164
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s aime %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Channel.php:572
+msgid "Default file upload folder"
+msgstr "Répertoire par défaut pour les fichiers téléversés"
-#: ../../Zotlabs/Module/Like.php:422 ../../include/conversation.php:167
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s n'aime pas %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Channel.php:574
+msgid "Personal menu to display in your channel pages"
+msgstr "Menu personnel à afficher sur les pages de votre canal"
-#: ../../Zotlabs/Module/Like.php:424
-#, php-format
-msgid "%1$s agrees with %2$s's %3$s"
-msgstr "%1$s approuve %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+msgid "Remove this channel."
+msgstr "Supprimer ce canal"
-#: ../../Zotlabs/Module/Like.php:426
-#, php-format
-msgid "%1$s doesn't agree with %2$s's %3$s"
-msgstr "%1$s n'est pas d'accord avec %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Channel.php:577
+msgid "Firefox Share $Projectname provider"
+msgstr "Connecteur $Projectname pour Firefox Share"
-#: ../../Zotlabs/Module/Like.php:428
-#, php-format
-msgid "%1$s abstains from a decision on %2$s's %3$s"
-msgstr "%1$s s'abstient de toute décision sur le %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Channel.php:578
+msgid "Start calendar week on Monday"
+msgstr ""
-#: ../../Zotlabs/Module/Like.php:430
-#, php-format
-msgid "%1$s is attending %2$s's %3$s"
-msgstr "%1$s participe à %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Features.php:45
+msgid "Additional Features"
+msgstr "Fonctionnalités additionnelles"
-#: ../../Zotlabs/Module/Like.php:432
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
#, php-format
-msgid "%1$s is not attending %2$s's %3$s"
-msgstr "%1$s ne participe pas à %3$s de %2$s"
+msgid "This channel is limited to %d tokens"
+msgstr "Ce canal est limité à %d jetons"
-#: ../../Zotlabs/Module/Like.php:434
-#, php-format
-msgid "%1$s may attend %2$s's %3$s"
-msgstr "%1$s participe peut-être à %3$s de %2$s"
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Le nom et le mot de passe sont requis"
-#: ../../Zotlabs/Module/Like.php:537
-msgid "Action completed."
-msgstr "Action terminée."
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Jeton sauvegardé"
-#: ../../Zotlabs/Module/Like.php:538
-msgid "Thank you."
-msgstr "Merci."
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé."
-#: ../../Zotlabs/Module/Import_items.php:102
-msgid "Import completed"
-msgstr "L'import est terminé."
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:"
-#: ../../Zotlabs/Module/Import_items.php:117
-msgid "Import Items"
-msgstr "Importer"
+#: ../../Zotlabs/Module/Settings/Tokens.php:150
+#: ../../Zotlabs/Widget/Settings_menu.php:90
+msgid "Guest Access Tokens"
+msgstr "Jeton d'accès pour un invité"
-#: ../../Zotlabs/Module/Import_items.php:118
-msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export."
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Nom d'utilisateur"
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Limite du nombre total d'invitation dépassée."
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Mot de passe"
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s&nbsp;: adresse courriel invalide."
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)"
-#: ../../Zotlabs/Module/Invite.php:63
-msgid "Please join us on $Projectname"
-msgstr "Rejoignez-nous sur $Projectname"
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+#: ../../Zotlabs/Module/Connedit.php:893
+msgid "Their Settings"
+msgstr "Leurs paramètres"
-#: ../../Zotlabs/Module/Invite.php:74
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Limite d'invitations dépassée. Merci de contacter l'administration de votre site."
+#: ../../Zotlabs/Module/Settings/Account.php:20
+msgid "Not valid email."
+msgstr "Adresse de courriel non valide."
-#: ../../Zotlabs/Module/Invite.php:79
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s&nbsp;: Échec de distribution du message."
+#: ../../Zotlabs/Module/Settings/Account.php:23
+msgid "Protected email address. Cannot change to that email."
+msgstr "Adresse de courriel protégée. Impossible de l'utiliser."
-#: ../../Zotlabs/Module/Invite.php:83
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d message envoyé."
-msgstr[1] "%d messages envoyés."
+#: ../../Zotlabs/Module/Settings/Account.php:32
+msgid "System failure storing new email. Please try again."
+msgstr "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau."
-#: ../../Zotlabs/Module/Invite.php:102
-msgid "You have no more invitations available"
-msgstr "Vous ne disposez plus d'aucune invitation"
+#: ../../Zotlabs/Module/Settings/Account.php:40
+msgid "Technical skill level updated"
+msgstr "Niveau technique mis à jour"
-#: ../../Zotlabs/Module/Invite.php:133
-msgid "Send invitations"
-msgstr "Envoyer des invitations"
+#: ../../Zotlabs/Module/Settings/Account.php:56
+msgid "Password verification failed."
+msgstr "La vérification du mot de passe a échoué."
-#: ../../Zotlabs/Module/Invite.php:134
-msgid "Enter email addresses, one per line:"
-msgstr "Entrez les adresses de courriel, une par ligne&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Account.php:63
+msgid "Passwords do not match. Password unchanged."
+msgstr "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé."
-#: ../../Zotlabs/Module/Invite.php:135 ../../Zotlabs/Module/Mail.php:249
-msgid "Your message:"
-msgstr "Votre message&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Account.php:67
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé."
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Please join my community on $Projectname."
-msgstr "Rejoignez ma communauté sur $Projectname."
+#: ../../Zotlabs/Module/Settings/Account.php:81
+msgid "Password changed."
+msgstr "Le mot de passe a été changé."
-#: ../../Zotlabs/Module/Invite.php:138
-msgid "You will need to supply this invitation code:"
-msgstr "Vous devrez fournir le code suivant&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Account.php:83
+msgid "Password update failed. Please try again."
+msgstr "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau."
-#: ../../Zotlabs/Module/Invite.php:139
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Enregistrez-vous sur n'importe quel serveur $Projectname (ils sont tous inter-connectés)"
+#: ../../Zotlabs/Module/Settings/Account.php:112
+msgid "Account Settings"
+msgstr "Paramètres du compte"
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Saisissez l'adresse de mon canal $Projectname dans la barre de recherche du site."
+#: ../../Zotlabs/Module/Settings/Account.php:113
+msgid "Current Password"
+msgstr "Mot de passe actuel"
-#: ../../Zotlabs/Module/Invite.php:142
-msgid "or visit"
-msgstr "ou rendez-vous sur"
+#: ../../Zotlabs/Module/Settings/Account.php:114
+msgid "Enter New Password"
+msgstr "Entrez votre nouveau mot de passe"
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "3. Click [Connect]"
-msgstr "3. Cliquez sur [Ajouter]"
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Confirm New Password"
+msgstr "Confirmez le nouveau mot de passe"
-#: ../../Zotlabs/Module/Lockview.php:61
-msgid "Remote privacy information not available."
-msgstr "Les informations distantes de confidentialité ne sont pas disponibles."
+#: ../../Zotlabs/Module/Settings/Account.php:115
+msgid "Leave password fields blank unless changing"
+msgstr "Laissez les mots de passe vides si vous ne voulez pas les modifier"
-#: ../../Zotlabs/Module/Lockview.php:82
-msgid "Visible to:"
-msgstr "Visible par&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Your technical skill level"
+msgstr "Votre niveau technique"
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Emplacement introuvable."
+#: ../../Zotlabs/Module/Settings/Account.php:116
+msgid "Used to provide a member experience matched to your comfort level"
+msgstr "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort"
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Echec de la recherche de l'emplacement."
+#: ../../Zotlabs/Module/Settings/Account.php:120
+#: ../../Zotlabs/Module/Removeaccount.php:61
+msgid "Remove Account"
+msgstr "Supprimer le compte"
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel."
+#: ../../Zotlabs/Module/Settings/Account.php:121
+msgid "Remove this account including all its channels"
+msgstr "Supprimer ce compte et tous ses canaux"
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Synchronisation des emplacements"
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Paramètres de la réglette d'affinité mis à jour."
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Emplacement(s) introuvable."
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "Aucun paramètre de fonctionnalité configuré"
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Gérer les emplacements des canaux"
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Niveau d'affinité maximum par défaut"
-#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Profiles.php:470
-#: ../../Zotlabs/Module/Admin.php:1224
-msgid "Address"
-msgstr "Adresse"
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Niveau d'affinité minimum par défaut"
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr ""
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Paramètres de la réglette d'affinité"
-#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
-msgid "Drop"
-msgstr "Supprimer"
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Paramètres des extensions/greffons"
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr ""
+#: ../../Zotlabs/Module/Settings/Display.php:145
+msgid "No special theme for mobile devices"
+msgstr "Pas de thème spécifique aux mobiles"
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Merci d'attendre plusieurs minutes entre opérations successives."
+#: ../../Zotlabs/Module/Settings/Display.php:148
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (Expérimental)"
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal."
+#: ../../Zotlabs/Module/Settings/Display.php:198
+msgid "Display Settings"
+msgstr "Afficher les paramètres"
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif."
+#: ../../Zotlabs/Module/Settings/Display.php:199
+msgid "Theme Settings"
+msgstr "Paramètres du thème"
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Hub introuvable."
+#: ../../Zotlabs/Module/Settings/Display.php:200
+msgid "Custom Theme Settings"
+msgstr "Paramètres personnels du thème"
-#: ../../Zotlabs/Module/Mail.php:38
-msgid "Unable to lookup recipient."
-msgstr "Impossible de localiser le destinataire."
+#: ../../Zotlabs/Module/Settings/Display.php:201
+msgid "Content Settings"
+msgstr "Paramètres liés au contenu"
-#: ../../Zotlabs/Module/Mail.php:45
-msgid "Unable to communicate with requested channel."
-msgstr "Impossible de communiquer avec le canal demandé."
+#: ../../Zotlabs/Module/Settings/Display.php:207
+msgid "Display Theme:"
+msgstr "Afficher le thème&nbsp;:"
-#: ../../Zotlabs/Module/Mail.php:52
-msgid "Cannot verify requested channel."
-msgstr "Impossible de vérifier le canal demandé."
+#: ../../Zotlabs/Module/Settings/Display.php:208
+msgid "Select scheme"
+msgstr "Définir la palette de couleurs"
-#: ../../Zotlabs/Module/Mail.php:78
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué."
+#: ../../Zotlabs/Module/Settings/Display.php:210
+msgid "Mobile Theme:"
+msgstr "Thème mobile&nbsp;:"
-#: ../../Zotlabs/Module/Mail.php:143
-msgid "Messages"
-msgstr "Messages"
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid "Preload images before rendering the page"
+msgstr "Pré-charger les images avant d'afficher la page"
-#: ../../Zotlabs/Module/Mail.php:178
-msgid "Message recalled."
-msgstr "Message rappelé."
+#: ../../Zotlabs/Module/Settings/Display.php:211
+msgid ""
+"The subjective page load time will be longer but the page will be ready when"
+" displayed"
+msgstr "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera"
-#: ../../Zotlabs/Module/Mail.php:191
-msgid "Conversation removed."
-msgstr "Conversation supprimée."
+#: ../../Zotlabs/Module/Settings/Display.php:212
+msgid "Enable user zoom on mobile devices"
+msgstr "Permettre à l'utilisateur d'un mobile d'agrandir le contenu"
-#: ../../Zotlabs/Module/Mail.php:206 ../../Zotlabs/Module/Mail.php:315
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Expire le YYYY-MM-DD à HH:MM"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Update browser every xx seconds"
+msgstr "Mettre à jour le navigateur toutes les xx secondes"
-#: ../../Zotlabs/Module/Mail.php:234
-msgid "Requested channel is not in this network"
-msgstr "Le canal demandé n'est pas sur ce réseau"
+#: ../../Zotlabs/Module/Settings/Display.php:213
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 secondes, pas de maximum"
-#: ../../Zotlabs/Module/Mail.php:242
-msgid "Send Private Message"
-msgstr "Envoyer un message privé"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:"
-#: ../../Zotlabs/Module/Mail.php:243 ../../Zotlabs/Module/Mail.php:368
-msgid "To:"
-msgstr "À&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Display.php:214
+msgid "Maximum of 100 items"
+msgstr "100 éléments au maximum"
-#: ../../Zotlabs/Module/Mail.php:246 ../../Zotlabs/Module/Mail.php:370
-msgid "Subject:"
-msgstr "Objet&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Display.php:215
+msgid "Show emoticons (smilies) as images"
+msgstr "Remplacer les émoticônes (smileys) par des images"
-#: ../../Zotlabs/Module/Mail.php:251 ../../Zotlabs/Module/Mail.php:376
-#: ../../include/conversation.php:1220
-msgid "Attach file"
-msgstr "Joindre un fichier"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Manual conversation updates"
+msgstr "Manuel de mises à jour des conversations"
-#: ../../Zotlabs/Module/Mail.php:253
-msgid "Send"
-msgstr "Envoyer"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "Activé par défaut, le désactiver peut accroître les sauts d'écran"
-#: ../../Zotlabs/Module/Mail.php:256 ../../Zotlabs/Module/Mail.php:381
-#: ../../include/conversation.php:1251
-msgid "Set expiration date"
-msgstr "Définir la date d'expiration"
+#: ../../Zotlabs/Module/Settings/Display.php:217
+msgid "Link post titles to source"
+msgstr "Lier les titres des publications à leur source"
-#: ../../Zotlabs/Module/Mail.php:340
-msgid "Delete message"
-msgstr "Supprimer le message"
+#: ../../Zotlabs/Module/Settings/Display.php:218
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Editeur de mise en page des pages systèmes - (avancé)"
-#: ../../Zotlabs/Module/Mail.php:341
-msgid "Delivery report"
-msgstr "Rapport de distribution"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+msgid "Use blog/list mode on channel page"
+msgstr "Utiliser le mode blog/liste sur la page du canal"
-#: ../../Zotlabs/Module/Mail.php:342
-msgid "Recall message"
-msgstr "Rappeler le message"
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "(comments displayed separately)"
+msgstr "(commentaires affichés séparément)"
-#: ../../Zotlabs/Module/Mail.php:344
-msgid "Message has been recalled."
-msgstr "Le message a été rappelé."
+#: ../../Zotlabs/Module/Settings/Display.php:222
+msgid "Use blog/list mode on grid page"
+msgstr "Utiliser le mode blog/liste sur la page du réseau"
-#: ../../Zotlabs/Module/Mail.php:361
-msgid "Delete Conversation"
-msgstr "Supprimer la conversation"
+#: ../../Zotlabs/Module/Settings/Display.php:223
+msgid "Channel page max height of content (in pixels)"
+msgstr "Hauteur maximale du contenu pour la page du canal (en pixels)"
-#: ../../Zotlabs/Module/Mail.php:363
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur."
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "click to expand content exceeding this height"
+msgstr "cliquer pour dérouler le contenu dépassant cette limite"
-#: ../../Zotlabs/Module/Mail.php:367
-msgid "Send Reply"
-msgstr "Envoyer la réponse"
+#: ../../Zotlabs/Module/Settings/Display.php:224
+msgid "Grid page max height of content (in pixels)"
+msgstr "Hauteur maximale du contenu sur la page du réseau (en pixels)"
-#: ../../Zotlabs/Module/Mail.php:372
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Votre message pour %s (%s)&nbsp;:"
+#: ../../Zotlabs/Module/Settings/Oauth.php:34
+msgid "Name is required"
+msgstr "Le nom est requis"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Vous avez créé %1$.0f des %2$.0f canaux autorisés."
+#: ../../Zotlabs/Module/Settings/Oauth.php:38
+msgid "Key and Secret are required"
+msgstr "Clef et secret sont requis"
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Créer un nouveau canal"
+#: ../../Zotlabs/Module/Settings/Oauth.php:86
+#: ../../Zotlabs/Module/Settings/Oauth.php:112
+#: ../../Zotlabs/Module/Settings/Oauth.php:148
+msgid "Add application"
+msgstr "Ajouter une application"
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:213
-#: ../../include/nav.php:206
-msgid "Channel Manager"
-msgstr "Gérer les canaux"
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+msgid "Name of application"
+msgstr "Nom de l'application"
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Canal actif"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:116
+#: ../../addon/statusnet/statusnet.php:893 ../../addon/twitter/twitter.php:775
+msgid "Consumer Key"
+msgstr "Clef client"
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Pour changer de canal, sélectionnez-en un"
+#: ../../Zotlabs/Module/Settings/Oauth.php:90
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Canal par défaut"
+#: ../../Zotlabs/Module/Settings/Oauth.php:91
+#: ../../Zotlabs/Module/Settings/Oauth.php:117
+#: ../../addon/statusnet/statusnet.php:892 ../../addon/twitter/twitter.php:776
+msgid "Consumer Secret"
+msgstr "Secret client"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Définir comme défaut"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+#: ../../Zotlabs/Module/Settings/Oauth.php:118
+msgid "Redirect"
+msgstr "Redirection"
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d nouveaux messages"
+#: ../../Zotlabs/Module/Settings/Oauth.php:92
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nouvelles présentations"
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Settings/Oauth.php:119
+msgid "Icon url"
+msgstr "URL de l'icône"
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr ""
+#: ../../Zotlabs/Module/Settings/Oauth.php:93
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
+msgid "Optional"
+msgstr "Facultatif"
-#: ../../Zotlabs/Module/Lostpass.php:19
-msgid "No valid account found."
-msgstr "Aucun compte valide trouvé."
+#: ../../Zotlabs/Module/Settings/Oauth.php:104
+msgid "Application not found."
+msgstr "Application introuvable."
-#: ../../Zotlabs/Module/Lostpass.php:33
-msgid "Password reset request issued. Check your email."
-msgstr "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels."
+#: ../../Zotlabs/Module/Settings/Oauth.php:147
+msgid "Connected Apps"
+msgstr "Applications connectées"
-#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:107
-#, php-format
-msgid "Site Member (%s)"
-msgstr "Membre du site (%s)"
+#: ../../Zotlabs/Module/Settings/Oauth.php:151
+msgid "Client key starts with"
+msgstr "La clef partagée commence par"
-#: ../../Zotlabs/Module/Lostpass.php:44
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Demande de réinitialisation du mot de passe sur %s"
+#: ../../Zotlabs/Module/Settings/Oauth.php:152
+msgid "No name"
+msgstr "Sans nom"
-#: ../../Zotlabs/Module/Lostpass.php:67
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué."
+#: ../../Zotlabs/Module/Settings/Oauth.php:153
+msgid "Remove authorization"
+msgstr "Révoquer l'autorisation"
-#: ../../Zotlabs/Module/Lostpass.php:90 ../../boot.php:1711
-msgid "Password Reset"
-msgstr "Réinitialiser le mot de passe"
+#: ../../Zotlabs/Module/Embedphotos.php:139
+#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
+#: ../../Zotlabs/Widget/Album.php:78
+msgid "View Photo"
+msgstr "Voir la photo"
-#: ../../Zotlabs/Module/Lostpass.php:91
-msgid "Your password has been reset as requested."
-msgstr "Votre mot de passe a bien été réinitialisé."
+#: ../../Zotlabs/Module/Embedphotos.php:145
+#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
+#: ../../Zotlabs/Lib/Apps.php:561 ../../Zotlabs/Lib/Apps.php:639
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
+#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
+#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
+msgid "Unknown"
+msgstr "Inconnu"
-#: ../../Zotlabs/Module/Lostpass.php:92
-msgid "Your new password is"
-msgstr "Votre nouveau mot de passe est"
+#: ../../Zotlabs/Module/Embedphotos.php:155
+#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+msgid "Edit Album"
+msgstr "Modifier l'album"
-#: ../../Zotlabs/Module/Lostpass.php:93
-msgid "Save or copy your new password - and then"
-msgstr "Enregistrez ou copiez votre nouveau mot de passe, puis"
+#: ../../Zotlabs/Module/Embedphotos.php:157
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../Zotlabs/Module/Cover_photo.php:361
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
+#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
+#: ../../addon/cdav/include/widgets.php:168
+msgid "Upload"
+msgstr "Envoyer"
-#: ../../Zotlabs/Module/Lostpass.php:94
-msgid "click here to login"
-msgstr "cliquez ici pour vous connecter"
+#: ../../Zotlabs/Module/Achievements.php:38
+msgid "Some blurb about what to do when you're new here"
+msgstr "Quelques mots sur quoi faire quand on est nouveau ici"
-#: ../../Zotlabs/Module/Lostpass.php:95
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté."
+#: ../../Zotlabs/Module/Thing.php:114
+msgid "Thing updated"
+msgstr "Elément mis à jour"
-#: ../../Zotlabs/Module/Lostpass.php:112
+#: ../../Zotlabs/Module/Thing.php:166
+msgid "Object store: failed"
+msgstr "Stockage de l'objet&nbsp;: échec"
+
+#: ../../Zotlabs/Module/Thing.php:170
+msgid "Thing added"
+msgstr "Elément ajouté"
+
+#: ../../Zotlabs/Module/Thing.php:196
#, php-format
-msgid "Your password has changed at %s"
-msgstr "Votre mot de passe de %s a été changé"
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../Zotlabs/Module/Lostpass.php:127
-msgid "Forgot your Password?"
-msgstr "Mot de passe oublié&nbsp;?"
+#: ../../Zotlabs/Module/Thing.php:259
+msgid "Show Thing"
+msgstr "Montrer élément"
-#: ../../Zotlabs/Module/Lostpass.php:128
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions."
+#: ../../Zotlabs/Module/Thing.php:266
+msgid "item not found."
+msgstr "élément introuvable."
-#: ../../Zotlabs/Module/Lostpass.php:129
-msgid "Email Address"
-msgstr "Adresse de courriel"
+#: ../../Zotlabs/Module/Thing.php:299
+msgid "Edit Thing"
+msgstr "Modifier élément"
-#: ../../Zotlabs/Module/Lostpass.php:130
-msgid "Reset"
-msgstr "Réinitialiser"
+#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:355
+msgid "Select a profile"
+msgstr "Choisissez un profil"
-#: ../../Zotlabs/Module/Menu.php:49
-msgid "Unable to update menu."
-msgstr "Impossible de mettre le menu à jour."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Post an activity"
+msgstr "Publier une activité"
-#: ../../Zotlabs/Module/Menu.php:60
-msgid "Unable to create menu."
-msgstr "Impossible de créer le menu."
+#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:358
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Envoie exclusivement aux visiteurs du profil concerné"
-#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
-msgid "Menu Name"
-msgstr "Nom du menu"
+#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:360
+msgid "Name of thing e.g. something"
+msgstr "Nom de l'élément, p.ex. quelque-chose"
-#: ../../Zotlabs/Module/Menu.php:98
-msgid "Unique name (not visible on webpage) - required"
-msgstr "Nom unique (non visible sur la page web) - requis"
+#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
+msgid "URL of thing (optional)"
+msgstr "URL de l'élément (facultatif)"
-#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
-msgid "Menu Title"
-msgstr "Titre du menu"
+#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
+msgid "URL for photo of thing (optional)"
+msgstr "URL d'une photo de l'élément (facultatif)"
-#: ../../Zotlabs/Module/Menu.php:99
-msgid "Visible on webpage - leave empty for no title"
-msgstr "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre"
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
+#: ../../Zotlabs/Module/Connedit.php:680 ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Autorisations"
-#: ../../Zotlabs/Module/Menu.php:100
-msgid "Allow Bookmarks"
-msgstr "Autoriser l'usage de favoris"
+#: ../../Zotlabs/Module/Thing.php:353
+msgid "Add Thing to your Profile"
+msgstr "Ajouter l'élément à votre profil"
-#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
-msgid "Menu may be used to store saved bookmarks"
-msgstr "Le menu pourra être utilisé pour stocker des favoris"
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
+msgstr "Pas d'autre notification du système."
-#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
-msgid "Submit and proceed"
-msgstr "Valider et continuer"
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "Notifications du système"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2266
-msgid "Menus"
-msgstr "Menus"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Canal ajouté."
-#: ../../Zotlabs/Module/Menu.php:117
-msgid "Bookmarks allowed"
-msgstr "Favoris autorisés"
+#: ../../Zotlabs/Module/Import.php:144
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Votre forfait n'autorise que %d canaux."
-#: ../../Zotlabs/Module/Menu.php:119
-msgid "Delete this menu"
-msgstr "Supprimer ce menu"
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
+msgstr "Pas de canal. Echec de l'import."
-#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
-msgid "Edit menu contents"
-msgstr "Modifier le contenu du menu"
+#: ../../Zotlabs/Module/Import.php:466
+#: ../../addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "L'import est terminé."
-#: ../../Zotlabs/Module/Menu.php:121
-msgid "Edit this menu"
-msgstr "Modifier ce menu"
+#: ../../Zotlabs/Module/Import.php:492
+msgid "You must be logged in to use this feature."
+msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité."
-#: ../../Zotlabs/Module/Menu.php:136
-msgid "Menu could not be deleted."
-msgstr "Impossible de supprimer le menu."
+#: ../../Zotlabs/Module/Import.php:497
+msgid "Import Channel"
+msgstr "Importation de canal"
-#: ../../Zotlabs/Module/Menu.php:144 ../../Zotlabs/Module/Mitem.php:28
-msgid "Menu not found."
-msgstr "Menu introuvable."
+#: ../../Zotlabs/Module/Import.php:498
+msgid ""
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import."
-#: ../../Zotlabs/Module/Menu.php:149
-msgid "Edit Menu"
-msgstr "Modifier le menu"
+#: ../../Zotlabs/Module/Import.php:500
+msgid "Or provide the old server/hub details"
+msgstr "Ou fournissez les détails de l'ancien serveur/hub"
-#: ../../Zotlabs/Module/Menu.php:153
-msgid "Add or remove entries to this menu"
-msgstr "Ajouter/supprimer des entrées à ce menu"
+#: ../../Zotlabs/Module/Import.php:501
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Votre ancienne identité (zyx@exemple.com)"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Menu name"
-msgstr "Nom du menu"
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Your old login email address"
+msgstr "Votre ancienne adresse de courriel"
-#: ../../Zotlabs/Module/Menu.php:155
-msgid "Must be unique, only seen by you"
-msgstr "Doit être unique, ne sera vu que par vous"
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Your old login password"
+msgstr "Votre ancien mot de passe"
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title"
-msgstr "Titre du menu"
+#: ../../Zotlabs/Module/Import.php:504
+msgid ""
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media."
-#: ../../Zotlabs/Module/Menu.php:156
-msgid "Menu title as seen by others"
-msgstr "Titre du menu tel que vu par les visiteurs"
+#: ../../Zotlabs/Module/Import.php:505
+msgid "Make this hub my primary location"
+msgstr "Faire de ce hub mon emplacement primaire"
-#: ../../Zotlabs/Module/Menu.php:157
-msgid "Allow bookmarks"
-msgstr "Autoriser l'usage de favoris"
+#: ../../Zotlabs/Module/Import.php:506
+msgid "Move this channel (disable all previous locations)"
+msgstr "Déplacer ce canal (désactiver tous les emplacements précédents)"
-#: ../../Zotlabs/Module/Menu.php:166 ../../Zotlabs/Module/Mitem.php:120
-#: ../../Zotlabs/Module/Xchan.php:41
-msgid "Not found."
-msgstr "Introuvable."
+#: ../../Zotlabs/Module/Import.php:507
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)"
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s est %2$s"
+#: ../../Zotlabs/Module/Import.php:508
+msgid ""
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin."
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:225
-msgid "Mood"
-msgstr "Humeur"
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
+msgstr "Échec de l'authentification."
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Indiquez votre humeur du moment à vos amis"
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1982
+msgid "Remote Authentication"
+msgstr "Authentification distante"
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profils similaires"
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1983
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)"
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Aucun mot-clef à comparer. Merci d'ajouter des mots-clefs à votre profil par défaut."
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1984
+msgid "Authenticate"
+msgstr "Authentifier"
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "s'intéresse à&nbsp;:"
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:43
+msgid "Channel not found."
+msgstr "Canal introuvable."
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Pas de correspondance"
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permissions refusées."
-#: ../../Zotlabs/Module/Network.php:96
-msgid "No such group"
-msgstr "Groupe introuvable"
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2299
+msgid "Import"
+msgstr "Import"
-#: ../../Zotlabs/Module/Network.php:136
-msgid "No such channel"
-msgstr "Canal introuvable"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Autoriser l'application à se connecter"
-#: ../../Zotlabs/Module/Network.php:141
-msgid "forum"
-msgstr "forum"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Revenez dans votre application et mettez le code de sécurité"
-#: ../../Zotlabs/Module/Network.php:153
-msgid "Search Results For:"
-msgstr "Résultats de recherche pour&nbsp;:"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Merci de vous identifier pour continuer."
-#: ../../Zotlabs/Module/Network.php:217
-msgid "Privacy group is empty"
-msgstr "Groupe d'accès vide"
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?"
-#: ../../Zotlabs/Module/Network.php:226
-msgid "Privacy group: "
-msgstr "Groupe d'accès&nbsp;:"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Élément indisponible."
-#: ../../Zotlabs/Module/Network.php:252
-msgid "Invalid connection."
-msgstr "Contact non valide."
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
+#: ../../Zotlabs/Module/Editwebpage.php:148 ../../Zotlabs/Module/Mail.php:287
+#: ../../Zotlabs/Module/Mail.php:424 ../../include/conversation.php:1228
+msgid "Insert web link"
+msgstr "Insérer lien web"
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:98
-msgid "No more system notifications."
-msgstr "Pas d'autre notification du système."
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+msgid "Title (optional)"
+msgstr "Titre (facultatif)"
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:102
-msgid "System Notifications"
-msgstr "Notifications du système"
+#: ../../Zotlabs/Module/Editblock.php:138
+msgid "Edit Block"
+msgstr "Modifier le bloc"
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
-msgstr "Impossible de créer l'entrée."
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "vcard"
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
-msgstr "Impossible de mettre à jour l'entrée de menu."
+#: ../../Zotlabs/Module/Apps.php:45
+msgid "Apps"
+msgstr "Applications"
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
-msgstr "Impossible d'ajouter l'entrée de menu."
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
+msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:226
-msgid "Menu Item Permissions"
-msgstr "Permissions de l'entrée de menu"
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
+msgstr ""
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:227
-#: ../../Zotlabs/Module/Settings.php:1068
-msgid "(click to open/close)"
-msgstr "(cliquer pour ouvrir/fermer)"
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:256
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s est %2$s"
-#: ../../Zotlabs/Module/Mitem.php:156 ../../Zotlabs/Module/Mitem.php:172
-msgid "Link Name"
-msgstr "Nom du lien"
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
+msgstr "Humeur"
-#: ../../Zotlabs/Module/Mitem.php:157 ../../Zotlabs/Module/Mitem.php:231
-msgid "Link or Submenu Target"
-msgstr "Lien ou sous-menu cible"
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Indiquez votre humeur du moment à vos amis"
-#: ../../Zotlabs/Module/Mitem.php:157
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu"
+#: ../../Zotlabs/Module/Connections.php:52
+#: ../../Zotlabs/Module/Connections.php:157
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Blocked"
+msgstr "Bloqué(e)"
-#: ../../Zotlabs/Module/Mitem.php:158 ../../Zotlabs/Module/Mitem.php:232
-msgid "Use magic-auth if available"
-msgstr "Utiliser l'authentification distante, quand disponible"
+#: ../../Zotlabs/Module/Connections.php:57
+#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:245
+msgid "Ignored"
+msgstr "Ignoré(e)"
-#: ../../Zotlabs/Module/Mitem.php:159 ../../Zotlabs/Module/Mitem.php:233
-msgid "Open link in new window"
-msgstr "Ouvrir le lien dans une nouvelle fenêtre"
+#: ../../Zotlabs/Module/Connections.php:62
+#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:244
+msgid "Hidden"
+msgstr "Caché"
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
-msgid "Order in list"
-msgstr "Ordre dans la liste"
+#: ../../Zotlabs/Module/Connections.php:67
+#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:243
+msgid "Archived"
+msgstr "Archivé"
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:234
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Les nombres les plus élevés seront au bas de la liste"
+#: ../../Zotlabs/Module/Connections.php:72
+#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1657
+msgid "New"
+msgstr "Nouveautés"
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Submit and finish"
-msgstr "Vadiler et terminer"
+#: ../../Zotlabs/Module/Connections.php:88
+#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connedit.php:717 ../../Zotlabs/Widget/Affinity.php:30
+msgid "All"
+msgstr "Tous"
-#: ../../Zotlabs/Module/Mitem.php:162
-msgid "Submit and continue"
-msgstr "Valider et continuer"
+#: ../../Zotlabs/Module/Connections.php:134
+msgid "New Connections"
+msgstr "Nouveaux contacts"
-#: ../../Zotlabs/Module/Mitem.php:170
-msgid "Menu:"
-msgstr "Menu&nbsp;:"
+#: ../../Zotlabs/Module/Connections.php:137
+msgid "Show pending (new) connections"
+msgstr "Voir les (nouveaux) contacts en attente"
-#: ../../Zotlabs/Module/Mitem.php:173
-msgid "Link Target"
-msgstr "Cible du lien"
+#: ../../Zotlabs/Module/Connections.php:144
+msgid "Show all connections"
+msgstr "Voir tous les contacts"
-#: ../../Zotlabs/Module/Mitem.php:176
-msgid "Edit menu"
-msgstr "Modifier le menu"
+#: ../../Zotlabs/Module/Connections.php:160
+msgid "Only show blocked connections"
+msgstr "Ne montrer que les contacts bloqués"
-#: ../../Zotlabs/Module/Mitem.php:179
-msgid "Edit element"
-msgstr "Modifier l'entrée"
+#: ../../Zotlabs/Module/Connections.php:167
+msgid "Only show ignored connections"
+msgstr "Ne montrer que les contacts ignorés"
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Drop element"
-msgstr "Supprimer l'entrée"
+#: ../../Zotlabs/Module/Connections.php:174
+msgid "Only show archived connections"
+msgstr "Ne montrer que les contacts archivés"
-#: ../../Zotlabs/Module/Mitem.php:181
-msgid "New element"
-msgstr "Nouvelle entrée"
+#: ../../Zotlabs/Module/Connections.php:181
+msgid "Only show hidden connections"
+msgstr "Ne montrer que les contacts cachés"
-#: ../../Zotlabs/Module/Mitem.php:182
-msgid "Edit this menu container"
-msgstr "Éditer ce bloc de menu"
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Pending approval"
+msgstr "En attente de validation"
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Add menu element"
-msgstr "Ajouter une entrée au menu"
+#: ../../Zotlabs/Module/Connections.php:258
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Delete this menu item"
-msgstr "Supprimer cette entrée du menu"
+#: ../../Zotlabs/Module/Connections.php:259
+msgid "Edit connection"
+msgstr "Modifier le contact"
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "Edit this menu item"
-msgstr "Modifier cette entrée du menu"
+#: ../../Zotlabs/Module/Connections.php:260
+msgid "Delete connection"
+msgstr "Supprimer le contact"
-#: ../../Zotlabs/Module/Mitem.php:202
-msgid "Menu item not found."
-msgstr "Entrée de menu introuvable."
+#: ../../Zotlabs/Module/Connections.php:269
+msgid "Channel address"
+msgstr "Adresse du canal"
-#: ../../Zotlabs/Module/Mitem.php:215
-msgid "Menu item deleted."
-msgstr "Entrée de menu supprimée."
+#: ../../Zotlabs/Module/Connections.php:271
+msgid "Network"
+msgstr "Réseau"
-#: ../../Zotlabs/Module/Mitem.php:217
-msgid "Menu item could not be deleted."
-msgstr "Impossible de supprimer l'entrée de menu."
+#: ../../Zotlabs/Module/Connections.php:274
+msgid "Call"
+msgstr "Appeler"
-#: ../../Zotlabs/Module/Mitem.php:224
-msgid "Edit Menu Element"
-msgstr "Modifier l'entrée de menu"
+#: ../../Zotlabs/Module/Connections.php:276
+msgid "Status"
+msgstr "État"
-#: ../../Zotlabs/Module/Mitem.php:230
-msgid "Link text"
-msgstr "Texte du lien"
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Connected"
+msgstr "Ami depuis"
-#: ../../Zotlabs/Module/New_channel.php:128
-#: ../../Zotlabs/Module/Register.php:231
-msgid "Name or caption"
-msgstr "Nom ou libellé"
+#: ../../Zotlabs/Module/Connections.php:280
+msgid "Approve connection"
+msgstr "Valider le contact"
-#: ../../Zotlabs/Module/New_channel.php:128
-#: ../../Zotlabs/Module/Register.php:231
-msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""
-msgstr "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\""
+#: ../../Zotlabs/Module/Connections.php:282
+msgid "Ignore connection"
+msgstr "Ignorer le contact"
-#: ../../Zotlabs/Module/New_channel.php:130
-#: ../../Zotlabs/Module/Register.php:233
-msgid "Choose a short nickname"
-msgstr "Choisissez un alias"
+#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Ignore"
+msgstr "Ignorer"
-#: ../../Zotlabs/Module/New_channel.php:130
-#: ../../Zotlabs/Module/Register.php:233
-#, php-format
-msgid ""
-"Your nickname will be used to create an easy to remember channel address "
-"e.g. nickname%s"
-msgstr "Votre pseudo sera utilisé pour créer une adresse de canal facile à mémoriser, par ex. pseudo%s"
+#: ../../Zotlabs/Module/Connections.php:284
+msgid "Recent activity"
+msgstr "Activité récente"
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Channel role and privacy"
-msgstr "Rôle et confidentialité du canal"
+#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/text.php:957 ../../include/nav.php:181
+msgid "Connections"
+msgstr "Contacts"
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Select a channel role with your privacy requirements."
-msgstr "Sélectionner un rôle de canal adapté à vos besoins de confidentialité."
+#: ../../Zotlabs/Module/Connections.php:313
+msgid "Search your connections"
+msgstr "Chercher parmi vos contacts"
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Register.php:235
-msgid "Read more about roles"
-msgstr "En savoir plus sur les rôles"
+#: ../../Zotlabs/Module/Connections.php:314
+msgid "Connections search"
+msgstr "Chercher des contacts"
-#: ../../Zotlabs/Module/New_channel.php:135
-msgid "Create Channel"
-msgstr "Créer le canal"
+#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Directory.php:391
+#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+msgid "Find"
+msgstr "Trouver"
-#: ../../Zotlabs/Module/New_channel.php:136
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines."
+#: ../../Zotlabs/Module/Viewsrc.php:46
+msgid "Source of Item"
+msgstr "Source de l'élément"
-#: ../../Zotlabs/Module/New_channel.php:137
+#: ../../Zotlabs/Module/Bookmarks.php:53
+msgid "Bookmark added"
+msgstr "Favori ajouté"
+
+#: ../../Zotlabs/Module/Bookmarks.php:76
+msgid "My Bookmarks"
+msgstr "Mes Favoris"
+
+#: ../../Zotlabs/Module/Bookmarks.php:87
+msgid "My Connections Bookmarks"
+msgstr "Favoris de mes contacts"
+
+#: ../../Zotlabs/Module/Removeaccount.php:35
msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur."
+"Account removals are not allowed within 48 hours of changing the account "
+"password."
+msgstr "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte."
-#: ../../Zotlabs/Module/Notifications.php:30
-msgid "Invalid request identifier."
-msgstr "Identifiant de requête invalide."
+#: ../../Zotlabs/Module/Removeaccount.php:57
+msgid "Remove This Account"
+msgstr "Supprimer ce compte"
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "Discard"
-msgstr "Annuler"
+#: ../../Zotlabs/Module/Removeaccount.php:58
+msgid ""
+"This account and all its channels will be completely removed from the "
+"network. "
+msgstr "Ce compte et tous ses canaux seront entièrement supprimés du réseau."
-#: ../../Zotlabs/Module/Notifications.php:103 ../../include/nav.php:191
-msgid "Mark all system notifications seen"
-msgstr "Marquer toutes les notifications système comme vues"
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"Remove this account, all its channels and all its channel clones from the "
+"network"
+msgstr "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux."
-#: ../../Zotlabs/Module/Photos.php:84
+#: ../../Zotlabs/Module/Removeaccount.php:60
+msgid ""
+"By default only the instances of the channels located on this hub will be "
+"removed from the network"
+msgstr "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau"
+
+#: ../../Zotlabs/Module/Photos.php:78
msgid "Page owner information could not be retrieved."
msgstr "Impossible d'obtenir des informations sur le propriétaire de la page."
-#: ../../Zotlabs/Module/Photos.php:99 ../../Zotlabs/Module/Photos.php:743
-#: ../../Zotlabs/Module/Profile_photo.php:114
-#: ../../Zotlabs/Module/Profile_photo.php:206
-#: ../../Zotlabs/Module/Profile_photo.php:294
-#: ../../include/photo/photo_driver.php:718
-msgid "Profile Photos"
-msgstr "Photos du profil"
-
-#: ../../Zotlabs/Module/Photos.php:105 ../../Zotlabs/Module/Photos.php:149
+#: ../../Zotlabs/Module/Photos.php:94 ../../Zotlabs/Module/Photos.php:120
msgid "Album not found."
msgstr "Album introuvable."
-#: ../../Zotlabs/Module/Photos.php:132
+#: ../../Zotlabs/Module/Photos.php:103
msgid "Delete Album"
msgstr "Supprimer l'album"
-#: ../../Zotlabs/Module/Photos.php:153
-msgid ""
-"Multiple storage folders exist with this album name, but within different "
-"directories. Please remove the desired folder or folders using the Files "
-"manager"
-msgstr ""
-
-#: ../../Zotlabs/Module/Photos.php:210 ../../Zotlabs/Module/Photos.php:1053
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
msgid "Delete Photo"
msgstr "Supprimer la photo"
-#: ../../Zotlabs/Module/Photos.php:533
+#: ../../Zotlabs/Module/Photos.php:501
msgid "No photos selected"
msgstr "Aucune photo selectionnée"
-#: ../../Zotlabs/Module/Photos.php:582
+#: ../../Zotlabs/Module/Photos.php:550
msgid "Access to this item is restricted."
msgstr "L'accès à l'élément est restreint."
-#: ../../Zotlabs/Module/Photos.php:621
+#: ../../Zotlabs/Module/Photos.php:591
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos."
-#: ../../Zotlabs/Module/Photos.php:624
+#: ../../Zotlabs/Module/Photos.php:594
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f méga-octets utilisés pour le stockage des photos."
-#: ../../Zotlabs/Module/Photos.php:660
+#: ../../Zotlabs/Module/Photos.php:636
msgid "Upload Photos"
msgstr "Téléverser des photos"
-#: ../../Zotlabs/Module/Photos.php:664
+#: ../../Zotlabs/Module/Photos.php:640
msgid "Enter an album name"
msgstr "Entrer un nom d'album"
-#: ../../Zotlabs/Module/Photos.php:665
+#: ../../Zotlabs/Module/Photos.php:641
msgid "or select an existing album (doubleclick)"
msgstr "ou sélectionner un album existant (double-clic)"
-#: ../../Zotlabs/Module/Photos.php:666
+#: ../../Zotlabs/Module/Photos.php:642
msgid "Create a status post for this upload"
msgstr "Créer une publication de statut pour cet envoi"
-#: ../../Zotlabs/Module/Photos.php:667
+#: ../../Zotlabs/Module/Photos.php:643
msgid "Caption (optional):"
msgstr "Légende (facultative)"
-#: ../../Zotlabs/Module/Photos.php:668
+#: ../../Zotlabs/Module/Photos.php:644
msgid "Description (optional):"
msgstr "Description (facultative)"
-#: ../../Zotlabs/Module/Photos.php:695
-msgid "Album name could not be decoded"
-msgstr "Le nom de l'Album n'a pu être décodé"
-
-#: ../../Zotlabs/Module/Photos.php:743
-msgid "Contact Photos"
-msgstr "Photos de contact"
-
-#: ../../Zotlabs/Module/Photos.php:766
+#: ../../Zotlabs/Module/Photos.php:725
msgid "Show Newest First"
msgstr "Les plus récent(e)s en premier"
-#: ../../Zotlabs/Module/Photos.php:768
+#: ../../Zotlabs/Module/Photos.php:727
msgid "Show Oldest First"
msgstr "Les moins récent(e)s en premier"
-#: ../../Zotlabs/Module/Photos.php:792 ../../Zotlabs/Module/Photos.php:1331
-#: ../../include/widgets.php:1499
-msgid "View Photo"
-msgstr "Voir la photo"
-
-#: ../../Zotlabs/Module/Photos.php:823 ../../include/widgets.php:1516
-msgid "Edit Album"
-msgstr "Modifier l'album"
-
-#: ../../Zotlabs/Module/Photos.php:870
+#: ../../Zotlabs/Module/Photos.php:832
msgid "Permission denied. Access to this item may be restricted."
msgstr "Permission refusée. L'accès à cet élément peut avoir été restreint."
-#: ../../Zotlabs/Module/Photos.php:872
+#: ../../Zotlabs/Module/Photos.php:834
msgid "Photo not available"
msgstr "Photo non disponible"
-#: ../../Zotlabs/Module/Photos.php:930
+#: ../../Zotlabs/Module/Photos.php:892
msgid "Use as profile photo"
msgstr "Utiliser comme photo du profil"
-#: ../../Zotlabs/Module/Photos.php:931
+#: ../../Zotlabs/Module/Photos.php:893
msgid "Use as cover photo"
-msgstr ""
+msgstr "Utilisez comme bannière"
-#: ../../Zotlabs/Module/Photos.php:938
+#: ../../Zotlabs/Module/Photos.php:900
msgid "Private Photo"
msgstr "Photo privée"
-#: ../../Zotlabs/Module/Photos.php:953
+#: ../../Zotlabs/Module/Photos.php:915
msgid "View Full Size"
msgstr "Voir en taille réelle"
-#: ../../Zotlabs/Module/Photos.php:998 ../../Zotlabs/Module/Admin.php:1437
-#: ../../Zotlabs/Module/Tagrm.php:137
-msgid "Remove"
-msgstr "Retirer"
-
-#: ../../Zotlabs/Module/Photos.php:1032
+#: ../../Zotlabs/Module/Photos.php:997
msgid "Edit photo"
msgstr "Modifier la photo"
-#: ../../Zotlabs/Module/Photos.php:1034
+#: ../../Zotlabs/Module/Photos.php:999
msgid "Rotate CW (right)"
msgstr "Rotation horaire (droite)"
-#: ../../Zotlabs/Module/Photos.php:1035
+#: ../../Zotlabs/Module/Photos.php:1000
msgid "Rotate CCW (left)"
msgstr "Rotation anti-horaire (gauche)"
-#: ../../Zotlabs/Module/Photos.php:1038
+#: ../../Zotlabs/Module/Photos.php:1003
+msgid "Move photo to album"
+msgstr "Déplacer la photo dans l'album"
+
+#: ../../Zotlabs/Module/Photos.php:1004
msgid "Enter a new album name"
msgstr "Entrer un nouveau nom d'album"
-#: ../../Zotlabs/Module/Photos.php:1039
+#: ../../Zotlabs/Module/Photos.php:1005
msgid "or select an existing one (doubleclick)"
msgstr "ou en sélectionner un existant (double-clic)"
-#: ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Photos.php:1008
msgid "Caption"
msgstr "Titre/légende"
-#: ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Photos.php:1010
msgid "Add a Tag"
msgstr "Ajouter une étiquette"
-#: ../../Zotlabs/Module/Photos.php:1048
+#: ../../Zotlabs/Module/Photos.php:1018
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon"
-#: ../../Zotlabs/Module/Photos.php:1051
+#: ../../Zotlabs/Module/Photos.php:1021
msgid "Flag as adult in album view"
msgstr "Marquer comme \"adulte\" dans l'affichage de l'album"
-#: ../../Zotlabs/Module/Photos.php:1070 ../../Zotlabs/Lib/ThreadItem.php:261
+#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
msgid "I like this (toggle)"
msgstr "J'aime (oui/non)"
-#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:262
+#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
msgid "I don't like this (toggle)"
msgstr "Je n'aime pas (oui/non)"
-#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Lib/ThreadItem.php:397
-#: ../../include/conversation.php:740
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
+#: ../../include/conversation.php:739
msgid "Please wait"
msgstr "Merci de patienter"
-#: ../../Zotlabs/Module/Photos.php:1089 ../../Zotlabs/Module/Photos.php:1207
-#: ../../Zotlabs/Lib/ThreadItem.php:707
+#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
+#: ../../Zotlabs/Lib/ThreadItem.php:729
msgid "This is you"
msgstr "C'est vous"
-#: ../../Zotlabs/Module/Photos.php:1091 ../../Zotlabs/Module/Photos.php:1209
-#: ../../Zotlabs/Lib/ThreadItem.php:709 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Commenter"
-#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
msgctxt "title"
msgid "Likes"
msgstr "Aime"
-#: ../../Zotlabs/Module/Photos.php:1107 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
msgctxt "title"
msgid "Dislikes"
msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Agree"
msgstr "D'accord"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Disagree"
msgstr "Pas d'accord"
-#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
msgctxt "title"
msgid "Abstain"
msgstr "Abstention"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Attending"
msgstr "Participations"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Not attending"
msgstr "Non-participations"
-#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
msgctxt "title"
msgid "Might attend"
msgstr "Participation possible"
-#: ../../Zotlabs/Module/Photos.php:1126 ../../Zotlabs/Module/Photos.php:1138
-#: ../../Zotlabs/Lib/ThreadItem.php:181 ../../Zotlabs/Lib/ThreadItem.php:193
-#: ../../include/conversation.php:1717
+#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
msgid "View all"
msgstr "Voir tout"
-#: ../../Zotlabs/Module/Photos.php:1130 ../../Zotlabs/Lib/ThreadItem.php:185
-#: ../../include/taxonomy.php:403 ../../include/conversation.php:1741
-#: ../../include/channel.php:1158
+#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1898 ../../include/channel.php:1266
+#: ../../include/taxonomy.php:403
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "Aime"
msgstr[1] "Aime"
-#: ../../Zotlabs/Module/Photos.php:1135 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/conversation.php:1744
+#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1901
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] "N'aime pas"
msgstr[1] "N'aime pas"
-#: ../../Zotlabs/Module/Photos.php:1235
+#: ../../Zotlabs/Module/Photos.php:1205
msgid "Photo Tools"
-msgstr ""
+msgstr "Ouitls pour photos"
-#: ../../Zotlabs/Module/Photos.php:1244
+#: ../../Zotlabs/Module/Photos.php:1214
msgid "In This Photo:"
msgstr "Dans cette photo&nbsp;:"
-#: ../../Zotlabs/Module/Photos.php:1249
+#: ../../Zotlabs/Module/Photos.php:1219
msgid "Map"
msgstr "Carte"
-#: ../../Zotlabs/Module/Photos.php:1257 ../../Zotlabs/Lib/ThreadItem.php:386
+#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
msgctxt "noun"
msgid "Likes"
msgstr "Aime"
-#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:387
+#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
msgctxt "noun"
msgid "Dislikes"
msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:392
-#: ../../include/acl_selectors.php:285
+#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr "Fermer"
-#: ../../Zotlabs/Module/Photos.php:1337
-msgid "View Album"
-msgstr "Voir l'album"
-
-#: ../../Zotlabs/Module/Photos.php:1348 ../../Zotlabs/Module/Photos.php:1361
-#: ../../Zotlabs/Module/Photos.php:1362
+#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
+#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:528
msgid "Recent Photos"
msgstr "Photos récentes"
-#: ../../Zotlabs/Module/Ping.php:265
-msgid "sent you a private message"
-msgstr "vous a envoyé un message privé"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
+msgstr "Profil non disponible."
-#: ../../Zotlabs/Module/Ping.php:313
-msgid "added your channel"
-msgstr "a ajouté votre canal"
+#: ../../Zotlabs/Module/Wiki.php:44 ../../addon/gitwiki/Mod_Gitwiki.php:42
+msgid "Not found"
+msgstr "Non trouvé"
-#: ../../Zotlabs/Module/Ping.php:323
-msgid "g A l F d"
-msgstr "g A l F d"
+#: ../../Zotlabs/Module/Wiki.php:68 ../../addon/gitwiki/Mod_Gitwiki.php:62
+msgid "Invalid channel"
+msgstr "Canal invalide."
-#: ../../Zotlabs/Module/Ping.php:346
-msgid "[today]"
-msgstr "[aujourd'hui]"
+#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1845
+msgid "Wikis"
+msgstr "Wikis"
-#: ../../Zotlabs/Module/Ping.php:355
-msgid "posted an event"
-msgstr "a publié un événement"
+#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Download"
+msgstr "Téléchargement"
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Impossible de trouver votre hub."
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Create New"
+msgstr "Nouveau"
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Publication réussie."
+#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+msgid "Wiki name"
+msgstr "Nom du wiki"
-#: ../../Zotlabs/Module/Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "Erreur du protocole OpenID. Pas d'ID retourné."
+#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+msgid "Content type"
+msgstr "Type de contenu"
-#: ../../Zotlabs/Module/Openid.php:193 ../../include/auth.php:226
-msgid "Login failed."
-msgstr "Échec de la connexion."
+#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../addon/gitwiki/Mod_Gitwiki.php:159
+msgid "Type"
+msgstr "Type"
-#: ../../Zotlabs/Module/Page.php:133
-msgid ""
-"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
-"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
-" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
-"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
-"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
-"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
-msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+msgid "Create a status post for this wiki"
+msgstr "Créer un statut de publication pour ce wiki"
-#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
-msgid "This setting requires special processing and editing has been blocked."
-msgstr "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées."
+#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+msgid "Wiki not found"
+msgstr "Wiki introuvable"
-#: ../../Zotlabs/Module/Pconfig.php:48
-msgid "Configuration Editor"
-msgstr "Editeur de configuration"
+#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+msgid "Rename page"
+msgstr "Renommer la page"
-#: ../../Zotlabs/Module/Pconfig.php:49
-msgid ""
-"Warning: Changing some settings could render your channel inoperable. Please"
-" leave this page unless you are comfortable with and knowledgeable about how"
-" to correctly use this feature."
-msgstr "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."
+#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+msgid "Error retrieving page content"
+msgstr "Erreur lors de la récupération du contenu de la page"
+
+#: ../../Zotlabs/Module/Wiki.php:239
+msgid "New page"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revision Comparison"
+msgstr "Comparaison des révisions"
+
+#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+msgid "Revert"
+msgstr "Revenir"
+
+#: ../../Zotlabs/Module/Wiki.php:268
+msgid "Short description of your changes (optional)"
+msgstr "Description courte de vos modifications (optionnel)"
+
+#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+msgid "Source"
+msgstr "Source"
+
+#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+msgid "New page name"
+msgstr "Nouveau nom de la page"
+
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1232
+msgid "Embed image from photo albums"
+msgstr "Intégrer une image d'un album photo"
+
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1326
+msgid "Embed an image from your albums"
+msgstr "Intégrer une image de votre album photo"
+
+#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+msgid "OK"
+msgstr "OK"
+
+#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1268
+msgid "Choose images to embed"
+msgstr "Choisissez des images à intégrer"
+
+#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1269
+msgid "Choose an album"
+msgstr "Choisir un album"
+
+#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+msgid "Choose a different album"
+msgstr "Choisissez un autre album"
+
+#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1271
+msgid "Error getting album list"
+msgstr "Erreur venant de la liste de l'album"
+
+#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1272
+msgid "Error getting photo link"
+msgstr "Erreur provenant du lien de la photo"
+
+#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1273
+msgid "Error getting album"
+msgstr "Erreur venant de l'album"
+
+#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
+msgstr "Erreur lors de la création du wiki. Nom invalide."
+
+#: ../../Zotlabs/Module/Wiki.php:371
+msgid "A wiki with this name already exists."
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
+msgstr "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil."
+
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
+msgstr "Erreur lors de la création du wiki."
+
+#: ../../Zotlabs/Module/Wiki.php:403
+msgid "Wiki delete permission denied."
+msgstr "Permission de supprimer le wiki refusée."
+
+#: ../../Zotlabs/Module/Wiki.php:413
+msgid "Error deleting wiki"
+msgstr "Erreur durant la suppression du wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
+msgstr "Nouvelle page créée"
+
+#: ../../Zotlabs/Module/Wiki.php:558
+msgid "Cannot delete Home"
+msgstr "Impossible de supprimer la racine"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Current Revision"
+msgstr "Version actuelle"
+
+#: ../../Zotlabs/Module/Wiki.php:622
+msgid "Selected Revision"
+msgstr "Version sélectionnée"
-#: ../../Zotlabs/Module/Pdledit.php:18
+#: ../../Zotlabs/Module/Wiki.php:672
+msgid "You must be authenticated."
+msgstr "Vous devez être connecté."
+
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "Basculer en mode plein écran."
+
+#: ../../Zotlabs/Module/Pdledit.php:21
msgid "Layout updated."
msgstr "Mise en page mise à jour."
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Pdledit.php:61
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+msgid "Feature disabled."
+msgstr "Fonctionnalité désactivée"
+
+#: ../../Zotlabs/Module/Pdledit.php:42 ../../Zotlabs/Module/Pdledit.php:69
msgid "Edit System Page Description"
msgstr "Modifier la description de la page du système"
-#: ../../Zotlabs/Module/Pdledit.php:56
+#: ../../Zotlabs/Module/Pdledit.php:64
msgid "Layout not found."
msgstr "Mise en page introuvable."
-#: ../../Zotlabs/Module/Pdledit.php:62
+#: ../../Zotlabs/Module/Pdledit.php:70
msgid "Module Name:"
msgstr "Nom du module&nbsp;:"
-#: ../../Zotlabs/Module/Pdledit.php:63
+#: ../../Zotlabs/Module/Pdledit.php:71
msgid "Layout Help"
msgstr "Aide à la mise en page"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:226
-#: ../../include/conversation.php:960
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:1042
msgid "Poke"
msgstr "Tapoter"
@@ -3203,13 +4747,838 @@ msgstr "Choisir ce que vous voulez faire au destinataire"
msgid "Make this post private"
msgstr "Rendre cette publication privée"
-#: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34
+#: ../../Zotlabs/Module/Profile_photo.php:61
+#: ../../Zotlabs/Module/Cover_photo.php:56
+msgid "Image uploaded but image cropping failed."
+msgstr "L'image a été téléversée, mais le recadrage a échoué."
+
+#: ../../Zotlabs/Module/Profile_photo.php:115
+#: ../../Zotlabs/Module/Profile_photo.php:226
+#: ../../include/photo/photo_driver.php:646
+msgid "Profile Photos"
+msgstr "Photos du profil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:137
+#: ../../Zotlabs/Module/Cover_photo.php:159
+msgid "Image resize failed."
+msgstr "Le redimensionnement de l'image a échoué."
+
+#: ../../Zotlabs/Module/Profile_photo.php:196
+#: ../../addon/openclipatar/openclipatar.php:298
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement."
+
+#: ../../Zotlabs/Module/Profile_photo.php:203
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+msgid "Unable to process image"
+msgstr "Impossible de traiter l'image"
+
+#: ../../Zotlabs/Module/Profile_photo.php:238
+#: ../../Zotlabs/Module/Cover_photo.php:197
+msgid "Image upload failed."
+msgstr "Le téléversement de l'image a échoué."
+
+#: ../../Zotlabs/Module/Profile_photo.php:257
+#: ../../Zotlabs/Module/Cover_photo.php:214
+msgid "Unable to process image."
+msgstr "Impossible de traîter l'image."
+
+#: ../../Zotlabs/Module/Profile_photo.php:318
+#: ../../Zotlabs/Module/Profile_photo.php:365
+#: ../../Zotlabs/Module/Cover_photo.php:307
+#: ../../Zotlabs/Module/Cover_photo.php:322
+msgid "Photo not available."
+msgstr "Photo inaccessible."
+
+#: ../../Zotlabs/Module/Profile_photo.php:420
+#: ../../Zotlabs/Module/Cover_photo.php:358
+msgid "Upload File:"
+msgstr "Téléverser fichier&nbsp;:"
+
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../Zotlabs/Module/Cover_photo.php:359
+msgid "Select a profile:"
+msgstr "Choisir un profil&nbsp;:"
+
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Use Photo for Profile"
+msgstr "Utiliser la photo pour le profil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:422
+msgid "Upload Profile Photo"
+msgstr "Téléverser une photo de profil"
+
+#: ../../Zotlabs/Module/Profile_photo.php:423
+#: ../../addon/openclipatar/openclipatar.php:182
+#: ../../addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Utiliser"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "skip this step"
+msgstr "passer cette étape"
+
+#: ../../Zotlabs/Module/Profile_photo.php:429
+#: ../../Zotlabs/Module/Cover_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "choisir une photo dans vos albums"
+
+#: ../../Zotlabs/Module/Profile_photo.php:448
+#: ../../Zotlabs/Module/Cover_photo.php:381
+msgid "Crop Image"
+msgstr "Recadrer l'image"
+
+#: ../../Zotlabs/Module/Profile_photo.php:449
+#: ../../Zotlabs/Module/Cover_photo.php:382
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Merci d'ajuster le cadre pour une visualisation optimale."
+
+#: ../../Zotlabs/Module/Profile_photo.php:451
+#: ../../Zotlabs/Module/Cover_photo.php:384
+msgid "Done Editing"
+msgstr "J'ai terminé"
+
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
+msgstr "Absent"
+
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
+msgstr "En ligne"
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Impossible de localiser la publication initiale."
+
+#: ../../Zotlabs/Module/Item.php:450
+msgid "Empty post discarded."
+msgstr "Publication vide annulée."
+
+#: ../../Zotlabs/Module/Item.php:824
+msgid "Duplicate post suppressed."
+msgstr "Publication en doublon supprimée."
+
+#: ../../Zotlabs/Module/Item.php:954
+msgid "System error. Post not saved."
+msgstr "Erreur système. Publication non sauvegardée."
+
+#: ../../Zotlabs/Module/Item.php:1084
+msgid "Unable to obtain post information from database."
+msgstr "Impossible d'obtenir les informations de publication depuis la base de données."
+
+#: ../../Zotlabs/Module/Item.php:1091
#, php-format
-msgid "Fetching URL returns error: %1$s"
-msgstr "Récupération d'URL échouée&nbsp;: %1$s"
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Vous avez atteint votre limite de %1$.0f contributions \"racines\"."
+
+#: ../../Zotlabs/Module/Item.php:1098
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Vous avez atteint votre limite de %1$.0f pages web."
+
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "vous a envoyé un message privé"
+
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "a ajouté votre canal"
+
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "g A l F d"
+
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[aujourd'hui]"
+
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "a publié un événement"
+
+#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+msgid "Invalid item."
+msgstr "Élément invalide."
+
+#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Display.php:122
+#: ../../Zotlabs/Lib/NativeWikiPage.php:489 ../../Zotlabs/Web/Router.php:146
+#: ../../include/help.php:68
+msgid "Page not found."
+msgstr "Page introuvable."
+
+#: ../../Zotlabs/Module/Page.php:131
+msgid ""
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
+"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
+" quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+"consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+"cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
+"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+msgstr "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+#: ../../Zotlabs/Module/Connedit.php:79
+msgid "Could not access contact record."
+msgstr "Impossible d'accéder aux détails du contact."
+
+#: ../../Zotlabs/Module/Connedit.php:109
+msgid "Could not locate selected profile."
+msgstr "Impossible de localiser le profil sélectionné."
+
+#: ../../Zotlabs/Module/Connedit.php:246
+msgid "Connection updated."
+msgstr "Contact mis à jour."
+
+#: ../../Zotlabs/Module/Connedit.php:248
+msgid "Failed to update connection record."
+msgstr "Impossible de mettre à jour les détails du contact."
+
+#: ../../Zotlabs/Module/Connedit.php:298
+msgid "is now connected to"
+msgstr "est maintenant connecté avec"
+
+#: ../../Zotlabs/Module/Connedit.php:431
+msgid "Could not access address book record."
+msgstr "Impossible d'accéder aux détails du carnet d'adresses."
+
+#: ../../Zotlabs/Module/Connedit.php:479
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Actualisation impossible - le canal est indisponible."
+
+#: ../../Zotlabs/Module/Connedit.php:494 ../../Zotlabs/Module/Connedit.php:503
+#: ../../Zotlabs/Module/Connedit.php:512 ../../Zotlabs/Module/Connedit.php:521
+#: ../../Zotlabs/Module/Connedit.php:534
+msgid "Unable to set address book parameters."
+msgstr "Impossible de régler les paramètres du carnet d'adresses."
+
+#: ../../Zotlabs/Module/Connedit.php:558
+msgid "Connection has been removed."
+msgstr "Le contact a été supprimé."
+
+#: ../../Zotlabs/Module/Connedit.php:598 ../../Zotlabs/Lib/Apps.php:228
+#: ../../addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:982 ../../include/nav.php:102
+msgid "View Profile"
+msgstr "Voir mon profil"
+
+#: ../../Zotlabs/Module/Connedit.php:601
+#, php-format
+msgid "View %s's profile"
+msgstr "Voir le profil de %s"
+
+#: ../../Zotlabs/Module/Connedit.php:605
+msgid "Refresh Permissions"
+msgstr "Actualiser les autorisations"
+
+#: ../../Zotlabs/Module/Connedit.php:608
+msgid "Fetch updated permissions"
+msgstr "Récupérer les autorisations les plus récentes"
+
+#: ../../Zotlabs/Module/Connedit.php:612
+msgid "Refresh Photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "Fetch updated photo"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:619
+msgid "Recent Activity"
+msgstr "Activité récente"
+
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "View recent posts and comments"
+msgstr "Voir les publications et commentaires récents"
+
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Bloquer ou débloquer toute communication avec ce contact"
+
+#: ../../Zotlabs/Module/Connedit.php:630
+msgid "This connection is blocked!"
+msgstr "Ce contact est bloqué&nbsp;!"
+
+#: ../../Zotlabs/Module/Connedit.php:634
+msgid "Unignore"
+msgstr "Ne plus ignorer"
+
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Ignorer ou ne plus ignorer toute communication venant de ce contact"
+
+#: ../../Zotlabs/Module/Connedit.php:638
+msgid "This connection is ignored!"
+msgstr "Ce contact est ignoré&nbsp;!"
+
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Unarchive"
+msgstr "Désarchiver"
+
+#: ../../Zotlabs/Module/Connedit.php:642
+msgid "Archive"
+msgstr "Archiver"
+
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiver ou désarchiver ce contact - le marquer comme inactif mais conserver le contenu"
+
+#: ../../Zotlabs/Module/Connedit.php:646
+msgid "This connection is archived!"
+msgstr "Ce contact est archivé&nbsp;!"
+
+#: ../../Zotlabs/Module/Connedit.php:650
+msgid "Unhide"
+msgstr "Ne plus cacher"
+
+#: ../../Zotlabs/Module/Connedit.php:650
+msgid "Hide"
+msgstr "Cacher"
+
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts"
+
+#: ../../Zotlabs/Module/Connedit.php:654
+msgid "This connection is hidden!"
+msgstr "Ce contact est caché&nbsp;!"
+
+#: ../../Zotlabs/Module/Connedit.php:661
+msgid "Delete this connection"
+msgstr "Supprimer ce contact"
+
+#: ../../Zotlabs/Module/Connedit.php:669
+msgid "Fetch Vcard"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:672
+msgid "Fetch electronic calling card for this connection"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:683
+msgid "Open Individual Permissions section by default"
+msgstr "Ouvrir par défaut la section des autorisations individuelles"
+
+#: ../../Zotlabs/Module/Connedit.php:706
+msgid "Affinity"
+msgstr "Affinité"
+
+#: ../../Zotlabs/Module/Connedit.php:709
+msgid "Open Set Affinity section by default"
+msgstr "Ouvrir par défaut la section Définir le degré d'affinité"
+
+#: ../../Zotlabs/Module/Connedit.php:713 ../../Zotlabs/Widget/Affinity.php:26
+msgid "Me"
+msgstr "Moi"
+
+#: ../../Zotlabs/Module/Connedit.php:714 ../../Zotlabs/Widget/Affinity.php:27
+msgid "Family"
+msgstr "Famille"
+
+#: ../../Zotlabs/Module/Connedit.php:716 ../../Zotlabs/Widget/Affinity.php:29
+msgid "Acquaintances"
+msgstr "Connaissances"
+
+#: ../../Zotlabs/Module/Connedit.php:743
+msgid "Filter"
+msgstr "Filtrer"
+
+#: ../../Zotlabs/Module/Connedit.php:746
+msgid "Open Custom Filter section by default"
+msgstr "Ouvrir par défaut la section Filtre personnalisé"
+
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Approve this connection"
+msgstr "Autoriser ce contact"
+
+#: ../../Zotlabs/Module/Connedit.php:783
+msgid "Accept connection to allow communication"
+msgstr "Accepter le contact pour permettre la communication"
+
+#: ../../Zotlabs/Module/Connedit.php:788
+msgid "Set Affinity"
+msgstr "Définir le degré d'affinité"
+
+#: ../../Zotlabs/Module/Connedit.php:791
+msgid "Set Profile"
+msgstr "Définir le profil"
+
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Set Affinity & Profile"
+msgstr "Définir le degré d'affinité et le profil"
+
+#: ../../Zotlabs/Module/Connedit.php:852
+msgid "none"
+msgstr "Aucun"
+
+#: ../../Zotlabs/Module/Connedit.php:855
+#: ../../Zotlabs/Widget/Settings_menu.php:107
+msgid "Connection Default Permissions"
+msgstr "Autorisations par défaut des contacts"
+
+#: ../../Zotlabs/Module/Connedit.php:855 ../../include/items.php:3942
+#, php-format
+msgid "Connection: %s"
+msgstr "Contact&nbsp;: %s"
+
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "Apply these permissions automatically"
+msgstr "Appliquer ces permissions automatiquement"
+
+#: ../../Zotlabs/Module/Connedit.php:856
+msgid "Connection requests will be approved without your interaction"
+msgstr "Les demandes de contact seront approuvées automatiquement"
+
+#: ../../Zotlabs/Module/Connedit.php:857
+msgid "Permission role"
+msgstr "Rôle d'accès"
+
+#: ../../Zotlabs/Module/Connedit.php:858
+msgid "Add permission role"
+msgstr "Ajouter un rôle d'accès"
+
+#: ../../Zotlabs/Module/Connedit.php:864
+msgid "This connection's primary address is"
+msgstr "L'adresse principale de ce contact est"
+
+#: ../../Zotlabs/Module/Connedit.php:865
+msgid "Available locations:"
+msgstr "Emplacements disponibles&nbsp;:"
+
+#: ../../Zotlabs/Module/Connedit.php:869
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts."
+
+#: ../../Zotlabs/Module/Connedit.php:870
+msgid "Connection Tools"
+msgstr "Actions du contact"
+
+#: ../../Zotlabs/Module/Connedit.php:872
+msgid "Slide to adjust your degree of friendship"
+msgstr "Faites glisser pour ajuster votre proximité avec le contact"
+
+#: ../../Zotlabs/Module/Connedit.php:873 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Evaluation"
+
+#: ../../Zotlabs/Module/Connedit.php:874
+msgid "Slide to adjust your rating"
+msgstr "Faîtes glisser pour ajuster votre note"
+
+#: ../../Zotlabs/Module/Connedit.php:875 ../../Zotlabs/Module/Connedit.php:880
+msgid "Optionally explain your rating"
+msgstr "Explication facultative de votre évaluation"
+
+#: ../../Zotlabs/Module/Connedit.php:877
+msgid "Custom Filter"
+msgstr "Filtre personnalisé"
+
+#: ../../Zotlabs/Module/Connedit.php:878
+msgid "Only import posts with this text"
+msgstr "N'importer que les publications comprenant ce texte"
+
+#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:879
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "un mot par ligne ou #étiquettes ou /motif/ ou lang=xx, laisser vide pour importer toutes les publications"
+
+#: ../../Zotlabs/Module/Connedit.php:879
+msgid "Do not import posts with this text"
+msgstr "Ne pas importer les publications comprenant ce texte"
+
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "This information is public!"
+msgstr "Cette information est publique&nbsp;!"
+
+#: ../../Zotlabs/Module/Connedit.php:886
+msgid "Connection Pending Approval"
+msgstr "Contact en attente d'approbation"
+
+#: ../../Zotlabs/Module/Connedit.php:891
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée."
+
+#: ../../Zotlabs/Module/Connedit.php:898
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités."
+
+#: ../../Zotlabs/Module/Connedit.php:899
+msgid "Last update:"
+msgstr "Dernière mise à jour&nbsp;:"
+
+#: ../../Zotlabs/Module/Connedit.php:908
+msgid "Details"
+msgstr "Détails"
+
+#: ../../Zotlabs/Module/Connedit.php:911 ../../addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organisation"
+
+#: ../../Zotlabs/Module/Connedit.php:912 ../../addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Titre"
+
+#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:789
+#: ../../addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Téléphone"
+
+#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:791
+#: ../../addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Instant messenger"
+
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:792
+#: ../../addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Site web"
+
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:794
+#: ../../addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Note"
+
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Profiles.php:795
+#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
+msgid "Mobile"
+msgstr "Mobile"
+
+#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Profiles.php:796
+#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
+msgid "Home"
+msgstr "Mon canal"
+
+#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Profiles.php:797
+#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
+msgid "Work"
+msgstr "Travail"
+
+#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/cdav/Mod_Cdav.php:1149
+#: ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
+msgstr "Ajouter un contact"
+
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:800
+#: ../../addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Ajouter un champ"
+
+#: ../../Zotlabs/Module/Connedit.php:929 ../../addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "P.O. Box"
+
+#: ../../Zotlabs/Module/Connedit.php:930 ../../addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Information complémentaires"
+
+#: ../../Zotlabs/Module/Connedit.php:931 ../../addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Rue"
+
+#: ../../Zotlabs/Module/Connedit.php:932 ../../addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Localité"
+
+#: ../../Zotlabs/Module/Connedit.php:933 ../../addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Région"
+
+#: ../../Zotlabs/Module/Connedit.php:934 ../../addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "ZIP code"
+
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Profiles.php:760
+#: ../../addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "Pays"
+
+#: ../../Zotlabs/Module/Chat.php:179
+msgid "Room not found"
+msgstr "Salon introuvable"
+
+#: ../../Zotlabs/Module/Chat.php:195
+msgid "Leave Room"
+msgstr "Quitter le salon"
+
+#: ../../Zotlabs/Module/Chat.php:196
+msgid "Delete Room"
+msgstr "Supprimer le salon"
+
+#: ../../Zotlabs/Module/Chat.php:197
+msgid "I am away right now"
+msgstr "Je suis absent en ce moment"
+
+#: ../../Zotlabs/Module/Chat.php:198
+msgid "I am online"
+msgstr "Je suis en ligne"
+
+#: ../../Zotlabs/Module/Chat.php:200
+msgid "Bookmark this room"
+msgstr "Marquer ce salon comme favori"
+
+#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:240
+#: ../../Zotlabs/Module/Mail.php:361 ../../include/conversation.php:1263
+msgid "Please enter a link URL:"
+msgstr "Merci d'entrer l'URL d'un lien&nbsp;:"
+
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:293
+#: ../../Zotlabs/Module/Mail.php:430 ../../Zotlabs/Lib/ThreadItem.php:744
+#: ../../include/conversation.php:1373
+msgid "Encrypt text"
+msgstr "Chiffrer le texte"
+
+#: ../../Zotlabs/Module/Chat.php:230
+msgid "New Chatroom"
+msgstr "Nouveau salon de discussion"
+
+#: ../../Zotlabs/Module/Chat.php:231
+msgid "Chatroom name"
+msgstr "Nom du salon de conversation"
+
+#: ../../Zotlabs/Module/Chat.php:232
+msgid "Expiration of chats (minutes)"
+msgstr "Expiration des discussions (en minutes)"
+
+#: ../../Zotlabs/Module/Chat.php:248
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Salons de %1$s"
+
+#: ../../Zotlabs/Module/Chat.php:253
+msgid "No chatrooms available"
+msgstr "Aucun salon de conversation disponible"
+
+#: ../../Zotlabs/Module/Chat.php:257
+msgid "Expiration"
+msgstr "Expiration"
+
+#: ../../Zotlabs/Module/Chat.php:258
+msgid "min"
+msgstr "min"
+
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1774
+msgid "Photos"
+msgstr "Photos"
+
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1782
+msgid "Files"
+msgstr "Fichiers"
+
+#: ../../Zotlabs/Module/Menu.php:49
+msgid "Unable to update menu."
+msgstr "Impossible de mettre le menu à jour."
+
+#: ../../Zotlabs/Module/Menu.php:60
+msgid "Unable to create menu."
+msgstr "Impossible de créer le menu."
+
+#: ../../Zotlabs/Module/Menu.php:98 ../../Zotlabs/Module/Menu.php:110
+msgid "Menu Name"
+msgstr "Nom du menu"
+
+#: ../../Zotlabs/Module/Menu.php:98
+msgid "Unique name (not visible on webpage) - required"
+msgstr "Nom unique (non visible sur la page web) - requis"
+
+#: ../../Zotlabs/Module/Menu.php:99 ../../Zotlabs/Module/Menu.php:111
+msgid "Menu Title"
+msgstr "Titre du menu"
+
+#: ../../Zotlabs/Module/Menu.php:99
+msgid "Visible on webpage - leave empty for no title"
+msgstr "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre"
+
+#: ../../Zotlabs/Module/Menu.php:100
+msgid "Allow Bookmarks"
+msgstr "Autoriser l'usage de favoris"
+
+#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Le menu pourra être utilisé pour stocker des favoris"
+
+#: ../../Zotlabs/Module/Menu.php:101 ../../Zotlabs/Module/Menu.php:159
+msgid "Submit and proceed"
+msgstr "Valider et continuer"
+
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2276
+msgid "Menus"
+msgstr "Menus"
+
+#: ../../Zotlabs/Module/Menu.php:117
+msgid "Bookmarks allowed"
+msgstr "Favoris autorisés"
+
+#: ../../Zotlabs/Module/Menu.php:119
+msgid "Delete this menu"
+msgstr "Supprimer ce menu"
+
+#: ../../Zotlabs/Module/Menu.php:120 ../../Zotlabs/Module/Menu.php:154
+msgid "Edit menu contents"
+msgstr "Modifier le contenu du menu"
+
+#: ../../Zotlabs/Module/Menu.php:121
+msgid "Edit this menu"
+msgstr "Modifier ce menu"
+
+#: ../../Zotlabs/Module/Menu.php:136
+msgid "Menu could not be deleted."
+msgstr "Impossible de supprimer le menu."
+
+#: ../../Zotlabs/Module/Menu.php:149
+msgid "Edit Menu"
+msgstr "Modifier le menu"
+
+#: ../../Zotlabs/Module/Menu.php:153
+msgid "Add or remove entries to this menu"
+msgstr "Ajouter/supprimer des entrées à ce menu"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Menu name"
+msgstr "Nom du menu"
+
+#: ../../Zotlabs/Module/Menu.php:155
+msgid "Must be unique, only seen by you"
+msgstr "Doit être unique, ne sera vu que par vous"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title"
+msgstr "Titre du menu"
+
+#: ../../Zotlabs/Module/Menu.php:156
+msgid "Menu title as seen by others"
+msgstr "Titre du menu tel que vu par les visiteurs"
+
+#: ../../Zotlabs/Module/Menu.php:157
+msgid "Allow bookmarks"
+msgstr "Autoriser l'usage de favoris"
+
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2277
+msgid "Layouts"
+msgstr "Mises-en-page"
+
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/nav.php:157 ../../include/nav.php:264
+#: ../../include/help.php:55 ../../include/help.php:61
+msgid "Help"
+msgstr "Aide"
+
+#: ../../Zotlabs/Module/Layouts.php:186
+msgid "Comanche page description language help"
+msgstr "Aide sur le langage de description de page Comanche"
+
+#: ../../Zotlabs/Module/Layouts.php:190
+msgid "Layout Description"
+msgstr "Description de la mise en page"
+
+#: ../../Zotlabs/Module/Layouts.php:195
+msgid "Download PDL file"
+msgstr "Télécharger le fichier PDL"
+
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
+msgstr "publication"
+
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
+#: ../../include/text.php:1953
+msgid "comment"
+msgstr "commentaire"
+
+#: ../../Zotlabs/Module/Tagger.php:95
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s a étiqueté le %3$s de %2$s avec %4$s"
+
+#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
+msgid "This setting requires special processing and editing has been blocked."
+msgstr "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées."
+
+#: ../../Zotlabs/Module/Pconfig.php:48
+msgid "Configuration Editor"
+msgstr "Editeur de configuration"
+
+#: ../../Zotlabs/Module/Pconfig.php:49
+msgid ""
+"Warning: Changing some settings could render your channel inoperable. Please"
+" leave this page unless you are comfortable with and knowledgeable about how"
+" to correctly use this feature."
+msgstr "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité."
+
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Groupe de contacts créé."
+
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Impossible de créer le groupe de contacts."
+
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3909
+msgid "Privacy group not found."
+msgstr "Groupe de contacts introuvable."
+
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Groupe de contacts mis à jour."
+
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Créer un groupe de contacts."
+
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Nom du groupe de contacts&nbsp;:"
+
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Les membres sont visibles par les autres canaux"
+
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Groupe de contacts supprimé."
+
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Impossible de supprimer le groupe de canaux."
+
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Editeur de groupe de contacts."
+
+#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+msgid "Members"
+msgstr "Membres"
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:189
-#: ../../Zotlabs/Module/Profiles.php:246 ../../Zotlabs/Module/Profiles.php:625
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Tous les canaux connectés"
+
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Cliquer sur un canal pour l'ajouter ou le supprimer"
+
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
msgid "Profile not found."
msgstr "Profil introuvable."
@@ -3217,4857 +5586,5188 @@ msgstr "Profil introuvable."
msgid "Profile deleted."
msgstr "Profil supprimé."
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
msgid "Profile-"
msgstr "Profil-"
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:132
+#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
msgid "New profile created."
msgstr "Nouveau profil créé."
-#: ../../Zotlabs/Module/Profiles.php:110
+#: ../../Zotlabs/Module/Profiles.php:111
msgid "Profile unavailable to clone."
msgstr "Profil impossible à cloner."
-#: ../../Zotlabs/Module/Profiles.php:151
+#: ../../Zotlabs/Module/Profiles.php:146
msgid "Profile unavailable to export."
msgstr "Impossible d'exporter le profil."
-#: ../../Zotlabs/Module/Profiles.php:256
+#: ../../Zotlabs/Module/Profiles.php:252
msgid "Profile Name is required."
msgstr "Le nom du profil est obligatoire."
-#: ../../Zotlabs/Module/Profiles.php:427
+#: ../../Zotlabs/Module/Profiles.php:459
msgid "Marital Status"
msgstr "Statut marital"
-#: ../../Zotlabs/Module/Profiles.php:431
+#: ../../Zotlabs/Module/Profiles.php:463
msgid "Romantic Partner"
msgstr "Partenaire amoureux"
-#: ../../Zotlabs/Module/Profiles.php:435 ../../Zotlabs/Module/Profiles.php:736
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
msgid "Likes"
msgstr "Aime"
-#: ../../Zotlabs/Module/Profiles.php:439 ../../Zotlabs/Module/Profiles.php:737
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
msgid "Dislikes"
msgstr "N'aime pas"
-#: ../../Zotlabs/Module/Profiles.php:443 ../../Zotlabs/Module/Profiles.php:744
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
msgid "Work/Employment"
msgstr "Travail/Occupation"
-#: ../../Zotlabs/Module/Profiles.php:446
+#: ../../Zotlabs/Module/Profiles.php:478
msgid "Religion"
msgstr "Religion/Croyance"
-#: ../../Zotlabs/Module/Profiles.php:450
+#: ../../Zotlabs/Module/Profiles.php:482
msgid "Political Views"
msgstr "Opinions politiques"
-#: ../../Zotlabs/Module/Profiles.php:458
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Sexe"
+
+#: ../../Zotlabs/Module/Profiles.php:490
msgid "Sexual Preference"
msgstr "Préférences sexuelle"
-#: ../../Zotlabs/Module/Profiles.php:462
+#: ../../Zotlabs/Module/Profiles.php:494
msgid "Homepage"
msgstr "Site Internet"
-#: ../../Zotlabs/Module/Profiles.php:466
+#: ../../Zotlabs/Module/Profiles.php:498
msgid "Interests"
msgstr "Centres d'intérêt"
-#: ../../Zotlabs/Module/Profiles.php:560
+#: ../../Zotlabs/Module/Profiles.php:594
msgid "Profile updated."
msgstr "Profil mis à jour."
-#: ../../Zotlabs/Module/Profiles.php:644
+#: ../../Zotlabs/Module/Profiles.php:678
msgid "Hide your connections list from viewers of this profile"
-msgstr ""
+msgstr "Cacher la liste des relations pour les visiteurs de votre profile"
-#: ../../Zotlabs/Module/Profiles.php:686
+#: ../../Zotlabs/Module/Profiles.php:725
msgid "Edit Profile Details"
msgstr "Modifier les détails du profil"
-#: ../../Zotlabs/Module/Profiles.php:688
+#: ../../Zotlabs/Module/Profiles.php:727
msgid "View this profile"
msgstr "Voir ce profil"
-#: ../../Zotlabs/Module/Profiles.php:689 ../../Zotlabs/Module/Profiles.php:771
-#: ../../include/channel.php:959
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
+#: ../../include/channel.php:1064
msgid "Edit visibility"
msgstr "Changer la visibilité"
-#: ../../Zotlabs/Module/Profiles.php:690
+#: ../../Zotlabs/Module/Profiles.php:729
msgid "Profile Tools"
-msgstr ""
+msgstr "Ouitls pour votre profile"
-#: ../../Zotlabs/Module/Profiles.php:691
+#: ../../Zotlabs/Module/Profiles.php:730
msgid "Change cover photo"
-msgstr ""
+msgstr "Modifier votre bannière"
-#: ../../Zotlabs/Module/Profiles.php:692 ../../include/channel.php:930
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1035
msgid "Change profile photo"
msgstr "Changer la photo du profil"
-#: ../../Zotlabs/Module/Profiles.php:693
+#: ../../Zotlabs/Module/Profiles.php:732
msgid "Create a new profile using these settings"
msgstr "Créer un nouveau profil avec ces paramètres"
-#: ../../Zotlabs/Module/Profiles.php:694
+#: ../../Zotlabs/Module/Profiles.php:733
msgid "Clone this profile"
msgstr "Cloner ce profil"
-#: ../../Zotlabs/Module/Profiles.php:695
+#: ../../Zotlabs/Module/Profiles.php:734
msgid "Delete this profile"
msgstr "Supprimer ce profil"
-#: ../../Zotlabs/Module/Profiles.php:696
+#: ../../Zotlabs/Module/Profiles.php:735
msgid "Add profile things"
msgstr "Ajouter des éléments de profil"
-#: ../../Zotlabs/Module/Profiles.php:697 ../../include/widgets.php:105
-#: ../../include/conversation.php:1526
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1648
msgid "Personal"
msgstr "Me concernant"
-#: ../../Zotlabs/Module/Profiles.php:699
+#: ../../Zotlabs/Module/Profiles.php:738
msgid "Relation"
-msgstr ""
+msgstr "Contacts"
-#: ../../Zotlabs/Module/Profiles.php:700 ../../include/datetime.php:48
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
msgid "Miscellaneous"
msgstr "Divers"
-#: ../../Zotlabs/Module/Profiles.php:702
+#: ../../Zotlabs/Module/Profiles.php:741
msgid "Import profile from file"
msgstr "Importer le profil à partir d'un fichier"
-#: ../../Zotlabs/Module/Profiles.php:703
+#: ../../Zotlabs/Module/Profiles.php:742
msgid "Export profile to file"
msgstr "Exporter le profil vers un fichier."
-#: ../../Zotlabs/Module/Profiles.php:704
+#: ../../Zotlabs/Module/Profiles.php:743
msgid "Your gender"
-msgstr ""
+msgstr "Votre genre"
-#: ../../Zotlabs/Module/Profiles.php:705
+#: ../../Zotlabs/Module/Profiles.php:744
msgid "Marital status"
-msgstr ""
+msgstr "Etat civil"
-#: ../../Zotlabs/Module/Profiles.php:706
+#: ../../Zotlabs/Module/Profiles.php:745
msgid "Sexual preference"
-msgstr ""
+msgstr "préférence sexuelle"
-#: ../../Zotlabs/Module/Profiles.php:709
+#: ../../Zotlabs/Module/Profiles.php:748
msgid "Profile name"
-msgstr ""
+msgstr "Nom du profile"
-#: ../../Zotlabs/Module/Profiles.php:711
+#: ../../Zotlabs/Module/Profiles.php:750
msgid "This is your default profile."
msgstr "Ceci est votre profil par défaut."
-#: ../../Zotlabs/Module/Profiles.php:713
+#: ../../Zotlabs/Module/Profiles.php:752
msgid "Your full name"
-msgstr ""
+msgstr "Votre nom complet"
-#: ../../Zotlabs/Module/Profiles.php:714
+#: ../../Zotlabs/Module/Profiles.php:753
msgid "Title/Description"
msgstr "Titre/description"
-#: ../../Zotlabs/Module/Profiles.php:717
+#: ../../Zotlabs/Module/Profiles.php:756
msgid "Street address"
-msgstr ""
+msgstr "Rue"
-#: ../../Zotlabs/Module/Profiles.php:718
+#: ../../Zotlabs/Module/Profiles.php:757
msgid "Locality/City"
msgstr "Ville"
-#: ../../Zotlabs/Module/Profiles.php:719
+#: ../../Zotlabs/Module/Profiles.php:758
msgid "Region/State"
msgstr "Région"
-#: ../../Zotlabs/Module/Profiles.php:720
+#: ../../Zotlabs/Module/Profiles.php:759
msgid "Postal/Zip code"
-msgstr ""
+msgstr "Code postal"
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Country"
-msgstr "Pays"
-
-#: ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Who (if applicable)"
msgstr "Qui (si applicable)"
-#: ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Profiles.php:765
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr "Exemples&nbsp;: marie123, Marie Deschamps, marie@exemple.com"
-#: ../../Zotlabs/Module/Profiles.php:727
+#: ../../Zotlabs/Module/Profiles.php:766
msgid "Since (date)"
-msgstr ""
+msgstr "Depuis (date)"
-#: ../../Zotlabs/Module/Profiles.php:730
+#: ../../Zotlabs/Module/Profiles.php:769
msgid "Tell us about yourself"
-msgstr ""
+msgstr "Parlez nous de vous..."
-#: ../../Zotlabs/Module/Profiles.php:732
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "URL de mon site Internet&nbsp;:"
+
+#: ../../Zotlabs/Module/Profiles.php:771
msgid "Hometown"
msgstr "Ville de naissance"
-#: ../../Zotlabs/Module/Profiles.php:733
+#: ../../Zotlabs/Module/Profiles.php:772
msgid "Political views"
-msgstr ""
+msgstr "Opinions politiques"
-#: ../../Zotlabs/Module/Profiles.php:734
+#: ../../Zotlabs/Module/Profiles.php:773
msgid "Religious views"
-msgstr ""
+msgstr "Convictions religieuses"
-#: ../../Zotlabs/Module/Profiles.php:735
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Keywords used in directory listings"
-msgstr ""
+msgstr "Mots clés pour l'annuaire"
-#: ../../Zotlabs/Module/Profiles.php:735
+#: ../../Zotlabs/Module/Profiles.php:774
msgid "Example: fishing photography software"
msgstr "Exemple&nbsp;: escrime photographie modélisme"
-#: ../../Zotlabs/Module/Profiles.php:738
+#: ../../Zotlabs/Module/Profiles.php:777
msgid "Musical interests"
msgstr "Goûts musicaux"
-#: ../../Zotlabs/Module/Profiles.php:739
+#: ../../Zotlabs/Module/Profiles.php:778
msgid "Books, literature"
msgstr "Livres, littérature"
-#: ../../Zotlabs/Module/Profiles.php:740
+#: ../../Zotlabs/Module/Profiles.php:779
msgid "Television"
msgstr "Télévision"
-#: ../../Zotlabs/Module/Profiles.php:741
+#: ../../Zotlabs/Module/Profiles.php:780
msgid "Film/Dance/Culture/Entertainment"
-msgstr ""
+msgstr "Cinéma/Danse/Culture/Divertissement"
-#: ../../Zotlabs/Module/Profiles.php:742
+#: ../../Zotlabs/Module/Profiles.php:781
msgid "Hobbies/Interests"
msgstr "Loisirs/Centres d'intêret"
-#: ../../Zotlabs/Module/Profiles.php:743
+#: ../../Zotlabs/Module/Profiles.php:782
msgid "Love/Romance"
-msgstr ""
+msgstr "Amour/Relation amoureuse"
-#: ../../Zotlabs/Module/Profiles.php:745
+#: ../../Zotlabs/Module/Profiles.php:784
msgid "School/Education"
-msgstr ""
+msgstr "Niveau d'étude"
-#: ../../Zotlabs/Module/Profiles.php:746
+#: ../../Zotlabs/Module/Profiles.php:785
msgid "Contact information and social networks"
-msgstr ""
+msgstr "Coordonnées et autres réseaux sociaux"
-#: ../../Zotlabs/Module/Profiles.php:747
+#: ../../Zotlabs/Module/Profiles.php:786
msgid "My other channels"
msgstr "Mes autres canaux"
-#: ../../Zotlabs/Module/Profiles.php:767 ../../include/channel.php:955
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
+msgstr ""
+
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1060
msgid "Profile Image"
msgstr "Image du profil"
-#: ../../Zotlabs/Module/Profiles.php:777 ../../include/nav.php:88
-#: ../../include/channel.php:937
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1042
+#: ../../include/nav.php:105
msgid "Edit Profiles"
-msgstr "Modifier les profils"
+msgstr "Modifier mes profils"
-#: ../../Zotlabs/Module/Profile_photo.php:179
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement."
+#: ../../Zotlabs/Module/Editwebpage.php:144
+msgid "Page link"
+msgstr "Lien"
-#: ../../Zotlabs/Module/Profile_photo.php:367
-msgid "Upload Profile Photo"
-msgstr "Téléverser une photo de profil"
+#: ../../Zotlabs/Module/Editwebpage.php:171
+msgid "Edit Webpage"
+msgstr "Modifier la page web"
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Identifiant de profil invalide."
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Créer un nouveau canal"
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Éditeur de visibilité de profil"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:201
+msgid "Channel Manager"
+msgstr "Gérer mes canaux"
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1249
-msgid "Profile"
-msgstr "Profil"
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Canal actif"
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Cliquer sur un contact pour l'ajouter ou le retirer."
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Pour changer de canal, sélectionnez-en un"
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Visible par"
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Canal par défaut"
-#: ../../Zotlabs/Module/Pubsites.php:22 ../../include/widgets.php:1270
-msgid "Public Hubs"
-msgstr "Instances publiques"
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Définir comme défaut"
-#: ../../Zotlabs/Module/Pubsites.php:25
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Les sites listés permettent l'enregistrement public de comptes pour le réseau $Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires."
+#: ../../Zotlabs/Module/Manage.php:172
+#, php-format
+msgid "%d new messages"
+msgstr "%d nouveaux messages"
-#: ../../Zotlabs/Module/Pubsites.php:31
-msgid "Hub URL"
-msgstr "URL du site"
+#: ../../Zotlabs/Module/Manage.php:173
+#, php-format
+msgid "%d new introductions"
+msgstr "%d nouvelles relations"
-#: ../../Zotlabs/Module/Pubsites.php:31
-msgid "Access Type"
-msgstr "Type d'accès"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Canaux délégués"
-#: ../../Zotlabs/Module/Pubsites.php:31
-msgid "Registration Policy"
-msgstr "Politique d'inscription"
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Ce serveur d'annuaire requiert un jeton d'accès"
-#: ../../Zotlabs/Module/Pubsites.php:31
-msgid "Stats"
-msgstr ""
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "À propos de ce site"
-#: ../../Zotlabs/Module/Pubsites.php:31
-msgid "Software"
-msgstr ""
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Nom du site"
-#: ../../Zotlabs/Module/Pubsites.php:31 ../../Zotlabs/Module/Ratings.php:103
-#: ../../include/conversation.php:959
-msgid "Ratings"
-msgstr "Evaluations"
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1995
+msgid "Administrator"
+msgstr "Administrateur"
-#: ../../Zotlabs/Module/Pubsites.php:38
-msgid "Rate"
-msgstr "Evaluer"
+#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+msgid "Terms of Service"
+msgstr "Conditions de service"
-#: ../../Zotlabs/Module/Rate.php:160
-msgid "Website:"
-msgstr "Site web&nbsp;:"
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Informations sur le logiciel et le projet"
+
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Ce site est propulsé par "
+
+#: ../../Zotlabs/Module/Siteinfo.php:30
+msgid ""
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Réseau fédéré et décentralisé, et services d'identification fournies par Zot"
-#: ../../Zotlabs/Module/Rate.php:163
+#: ../../Zotlabs/Module/Siteinfo.php:32
#, php-format
-msgid "Remote Channel [%s] (not yet known on this site)"
-msgstr "Canal distant [%s] (encore inconnu sur ce site)"
+msgid "Version %s"
+msgstr "Version %s"
-#: ../../Zotlabs/Module/Rate.php:164
-msgid "Rating (this information is public)"
-msgstr "Evaluation (cette information est publique)"
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Page d'accueil du projet"
-#: ../../Zotlabs/Module/Rate.php:165
-msgid "Optionally explain your rating (this information is public)"
-msgstr "Explication facultative de votre évaluation (cette information est publique)"
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Page d'accueil des développeurs"
-#: ../../Zotlabs/Module/Ratings.php:73
+#: ../../Zotlabs/Module/Ratings.php:70
msgid "No ratings"
msgstr "Pas de note"
-#: ../../Zotlabs/Module/Ratings.php:104
+#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
+#: ../../include/conversation.php:1032
+msgid "Ratings"
+msgstr "Evaluations"
+
+#: ../../Zotlabs/Module/Ratings.php:98
msgid "Rating: "
msgstr "Evaluation&nbsp:"
-#: ../../Zotlabs/Module/Ratings.php:105
+#: ../../Zotlabs/Module/Ratings.php:99
msgid "Website: "
msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Ratings.php:107
+#: ../../Zotlabs/Module/Ratings.php:101
msgid "Description: "
msgstr "Description&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:77
-msgid "Theme settings updated."
-msgstr "Paramètres du thème mis à jour."
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Importer éléments de page web"
-#: ../../Zotlabs/Module/Admin.php:197
-msgid "# Accounts"
-msgstr "# Comptes"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importation sélectionnée"
-#: ../../Zotlabs/Module/Admin.php:198
-msgid "# blocked accounts"
-msgstr "# comptes bloqués"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Exporter éléments de pages web"
-#: ../../Zotlabs/Module/Admin.php:199
-msgid "# expired accounts"
-msgstr "# comptes expirés"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Export sélectionné"
-#: ../../Zotlabs/Module/Admin.php:200
-msgid "# expiring accounts"
-msgstr "# comptes expirant"
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1832
+msgid "Webpages"
+msgstr "Pages web"
-#: ../../Zotlabs/Module/Admin.php:211
-msgid "# Channels"
-msgstr "# Canaux"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Actions"
-#: ../../Zotlabs/Module/Admin.php:212
-msgid "# primary"
-msgstr "# primaire"
+#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Lien vers la page"
-#: ../../Zotlabs/Module/Admin.php:213
-msgid "# clones"
-msgstr "# clones"
+#: ../../Zotlabs/Module/Webpages.php:255
+msgid "Page Title"
+msgstr "Titre de la page"
-#: ../../Zotlabs/Module/Admin.php:219
-msgid "Message queues"
-msgstr "File des messages"
+#: ../../Zotlabs/Module/Webpages.php:285
+msgid "Invalid file type."
+msgstr "Type de fichier invalide"
-#: ../../Zotlabs/Module/Admin.php:236
-msgid "Your software should be updated"
-msgstr ""
+#: ../../Zotlabs/Module/Webpages.php:297
+msgid "Error opening zip file"
+msgstr "Erreur lors de l'ouverture du fichier zip"
-#: ../../Zotlabs/Module/Admin.php:241 ../../Zotlabs/Module/Admin.php:490
-#: ../../Zotlabs/Module/Admin.php:711 ../../Zotlabs/Module/Admin.php:755
-#: ../../Zotlabs/Module/Admin.php:1030 ../../Zotlabs/Module/Admin.php:1209
-#: ../../Zotlabs/Module/Admin.php:1329 ../../Zotlabs/Module/Admin.php:1419
-#: ../../Zotlabs/Module/Admin.php:1612 ../../Zotlabs/Module/Admin.php:1646
-#: ../../Zotlabs/Module/Admin.php:1731
-msgid "Administration"
-msgstr "Administration"
+#: ../../Zotlabs/Module/Webpages.php:308
+msgid "Invalid folder path."
+msgstr "Chemin du dossier invalide"
-#: ../../Zotlabs/Module/Admin.php:242
-msgid "Summary"
-msgstr "Résumé"
+#: ../../Zotlabs/Module/Webpages.php:335
+msgid "No webpage elements detected."
+msgstr "Aucun élément de page Web détecté."
-#: ../../Zotlabs/Module/Admin.php:245
-msgid "Registered accounts"
-msgstr "Comptes enregistrés"
+#: ../../Zotlabs/Module/Webpages.php:410
+msgid "Import complete."
+msgstr "Importation terminée"
-#: ../../Zotlabs/Module/Admin.php:246 ../../Zotlabs/Module/Admin.php:715
-msgid "Pending registrations"
-msgstr "Inscriptions en attente"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Elément non modifiable"
-#: ../../Zotlabs/Module/Admin.php:247
-msgid "Registered channels"
-msgstr "Canaux enregistrés"
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:138
+msgid "Edit post"
+msgstr "Modifier la publication"
-#: ../../Zotlabs/Module/Admin.php:248 ../../Zotlabs/Module/Admin.php:716
-msgid "Active plugins"
-msgstr "Greffons actifs"
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Message non valide"
-#: ../../Zotlabs/Module/Admin.php:249
-msgid "Version"
-msgstr "Version"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "aucun résultat"
-#: ../../Zotlabs/Module/Admin.php:250
-msgid "Repository version (master)"
-msgstr ""
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "Synchro de canal effectuée"
-#: ../../Zotlabs/Module/Admin.php:251
-msgid "Repository version (dev)"
-msgstr ""
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "mis dans la file d'attente"
-#: ../../Zotlabs/Module/Admin.php:373
-msgid "Site settings updated."
-msgstr "Paramètres du site sauvegardés."
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "publié"
-#: ../../Zotlabs/Module/Admin.php:400 ../../include/text.php:2841
-msgid "Default"
-msgstr "Défaut"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "accepté pour la distribution"
-#: ../../Zotlabs/Module/Admin.php:410 ../../Zotlabs/Module/Settings.php:798
-msgid "mobile"
-msgstr "mobile"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "mis à jour"
-#: ../../Zotlabs/Module/Admin.php:412
-msgid "experimental"
-msgstr "expérimental"
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "mise à jour ignorée"
-#: ../../Zotlabs/Module/Admin.php:414
-msgid "unsupported"
-msgstr "non maintenu"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "permission refusée"
-#: ../../Zotlabs/Module/Admin.php:460
-msgid "Yes - with approval"
-msgstr "Oui - avec approbation"
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "destinataire introuvable"
-#: ../../Zotlabs/Module/Admin.php:466
-msgid "My site is not a public server"
-msgstr "Mon site n'est pas un serveur public"
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "courriel rappelé"
-#: ../../Zotlabs/Module/Admin.php:467
-msgid "My site has paid access only"
-msgstr "Mon site est à accès payant uniquement"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "courriel reçu en double"
-#: ../../Zotlabs/Module/Admin.php:468
-msgid "My site has free access only"
-msgstr "Mon site est gratuit uniquement"
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "courriel distribué"
-#: ../../Zotlabs/Module/Admin.php:469
-msgid "My site offers free accounts with optional paid upgrades"
-msgstr "Mon site offre des comptes gratuits avec des améliorations payantes facultatives"
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Rapport de distribution pour %1$s"
-#: ../../Zotlabs/Module/Admin.php:491 ../../include/widgets.php:1382
-msgid "Site"
-msgstr "Site"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Options"
-#: ../../Zotlabs/Module/Admin.php:493 ../../Zotlabs/Module/Register.php:245
-msgid "Registration"
-msgstr "Inscription"
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Transférer à nouveau"
-#: ../../Zotlabs/Module/Admin.php:494
-msgid "File upload"
-msgstr "Envoi de fichier"
+#: ../../Zotlabs/Module/Sources.php:37
+msgid "Failed to create source. No channel selected."
+msgstr "Impossible de créer la source. Aucun canal selectionné."
-#: ../../Zotlabs/Module/Admin.php:495
-msgid "Policies"
-msgstr "Stratégies"
+#: ../../Zotlabs/Module/Sources.php:51
+msgid "Source created."
+msgstr "Source créée."
-#: ../../Zotlabs/Module/Admin.php:496 ../../include/contact_widgets.php:16
-msgid "Advanced"
-msgstr "Avancé"
+#: ../../Zotlabs/Module/Sources.php:64
+msgid "Source updated."
+msgstr "Source mise à jour."
-#: ../../Zotlabs/Module/Admin.php:500
-msgid "Site name"
-msgstr "Nom du site"
+#: ../../Zotlabs/Module/Sources.php:90
+msgid "*"
+msgstr "*"
-#: ../../Zotlabs/Module/Admin.php:501
-msgid "Banner/Logo"
-msgstr "Bannière/logo"
+#: ../../Zotlabs/Module/Sources.php:96
+#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+msgid "Channel Sources"
+msgstr "Sources du canal"
-#: ../../Zotlabs/Module/Admin.php:502
-msgid "Administrator Information"
-msgstr "Informations de l'administrateur"
+#: ../../Zotlabs/Module/Sources.php:97
+msgid "Manage remote sources of content for your channel."
+msgstr "Gérer les sources distantes de contenu pour votre canal."
+
+#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
+msgid "New Source"
+msgstr "Nouvelle source"
-#: ../../Zotlabs/Module/Admin.php:502
+#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
msgid ""
-"Contact information for site administrators. Displayed on siteinfo page. "
-"BBCode can be used here"
-msgstr "Coordonnées de l'administrateur du site. Affichées sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importer le contenu sélectionné ou tout le contenu du canal suivant vers ce canal et le distribuer selon vos paramètres de canal."
-#: ../../Zotlabs/Module/Admin.php:503
-msgid "System language"
-msgstr "Langue du système"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Only import content with these words (one per line)"
+msgstr "N'importer le contenu que s'il contient ces mots (un par ligne)"
-#: ../../Zotlabs/Module/Admin.php:504
-msgid "System theme"
-msgstr "Thème du système"
+#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
+msgid "Leave blank to import all public content"
+msgstr "Laissez vide pour importer tout le contenu public"
-#: ../../Zotlabs/Module/Admin.php:504
+#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
+msgid "Channel Name"
+msgstr "Nom du canal"
+
+#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>"
+"Add the following categories to posts imported from this source (comma "
+"separated)"
+msgstr "Ajouter les catégories suivantes aux publications importées à partir de cette source (séparer par des virgules)"
-#: ../../Zotlabs/Module/Admin.php:505
-msgid "Mobile system theme"
-msgstr "Thème par défaut pour les mobiles"
+#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
+msgid "Source not found."
+msgstr "Source introuvable."
-#: ../../Zotlabs/Module/Admin.php:505
-msgid "Theme for mobile devices"
-msgstr "Thème pour les mobiles"
+#: ../../Zotlabs/Module/Sources.php:140
+msgid "Edit Source"
+msgstr "Modifier la source"
-#: ../../Zotlabs/Module/Admin.php:507
-msgid "Allow Feeds as Connections"
-msgstr "Autoriser les Flux (RSS) comme contacts"
+#: ../../Zotlabs/Module/Sources.php:141
+msgid "Delete Source"
+msgstr "Supprimer la source"
-#: ../../Zotlabs/Module/Admin.php:507
-msgid "(Heavy system resource usage)"
-msgstr "(Impact important sur les ressources)"
+#: ../../Zotlabs/Module/Sources.php:169
+msgid "Source removed"
+msgstr "Source supprimée"
-#: ../../Zotlabs/Module/Admin.php:508
-msgid "Maximum image size"
-msgstr "Taille maximale des images"
+#: ../../Zotlabs/Module/Sources.php:171
+msgid "Unable to remove source."
+msgstr "Impossible de supprimer la source."
+
+#: ../../Zotlabs/Module/Like.php:19
+msgid "Like/Dislike"
+msgstr "Aime/n'aime pas"
-#: ../../Zotlabs/Module/Admin.php:508
+#: ../../Zotlabs/Module/Like.php:24
+msgid "This action is restricted to members."
+msgstr "Cette action est réservée aux membres."
+
+#: ../../Zotlabs/Module/Like.php:25
msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite."
+"Please <a href=\"rmagic\">login with your $Projectname ID</a> or <a "
+"href=\"register\">register as a new $Projectname member</a> to continue."
+msgstr "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de $Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de $Projectname </a> pour continuer."
-#: ../../Zotlabs/Module/Admin.php:509
-msgid "Does this site allow new member registration?"
-msgstr "Est-ce que l'enregistrement de nouveaux membres est autorisé sur ce site&nbsp;?"
+#: ../../Zotlabs/Module/Like.php:105 ../../Zotlabs/Module/Like.php:131
+#: ../../Zotlabs/Module/Like.php:169
+msgid "Invalid request."
+msgstr "Requête invalide."
-#: ../../Zotlabs/Module/Admin.php:510
-msgid "Invitation only"
-msgstr "Sur invitation seulement"
+#: ../../Zotlabs/Module/Like.php:117 ../../include/conversation.php:122
+msgid "channel"
+msgstr "canal"
-#: ../../Zotlabs/Module/Admin.php:510
-msgid ""
-"Only allow new member registrations with an invitation code. Above register "
-"policy must be set to Yes."
-msgstr "N'autoriser que les nouvelles inscriptions avec code d'invitation. La stratégie d'inscription ci-dessus doit être mise sur \"Oui\"."
+#: ../../Zotlabs/Module/Like.php:146
+msgid "thing"
+msgstr "chose"
-#: ../../Zotlabs/Module/Admin.php:511
-msgid "Which best describes the types of account offered by this hub?"
-msgstr "Quelle est la meilleure description des types de comptes proposés sur ce hub&nbsp;?"
+#: ../../Zotlabs/Module/Like.php:192
+msgid "Channel unavailable."
+msgstr "Canal indisponible."
-#: ../../Zotlabs/Module/Admin.php:512
-msgid "Register text"
-msgstr "Texte d'inscription"
+#: ../../Zotlabs/Module/Like.php:240
+msgid "Previous action reversed."
+msgstr "Action précédente annulée."
-#: ../../Zotlabs/Module/Admin.php:512
-msgid "Will be displayed prominently on the registration page."
-msgstr "Sera affiché de manière bien visible sur le formulaire d'inscription."
+#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1823
+#: ../../include/conversation.php:160
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s aime %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:513
-msgid "Site homepage to show visitors (default: login box)"
-msgstr "Page d'accueil du site à montrer aux visiteurs (par défaut&nbsp;:boîte de dialogue de connexion)"
+#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s n'aime pas %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:513
-msgid ""
-"example: 'public' to show public stream, 'page/sys/home' to show a system "
-"webpage called 'home' or 'include:home.html' to include a file."
-msgstr "exemple&nbsp;:'public' pour montrer le flux public, 'page/sys/home' pour montrer une page système appelée 'home' ou 'include:home.html' pour inclure un fichier."
+#: ../../Zotlabs/Module/Like.php:423
+#, php-format
+msgid "%1$s agrees with %2$s's %3$s"
+msgstr "%1$s approuve %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:514
-msgid "Preserve site homepage URL"
-msgstr "Préserver l'adresse d'accueil du site"
+#: ../../Zotlabs/Module/Like.php:425
+#, php-format
+msgid "%1$s doesn't agree with %2$s's %3$s"
+msgstr "%1$s n'est pas d'accord avec %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:514
-msgid ""
-"Present the site homepage in a frame at the original location instead of "
-"redirecting"
-msgstr "Présenter la page d'accueil du site dans un cadre à l'adresse d'origine, plutôt que de rediriger"
+#: ../../Zotlabs/Module/Like.php:427
+#, php-format
+msgid "%1$s abstains from a decision on %2$s's %3$s"
+msgstr "%1$s s'abstient de toute décision sur le %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:515
-msgid "Accounts abandoned after x days"
-msgstr "Les comptes sont abandonnés après x jours"
+#: ../../Zotlabs/Module/Like.php:429
+#, php-format
+msgid "%1$s is attending %2$s's %3$s"
+msgstr "%1$s participe à %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:515
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Eviter de gaspiller les ressources du système en interrogeant des hubs distants pour des canaux abandonnés. Mettez 0 pour ne pas avoir de limite de temps."
+#: ../../Zotlabs/Module/Like.php:431
+#, php-format
+msgid "%1$s is not attending %2$s's %3$s"
+msgstr "%1$s ne participe pas à %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:516
-msgid "Allowed friend domains"
-msgstr "Domaines amicaux autorisés"
+#: ../../Zotlabs/Module/Like.php:433
+#, php-format
+msgid "%1$s may attend %2$s's %3$s"
+msgstr "%1$s participe peut-être à %3$s de %2$s"
-#: ../../Zotlabs/Module/Admin.php:516
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Liste de noms de domaines séparés par des virgules pour lesquels ce site acceptera les demandes d'amitié. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
+#: ../../Zotlabs/Module/Like.php:538
+msgid "Action completed."
+msgstr "Action terminée."
-#: ../../Zotlabs/Module/Admin.php:517
-msgid "Allowed email domains"
-msgstr "Domaines de courriels autorisés"
+#: ../../Zotlabs/Module/Like.php:539
+msgid "Thank you."
+msgstr "Merci."
-#: ../../Zotlabs/Module/Admin.php:517
-msgid ""
-"Comma separated list of domains which are allowed in email addresses for "
-"registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains"
-msgstr "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
+#: ../../Zotlabs/Module/Directory.php:245
+#, php-format
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d évaluation"
+msgstr[1] "%d évaluations"
-#: ../../Zotlabs/Module/Admin.php:518
-msgid "Not allowed email domains"
-msgstr "Domaines de courriel non autorisés"
+#: ../../Zotlabs/Module/Directory.php:256
+msgid "Gender: "
+msgstr "Sexe/genre&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:518
-msgid ""
-"Comma separated list of domains which are not allowed in email addresses for"
-" registrations to this site. Wildcards are accepted. Empty to allow any "
-"domains, unless allowed domains have been defined."
-msgstr "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis."
+#: ../../Zotlabs/Module/Directory.php:258
+msgid "Status: "
+msgstr "État&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:519
-msgid "Verify Email Addresses"
-msgstr "Demander vérification des adresses de courriel"
+#: ../../Zotlabs/Module/Directory.php:260
+msgid "Homepage: "
+msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:519
-msgid ""
-"Check to verify email addresses used in account registration (recommended)."
-msgstr "Cocher pour que les adresses utilisées à l'inscription soient vérifiées (recommandé)."
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1291
+msgid "Age:"
+msgstr "Age&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:520
-msgid "Force publish"
-msgstr "Publicité forcée"
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
+#: ../../include/channel.php:1132 ../../include/event.php:52
+#: ../../include/event.php:84
+msgid "Location:"
+msgstr "Emplacement&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:520
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Cocher pour forcer la publication de tous les profils du site dans l'annuaire."
+#: ../../Zotlabs/Module/Directory.php:320
+msgid "Description:"
+msgstr "Description&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:521
-msgid "Import Public Streams"
-msgstr "Flux publics importés"
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1307
+msgid "Hometown:"
+msgstr "Ville natale&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:521
-msgid ""
-"Import and allow access to public content pulled from other sites. Warning: "
-"this content is unmoderated."
-msgstr "Importer du contenu public à partir d'autres sites et autoriser l'accès à ce contenu. Attention&nbsp;: ce contenu n'est pas modéré."
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1315
+msgid "About:"
+msgstr "À propos&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:522
-msgid "Login on Homepage"
-msgstr ""
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
+#: ../../include/conversation.php:1002 ../../include/channel.php:1117
+#: ../../include/connections.php:110
+msgid "Connect"
+msgstr "Ajouter/Suivre"
-#: ../../Zotlabs/Module/Admin.php:522
-msgid ""
-"Present a login box to visitors on the home page if no other content has "
-"been configured."
-msgstr "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré."
+#: ../../Zotlabs/Module/Directory.php:329
+msgid "Public Forum:"
+msgstr "Forum public&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:523
-msgid "Enable context help"
-msgstr ""
+#: ../../Zotlabs/Module/Directory.php:332
+msgid "Keywords: "
+msgstr "Mots-clefs&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:523
-msgid ""
-"Display contextual help for the current page when the help button is "
-"pressed."
-msgstr ""
+#: ../../Zotlabs/Module/Directory.php:335
+msgid "Don't suggest"
+msgstr "Ne pas suggérer"
-#: ../../Zotlabs/Module/Admin.php:525
-msgid "Directory Server URL"
-msgstr "URL du serveur d'annuaire"
+#: ../../Zotlabs/Module/Directory.php:337
+msgid "Common connections:"
+msgstr "Contacts en commun&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:525
-msgid "Default directory server"
-msgstr "Serveur d'annuaire par défaut"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Global Directory"
+msgstr "Annuaire global"
-#: ../../Zotlabs/Module/Admin.php:527
-msgid "Proxy user"
-msgstr "Utilisateur du proxy"
+#: ../../Zotlabs/Module/Directory.php:386
+msgid "Local Directory"
+msgstr "Annuaire local"
-#: ../../Zotlabs/Module/Admin.php:528
-msgid "Proxy URL"
-msgstr "URL du proxy"
+#: ../../Zotlabs/Module/Directory.php:392
+msgid "Finding:"
+msgstr "Recherche&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:529
-msgid "Network timeout"
-msgstr "Délai maximal du réseau"
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Canaux suggérés"
-#: ../../Zotlabs/Module/Admin.php:529
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (non recommandé)."
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "next page"
+msgstr "page suivante"
-#: ../../Zotlabs/Module/Admin.php:530
-msgid "Delivery interval"
-msgstr "Intervalle de distribution"
+#: ../../Zotlabs/Module/Directory.php:397
+msgid "previous page"
+msgstr "page précédente"
-#: ../../Zotlabs/Module/Admin.php:530
-msgid ""
-"Delay background delivery processes by this many seconds to reduce system "
-"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
-"for large dedicated servers."
-msgstr "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées&nbsp;: 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés."
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "Sort options"
+msgstr "Options de tri"
-#: ../../Zotlabs/Module/Admin.php:531
-msgid "Deliveries per process"
-msgstr "Distributions par processus"
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Alphabetic"
+msgstr "Alphabétique"
-#: ../../Zotlabs/Module/Admin.php:531
-msgid ""
-"Number of deliveries to attempt in a single operating system process. Adjust"
-" if necessary to tune system performance. Recommend: 1-5."
-msgstr "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé&nbsp;:1-5."
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Reverse Alphabetic"
+msgstr "Alphabétique inversé"
-#: ../../Zotlabs/Module/Admin.php:532
-msgid "Poll interval"
-msgstr "Intervalle de scrutation"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Newest to Oldest"
+msgstr "Du plus récent au moins récent"
-#: ../../Zotlabs/Module/Admin.php:532
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr "Temporise le processus de scrutation en tâche de fond de tant de secondes, pour réduire la charge. Si 0, utilise l'intervalle de distribution."
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Oldest to Newest"
+msgstr "Du moins récent du plus récent"
-#: ../../Zotlabs/Module/Admin.php:533
-msgid "Maximum Load Average"
-msgstr "Charge maximale moyenne"
+#: ../../Zotlabs/Module/Directory.php:419
+msgid "No entries (some entries may be hidden)."
+msgstr "Pas d'entrées (certaines peuvent être cachées)."
+
+#: ../../Zotlabs/Module/Xchan.php:10
+msgid "Xchan Lookup"
+msgstr "Recherche xchan"
+
+#: ../../Zotlabs/Module/Xchan.php:13
+msgid "Lookup xchan beginning with (or webbie): "
+msgstr "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:533
+#: ../../Zotlabs/Module/Suggest.php:37
msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50."
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Aucune suggestion disponible. Si le site est récent, merci de re-tenter dans 24 heures."
-#: ../../Zotlabs/Module/Admin.php:534
-msgid "Expiration period in days for imported (grid/network) content"
-msgstr "Délai d'expiration pour le contenu importé (réseau)"
+#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+msgid "Ignore/Hide"
+msgstr "Ignorer/Cacher"
-#: ../../Zotlabs/Module/Admin.php:534
-msgid "0 for no expiration of imported content"
-msgstr "0 pour ne pas expirer le contenu importé"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Impossible de trouver votre hub."
-#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:678
-#: ../../Zotlabs/Module/Settings.php:722
-msgid "Off"
-msgstr "Inactif"
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Publication réussie."
-#: ../../Zotlabs/Module/Admin.php:677 ../../Zotlabs/Module/Admin.php:678
-#: ../../Zotlabs/Module/Settings.php:722
-msgid "On"
-msgstr "Actif"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "Impossible de localiser le destinataire."
-#: ../../Zotlabs/Module/Admin.php:678
-#, php-format
-msgid "Lock feature %s"
-msgstr "Verrouiller fonctionnalité %s"
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "Impossible de communiquer avec le canal demandé."
-#: ../../Zotlabs/Module/Admin.php:686
-msgid "Manage Additional Features"
-msgstr "Gérer les fonctionnalités additionnelles"
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "Impossible de vérifier le canal demandé."
-#: ../../Zotlabs/Module/Admin.php:703
-msgid "No server found"
-msgstr "Serveur introuvable"
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué."
-#: ../../Zotlabs/Module/Admin.php:710 ../../Zotlabs/Module/Admin.php:1046
-msgid "ID"
-msgstr "Identifiant"
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Messages"
-#: ../../Zotlabs/Module/Admin.php:710
-msgid "for channel"
-msgstr "pour le canal"
+#: ../../Zotlabs/Module/Mail.php:213
+msgid "Message recalled."
+msgstr "Message rappelé."
-#: ../../Zotlabs/Module/Admin.php:710
-msgid "on server"
-msgstr "sur le serveur"
+#: ../../Zotlabs/Module/Mail.php:226
+msgid "Conversation removed."
+msgstr "Conversation supprimée."
-#: ../../Zotlabs/Module/Admin.php:712
-msgid "Server"
-msgstr "Serveur"
+#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:362
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Expire le YYYY-MM-DD à HH:MM"
-#: ../../Zotlabs/Module/Admin.php:746
-msgid ""
-"By default, unfiltered HTML is allowed in embedded media. This is inherently"
-" insecure."
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:269
+msgid "Requested channel is not in this network"
+msgstr "Le canal demandé n'est pas sur ce réseau"
-#: ../../Zotlabs/Module/Admin.php:749
-msgid ""
-"The recommended setting is to only allow unfiltered HTML from the following "
-"sites:"
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:277
+msgid "Send Private Message"
+msgstr "Envoyer un message privé"
-#: ../../Zotlabs/Module/Admin.php:750
-msgid ""
-"https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br"
-" />https://vimeo.com/<br />https://soundcloud.com/<br />"
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:415
+msgid "To:"
+msgstr "À&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:751
-msgid ""
-"All other embedded content will be filtered, <strong>unless</strong> "
-"embedded content from that site is explicitly blocked."
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:417
+msgid "Subject:"
+msgstr "Objet&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:756 ../../include/widgets.php:1385
-msgid "Security"
-msgstr "Sécurité"
+#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:423
+#: ../../include/conversation.php:1323
+msgid "Attach file"
+msgstr "Joindre un fichier"
-#: ../../Zotlabs/Module/Admin.php:758
-msgid "Block public"
-msgstr "Bloquer \"public\""
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Send"
+msgstr "Envoyer"
-#: ../../Zotlabs/Module/Admin.php:758
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently authenticated."
-msgstr "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web."
+#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:428
+#: ../../include/conversation.php:1368
+msgid "Set expiration date"
+msgstr "Définir la date d'expiration"
-#: ../../Zotlabs/Module/Admin.php:759
-msgid "Set \"Transport Security\" HTTP header"
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:387
+msgid "Delete message"
+msgstr "Supprimer le message"
-#: ../../Zotlabs/Module/Admin.php:760
-msgid "Set \"Content Security Policy\" HTTP header"
-msgstr ""
+#: ../../Zotlabs/Module/Mail.php:388
+msgid "Delivery report"
+msgstr "Rapport de distribution"
-#: ../../Zotlabs/Module/Admin.php:761
-msgid "Allow communications only from these sites"
-msgstr "N'autorisez que les communications venant de ces sites"
+#: ../../Zotlabs/Module/Mail.php:389
+msgid "Recall message"
+msgstr "Rappeler le message"
+
+#: ../../Zotlabs/Module/Mail.php:391
+msgid "Message has been recalled."
+msgstr "Le message a été rappelé."
+
+#: ../../Zotlabs/Module/Mail.php:408
+msgid "Delete Conversation"
+msgstr "Supprimer la conversation"
-#: ../../Zotlabs/Module/Admin.php:761
+#: ../../Zotlabs/Module/Mail.php:410
msgid ""
-"One site per line. Leave empty to allow communication from anywhere by "
-"default"
-msgstr "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut."
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur."
-#: ../../Zotlabs/Module/Admin.php:762
-msgid "Block communications from these sites"
-msgstr "Bloquer les communications de ces sites"
+#: ../../Zotlabs/Module/Mail.php:414
+msgid "Send Reply"
+msgstr "Envoyer la réponse"
-#: ../../Zotlabs/Module/Admin.php:763
-msgid "Allow communications only from these channels"
-msgstr "N'autoriser que les communications de ces canaux"
+#: ../../Zotlabs/Module/Mail.php:419
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Votre message pour %s (%s)&nbsp;:"
+
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../Zotlabs/Widget/Pubsites.php:12
+msgid "Public Hubs"
+msgstr "Instances publiques"
-#: ../../Zotlabs/Module/Admin.php:763
+#: ../../Zotlabs/Module/Pubsites.php:27
msgid ""
-"One channel (hash) per line. Leave empty to allow from any channel by "
-"default"
-msgstr "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut"
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Les sites listés permettent l'enregistrement public de comptes pour le réseau $Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires."
-#: ../../Zotlabs/Module/Admin.php:764
-msgid "Block communications from these channels"
-msgstr "Bloquer les communications de ces canaux"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "URL du site"
-#: ../../Zotlabs/Module/Admin.php:765
-msgid "Only allow embeds from secure (SSL) websites and links."
-msgstr ""
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Type d'accès"
-#: ../../Zotlabs/Module/Admin.php:766
-msgid "Allow unfiltered embedded HTML content only from these domains"
-msgstr ""
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Politique d'inscription"
-#: ../../Zotlabs/Module/Admin.php:766
-msgid "One site per line. By default embedded content is filtered."
-msgstr ""
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Statistiques"
-#: ../../Zotlabs/Module/Admin.php:767
-msgid "Block embedded HTML from these domains"
-msgstr "Bloquer le HTML embarqué à partir de ces domaines"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Logiciel"
-#: ../../Zotlabs/Module/Admin.php:785
-msgid "Update has been marked successful"
-msgstr "La mise à jour a été marquée comme réussie"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Evaluer"
-#: ../../Zotlabs/Module/Admin.php:795
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "L'éxecution de %s a échoué. Merci de vérifier les journaux du système."
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
+msgstr "pages web"
-#: ../../Zotlabs/Module/Admin.php:798
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "La mise à jour %s a été appliquée avec succès."
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
+msgstr "bloquer"
+
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
+msgstr "mise en page"
+
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
+msgstr "menu"
-#: ../../Zotlabs/Module/Admin.php:802
+#: ../../Zotlabs/Module/Impel.php:181
#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "La mise à jour %s n'a pas retourné d'information. Impossible de savoir si elle a réussi ou non."
+msgid "%s element installed"
+msgstr "Elément %s installé"
-#: ../../Zotlabs/Module/Admin.php:805
+#: ../../Zotlabs/Module/Impel.php:184
#, php-format
-msgid "Update function %s could not be found."
-msgstr "La fonction de mise à jour %s est introuvable."
+msgid "%s element installation failed"
+msgstr "L'installation de l'élément %s a échoué"
-#: ../../Zotlabs/Module/Admin.php:821
-msgid "No failed updates."
-msgstr "Aucune mise à jour défaillante."
+#: ../../Zotlabs/Module/Rbmark.php:94
+msgid "Select a bookmark folder"
+msgstr "Choisir un dossier de favoris"
-#: ../../Zotlabs/Module/Admin.php:825
-msgid "Failed Updates"
-msgstr "Mises à jour défaillantes"
+#: ../../Zotlabs/Module/Rbmark.php:99
+msgid "Save Bookmark"
+msgstr "Enregistrer le favori"
-#: ../../Zotlabs/Module/Admin.php:827
-msgid "Mark success (if update was manually applied)"
-msgstr "Marquer comme réussie (si la mise à jour a été réalisée manuellement)"
+#: ../../Zotlabs/Module/Rbmark.php:100
+msgid "URL of bookmark"
+msgstr "URL du favori"
-#: ../../Zotlabs/Module/Admin.php:828
-msgid "Attempt to execute this update step automatically"
-msgstr "Tenter de réaliser cette étape de mise à jour automatiquement"
+#: ../../Zotlabs/Module/Rbmark.php:105
+msgid "Or enter new bookmark folder name"
+msgstr "Ou entrez un nouveau nom de dossier de favoris"
-#: ../../Zotlabs/Module/Admin.php:859
-msgid "Queue Statistics"
-msgstr "Statistiques de file d'attente"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "Enter a folder name"
+msgstr ""
-#: ../../Zotlabs/Module/Admin.php:860
-msgid "Total Entries"
-msgstr "Nombre d'entrées total"
+#: ../../Zotlabs/Module/Filer.php:52
+msgid "or select an existing folder (doubleclick)"
+msgstr ""
-#: ../../Zotlabs/Module/Admin.php:861
-msgid "Priority"
-msgstr "Priorité"
+#: ../../Zotlabs/Module/Filer.php:54 ../../Zotlabs/Lib/ThreadItem.php:137
+msgid "Save to Folder"
+msgstr "Enregistrer dans le dossier"
-#: ../../Zotlabs/Module/Admin.php:862
-msgid "Destination URL"
-msgstr "URL de destination"
+#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Récupération d'URL échouée&nbsp;: %1$s"
-#: ../../Zotlabs/Module/Admin.php:863
-msgid "Mark hub permanently offline"
-msgstr "Marquer le hub comme étant hors ligne de manière permanente"
+#: ../../Zotlabs/Module/Register.php:49
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain."
-#: ../../Zotlabs/Module/Admin.php:864
-msgid "Empty queue for this hub"
-msgstr "Vider la file d'attente pour ce hub"
+#: ../../Zotlabs/Module/Register.php:55
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué."
-#: ../../Zotlabs/Module/Admin.php:865
-msgid "Last known contact"
-msgstr "Dernier contact connu"
+#: ../../Zotlabs/Module/Register.php:89
+msgid "Passwords do not match."
+msgstr "Les mots de passe ne concordent pas."
-#: ../../Zotlabs/Module/Admin.php:901
-#, php-format
-msgid "%s account blocked/unblocked"
-msgid_plural "%s account blocked/unblocked"
-msgstr[0] "%s compte bloqué/débloqué"
-msgstr[1] "%s comptes bloqués/débloqués"
+#: ../../Zotlabs/Module/Register.php:131
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte."
-#: ../../Zotlabs/Module/Admin.php:908
-#, php-format
-msgid "%s account deleted"
-msgid_plural "%s accounts deleted"
-msgstr[0] "%s compte supprimé"
-msgstr[1] "%s comptes supprimés"
+#: ../../Zotlabs/Module/Register.php:137
+msgid "Your registration is pending approval by the site owner."
+msgstr "Votre inscription est en attente d'approbation par l'administrateur."
-#: ../../Zotlabs/Module/Admin.php:944
-msgid "Account not found"
-msgstr "Compte introuvable"
+#: ../../Zotlabs/Module/Register.php:140
+msgid "Your registration can not be processed."
+msgstr "Votre inscription ne peut être traîtée."
-#: ../../Zotlabs/Module/Admin.php:955
-#, php-format
-msgid "Account '%s' deleted"
-msgstr "Compte '%s' supprimé"
+#: ../../Zotlabs/Module/Register.php:184
+msgid "Registration on this hub is disabled."
+msgstr "La création de nouveaux comptes est désactivée pour ce site."
-#: ../../Zotlabs/Module/Admin.php:963
-#, php-format
-msgid "Account '%s' blocked"
-msgstr "Compte '%s' bloqué"
+#: ../../Zotlabs/Module/Register.php:193
+msgid "Registration on this hub is by approval only."
+msgstr "La création de compte sur ce site est soumise à approbation."
-#: ../../Zotlabs/Module/Admin.php:971
-#, php-format
-msgid "Account '%s' unblocked"
-msgstr "Compte '%s' débloqué"
+#: ../../Zotlabs/Module/Register.php:194
+msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
+msgstr "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>"
-#: ../../Zotlabs/Module/Admin.php:1031 ../../Zotlabs/Module/Admin.php:1044
-#: ../../include/widgets.php:1383
-msgid "Accounts"
-msgstr "Comptes"
+#: ../../Zotlabs/Module/Register.php:204
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain."
-#: ../../Zotlabs/Module/Admin.php:1033 ../../Zotlabs/Module/Admin.php:1212
-msgid "select all"
-msgstr "tout sélectionner"
+#: ../../Zotlabs/Module/Register.php:227
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "J'accepte les %s de ce site"
-#: ../../Zotlabs/Module/Admin.php:1034
-msgid "Registrations waiting for confirm"
-msgstr ""
+#: ../../Zotlabs/Module/Register.php:229
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "J'ai plus de 13 ans et j'accepte les %s de ce site"
-#: ../../Zotlabs/Module/Admin.php:1035
-msgid "Request date"
-msgstr "Date de la demande"
+#: ../../Zotlabs/Module/Register.php:233
+msgid "Your email address"
+msgstr "Votre adresse de courriel"
-#: ../../Zotlabs/Module/Admin.php:1036
-msgid "No registrations."
-msgstr "Pas d'inscriptions."
+#: ../../Zotlabs/Module/Register.php:234
+msgid "Choose a password"
+msgstr "Choisissez un mot de passe"
-#: ../../Zotlabs/Module/Admin.php:1038
-msgid "Deny"
-msgstr "Refuser"
+#: ../../Zotlabs/Module/Register.php:235
+msgid "Please re-enter your password"
+msgstr "Merci de saisir à nouveau votre mot de passe"
-#: ../../Zotlabs/Module/Admin.php:1048 ../../include/group.php:267
-msgid "All Channels"
-msgstr "Tous les canaux"
+#: ../../Zotlabs/Module/Register.php:236
+msgid "Please enter your invitation code"
+msgstr "Merci de saisir votre code d'invitation"
-#: ../../Zotlabs/Module/Admin.php:1049
-msgid "Register date"
-msgstr "Date d'inscription"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "no"
+msgstr "non"
-#: ../../Zotlabs/Module/Admin.php:1050
-msgid "Last login"
-msgstr "Dernière connexion"
+#: ../../Zotlabs/Module/Register.php:241
+msgid "yes"
+msgstr "oui"
-#: ../../Zotlabs/Module/Admin.php:1051
-msgid "Expires"
-msgstr "Expire le"
+#: ../../Zotlabs/Module/Register.php:258
+msgid "Membership on this site is by invitation only."
+msgstr "L'inscription à ce site se fait uniquement sur invitation."
-#: ../../Zotlabs/Module/Admin.php:1052
-msgid "Service Class"
-msgstr "Classe de service"
+#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1612
+#: ../../include/nav.php:145
+msgid "Register"
+msgstr "S'inscrire"
-#: ../../Zotlabs/Module/Admin.php:1054
+#: ../../Zotlabs/Module/Register.php:271
msgid ""
-"Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
-" on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Les comptes sélectionnés seront supprimés&nbsp;!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
+"This site may require email verification after submitting this form. If you "
+"are returned to a login page, please check your email for instructions."
+msgstr "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams."
-#: ../../Zotlabs/Module/Admin.php:1055
-msgid ""
-"The account {0} will be deleted!\\n\\nEverything this account has posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Le compte {0} sera supprimé&nbsp;!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
+#: ../../Zotlabs/Module/Cover_photo.php:136
+#: ../../Zotlabs/Module/Cover_photo.php:186
+msgid "Cover Photos"
+msgstr "Photos de couverture"
-#: ../../Zotlabs/Module/Admin.php:1091
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4286
+msgid "female"
+msgstr "femme"
+
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4287
#, php-format
-msgid "%s channel censored/uncensored"
-msgid_plural "%s channels censored/uncensored"
-msgstr[0] "%s canal censuré/dé-censuré"
-msgstr[1] "%s canaux censurés/dé-censurés"
+msgid "%1$s updated her %2$s"
+msgstr "%1$s a mis à jour son %2$s"
-#: ../../Zotlabs/Module/Admin.php:1100
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4288
+msgid "male"
+msgstr "homme"
+
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4289
#, php-format
-msgid "%s channel code allowed/disallowed"
-msgid_plural "%s channels code allowed/disallowed"
-msgstr[0] "code autorisé/interdit pour %s canal"
-msgstr[1] "code autorisé/interdit pour %s canaux"
+msgid "%1$s updated his %2$s"
+msgstr "%1$s a mis à jour son %2$s"
-#: ../../Zotlabs/Module/Admin.php:1106
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4291
#, php-format
-msgid "%s channel deleted"
-msgid_plural "%s channels deleted"
-msgstr[0] "%s canal supprimé"
-msgstr[1] "%s canaux supprimés"
+msgid "%1$s updated their %2$s"
+msgstr "%1$s a mis a jour sa %2$s"
-#: ../../Zotlabs/Module/Admin.php:1126
-msgid "Channel not found"
-msgstr "Canal introuvable"
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1757
+msgid "cover photo"
+msgstr "Photo principale"
-#: ../../Zotlabs/Module/Admin.php:1136
-#, php-format
-msgid "Channel '%s' deleted"
-msgstr "Canal '%s' supprimé"
+#: ../../Zotlabs/Module/Cover_photo.php:360
+msgid "Upload Cover Photo"
+msgstr "Téléverser une photo de couverture"
-#: ../../Zotlabs/Module/Admin.php:1148
-#, php-format
-msgid "Channel '%s' censored"
-msgstr "Canal '%s' censuré"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Chercher dans la documentation"
-#: ../../Zotlabs/Module/Admin.php:1148
-#, php-format
-msgid "Channel '%s' uncensored"
-msgstr "Canal '%s' non censuré"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1764
+msgid "About"
+msgstr "À propos"
-#: ../../Zotlabs/Module/Admin.php:1159
-#, php-format
-msgid "Channel '%s' code allowed"
-msgstr "Code autorisé pour le canal '%s'"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Administrateurs"
-#: ../../Zotlabs/Module/Admin.php:1159
-#, php-format
-msgid "Channel '%s' code disallowed"
-msgstr "Code interdit pour le canal '%s'"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Développeurs"
-#: ../../Zotlabs/Module/Admin.php:1210 ../../include/widgets.php:1384
-msgid "Channels"
-msgstr "Canaux"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Tutoriels"
-#: ../../Zotlabs/Module/Admin.php:1214
-msgid "Censor"
-msgstr "Censurer"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "Documentation $Projectname"
-#: ../../Zotlabs/Module/Admin.php:1215
-msgid "Uncensor"
-msgstr "Ne plus censurer"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Contenus"
-#: ../../Zotlabs/Module/Admin.php:1216
-msgid "Allow Code"
-msgstr "Autoriser le code"
+#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
+msgid "Tag removed"
+msgstr "Étiquette retirée"
-#: ../../Zotlabs/Module/Admin.php:1217
-msgid "Disallow Code"
-msgstr "Interdire le code"
+#: ../../Zotlabs/Module/Tagrm.php:123
+msgid "Remove Item Tag"
+msgstr "Retirer une étiquette à l'élément"
-#: ../../Zotlabs/Module/Admin.php:1218 ../../include/conversation.php:1611
-msgid "Channel"
-msgstr "Canal"
+#: ../../Zotlabs/Module/Tagrm.php:125
+msgid "Select a tag to remove: "
+msgstr "Étiquette à retirer&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:1222
-msgid "UID"
-msgstr "UID"
+#: ../../Zotlabs/Module/Network.php:96
+msgid "No such group"
+msgstr "Groupe introuvable"
-#: ../../Zotlabs/Module/Admin.php:1226
-msgid ""
-"Selected channels will be deleted!\\n\\nEverything that was posted in these "
-"channels on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Les canaux sélectionnés seront supprimés&nbsp;!\\n\\nTout ce qui a été publié dans ces canaux sur ce site sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?"
+#: ../../Zotlabs/Module/Network.php:136
+msgid "No such channel"
+msgstr "Canal introuvable"
-#: ../../Zotlabs/Module/Admin.php:1227
-msgid ""
-"The channel {0} will be deleted!\\n\\nEverything that was posted in this "
-"channel on this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Le canal {0} sera supprimé&nbsp;!\\n\\nTout ce qui a été publié sur ce canal sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr(e)&nbsp;?"
+#: ../../Zotlabs/Module/Network.php:141
+msgid "forum"
+msgstr "forum"
-#: ../../Zotlabs/Module/Admin.php:1284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Greffon %s désactivé."
+#: ../../Zotlabs/Module/Network.php:153
+msgid "Search Results For:"
+msgstr "Résultats de recherche pour&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:1288
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Greffon %s activé."
+#: ../../Zotlabs/Module/Network.php:221
+msgid "Privacy group is empty"
+msgstr "Groupe de contacts vide"
-#: ../../Zotlabs/Module/Admin.php:1298 ../../Zotlabs/Module/Admin.php:1585
-msgid "Disable"
-msgstr "Désactiver"
+#: ../../Zotlabs/Module/Network.php:230
+msgid "Privacy group: "
+msgstr "Groupe de contacts&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:1301 ../../Zotlabs/Module/Admin.php:1587
-msgid "Enable"
-msgstr "Activer"
+#: ../../Zotlabs/Module/Network.php:256
+msgid "Invalid connection."
+msgstr "Contact non valide."
-#: ../../Zotlabs/Module/Admin.php:1330 ../../Zotlabs/Module/Admin.php:1420
-#: ../../include/widgets.php:1387
-msgid "Plugins"
-msgstr "Greffons"
+#: ../../Zotlabs/Module/Network.php:275 ../../addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Canal invalide."
-#: ../../Zotlabs/Module/Admin.php:1331 ../../Zotlabs/Module/Admin.php:1614
-msgid "Toggle"
-msgstr "(Dés)activer"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
+msgstr "réseau"
-#: ../../Zotlabs/Module/Admin.php:1332 ../../Zotlabs/Module/Admin.php:1615
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/widgets.php:638
-#: ../../include/nav.php:208
-msgid "Settings"
-msgstr "Paramètres"
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
+msgstr "RSS"
-#: ../../Zotlabs/Module/Admin.php:1339 ../../Zotlabs/Module/Admin.php:1624
-msgid "Author: "
-msgstr "Auteur&nbsp;:"
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../addon/opensearch/opensearch.php:42
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Admin.php:1340 ../../Zotlabs/Module/Admin.php:1625
-msgid "Maintainer: "
-msgstr "Maintenu par&nbsp;:"
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bienvenue sur %s"
-#: ../../Zotlabs/Module/Admin.php:1341
-msgid "Minimum project version: "
-msgstr "Version minimum du projet&nbsp;:"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
+msgstr "Permission refusée."
-#: ../../Zotlabs/Module/Admin.php:1342
-msgid "Maximum project version: "
-msgstr "Version maximum du projet&nbsp;:"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
+msgstr "Fichier introuvable."
-#: ../../Zotlabs/Module/Admin.php:1343
-msgid "Minimum PHP version: "
-msgstr "Version minimum de PHP&nbsp;:"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
+msgstr "Modifier les autorisations d'accès au fichier"
-#: ../../Zotlabs/Module/Admin.php:1344
-msgid "Requires: "
-msgstr "Requiert&nbsp;:"
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr "Définir/modifier les autorisations"
-#: ../../Zotlabs/Module/Admin.php:1345 ../../Zotlabs/Module/Admin.php:1425
-msgid "Disabled - version incompatibility"
-msgstr "Désactivé - version incompatible"
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr "Inclure tous fichiers et sous-répertoires"
-#: ../../Zotlabs/Module/Admin.php:1394
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr "Retourner à la liste des fichiers"
-#: ../../Zotlabs/Module/Admin.php:1395
-msgid "Plugin repo git URL"
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiez/collez ce code pour joindre le fichier à une publication"
-#: ../../Zotlabs/Module/Admin.php:1396
-msgid "Custom repo name"
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web"
-#: ../../Zotlabs/Module/Admin.php:1396
-msgid "(optional)"
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr "Partager ce fichier"
-#: ../../Zotlabs/Module/Admin.php:1397
-msgid "Download Plugin Repo"
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr "Montrer l'URL de ce fichier"
-#: ../../Zotlabs/Module/Admin.php:1404
-msgid "Install new repo"
-msgstr ""
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr "Notifier vos contacts à propos de ce fichier"
-#: ../../Zotlabs/Module/Admin.php:1405 ../../Zotlabs/Lib/Apps.php:330
-msgid "Install"
-msgstr "Installer"
+#: ../../Zotlabs/Module/Common.php:14
+msgid "No channel."
+msgstr "Pas de canal."
-#: ../../Zotlabs/Module/Admin.php:1427
-msgid "Manage Repos"
-msgstr ""
+#: ../../Zotlabs/Module/Common.php:43
+msgid "Common connections"
+msgstr "Contacts en commun"
-#: ../../Zotlabs/Module/Admin.php:1428
-msgid "Installed Plugin Repositories"
-msgstr ""
+#: ../../Zotlabs/Module/Common.php:48
+msgid "No connections in common."
+msgstr "Pas de contacts en commun."
-#: ../../Zotlabs/Module/Admin.php:1429
-msgid "Install a New Plugin Repository"
-msgstr ""
+#: ../../Zotlabs/Module/Viewconnections.php:65
+msgid "No connections."
+msgstr "Aucun contact."
-#: ../../Zotlabs/Module/Admin.php:1435 ../../Zotlabs/Module/Settings.php:77
-#: ../../Zotlabs/Module/Settings.php:616 ../../Zotlabs/Lib/Apps.php:330
-msgid "Update"
-msgstr "Mise à jour"
+#: ../../Zotlabs/Module/Viewconnections.php:78
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visiter le profil de %s [%s]"
-#: ../../Zotlabs/Module/Admin.php:1436
-msgid "Switch branch"
-msgstr ""
+#: ../../Zotlabs/Module/Viewconnections.php:107
+msgid "View Connections"
+msgstr "Voir les contacts"
-#: ../../Zotlabs/Module/Admin.php:1550
-msgid "No themes found."
-msgstr "Aucun thème trouvé."
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# Comptes"
-#: ../../Zotlabs/Module/Admin.php:1606
-msgid "Screenshot"
-msgstr "Capture d'écran"
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# comptes bloqués"
-#: ../../Zotlabs/Module/Admin.php:1613 ../../Zotlabs/Module/Admin.php:1647
-#: ../../include/widgets.php:1388
-msgid "Themes"
-msgstr "Thèmes"
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# comptes expirés"
-#: ../../Zotlabs/Module/Admin.php:1652
-msgid "[Experimental]"
-msgstr "[Expérimental]"
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# comptes expirant"
-#: ../../Zotlabs/Module/Admin.php:1653
-msgid "[Unsupported]"
-msgstr "[Non maintenu]"
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Canaux"
-#: ../../Zotlabs/Module/Admin.php:1677
-msgid "Log settings updated."
-msgstr "Paramètres du journal mis à jour."
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primaire"
-#: ../../Zotlabs/Module/Admin.php:1732 ../../include/widgets.php:1409
-#: ../../include/widgets.php:1419
-msgid "Logs"
-msgstr "Journaux"
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# clones"
-#: ../../Zotlabs/Module/Admin.php:1734
-msgid "Clear"
-msgstr "Vider"
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "File des messages"
-#: ../../Zotlabs/Module/Admin.php:1740
-msgid "Debugging"
-msgstr "Débogage"
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Votre logiciel doit d'être mis à jour"
-#: ../../Zotlabs/Module/Admin.php:1741
-msgid "Log file"
-msgstr "Fichier du journal"
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Résumé"
-#: ../../Zotlabs/Module/Admin.php:1741
-msgid ""
-"Must be writable by web server. Relative to your top-level webserver "
-"directory."
-msgstr ""
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Comptes enregistrés"
-#: ../../Zotlabs/Module/Admin.php:1742
-msgid "Log level"
-msgstr "Niveau de journalisation"
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Inscriptions en attente"
-#: ../../Zotlabs/Module/Admin.php:2028
-msgid "New Profile Field"
-msgstr "Nouveau champ de profil"
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Canaux enregistrés"
-#: ../../Zotlabs/Module/Admin.php:2029 ../../Zotlabs/Module/Admin.php:2049
-msgid "Field nickname"
-msgstr "Nom court du champ"
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Greffons actifs"
-#: ../../Zotlabs/Module/Admin.php:2029 ../../Zotlabs/Module/Admin.php:2049
-msgid "System name of field"
-msgstr "Nom système du champ"
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Version"
-#: ../../Zotlabs/Module/Admin.php:2030 ../../Zotlabs/Module/Admin.php:2050
-msgid "Input type"
-msgstr "Type de champ"
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Version du dépôt (maître)"
-#: ../../Zotlabs/Module/Admin.php:2031 ../../Zotlabs/Module/Admin.php:2051
-msgid "Field Name"
-msgstr "Nom du champ"
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Version du dépôt (développeur)"
-#: ../../Zotlabs/Module/Admin.php:2031 ../../Zotlabs/Module/Admin.php:2051
-msgid "Label on profile pages"
-msgstr "Étiquette sur les pages de profil"
+#: ../../Zotlabs/Module/Service_limits.php:23
+msgid "No service class restrictions found."
+msgstr "Aucune restriction de classe de service trouvée."
-#: ../../Zotlabs/Module/Admin.php:2032 ../../Zotlabs/Module/Admin.php:2052
-msgid "Help text"
-msgstr "Aide à la saisie"
+#: ../../Zotlabs/Module/Rate.php:156
+msgid "Website:"
+msgstr "Site web&nbsp;:"
-#: ../../Zotlabs/Module/Admin.php:2032 ../../Zotlabs/Module/Admin.php:2052
-msgid "Additional info (optional)"
-msgstr "Informations additionnelles (facultatif)"
+#: ../../Zotlabs/Module/Rate.php:159
+#, php-format
+msgid "Remote Channel [%s] (not yet known on this site)"
+msgstr "Canal distant [%s] (encore inconnu sur ce site)"
-#: ../../Zotlabs/Module/Admin.php:2042
-msgid "Field definition not found"
-msgstr "Définition du champ introuvable"
+#: ../../Zotlabs/Module/Rate.php:160
+msgid "Rating (this information is public)"
+msgstr "Evaluation (cette information est publique)"
-#: ../../Zotlabs/Module/Admin.php:2048
-msgid "Edit Profile Field"
-msgstr "Modifier le champ de profil"
+#: ../../Zotlabs/Module/Rate.php:161
+msgid "Optionally explain your rating (this information is public)"
+msgstr "Explication facultative de votre évaluation (cette information est publique)"
-#: ../../Zotlabs/Module/Admin.php:2106 ../../include/widgets.php:1390
-msgid "Profile Fields"
-msgstr "Champs de profil"
+#: ../../Zotlabs/Module/Lostpass.php:19
+msgid "No valid account found."
+msgstr "Aucun compte valide trouvé."
-#: ../../Zotlabs/Module/Admin.php:2107
-msgid "Basic Profile Fields"
-msgstr "Champs de profil de base"
+#: ../../Zotlabs/Module/Lostpass.php:33
+msgid "Password reset request issued. Check your email."
+msgstr "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels."
-#: ../../Zotlabs/Module/Admin.php:2108
-msgid "Advanced Profile Fields"
-msgstr "Champs de profil avancés"
+#: ../../Zotlabs/Module/Lostpass.php:39 ../../Zotlabs/Module/Lostpass.php:108
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Membre du site (%s)"
-#: ../../Zotlabs/Module/Admin.php:2108
-msgid "(In addition to basic fields)"
-msgstr "(en plus des champs de base)"
+#: ../../Zotlabs/Module/Lostpass.php:44 ../../Zotlabs/Module/Lostpass.php:49
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Demande de réinitialisation du mot de passe sur %s"
-#: ../../Zotlabs/Module/Admin.php:2110
-msgid "All available fields"
-msgstr "Tous les champs disponibles"
+#: ../../Zotlabs/Module/Lostpass.php:68
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué."
-#: ../../Zotlabs/Module/Admin.php:2111
-msgid "Custom Fields"
-msgstr "Champs personnalisés"
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1639
+msgid "Password Reset"
+msgstr "Réinitialiser le mot de passe"
-#: ../../Zotlabs/Module/Admin.php:2115
-msgid "Create Custom Field"
-msgstr "Créer un champ personnalisé"
+#: ../../Zotlabs/Module/Lostpass.php:92
+msgid "Your password has been reset as requested."
+msgstr "Votre mot de passe a bien été réinitialisé."
-#: ../../Zotlabs/Module/Appman.php:37 ../../Zotlabs/Module/Appman.php:53
-msgid "App installed."
-msgstr "Application installée."
+#: ../../Zotlabs/Module/Lostpass.php:93
+msgid "Your new password is"
+msgstr "Votre nouveau mot de passe est"
-#: ../../Zotlabs/Module/Appman.php:46
-msgid "Malformed app."
-msgstr "Erreur de l'application - Malformée."
+#: ../../Zotlabs/Module/Lostpass.php:94
+msgid "Save or copy your new password - and then"
+msgstr "Enregistrez ou copiez votre nouveau mot de passe, puis"
-#: ../../Zotlabs/Module/Appman.php:104
-msgid "Embed code"
-msgstr "Imbriquer le code"
+#: ../../Zotlabs/Module/Lostpass.php:95
+msgid "click here to login"
+msgstr "cliquez ici pour vous connecter"
-#: ../../Zotlabs/Module/Appman.php:110 ../../include/widgets.php:107
-msgid "Edit App"
-msgstr "Modifier l'application"
+#: ../../Zotlabs/Module/Lostpass.php:96
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté."
-#: ../../Zotlabs/Module/Appman.php:110
-msgid "Create App"
-msgstr "Créer une application"
+#: ../../Zotlabs/Module/Lostpass.php:117
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Votre mot de passe de %s a été changé"
-#: ../../Zotlabs/Module/Appman.php:115
-msgid "Name of app"
-msgstr "Nom de l'application"
+#: ../../Zotlabs/Module/Lostpass.php:130
+msgid "Forgot your Password?"
+msgstr "Mot de passe oublié&nbsp;?"
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Location (URL) of app"
-msgstr "Emplacement (URL) de l'application"
+#: ../../Zotlabs/Module/Lostpass.php:131
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions."
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "Photo icon URL"
-msgstr "URL de l'icône à utiliser pour cette photo"
+#: ../../Zotlabs/Module/Lostpass.php:132
+msgid "Email Address"
+msgstr "Adresse de courriel"
-#: ../../Zotlabs/Module/Appman.php:118
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 pixels - facultatif"
+#: ../../Zotlabs/Module/Lostpass.php:133
+msgid "Reset"
+msgstr "Réinitialiser"
-#: ../../Zotlabs/Module/Appman.php:119
-msgid "Categories (optional, comma separated list)"
-msgstr ""
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:186
+msgid "Mark all system notifications seen"
+msgstr "Marquer toutes les notifications système comme vues"
-#: ../../Zotlabs/Module/Appman.php:120
-msgid "Version ID"
-msgstr "Identifiant de version"
+#: ../../Zotlabs/Lib/Apps.php:212
+msgid "Site Admin"
+msgstr "Administrateur"
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Price of app"
-msgstr "Prix de l'application"
+#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
+msgstr "Reporter des bogues"
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Location (URL) to purchase app"
-msgstr "Emplacement (URL) pour l'achat de l'application"
+#: ../../Zotlabs/Lib/Apps.php:214
+msgid "View Bookmarks"
+msgstr "Voir les marques-pages"
-#: ../../Zotlabs/Module/Rbmark.php:94
-msgid "Select a bookmark folder"
-msgstr "Choisir un dossier de favoris"
+#: ../../Zotlabs/Lib/Apps.php:215
+msgid "My Chatrooms"
+msgstr "Mes salons de discussions"
-#: ../../Zotlabs/Module/Rbmark.php:99
-msgid "Save Bookmark"
-msgstr "Enregistrer le favori"
+#: ../../Zotlabs/Lib/Apps.php:217
+msgid "Firefox Share"
+msgstr "Partager via Firefox"
-#: ../../Zotlabs/Module/Rbmark.php:100
-msgid "URL of bookmark"
-msgstr "URL du favori"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Remote Diagnostics"
+msgstr "Diagnostiques à distance"
-#: ../../Zotlabs/Module/Rbmark.php:105
-msgid "Or enter new bookmark folder name"
-msgstr "Ou entrez un nouveau nom de dossier de favoris"
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
+msgid "Suggest Channels"
+msgstr "Suggérer des canaux"
-#: ../../Zotlabs/Module/Register.php:49
-msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
-msgstr "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain."
+#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1631
+#: ../../include/nav.php:113
+msgid "Login"
+msgstr "Connexion"
-#: ../../Zotlabs/Module/Register.php:55
-msgid ""
-"Please indicate acceptance of the Terms of Service. Registration failed."
-msgstr "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué."
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:172
+msgid "Grid"
+msgstr "Réseau"
-#: ../../Zotlabs/Module/Register.php:89
-msgid "Passwords do not match."
-msgstr "Les mots de passe ne concordent pas."
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1848
+#: ../../include/features.php:99
+msgid "Wiki"
+msgstr "Wiki"
-#: ../../Zotlabs/Module/Register.php:131
-msgid ""
-"Registration successful. Please check your email for validation "
-"instructions."
-msgstr "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte."
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:176
+msgid "Channel Home"
+msgstr "Mon canal"
-#: ../../Zotlabs/Module/Register.php:137
-msgid "Your registration is pending approval by the site owner."
-msgstr "Votre inscription est en attente d'approbation par l'administrateur."
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1793
+#: ../../include/conversation.php:1796 ../../include/nav.php:196
+msgid "Events"
+msgstr "Événements"
-#: ../../Zotlabs/Module/Register.php:140
-msgid "Your registration can not be processed."
-msgstr "Votre inscription ne peut être traîtée."
+#: ../../Zotlabs/Lib/Apps.php:231
+msgid "Directory"
+msgstr "Annuaire"
-#: ../../Zotlabs/Module/Register.php:184
-msgid "Registration on this hub is disabled."
-msgstr "La création de nouveaux comptes est désactivée pour ce site."
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:188
+msgid "Mail"
+msgstr "Messages"
-#: ../../Zotlabs/Module/Register.php:193
-msgid "Registration on this hub is by approval only."
-msgstr "La création de compte sur ce site est soumise à approbation."
+#: ../../Zotlabs/Lib/Apps.php:236
+msgid "Chat"
+msgstr "Clavardage"
-#: ../../Zotlabs/Module/Register.php:194
-msgid "<a href=\"pubsites\">Register at another affiliated hub.</a>"
-msgstr "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>"
+#: ../../Zotlabs/Lib/Apps.php:238
+msgid "Probe"
+msgstr "Sonder"
-#: ../../Zotlabs/Module/Register.php:204
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain."
+#: ../../Zotlabs/Lib/Apps.php:239
+msgid "Suggest"
+msgstr "Suggérer"
-#: ../../Zotlabs/Module/Register.php:215
-msgid "Terms of Service"
-msgstr "Conditions de service"
+#: ../../Zotlabs/Lib/Apps.php:240
+msgid "Random Channel"
+msgstr "Un canal au hasard"
-#: ../../Zotlabs/Module/Register.php:221
-#, php-format
-msgid "I accept the %s for this website"
-msgstr "J'accepte les %s de ce site"
+#: ../../Zotlabs/Lib/Apps.php:241
+msgid "Invite"
+msgstr "Invitation"
-#: ../../Zotlabs/Module/Register.php:223
-#, php-format
-msgid "I am over 13 years of age and accept the %s for this website"
-msgstr "J'ai plus de 13 ans et j'accepte les %s de ce site"
+#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+msgid "Features"
+msgstr "Fonctionalités"
-#: ../../Zotlabs/Module/Register.php:227
-msgid "Your email address"
-msgstr "Votre adresse de courriel"
+#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Langue"
-#: ../../Zotlabs/Module/Register.php:228
-msgid "Choose a password"
-msgstr "Choisissez un mot de passe"
+#: ../../Zotlabs/Lib/Apps.php:244
+msgid "Post"
+msgstr "Envoyer"
-#: ../../Zotlabs/Module/Register.php:229
-msgid "Please re-enter your password"
-msgstr "Merci de saisir à nouveau votre mot de passe"
+#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../addon/openid/MysqlProvider.php:59
+#: ../../addon/openid/MysqlProvider.php:60
+msgid "Profile Photo"
+msgstr "Photo du Profil"
-#: ../../Zotlabs/Module/Register.php:230
-msgid "Please enter your invitation code"
-msgstr "Merci de saisir votre code d'invitation"
+#: ../../Zotlabs/Lib/Apps.php:355
+msgid "Purchase"
+msgstr "Acheter"
-#: ../../Zotlabs/Module/Register.php:236
-msgid "no"
-msgstr "non"
+#: ../../Zotlabs/Lib/Apps.php:359
+msgid "Undelete"
+msgstr "Restaurer"
-#: ../../Zotlabs/Module/Register.php:236
-msgid "yes"
-msgstr "oui"
+#: ../../Zotlabs/Lib/Apps.php:364
+msgid "Add to app-tray"
+msgstr ""
-#: ../../Zotlabs/Module/Register.php:250
-msgid "Membership on this site is by invitation only."
-msgstr "L'inscription à ce site se fait uniquement sur invitation."
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Remove from app-tray"
+msgstr ""
-#: ../../Zotlabs/Module/Register.php:262 ../../include/nav.php:147
-#: ../../boot.php:1685
-msgid "Register"
-msgstr "S'inscrire"
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "défaut"
-#: ../../Zotlabs/Module/Register.php:262
-msgid "Proceed to create your first channel"
-msgstr "Continuer pour créer votre premier canal"
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "abonné"
+
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "contributeur"
+
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "rédacteur"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:31
+#: ../../Zotlabs/Lib/NativeWikiPage.php:72
+msgid "(No Title)"
+msgstr "(Pas de titre)"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:86
+msgid "Wiki page create failed."
+msgstr "Échec de création de la page wiki."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:99
+msgid "Wiki not found."
+msgstr "Wiki introuvable."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:110
+msgid "Destination name already exists"
+msgstr "Le nom de destination est déjà pris"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:136
+#: ../../Zotlabs/Lib/NativeWikiPage.php:331
+msgid "Page not found"
+msgstr "Page introuvable"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:166
+msgid "Error reading page content"
+msgstr "Erreur de lecture du contenu de la page"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:322
+#: ../../Zotlabs/Lib/NativeWikiPage.php:370
+#: ../../Zotlabs/Lib/NativeWikiPage.php:437
+#: ../../Zotlabs/Lib/NativeWikiPage.php:478
+msgid "Error reading wiki"
+msgstr "Erreur de lecture du wiki"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:358
+msgid "Page update failed."
+msgstr "Echec de modification de la page."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:392
+msgid "Nothing deleted"
+msgstr "Rien n'a été supprimé"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:458
+msgid "Compare: object not found."
+msgstr "Comparaison&nbsp;: objet introuvable."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:464
+msgid "Page updated"
+msgstr "Page modifiée"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:467
+msgid "Untitled"
+msgstr "Sans titre"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:473
+msgid "Wiki resource_id required for git commit"
+msgstr "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:529
+#: ../../Zotlabs/Widget/Wiki_page_history.php:23
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Message"
-#: ../../Zotlabs/Module/Regmod.php:15
-msgid "Please login."
-msgstr "Merci de vous connecter."
+#: ../../Zotlabs/Lib/NativeWikiPage.php:567
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
+#: ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Ce texte aura un rendu différent en fonction des utilisateurs"
-#: ../../Zotlabs/Module/Removeaccount.php:34
-msgid ""
-"Account removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte."
+#: ../../Zotlabs/Lib/PermissionDescription.php:34
+#: ../../include/acl_selectors.php:128
+msgid "Visible to your default audience"
+msgstr "Visible pour vos contacts seulement"
-#: ../../Zotlabs/Module/Removeaccount.php:56
-msgid "Remove This Account"
-msgstr "Supprimer ce compte"
+#: ../../Zotlabs/Lib/PermissionDescription.php:107
+#: ../../include/acl_selectors.php:201
+msgid "Only me"
+msgstr "Seulement moi"
-#: ../../Zotlabs/Module/Removeaccount.php:57
-#: ../../Zotlabs/Module/Removeme.php:59
-msgid "WARNING: "
-msgstr "AVERTISSEMENT&nbsp;:"
+#: ../../Zotlabs/Lib/PermissionDescription.php:108
+msgid "Public"
+msgstr "Public"
-#: ../../Zotlabs/Module/Removeaccount.php:57
-msgid ""
-"This account and all its channels will be completely removed from the "
-"network. "
-msgstr "Ce compte et tous ses canaux seront entièrement supprimés du réseau."
+#: ../../Zotlabs/Lib/PermissionDescription.php:109
+msgid "Anybody in the $Projectname network"
+msgstr "N'importe qui dans le réseau de $Projectname"
-#: ../../Zotlabs/Module/Removeaccount.php:57
-#: ../../Zotlabs/Module/Removeme.php:59
-msgid "This action is permanent and can not be undone!"
-msgstr "Cette action est permanente et irréversible&nbsp;!"
+#: ../../Zotlabs/Lib/PermissionDescription.php:110
+#, php-format
+msgid "Any account on %s"
+msgstr "N'importe quel compte sur %s"
-#: ../../Zotlabs/Module/Removeaccount.php:58
-#: ../../Zotlabs/Module/Removeme.php:60
-msgid "Please enter your password for verification:"
-msgstr "Merci de saisir votre mot de passe pour vérification&nbsp;:"
+#: ../../Zotlabs/Lib/PermissionDescription.php:111
+msgid "Any of my connections"
+msgstr "N'importe laquelle de mes connexions"
-#: ../../Zotlabs/Module/Removeaccount.php:59
+#: ../../Zotlabs/Lib/PermissionDescription.php:112
+msgid "Only connections I specifically allow"
+msgstr "Uniquement les connexions que j'ai expréssément autorisées"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:113
+msgid "Anybody authenticated (could include visitors from other networks)"
+msgstr "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:114
+msgid "Any connections including those who haven't yet been approved"
+msgstr "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées"
+
+#: ../../Zotlabs/Lib/PermissionDescription.php:150
msgid ""
-"Remove this account, all its channels and all its channel clones from the "
-"network"
-msgstr "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux."
+"This is your default setting for the audience of your normal stream, and "
+"posts."
+msgstr "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal."
-#: ../../Zotlabs/Module/Removeaccount.php:59
+#: ../../Zotlabs/Lib/PermissionDescription.php:151
msgid ""
-"By default only the instances of the channels located on this hub will be "
-"removed from the network"
-msgstr "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau"
+"This is your default setting for who can view your default channel profile"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut."
-#: ../../Zotlabs/Module/Removeaccount.php:60
-#: ../../Zotlabs/Module/Settings.php:705
-msgid "Remove Account"
-msgstr "Supprimer le compte"
+#: ../../Zotlabs/Lib/PermissionDescription.php:152
+msgid "This is your default setting for who can view your connections"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos relations."
-#: ../../Zotlabs/Module/Removeme.php:33
+#: ../../Zotlabs/Lib/PermissionDescription.php:153
msgid ""
-"Channel removals are not allowed within 48 hours of changing the account "
-"password."
-msgstr "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte."
-
-#: ../../Zotlabs/Module/Removeme.php:58
-msgid "Remove This Channel"
-msgstr "Supprimer ce canal"
+"This is your default setting for who can view your file storage and photos"
+msgstr "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s"
-#: ../../Zotlabs/Module/Removeme.php:59
-msgid "This channel will be completely removed from the network. "
-msgstr "Ce canal sera complètement supprimé du réseau."
+#: ../../Zotlabs/Lib/PermissionDescription.php:154
+msgid "This is your default setting for the audience of your webpages"
+msgstr "Ceci est votre réglage par défaut de l'audience de vos pages web."
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid "Remove this channel and all its clones from the network"
-msgstr "Supprimer ce canal ainsi que tous ses clones sur le réseau"
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Il manque le nom du salon"
-#: ../../Zotlabs/Module/Removeme.php:61
-msgid ""
-"By default only the instance of the channel located on this hub will be "
-"removed from the network"
-msgstr "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau"
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Un salon avec ce nom existe déjà"
-#: ../../Zotlabs/Module/Removeme.php:62 ../../Zotlabs/Module/Settings.php:1124
-msgid "Remove Channel"
-msgstr "Supprimer le canal"
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Identifiant de salon invalide."
-#: ../../Zotlabs/Module/Rmagic.php:44
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Nous avons rencontré un problème avec l'OpenID que vous nous avez fourni. Merci de vérifier que l'ID est correctement saisi."
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Salon introuvable."
-#: ../../Zotlabs/Module/Rmagic.php:44
-msgid "The error message was:"
-msgstr "Le message d'erreur était&nbsp;:"
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "Le salon est plein"
-#: ../../Zotlabs/Module/Rmagic.php:48
-msgid "Authentication failed."
-msgstr "Échec de l'authentification."
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1947
+msgid "$Projectname Notification"
+msgstr "Notification $Projectname"
-#: ../../Zotlabs/Module/Rmagic.php:88
-msgid "Remote Authentication"
-msgstr "Authentification distante"
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
+#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
+#: ../../include/network.php:1948
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../Zotlabs/Module/Rmagic.php:89
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)"
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1950
+msgid "Thank You,"
+msgstr "Merci,"
-#: ../../Zotlabs/Module/Rmagic.php:90
-msgid "Authenticate"
-msgstr "Authentifier"
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1952
+#, php-format
+msgid "%s Administrator"
+msgstr "l'administrateur de %s"
-#: ../../Zotlabs/Module/Search.php:216
+#: ../../Zotlabs/Lib/Enotify.php:116
#, php-format
-msgid "Items tagged with: %s"
-msgstr "Eléments étiquetés avec&nbsp;: %s"
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../Zotlabs/Module/Search.php:218
+#: ../../Zotlabs/Lib/Enotify.php:120
#, php-format
-msgid "Search results for: %s"
-msgstr "Résultats de recherche pour&nbsp;: %s"
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Notify] Nouveau mail reçu sur %s"
-#: ../../Zotlabs/Module/Service_limits.php:23
-msgid "No service class restrictions found."
-msgstr "Aucune restriction de classe de service trouvée."
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, vous avez reçu un message privé sur %3$s, de la part de %2$s."
-#: ../../Zotlabs/Module/Settings.php:69
-msgid "Name is required"
-msgstr "Le nom est requis"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s vous a envoyé %2$s."
-#: ../../Zotlabs/Module/Settings.php:73
-msgid "Key and Secret are required"
-msgstr "Clef et secret sont requis"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "un message privé"
-#: ../../Zotlabs/Module/Settings.php:225
-msgid "Not valid email."
-msgstr "Adresse de courriel non valide."
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Merci de visiter %s pour voir et/ou répondre à vos messages privés."
-#: ../../Zotlabs/Module/Settings.php:228
-msgid "Protected email address. Cannot change to that email."
-msgstr "Adresse de courriel protégée. Impossible de l'utiliser."
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s a commenté sur [zrl=%3$s]%4$s[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:237
-msgid "System failure storing new email. Please try again."
-msgstr "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau."
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s a commenté sur [zrl=%3$s]%5$s de %4$s[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:254
-msgid "Password verification failed."
-msgstr "La vérification du mot de passe a échoué."
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s a commenté [zrl=%3$s]votre %4$s[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:261
-msgid "Passwords do not match. Password unchanged."
-msgstr "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé."
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notify] Commentaire effectué sur la conversation #%1$d par %2$s"
-#: ../../Zotlabs/Module/Settings.php:265
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé."
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s a commenté un élément de conversation que vous suivez."
-#: ../../Zotlabs/Module/Settings.php:279
-msgid "Password changed."
-msgstr "Le mot de passe a été changé."
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
+#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
+#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Merci de visiter %s pour voir et/ou répondre sur cette conversation."
-#: ../../Zotlabs/Module/Settings.php:281
-msgid "Password update failed. Please try again."
-msgstr "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau."
+#: ../../Zotlabs/Lib/Enotify.php:273
+#, php-format
+msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s aiment [zrl=%3$s]votre %4$s[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:525
-msgid "Settings updated."
-msgstr "Paramètres mis à jour."
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notify] Aime reçu à la convesation #%1$d par %2$s"
-#: ../../Zotlabs/Module/Settings.php:589 ../../Zotlabs/Module/Settings.php:615
-#: ../../Zotlabs/Module/Settings.php:651
-msgid "Add application"
-msgstr "Ajouter une application"
+#: ../../Zotlabs/Lib/Enotify.php:289
+#, php-format
+msgid "%1$s, %2$s liked an item/conversation you created."
+msgstr "%1$s, %2$s a aimé un élément ou une conversation que vous avez créée."
-#: ../../Zotlabs/Module/Settings.php:592
-msgid "Name of application"
-msgstr "Nom de l'application"
+#: ../../Zotlabs/Lib/Enotify.php:300
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Notify] %s a publié sur le mur de votre profil"
-#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:619
-msgid "Consumer Key"
-msgstr "Clef client"
+#: ../../Zotlabs/Lib/Enotify.php:302
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s a publié sur votre profil à %3$s"
-#: ../../Zotlabs/Module/Settings.php:593 ../../Zotlabs/Module/Settings.php:594
-msgid "Automatically generated - change if desired. Max length 20"
-msgstr "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."
+#: ../../Zotlabs/Lib/Enotify.php:304
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s a publié sur [zrl=%3$s]votre profil[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:594 ../../Zotlabs/Module/Settings.php:620
-msgid "Consumer Secret"
-msgstr "Secret client"
+#: ../../Zotlabs/Lib/Enotify.php:328
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Notify] %s vous a étiquetté"
-#: ../../Zotlabs/Module/Settings.php:595 ../../Zotlabs/Module/Settings.php:621
-msgid "Redirect"
-msgstr "Redirection"
+#: ../../Zotlabs/Lib/Enotify.php:329
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, vous avez été étiqueté sur %3$s par %2$s"
-#: ../../Zotlabs/Module/Settings.php:595
-msgid ""
-"Redirect URI - leave blank unless your application specifically requires "
-"this"
-msgstr "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"
+#: ../../Zotlabs/Lib/Enotify.php:330
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]vous a étiqueté[/zrl]."
-#: ../../Zotlabs/Module/Settings.php:596 ../../Zotlabs/Module/Settings.php:622
-msgid "Icon url"
-msgstr "URL de l'icône"
+#: ../../Zotlabs/Lib/Enotify.php:342
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Notify] %1$s vous a poké"
-#: ../../Zotlabs/Module/Settings.php:596 ../../Zotlabs/Module/Sources.php:112
-#: ../../Zotlabs/Module/Sources.php:147
-msgid "Optional"
-msgstr "Facultatif"
+#: ../../Zotlabs/Lib/Enotify.php:343
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s vous a tapoté sur %3$s"
-#: ../../Zotlabs/Module/Settings.php:607
-msgid "Application not found."
-msgstr "Application introuvable."
+#: ../../Zotlabs/Lib/Enotify.php:344
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]vous a tapoté[/zrl]."
-#: ../../Zotlabs/Module/Settings.php:650
-msgid "Connected Apps"
-msgstr "Applications connectées"
+#: ../../Zotlabs/Lib/Enotify.php:360
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Notify] %s a étiquetté votre publication"
-#: ../../Zotlabs/Module/Settings.php:654
-msgid "Client key starts with"
-msgstr "La clef partagée commence par"
+#: ../../Zotlabs/Lib/Enotify.php:361
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s a étiqueté votre publication sur %3$s"
-#: ../../Zotlabs/Module/Settings.php:655
-msgid "No name"
-msgstr "Sans nom"
+#: ../../Zotlabs/Lib/Enotify.php:362
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s a étiqueté [zrl=%3$s]votre publication[/zrl]"
-#: ../../Zotlabs/Module/Settings.php:656
-msgid "Remove authorization"
-msgstr "Révoquer l'autorisation"
+#: ../../Zotlabs/Lib/Enotify.php:374
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Notify] Demande de relation reçue"
-#: ../../Zotlabs/Module/Settings.php:669
-msgid "No feature settings configured"
-msgstr "Aucun paramètre de fonctionnalité configuré"
+#: ../../Zotlabs/Lib/Enotify.php:375
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, vous avez reçu une demande de contact de '%2$s' sur %3$s"
-#: ../../Zotlabs/Module/Settings.php:676
-msgid "Feature/Addon Settings"
-msgstr "Paramètres des extensions/greffons"
+#: ../../Zotlabs/Lib/Enotify.php:376
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, vous avez reçu [zrl=%2$s]une demande de contact[/zrl] de %3$s."
-#: ../../Zotlabs/Module/Settings.php:699
-msgid "Account Settings"
-msgstr "Paramètres du compte"
+#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Vous pouvez visiter leur profil sur %s"
-#: ../../Zotlabs/Module/Settings.php:700
-msgid "Current Password"
-msgstr "Mot de passe actuel"
+#: ../../Zotlabs/Lib/Enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Merci de visiter %s avant d'approuver (ou non) cette demande de contact."
-#: ../../Zotlabs/Module/Settings.php:701
-msgid "Enter New Password"
-msgstr "Entrez votre nouveau mot de passe"
+#: ../../Zotlabs/Lib/Enotify.php:389
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Notify] Suggestion d'amitié reçue"
-#: ../../Zotlabs/Module/Settings.php:702
-msgid "Confirm New Password"
-msgstr "Confirmez le nouveau mot de passe"
+#: ../../Zotlabs/Lib/Enotify.php:390
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, vous avez reçu une suggestion d'ami(e) de '%2$s' à %3$s"
-#: ../../Zotlabs/Module/Settings.php:702
-msgid "Leave password fields blank unless changing"
-msgstr "Laissez les mots de passe vides si vous ne voulez pas les modifier"
+#: ../../Zotlabs/Lib/Enotify.php:391
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, avez reçu %3$s comme [zrl=%2$s]une suggestion d'ami(e)[/zrl] de %4$s."
-#: ../../Zotlabs/Module/Settings.php:704
-#: ../../Zotlabs/Module/Settings.php:1041
-msgid "Email Address:"
-msgstr "Adresse de courriel&nbsp;:"
+#: ../../Zotlabs/Lib/Enotify.php:397
+msgid "Name:"
+msgstr "Nom&nbsp;:"
-#: ../../Zotlabs/Module/Settings.php:706
-msgid "Remove this account including all its channels"
-msgstr "Supprimer ce compte et tous ses canaux"
+#: ../../Zotlabs/Lib/Enotify.php:398
+msgid "Photo:"
+msgstr "Photo&nbsp;:"
-#: ../../Zotlabs/Module/Settings.php:729
-msgid "Additional Features"
-msgstr "Fonctionnalités additionnelles"
+#: ../../Zotlabs/Lib/Enotify.php:401
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Merci de visiter %s pour donner suite (ou non) à cette suggestion."
-#: ../../Zotlabs/Module/Settings.php:753
-msgid "Connector Settings"
-msgstr "Paramètres du connecteur"
+#: ../../Zotlabs/Lib/Enotify.php:619
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Notify]"
-#: ../../Zotlabs/Module/Settings.php:792
-msgid "No special theme for mobile devices"
-msgstr "Pas de thème spécifique aux mobiles"
+#: ../../Zotlabs/Lib/Enotify.php:779
+msgid "created a new post"
+msgstr "a publié un nouveau message"
-#: ../../Zotlabs/Module/Settings.php:795
+#: ../../Zotlabs/Lib/Enotify.php:780
#, php-format
-msgid "%s - (Experimental)"
-msgstr "%s - (Expérimental)"
+msgid "commented on %s's post"
+msgstr "a commenté la publication de %s"
-#: ../../Zotlabs/Module/Settings.php:837
-msgid "Display Settings"
-msgstr "Afficher les paramètres"
+#: ../../Zotlabs/Lib/NativeWiki.php:128
+msgid "Wiki files deleted successfully"
+msgstr "Fichiers du wiki supprimés avec succès"
-#: ../../Zotlabs/Module/Settings.php:838
-msgid "Theme Settings"
-msgstr "Paramètres du thème"
+#: ../../Zotlabs/Lib/DB_Upgrade.php:93
+#, php-format
+msgid "Update Error at %s"
+msgstr "Erreur de mise à jour sur %s"
-#: ../../Zotlabs/Module/Settings.php:839
-msgid "Custom Theme Settings"
-msgstr "Paramètres personnels du thème"
+#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur."
-#: ../../Zotlabs/Module/Settings.php:840
-msgid "Content Settings"
-msgstr "Paramètres liés au contenu"
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
+msgid "Private Message"
+msgstr "Message Privé"
-#: ../../Zotlabs/Module/Settings.php:846
-msgid "Display Theme:"
-msgstr "Afficher le thème&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
+msgid "Select"
+msgstr "Sélectionner"
-#: ../../Zotlabs/Module/Settings.php:847
-msgid "Mobile Theme:"
-msgstr "Thème mobile&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:158
+msgid "I will attend"
+msgstr "Je participerai"
-#: ../../Zotlabs/Module/Settings.php:848
-msgid "Preload images before rendering the page"
-msgstr "Pré-charger les images avant d'afficher la page"
+#: ../../Zotlabs/Lib/ThreadItem.php:158
+msgid "I will not attend"
+msgstr "Je ne participerai pas"
-#: ../../Zotlabs/Module/Settings.php:848
-msgid ""
-"The subjective page load time will be longer but the page will be ready when"
-" displayed"
-msgstr "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera"
+#: ../../Zotlabs/Lib/ThreadItem.php:158
+msgid "I might attend"
+msgstr "Je participerai peut-être"
-#: ../../Zotlabs/Module/Settings.php:849
-msgid "Enable user zoom on mobile devices"
-msgstr "Permettre à l'utilisateur d'un mobile d'agrandir le contenu"
+#: ../../Zotlabs/Lib/ThreadItem.php:168
+msgid "I agree"
+msgstr "Je suis d'accord"
-#: ../../Zotlabs/Module/Settings.php:850
-msgid "Update browser every xx seconds"
-msgstr "Mettre à jour le navigateur toutes les xx secondes"
+#: ../../Zotlabs/Lib/ThreadItem.php:168
+msgid "I disagree"
+msgstr "Je ne suis pas d'accord"
-#: ../../Zotlabs/Module/Settings.php:850
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimum 10 secondes, pas de maximum"
+#: ../../Zotlabs/Lib/ThreadItem.php:168
+msgid "I abstain"
+msgstr "Je m'abstiens"
-#: ../../Zotlabs/Module/Settings.php:851
-msgid "Maximum number of conversations to load at any time:"
-msgstr "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:224
+msgid "Add Star"
+msgstr "Mettre de côté (étoile)"
-#: ../../Zotlabs/Module/Settings.php:851
-msgid "Maximum of 100 items"
-msgstr "100 éléments au maximum"
+#: ../../Zotlabs/Lib/ThreadItem.php:225
+msgid "Remove Star"
+msgstr "Ne plus mettre de côté"
-#: ../../Zotlabs/Module/Settings.php:852
-msgid "Show emoticons (smilies) as images"
-msgstr "Remplacer les émoticônes (smileys) par des images"
+#: ../../Zotlabs/Lib/ThreadItem.php:226
+msgid "Toggle Star Status"
+msgstr "(Dés)activer l'étoile"
-#: ../../Zotlabs/Module/Settings.php:853
-msgid "Link post titles to source"
-msgstr "Lier les titres des publications à leur source"
+#: ../../Zotlabs/Lib/ThreadItem.php:230
+msgid "starred"
+msgstr "mis de côté"
-#: ../../Zotlabs/Module/Settings.php:854
-msgid "System Page Layout Editor - (advanced)"
-msgstr "Editeur de mise en page des pages systèmes - (avancé)"
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
+msgid "Message signature validated"
+msgstr "Signature du message validée"
-#: ../../Zotlabs/Module/Settings.php:857
-msgid "Use blog/list mode on channel page"
-msgstr "Utiliser le mode blog/liste sur la page du canal"
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
+msgid "Message signature incorrect"
+msgstr "Signature du message incorrecte"
-#: ../../Zotlabs/Module/Settings.php:857 ../../Zotlabs/Module/Settings.php:858
-msgid "(comments displayed separately)"
-msgstr "(commentaires affichés séparément)"
+#: ../../Zotlabs/Lib/ThreadItem.php:249
+msgid "Add Tag"
+msgstr "Ajouter une étiquette"
-#: ../../Zotlabs/Module/Settings.php:858
-msgid "Use blog/list mode on grid page"
-msgstr "Utiliser le mode blog/liste sur la page du réseau"
+#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
+msgid "like"
+msgstr "aiment"
-#: ../../Zotlabs/Module/Settings.php:859
-msgid "Channel page max height of content (in pixels)"
-msgstr "Hauteur maximale du contenu pour la page du canal (en pixels)"
+#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
+msgid "dislike"
+msgstr "n'aiment pas"
-#: ../../Zotlabs/Module/Settings.php:859 ../../Zotlabs/Module/Settings.php:860
-msgid "click to expand content exceeding this height"
-msgstr "cliquer pour dérouler le contenu dépassant cette limite"
+#: ../../Zotlabs/Lib/ThreadItem.php:274
+msgid "Share This"
+msgstr "Partager"
-#: ../../Zotlabs/Module/Settings.php:860
-msgid "Grid page max height of content (in pixels)"
-msgstr "Hauteur maximale du contenu sur la page du réseau (en pixels)"
+#: ../../Zotlabs/Lib/ThreadItem.php:274
+msgid "share"
+msgstr "partager"
-#: ../../Zotlabs/Module/Settings.php:894
-msgid "Nobody except yourself"
-msgstr "Personne sauf vous"
+#: ../../Zotlabs/Lib/ThreadItem.php:283
+msgid "Delivery Report"
+msgstr "Rapport de distribution"
-#: ../../Zotlabs/Module/Settings.php:895
-msgid "Only those you specifically allow"
-msgstr "Seulement ceux que vous autorisez spécifiquement"
+#: ../../Zotlabs/Lib/ThreadItem.php:301
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commentaire"
+msgstr[1] "%d commentaires"
-#: ../../Zotlabs/Module/Settings.php:896
-msgid "Approved connections"
-msgstr "Contacts approuvés"
+#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Voir le profil de %s - %s"
-#: ../../Zotlabs/Module/Settings.php:897
-msgid "Any connections"
-msgstr "Tous les contacts"
+#: ../../Zotlabs/Lib/ThreadItem.php:334
+msgid "to"
+msgstr "à"
-#: ../../Zotlabs/Module/Settings.php:898
-msgid "Anybody on this website"
-msgstr "Tous les utilisateurs du hub"
+#: ../../Zotlabs/Lib/ThreadItem.php:335
+msgid "via"
+msgstr "via"
-#: ../../Zotlabs/Module/Settings.php:899
-msgid "Anybody in this network"
-msgstr "Tous les utilisateurs sur ce réseau"
+#: ../../Zotlabs/Lib/ThreadItem.php:336
+msgid "Wall-to-Wall"
+msgstr "Mur-à-mur"
-#: ../../Zotlabs/Module/Settings.php:900
-msgid "Anybody authenticated"
-msgstr "Tous les utilisateurs authentifiés"
+#: ../../Zotlabs/Lib/ThreadItem.php:337
+msgid "via Wall-To-Wall:"
+msgstr "par Mur-à-mur&nbsp;:"
-#: ../../Zotlabs/Module/Settings.php:901
-msgid "Anybody on the internet"
-msgstr "Tous les utilisateurs d'Internet"
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
+#, php-format
+msgid "from %s"
+msgstr "de %s"
-#: ../../Zotlabs/Module/Settings.php:976
-msgid "Publish your default profile in the network directory"
-msgstr "Publier votre profil par défaut dans l'annuaire du réseau"
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
+#, php-format
+msgid "last edited: %s"
+msgstr "dernière modification&nbsp;: %s"
-#: ../../Zotlabs/Module/Settings.php:981
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?"
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
+#, php-format
+msgid "Expires: %s"
+msgstr "Expire&nbsp;: %s"
-#: ../../Zotlabs/Module/Settings.php:990
-msgid "Your channel address is"
-msgstr "L'adresse de votre canal est"
+#: ../../Zotlabs/Lib/ThreadItem.php:360
+msgid "Attend"
+msgstr "En attente"
-#: ../../Zotlabs/Module/Settings.php:1032
-msgid "Channel Settings"
-msgstr "Paramètres du canal"
+#: ../../Zotlabs/Lib/ThreadItem.php:361
+msgid "Attendance Options"
+msgstr "Options d'attente"
-#: ../../Zotlabs/Module/Settings.php:1039
-msgid "Basic Settings"
-msgstr "Paramètres standard"
+#: ../../Zotlabs/Lib/ThreadItem.php:362
+msgid "Vote"
+msgstr "Vote"
-#: ../../Zotlabs/Module/Settings.php:1040 ../../include/channel.php:1140
-msgid "Full Name:"
-msgstr "Nom complet&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:363
+msgid "Voting Options"
+msgstr "Options de vote"
-#: ../../Zotlabs/Module/Settings.php:1042
-msgid "Your Timezone:"
-msgstr "Votre fureau horaire&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../addon/bookmarker/bookmarker.php:38
+msgid "Save Bookmarks"
+msgstr "Enregistrer les favoris"
-#: ../../Zotlabs/Module/Settings.php:1043
-msgid "Default Post Location:"
-msgstr "Emplacement de publication par défaut&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:385
+msgid "Add to Calendar"
+msgstr "Ajouter au Calendrier"
-#: ../../Zotlabs/Module/Settings.php:1043
-msgid "Geographical location to display on your posts"
-msgstr "Emplacement géographique à afficher sur vos publications"
+#: ../../Zotlabs/Lib/ThreadItem.php:394
+msgid "Mark all seen"
+msgstr "Tout marquer comme vu"
-#: ../../Zotlabs/Module/Settings.php:1044
-msgid "Use Browser Location:"
-msgstr "Utiliser la géolocalisation du navigateur&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
+#, php-format
+msgid "%s show all"
+msgstr "%s montre tout"
-#: ../../Zotlabs/Module/Settings.php:1046
-msgid "Adult Content"
-msgstr "Contenu \"adulte\""
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
+msgid "Bold"
+msgstr "Gras"
-#: ../../Zotlabs/Module/Settings.php:1046
-msgid ""
-"This channel frequently or regularly publishes adult content. (Please tag "
-"any adult material and/or nudity with #NSFW)"
-msgstr "Ce canal publie plus ou moins fréquemment du contenu pour adultes. (Merci d'indiquer tout contenu pour adulte ou potentiellement choquant avec l'étiquette <em>#NSFW</em> - Not Safe For Work)"
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
+msgid "Italic"
+msgstr "Italique"
-#: ../../Zotlabs/Module/Settings.php:1048
-msgid "Security and Privacy Settings"
-msgstr "Paramètres de sécurité et de confidentialité"
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
+msgid "Underline"
+msgstr "Souligné"
-#: ../../Zotlabs/Module/Settings.php:1051
-msgid "Your permissions are already configured. Click to view/adjust"
-msgstr "Vous permissions sont déjà paramétrées. Cliquer pour voir/ajuster"
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
+msgid "Quote"
+msgstr "Citation"
-#: ../../Zotlabs/Module/Settings.php:1053
-msgid "Hide my online presence"
-msgstr "Cacher ma présence en ligne"
+#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
+msgid "Code"
+msgstr "Code"
-#: ../../Zotlabs/Module/Settings.php:1053
-msgid "Prevents displaying in your profile that you are online"
-msgstr "Cacher votre statut (en ligne/hors ligne) sur votre profil"
+#: ../../Zotlabs/Lib/ThreadItem.php:738
+msgid "Image"
+msgstr "Image"
-#: ../../Zotlabs/Module/Settings.php:1055
-msgid "Simple Privacy Settings:"
-msgstr "Paramètres de confidentialité simplifiés&nbsp;:"
+#: ../../Zotlabs/Lib/ThreadItem.php:739
+msgid "Insert Link"
+msgstr "Insérer un lien"
-#: ../../Zotlabs/Module/Settings.php:1056
-msgid ""
-"Very Public - <em>extremely permissive (should be used with caution)</em>"
-msgstr "Très public - <em>extrèmement permissif (à n'utiliser qu'en connaissance de cause)</em>"
+#: ../../Zotlabs/Lib/ThreadItem.php:740
+msgid "Video"
+msgstr "Vidéo"
-#: ../../Zotlabs/Module/Settings.php:1057
+#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
-"Typical - <em>default public, privacy when desired (similar to social "
-"network permissions but with improved privacy)</em>"
-msgstr "Classique - <em>public par défaut, privé en cas de besoin (comparable aux permissions type réseau social, avec une confidentialité améliorée)</em>"
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer."
-#: ../../Zotlabs/Module/Settings.php:1058
-msgid "Private - <em>default private, never open or public</em>"
-msgstr "Privé - <em>privé par défaut, jamais ouvert ni public</em>"
+#: ../../Zotlabs/Zot/Auth.php:250 ../../addon/openid/Mod_Openid.php:76
+#: ../../addon/openid/Mod_Openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Bienvenue %s. L'authentification distante a fonctionné."
-#: ../../Zotlabs/Module/Settings.php:1059
-msgid "Blocked - <em>default blocked to/from everybody</em>"
-msgstr "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>"
+#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+msgid "parent"
+msgstr "retour"
-#: ../../Zotlabs/Module/Settings.php:1061
-msgid "Allow others to tag your posts"
-msgstr "Autoriser les autres à \"étiqueter\" vos publications"
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2687
+msgid "Collection"
+msgstr "Groupe de contacts"
-#: ../../Zotlabs/Module/Settings.php:1061
-msgid ""
-"Often used by the community to retro-actively flag inappropriate content"
-msgstr "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori "
+#: ../../Zotlabs/Storage/Browser.php:133
+msgid "Principal"
+msgstr "Principal"
-#: ../../Zotlabs/Module/Settings.php:1063
-msgid "Advanced Privacy Settings"
-msgstr "Paramètres de confidentialité avancés"
+#: ../../Zotlabs/Storage/Browser.php:136
+msgid "Addressbook"
+msgstr "Carnet d'adresse"
-#: ../../Zotlabs/Module/Settings.php:1065
-msgid "Expire other channel content after this many days"
-msgstr "Faire expirer le contenu des autres canaux après n jours"
+#: ../../Zotlabs/Storage/Browser.php:139
+msgid "Calendar"
+msgstr "Calendrier"
-#: ../../Zotlabs/Module/Settings.php:1065
-msgid "0 or blank to use the website limit."
-msgstr ""
+#: ../../Zotlabs/Storage/Browser.php:142
+msgid "Schedule Inbox"
+msgstr "Calendrier - Messages entrants"
-#: ../../Zotlabs/Module/Settings.php:1065
-#, php-format
-msgid "This website expires after %d days."
-msgstr ""
+#: ../../Zotlabs/Storage/Browser.php:145
+msgid "Schedule Outbox"
+msgstr "Calendrier - Messages sortants"
-#: ../../Zotlabs/Module/Settings.php:1065
-msgid "This website does not expire imported content."
-msgstr ""
+#: ../../Zotlabs/Storage/Browser.php:225
+msgid "Total"
+msgstr "Total"
-#: ../../Zotlabs/Module/Settings.php:1065
-msgid "The website limit takes precedence if lower than your limit."
-msgstr ""
+#: ../../Zotlabs/Storage/Browser.php:227
+msgid "Shared"
+msgstr "Partagé"
-#: ../../Zotlabs/Module/Settings.php:1066
-msgid "Maximum Friend Requests/Day:"
-msgstr "Nombre maximum de demandes de contact par jour&nbsp;:"
+#: ../../Zotlabs/Storage/Browser.php:301
+#, php-format
+msgid "You are using %1$s of your available file storage."
+msgstr "Vous utilisez %1$s de votre espace de stockage."
-#: ../../Zotlabs/Module/Settings.php:1066
-msgid "May reduce spam activity"
-msgstr "Contribue à réduire l'impact des indésirables"
+#: ../../Zotlabs/Storage/Browser.php:306
+#, php-format
+msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
+msgstr "Vous utilisez %1$s sur %2$s d'espace disponible. (%3$s&#37;)"
-#: ../../Zotlabs/Module/Settings.php:1067
-msgid "Default Post and Publish Permissions"
-msgstr ""
+#: ../../Zotlabs/Storage/Browser.php:317
+msgid "WARNING:"
+msgstr "AVERTISSEMENT&nbsp;:"
-#: ../../Zotlabs/Module/Settings.php:1069
-msgid "Use my default audience setting for the type of object published"
+#: ../../Zotlabs/Storage/Browser.php:327
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
+" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
msgstr ""
-#: ../../Zotlabs/Module/Settings.php:1072
-msgid "Channel permissions category:"
-msgstr "Catégorie de permissions du canal&nbsp;:"
-
-#: ../../Zotlabs/Module/Settings.php:1078
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:"
+#: ../../Zotlabs/Storage/Browser.php:331
+msgid "Create new folder"
+msgstr "Nouveau dossier"
-#: ../../Zotlabs/Module/Settings.php:1078
-msgid "Useful to reduce spamming"
-msgstr "Utile pour réduire les indésirables"
+#: ../../Zotlabs/Storage/Browser.php:333
+msgid "Upload file"
+msgstr "Téléverser un fichier"
-#: ../../Zotlabs/Module/Settings.php:1081
-msgid "Notification Settings"
-msgstr "Paramètres de notification"
+#: ../../Zotlabs/Storage/Browser.php:347
+msgid "Drop files here to immediately upload"
+msgstr "Mettez un fichier ici pour le télécharger immédiatement"
-#: ../../Zotlabs/Module/Settings.php:1082
-msgid "By default post a status message when:"
-msgstr "Par défaut, publier un statut quand&nbsp;:"
+#: ../../Zotlabs/Widget/Forums.php:85
+msgid "Forums"
+msgstr "Forums"
-#: ../../Zotlabs/Module/Settings.php:1083
-msgid "accepting a friend request"
-msgstr "vous acceptez une demande de contact"
+#: ../../Zotlabs/Widget/Appcategories.php:39
+#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+msgid "Categories"
+msgstr "Catégories"
-#: ../../Zotlabs/Module/Settings.php:1084
-msgid "joining a forum/community"
-msgstr "vous rejoignez un forum ou une communauté"
+#: ../../Zotlabs/Widget/Appcategories.php:42 ../../Zotlabs/Widget/Filer.php:31
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Tout"
-#: ../../Zotlabs/Module/Settings.php:1085
-msgid "making an <em>interesting</em> profile change"
-msgstr "vous faîtes une modification <em>intéressante</em> de votre profil"
+#: ../../Zotlabs/Widget/Eventstools.php:13
+msgid "Events Tools"
+msgstr "Outils Evènements"
-#: ../../Zotlabs/Module/Settings.php:1086
-msgid "Send a notification email when:"
-msgstr "Envoyer un courriel de notification quand&nbsp;:"
+#: ../../Zotlabs/Widget/Eventstools.php:14
+msgid "Export Calendar"
+msgstr "Exporter le calendrier"
-#: ../../Zotlabs/Module/Settings.php:1087
-msgid "You receive a connection request"
-msgstr "Vous recevez une demande de contact"
+#: ../../Zotlabs/Widget/Eventstools.php:15
+msgid "Import Calendar"
+msgstr "Importer un calendrier"
-#: ../../Zotlabs/Module/Settings.php:1088
-msgid "Your connections are confirmed"
-msgstr "Vos contacts sont confirmés"
+#: ../../Zotlabs/Widget/Suggestedchats.php:32
+msgid "Suggested Chatrooms"
+msgstr "Salons suggérés"
-#: ../../Zotlabs/Module/Settings.php:1089
-msgid "Someone writes on your profile wall"
-msgstr "Quelqu'un a écrit sur votre mur"
+#: ../../Zotlabs/Widget/Mailmenu.php:13
+msgid "Private Mail Menu"
+msgstr "Menu des messages privés"
-#: ../../Zotlabs/Module/Settings.php:1090
-msgid "Someone writes a followup comment"
-msgstr "Quelqu'un a commenté vos publications"
+#: ../../Zotlabs/Widget/Mailmenu.php:15
+msgid "Combined View"
+msgstr "Vue combinée"
-#: ../../Zotlabs/Module/Settings.php:1091
-msgid "You receive a private message"
-msgstr "Vous recevez un message privé"
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:191
+msgid "Inbox"
+msgstr "Boîte de réception"
-#: ../../Zotlabs/Module/Settings.php:1092
-msgid "You receive a friend suggestion"
-msgstr "Vous recevez une suggestion d'amitié/contact"
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:192
+msgid "Outbox"
+msgstr "Boîte d'envoi"
-#: ../../Zotlabs/Module/Settings.php:1093
-msgid "You are tagged in a post"
-msgstr "Vous êtes étiqueté dans une publication"
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:193
+msgid "New Message"
+msgstr "Nouveau message"
-#: ../../Zotlabs/Module/Settings.php:1094
-msgid "You are poked/prodded/etc. in a post"
-msgstr "Vous êtes tapoté/encouragé/etc. dans une publication"
+#: ../../Zotlabs/Widget/Chatroom_list.php:16
+#: ../../include/conversation.php:1807 ../../include/conversation.php:1810
+msgid "Chatrooms"
+msgstr "Salons de clavardage"
-#: ../../Zotlabs/Module/Settings.php:1097
-msgid "Show visual notifications including:"
-msgstr "Afficher des notifications visuelles y compris&nbsp;:"
+#: ../../Zotlabs/Widget/Chatroom_list.php:20
+msgid "Overview"
+msgstr "Aperçu"
-#: ../../Zotlabs/Module/Settings.php:1099
-msgid "Unseen grid activity"
-msgstr "Activité du réseau pas encore consultée"
+#: ../../Zotlabs/Widget/Rating.php:51
+msgid "Rating Tools"
+msgstr "Outils d'évaluation"
-#: ../../Zotlabs/Module/Settings.php:1100
-msgid "Unseen channel activity"
-msgstr "Activité non vue sur le canal"
+#: ../../Zotlabs/Widget/Rating.php:55 ../../Zotlabs/Widget/Rating.php:57
+msgid "Rate Me"
+msgstr "M'évaluer"
-#: ../../Zotlabs/Module/Settings.php:1101
-msgid "Unseen private messages"
-msgstr "Messages privés non lus"
+#: ../../Zotlabs/Widget/Rating.php:60
+msgid "View Ratings"
+msgstr "Voir mes évaluations"
-#: ../../Zotlabs/Module/Settings.php:1101
-#: ../../Zotlabs/Module/Settings.php:1106
-#: ../../Zotlabs/Module/Settings.php:1107
-#: ../../Zotlabs/Module/Settings.php:1108
-msgid "Recommended"
-msgstr "Recommandé"
+#: ../../Zotlabs/Widget/Activity.php:50
+msgctxt "widget"
+msgid "Activity"
+msgstr ""
-#: ../../Zotlabs/Module/Settings.php:1102
-msgid "Upcoming events"
-msgstr "Événements à venir"
+#: ../../Zotlabs/Widget/Follow.php:22
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Vous avez %1$.0f sur %2$.0f contacts autorisés."
-#: ../../Zotlabs/Module/Settings.php:1103
-msgid "Events today"
-msgstr "Événements aujourd'hui"
+#: ../../Zotlabs/Widget/Follow.php:29
+msgid "Add New Connection"
+msgstr "Ajouter un nouveau contact"
-#: ../../Zotlabs/Module/Settings.php:1104
-msgid "Upcoming birthdays"
-msgstr "Anniversaires à venir"
+#: ../../Zotlabs/Widget/Follow.php:30
+msgid "Enter channel address"
+msgstr "Saisissez l'adresse du canal"
-#: ../../Zotlabs/Module/Settings.php:1104
-msgid "Not available in all themes"
-msgstr "Pas disponible dans tous les thèmes"
+#: ../../Zotlabs/Widget/Follow.php:31
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie"
-#: ../../Zotlabs/Module/Settings.php:1105
-msgid "System (personal) notifications"
-msgstr "Notifications système (personnelles)"
+#: ../../Zotlabs/Widget/Wiki_list.php:15 ../../addon/gitwiki/gitwiki.php:95
+msgid "Wiki List"
+msgstr "Liste de wikis"
-#: ../../Zotlabs/Module/Settings.php:1106
-msgid "System info messages"
-msgstr "Messages d'info système"
+#: ../../Zotlabs/Widget/Archive.php:43
+msgid "Archives"
+msgstr "Archives"
-#: ../../Zotlabs/Module/Settings.php:1107
-msgid "System critical alerts"
-msgstr "Alertes critiques système"
+#: ../../Zotlabs/Widget/Conversations.php:17
+#: ../../Zotlabs/Widget/Conversations.php:29
+msgid "Conversations"
+msgstr "Conversations"
-#: ../../Zotlabs/Module/Settings.php:1108
-msgid "New connections"
-msgstr "Nouveaux contacts"
+#: ../../Zotlabs/Widget/Conversations.php:21
+msgid "Received Messages"
+msgstr "Messages reçus"
-#: ../../Zotlabs/Module/Settings.php:1109
-msgid "System Registrations"
-msgstr "Inscriptions système"
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Sent Messages"
+msgstr "Messages envoyés"
-#: ../../Zotlabs/Module/Settings.php:1110
-msgid ""
-"Also show new wall posts, private messages and connections under Notices"
-msgstr "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications"
+#: ../../Zotlabs/Widget/Conversations.php:39
+msgid "No messages."
+msgstr "Pas de message."
-#: ../../Zotlabs/Module/Settings.php:1112
-msgid "Notify me of events this many days in advance"
-msgstr "Me prévenir d’événements à venir tant de jours en avance"
+#: ../../Zotlabs/Widget/Conversations.php:57
+msgid "Delete conversation"
+msgstr "Supprimer la conversation"
-#: ../../Zotlabs/Module/Settings.php:1112
-msgid "Must be greater than 0"
-msgstr "Doit être supérieur à 0"
+#: ../../Zotlabs/Widget/Chatroom_members.php:11
+msgid "Chat Members"
+msgstr "Membres du salon de discussion"
-#: ../../Zotlabs/Module/Settings.php:1114
-msgid "Advanced Account/Page Type Settings"
-msgstr "Paramètres avancés de compte/type de page"
+#: ../../Zotlabs/Widget/Photo.php:48 ../../Zotlabs/Widget/Photo_rand.php:58
+msgid "photo/image"
+msgstr "photo/image"
-#: ../../Zotlabs/Module/Settings.php:1115
-msgid "Change the behaviour of this account for special situations"
-msgstr "Modifie le comportement de ce compte pour des situations particulières"
+#: ../../Zotlabs/Widget/Savedsearch.php:75
+msgid "Remove term"
+msgstr "Retirer le terme"
-#: ../../Zotlabs/Module/Settings.php:1118
-msgid ""
-"Please enable expert mode (in <a href=\"settings/features\">Settings > "
-"Additional features</a>) to adjust!"
-msgstr "Mode expert requis (<a href=\"settings/features\">Paramètres > Fonctions supplémentaires</a>) pour ajuster&nbsp;!"
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+msgid "Saved Searches"
+msgstr "Recherches sauvegardées"
-#: ../../Zotlabs/Module/Settings.php:1119
-msgid "Miscellaneous Settings"
-msgstr "Paramètres divers"
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+msgid "add"
+msgstr "ajouter"
-#: ../../Zotlabs/Module/Settings.php:1120
-msgid "Default photo upload folder"
-msgstr "Répertoire par défaut pour les photos téléversées"
+#: ../../Zotlabs/Widget/Notes.php:16
+msgid "Notes"
+msgstr "Notes"
-#: ../../Zotlabs/Module/Settings.php:1120
-#: ../../Zotlabs/Module/Settings.php:1121
-msgid "%Y - current year, %m - current month"
-msgstr "%Y - année en cours, %m - mois en cours"
+#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+msgid "Wiki Pages"
+msgstr "Pages wiki"
-#: ../../Zotlabs/Module/Settings.php:1121
-msgid "Default file upload folder"
-msgstr "Répertoire par défaut pour les fichiers téléversés"
+#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+msgid "Add new page"
+msgstr "Ajouter une nouvelle page"
-#: ../../Zotlabs/Module/Settings.php:1123
-msgid "Personal menu to display in your channel pages"
-msgstr "Menu personnel à afficher sur les pages de votre canal"
+#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+msgid "Page name"
+msgstr "Nom de la page"
-#: ../../Zotlabs/Module/Settings.php:1125
-msgid "Remove this channel."
-msgstr "Supprimer ce canal"
+#: ../../Zotlabs/Widget/Affinity.php:49
+msgid "Refresh"
+msgstr "Actualiser"
-#: ../../Zotlabs/Module/Settings.php:1126
-msgid "Firefox Share $Projectname provider"
-msgstr "Connecteur $Projectname pour Firefox Share"
+#: ../../Zotlabs/Widget/Tasklist.php:23
+msgid "Tasks"
+msgstr "Tâches"
-#: ../../Zotlabs/Module/Settings.php:1127
-msgid "Start calendar week on monday"
-msgstr "Commencer la semaine du calendrier le lundi"
+#: ../../Zotlabs/Widget/Suggestions.php:51
+msgid "Suggestions"
+msgstr "Suggestions"
-#: ../../Zotlabs/Module/Setup.php:179
-msgid "$Projectname Server - Setup"
-msgstr "Serveur $Projectname - configuration"
+#: ../../Zotlabs/Widget/Suggestions.php:52
+msgid "See more..."
+msgstr "Voir plus..."
-#: ../../Zotlabs/Module/Setup.php:183
-msgid "Could not connect to database."
-msgstr "Impossible de se connecter à la base de données."
+#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
+msgstr "Dossiers sauvegardés"
-#: ../../Zotlabs/Module/Setup.php:187
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS."
+#: ../../Zotlabs/Widget/Cover_photo.php:54
+msgid "Click to show more"
+msgstr "Cliquer pour voir plus"
-#: ../../Zotlabs/Module/Setup.php:194
-msgid "Could not create table."
-msgstr "Impossible de créer la table."
+#: ../../Zotlabs/Widget/Admin.php:23 ../../Zotlabs/Widget/Admin.php:60
+msgid "Member registrations waiting for confirmation"
+msgstr "Inscriptions en attente d'approbation"
-#: ../../Zotlabs/Module/Setup.php:199
-msgid "Your site database has been installed."
-msgstr "La base de données de votre site a été installée."
+#: ../../Zotlabs/Widget/Admin.php:29
+msgid "Inspect queue"
+msgstr "Analyser la file d'attente"
-#: ../../Zotlabs/Module/Setup.php:203
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin)."
+#: ../../Zotlabs/Widget/Admin.php:31
+msgid "DB updates"
+msgstr "Mises à jour BDD"
-#: ../../Zotlabs/Module/Setup.php:204 ../../Zotlabs/Module/Setup.php:266
-#: ../../Zotlabs/Module/Setup.php:721
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Merci de consulter le fichier \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:211
+msgid "Admin"
+msgstr "Administrateur"
-#: ../../Zotlabs/Module/Setup.php:263
-msgid "System check"
-msgstr "Vérification du système"
+#: ../../Zotlabs/Widget/Admin.php:56
+msgid "Plugin Features"
+msgstr "Fonctionnalités des greffons"
-#: ../../Zotlabs/Module/Setup.php:268
-msgid "Check again"
-msgstr "Re-vérifier"
+#: ../../Zotlabs/Widget/Settings_menu.php:35
+msgid "Account settings"
+msgstr "Paramètres du compte"
-#: ../../Zotlabs/Module/Setup.php:290
-msgid "Database connection"
-msgstr "Connexion à la base de données"
+#: ../../Zotlabs/Widget/Settings_menu.php:41
+msgid "Channel settings"
+msgstr "Paramètres du canal"
-#: ../../Zotlabs/Module/Setup.php:291
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "Pour installer $Projectname, nous avons besoin de savoir comment se connecter à votre base de données."
+#: ../../Zotlabs/Widget/Settings_menu.php:50
+msgid "Additional features"
+msgstr "Fonctionnalités supplémentaires"
-#: ../../Zotlabs/Module/Setup.php:292
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres."
+#: ../../Zotlabs/Widget/Settings_menu.php:57
+msgid "Feature/Addon settings"
+msgstr "Paramètres des extensions/greffons"
-#: ../../Zotlabs/Module/Setup.php:293
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer."
+#: ../../Zotlabs/Widget/Settings_menu.php:63
+msgid "Display settings"
+msgstr "Paramètres d'affichage"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Server Name"
-msgstr "Nom du serveur de base de données"
+#: ../../Zotlabs/Widget/Settings_menu.php:70
+msgid "Manage locations"
+msgstr "Gérer les emplacements"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Default is 127.0.0.1"
-msgstr "Par défaut 127.0.0.1"
+#: ../../Zotlabs/Widget/Settings_menu.php:77
+msgid "Export channel"
+msgstr "Exporter le canal"
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Port"
-msgstr "Port de la base de données"
+#: ../../Zotlabs/Widget/Settings_menu.php:83
+msgid "Connected apps"
+msgstr "Applications connectées"
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Communication port number - use 0 for default"
-msgstr "Numéro TCP du port - utilisez 0 pour la valeur par défaut"
+#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Groupes d'autorisation"
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Login Name"
-msgstr "Identifiant de connexion à la Base de Données"
+#: ../../Zotlabs/Widget/Settings_menu.php:115
+msgid "Premium Channel Settings"
+msgstr "Paramètres de canal VIP"
-#: ../../Zotlabs/Module/Setup.php:300
-msgid "Database Login Password"
-msgstr "Mot de passe de connexion à la Base de Données"
+#: ../../Zotlabs/Widget/Bookmarkedchats.php:24
+msgid "Bookmarked Chatrooms"
+msgstr "Salons favoris"
-#: ../../Zotlabs/Module/Setup.php:301
-msgid "Database Name"
-msgstr "Nom de la Base de Données"
+#: ../../util/nconfig.php:34
+msgid "Source channel not found."
+msgstr "Source du canal introuvable."
-#: ../../Zotlabs/Module/Setup.php:302
-msgid "Database Type"
-msgstr "Type de base de données"
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Recherche %1$s (%2$s)"
-#: ../../Zotlabs/Module/Setup.php:304 ../../Zotlabs/Module/Setup.php:344
-msgid "Site administrator email address"
-msgstr "Adresse de courriel de l'administrateur du site"
+#: ../../boot.php:1164 ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Setup.php:304 ../../Zotlabs/Module/Setup.php:344
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web."
+#: ../../boot.php:1611
+msgid "Create an account to access services and applications"
+msgstr "Créer un compte pour accéder aux services et applications"
-#: ../../Zotlabs/Module/Setup.php:305 ../../Zotlabs/Module/Setup.php:346
-msgid "Website URL"
-msgstr "URL du site web"
+#: ../../boot.php:1630 ../../include/nav.php:99 ../../include/nav.php:123
+msgid "Logout"
+msgstr "Déconnexion"
-#: ../../Zotlabs/Module/Setup.php:305 ../../Zotlabs/Module/Setup.php:346
-msgid "Please use SSL (https) URL if available."
-msgstr "Veuillez utiliser SSL/TLS (https) si disponible."
+#: ../../boot.php:1633
+msgid "Login/Email"
+msgstr "pseudo / email"
-#: ../../Zotlabs/Module/Setup.php:306 ../../Zotlabs/Module/Setup.php:349
-msgid "Please select a default timezone for your website"
-msgstr "Veuillez choisir un fuseau horaire par défaut pour votre site"
+#: ../../boot.php:1634
+msgid "Password"
+msgstr "Mot de passe"
-#: ../../Zotlabs/Module/Setup.php:333
-msgid "Site settings"
-msgstr "Paramètres du site"
+#: ../../boot.php:1635
+msgid "Remember me"
+msgstr "Se souvenir de moi"
-#: ../../Zotlabs/Module/Setup.php:347
-msgid "Enable $Projectname <strong>advanced</strong> features?"
-msgstr "Activer les fonctionnalités <strong>avancées</strong> de $Projectname&nbsp;?"
+#: ../../boot.php:1638
+msgid "Forgot your password?"
+msgstr "Mot de passe oublié&nbsp;?"
-#: ../../Zotlabs/Module/Setup.php:347
-msgid ""
-"Some advanced features, while useful - may be best suited for technically "
-"proficient audiences"
-msgstr "Certaines fonctionnalités avancées, bien qu'utiles, sont plus adaptées aux utilisateurs chevronnés."
+#: ../../boot.php:2176
+msgid "toggle mobile"
+msgstr "(dés)activer mobile"
-#: ../../Zotlabs/Module/Setup.php:388
-msgid "PHP version 5.5 or greater is required."
+#: ../../boot.php:2329
+#, php-format
+msgid "[$Projectname] Website SSL error for %s"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:389
-msgid "PHP version"
+#: ../../boot.php:2334
+msgid "Website SSL certificate is not valid. Please correct."
+msgstr "Le certificat SSL n'est pas valide. Corrigez le."
+
+#: ../../boot.php:2452
+#, php-format
+msgid "[$Projectname] Cron tasks not running on %s"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:404
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Impossible de trouver une version CLI de PHP dans le PATH du serveur web."
+#: ../../boot.php:2457
+msgid "Cron/Scheduled tasks not running."
+msgstr "Les taches planifiées ne tournent pas."
-#: ../../Zotlabs/Module/Setup.php:405
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron."
+#: ../../boot.php:2458 ../../include/datetime.php:286
+msgid "never"
+msgstr "jamais"
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "PHP executable path"
-msgstr "Chemin vers l'éxecutable PHP"
+#: ../../view/theme/redbasic/php/config.php:9
+msgid "Focus (Hubzilla default)"
+msgstr "Focus (par défaut pour Hubzilla)"
-#: ../../Zotlabs/Module/Setup.php:409
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans."
+#: ../../view/theme/redbasic/php/config.php:88
+msgid "Theme settings"
+msgstr "Paramètres du thème"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "Command line PHP"
-msgstr "PHP en ligne de commande (CLI)"
+#: ../../view/theme/redbasic/php/config.php:89
+msgid "Narrow navbar"
+msgstr "Barre de navigation fine"
-#: ../../Zotlabs/Module/Setup.php:423
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée."
+#: ../../view/theme/redbasic/php/config.php:90
+msgid "Navigation bar background color"
+msgstr "Couleur de fond de la barre de navigation"
-#: ../../Zotlabs/Module/Setup.php:424
-msgid "This is required for message delivery to work."
-msgstr "Elle est nécessaire pour la distribution des messages."
+#: ../../view/theme/redbasic/php/config.php:91
+msgid "Navigation bar icon color "
+msgstr "Couleur des icônes de la barre de navigation"
-#: ../../Zotlabs/Module/Setup.php:427
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../view/theme/redbasic/php/config.php:92
+msgid "Navigation bar active icon color "
+msgstr "Couleur de l'icône active de la barre de navigation"
-#: ../../Zotlabs/Module/Setup.php:445
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois."
+#: ../../view/theme/redbasic/php/config.php:93
+msgid "Link color"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:450
-msgid "You can adjust these settings in the servers php.ini."
-msgstr "Vous pouvez ajuster ces paramètres dans le php.ini du serveur."
+#: ../../view/theme/redbasic/php/config.php:94
+msgid "Set font-color for banner"
+msgstr "Définir la couleur du texte de la bannière"
-#: ../../Zotlabs/Module/Setup.php:452
-msgid "PHP upload limits"
-msgstr "Limites de téléversement de PHP"
+#: ../../view/theme/redbasic/php/config.php:95
+msgid "Set the background color"
+msgstr "Définir la couleur d'arrière-plan"
-#: ../../Zotlabs/Module/Setup.php:475
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement"
+#: ../../view/theme/redbasic/php/config.php:96
+msgid "Set the background image"
+msgstr "Définir l'image d'arrière-plan"
-#: ../../Zotlabs/Module/Setup.php:476
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\"."
+#: ../../view/theme/redbasic/php/config.php:97
+msgid "Set the background color of items"
+msgstr "Définir la couleur de fond des contributions"
-#: ../../Zotlabs/Module/Setup.php:479
-msgid "Generate encryption keys"
-msgstr "Générer les clefs de chiffrement"
+#: ../../view/theme/redbasic/php/config.php:98
+msgid "Set the background color of comments"
+msgstr "Couleur de fond des commentaires"
-#: ../../Zotlabs/Module/Setup.php:491
-msgid "libCurl PHP module"
-msgstr "module PHP libCurl"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Set font-size for the entire application"
+msgstr "Définir la taille de police pour l'application entière"
-#: ../../Zotlabs/Module/Setup.php:492
-msgid "GD graphics PHP module"
-msgstr "module PHP GD graphics"
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Examples: 87.5%, 14px"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:493
-msgid "OpenSSL PHP module"
-msgstr "module PHP OpenSSL"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Set font-color for posts and comments"
+msgstr "Définir la couleur de police pour les contributions et commentaires"
-#: ../../Zotlabs/Module/Setup.php:494
-msgid "mysqli or postgres PHP module"
-msgstr "module PHP postgres ou mysqli"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Set radius of corners"
+msgstr "Définir le rayon des arrondis"
-#: ../../Zotlabs/Module/Setup.php:495
-msgid "mb_string PHP module"
-msgstr "module PHP mb_string"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Example: 4px"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:496
-msgid "mcrypt PHP module"
-msgstr "module PHP mcrypt"
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set shadow depth of photos"
+msgstr "Définir la profondeur de l'ombre des photos"
-#: ../../Zotlabs/Module/Setup.php:497
-msgid "xml PHP module"
-msgstr "module PHP xml"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set maximum width of content region in pixel"
+msgstr "Définir la largeur maximale de la zone des contenus"
-#: ../../Zotlabs/Module/Setup.php:501 ../../Zotlabs/Module/Setup.php:503
-msgid "Apache mod_rewrite module"
-msgstr "module Apache mod_rewrite"
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Leave empty for default width"
+msgstr "Laissez vide pour avoir la largeur par défaut"
-#: ../../Zotlabs/Module/Setup.php:501
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Left align page content"
+msgstr "Aligner à gauche le contenu de la page"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set size of conversation author photo"
+msgstr "Définir la taille de la photo de l'auteur d'une conversation"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set size of followup author photos"
+msgstr "Définir la taille de la photo de l'auteur d'une réponse"
+
+#: ../../addon/rendezvous/rendezvous.php:57
+msgid "Errors encountered deleting database table "
+msgstr "Des erreurs ont eu lieu lors de la suppression de la table de la base de données."
+
+#: ../../addon/rendezvous/rendezvous.php:95
+#: ../../addon/twitter/twitter.php:773
+msgid "Submit Settings"
+msgstr "Emvoyer les paramètres"
+
+#: ../../addon/rendezvous/rendezvous.php:96
+msgid "Drop tables when uninstalling?"
+msgstr "Lors de la désinstallation, purger les tables?"
+
+#: ../../addon/rendezvous/rendezvous.php:96
msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé."
+"If checked, the Rendezvous database tables will be deleted when the plugin "
+"is uninstalled."
+msgstr "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé."
-#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:510
-msgid "proc_open"
-msgstr "proc_open"
+#: ../../addon/rendezvous/rendezvous.php:97
+msgid "Mapbox Access Token"
+msgstr "Jeton d'accès à la mapbox."
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../addon/rendezvous/rendezvous.php:97
msgid ""
-"Error: proc_open is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Erreur&nbsp;: proc_open est requis, mais soit n'est pas installé, soit est désactivé dans le php.ini"
+"If you enter a Mapbox access token, it will be used to retrieve map tiles "
+"from Mapbox instead of the default OpenStreetMap tile server."
+msgstr "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap."
-#: ../../Zotlabs/Module/Setup.php:515
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé."
+#: ../../addon/rendezvous/rendezvous.php:162
+msgid "Rendezvous"
+msgstr "Rendezvous"
-#: ../../Zotlabs/Module/Setup.php:519
+#: ../../addon/rendezvous/rendezvous.php:167
msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé."
+"This identity has been deleted by another member due to inactivity. Please "
+"press the \"New identity\" button or refresh the page to register a new "
+"identity. You may use the same name."
+msgstr "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom."
-#: ../../Zotlabs/Module/Setup.php:523
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé."
+#: ../../addon/rendezvous/rendezvous.php:168
+msgid "Welcome to Rendezvous!"
+msgstr "Bienvenue dans Rendevzvous!"
-#: ../../Zotlabs/Module/Setup.php:527
+#: ../../addon/rendezvous/rendezvous.php:169
msgid ""
-"Error: mysqli or postgres PHP module required but neither are installed."
-msgstr "Erreur&nbsp;: un module PHP mysqli ou postgres est requis, mais aucun des deux n'est installé."
+"Enter your name to join this rendezvous. To begin sharing your location with"
+" the other members, tap the GPS control. When your location is discovered, a"
+" red dot will appear and others will be able to see you on the map."
+msgstr "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte."
-#: ../../Zotlabs/Module/Setup.php:531
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé."
+#: ../../addon/rendezvous/rendezvous.php:171
+msgid "Let's meet here"
+msgstr "Rencontrez-vous ici"
-#: ../../Zotlabs/Module/Setup.php:535
-msgid "Error: mcrypt PHP module required but not installed."
-msgstr "Erreur&nbsp;: le module mcrypt de PHP est requis, mais pas installé."
+#: ../../addon/rendezvous/rendezvous.php:174
+msgid "New marker"
+msgstr "Nouveau marqueur"
-#: ../../Zotlabs/Module/Setup.php:539
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé."
+#: ../../addon/rendezvous/rendezvous.php:175
+msgid "Edit marker"
+msgstr "Éditer le marqueur"
-#: ../../Zotlabs/Module/Setup.php:557
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable."
+#: ../../addon/rendezvous/rendezvous.php:176
+msgid "New identity"
+msgstr "Nouvelle identité"
-#: ../../Zotlabs/Module/Setup.php:558
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit."
+#: ../../addon/rendezvous/rendezvous.php:177
+msgid "Delete marker"
+msgstr "Supprimer le marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:178
+msgid "Delete member"
+msgstr "Supprimer le membre"
-#: ../../Zotlabs/Module/Setup.php:559
+#: ../../addon/rendezvous/rendezvous.php:179
+msgid "Edit proximity alert"
+msgstr "Éditer l'alerte de proximité"
+
+#: ../../addon/rendezvous/rendezvous.php:180
msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de $Projectname."
+"A proximity alert will be issued when this member is within a certain radius"
+" of you.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):"
+
+#: ../../addon/rendezvous/rendezvous.php:180
+#: ../../addon/rendezvous/rendezvous.php:185
+msgid "distance"
+msgstr "distance"
-#: ../../Zotlabs/Module/Setup.php:560
+#: ../../addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr "Distance d'alerte de proximité (mètres)"
+
+#: ../../addon/rendezvous/rendezvous.php:182
+#: ../../addon/rendezvous/rendezvous.php:184
msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées."
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:"
-#: ../../Zotlabs/Module/Setup.php:563
-msgid ".htconfig.php is writable"
-msgstr "Le fichier .htconfig.php est accessible en écriture"
+#: ../../addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Alerte de proximité de marqueur"
+
+#: ../../addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Note de rappel"
-#: ../../Zotlabs/Module/Setup.php:577
+#: ../../addon/rendezvous/rendezvous.php:187
msgid ""
-"Red uses the Smarty3 template engine to render its web views. Smarty3 "
-"compiles templates to PHP to speed up rendering."
-msgstr "$Projectname utilise le moteur de gabarits Smarty3 pour mettre son contenu en forme. Smarty3 compile ses modèles vers du PHP natif pour accélérer le rendu."
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Saisissez une note à afficher quand vous serez à la distance indiquée..."
-#: ../../Zotlabs/Module/Setup.php:578
-#, php-format
+#: ../../addon/rendezvous/rendezvous.php:199
+msgid "Add new rendezvous"
+msgstr "Ajouter un nouveau rendezvous"
+
+#: ../../addon/rendezvous/rendezvous.php:200
msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
+"Create a new rendezvous and share the access link with those you wish to "
+"invite to the group. Those who open the link become members of the "
+"rendezvous. They can view other member locations, add markers to the map, or"
+" share their own locations with the group."
+msgstr "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe."
+
+#: ../../addon/skeleton/skeleton.php:59
+msgid "Some setting"
+msgstr "Un certain paramètre"
+
+#: ../../addon/skeleton/skeleton.php:61
+msgid "A setting"
+msgstr "Un paramètre"
+
+#: ../../addon/skeleton/skeleton.php:64
+msgid "Skeleton Settings"
+msgstr "Paramètres du squelette"
+
+#: ../../addon/gnusoc/gnusoc.php:118
+msgid "GNU-Social Protocol Settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:579 ../../Zotlabs/Module/Setup.php:600
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire."
+#: ../../addon/gnusoc/gnusoc.php:129
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:580
-#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient."
+#: ../../addon/gnusoc/gnusoc.php:133
+msgid "GNU-Social Protocol Settings"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:583
+#: ../../addon/gnusoc/gnusoc.php:323
+msgid "Follow"
+msgstr ""
+
+#: ../../addon/gnusoc/gnusoc.php:326
#, php-format
-msgid "%s is writable"
-msgstr "Permission d'écriture sur %s activée"
+msgid "%1$s is now following %2$s"
+msgstr ""
-#: ../../Zotlabs/Module/Setup.php:599
-msgid ""
-"Red uses the store directory to save uploaded files. The web server needs to"
-" have write access to the store directory under the Red top level folder"
-msgstr "$Projectname utilise le répertoire 'store' - situé à la racine de votre installation de $Projectname - pour sauvegarder les fichiers envoyés. Le serveur web aura donc besoin de pouvoir y écrire."
+#: ../../addon/cdav/Mod_Cdav.php:744
+msgid "INVALID EVENT DISMISSED!"
+msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-#: ../../Zotlabs/Module/Setup.php:603
-msgid "store is writable"
-msgstr "'store' est accessible en écriture"
+#: ../../addon/cdav/Mod_Cdav.php:745
+msgid "Summary: "
+msgstr "Sommaire :"
-#: ../../Zotlabs/Module/Setup.php:636
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé)."
+#: ../../addon/cdav/Mod_Cdav.php:746
+msgid "Date: "
+msgstr "Date :"
-#: ../../Zotlabs/Module/Setup.php:637
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!"
+#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
+msgid "Reason: "
+msgstr "Raison :"
-#: ../../Zotlabs/Module/Setup.php:638
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub."
+#: ../../addon/cdav/Mod_Cdav.php:752
+msgid "INVALID CARD DISMISSED!"
+msgstr "ÉVÉNEMENT INVALIDE REJETÉ!"
-#: ../../Zotlabs/Module/Setup.php:639
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité."
+#: ../../addon/cdav/Mod_Cdav.php:753
+msgid "Name: "
+msgstr "Nom :"
-#: ../../Zotlabs/Module/Setup.php:640
+#: ../../addon/cdav/Mod_Cdav.php:770
msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis."
+"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
+"Settings before you can use it."
+msgstr "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser."
-#: ../../Zotlabs/Module/Setup.php:641
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide."
+#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Exemple : YYYY-MM-DD HH:mm"
-#: ../../Zotlabs/Module/Setup.php:643
-msgid "SSL certificate validation"
-msgstr "Validation du certificat SSL/TLS"
+#: ../../addon/cdav/Mod_Cdav.php:837
+msgid "End date and time"
+msgstr "Date et heure de fin"
-#: ../../Zotlabs/Module/Setup.php:649
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:"
+#: ../../addon/cdav/Mod_Cdav.php:852
+msgid "List month"
+msgstr "Liste mois"
-#: ../../Zotlabs/Module/Setup.php:652
-msgid "Url rewrite is working"
-msgstr "La réécriture d'URL fonctionne"
+#: ../../addon/cdav/Mod_Cdav.php:853
+msgid "List week"
+msgstr "Liste semaine"
-#: ../../Zotlabs/Module/Setup.php:661
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web."
+#: ../../addon/cdav/Mod_Cdav.php:854
+msgid "List day"
+msgstr "Liste jour"
-#: ../../Zotlabs/Module/Setup.php:685
-msgid "Errors encountered creating database tables."
-msgstr "Erreurs rencontrées pendant la création de tables de BDD."
+#: ../../addon/cdav/Mod_Cdav.php:861
+msgid "More"
+msgstr "Plus"
-#: ../../Zotlabs/Module/Setup.php:719
-msgid "<h1>What next</h1>"
-msgstr "<h1>Et maintenant</h1>"
+#: ../../addon/cdav/Mod_Cdav.php:862
+msgid "Less"
+msgstr "Moins"
-#: ../../Zotlabs/Module/Setup.php:720
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau."
+#: ../../addon/cdav/Mod_Cdav.php:863
+msgid "Select calendar"
+msgstr "Sélectionner un calendrier"
-#: ../../Zotlabs/Module/Sharedwithme.php:98
-msgid "Files: shared with me"
-msgstr "Fichiers&nbsp;: partagés avec moi"
+#: ../../addon/cdav/Mod_Cdav.php:865
+msgid "Delete all"
+msgstr "Tout supprimer"
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-msgid "NEW"
-msgstr "NOUVEAU"
+#: ../../addon/cdav/Mod_Cdav.php:867
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté."
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-msgid "Remove all files"
-msgstr "Supprimer tous les fichiers"
+#: ../../addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Des erreurs se sont produites lors de la création de la table de la base de données :"
-#: ../../Zotlabs/Module/Sharedwithme.php:104
-msgid "Remove this file"
-msgstr "Supprimer ce fichier"
+#: ../../addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Agenda par défaut"
-#: ../../Zotlabs/Module/Siteinfo.php:19
+#: ../../addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Carnet d'adresses par défaut"
+
+#: ../../addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "Les paramètres CalDAV/CardDAV ont été sauvegardés."
+
+#: ../../addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "Activer le serveur CalDAV/CardDAV pour ce canal"
+
+#: ../../addon/cdav/cdav.php:237
#, php-format
-msgid "Version %s"
-msgstr "Version %s"
+msgid "Your CalDAV resources are located at %s "
+msgstr "Vos ressources CalDAV sont situées à %s"
-#: ../../Zotlabs/Module/Siteinfo.php:40
-msgid "Installed plugins/addons/apps:"
-msgstr "Greffons/extensions/applications installés&nbsp;:"
+#: ../../addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Vos ressources CardDAV sont situées à %s"
-#: ../../Zotlabs/Module/Siteinfo.php:53
-msgid "No installed plugins/addons/apps"
-msgstr "Aucun greffon/extension/application installé"
+#: ../../addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "Paramètres CalDAV/CardDAV"
-#: ../../Zotlabs/Module/Siteinfo.php:66
-msgid ""
-"This is a hub of $Projectname - a global cooperative network of "
-"decentralized privacy enhanced websites."
-msgstr "Ceci est un serveur $Projectname - un réseau collaboratif mondial de serveurs décentralisés à la confidentialité améliorée."
+#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
+msgid "Home, Voice"
+msgstr "Domicile, Voix"
-#: ../../Zotlabs/Module/Siteinfo.php:68
-msgid "Tag: "
-msgstr "Étiquette&nbsp;:"
+#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
+msgid "Home, Fax"
+msgstr "Domicile, Fax"
-#: ../../Zotlabs/Module/Siteinfo.php:70
-msgid "Last background fetch: "
-msgstr "Dernière récupération en tâche de fond&nbsp;:"
+#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
+msgid "Work, Voice"
+msgstr "Travail, Voix"
-#: ../../Zotlabs/Module/Siteinfo.php:72
-msgid "Current load average: "
-msgstr "Charge moyenne actuelle&nbsp;:"
+#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
+msgid "Work, Fax"
+msgstr "Travail, Fax"
-#: ../../Zotlabs/Module/Siteinfo.php:75
-msgid "Running at web location"
-msgstr "Tourne à l'adresse internet"
+#: ../../addon/cdav/include/widgets.php:37
+msgid "Select Channel"
+msgstr "Sélectionner un canal"
-#: ../../Zotlabs/Module/Siteinfo.php:76
-msgid ""
-"Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more "
-"about $Projectname."
-msgstr "Merci de visiter <a href=\"http://hubzilla.org\">hubzilla.org</a> pour en apprendre davantage sur $Projectname."
+#: ../../addon/cdav/include/widgets.php:42
+msgid "Read-write"
+msgstr "Lire et écrire"
-#: ../../Zotlabs/Module/Siteinfo.php:77
-msgid "Bug reports and issues: please visit"
-msgstr "Pour remonter bogues et problèmes, merci de visiter"
+#: ../../addon/cdav/include/widgets.php:43
+msgid "Read-only"
+msgstr "Lire uniquement"
-#: ../../Zotlabs/Module/Siteinfo.php:79
-msgid "$projectname issues"
-msgstr "Problèmes $projectname"
+#: ../../addon/cdav/include/widgets.php:116
+msgid "My Calendars"
+msgstr "Mes agendas"
-#: ../../Zotlabs/Module/Siteinfo.php:80
-msgid ""
-"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
-"com"
-msgstr "Suggestions, demandes, etc. - merci de vous adresser à \"redmatrix\" à librelist - point com"
+#: ../../addon/cdav/include/widgets.php:118
+msgid "Shared Calendars"
+msgstr "Agendas partagés"
-#: ../../Zotlabs/Module/Siteinfo.php:82
-msgid "Site Administrators"
-msgstr "Administrateurs du site"
+#: ../../addon/cdav/include/widgets.php:122
+msgid "Share this calendar"
+msgstr "Partager cet agenda"
-#: ../../Zotlabs/Module/Sources.php:37
-msgid "Failed to create source. No channel selected."
-msgstr "Impossible de créer la source. Aucun canal selectionné."
+#: ../../addon/cdav/include/widgets.php:124
+msgid "Calendar name and color"
+msgstr "Nom et couleur de l'agenda"
-#: ../../Zotlabs/Module/Sources.php:51
-msgid "Source created."
-msgstr "Source créée."
+#: ../../addon/cdav/include/widgets.php:126
+msgid "Create new calendar"
+msgstr "Créer un nouvel agenda"
-#: ../../Zotlabs/Module/Sources.php:64
-msgid "Source updated."
-msgstr "Source mise à jour."
+#: ../../addon/cdav/include/widgets.php:128
+msgid "Calendar Name"
+msgstr "Nom de l'agenda"
-#: ../../Zotlabs/Module/Sources.php:90
-msgid "*"
-msgstr "*"
+#: ../../addon/cdav/include/widgets.php:129
+msgid "Calendar Tools"
+msgstr "Outils pour les agendas"
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:630
-#: ../../include/features.php:71
-msgid "Channel Sources"
-msgstr "Sources du canal"
+#: ../../addon/cdav/include/widgets.php:130
+msgid "Import calendar"
+msgstr "Importer un agenda"
-#: ../../Zotlabs/Module/Sources.php:97
-msgid "Manage remote sources of content for your channel."
-msgstr "Gérer les sources distantes de contenu pour votre canal."
+#: ../../addon/cdav/include/widgets.php:131
+msgid "Select a calendar to import to"
+msgstr "Sélectionner un agenda à importer dans"
-#: ../../Zotlabs/Module/Sources.php:98 ../../Zotlabs/Module/Sources.php:108
-msgid "New Source"
-msgstr "Nouvelle source"
+#: ../../addon/cdav/include/widgets.php:158
+msgid "Addressbooks"
+msgstr "Carnet d'adresses"
-#: ../../Zotlabs/Module/Sources.php:109 ../../Zotlabs/Module/Sources.php:143
-msgid ""
-"Import all or selected content from the following channel into this channel "
-"and distribute it according to your channel settings."
-msgstr "Importer le contenu sélectionné ou tout le contenu du canal suivant vers ce canal et le distribuer selon vos paramètres de canal."
+#: ../../addon/cdav/include/widgets.php:160
+msgid "Addressbook name"
+msgstr "Nom du carnet d'adresses"
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Only import content with these words (one per line)"
-msgstr "N'importer le contenu que s'il contient ces mots (un par ligne)"
+#: ../../addon/cdav/include/widgets.php:162
+msgid "Create new addressbook"
+msgstr "Créer un nouveau carnet d'adresses"
-#: ../../Zotlabs/Module/Sources.php:110 ../../Zotlabs/Module/Sources.php:144
-msgid "Leave blank to import all public content"
-msgstr "Laissez vide pour importer tout le contenu public"
+#: ../../addon/cdav/include/widgets.php:163
+msgid "Addressbook Name"
+msgstr "Nom du carnet d'adresses"
-#: ../../Zotlabs/Module/Sources.php:111 ../../Zotlabs/Module/Sources.php:148
-msgid "Channel Name"
-msgstr "Nom du canal"
+#: ../../addon/cdav/include/widgets.php:165
+msgid "Addressbook Tools"
+msgstr "Outils pour les carnets d'adresses"
-#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
-msgid ""
-"Add the following categories to posts imported from this source (comma "
-"separated)"
-msgstr ""
+#: ../../addon/cdav/include/widgets.php:166
+msgid "Import addressbook"
+msgstr "Importer un carnet d'adresses"
-#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
-msgid "Source not found."
-msgstr "Source introuvable."
+#: ../../addon/cdav/include/widgets.php:167
+msgid "Select an addressbook to import to"
+msgstr "Sélectionner un carnet d'adresses à importer dans"
-#: ../../Zotlabs/Module/Sources.php:140
-msgid "Edit Source"
-msgstr "Modifier la source"
+#: ../../addon/planets/planets.php:121
+msgid "Planets Settings updated."
+msgstr "Paramètres Planets mis à jour."
-#: ../../Zotlabs/Module/Sources.php:141
-msgid "Delete Source"
-msgstr "Supprimer la source"
+#: ../../addon/planets/planets.php:153
+msgid "Enable Planets Plugin"
+msgstr "Activer le plugin Planets"
-#: ../../Zotlabs/Module/Sources.php:169
-msgid "Source removed"
-msgstr "Source supprimée"
+#: ../../addon/planets/planets.php:157
+msgid "Planets Settings"
+msgstr "Paramètres Planets"
-#: ../../Zotlabs/Module/Sources.php:171
-msgid "Unable to remove source."
-msgstr "Impossible de supprimer la source."
+#: ../../addon/openclipatar/openclipatar.php:50
+#: ../../addon/openclipatar/openclipatar.php:128
+msgid "System defaults:"
+msgstr "Paramètres par défaut du système :"
-#: ../../Zotlabs/Module/Subthread.php:118
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s suit %3$s de %2$s"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "Preferred Clipart IDs"
+msgstr "ID Clipart préférées"
-#: ../../Zotlabs/Module/Subthread.php:120
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s ne suit plus %3$s de %2$s"
+#: ../../addon/openclipatar/openclipatar.php:54
+msgid "List of preferred clipart ids. These will be shown first."
+msgstr "Liste des ids clipart préférése. Celles-ci seront montrées en premier."
-#: ../../Zotlabs/Module/Suggest.php:39
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Aucune suggestion disponible. Si le site est récent, merci de re-tenter dans 24 heures."
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "Default Search Term"
+msgstr "Terme de recherche par défaut"
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:149
-msgid "Ignore/Hide"
-msgstr "Ignorer/Cacher"
+#: ../../addon/openclipatar/openclipatar.php:55
+msgid "The default search term. These will be shown second."
+msgstr "Le terme de recherche par défaut. Ceci sera affiché en second."
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:256
-msgid "post"
-msgstr "publication"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Return After"
+msgstr "Retourner ensuite"
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
-#: ../../include/conversation.php:150
-msgid "comment"
-msgstr "commentaire"
+#: ../../addon/openclipatar/openclipatar.php:56
+msgid "Page to load after image selection."
+msgstr "Page à afficher après la sélection de l'image."
-#: ../../Zotlabs/Module/Tagger.php:100
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s a étiqueté le %3$s de %2$s avec %4$s"
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1046
+#: ../../include/nav.php:107
+msgid "Edit Profile"
+msgstr "Éditeur de profil"
-#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
-msgid "Tag removed"
-msgstr "Étiquette retirée"
+#: ../../addon/openclipatar/openclipatar.php:59
+msgid "Profile List"
+msgstr "Liste de profil"
-#: ../../Zotlabs/Module/Tagrm.php:123
-msgid "Remove Item Tag"
-msgstr "Retirer une étiquette à l'élément"
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Order of Preferred"
+msgstr "Tri selon les préférences"
-#: ../../Zotlabs/Module/Tagrm.php:125
-msgid "Select a tag to remove: "
-msgstr "Étiquette à retirer&nbsp;:"
+#: ../../addon/openclipatar/openclipatar.php:61
+msgid "Sort order of preferred clipart ids."
+msgstr "Ordre de tri des ids de clipart préférés."
-#: ../../Zotlabs/Module/Thing.php:114
-msgid "Thing updated"
-msgstr "Elément mis à jour"
+#: ../../addon/openclipatar/openclipatar.php:62
+#: ../../addon/openclipatar/openclipatar.php:68
+msgid "Newest first"
+msgstr "Les plus récents en premier"
-#: ../../Zotlabs/Module/Thing.php:166
-msgid "Object store: failed"
-msgstr "Stockage de l'objet&nbsp;: échec"
+#: ../../addon/openclipatar/openclipatar.php:65
+msgid "As entered"
+msgstr "Comme entrés"
-#: ../../Zotlabs/Module/Thing.php:170
-msgid "Thing added"
-msgstr "Elément ajouté"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Order of other"
+msgstr "Tri selon autre"
-#: ../../Zotlabs/Module/Thing.php:196
-#, php-format
-msgid "OBJ: %1$s %2$s %3$s"
-msgstr "OBJ: %1$s %2$s %3$s"
+#: ../../addon/openclipatar/openclipatar.php:67
+msgid "Sort order of other clipart ids."
+msgstr "Ordre de tri des autres clipart ids."
-#: ../../Zotlabs/Module/Thing.php:259
-msgid "Show Thing"
-msgstr "Montrer élément"
+#: ../../addon/openclipatar/openclipatar.php:69
+msgid "Most downloaded first"
+msgstr "Les plus téléchargés en premier"
-#: ../../Zotlabs/Module/Thing.php:266
-msgid "item not found."
-msgstr "élément introuvable."
+#: ../../addon/openclipatar/openclipatar.php:70
+msgid "Most liked first"
+msgstr "Les plus aimés en premier"
-#: ../../Zotlabs/Module/Thing.php:299
-msgid "Edit Thing"
-msgstr "Modifier élément"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Preferred IDs Message"
+msgstr "IDs des messages préférés"
-#: ../../Zotlabs/Module/Thing.php:301 ../../Zotlabs/Module/Thing.php:351
-msgid "Select a profile"
-msgstr "Choisissez un profil"
+#: ../../addon/openclipatar/openclipatar.php:72
+msgid "Message to display above preferred results."
+msgstr "Message à afficher au-dessus de la liste des résultats préférés."
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
-msgid "Post an activity"
-msgstr "Publier une activité"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Uploaded by: "
+msgstr "Téléversé par :"
-#: ../../Zotlabs/Module/Thing.php:305 ../../Zotlabs/Module/Thing.php:354
-msgid "Only sends to viewers of the applicable profile"
-msgstr "Envoie exclusivement aux visiteurs du profil concerné"
+#: ../../addon/openclipatar/openclipatar.php:78
+msgid "Drawn by: "
+msgstr "Dessiné par :"
-#: ../../Zotlabs/Module/Thing.php:307 ../../Zotlabs/Module/Thing.php:356
-msgid "Name of thing e.g. something"
-msgstr "Nom de l'élément, p.ex. quelque-chose"
+#: ../../addon/openclipatar/openclipatar.php:192
+msgid "Or select from a free OpenClipart.org image:"
+msgstr "ou sélectionner une image libre d'OpenClipart.org :"
-#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:357
-msgid "URL of thing (optional)"
-msgstr "URL de l'élément (facultatif)"
+#: ../../addon/openclipatar/openclipatar.php:195
+msgid "Search Term"
+msgstr "Terme de recherche"
-#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:358
-msgid "URL for photo of thing (optional)"
-msgstr "URL d'une photo de l'élément (facultatif)"
+#: ../../addon/openclipatar/openclipatar.php:232
+msgid "Unknown error. Please try again later."
+msgstr "Erreur inconnue. Veuillez essayer à nouveau plus tard."
-#: ../../Zotlabs/Module/Thing.php:349
-msgid "Add Thing to your Profile"
-msgstr "Ajouter l'élément à votre profil"
+#: ../../addon/openclipatar/openclipatar.php:308
+msgid "Profile photo updated successfully."
+msgstr "Photo de profil actualisée avec succès."
-#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
-msgid "Export Channel"
-msgstr "Exporter le canal"
+#: ../../addon/adultphotoflag/adultphotoflag.php:24
+msgid "Flag Adult Photos"
+msgstr "Photo pour adulte"
-#: ../../Zotlabs/Module/Uexport.php:57
+#: ../../addon/adultphotoflag/adultphotoflag.php:25
msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus."
+"Provide photo edit option to hide inappropriate photos from default album "
+"view"
+msgstr "Fourni l'option d'édition d'une photo afin de cacher des photos inappropriées de la vue d''album par défaut"
-#: ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Content"
-msgstr "Exporter le contenu"
+#: ../../addon/wppost/wppost.php:45
+msgid "Post to WordPress"
+msgstr "Publier sur Wordpress"
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence."
+#: ../../addon/wppost/wppost.php:82
+msgid "Enable WordPress Post Plugin"
+msgstr "Activer l'extension de publication WordPress"
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export your posts from a given year."
-msgstr "Exporter vos publications d'une année en particulier"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress username"
+msgstr "Identifiant de connexion WordPress"
-#: ../../Zotlabs/Module/Uexport.php:62
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit."
+#: ../../addon/wppost/wppost.php:90
+msgid "WordPress password"
+msgstr "Mot de passe de connexion WordPress"
-#: ../../Zotlabs/Module/Uexport.php:63
-#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1$s\">%2$s</a>"
+#: ../../addon/wppost/wppost.php:94
+msgid "WordPress API URL"
+msgstr "URL de l'API WordPress"
-#: ../../Zotlabs/Module/Uexport.php:64
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1$s\">%2$s</a>"
+#: ../../addon/wppost/wppost.php:95
+msgid "Typically https://your-blog.tld/xmlrpc.php"
+msgstr "Typiquement https://your-blog.tld/xmlrpc.php"
-#: ../../Zotlabs/Module/Uexport.php:65
-#, php-format
+#: ../../addon/wppost/wppost.php:98
+msgid "WordPress blogid"
+msgstr "ID de votre blog WordPress"
+
+#: ../../addon/wppost/wppost.php:99
+msgid "For multi-user sites such as wordpress.com, otherwise leave blank"
+msgstr "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide"
+
+#: ../../addon/wppost/wppost.php:105
+msgid "Post to WordPress by default"
+msgstr "Par défaut, publier sur WordPress"
+
+#: ../../addon/wppost/wppost.php:109
+msgid "Forward comments (requires hubzilla_wp plugin)"
+msgstr "Transférer les commentaires (nécessite le plugin hubzila_wp)"
+
+#: ../../addon/wppost/wppost.php:113
+msgid "WordPress Post Settings"
+msgstr "Paramètres de publications WordPress"
+
+#: ../../addon/wppost/wppost.php:129
+msgid "Wordpress Settings saved."
+msgstr "Les paramètres WordPress ont été sauvegardés."
+
+#: ../../addon/nsfw/nsfw.php:80
msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1$s\">%2$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord)."
+"This plugin looks in posts for the words/text you specify below, and "
+"collapses any content containing those keywords so it is not displayed at "
+"inappropriate times, such as sexual innuendo that may be improper in a work "
+"setting. It is polite and recommended to tag any content containing nudity "
+"with #NSFW. This filter can also match any other word/text you specify, and"
+" can thereby be used as a general purpose content filter."
+msgstr "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général."
-#: ../../Zotlabs/Module/Viewconnections.php:62
-msgid "No connections."
-msgstr "Aucun contact."
+#: ../../addon/nsfw/nsfw.php:84
+msgid "Enable Content filter"
+msgstr "Activer le filtrage des contenus"
-#: ../../Zotlabs/Module/Viewconnections.php:75
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Comma separated list of keywords to hide"
+msgstr "Liste séparée par des virgules des mots-clés à cacher"
+
+#: ../../addon/nsfw/nsfw.php:88
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+msgstr "Mot, /expression-régulière/, lang=xx, lang!=xx"
+
+#: ../../addon/nsfw/nsfw.php:92
+msgid "Not Safe For Work Settings"
+msgstr "Paramètres NSFW (Not Safe For Work)"
+
+#: ../../addon/nsfw/nsfw.php:92
+msgid "General Purpose Content Filter"
+msgstr "Filtre de contenu sujet général"
+
+#: ../../addon/nsfw/nsfw.php:110
+msgid "NSFW Settings saved."
+msgstr "Paramètres NSFW sauvegardés."
+
+#: ../../addon/nsfw/nsfw.php:207
+msgid "Possible adult content"
+msgstr "Contenu pour adulte probable"
+
+#: ../../addon/nsfw/nsfw.php:211
#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visiter le profil de %s [%s]"
+msgid "%s - view"
+msgstr ""
-#: ../../Zotlabs/Module/Viewconnections.php:104
-msgid "View Connections"
-msgstr "Voir les contacts"
+#: ../../addon/ijpost/ijpost.php:42
+msgid "Post to Insanejournal"
+msgstr "Publier sur InsaneJournal"
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Source de l'élément"
+#: ../../addon/ijpost/ijpost.php:73
+msgid "Enable InsaneJournal Post Plugin"
+msgstr "Activer le plugin de publication InsaneJournal"
-#: ../../Zotlabs/Module/Webpages.php:184 ../../Zotlabs/Lib/Apps.php:217
-#: ../../include/nav.php:106 ../../include/conversation.php:1685
-msgid "Webpages"
-msgstr "Pages web"
+#: ../../addon/ijpost/ijpost.php:77
+msgid "InsaneJournal username"
+msgstr "Identifiant InsaneJournal"
-#: ../../Zotlabs/Module/Webpages.php:195 ../../include/page_widgets.php:41
-msgid "Actions"
-msgstr "Actions"
+#: ../../addon/ijpost/ijpost.php:81
+msgid "InsaneJournal password"
+msgstr "Mot de passe InsaneJournal"
-#: ../../Zotlabs/Module/Webpages.php:196 ../../include/page_widgets.php:42
-msgid "Page Link"
-msgstr "Lien vers la page"
+#: ../../addon/ijpost/ijpost.php:85
+msgid "Post to InsaneJournal by default"
+msgstr "Par défaut, publier dans InsaneJournal"
-#: ../../Zotlabs/Module/Webpages.php:197
-msgid "Page Title"
-msgstr "Titre de la page"
+#: ../../addon/ijpost/ijpost.php:89
+msgid "InsaneJournal Post Settings"
+msgstr "Paramètres de publication de InsaneJournal"
-#: ../../Zotlabs/Module/Xchan.php:10
-msgid "Xchan Lookup"
-msgstr "Recherche xchan"
+#: ../../addon/ijpost/ijpost.php:104
+msgid "Insane Journal Settings saved."
+msgstr "Les paramètres d'InsaneJournal ont été sauvegardés"
-#: ../../Zotlabs/Module/Xchan.php:13
-msgid "Lookup xchan beginning with (or webbie): "
-msgstr "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Upload a file"
+msgstr "Téléverser un fichier"
-#: ../../Zotlabs/Lib/Apps.php:204
-msgid "Site Admin"
-msgstr "Administrateur"
+#: ../../addon/js_upload/js_upload.php:45
+msgid "Drop files here to upload"
+msgstr "Glisser les fichiers ici pour téléversement"
-#: ../../Zotlabs/Lib/Apps.php:205
-msgid "Bug Report"
-msgstr ""
+#: ../../addon/js_upload/js_upload.php:47
+msgid "Failed"
+msgstr "Échec"
-#: ../../Zotlabs/Lib/Apps.php:206
-msgid "View Bookmarks"
-msgstr ""
+#: ../../addon/js_upload/js_upload.php:315
+msgid "No files were uploaded."
+msgstr "Aucun fichier n'a été téléversé."
-#: ../../Zotlabs/Lib/Apps.php:207
-msgid "My Chatrooms"
-msgstr ""
+#: ../../addon/js_upload/js_upload.php:322
+msgid "Uploaded file is empty"
+msgstr "Le fichier téléversé est vide"
-#: ../../Zotlabs/Lib/Apps.php:209
-msgid "Firefox Share"
-msgstr ""
+#: ../../addon/js_upload/js_upload.php:335
+msgid "Image exceeds size limit of "
+msgstr "L'image excède la taille limite de"
-#: ../../Zotlabs/Lib/Apps.php:210
-msgid "Remote Diagnostics"
-msgstr ""
+#: ../../addon/js_upload/js_upload.php:347
+msgid "File has an invalid extension, it should be one of "
+msgstr "L'extension du fichier est invalide, elle doit être l'une des suivantes"
-#: ../../Zotlabs/Lib/Apps.php:211 ../../include/features.php:89
-msgid "Suggest Channels"
-msgstr "Suggérer des canaux"
+#: ../../addon/js_upload/js_upload.php:359
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Le téléversement a été annulé, ou le serveur a rencontré une erreur"
-#: ../../Zotlabs/Lib/Apps.php:212 ../../include/nav.php:110
-#: ../../boot.php:1703
-msgid "Login"
-msgstr "Connexion"
+#: ../../addon/dwpost/dwpost.php:42
+msgid "Post to Dreamwidth"
+msgstr "Publier sur Dreamwidth"
-#: ../../Zotlabs/Lib/Apps.php:214 ../../include/nav.php:179
-msgid "Grid"
-msgstr "Réseau"
+#: ../../addon/dwpost/dwpost.php:73
+msgid "Enable Dreamwidth Post Plugin"
+msgstr "Activer le plugin de publication Dreamwidth"
-#: ../../Zotlabs/Lib/Apps.php:218 ../../include/nav.php:182
-msgid "Channel Home"
-msgstr "Mon canal"
+#: ../../addon/dwpost/dwpost.php:77
+msgid "Dreamwidth username"
+msgstr "Nom d'utilisateur Dreamwidth"
-#: ../../Zotlabs/Lib/Apps.php:221 ../../include/nav.php:201
-#: ../../include/conversation.php:1649 ../../include/conversation.php:1652
-msgid "Events"
-msgstr "Événements"
+#: ../../addon/dwpost/dwpost.php:81
+msgid "Dreamwidth password"
+msgstr "Mot de passe Dreamwidth"
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:167
-msgid "Directory"
-msgstr "Annuaire"
+#: ../../addon/dwpost/dwpost.php:85
+msgid "Post to Dreamwidth by default"
+msgstr "Publication avec Dreamwidth par défaut"
-#: ../../Zotlabs/Lib/Apps.php:224 ../../include/nav.php:193
-msgid "Mail"
-msgstr "Messages"
+#: ../../addon/dwpost/dwpost.php:89
+msgid "Dreamwidth Post Settings"
+msgstr "Paramètres de publication Dreamwidth"
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:96
-msgid "Chat"
-msgstr "Clavardage"
+#: ../../addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr "Installer Firefox Sharing Tools"
-#: ../../Zotlabs/Lib/Apps.php:229
-msgid "Probe"
-msgstr "Sonder"
+#: ../../addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Partager du contenu depuis Firefox avec $Projectname"
-#: ../../Zotlabs/Lib/Apps.php:230
-msgid "Suggest"
-msgstr "Suggérer"
+#: ../../addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
+msgstr "Installer Firefox Sharing Tools sur ce navigateur"
-#: ../../Zotlabs/Lib/Apps.php:231
-msgid "Random Channel"
-msgstr "Un canal au hasard"
+#: ../../addon/dirstats/dirstats.php:94
+msgid "Hubzilla Directory Stats"
+msgstr "Statistiques de l'annuaire Hubzilla"
-#: ../../Zotlabs/Lib/Apps.php:232
-msgid "Invite"
-msgstr "Invitation"
+#: ../../addon/dirstats/dirstats.php:95
+msgid "Total Hubs"
+msgstr "Total de Hubs"
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/widgets.php:1386
-msgid "Features"
-msgstr "Fonctionalités"
+#: ../../addon/dirstats/dirstats.php:97
+msgid "Hubzilla Hubs"
+msgstr "Hubs Hubzilla"
-#: ../../Zotlabs/Lib/Apps.php:235
-msgid "Post"
-msgstr "Envoyer"
+#: ../../addon/dirstats/dirstats.php:99
+msgid "Friendica Hubs"
+msgstr "Hubs Friendica"
-#: ../../Zotlabs/Lib/Apps.php:335
-msgid "Purchase"
-msgstr "Acheter"
+#: ../../addon/dirstats/dirstats.php:101
+msgid "Diaspora Pods"
+msgstr "Pods Diaspora"
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Il manque le nom du salon"
+#: ../../addon/dirstats/dirstats.php:103
+msgid "Hubzilla Channels"
+msgstr "Canaux Hubzilla"
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Un salon avec ce nom existe déjà"
+#: ../../addon/dirstats/dirstats.php:105
+msgid "Friendica Channels"
+msgstr "Canaux Friendica"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Identifiant de salon invalide."
+#: ../../addon/dirstats/dirstats.php:107
+msgid "Diaspora Channels"
+msgstr "Canaux Diaspora"
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
-msgstr "Salon introuvable."
+#: ../../addon/dirstats/dirstats.php:109
+msgid "Aged 35 and above"
+msgstr "Âgé de 35 ans et plus"
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "Le salon est plein"
+#: ../../addon/dirstats/dirstats.php:111
+msgid "Aged 34 and under"
+msgstr "Âgé de 34 et moins"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1823
-msgid "$Projectname Notification"
-msgstr "Notification $Projectname"
+#: ../../addon/dirstats/dirstats.php:113
+msgid "Average Age"
+msgstr "Âge moyen"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../include/network.php:1824
-msgid "$projectname"
-msgstr "$projectname"
+#: ../../addon/dirstats/dirstats.php:115
+msgid "Known Chatrooms"
+msgstr "Salons de discussion connus"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1826
-msgid "Thank You,"
-msgstr "Merci,"
+#: ../../addon/dirstats/dirstats.php:117
+msgid "Known Tags"
+msgstr "Étiquettes connues"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1828
-#, php-format
-msgid "%s Administrator"
-msgstr "l'administrateur de %s"
+#: ../../addon/dirstats/dirstats.php:119
+msgid ""
+"Please note Diaspora and Friendica statistics are merely those **this "
+"directory** is aware of, and not all those known in the network. This also "
+"applies to chatrooms,"
+msgstr "Veuillez noter que les statistiques de Diaspora et Friendica sont simplement celles dont **ce répertoire** est au courant, et pas toutes celles connues dans le réseau. Cela s'applique également aux salles de discussion,"
-#: ../../Zotlabs/Lib/Enotify.php:100
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Email notification hub"
+msgstr "Notification par mail du hub"
-#: ../../Zotlabs/Lib/Enotify.php:104
-#, php-format
-msgid "[Hubzilla:Notify] New mail received at %s"
-msgstr "[Hubzilla:Notify] Nouveau courriel reçu à %s"
+#: ../../addon/mailhost/mailhost.php:36
+msgid "Hostname"
+msgstr "Nom d'hôte"
-#: ../../Zotlabs/Lib/Enotify.php:106
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, vous avez reçu un message privé sur %3$s, de la part de %2$s."
+#: ../../addon/mailhost/mailhost.php:40
+msgid "Mailhost Settings"
+msgstr "Paramètres mail de l'hôte"
-#: ../../Zotlabs/Lib/Enotify.php:107
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s vous a envoyé %2$s."
+#: ../../addon/mailhost/mailhost.php:54
+msgid "MAILHOST Settings saved."
+msgstr "Paramètres mail de l'hôte sauvegardés."
-#: ../../Zotlabs/Lib/Enotify.php:107
-msgid "a private message"
-msgstr "un message privé"
+#: ../../addon/likebanner/likebanner.php:51
+msgid "Your Webbie:"
+msgstr "Vous êtes Webbie :"
-#: ../../Zotlabs/Lib/Enotify.php:108
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Merci de visiter %s pour voir et/ou répondre à vos messages privés."
+#: ../../addon/likebanner/likebanner.php:54
+msgid "Fontsize (px):"
+msgstr "Taille de la police (px) :"
-#: ../../Zotlabs/Lib/Enotify.php:164
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s a commenté sur [zrl=%3$s]%4$s[/zrl]"
+#: ../../addon/likebanner/likebanner.php:68
+msgid "Link:"
+msgstr "Lien :"
-#: ../../Zotlabs/Lib/Enotify.php:172
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s a commenté sur [zrl=%3$s]%5$s de %4$s[/zrl]"
+#: ../../addon/likebanner/likebanner.php:70
+msgid "Like us on Hubzilla"
+msgstr "Aimez-nous sur Hubzilla"
-#: ../../Zotlabs/Lib/Enotify.php:181
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s a commenté [zrl=%3$s]votre %4$s[/zrl]"
+#: ../../addon/likebanner/likebanner.php:72
+msgid "Embed:"
+msgstr "Embarqué :"
-#: ../../Zotlabs/Lib/Enotify.php:192
-#, php-format
-msgid "[Hubzilla:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Hubzilla:Notify] Commentaire de %2$s sur conversation #%1$d"
+#: ../../addon/redphotos/redphotos.php:106
+msgid "Photos imported"
+msgstr "Photos importées"
-#: ../../Zotlabs/Lib/Enotify.php:193
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s a commenté un élément de conversation que vous suivez."
+#: ../../addon/redphotos/redphotos.php:129
+msgid "Redmatrix Photo Album Import"
+msgstr "Import de l'album photo Redmatrix"
-#: ../../Zotlabs/Lib/Enotify.php:196 ../../Zotlabs/Lib/Enotify.php:211
-#: ../../Zotlabs/Lib/Enotify.php:237 ../../Zotlabs/Lib/Enotify.php:255
-#: ../../Zotlabs/Lib/Enotify.php:269
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Merci de visiter %s pour voir et/ou répondre sur cette conversation."
+#: ../../addon/redphotos/redphotos.php:130
+msgid "This will import all your Redmatrix photo albums to this channel."
+msgstr "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal."
-#: ../../Zotlabs/Lib/Enotify.php:202
-#, php-format
-msgid "[Hubzilla:Notify] %s posted to your profile wall"
-msgstr "[Hubzilla:Notify] %s a publié sur votre profil"
+#: ../../addon/redphotos/redphotos.php:131
+#: ../../addon/redfiles/redfiles.php:121
+msgid "Redmatrix Server base URL"
+msgstr "URL de base du serveur Redmatrix"
-#: ../../Zotlabs/Lib/Enotify.php:204
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s a publié sur votre profil à %3$s"
+#: ../../addon/redphotos/redphotos.php:132
+#: ../../addon/redfiles/redfiles.php:122
+msgid "Redmatrix Login Username"
+msgstr "Identifiant de connexion Redmatrix"
-#: ../../Zotlabs/Lib/Enotify.php:206
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s a publié sur [zrl=%3$s]votre profil[/zrl]"
+#: ../../addon/redphotos/redphotos.php:133
+#: ../../addon/redfiles/redfiles.php:123
+msgid "Redmatrix Login Password"
+msgstr "Mot de passe de connexion Redmatrix"
-#: ../../Zotlabs/Lib/Enotify.php:230
-#, php-format
-msgid "[Hubzilla:Notify] %s tagged you"
-msgstr "[Hubzilla:Notify] %s vous a étiqueté"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Import just this album"
+msgstr "Importer uniquement cet album"
-#: ../../Zotlabs/Lib/Enotify.php:231
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, vous avez été étiqueté sur %3$s par %2$s"
+#: ../../addon/redphotos/redphotos.php:134
+msgid "Leave blank to import all albums"
+msgstr "Laisser vide pour importer tous les albums"
-#: ../../Zotlabs/Lib/Enotify.php:232
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]vous a étiqueté[/zrl]."
+#: ../../addon/redphotos/redphotos.php:135
+msgid "Maximum count to import"
+msgstr "Nombre maximum de comptes à importer"
-#: ../../Zotlabs/Lib/Enotify.php:244
-#, php-format
-msgid "[Hubzilla:Notify] %1$s poked you"
-msgstr "[Hubzilla:Notify] %1$s vous a tapoté"
+#: ../../addon/redphotos/redphotos.php:135
+msgid "0 or blank to import all available"
+msgstr "0 ou vide pour importer tout ce qui est disponible"
-#: ../../Zotlabs/Lib/Enotify.php:245
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s vous a tapoté sur %3$s"
+#: ../../addon/irc/irc.php:45
+msgid "Channels to auto connect"
+msgstr "Canaux à connecter automatiqument"
-#: ../../Zotlabs/Lib/Enotify.php:246
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]vous a tapoté[/zrl]."
+#: ../../addon/irc/irc.php:45 ../../addon/irc/irc.php:49
+msgid "Comma separated list"
+msgstr "Liste séparée par des virgules"
-#: ../../Zotlabs/Lib/Enotify.php:262
-#, php-format
-msgid "[Hubzilla:Notify] %s tagged your post"
-msgstr "[Hubzilla:Notify] %s a étiqueté votre publication"
+#: ../../addon/irc/irc.php:49 ../../addon/irc/irc.php:96
+msgid "Popular Channels"
+msgstr "Canaux populaires"
-#: ../../Zotlabs/Lib/Enotify.php:263
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s a étiqueté votre publication sur %3$s"
+#: ../../addon/irc/irc.php:53
+msgid "IRC Settings"
+msgstr "Paramètres IRC"
-#: ../../Zotlabs/Lib/Enotify.php:264
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s a étiqueté [zrl=%3$s]votre publication[/zrl]"
+#: ../../addon/irc/irc.php:69
+msgid "IRC settings saved."
+msgstr "Paramètres IRC sauvegardés"
-#: ../../Zotlabs/Lib/Enotify.php:276
-msgid "[Hubzilla:Notify] Introduction received"
-msgstr "[Hubzilla:Notify] Nouvelle présentation"
+#: ../../addon/irc/irc.php:74
+msgid "IRC Chatroom"
+msgstr "Salon de discussion IRC"
-#: ../../Zotlabs/Lib/Enotify.php:277
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, vous avez reçu une demande de contact de '%2$s' sur %3$s"
+#: ../../addon/ljpost/ljpost.php:42
+msgid "Post to LiveJournal"
+msgstr "Publier sur LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:278
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, vous avez reçu [zrl=%2$s]une demande de contact[/zrl] de %3$s."
+#: ../../addon/ljpost/ljpost.php:70
+msgid "Enable LiveJournal Post Plugin"
+msgstr "Activer le plugin de publication LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:282 ../../Zotlabs/Lib/Enotify.php:301
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Vous pouvez visiter leur profil sur %s"
+#: ../../addon/ljpost/ljpost.php:74
+msgid "LiveJournal username"
+msgstr "Identifiant LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:284
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Merci de visiter %s avant d'approuver (ou non) cette demande de contact."
+#: ../../addon/ljpost/ljpost.php:78
+msgid "LiveJournal password"
+msgstr "Mot de passe LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:291
-msgid "[Hubzilla:Notify] Friend suggestion received"
-msgstr "[Hubzilla:Notify] Nouvel(le) ami(e) suggéré(e)"
+#: ../../addon/ljpost/ljpost.php:82
+msgid "Post to LiveJournal by default"
+msgstr "Par défaut, publier sur LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:292
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, vous avez reçu une suggestion d'ami(e) de '%2$s' à %3$s"
+#: ../../addon/ljpost/ljpost.php:86
+msgid "LiveJournal Post Settings"
+msgstr "Paramètres de publication LiveJournal"
-#: ../../Zotlabs/Lib/Enotify.php:293
-#, php-format
+#: ../../addon/ljpost/ljpost.php:101
+msgid "LiveJournal Settings saved."
+msgstr "Paramètres LiveJournal sauvegardés."
+
+#: ../../addon/openid/openid.php:49
msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, avez reçu %3$s comme [zrl=%2$s]une suggestion d'ami(e)[/zrl] de %4$s."
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID."
-#: ../../Zotlabs/Lib/Enotify.php:299
-msgid "Name:"
-msgstr "Nom&nbsp;:"
+#: ../../addon/openid/openid.php:49
+msgid "The error message was:"
+msgstr "Le message d'erreur était :"
-#: ../../Zotlabs/Lib/Enotify.php:300
-msgid "Photo:"
-msgstr "Photo&nbsp;:"
+#: ../../addon/openid/MysqlProvider.php:52
+msgid "First Name"
+msgstr "Prénom"
-#: ../../Zotlabs/Lib/Enotify.php:303
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Merci de visiter %s pour donner suite (ou non) à cette suggestion."
+#: ../../addon/openid/MysqlProvider.php:53
+msgid "Last Name"
+msgstr "Nom"
-#: ../../Zotlabs/Lib/Enotify.php:518
-msgid "[Hubzilla:Notify]"
-msgstr "[Hubzilla:Notify]"
+#: ../../addon/openid/MysqlProvider.php:54 ../../addon/redred/redred.php:111
+msgid "Nickname"
+msgstr "Surnom"
-#: ../../Zotlabs/Lib/Enotify.php:667
-msgid "created a new post"
-msgstr "a publié un nouveau message"
+#: ../../addon/openid/MysqlProvider.php:55
+msgid "Full Name"
+msgstr "Nom complet"
-#: ../../Zotlabs/Lib/Enotify.php:668
-#, php-format
-msgid "commented on %s's post"
-msgstr "a commenté la publication de %s"
+#: ../../addon/openid/MysqlProvider.php:61
+msgid "Profile Photo 16px"
+msgstr "Photo de profil 16px"
-#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:664
-msgid "Private Message"
-msgstr "Message Privé"
+#: ../../addon/openid/MysqlProvider.php:62
+msgid "Profile Photo 32px"
+msgstr "Photo de profil 32px"
-#: ../../Zotlabs/Lib/ThreadItem.php:132 ../../include/conversation.php:656
-msgid "Select"
-msgstr "Sélectionner"
+#: ../../addon/openid/MysqlProvider.php:63
+msgid "Profile Photo 48px"
+msgstr "Photo de profil 48px"
-#: ../../Zotlabs/Lib/ThreadItem.php:136
-msgid "Save to Folder"
-msgstr "Enregistrer dans le dossier"
+#: ../../addon/openid/MysqlProvider.php:64
+msgid "Profile Photo 64px"
+msgstr "Photo de profil 64px"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
-msgid "I will attend"
-msgstr "Je participerai"
+#: ../../addon/openid/MysqlProvider.php:65
+msgid "Profile Photo 80px"
+msgstr "Photo de profil 80px"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
-msgid "I will not attend"
-msgstr "Je ne participerai pas"
+#: ../../addon/openid/MysqlProvider.php:66
+msgid "Profile Photo 128px"
+msgstr "Photo de profil 128px"
-#: ../../Zotlabs/Lib/ThreadItem.php:157
-msgid "I might attend"
-msgstr "Je participerai peut-être"
+#: ../../addon/openid/MysqlProvider.php:67
+msgid "Timezone"
+msgstr "Fuseau horaire"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
-msgid "I agree"
-msgstr "Je suis d'accord"
+#: ../../addon/openid/MysqlProvider.php:70
+msgid "Birth Year"
+msgstr "Années de naissance"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
-msgid "I disagree"
-msgstr "Je ne suis pas d'accord"
+#: ../../addon/openid/MysqlProvider.php:71
+msgid "Birth Month"
+msgstr "Mois de naissance"
-#: ../../Zotlabs/Lib/ThreadItem.php:167
-msgid "I abstain"
-msgstr "Je m'abstiens"
+#: ../../addon/openid/MysqlProvider.php:72
+msgid "Birth Day"
+msgstr "Jour de naissance"
-#: ../../Zotlabs/Lib/ThreadItem.php:218
-msgid "Add Star"
-msgstr "Mettre en avant (étoile)"
+#: ../../addon/openid/MysqlProvider.php:73
+msgid "Birthdate"
+msgstr "Date de naissance"
-#: ../../Zotlabs/Lib/ThreadItem.php:219
-msgid "Remove Star"
-msgstr "Ne plus mettre en avant"
+#: ../../addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "Erreur du protocole OpenID. Aucune ID trouvée."
-#: ../../Zotlabs/Lib/ThreadItem.php:220
-msgid "Toggle Star Status"
-msgstr "(Dés)activer l'étoile"
+#: ../../addon/openid/Mod_Openid.php:188 ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Échec de la connexion."
-#: ../../Zotlabs/Lib/ThreadItem.php:224
-msgid "starred"
-msgstr "mis en avant"
+#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Male"
+msgstr "Homme"
-#: ../../Zotlabs/Lib/ThreadItem.php:234 ../../include/conversation.php:671
-msgid "Message signature validated"
-msgstr "Signature du message validée"
+#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
+#: ../../include/selectors.php:66
+msgid "Female"
+msgstr "Femme"
-#: ../../Zotlabs/Lib/ThreadItem.php:235 ../../include/conversation.php:672
-msgid "Message signature incorrect"
-msgstr "Signature du message incorrecte"
+#: ../../addon/randpost/randpost.php:97
+msgid "You're welcome."
+msgstr "Bienvenue."
-#: ../../Zotlabs/Lib/ThreadItem.php:243
-msgid "Add Tag"
-msgstr "Ajouter une étiquette"
+#: ../../addon/randpost/randpost.php:98
+msgid "Ah shucks..."
+msgstr "Ah m…"
-#: ../../Zotlabs/Lib/ThreadItem.php:261 ../../include/taxonomy.php:316
-msgid "like"
-msgstr "aiment"
+#: ../../addon/randpost/randpost.php:99
+msgid "Don't mention it."
+msgstr "De rien."
-#: ../../Zotlabs/Lib/ThreadItem.php:262 ../../include/taxonomy.php:317
-msgid "dislike"
-msgstr "n'aiment pas"
+#: ../../addon/randpost/randpost.php:100
+msgid "&lt;blush&gt;"
+msgstr "&lt;rougit&gt;"
-#: ../../Zotlabs/Lib/ThreadItem.php:266
-msgid "Share This"
-msgstr "Partager"
+#: ../../addon/startpage/startpage.php:109
+msgid "Page to load after login"
+msgstr "Page à charger après l'identification"
-#: ../../Zotlabs/Lib/ThreadItem.php:266
-msgid "share"
-msgstr "partager"
+#: ../../addon/startpage/startpage.php:109
+msgid ""
+"Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy "
+"collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave "
+"blank for default network page (grid)."
+msgstr "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille)."
-#: ../../Zotlabs/Lib/ThreadItem.php:275
-msgid "Delivery Report"
-msgstr "Rapport de distribution"
+#: ../../addon/startpage/startpage.php:113
+msgid "Startpage Settings"
+msgstr "Paramètres de la page de démarrage"
-#: ../../Zotlabs/Lib/ThreadItem.php:293
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d commentaire"
-msgstr[1] "%d commentaires"
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslap"
+msgstr "giffler"
-#: ../../Zotlabs/Lib/ThreadItem.php:322 ../../Zotlabs/Lib/ThreadItem.php:323
-#, php-format
-msgid "View %s's profile - %s"
-msgstr "Voir le profil de %s - %s"
+#: ../../addon/morepokes/morepokes.php:19
+msgid "bitchslapped"
+msgstr "gifflé(e)"
-#: ../../Zotlabs/Lib/ThreadItem.php:326
-msgid "to"
-msgstr "à"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shag"
+msgstr "baiser"
-#: ../../Zotlabs/Lib/ThreadItem.php:327
-msgid "via"
-msgstr "via"
+#: ../../addon/morepokes/morepokes.php:20
+msgid "shagged"
+msgstr "baisé"
-#: ../../Zotlabs/Lib/ThreadItem.php:328
-msgid "Wall-to-Wall"
-msgstr "Mur-à-mur"
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patent"
+msgstr "breveté"
-#: ../../Zotlabs/Lib/ThreadItem.php:329
-msgid "via Wall-To-Wall:"
-msgstr "par Mur-à-mur&nbsp;:"
+#: ../../addon/morepokes/morepokes.php:21
+msgid "patented"
+msgstr "être breveté"
-#: ../../Zotlabs/Lib/ThreadItem.php:341 ../../include/conversation.php:719
-#, php-format
-msgid "from %s"
-msgstr "de %s"
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hug"
+msgstr "étreindre"
-#: ../../Zotlabs/Lib/ThreadItem.php:344 ../../include/conversation.php:722
-#, php-format
-msgid "last edited: %s"
-msgstr "dernière modification&nbsp;: %s"
+#: ../../addon/morepokes/morepokes.php:22
+msgid "hugged"
+msgstr "être étreint"
-#: ../../Zotlabs/Lib/ThreadItem.php:345 ../../include/conversation.php:723
-#, php-format
-msgid "Expires: %s"
-msgstr "Expire&nbsp;: %s"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murder"
+msgstr "assassiner"
-#: ../../Zotlabs/Lib/ThreadItem.php:370
-msgid "Save Bookmarks"
-msgstr "Enregistrer les favoris"
+#: ../../addon/morepokes/morepokes.php:23
+msgid "murdered"
+msgstr "être assassiné"
-#: ../../Zotlabs/Lib/ThreadItem.php:371
-msgid "Add to Calendar"
-msgstr "Ajouter au Calendrier"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worship"
+msgstr "vénérer"
-#: ../../Zotlabs/Lib/ThreadItem.php:380
-msgid "Mark all seen"
-msgstr "Tout marquer comme vu"
+#: ../../addon/morepokes/morepokes.php:24
+msgid "worshipped"
+msgstr "être vénéré"
-#: ../../Zotlabs/Lib/ThreadItem.php:421 ../../include/js_strings.php:7
-msgid "[+] show all"
-msgstr "[+] voir tous"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kiss"
+msgstr "embrasser"
-#: ../../Zotlabs/Lib/ThreadItem.php:711 ../../include/conversation.php:1215
-msgid "Bold"
-msgstr "Gras"
+#: ../../addon/morepokes/morepokes.php:25
+msgid "kissed"
+msgstr "embrassé"
-#: ../../Zotlabs/Lib/ThreadItem.php:712 ../../include/conversation.php:1216
-msgid "Italic"
-msgstr "Italique"
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempt"
+msgstr "tenter"
-#: ../../Zotlabs/Lib/ThreadItem.php:713 ../../include/conversation.php:1217
-msgid "Underline"
-msgstr "Souligné"
+#: ../../addon/morepokes/morepokes.php:26
+msgid "tempted"
+msgstr "tenté"
-#: ../../Zotlabs/Lib/ThreadItem.php:714 ../../include/conversation.php:1218
-msgid "Quote"
-msgstr "Citation"
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raise eyebrows at"
+msgstr "soulever les sourcils à la vue de"
-#: ../../Zotlabs/Lib/ThreadItem.php:715 ../../include/conversation.php:1219
-msgid "Code"
-msgstr "Code"
+#: ../../addon/morepokes/morepokes.php:27
+msgid "raised their eyebrows at"
+msgstr "sourcils soulevés à la vue de"
-#: ../../Zotlabs/Lib/ThreadItem.php:716
-msgid "Image"
-msgstr "Image"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insult"
+msgstr "insulter"
-#: ../../Zotlabs/Lib/ThreadItem.php:717
-msgid "Insert Link"
-msgstr "Insérer un lien"
+#: ../../addon/morepokes/morepokes.php:28
+msgid "insulted"
+msgstr "insulté"
-#: ../../Zotlabs/Lib/ThreadItem.php:718
-msgid "Video"
-msgstr "Vidéo"
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praise"
+msgstr "louer"
+
+#: ../../addon/morepokes/morepokes.php:29
+msgid "praised"
+msgstr "loué"
+
+#: ../../addon/morepokes/morepokes.php:30
+msgid "be dubious of"
+msgstr "douter de"
+
+#: ../../addon/morepokes/morepokes.php:30
+msgid "was dubious of"
+msgstr "avoir douté de"
+
+#: ../../addon/morepokes/morepokes.php:31
+msgid "eat"
+msgstr "manger"
+
+#: ../../addon/morepokes/morepokes.php:31
+msgid "ate"
+msgstr "a mangé"
+
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggle and fawn at"
+msgstr "séduire, charmer"
+
+#: ../../addon/morepokes/morepokes.php:32
+msgid "giggled and fawned at"
+msgstr "séduit(e), charmé(e)"
+
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubt"
+msgstr "doute"
+
+#: ../../addon/morepokes/morepokes.php:33
+msgid "doubted"
+msgstr "a douté"
+
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glare"
+msgstr "jeter un regard"
+
+#: ../../addon/morepokes/morepokes.php:34
+msgid "glared at"
+msgstr "a jeté un regard à "
+
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fuck"
+msgstr "baiser"
+
+#: ../../addon/morepokes/morepokes.php:35
+msgid "fucked"
+msgstr "être baisé"
+
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonk"
+msgstr "baiser"
+
+#: ../../addon/morepokes/morepokes.php:36
+msgid "bonked"
+msgstr "baisé(e)"
+
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declare undying love for"
+msgstr "Déclarer un amour éternel pour"
+
+#: ../../addon/morepokes/morepokes.php:37
+msgid "declared undying love for"
+msgstr "A déclaré l'amour éternel pour"
-#: ../../include/Import/import_diaspora.php:16
+#: ../../addon/diaspora/diaspora.php:677
+msgid "Diaspora Protocol Settings updated."
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:696
+msgid "Enable the Diaspora protocol for this channel"
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:700
+msgid "Allow any Diaspora member to comment on your public posts"
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:704
+msgid "Prevent your hashtags from being redirected to other sites"
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:709
+msgid "Followed hashtags (comma separated, do not include the #)"
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:714
+msgid "Diaspora Protocol Settings"
+msgstr ""
+
+#: ../../addon/diaspora/import_diaspora.php:16
msgid "No username found in import file."
-msgstr "Aucun nom d'utilisateur dans le fichier d'import."
+msgstr ""
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:50
+#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
msgid "Unable to create a unique channel address. Import failed."
msgstr "Impossible de créer une adresse de canal unique. Echec de l'import."
-#: ../../include/dba/dba_driver.php:171
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Impossible de trouver les infos DNS du serveur de BDD '%s'"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:107
+msgid "Error retrieving wiki"
+msgstr "Erreur lors de la récupération du wiki"
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
-#: ../../include/widgets.php:46 ../../include/widgets.php:429
-#: ../../include/contact_widgets.php:91
-msgid "Categories"
-msgstr "Catégories"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:114
+msgid "Error creating zip file export folder"
+msgstr "Erreur lors de la création du dossier d'exportation du fichier zip"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Étiquettes"
+#: ../../addon/gitwiki/Mod_Gitwiki.php:132
+msgid "Error downloading wiki: "
+msgstr "Erreur lors du téléchargement du wiki:"
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Mots-clefs"
+#: ../../addon/testdrive/testdrive.php:104
+#, php-format
+msgid "Your account on %s will expire in a few days."
+msgstr "Votre compte sur %s expirera dans quelques jours."
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "ont"
+#: ../../addon/testdrive/testdrive.php:105
+msgid "Your $Productname test account is about to expire."
+msgstr "Votre compte de test $NomDeProduit est sur le point d'expirer."
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "a"
+#: ../../addon/rainbowtag/rainbowtag.php:81
+msgid "Enable Rainbowtag"
+msgstr "Activer Rainbowtag"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "veulent"
+#: ../../addon/rainbowtag/rainbowtag.php:85
+msgid "Rainbowtag Settings"
+msgstr "Paramètres Rainbowtag"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "veut"
+#: ../../addon/rainbowtag/rainbowtag.php:101
+msgid "Rainbowtag Settings saved."
+msgstr "Paramètres Rainbowtag sauvegardés."
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "aime"
+#: ../../addon/upload_limits/upload_limits.php:25
+msgid "Show Upload Limits"
+msgstr "Afficher les limites de débit ascendant (upload)"
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "n'aime pas"
+#: ../../addon/upload_limits/upload_limits.php:27
+msgid "Hubzilla configured maximum size: "
+msgstr "Taille maximale configurée par Hubzilla:"
-#: ../../include/event.php:22 ../../include/event.php:69
-#: ../../include/bb2diaspora.php:485
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d F Y \\à G\\hi"
+#: ../../addon/upload_limits/upload_limits.php:28
+msgid "PHP upload_max_filesize: "
+msgstr "PHP upload_max_filesize: "
-#: ../../include/event.php:30 ../../include/event.php:73
-#: ../../include/bb2diaspora.php:491
-msgid "Starts:"
-msgstr "Début&nbsp;:"
+#: ../../addon/upload_limits/upload_limits.php:29
+msgid "PHP post_max_size (must be larger than upload_max_filesize): "
+msgstr "PHP post_max_size (must be larger than upload_max_filesize): "
-#: ../../include/event.php:40 ../../include/event.php:77
-#: ../../include/bb2diaspora.php:499
-msgid "Finishes:"
-msgstr "Fin&nbsp;:"
+#: ../../addon/visage/visage.php:93
+msgid "Recent Channel/Profile Viewers"
+msgstr "Visiteurs récents du canal/profil"
-#: ../../include/event.php:812
-msgid "This event has been added to your calendar."
-msgstr "Cet évènement a été ajouté dans votre calendrier."
+#: ../../addon/visage/visage.php:98
+msgid "This plugin/addon has not been configured."
+msgstr "Cette extension n'a pas été configurée."
-#: ../../include/event.php:1012
-msgid "Not specified"
-msgstr "Non spécifié"
+#: ../../addon/visage/visage.php:99
+#, php-format
+msgid "Please visit the Visage settings on %s"
+msgstr "Veuillez visiter les paramètres de Visage sur %s"
-#: ../../include/event.php:1013
-msgid "Needs Action"
-msgstr "Besoin d'une action"
+#: ../../addon/visage/visage.php:99
+msgid "your feature settings page"
+msgstr "La page des paramètres de vos fonctionnalités"
-#: ../../include/event.php:1014
-msgid "Completed"
-msgstr "Terminé"
+#: ../../addon/visage/visage.php:112
+msgid "No entries."
+msgstr "Aucune entrée."
-#: ../../include/event.php:1015
-msgid "In Process"
-msgstr "En cours"
+#: ../../addon/visage/visage.php:166
+msgid "Enable Visage Visitor Logging"
+msgstr "Activer la connexion Visage Visitor"
-#: ../../include/event.php:1016
-msgid "Cancelled"
-msgstr "Annulé"
+#: ../../addon/visage/visage.php:170
+msgid "Visage Settings"
+msgstr "Paramètres Visage"
-#: ../../include/import.php:29
-msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "L'import a échoué. Un canal existe déjà avec ce nom"
+#: ../../addon/nsabait/nsabait.php:125
+msgid "Nsabait Settings updated."
+msgstr "Les paramètres Nsabait ont été enregistrés."
-#: ../../include/import.php:76
-msgid "Channel clone failed. Import failed."
-msgstr "Echec du clonage du canal. Echec de l'impot."
+#: ../../addon/nsabait/nsabait.php:157
+msgid "Enable NSAbait Plugin"
+msgstr "Activer le plugin NSAbait"
-#: ../../include/items.php:892 ../../include/items.php:937
-msgid "(Unknown)"
-msgstr "(Inconnu)"
+#: ../../addon/nsabait/nsabait.php:161
+msgid "NSAbait Settings"
+msgstr "Paramètres NSAbait"
-#: ../../include/items.php:1136
-msgid "Visible to anybody on the internet."
-msgstr "Visible pour tout le monde sur internet."
+#: ../../addon/mailtest/mailtest.php:19
+msgid "Send test email"
+msgstr "Envoyer un mail de test"
-#: ../../include/items.php:1138
-msgid "Visible to you only."
-msgstr "Visible pour vous seulement."
+#: ../../addon/mailtest/mailtest.php:50 ../../addon/hubwall/hubwall.php:50
+msgid "No recipients found."
+msgstr "Aucun destinataire trouvé."
-#: ../../include/items.php:1140
-msgid "Visible to anybody in this network."
-msgstr "Visible pour tout le monde sur ce réseau."
+#: ../../addon/mailtest/mailtest.php:66
+msgid "Mail sent."
+msgstr "Mail envoyé."
-#: ../../include/items.php:1142
-msgid "Visible to anybody authenticated."
-msgstr "Visible aux utilisateurs authentifiés."
+#: ../../addon/mailtest/mailtest.php:68
+msgid "Sending of mail failed."
+msgstr "L'envoi du mail a échoué."
+
+#: ../../addon/mailtest/mailtest.php:77
+msgid "Mail Test"
+msgstr "Test du mail"
+
+#: ../../addon/mailtest/mailtest.php:96 ../../addon/hubwall/hubwall.php:92
+msgid "Message subject"
+msgstr "Objet du message"
-#: ../../include/items.php:1144
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
#, php-format
-msgid "Visible to anybody on %s."
-msgstr "Visible pour tous sur %s."
+msgid "Reconnecting %d connections"
+msgstr ""
-#: ../../include/items.php:1146
-msgid "Visible to all connections."
-msgstr "Visible pour tous les contacts."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
+msgid "Diaspora Reconnect"
+msgstr ""
-#: ../../include/items.php:1148
-msgid "Visible to approved connections."
-msgstr "Visible aux contacts approuvés."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
+msgid ""
+"Use this form to re-establish Diaspora connections which were initially made"
+" from a different hub."
+msgstr ""
-#: ../../include/items.php:1150
-msgid "Visible to specific connections."
-msgstr "Visible pour certains contacts."
+#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
+msgid "Reconnect"
+msgstr ""
-#: ../../include/items.php:3909
-msgid "Privacy group is empty."
-msgstr "Groupe d'accès vide."
+#: ../../addon/openstreetmap/openstreetmap.php:146
+msgid "View Larger"
+msgstr "Afficher en plus grand"
-#: ../../include/items.php:3916
-#, php-format
-msgid "Privacy group: %s"
-msgstr "Groupe d'accès&nbsp;: %s"
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid "Tile Server URL"
+msgstr "URL de la tuile du serveur"
-#: ../../include/items.php:3928
-msgid "Connection not found."
-msgstr "Contact non trouvé."
+#: ../../addon/openstreetmap/openstreetmap.php:169
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
+"target=\"_blank\">public tile servers</a>"
+msgstr "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">serveurs de cartes publics</a>"
-#: ../../include/items.php:4277
-msgid "profile photo"
-msgstr "photo de profil"
+#: ../../addon/openstreetmap/openstreetmap.php:170
+msgid "Nominatim (reverse geocoding) Server URL"
+msgstr "URL du serveur Nominatim (géocodage inversé)"
-#: ../../include/message.php:20
-msgid "No recipient provided."
-msgstr "Pas de destinataire."
+#: ../../addon/openstreetmap/openstreetmap.php:170
+msgid ""
+"A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" "
+"target=\"_blank\">Nominatim servers</a>"
+msgstr "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">serveurs Nominatim</a>"
-#: ../../include/message.php:25
-msgid "[no subject]"
-msgstr "[sans objet]"
+#: ../../addon/openstreetmap/openstreetmap.php:171
+msgid "Default zoom"
+msgstr "Zoom par défaut"
-#: ../../include/message.php:45
-msgid "Unable to determine sender."
-msgstr "Impossible de déterminer l'émetteur."
+#: ../../addon/openstreetmap/openstreetmap.php:171
+msgid ""
+"The default zoom level. (1:world, 18:highest, also depends on tile server)"
+msgstr "Le niveau de zoom par défaut. (1: monde, 18: plus élevé, dépend également du serveur de tuiles)"
-#: ../../include/message.php:222
-msgid "Stored post could not be verified."
-msgstr "Le message stocké n'a pas pu être vérifié."
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include marker on map"
+msgstr "Inclure le marqueur sur la carte"
-#: ../../include/text.php:428
-msgid "prev"
-msgstr "préc."
+#: ../../addon/openstreetmap/openstreetmap.php:172
+msgid "Include a marker on the map."
+msgstr "Inclure un marqueur sur la carte."
-#: ../../include/text.php:430
-msgid "first"
-msgstr "premier"
+#: ../../addon/msgfooter/msgfooter.php:46 ../../addon/xmpp/xmpp.php:91
+msgid "Save Settings"
+msgstr "Sauvegarder les paramètres"
-#: ../../include/text.php:459
-msgid "last"
-msgstr "dernier"
+#: ../../addon/msgfooter/msgfooter.php:47
+msgid "text to include in all outgoing posts from this site"
+msgstr "Texte à inclure dans tous les messages sortants de ce site"
-#: ../../include/text.php:462
-msgid "next"
-msgstr "Suivant"
+#: ../../addon/rtof/rtof.php:45
+msgid "Post to Friendica"
+msgstr "Publier sur Friendica"
-#: ../../include/text.php:472
-msgid "older"
-msgstr "plus ancien"
+#: ../../addon/rtof/rtof.php:62
+msgid "rtof Settings saved."
+msgstr "Paramètres rtof sauvegardés."
-#: ../../include/text.php:474
-msgid "newer"
-msgstr "plus récent"
+#: ../../addon/rtof/rtof.php:81
+msgid "Allow posting to Friendica"
+msgstr "Autoriser la publication sur Friendica"
-#: ../../include/text.php:863
-msgid "No connections"
-msgstr "Pas de relations."
+#: ../../addon/rtof/rtof.php:85
+msgid "Send public postings to Friendica by default"
+msgstr "Par défaut, envoyer les publications publiques sur Friendica"
-#: ../../include/text.php:888
-#, php-format
-msgid "View all %s connections"
-msgstr "Voir les %s contacts"
+#: ../../addon/rtof/rtof.php:89
+msgid "Friendica API Path"
+msgstr "Chemin de l'API Friendica"
-#: ../../include/text.php:1033 ../../include/text.php:1038
-msgid "poke"
-msgstr "tapoter"
+#: ../../addon/rtof/rtof.php:89 ../../addon/redred/redred.php:103
+msgid "https://{sitename}/api"
+msgstr "https://{nomdusite}/api"
-#: ../../include/text.php:1033 ../../include/text.php:1038
-#: ../../include/conversation.php:243
-msgid "poked"
-msgstr "a tapoté"
+#: ../../addon/rtof/rtof.php:93
+msgid "Friendica login name"
+msgstr "Identifiant de connexion Friendica"
-#: ../../include/text.php:1039
-msgid "ping"
-msgstr "ping"
+#: ../../addon/rtof/rtof.php:97
+msgid "Friendica password"
+msgstr "Mot de passe de connexion Friendica"
-#: ../../include/text.php:1039
-msgid "pinged"
-msgstr "pingé"
+#: ../../addon/rtof/rtof.php:101
+msgid "Hubzilla to Friendica Post Settings"
+msgstr "Paramètres de publication de Hubzilla vers Friendica"
-#: ../../include/text.php:1040
-msgid "prod"
-msgstr "encourager"
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1137
+#: ../../include/channel.php:1294
+msgid "Status:"
+msgstr "État&nbsp;:"
-#: ../../include/text.php:1040
-msgid "prodded"
-msgstr "encouragé"
+#: ../../addon/jappixmini/jappixmini.php:309
+msgid "Activate addon"
+msgstr "Activer l'extension"
-#: ../../include/text.php:1041
-msgid "slap"
-msgstr "giffler"
+#: ../../addon/jappixmini/jappixmini.php:313
+msgid "Hide Jappixmini Chat-Widget from the webinterface"
+msgstr "Cacher le widget de chat Jappixmini de l'interface web"
-#: ../../include/text.php:1041
-msgid "slapped"
-msgstr "gifflé(e)"
+#: ../../addon/jappixmini/jappixmini.php:318
+msgid "Jabber username"
+msgstr "Identifiant Jabber"
-#: ../../include/text.php:1042
-msgid "finger"
-msgstr "pointer"
+#: ../../addon/jappixmini/jappixmini.php:324
+msgid "Jabber server"
+msgstr "Serveur Jabber"
-#: ../../include/text.php:1042
-msgid "fingered"
-msgstr "pointé"
+#: ../../addon/jappixmini/jappixmini.php:330
+msgid "Jabber BOSH host URL"
+msgstr "Adresse hôte pour Jabber BOSH"
-#: ../../include/text.php:1043
-msgid "rebuff"
-msgstr "rejetter"
+#: ../../addon/jappixmini/jappixmini.php:337
+msgid "Jabber password"
+msgstr "Mot de passe Jabber"
-#: ../../include/text.php:1043
-msgid "rebuffed"
-msgstr "rejeté"
+#: ../../addon/jappixmini/jappixmini.php:343
+msgid "Encrypt Jabber password with Hubzilla password"
+msgstr "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla"
-#: ../../include/text.php:1055
-msgid "happy"
-msgstr "heureux"
+#: ../../addon/jappixmini/jappixmini.php:347 ../../addon/redred/redred.php:115
+msgid "Hubzilla password"
+msgstr "Mot de passe Hubzilla"
-#: ../../include/text.php:1056
-msgid "sad"
-msgstr "triste"
+#: ../../addon/jappixmini/jappixmini.php:351
+#: ../../addon/jappixmini/jappixmini.php:355
+msgid "Approve subscription requests from Hubzilla contacts automatically"
+msgstr "Approuver automatiquement les demandes de connexion des contacts Hubzilla"
-#: ../../include/text.php:1057
-msgid "mellow"
-msgstr "mélancolique"
+#: ../../addon/jappixmini/jappixmini.php:359
+msgid "Purge internal list of jabber addresses of contacts"
+msgstr "Purger la liste interne des adresses jabber des contacts"
-#: ../../include/text.php:1058
-msgid "tired"
-msgstr "fatigué"
+#: ../../addon/jappixmini/jappixmini.php:364
+msgid "Configuration Help"
+msgstr "Aide pour la configuration"
-#: ../../include/text.php:1059
-msgid "perky"
-msgstr "impertinent"
+#: ../../addon/jappixmini/jappixmini.php:371
+msgid "Jappix Mini Settings"
+msgstr "Paramètres de Jappix mini"
-#: ../../include/text.php:1060
-msgid "angry"
-msgstr "en colère"
+#: ../../addon/superblock/superblock.php:112
+msgid "Currently blocked"
+msgstr "Actuellement bloqué"
-#: ../../include/text.php:1061
-msgid "stupefied"
-msgstr "stupéfait"
+#: ../../addon/superblock/superblock.php:114
+msgid "No channels currently blocked"
+msgstr "Aucun canal n'est actuellement bloqué"
-#: ../../include/text.php:1062
-msgid "puzzled"
-msgstr "perplexe"
+#: ../../addon/superblock/superblock.php:120
+msgid "\"Superblock\" Settings"
+msgstr "Paramètres \"Superblock\""
-#: ../../include/text.php:1063
-msgid "interested"
-msgstr "intéressé"
+#: ../../addon/superblock/superblock.php:345
+msgid "Block Completely"
+msgstr "Bloquer complètement"
-#: ../../include/text.php:1064
-msgid "bitter"
-msgstr "amer"
+#: ../../addon/superblock/superblock.php:394
+msgid "superblock settings updated"
+msgstr "Les paramètres du superblock ont été mis à jour"
-#: ../../include/text.php:1065
-msgid "cheerful"
-msgstr "plein d'entrain"
+#: ../../addon/nofed/nofed.php:42
+msgid "Federate"
+msgstr "Fédérer"
-#: ../../include/text.php:1066
-msgid "alive"
-msgstr "vivant"
+#: ../../addon/nofed/nofed.php:56
+msgid "nofed Settings saved."
+msgstr "Les paramètres nfed ont été enregistrés."
-#: ../../include/text.php:1067
-msgid "annoyed"
-msgstr "agaçé"
+#: ../../addon/nofed/nofed.php:72
+msgid "Allow Federation Toggle"
+msgstr "Autoriser la fédération avec Toggle"
-#: ../../include/text.php:1068
-msgid "anxious"
-msgstr "anxieux"
+#: ../../addon/nofed/nofed.php:76
+msgid "Federate posts by default"
+msgstr "Par défaut, fédérer les publications."
-#: ../../include/text.php:1069
-msgid "cranky"
-msgstr "énervé"
+#: ../../addon/nofed/nofed.php:80
+msgid "NoFed Settings"
+msgstr "Paramètres NoFed"
-#: ../../include/text.php:1070
-msgid "disturbed"
-msgstr "perturbé"
+#: ../../addon/redred/redred.php:45
+msgid "Post to Red"
+msgstr "Publier sur Red"
-#: ../../include/text.php:1071
-msgid "frustrated"
-msgstr "frustré"
+#: ../../addon/redred/redred.php:60
+msgid "Channel is required."
+msgstr "Un canal est requis."
-#: ../../include/text.php:1072
-msgid "depressed"
-msgstr "déprimé"
+#: ../../addon/redred/redred.php:76
+msgid "redred Settings saved."
+msgstr "Paramètres redred sauvegardés."
-#: ../../include/text.php:1073
-msgid "motivated"
-msgstr "motivé"
+#: ../../addon/redred/redred.php:95
+msgid "Allow posting to another Hubzilla Channel"
+msgstr "Autoriser la publication sur un autre canal Hubzilla"
-#: ../../include/text.php:1074
-msgid "relaxed"
-msgstr "détendu"
+#: ../../addon/redred/redred.php:99
+msgid "Send public postings to Hubzilla channel by default"
+msgstr "Par défaut, envoyer les publications publiques sur le canal Hubzilla"
-#: ../../include/text.php:1075
-msgid "surprised"
-msgstr "surpris"
+#: ../../addon/redred/redred.php:103
+msgid "Hubzilla API Path"
+msgstr "Chemin de l'API Hubzilla"
-#: ../../include/text.php:1257 ../../include/js_strings.php:70
-msgid "Monday"
-msgstr "Lundi"
+#: ../../addon/redred/redred.php:107
+msgid "Hubzilla login name"
+msgstr "Identifiant de connexion Hubzilla"
-#: ../../include/text.php:1257 ../../include/js_strings.php:71
-msgid "Tuesday"
-msgstr "Mardi"
+#: ../../addon/redred/redred.php:111
+msgid "Hubzilla channel name"
+msgstr "Nom du canal Hubzilla"
-#: ../../include/text.php:1257 ../../include/js_strings.php:72
-msgid "Wednesday"
-msgstr "Mercredi"
+#: ../../addon/redred/redred.php:119
+msgid "Hubzilla Crosspost Settings"
+msgstr "Paramètres Crosspost Hubzilla"
-#: ../../include/text.php:1257 ../../include/js_strings.php:73
-msgid "Thursday"
-msgstr "Jeudi"
+#: ../../addon/logrot/logrot.php:36
+msgid "Logfile archive directory"
+msgstr "Répertoire d'archivage du fichier journal"
-#: ../../include/text.php:1257 ../../include/js_strings.php:74
-msgid "Friday"
-msgstr "Vendredi"
+#: ../../addon/logrot/logrot.php:36
+msgid "Directory to store rotated logs"
+msgstr "Répertoire où stocker les journaux de rotation"
-#: ../../include/text.php:1257 ../../include/js_strings.php:75
-msgid "Saturday"
-msgstr "Samedi"
+#: ../../addon/logrot/logrot.php:37
+msgid "Logfile size in bytes before rotating"
+msgstr "Taille du fichier journal en octets avant la rotation"
-#: ../../include/text.php:1257 ../../include/js_strings.php:69
-msgid "Sunday"
-msgstr "Dimanche"
+#: ../../addon/logrot/logrot.php:38
+msgid "Number of logfiles to retain"
+msgstr "Nombre de fichiers de journal à conserver"
-#: ../../include/text.php:1261 ../../include/js_strings.php:45
-msgid "January"
-msgstr "Janvier"
+#: ../../addon/frphotos/frphotos.php:91
+msgid "Friendica Photo Album Import"
+msgstr "Importation de l'album photo Friendica "
-#: ../../include/text.php:1261 ../../include/js_strings.php:46
-msgid "February"
-msgstr "Février"
+#: ../../addon/frphotos/frphotos.php:92
+msgid "This will import all your Friendica photo albums to this Red channel."
+msgstr "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla."
-#: ../../include/text.php:1261 ../../include/js_strings.php:47
-msgid "March"
-msgstr "Mars"
+#: ../../addon/frphotos/frphotos.php:93
+msgid "Friendica Server base URL"
+msgstr "URL de base du serveur Friendica"
-#: ../../include/text.php:1261 ../../include/js_strings.php:48
-msgid "April"
-msgstr "Avril"
+#: ../../addon/frphotos/frphotos.php:94
+msgid "Friendica Login Username"
+msgstr "Identifiant de connexion Friendica"
-#: ../../include/text.php:1261
-msgid "May"
-msgstr "Mai"
+#: ../../addon/frphotos/frphotos.php:95
+msgid "Friendica Login Password"
+msgstr "Mot de passe de connexion Friendica"
-#: ../../include/text.php:1261 ../../include/js_strings.php:50
-msgid "June"
-msgstr "Juin"
+#: ../../addon/donate/donate.php:21
+msgid "Project Servers and Resources"
+msgstr "Serveurs et ressources du projet"
-#: ../../include/text.php:1261 ../../include/js_strings.php:51
-msgid "July"
-msgstr "Juillet"
+#: ../../addon/donate/donate.php:22
+msgid "Project Creator and Tech Lead"
+msgstr "Créateur et Responsable Technique du projet"
-#: ../../include/text.php:1261 ../../include/js_strings.php:52
-msgid "August"
-msgstr "Août"
+#: ../../addon/donate/donate.php:23
+msgid "Admin, developer, directorymin, support bloke"
+msgstr "Administrateur, développeur, responsable d'annuaire, équipe support"
-#: ../../include/text.php:1261 ../../include/js_strings.php:53
-msgid "September"
-msgstr "Septembre"
+#: ../../addon/donate/donate.php:50
+msgid ""
+"And the hundreds of other people and organisations who helped make the "
+"Hubzilla possible."
+msgstr "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible."
-#: ../../include/text.php:1261 ../../include/js_strings.php:54
-msgid "October"
-msgstr "Octobre"
+#: ../../addon/donate/donate.php:53
+msgid ""
+"The Redmatrix/Hubzilla projects are provided primarily by volunteers giving "
+"their time and expertise - and often paying out of pocket for services they "
+"share with others."
+msgstr "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres."
-#: ../../include/text.php:1261 ../../include/js_strings.php:55
-msgid "November"
-msgstr "Novembre"
+#: ../../addon/donate/donate.php:54
+msgid ""
+"There is no corporate funding and no ads, and we do not collect and sell "
+"your personal information. (We don't control your personal information - "
+"<strong>you do</strong>.)"
+msgstr "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)"
-#: ../../include/text.php:1261 ../../include/js_strings.php:56
-msgid "December"
-msgstr "Décembre"
+#: ../../addon/donate/donate.php:55
+msgid ""
+"Help support our ground-breaking work in decentralisation, web identity, and"
+" privacy."
+msgstr "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité."
-#: ../../include/text.php:1338 ../../include/text.php:1342
-msgid "Unknown Attachment"
-msgstr "Pièce jointe inconnue"
+#: ../../addon/donate/donate.php:57
+msgid ""
+"Your donations keep servers and services running and also helps us to "
+"provide innovative new features and continued development."
+msgstr "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu."
-#: ../../include/text.php:1344
-msgid "unknown"
-msgstr "Inconnu"
+#: ../../addon/donate/donate.php:60
+msgid "Donate"
+msgstr "Donner"
-#: ../../include/text.php:1380
-msgid "remove category"
-msgstr "supprimer la catégorie"
+#: ../../addon/donate/donate.php:62
+msgid ""
+"Choose a project, developer, or public hub to support with a one-time "
+"donation"
+msgstr "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique"
-#: ../../include/text.php:1457
-msgid "remove from file"
-msgstr "retirer du fichier"
+#: ../../addon/donate/donate.php:63
+msgid "Donate Now"
+msgstr "Donner maintenant"
-#: ../../include/text.php:1753 ../../include/text.php:1824
-msgid "default"
-msgstr "défaut"
+#: ../../addon/donate/donate.php:64
+msgid ""
+"<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project "
+"only)"
+msgstr "Or devenez un sponsor du projet (projet Hubzilla uniquement)"
-#: ../../include/text.php:1761
-msgid "Page layout"
-msgstr "Mise en page"
+#: ../../addon/donate/donate.php:65
+msgid ""
+"Please indicate if you would like your first name or full name (or nothing) "
+"to appear in our sponsor listing"
+msgstr "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors."
-#: ../../include/text.php:1761
-msgid "You can create your own with the layouts tool"
-msgstr "Créez les vôtres avec les outils de mise en page"
+#: ../../addon/donate/donate.php:66
+msgid "Sponsor"
+msgstr "Sponsors"
-#: ../../include/text.php:1803
-msgid "Page content type"
-msgstr "Type de contenu de la page"
+#: ../../addon/donate/donate.php:69
+msgid "Special thanks to: "
+msgstr "Remerciements particuliers à :"
-#: ../../include/text.php:1836
-msgid "Select an alternate language"
-msgstr "Choisir une langue alternative"
+#: ../../addon/chords/Mod_Chords.php:44
+msgid ""
+"This is a fairly comprehensive and complete guitar chord dictionary which "
+"will list most of the available ways to play a certain chord, starting from "
+"the base of the fingerboard up to a few frets beyond the twelfth fret "
+"(beyond which everything repeats). A couple of non-standard tunings are "
+"provided for the benefit of slide players, etc."
+msgstr "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc."
-#: ../../include/text.php:1953
-msgid "activity"
-msgstr "activité"
+#: ../../addon/chords/Mod_Chords.php:46
+msgid ""
+"Chord names start with a root note (A-G) and may include sharps (#) and "
+"flats (b). This software will parse most of the standard naming conventions "
+"such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."
+msgstr "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs."
-#: ../../include/text.php:2262
-msgid "Design Tools"
-msgstr "Outils de conception"
+#: ../../addon/chords/Mod_Chords.php:48
+msgid ""
+"Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, "
+"E7b13b11 ..."
+msgstr "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."
-#: ../../include/text.php:2268
-msgid "Pages"
-msgstr "Pages"
+#: ../../addon/chords/Mod_Chords.php:51
+msgid "Guitar Chords"
+msgstr "Acords de guitar"
-#: ../../include/widgets.php:103
-msgid "System"
-msgstr "Système"
+#: ../../addon/chords/Mod_Chords.php:52
+msgid "The complete online chord dictionary"
+msgstr "Le dictionnaire en ligne complet des accords"
-#: ../../include/widgets.php:106
-msgid "New App"
-msgstr ""
+#: ../../addon/chords/Mod_Chords.php:57
+msgid "Tuning"
+msgstr "Réglage"
-#: ../../include/widgets.php:154
-msgid "Suggestions"
-msgstr "Suggestions"
+#: ../../addon/chords/Mod_Chords.php:58
+msgid "Chord name: example: Em7"
+msgstr "Nom d'accord. Exemple : Em7."
-#: ../../include/widgets.php:155
-msgid "See more..."
-msgstr "Voir plus..."
+#: ../../addon/chords/Mod_Chords.php:59
+msgid "Show for left handed stringing"
+msgstr "Montrer pour les gauchers"
-#: ../../include/widgets.php:175
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Vous avez %1$.0f sur %2$.0f contacts autorisés."
+#: ../../addon/chords/chords.php:33
+msgid "Quick Reference"
+msgstr "Référence rapide"
-#: ../../include/widgets.php:181
-msgid "Add New Connection"
-msgstr "Ajouter un nouveau contact"
+#: ../../addon/libertree/libertree.php:38
+msgid "Post to Libertree"
+msgstr "Publier sur Libertree"
-#: ../../include/widgets.php:182
-msgid "Enter channel address"
-msgstr "Saisissez l'adresse du canal"
+#: ../../addon/libertree/libertree.php:69
+msgid "Enable Libertree Post Plugin"
+msgstr "Activer le plugin de publication Libertree"
-#: ../../include/widgets.php:183
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie"
+#: ../../addon/libertree/libertree.php:73
+msgid "Libertree API token"
+msgstr "Jeton de l'API Libertree"
-#: ../../include/widgets.php:199
-msgid "Notes"
-msgstr "Notes"
+#: ../../addon/libertree/libertree.php:77
+msgid "Libertree site URL"
+msgstr "Adresse du site Libertree"
-#: ../../include/widgets.php:273
-msgid "Remove term"
-msgstr "Retirer le terme"
+#: ../../addon/libertree/libertree.php:81
+msgid "Post to Libertree by default"
+msgstr "Par défaut, publier sur Libertree"
-#: ../../include/widgets.php:281 ../../include/features.php:84
-msgid "Saved Searches"
-msgstr "Recherches sauvegardées"
+#: ../../addon/libertree/libertree.php:85
+msgid "Libertree Post Settings"
+msgstr "Paramètres de publication pour Libertree"
-#: ../../include/widgets.php:282 ../../include/group.php:316
-msgid "add"
-msgstr "ajouter"
+#: ../../addon/libertree/libertree.php:99
+msgid "Libertree Settings saved."
+msgstr "Paramètres de Libertree sauvegardés."
-#: ../../include/widgets.php:310 ../../include/contact_widgets.php:53
-#: ../../include/features.php:98
-msgid "Saved Folders"
-msgstr "Dossiers sauvegardés"
+#: ../../addon/flattrwidget/flattrwidget.php:45
+msgid "Flattr this!"
+msgstr "Flattr this!"
-#: ../../include/widgets.php:313 ../../include/widgets.php:432
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-msgid "Everything"
-msgstr "Tout"
+#: ../../addon/flattrwidget/flattrwidget.php:83
+msgid "Flattr widget settings updated."
+msgstr "Les paramètres du widget Flattr ont été mis à jour"
-#: ../../include/widgets.php:354
-msgid "Archives"
-msgstr "Archives"
+#: ../../addon/flattrwidget/flattrwidget.php:100
+msgid "Flattr user"
+msgstr "Utilisateur de Flattr"
-#: ../../include/widgets.php:516
-msgid "Refresh"
-msgstr "Actualiser"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "URL of the Thing to flattr"
+msgstr "URL de ce que vous voulez flattr"
-#: ../../include/widgets.php:556
-msgid "Account settings"
-msgstr "Paramètres du compte"
+#: ../../addon/flattrwidget/flattrwidget.php:104
+msgid "If empty channel URL is used"
+msgstr "Si une url vide est utilisée"
-#: ../../include/widgets.php:562
-msgid "Channel settings"
-msgstr "Paramètres du canal"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "Title of the Thing to flattr"
+msgstr "Titre de ce que vous voulez flattr"
-#: ../../include/widgets.php:571
-msgid "Additional features"
-msgstr "Fonctionnalités supplémentaires"
+#: ../../addon/flattrwidget/flattrwidget.php:108
+msgid "If empty \"channel name on The Hubzilla\" will be used"
+msgstr "Si vide, \"nom du canal sur Hubzilla\" sera utilisé"
-#: ../../include/widgets.php:578
-msgid "Feature/Addon settings"
-msgstr "Paramètres des extensions/greffons"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "Static or dynamic flattr button"
+msgstr "Statique ou dynamique bouton Flattr"
-#: ../../include/widgets.php:584
-msgid "Display settings"
-msgstr "Paramètres d'affichage"
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "static"
+msgstr "statique"
-#: ../../include/widgets.php:591
-msgid "Manage locations"
-msgstr ""
+#: ../../addon/flattrwidget/flattrwidget.php:112
+msgid "dynamic"
+msgstr "dynamique"
-#: ../../include/widgets.php:600
-msgid "Export channel"
-msgstr "Exporter le canal"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "Alignment of the widget"
+msgstr "Alignement du widget"
-#: ../../include/widgets.php:607
-msgid "Connected apps"
-msgstr "Applications connectées"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "left"
+msgstr "gauche"
-#: ../../include/widgets.php:622
-msgid "Premium Channel Settings"
-msgstr "Paramètres de canal VIP"
+#: ../../addon/flattrwidget/flattrwidget.php:116
+msgid "right"
+msgstr "droite"
-#: ../../include/widgets.php:651
-msgid "Private Mail Menu"
-msgstr "Menu des messages privés"
+#: ../../addon/flattrwidget/flattrwidget.php:120
+msgid "Enable Flattr widget"
+msgstr "Activer le widget Flattr"
-#: ../../include/widgets.php:653
-msgid "Combined View"
-msgstr "Vue combinée"
+#: ../../addon/flattrwidget/flattrwidget.php:124
+msgid "Flattr Widget Settings"
+msgstr "Paramètres du widget Flattr"
-#: ../../include/widgets.php:658 ../../include/nav.php:196
-msgid "Inbox"
-msgstr "Boîte de réception"
+#: ../../addon/statusnet/statusnet.php:143
+msgid "Post to GNU social"
+msgstr "Publier sur GNU-social"
-#: ../../include/widgets.php:663 ../../include/nav.php:197
-msgid "Outbox"
-msgstr "Boîte d'envoi"
+#: ../../addon/statusnet/statusnet.php:195
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "Veuillez contacter l'administrateur de votre site. L'URL de l'API n'est pas valide."
-#: ../../include/widgets.php:668 ../../include/nav.php:198
-msgid "New Message"
-msgstr "Nouveau message"
+#: ../../addon/statusnet/statusnet.php:232
+msgid "We could not contact the GNU social API with the Path you entered."
+msgstr "Nous ne pouvons pas contacter l'API de GNU-social avec le chemin que vous avez entré."
-#: ../../include/widgets.php:685 ../../include/widgets.php:697
-msgid "Conversations"
-msgstr "Conversations"
+#: ../../addon/statusnet/statusnet.php:266
+msgid "GNU social settings updated."
+msgstr "Les paramètres GNU-social ont été mis à jour."
-#: ../../include/widgets.php:689
-msgid "Received Messages"
-msgstr "Messages reçus"
+#: ../../addon/statusnet/statusnet.php:310
+msgid "Globally Available GNU social OAuthKeys"
+msgstr "Les OAuthKeys GNU-social sont globalement disponibles."
-#: ../../include/widgets.php:693
-msgid "Sent Messages"
-msgstr "Messages envoyés"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"There are preconfigured OAuth key pairs for some GNU social servers "
+"available. If you are using one of them, please use these credentials.<br "
+"/>If not feel free to connect to any other GNU social instance (see below)."
+msgstr "Il existe des paires de clés OAuth préconfigurées pour certains serveurs GNU-social disponibles. Si vous utilisez l'un d'eux, utilisez ces informations d'identification.\nSi vous ne voulez pas vous connecter à une autre instance GNU social (voir ci-dessous)."
-#: ../../include/widgets.php:707
-msgid "No messages."
-msgstr "Pas de message."
+#: ../../addon/statusnet/statusnet.php:327
+msgid "Provide your own OAuth Credentials"
+msgstr "Fournissez vos propres informations d'identification OAuth"
-#: ../../include/widgets.php:725
-msgid "Delete conversation"
-msgstr "Supprimer la conversation"
+#: ../../addon/statusnet/statusnet.php:329
+msgid ""
+"No consumer key pair for GNU social found. Register your Hubzilla Account as"
+" an desktop client on your GNU social account, copy the consumer key pair "
+"here and enter the API base root.<br />Before you register your own OAuth "
+"key pair ask the administrator if there is already a key pair for this "
+"Hubzilla installation at your favourite GNU social installation."
+msgstr "Aucune paire de clés utilisateur n'a été trouvée pour GNU-social. Enregistrer votre compte Hubzilla en tant que client de bureau sur votre compte GNU-social, puis copier la paire de clés utilisateur ici et entrer la racine de base de l'API.\nAvant d'enregistrer votre propre paire de clés OAuth, demandez à l'administrateur s'il existe déjà une paire de clés pour cette installation de Hubzilla à votre installation GNU-social préférée."
-#: ../../include/widgets.php:751
-msgid "Events Menu"
-msgstr "Menu Evènements"
+#: ../../addon/statusnet/statusnet.php:333
+msgid "OAuth Consumer Key"
+msgstr "Clé d'utilisateur OAuth"
-#: ../../include/widgets.php:752
-msgid "Day View"
-msgstr "Vue Jour"
+#: ../../addon/statusnet/statusnet.php:337
+msgid "OAuth Consumer Secret"
+msgstr "Secret d'utilisateur OAuth"
-#: ../../include/widgets.php:753
-msgid "Week View"
-msgstr "Vue Semaine"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Base API Path"
+msgstr "Chemin de l'API de base"
-#: ../../include/widgets.php:754
-msgid "Month View"
-msgstr "Vue Mois"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Remember the trailing /"
+msgstr "N'oubliez pas le / final"
-#: ../../include/widgets.php:766
-msgid "Events Tools"
-msgstr "Outils Evènements"
+#: ../../addon/statusnet/statusnet.php:345
+msgid "GNU social application name"
+msgstr "Nom de l'application GNU-social"
-#: ../../include/widgets.php:767
-msgid "Export Calendar"
-msgstr "Exporter le calendrier"
+#: ../../addon/statusnet/statusnet.php:368
+msgid ""
+"To connect to your GNU social account click the button below to get a "
+"security code from GNU social which you have to copy into the input box "
+"below and submit the form. Only your <strong>public</strong> posts will be "
+"posted to GNU social."
+msgstr "Pour vous connecter à votre compte GNU-social, cliquez sur le bouton ci-dessous pour obtenir un code de sécurité de GNU-social. Vous devez le copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront visibles sur GNU-social."
-#: ../../include/widgets.php:768
-msgid "Import Calendar"
-msgstr "Importer un calendrier"
+#: ../../addon/statusnet/statusnet.php:370
+msgid "Log in with GNU social"
+msgstr "Vous connecter avec GNU-social"
-#: ../../include/widgets.php:842 ../../include/conversation.php:1662
-#: ../../include/conversation.php:1665
-msgid "Chatrooms"
-msgstr "Salons de clavardage"
+#: ../../addon/statusnet/statusnet.php:373
+msgid "Copy the security code from GNU social here"
+msgstr "Copier ici le code de sécurité de GNU-social."
-#: ../../include/widgets.php:846
-msgid "Overview"
-msgstr ""
+#: ../../addon/statusnet/statusnet.php:383
+msgid "Cancel Connection Process"
+msgstr "Annuler le processus de connexion"
-#: ../../include/widgets.php:853
-msgid "Chat Members"
-msgstr ""
+#: ../../addon/statusnet/statusnet.php:385
+msgid "Current GNU social API is"
+msgstr "L'API GNU-social courante est"
-#: ../../include/widgets.php:876
-msgid "Bookmarked Chatrooms"
-msgstr "Salons favoris"
+#: ../../addon/statusnet/statusnet.php:389
+msgid "Cancel GNU social Connection"
+msgstr "Annuler la connexion GNU-social"
-#: ../../include/widgets.php:899
-msgid "Suggested Chatrooms"
-msgstr "Salons suggérés"
+#: ../../addon/statusnet/statusnet.php:401 ../../addon/twitter/twitter.php:232
+msgid "Currently connected to: "
+msgstr "Actuellement connecté à :"
-#: ../../include/widgets.php:1044 ../../include/widgets.php:1156
-msgid "photo/image"
-msgstr "photo/image"
+#: ../../addon/statusnet/statusnet.php:406
+msgid ""
+"<strong>Note</strong>: Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to GNU social will lead the visitor to a blank page "
+"informing the visitor that the access to your profile has been restricted."
+msgstr "Remarque : en raison de vos paramètres de confidentialité (masquer les détails de votre profil aux visiteurs inconnus? ), le lien potentiellement inclus dans les annonces publiques relayées sur GNU-social amènera le visiteur à une page vierge informant le visiteur que l'accès à votre profil a été restreint."
-#: ../../include/widgets.php:1099
-msgid "Click to show more"
-msgstr "Cliquer pour voir plus"
+#: ../../addon/statusnet/statusnet.php:411
+msgid "Allow posting to GNU social"
+msgstr "Autoriser la publication sur GNU-social"
-#: ../../include/widgets.php:1250
-msgid "Rating Tools"
-msgstr "Outils d'évaluation"
+#: ../../addon/statusnet/statusnet.php:411
+msgid ""
+"If enabled your public postings can be posted to the associated GNU-social "
+"account"
+msgstr "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte GNU-social associé."
-#: ../../include/widgets.php:1254 ../../include/widgets.php:1256
-msgid "Rate Me"
-msgstr "M'évaluer"
+#: ../../addon/statusnet/statusnet.php:415
+msgid "Post to GNU social by default"
+msgstr "Par défaut, publier sur GNU-social"
-#: ../../include/widgets.php:1259
-msgid "View Ratings"
-msgstr "Voir mes évaluations"
+#: ../../addon/statusnet/statusnet.php:415
+msgid ""
+"If enabled your public postings will be posted to the associated GNU-social "
+"account by default"
+msgstr "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte GNU-social associé"
-#: ../../include/widgets.php:1316
-msgid "Forums"
-msgstr "Membres du forum"
+#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:255
+msgid "Clear OAuth configuration"
+msgstr "Effacer la configuration OAuth"
-#: ../../include/widgets.php:1345
-msgid "Tasks"
-msgstr "Tâches"
+#: ../../addon/statusnet/statusnet.php:432
+msgid "GNU social Post Settings"
+msgstr "Paramètres de publication GNU-social"
-#: ../../include/widgets.php:1354
-msgid "Documentation"
-msgstr "Documentation"
+#: ../../addon/statusnet/statusnet.php:891
+msgid "API URL"
+msgstr "URL de l'API"
-#: ../../include/widgets.php:1356
-msgid "Project/Site Information"
-msgstr "Information sur le site/projet"
+#: ../../addon/statusnet/statusnet.php:894
+msgid "Application name"
+msgstr "Nom de l'application"
-#: ../../include/widgets.php:1357
-msgid "For Members"
-msgstr "Pour les membres"
+#: ../../addon/qrator/qrator.php:48
+msgid "QR code"
+msgstr "QR code"
-#: ../../include/widgets.php:1358
-msgid "For Administrators"
-msgstr "Pour les administrateurs"
+#: ../../addon/qrator/qrator.php:63
+msgid "QR Generator"
+msgstr "Générateur de QRcode"
-#: ../../include/widgets.php:1359
-msgid "For Developers"
-msgstr "Pour les développeurs"
+#: ../../addon/qrator/qrator.php:64
+msgid "Enter some text"
+msgstr "Entrer du texte"
-#: ../../include/widgets.php:1383 ../../include/widgets.php:1421
-msgid "Member registrations waiting for confirmation"
-msgstr ""
+#: ../../addon/chess/chess.php:276 ../../addon/chess/chess.php:433
+msgid "Invalid game."
+msgstr "Jeu invalide"
-#: ../../include/widgets.php:1389
-msgid "Inspect queue"
-msgstr "Analyser la file d'attente"
+#: ../../addon/chess/chess.php:282 ../../addon/chess/chess.php:439
+msgid "You are not a player in this game."
+msgstr "Vous n'êtes pas un joueur de ce jeu."
-#: ../../include/widgets.php:1391
-msgid "DB updates"
-msgstr "Mises à jour BDD"
+#: ../../addon/chess/chess.php:315
+msgid "You must be a local channel to create a game."
+msgstr "Vous devez être un canal local pour créer un jeu."
-#: ../../include/widgets.php:1416 ../../include/nav.php:216
-msgid "Admin"
-msgstr "Administrateur"
+#: ../../addon/chess/chess.php:333
+msgid "You must select one opponent that is not yourself."
+msgstr "Vous devez sélectionner un adversaire qui ne soit pas vous-même."
-#: ../../include/widgets.php:1417
-msgid "Plugin Features"
-msgstr "Fonctionnalités des greffons"
+#: ../../addon/chess/chess.php:336
+msgid "Creating new game..."
+msgstr "en train de créer un nouveau jeu…"
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
-msgstr "Ce canal est bloqué sur ce site."
+#: ../../addon/chess/chess.php:342
+msgid "You must select white or black."
+msgstr "Vous devez sélectionner les blancs ou les noirs."
-#: ../../include/follow.php:32
-msgid "Channel location missing."
-msgstr "Emplacement du canal introuvable."
+#: ../../addon/chess/chess.php:349
+msgid "Error creating new game."
+msgstr "Erreur lors de la création du nouveau jeu."
-#: ../../include/follow.php:81
-msgid "Response from remote channel was incomplete."
-msgstr "La réponse du canal distant était incomplète."
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:897
+msgid "Requested channel is not available."
+msgstr "Canal demandé non disponible."
-#: ../../include/follow.php:98
-msgid "Channel was deleted and no longer exists."
-msgstr "Le canal a été supprimé et n'existe plus."
+#: ../../addon/chess/chess.php:395
+msgid "You must select a local channel /chess/channelname"
+msgstr "Vous devez sélectionner un canal local /échecs/nomducanal"
-#: ../../include/follow.php:154 ../../include/follow.php:190
-msgid "Protocol disabled."
-msgstr "Protocole désactivé."
+#: ../../addon/chess/chess.php:923
+msgid "Enable notifications"
+msgstr "Activer les notifications"
-#: ../../include/follow.php:178
-msgid "Channel discovery failed."
-msgstr "La tentative d'accéder au canal a échoué."
+#: ../../addon/twitter/twitter.php:99
+msgid "Post to Twitter"
+msgstr "Publier sur Twitter"
-#: ../../include/follow.php:216
-msgid "Cannot connect to yourself."
-msgstr "Ne peut pas se connecter à vous."
+#: ../../addon/twitter/twitter.php:154
+msgid "Twitter settings updated."
+msgstr "Les paramètres de Twitter ont été mis à jour."
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "Favoris de %1$s"
+#: ../../addon/twitter/twitter.php:183
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site."
-#: ../../include/api.php:1336
-msgid "Public Timeline"
-msgstr "Fil public"
-
-#: ../../include/bbcode.php:123 ../../include/bbcode.php:844
-#: ../../include/bbcode.php:847 ../../include/bbcode.php:852
-#: ../../include/bbcode.php:855 ../../include/bbcode.php:858
-#: ../../include/bbcode.php:861 ../../include/bbcode.php:866
-#: ../../include/bbcode.php:869 ../../include/bbcode.php:874
-#: ../../include/bbcode.php:877 ../../include/bbcode.php:880
-#: ../../include/bbcode.php:883
-msgid "Image/photo"
-msgstr "Image/photo"
+#: ../../addon/twitter/twitter.php:205
+msgid ""
+"At this Hubzilla instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter."
-#: ../../include/bbcode.php:162 ../../include/bbcode.php:894
-msgid "Encrypted content"
-msgstr "Contenu chiffré"
+#: ../../addon/twitter/twitter.php:207
+msgid "Log in with Twitter"
+msgstr "Connectez-vous avec votre compte Twitter"
-#: ../../include/bbcode.php:178
-#, php-format
-msgid "Install %s element: "
-msgstr "Installer %s élément"
+#: ../../addon/twitter/twitter.php:210
+msgid "Copy the PIN from Twitter here"
+msgstr "Copier ici le PIN fourni par Twitter"
-#: ../../include/bbcode.php:182
-#, php-format
+#: ../../addon/twitter/twitter.php:237
msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Ce message contient un élément installable %s, mais vous n'avez pas l'autorisation de l'installer sur ce site."
+"<strong>Note:</strong> Due your privacy settings (<em>Hide your profile "
+"details from unknown viewers?</em>) the link potentially included in public "
+"postings relayed to Twitter will lead the visitor to a blank page informing "
+"the visitor that the access to your profile has been restricted."
+msgstr "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint."
-#: ../../include/bbcode.php:254
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s a écrit %2$s qui suit %3$s"
+#: ../../addon/twitter/twitter.php:242
+msgid "Allow posting to Twitter"
+msgstr "Autoriser la publication sur Twitter"
-#: ../../include/bbcode.php:331 ../../include/bbcode.php:339
-msgid "Click to open/close"
-msgstr "Cliquer pour ouvrir/fermer"
+#: ../../addon/twitter/twitter.php:242
+msgid ""
+"If enabled your public postings can be posted to the associated Twitter "
+"account"
+msgstr "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé."
-#: ../../include/bbcode.php:339
-msgid "spoiler"
-msgstr ""
+#: ../../addon/twitter/twitter.php:246
+msgid "Send public postings to Twitter by default"
+msgstr "Par défaut, envoyer vos publications publiques sur Twitter."
-#: ../../include/bbcode.php:585
-msgid "Different viewers will see this text differently"
-msgstr "Ce texte aura un rendu différent en fonction des utilisateurs"
+#: ../../addon/twitter/twitter.php:246
+msgid ""
+"If enabled your public postings will be posted to the associated Twitter "
+"account by default"
+msgstr "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé."
-#: ../../include/bbcode.php:832
-msgid "$1 wrote:"
-msgstr "$1 a écrit&nbsp;:"
+#: ../../addon/twitter/twitter.php:264
+msgid "Twitter Post Settings"
+msgstr "Paramètres des publications Twitter"
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Options d'annuaire"
+#: ../../addon/smileybutton/smileybutton.php:273
+msgid "Deactivate the feature"
+msgstr "Désactiver la fonctionnalité"
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Mode sûr"
+#: ../../addon/smileybutton/smileybutton.php:277
+msgid "Hide the button and show the smilies directly."
+msgstr "Cacher le bouton et afficher les émoticônes directement."
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Les forums publics uniquement"
+#: ../../addon/smileybutton/smileybutton.php:281
+msgid "Smileybutton Settings"
+msgstr "Paramètres du bouton des émoticônes"
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Ce site uniquement"
+#: ../../addon/piwik/piwik.php:85
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>."
-#: ../../include/security.php:383
+#: ../../addon/piwik/piwik.php:88
+#, php-format
msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures)."
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out)."
-#: ../../include/nav.php:82 ../../include/nav.php:113 ../../boot.php:1702
-msgid "Logout"
-msgstr "Déconnexion"
+#: ../../addon/piwik/piwik.php:96
+msgid "Piwik Base URL"
+msgstr "URL de base Piwik"
-#: ../../include/nav.php:82 ../../include/nav.php:113
-msgid "End this session"
-msgstr "Mettre fin à la session"
+#: ../../addon/piwik/piwik.php:96
+msgid ""
+"Absolute path to your Piwik installation. (without protocol (http/s), with "
+"trailing slash)"
+msgstr "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)"
-#: ../../include/nav.php:85 ../../include/nav.php:144
-msgid "Home"
-msgstr "Mon canal"
+#: ../../addon/piwik/piwik.php:97
+msgid "Site ID"
+msgstr "ID du site"
-#: ../../include/nav.php:85
-msgid "Your posts and conversations"
-msgstr "Vos publications et conversations"
+#: ../../addon/piwik/piwik.php:98
+msgid "Show opt-out cookie link?"
+msgstr "Afficher le lien opt-out du cookie ?"
-#: ../../include/nav.php:86
-msgid "Your profile page"
-msgstr "Votre profil"
+#: ../../addon/piwik/piwik.php:99
+msgid "Asynchronous tracking"
+msgstr "Traqueur asynchrone"
-#: ../../include/nav.php:88
-msgid "Manage/Edit profiles"
-msgstr "Gérer/modifier les profils"
+#: ../../addon/piwik/piwik.php:100
+msgid "Enable frontend JavaScript error tracking"
+msgstr "Activer le traqueur d'erreur du frontend JavaScript"
-#: ../../include/nav.php:90 ../../include/channel.php:941
-msgid "Edit Profile"
-msgstr "Éditeur de profil"
+#: ../../addon/piwik/piwik.php:100
+msgid "This feature requires Piwik >= 2.2.0"
+msgstr "Cette fonctionnalité requiert une version de Piwik >=2.2.0"
-#: ../../include/nav.php:90
-msgid "Edit your profile"
-msgstr "Modifier votre profil"
+#: ../../addon/tour/tour.php:75
+msgid "Edit your profile and change settings."
+msgstr "Éditer votre profil et changer les paramètres."
-#: ../../include/nav.php:92
-msgid "Your photos"
-msgstr "Vos photos"
+#: ../../addon/tour/tour.php:76
+msgid "Click here to see activity from your connections."
+msgstr "Cliquer ici pour voir l'activité de vos connections."
-#: ../../include/nav.php:93
-msgid "Your files"
-msgstr "Vos fichiers"
+#: ../../addon/tour/tour.php:77
+msgid "Click here to see your channel home."
+msgstr "Cliquer ici pour voir votre canal principal."
-#: ../../include/nav.php:96
-msgid "Your chatrooms"
-msgstr "Vos salons"
+#: ../../addon/tour/tour.php:78
+msgid "You can access your private messages from here."
+msgstr "Vous pouvez accéder à vos messages privés à partir d'ici."
-#: ../../include/nav.php:102 ../../include/conversation.php:1675
-msgid "Bookmarks"
-msgstr "Favoris"
+#: ../../addon/tour/tour.php:79
+msgid "Create new events here."
+msgstr "Créer de nouveaux événements ici."
-#: ../../include/nav.php:102
-msgid "Your bookmarks"
-msgstr "Vos favoris"
+#: ../../addon/tour/tour.php:80
+msgid ""
+"You can accept new connections and change permissions for existing ones "
+"here. You can also e.g. create groups of contacts."
+msgstr "Vous pouvez accepter de nouvelles connections et changer les permissions des connections existantes. Vous pouvez également créer des groupes de contacts."
-#: ../../include/nav.php:106
-msgid "Your webpages"
-msgstr "Vos pages web"
+#: ../../addon/tour/tour.php:81
+msgid "System notifications will arrive here"
+msgstr "Les notifications du système arriveront ici."
-#: ../../include/nav.php:110
-msgid "Sign in"
-msgstr "Connexion"
+#: ../../addon/tour/tour.php:82
+msgid "Search for content and users"
+msgstr "Rechercher du contenu ou des utilisateurs"
-#: ../../include/nav.php:127
-#, php-format
-msgid "%s - click to logout"
-msgstr "%s - cliquer ici pour déconnecter"
+#: ../../addon/tour/tour.php:83
+msgid "Browse for new contacts"
+msgstr "Rechercher de nouveaux contacts"
-#: ../../include/nav.php:130
-msgid "Remote authentication"
-msgstr "Authentification distante"
+#: ../../addon/tour/tour.php:84
+msgid "Launch installed apps"
+msgstr "Démarrer des applications installées"
-#: ../../include/nav.php:130
-msgid "Click to authenticate to your home hub"
-msgstr "S'authentifier auprès de votre hub principal"
+#: ../../addon/tour/tour.php:85
+msgid "Looking for help? Click here."
+msgstr "Un peu d'aide ? Cliquer ici."
-#: ../../include/nav.php:144
-msgid "Home Page"
-msgstr "Page d'accueil"
+#: ../../addon/tour/tour.php:86
+msgid ""
+"New events have occurred in your network. Click here to see what has "
+"happened!"
+msgstr "De nouveaux événement se sont produits dans votre réseau. Cliquer ici pour voir ce qui s'est passé !"
-#: ../../include/nav.php:147
-msgid "Create an account"
-msgstr "Créer un compte"
+#: ../../addon/tour/tour.php:87
+msgid "You have received a new private message. Click here to see from who!"
+msgstr "Vous avez reçu un nouveau message privé. Cliquer ici pour voir qui vous écrit !"
-#: ../../include/nav.php:159
-msgid "Help and documentation"
-msgstr "Aide et documentation"
+#: ../../addon/tour/tour.php:88
+msgid "There are events this week. Click here too see which!"
+msgstr "Il y a des événements cette semaine. Cliquer ici pour voir lesquels !"
-#: ../../include/nav.php:163
-msgid "Applications, utilities, links, games"
-msgstr "Applications, utilitaires, liens, jeux"
+#: ../../addon/tour/tour.php:89
+msgid "You have received a new introduction. Click here to see who!"
+msgstr "Vous avez reçu une nouvelle demande de relation. Cliquer ici pour voir de qui !"
-#: ../../include/nav.php:165
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Recherche @nom, #tag, contenu"
+#: ../../addon/tour/tour.php:90
+msgid ""
+"There is a new system notification. Click here to see what has happened!"
+msgstr "Vous avez reçu une notification du système. Cliquer ici pour voir ce qui se passe !"
-#: ../../include/nav.php:167
-msgid "Channel Directory"
-msgstr "Annuaire des canaux"
+#: ../../addon/tour/tour.php:93
+msgid "Click here to share text, images, videos and sound."
+msgstr "Cliquer ici pour partager du texte, des images, des vidéos ou du son."
-#: ../../include/nav.php:179
-msgid "Your grid"
-msgstr "Votre réseau"
+#: ../../addon/tour/tour.php:94
+msgid "You can write an optional title for your update (good for long posts)."
+msgstr "Vous pouvez ajouter à votre mise à jour un titre facultatif (pratique pour de longues publications)."
-#: ../../include/nav.php:180
-msgid "Mark all grid notifications seen"
-msgstr "Marquer toutes les notifications du réseau comme vues"
+#: ../../addon/tour/tour.php:95
+msgid "Entering some categories here makes it easier to find your post later."
+msgstr "Renseigner certaines catégories ici permet de retrouver plus facilement votre message plus tard."
-#: ../../include/nav.php:182
-msgid "Channel home"
-msgstr "Mon canal"
+#: ../../addon/tour/tour.php:96
+msgid "Share photos, links, location, etc."
+msgstr "Partager des photos, des liens, des localisations, etc."
-#: ../../include/nav.php:183
-msgid "Mark all channel notifications seen"
-msgstr "Marquer toutes les notifications du canal comme vues"
+#: ../../addon/tour/tour.php:97
+msgid ""
+"Only want to share content for a while? Make it expire at a certain date."
+msgstr "Envie de partager un contenu pour une durée limitée ? Faites-le expirer à une certaine date."
-#: ../../include/nav.php:189
-msgid "Notices"
-msgstr "Notifications"
+#: ../../addon/tour/tour.php:98
+msgid "You can password protect content."
+msgstr "Vous pouvez protéger un contenu avec un mot de passe."
-#: ../../include/nav.php:189
-msgid "Notifications"
-msgstr "Notifications"
+#: ../../addon/tour/tour.php:99
+msgid "Choose who you share with."
+msgstr "Choisir avec qui vous partagez."
-#: ../../include/nav.php:190
-msgid "See all notifications"
-msgstr "Voir toutes les notifications"
+#: ../../addon/tour/tour.php:101
+msgid "Click here when you are done."
+msgstr "Cliquer ici quand vous avez fini."
-#: ../../include/nav.php:193
-msgid "Private mail"
-msgstr "Messages privés"
+#: ../../addon/tour/tour.php:104
+msgid "Adjust from which channels posts should be displayed."
+msgstr "Préciser de quels canaux les publications seront affichées."
-#: ../../include/nav.php:194
-msgid "See all private messages"
-msgstr "Voir tous les messages privés"
+#: ../../addon/tour/tour.php:105
+msgid "Only show posts from channels in the specified privacy group."
+msgstr "Afficher uniquement les messages des canaux appartenant au groupe de contacts spécifié."
-#: ../../include/nav.php:195
-msgid "Mark all private messages seen"
-msgstr "Marquer tous les messages privés comme vus"
+#: ../../addon/tour/tour.php:109
+msgid "Easily find posts containing tags (keywords preceded by the \"#\" symbol)."
+msgstr "Trouvez facilement des publications contenant des tags (mots-clés précédés du symbole \"#\")."
-#: ../../include/nav.php:201
-msgid "Event Calendar"
-msgstr "Calendrier des événements"
+#: ../../addon/tour/tour.php:110
+msgid "Easily find posts in given category."
+msgstr "Trouvez facilement des publications dans une catégorie donnée."
-#: ../../include/nav.php:202
-msgid "See all events"
-msgstr "Voir tous les événements"
+#: ../../addon/tour/tour.php:111
+msgid "Easily find posts by date."
+msgstr "Trouvez facilement des publications en fonction de leur date."
-#: ../../include/nav.php:203
-msgid "Mark all events seen"
-msgstr "Marquer tous les événements comme vus"
+#: ../../addon/tour/tour.php:112
+msgid ""
+"Suggested users who have volounteered to be shown as suggestions, and who we"
+" think you might find interesting."
+msgstr "Voici des utilisateurs que vous pourriez trouver intéressants. Ces utilisateurs se sont portés volontaires pour être affichés comme exemples."
-#: ../../include/nav.php:206
-msgid "Manage Your Channels"
-msgstr "Gérer vos canaux"
+#: ../../addon/tour/tour.php:113
+msgid "Here you see channels you have connected to."
+msgstr "Retrouvez ici les canaux auxquels vous vous êtes connectés."
-#: ../../include/nav.php:208
-msgid "Account/Channel Settings"
-msgstr "Paramètres du Compte/Canal"
+#: ../../addon/tour/tour.php:114
+msgid "Save your search so you can repeat it at a later date."
+msgstr "Enregistrer votre recherche de façon à pouvoir la répéter plus tard."
-#: ../../include/nav.php:216
-msgid "Site Setup and Configuration"
-msgstr "Configuration du site"
+#: ../../addon/tour/tour.php:117
+msgid ""
+"If you see this icon you can be sure that the sender is who it say it is. It"
+" is normal that it is not always possible to verify the sender, so the icon "
+"will be missing sometimes. There is usually no need to worry about that."
+msgstr "Si vous voyez cette icône, vous pouvez être sûr que l'expéditeur est qui il dit qu'il est. Il est normal qu'il ne soit pas toujours possible de vérifier l'expéditeur, donc l'icône manquera parfois. Il n'est généralement pas nécessaire de s'inquiéter à ce sujet."
-#: ../../include/nav.php:247 ../../include/conversation.php:851
-msgid "Loading..."
-msgstr "Chargement..."
+#: ../../addon/tour/tour.php:118
+msgid ""
+"Danger! It seems someone tried to forge a message! This message is not "
+"necessarily from who it says it is from!"
+msgstr "Attention ! Il semble que quelqu'un a essayé de contrefaire un message ! Ce message n'a pas nécessairement été envoyé par la personne annoncée !"
-#: ../../include/nav.php:252
-msgid "@name, #tag, ?doc, content"
-msgstr "@nom, #étiquette, ?doc, contenu"
+#: ../../addon/tour/tour.php:125
+msgid ""
+"Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can "
+"pause it at any time and continue where you left off by reloading the page, "
+"or navigting to another page.</p><p>You can also advance by pressing the "
+"return key"
+msgstr "Bienvenue sur Hubzilla! Voulez-vous faire un tour de l'interface utilisateur? Vous pouvez le mettre en pause à tout moment et continuer où vous l'avez laissé en rechargeant la page ou en naviguant vers une autre page. Vous pouvez également avancer en appuyant sur la touche de retour."
-#: ../../include/nav.php:253
-msgid "Please wait..."
-msgstr "Merci de patienter..."
+#: ../../addon/sendzid/sendzid.php:25
+msgid "Extended Identity Sharing"
+msgstr "Partage d'identification étendu"
-#: ../../include/connections.php:95
-msgid "New window"
-msgstr "Nouvelle fenêtre"
+#: ../../addon/sendzid/sendzid.php:26
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice."
-#: ../../include/connections.php:96
-msgid "Open the selected location in a different window or browser tab"
-msgstr "Ouvrir l'emplacement dans une fenêtre ou un onglet différent"
+#: ../../addon/tictac/tictac.php:21
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Tic-tac-toe en 3 dimensions"
-#: ../../include/connections.php:214
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Utilisateur '%s' supprimé"
+#: ../../addon/tictac/tictac.php:54
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../include/contact_widgets.php:11
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invitation disponible"
-msgstr[1] "%d invitations disponibles"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game"
+msgstr "Nouveau jeu"
-#: ../../include/contact_widgets.php:19
-msgid "Find Channels"
-msgstr "Trouver des canaux"
+#: ../../addon/tictac/tictac.php:60
+msgid "New game with handicap"
+msgstr "Nouveau jeu avec handicap"
-#: ../../include/contact_widgets.php:20
-msgid "Enter name or interest"
-msgstr "Saisir nom ou centre d'intérêt"
+#: ../../addon/tictac/tictac.php:61
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément."
-#: ../../include/contact_widgets.php:21
-msgid "Connect/Follow"
-msgstr "Ajouter/Suivre"
+#: ../../addon/tictac/tictac.php:62
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux."
-#: ../../include/contact_widgets.php:22
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Exemples: Guillaume Martin, Course à pieds"
+#: ../../addon/tictac/tictac.php:64
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu."
-#: ../../include/contact_widgets.php:26
-msgid "Random Profile"
-msgstr "Un profil au hasard"
+#: ../../addon/tictac/tictac.php:183
+msgid "You go first..."
+msgstr "Vous commencez…"
-#: ../../include/contact_widgets.php:27
-msgid "Invite Friends"
-msgstr "Inviter des amis"
+#: ../../addon/tictac/tictac.php:188
+msgid "I'm going first this time..."
+msgstr "Cette fois, je commence…"
-#: ../../include/contact_widgets.php:29
-msgid "Advanced example: name=fred and country=iceland"
-msgstr "Exemple avancé&nbsp;: name=fred and country=iceland"
+#: ../../addon/tictac/tictac.php:194
+msgid "You won!"
+msgstr "Vous avez gagné !"
-#: ../../include/contact_widgets.php:122
-#, php-format
-msgid "%d connection in common"
-msgid_plural "%d connections in common"
-msgstr[0] "%d contact en commun"
-msgstr[1] "%d contacts en commun"
+#: ../../addon/tictac/tictac.php:200 ../../addon/tictac/tictac.php:225
+msgid "\"Cat\" game!"
+msgstr "Jeu de \"Chat\" !"
-#: ../../include/contact_widgets.php:127
-msgid "show more"
-msgstr "montrer plus"
+#: ../../addon/tictac/tictac.php:223
+msgid "I won!"
+msgstr "J'ai gagné !"
-#: ../../include/conversation.php:204
-#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s ajoute %2$s à ses contacts"
+#: ../../addon/pageheader/pageheader.php:43
+msgid "Message to display on every page on this server"
+msgstr "Message à afficher sur chaque page de ce serveur"
-#: ../../include/conversation.php:239
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s a tapoté %2$s"
+#: ../../addon/pageheader/pageheader.php:48
+msgid "Pageheader Settings"
+msgstr "Paramètres du haut de page"
-#: ../../include/conversation.php:691
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Voir le profil de %s @ %s"
+#: ../../addon/pageheader/pageheader.php:64
+msgid "pageheader Settings saved."
+msgstr "Paramètres du haut de page sauvegardés."
-#: ../../include/conversation.php:710
-msgid "Categories:"
-msgstr "Catégories&nbsp;:"
+#: ../../addon/moremoods/moremoods.php:19
+msgid "lonely"
+msgstr "isolé"
-#: ../../include/conversation.php:711
-msgid "Filed under:"
-msgstr "Classé sous&nbsp;:"
+#: ../../addon/moremoods/moremoods.php:20
+msgid "drunk"
+msgstr "saoul"
-#: ../../include/conversation.php:738
-msgid "View in context"
-msgstr "Voir en contexte"
+#: ../../addon/moremoods/moremoods.php:21
+msgid "horny"
+msgstr "libidineux"
-#: ../../include/conversation.php:847
-msgid "remove"
-msgstr "supprimer"
+#: ../../addon/moremoods/moremoods.php:22
+msgid "stoned"
+msgstr "défoncé"
-#: ../../include/conversation.php:852
-msgid "Delete Selected Items"
-msgstr "Supprimer les éléments selectionnés"
+#: ../../addon/moremoods/moremoods.php:23
+msgid "fucked up"
+msgstr "cramé"
-#: ../../include/conversation.php:948
-msgid "View Source"
-msgstr "Voir source"
+#: ../../addon/moremoods/moremoods.php:24
+msgid "clusterfucked"
+msgstr "énervé"
-#: ../../include/conversation.php:949
-msgid "Follow Thread"
-msgstr "Suivre la discussion"
+#: ../../addon/moremoods/moremoods.php:25
+msgid "crazy"
+msgstr "cinglé"
-#: ../../include/conversation.php:950
-msgid "Unfollow Thread"
-msgstr "Ne plus suivre la discussion"
+#: ../../addon/moremoods/moremoods.php:26
+msgid "hurt"
+msgstr "dommage"
-#: ../../include/conversation.php:955
-msgid "Activity/Posts"
-msgstr "Activité/Publications"
+#: ../../addon/moremoods/moremoods.php:27
+msgid "sleepy"
+msgstr "somnolent"
-#: ../../include/conversation.php:957
-msgid "Edit Connection"
-msgstr "Modifier le contact"
+#: ../../addon/moremoods/moremoods.php:28
+msgid "grumpy"
+msgstr "grognon"
-#: ../../include/conversation.php:958
-msgid "Message"
-msgstr "Message"
+#: ../../addon/moremoods/moremoods.php:29
+msgid "high"
+msgstr "allumé"
-#: ../../include/conversation.php:1075
-#, php-format
-msgid "%s likes this."
-msgstr "%s aime ça."
+#: ../../addon/moremoods/moremoods.php:30
+msgid "semi-conscious"
+msgstr "à demi-conscient"
-#: ../../include/conversation.php:1075
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s n'aime pas ça."
+#: ../../addon/moremoods/moremoods.php:31
+msgid "in love"
+msgstr "amoureux"
-#: ../../include/conversation.php:1079
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "<span %1$s>%2$d personne</span> aime ceci."
-msgstr[1] "<span %1$s>%2$d personnes</span> aiment ceci."
+#: ../../addon/moremoods/moremoods.php:32
+msgid "in lust"
+msgstr "convoitise"
-#: ../../include/conversation.php:1081
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "<span %1$s>%2$d personne</span> n'aime pas ça."
-msgstr[1] "<span %1$s>%2$d personnes</span> n'aiment pas ça."
+#: ../../addon/moremoods/moremoods.php:33
+msgid "naked"
+msgstr "nu"
-#: ../../include/conversation.php:1087
-msgid "and"
-msgstr "et"
+#: ../../addon/moremoods/moremoods.php:34
+msgid "stinky"
+msgstr "puant"
-#: ../../include/conversation.php:1090
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ", et %d autre personne"
-msgstr[1] ", et %d autres personnes"
+#: ../../addon/moremoods/moremoods.php:35
+msgid "sweaty"
+msgstr "en sueur"
-#: ../../include/conversation.php:1091
-#, php-format
-msgid "%s like this."
-msgstr "%s aime ça."
+#: ../../addon/moremoods/moremoods.php:36
+msgid "bleeding out"
+msgstr "en sang"
-#: ../../include/conversation.php:1091
-#, php-format
-msgid "%s don't like this."
-msgstr "%s n'aime pas ça."
+#: ../../addon/moremoods/moremoods.php:37
+msgid "victorious"
+msgstr "victorieux"
-#: ../../include/conversation.php:1130
-msgid "Set your location"
-msgstr "Spécifier votre emplacement géographique"
+#: ../../addon/moremoods/moremoods.php:38
+msgid "defeated"
+msgstr "vaincu"
-#: ../../include/conversation.php:1131
-msgid "Clear browser location"
-msgstr "Supprimer l'emplacement géographique du navigateur"
+#: ../../addon/moremoods/moremoods.php:39
+msgid "envious"
+msgstr "envieux"
-#: ../../include/conversation.php:1177
-msgid "Tag term:"
-msgstr "Étiquette&nbsp;:"
+#: ../../addon/moremoods/moremoods.php:40
+msgid "jealous"
+msgstr "jaloux"
-#: ../../include/conversation.php:1178
-msgid "Where are you right now?"
-msgstr "Où êtes-vous en ce moment&nbsp;?"
+#: ../../addon/xmpp/xmpp.php:31
+msgid "XMPP settings updated."
+msgstr "Les paramètres XMPP ont été mis à jour."
-#: ../../include/conversation.php:1210
-msgid "Page link name"
-msgstr "Nom du lien vers la page"
+#: ../../addon/xmpp/xmpp.php:53
+msgid "Enable Chat"
+msgstr "Activer le Chat"
-#: ../../include/conversation.php:1213
-msgid "Post as"
-msgstr "Publier en tant que"
+#: ../../addon/xmpp/xmpp.php:58
+msgid "Individual credentials"
+msgstr "Informations d'identifications individuelles"
-#: ../../include/conversation.php:1223
-msgid "Toggle voting"
-msgstr "(Dés)activer le vote"
+#: ../../addon/xmpp/xmpp.php:64
+msgid "Jabber BOSH server"
+msgstr "serveur Jabber BOSH"
-#: ../../include/conversation.php:1231
-msgid "Categories (optional, comma-separated list)"
-msgstr "Catégories (facultatives, séparées par des virgules)"
+#: ../../addon/xmpp/xmpp.php:69
+msgid "XMPP Settings"
+msgstr "Paramètres XMPP"
-#: ../../include/conversation.php:1254
-msgid "Set publish date"
-msgstr "Définir la date de publication"
+#: ../../addon/xmpp/xmpp.php:92
+msgid "Jabber BOSH host"
+msgstr "Hôte Jabber BOSH"
-#: ../../include/conversation.php:1258
-msgid "OK"
-msgstr "OK"
+#: ../../addon/xmpp/xmpp.php:93
+msgid "Use central userbase"
+msgstr "Utiliser la base d'utilisateurs centrale"
-#: ../../include/conversation.php:1503
-msgid "Discover"
-msgstr "À découvrir"
+#: ../../addon/xmpp/xmpp.php:93
+msgid ""
+"If enabled, members will automatically login to an ejabberd server that has "
+"to be installed on this machine with synchronized credentials via the "
+"\"auth_ejabberd.php\" script."
+msgstr "Si cette option est activée, les membres se connecteront automatiquement à un serveur ejabberd qui doit être installé sur cette machine avec des informations d'identification synchronisées via le script \"auth_ejabberd.php\"."
-#: ../../include/conversation.php:1506
-msgid "Imported public streams"
-msgstr "Flux publics importés"
+#: ../../addon/wholikesme/wholikesme.php:29
+msgid "Who likes me?"
+msgstr "Qui m'aime?"
-#: ../../include/conversation.php:1511
-msgid "Commented Order"
-msgstr "Par date de commentaire"
+#: ../../addon/pumpio/pumpio.php:148
+msgid "You are now authenticated to pumpio."
+msgstr "Vous êtes maintenant connecté à pumpio."
-#: ../../include/conversation.php:1514
-msgid "Sort by Comment Date"
-msgstr "Trier par date de dernier commentaire"
+#: ../../addon/pumpio/pumpio.php:149
+msgid "return to the featured settings page"
+msgstr "retourner à la page des paramètres des fonctionnalités"
-#: ../../include/conversation.php:1518
-msgid "Posted Order"
-msgstr "Par date de publication"
+#: ../../addon/pumpio/pumpio.php:163
+msgid "Post to Pump.io"
+msgstr "Publier sur Pump.io"
-#: ../../include/conversation.php:1521
-msgid "Sort by Post Date"
-msgstr "Trier par date de publication"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Pump.io servername"
+msgstr "Nom du serveur Pump.io"
-#: ../../include/conversation.php:1529
-msgid "Posts that mention or involve you"
-msgstr "Publications qui vous mentionnent ou vous concernent d'une manière ou d'une autre"
+#: ../../addon/pumpio/pumpio.php:198
+msgid "Without \"http://\" or \"https://\""
+msgstr "Sans \"http://\" ou \"https://\""
-#: ../../include/conversation.php:1538
-msgid "Activity Stream - by date"
-msgstr "Flux d'activité - par date"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Pump.io username"
+msgstr "Identifiant Pump.io"
-#: ../../include/conversation.php:1544
-msgid "Starred"
-msgstr "Mis en avant (étoiles)"
+#: ../../addon/pumpio/pumpio.php:202
+msgid "Without the servername"
+msgstr "Sans le nom de serveur"
-#: ../../include/conversation.php:1547
-msgid "Favourite Posts"
-msgstr "Publications préférées"
+#: ../../addon/pumpio/pumpio.php:213
+msgid "You are not authenticated to pumpio"
+msgstr "Vous n'êtes pas connecté à Pump.io"
-#: ../../include/conversation.php:1554
-msgid "Spam"
-msgstr "Indésirable"
+#: ../../addon/pumpio/pumpio.php:215
+msgid "(Re-)Authenticate your pump.io connection"
+msgstr "Authentifiez-vous à nouveau auprès de Pump.io"
-#: ../../include/conversation.php:1557
-msgid "Posts flagged as SPAM"
-msgstr "Publications marquées comme indésirables"
+#: ../../addon/pumpio/pumpio.php:219
+msgid "Enable pump.io Post Plugin"
+msgstr "Activer le plugin de publication Pump.io"
-#: ../../include/conversation.php:1614
-msgid "Status Messages and Posts"
-msgstr "Messages d'état et contributions"
+#: ../../addon/pumpio/pumpio.php:223
+msgid "Post to pump.io by default"
+msgstr "Par défaut, publier sur Pump.io"
-#: ../../include/conversation.php:1623
-msgid "About"
-msgstr "À propos"
+#: ../../addon/pumpio/pumpio.php:227
+msgid "Should posts be public"
+msgstr "Les publications doivent-elles être publiques ?"
-#: ../../include/conversation.php:1626
-msgid "Profile Details"
-msgstr "Détails du profil"
+#: ../../addon/pumpio/pumpio.php:231
+msgid "Mirror all public posts"
+msgstr "Créer une copie miroir de toutes les publications publiques"
-#: ../../include/conversation.php:1635 ../../include/photos.php:502
-msgid "Photo Albums"
-msgstr "Albums photo"
+#: ../../addon/pumpio/pumpio.php:237
+msgid "Pump.io Post Settings"
+msgstr "Paramètres de publication Pump.io"
-#: ../../include/conversation.php:1642
-msgid "Files and Storage"
-msgstr "Fichiers et Stockage"
+#: ../../addon/pumpio/pumpio.php:266
+msgid "PumpIO Settings saved."
+msgstr "Paramètres Pump.io sauvegardés."
-#: ../../include/conversation.php:1678
-msgid "Saved Bookmarks"
-msgstr "Favoris sauvegardés"
+#: ../../addon/ldapauth/ldapauth.php:61
+msgid "An account has been created for you."
+msgstr "Un compte a été créé pour vous."
-#: ../../include/conversation.php:1688
-msgid "Manage Webpages"
-msgstr "Gérer les pages web"
+#: ../../addon/ldapauth/ldapauth.php:68
+msgid "Authentication successful but rejected: account creation is disabled."
+msgstr "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée."
-#: ../../include/conversation.php:1747
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "Participe"
-msgstr[1] "Participent"
+#: ../../addon/opensearch/opensearch.php:43
+msgid "Search $Projectname"
+msgstr "Chercher dans $Projectname"
-#: ../../include/conversation.php:1750
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "Ne participe pas"
-msgstr[1] "Ne participent pas"
+#: ../../addon/redfiles/redfiles.php:119
+msgid "Redmatrix File Storage Import"
+msgstr "Importation du fichier de stockage Redmatrix"
-#: ../../include/conversation.php:1753
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "Indécis(e)"
-msgstr[1] "Indécis(es)"
+#: ../../addon/redfiles/redfiles.php:120
+msgid "This will import all your Redmatrix cloud files to this channel."
+msgstr "Ceci importera tous vos fichiers Redmatrix dans ce canal."
-#: ../../include/conversation.php:1756
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "D'accord"
-msgstr[1] "D'accord"
+#: ../../addon/redfiles/redfilehelper.php:67
+msgid "file"
+msgstr "fichier"
-#: ../../include/conversation.php:1759
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "Pas d'accord"
-msgstr[1] "Pas d'accord"
+#: ../../addon/hubwall/hubwall.php:19
+msgid "Send email to all members"
+msgstr "Envoyer un mail à tous les membres"
-#: ../../include/conversation.php:1762
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "S'abstient"
-msgstr[1] "S'abstiennent"
+#: ../../addon/hubwall/hubwall.php:33
+#, php-format
+msgid "$1%s Administrator"
+msgstr "$1%s administrateur"
+
+#: ../../addon/hubwall/hubwall.php:73
+#, php-format
+msgid "%1$d of %2$d messages sent."
+msgstr "%1$d message(s) envoyés sur %2$d."
+
+#: ../../addon/hubwall/hubwall.php:81
+msgid "Send email to all hub members."
+msgstr "Envoyer un e-mail à tous les membres du hub."
+
+#: ../../addon/hubwall/hubwall.php:93
+msgid "Sender Email address"
+msgstr "Adresse mail de l'expéditeur"
+
+#: ../../addon/hubwall/hubwall.php:94
+msgid "Test mode (only send to hub administrator)"
+msgstr "Mode test (uniquement envoyé à l'administrateur du hub)"
#: ../../include/selectors.php:30
msgid "Frequently"
@@ -8133,12 +10833,6 @@ msgstr "Neutre"
msgid "Non-specific"
msgstr "Non spécifique"
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:881
-msgid "Other"
-msgstr "Autre"
-
#: ../../include/selectors.php:49
msgid "Undecided"
msgstr "Indécis"
@@ -8315,821 +11009,836 @@ msgstr "S'en fiche"
msgid "Ask me"
msgstr "Me demander"
-#: ../../include/PermissionDescription.php:31
-#: ../../include/acl_selectors.php:232
-msgid "Visible to your default audience"
-msgstr "Visible pour vos contacts seulement"
-
-#: ../../include/PermissionDescription.php:115
-#: ../../include/acl_selectors.php:268
-msgid "Only me"
-msgstr ""
+#: ../../include/conversation.php:200
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ajoute %2$s à ses contacts"
-#: ../../include/PermissionDescription.php:116
-msgid "Public"
-msgstr "Public"
+#: ../../include/conversation.php:235
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s a tapoté %2$s"
-#: ../../include/PermissionDescription.php:117
-msgid "Anybody in the $Projectname network"
-msgstr ""
+#: ../../include/conversation.php:239 ../../include/text.php:1115
+#: ../../include/text.php:1120
+msgid "poked"
+msgstr "a tapoté"
-#: ../../include/PermissionDescription.php:118
+#: ../../include/conversation.php:691
#, php-format
-msgid "Any account on %s"
-msgstr ""
+msgid "View %s's profile @ %s"
+msgstr "Voir le profil de %s @ %s"
-#: ../../include/PermissionDescription.php:119
-msgid "Any of my connections"
-msgstr ""
+#: ../../include/conversation.php:711
+msgid "Categories:"
+msgstr "Catégories&nbsp;:"
-#: ../../include/PermissionDescription.php:120
-msgid "Only connections I specifically allow"
-msgstr ""
+#: ../../include/conversation.php:712
+msgid "Filed under:"
+msgstr "Classé sous&nbsp;:"
-#: ../../include/PermissionDescription.php:121
-msgid "Anybody authenticated (could include visitors from other networks)"
-msgstr ""
+#: ../../include/conversation.php:737
+msgid "View in context"
+msgstr "Voir en contexte"
-#: ../../include/PermissionDescription.php:122
-msgid "Any connections including those who haven't yet been approved"
-msgstr ""
+#: ../../include/conversation.php:834
+msgid "remove"
+msgstr "supprimer"
-#: ../../include/PermissionDescription.php:161
-msgid ""
-"This is your default setting for the audience of your normal stream, and "
-"posts."
-msgstr ""
+#: ../../include/conversation.php:838 ../../include/nav.php:268
+msgid "Loading..."
+msgstr "Chargement..."
-#: ../../include/PermissionDescription.php:162
-msgid ""
-"This is your default setting for who can view your default channel profile"
-msgstr ""
+#: ../../include/conversation.php:839
+msgid "Delete Selected Items"
+msgstr "Supprimer les éléments selectionnés"
-#: ../../include/PermissionDescription.php:163
-msgid "This is your default setting for who can view your connections"
-msgstr ""
+#: ../../include/conversation.php:882
+msgid "View Source"
+msgstr "Voir source"
-#: ../../include/PermissionDescription.php:164
-msgid ""
-"This is your default setting for who can view your file storage and photos"
-msgstr ""
+#: ../../include/conversation.php:892
+msgid "Follow Thread"
+msgstr "Suivre la discussion"
-#: ../../include/PermissionDescription.php:165
-msgid "This is your default setting for the audience of your webpages"
-msgstr ""
+#: ../../include/conversation.php:901
+msgid "Unfollow Thread"
+msgstr "Ne plus suivre la discussion"
-#: ../../include/account.php:28
-msgid "Not a valid email address"
-msgstr "Ce n'est pas une adresse de courriel valide"
+#: ../../include/conversation.php:992
+msgid "Activity/Posts"
+msgstr "Activité/Publications"
-#: ../../include/account.php:30
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site"
+#: ../../include/conversation.php:1012
+msgid "Edit Connection"
+msgstr "Modifier le contact"
-#: ../../include/account.php:36
-msgid "Your email address is already registered at this site."
-msgstr "Votre adresse de courriel est déjà inscrite sur ce site."
+#: ../../include/conversation.php:1022
+msgid "Message"
+msgstr "Message"
-#: ../../include/account.php:68
-msgid "An invitation is required."
-msgstr "Une invitation est requise."
+#: ../../include/conversation.php:1156
+#, php-format
+msgid "%s likes this."
+msgstr "%s aime ça."
-#: ../../include/account.php:72
-msgid "Invitation could not be verified."
-msgstr "Votre invitation n'a pas pu être vérifiée."
+#: ../../include/conversation.php:1156
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s n'aime pas ça."
-#: ../../include/account.php:122
-msgid "Please enter the required information."
-msgstr "Merci d'entrer les informations requises."
+#: ../../include/conversation.php:1160
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d personne</span> aime ceci."
+msgstr[1] "<span %1$s>%2$d personnes</span> aiment ceci."
-#: ../../include/account.php:189
-msgid "Failed to store account information."
-msgstr "Impossible de stocker les informations liées au compte."
+#: ../../include/conversation.php:1162
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d personne</span> n'aime pas ça."
+msgstr[1] "<span %1$s>%2$d personnes</span> n'aiment pas ça."
+
+#: ../../include/conversation.php:1168
+msgid "and"
+msgstr "et"
-#: ../../include/account.php:249
+#: ../../include/conversation.php:1171
#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Confirmation de l'inscription pour %s"
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", et %d autre personne"
+msgstr[1] ", et %d autres personnes"
-#: ../../include/account.php:315
+#: ../../include/conversation.php:1172
#, php-format
-msgid "Registration request at %s"
-msgstr "Demande d'inscription sur %s"
+msgid "%s like this."
+msgstr "%s aime ça."
-#: ../../include/account.php:317 ../../include/account.php:344
-#: ../../include/account.php:404 ../../include/network.php:1871
-msgid "Administrator"
-msgstr "Administrateur"
+#: ../../include/conversation.php:1172
+#, php-format
+msgid "%s don't like this."
+msgstr "%s n'aime pas ça."
-#: ../../include/account.php:339
-msgid "your registration password"
-msgstr "votre mot de passe d'inscription"
+#: ../../include/conversation.php:1215
+msgid "Set your location"
+msgstr "Spécifier votre emplacement géographique"
-#: ../../include/account.php:342 ../../include/account.php:402
-#, php-format
-msgid "Registration details for %s"
-msgstr "Détails de l'inscription pour %s"
+#: ../../include/conversation.php:1216
+msgid "Clear browser location"
+msgstr "Supprimer l'emplacement géographique du navigateur"
-#: ../../include/account.php:414
-msgid "Account approved."
-msgstr "Compte approuvé."
+#: ../../include/conversation.php:1264
+msgid "Tag term:"
+msgstr "Étiquette&nbsp;:"
-#: ../../include/account.php:454
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Inscription révoquée pour %s"
+#: ../../include/conversation.php:1265
+msgid "Where are you right now?"
+msgstr "Où êtes-vous en ce moment&nbsp;?"
-#: ../../include/account.php:506
-msgid "Account verified. Please login."
-msgstr "Compte vérifié. Veuillez vous connecter."
+#: ../../include/conversation.php:1270
+msgid "Choose a different album..."
+msgstr "Choisissez un autre album"
-#: ../../include/account.php:723 ../../include/account.php:725
-msgid "Click here to upgrade."
-msgstr "Cliquez ici pour mettre à jour."
+#: ../../include/conversation.php:1274
+msgid "Comments enabled"
+msgstr "Commentaires activés"
-#: ../../include/account.php:731
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Cette action outrepasserait les limites prévues par votre forfait."
+#: ../../include/conversation.php:1275
+msgid "Comments disabled"
+msgstr "Commentaires désactivés"
-#: ../../include/account.php:736
-msgid "This action is not available under your subscription plan."
-msgstr "Cette action n'est pas disponible avec votre forfait."
+#: ../../include/conversation.php:1313
+msgid "Page link name"
+msgstr "Nom du lien vers la page"
-#: ../../include/attach.php:247 ../../include/attach.php:333
-msgid "Item was not found."
-msgstr "Élément introuvable."
+#: ../../include/conversation.php:1316
+msgid "Post as"
+msgstr "Publier en tant que"
-#: ../../include/attach.php:497
-msgid "No source file."
-msgstr "Pas de fichier source."
+#: ../../include/conversation.php:1330
+msgid "Toggle voting"
+msgstr "(Dés)activer le vote"
-#: ../../include/attach.php:519
-msgid "Cannot locate file to replace"
-msgstr "Impossible de trouver le fichier à remplacer."
+#: ../../include/conversation.php:1333
+msgid "Disable comments"
+msgstr "Désactiver les commentaires"
-#: ../../include/attach.php:537
-msgid "Cannot locate file to revise/update"
-msgstr "Impossible de trouver le fichier à corriger/mettre à jour"
+#: ../../include/conversation.php:1334
+msgid "Toggle comments"
+msgstr "Basculer les commentaires"
-#: ../../include/attach.php:672
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Le fichier dépasse la taille limite de %d"
+#: ../../include/conversation.php:1342
+msgid "Categories (optional, comma-separated list)"
+msgstr "Catégories (facultatives, séparées par des virgules)"
-#: ../../include/attach.php:686
-#, php-format
-msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
-msgstr "Vous avez atteint votre limite de %1$.0f méga-octets autorisés pour le stockage des pièces-jointes."
+#: ../../include/conversation.php:1365
+msgid "Other networks and post services"
+msgstr "Autres réseaux et services de messagerie"
-#: ../../include/attach.php:842
-msgid "File upload failed. Possible system limit or action terminated."
-msgstr "Envoi du fichier impossible. Limite système ou action avortée."
+#: ../../include/conversation.php:1371
+msgid "Set publish date"
+msgstr "Définir la date de publication"
-#: ../../include/attach.php:855
-msgid "Stored file could not be verified. Upload failed."
-msgstr "Le fichier stocké n'a pu être vérifié. Echec de l'envoi."
+#: ../../include/conversation.php:1625
+msgid "Discover"
+msgstr "À découvrir"
-#: ../../include/attach.php:909 ../../include/attach.php:925
-msgid "Path not available."
-msgstr "Chemin non disponible."
+#: ../../include/conversation.php:1628
+msgid "Imported public streams"
+msgstr "Flux publics importés"
-#: ../../include/attach.php:971 ../../include/attach.php:1123
-msgid "Empty pathname"
-msgstr "Chemin vide"
+#: ../../include/conversation.php:1633
+msgid "Commented Order"
+msgstr "Par date de commentaire"
-#: ../../include/attach.php:997
-msgid "duplicate filename or path"
-msgstr "doublon de chemin ou de fichier"
+#: ../../include/conversation.php:1636
+msgid "Sort by Comment Date"
+msgstr "Trier par date de dernier commentaire"
-#: ../../include/attach.php:1019
-msgid "Path not found."
-msgstr "Chemin introuvable."
+#: ../../include/conversation.php:1640
+msgid "Posted Order"
+msgstr "Par date de publication"
-#: ../../include/attach.php:1077
-msgid "mkdir failed."
-msgstr "mkdir a échoué."
+#: ../../include/conversation.php:1643
+msgid "Sort by Post Date"
+msgstr "Trier par date de publication"
-#: ../../include/attach.php:1081
-msgid "database storage failed."
-msgstr "l'écriture dans la base de données a échoué."
+#: ../../include/conversation.php:1651
+msgid "Posts that mention or involve you"
+msgstr "Publications qui vous mentionnent ou vous concernent d'une manière ou d'une autre"
-#: ../../include/attach.php:1129
-msgid "Empty path"
-msgstr "Chemin vide"
+#: ../../include/conversation.php:1660
+msgid "Activity Stream - by date"
+msgstr "Flux d'activité - par date"
-#: ../../include/channel.php:32
-msgid "Unable to obtain identity information from database"
-msgstr "Impossible d'obtenir les données d'identité depuis la base de données"
+#: ../../include/conversation.php:1666
+msgid "Starred"
+msgstr "Avec étoile"
-#: ../../include/channel.php:66
-msgid "Empty name"
-msgstr "Nom vide"
+#: ../../include/conversation.php:1669
+msgid "Favourite Posts"
+msgstr "Publications préférées"
-#: ../../include/channel.php:69
-msgid "Name too long"
-msgstr "Nom trop long"
+#: ../../include/conversation.php:1676
+msgid "Spam"
+msgstr "Indésirable"
-#: ../../include/channel.php:180
-msgid "No account identifier"
-msgstr "Pas d'identifiant de compte"
+#: ../../include/conversation.php:1679
+msgid "Posts flagged as SPAM"
+msgstr "Publications marquées comme indésirables"
-#: ../../include/channel.php:192
-msgid "Nickname is required."
-msgstr "Un surnom est requis."
+#: ../../include/conversation.php:1754
+msgid "Status Messages and Posts"
+msgstr "Messages d'état et contributions"
-#: ../../include/channel.php:206
-msgid "Reserved nickname. Please choose another."
-msgstr "Surnom réservé. Merci d'en choisir un autre."
+#: ../../include/conversation.php:1767
+msgid "Profile Details"
+msgstr "Détails du profil"
-#: ../../include/channel.php:211
-msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "Le surnom contient des caractères interdits ou est déjà pris sur ce site."
+#: ../../include/conversation.php:1777 ../../include/photos.php:527
+msgid "Photo Albums"
+msgstr "Albums photo"
-#: ../../include/channel.php:287
-msgid "Unable to retrieve created identity"
-msgstr "Impossible de récupérer l'identité créée"
+#: ../../include/conversation.php:1785
+msgid "Files and Storage"
+msgstr "Fichiers et Stockage"
-#: ../../include/channel.php:345
-msgid "Default Profile"
-msgstr "Profil par défaut"
+#: ../../include/conversation.php:1821
+msgid "Bookmarks"
+msgstr "Favoris"
-#: ../../include/channel.php:791
-msgid "Requested channel is not available."
-msgstr "Canal demandé non disponible."
+#: ../../include/conversation.php:1824
+msgid "Saved Bookmarks"
+msgstr "Favoris sauvegardés"
-#: ../../include/channel.php:938
-msgid "Create New Profile"
-msgstr "Créer un nouveau profil"
+#: ../../include/conversation.php:1835
+msgid "View Webpages"
+msgstr "Voir les pages web"
-#: ../../include/channel.php:958
-msgid "Visible to everybody"
-msgstr "Visible de tous"
+#: ../../include/conversation.php:1904
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "Participe"
+msgstr[1] "Participent"
-#: ../../include/channel.php:1031 ../../include/channel.php:1142
-msgid "Gender:"
-msgstr "Sexe&nbsp;:"
+#: ../../include/conversation.php:1907
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "Ne participe pas"
+msgstr[1] "Ne participent pas"
-#: ../../include/channel.php:1032 ../../include/channel.php:1186
-msgid "Status:"
-msgstr "État&nbsp;:"
+#: ../../include/conversation.php:1910
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "Indécis(e)"
+msgstr[1] "Indécis(es)"
-#: ../../include/channel.php:1033 ../../include/channel.php:1197
-msgid "Homepage:"
-msgstr "Site Internet&nbsp;:"
+#: ../../include/conversation.php:1913
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "D'accord"
+msgstr[1] "D'accord"
-#: ../../include/channel.php:1034
-msgid "Online Now"
-msgstr "Connecté"
+#: ../../include/conversation.php:1916
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "Pas d'accord"
+msgstr[1] "Pas d'accord"
-#: ../../include/channel.php:1147
-msgid "Like this channel"
-msgstr "J'aime ce canal"
+#: ../../include/conversation.php:1919
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "S'abstient"
+msgstr[1] "S'abstiennent"
-#: ../../include/channel.php:1171
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../include/permissions.php:35
+msgid "Can view my normal stream and posts"
+msgstr "Peut voir les publications ordinaires sur mon canal."
-#: ../../include/channel.php:1172
-msgid "j F"
-msgstr "j F"
+#: ../../include/permissions.php:39
+msgid "Can view my webpages"
+msgstr "Peut voir mes pages web"
-#: ../../include/channel.php:1179
-msgid "Birthday:"
-msgstr "Date de naissance&nbsp;:"
+#: ../../include/permissions.php:43
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Peuvent poster sur la page de mon canal (\"mur\")"
-#: ../../include/channel.php:1192
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "depuis %1$d %2$s"
+#: ../../include/permissions.php:46
+msgid "Can like/dislike stuff"
+msgstr "Peuvent aimer/ne pas aimer"
-#: ../../include/channel.php:1195
-msgid "Sexual Preference:"
-msgstr "Orientation sexuelle&nbsp;:"
+#: ../../include/permissions.php:46
+msgid "Profiles and things other than posts/comments"
+msgstr "Profils et autres excluant les publications/commentaires."
-#: ../../include/channel.php:1201
-msgid "Tags:"
-msgstr "Étiquettes&nbsp;:"
+#: ../../include/permissions.php:48
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Peut faire suivre à tous les contacts de mon canal via \"@mention\""
-#: ../../include/channel.php:1203
-msgid "Political Views:"
-msgstr "Opinions politiques&nbsp;:"
+#: ../../include/permissions.php:48
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avancé - utile pour les canaux de type \"forum/groupe\""
-#: ../../include/channel.php:1205
-msgid "Religion:"
-msgstr "Religion&nbsp;:"
+#: ../../include/permissions.php:49
+msgid "Can chat with me (when available)"
+msgstr "Peut discuter avec moi (quand disponibie)"
-#: ../../include/channel.php:1209
-msgid "Hobbies/Interests:"
-msgstr "Occupations/Centres d'intérêt&nbsp;:"
+#: ../../include/permissions.php:50
+msgid "Can write to my file storage and photos"
+msgstr "Peut charger des fichiers et des photos dans mon canal"
-#: ../../include/channel.php:1211
-msgid "Likes:"
-msgstr "Aime&nbsp;:"
+#: ../../include/permissions.php:51
+msgid "Can edit my webpages"
+msgstr "Peut modifier mes pages web"
-#: ../../include/channel.php:1213
-msgid "Dislikes:"
-msgstr "N'aime pas&nbsp;:"
+#: ../../include/permissions.php:53
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Plutôt avancé - très utile dans les communautés ouvertes"
-#: ../../include/channel.php:1215
-msgid "Contact information and Social Networks:"
-msgstr "Coordonnées et réseaux sociaux&nbsp;:"
+#: ../../include/permissions.php:55
+msgid "Can administer my channel resources"
+msgstr "Peut administrer les ressources de mon canal"
-#: ../../include/channel.php:1217
-msgid "My other channels:"
-msgstr "Mes autres canaux&nbsp;:"
+#: ../../include/permissions.php:55
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes"
-#: ../../include/channel.php:1219
-msgid "Musical interests:"
-msgstr "Goûts musicaux&nbsp;:"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Options d'annuaire"
-#: ../../include/channel.php:1221
-msgid "Books, literature:"
-msgstr "Lectures, goûts littéraires&nbsp;:"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Mode sûr"
-#: ../../include/channel.php:1223
-msgid "Television:"
-msgstr "Télévision&nbsp;:"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Les forums publics uniquement"
-#: ../../include/channel.php:1225
-msgid "Film/dance/culture/entertainment:"
-msgstr "Cinéma/danse/culture/divertissement&nsbp;:"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Ce site uniquement"
-#: ../../include/channel.php:1227
-msgid "Love/Romance:"
-msgstr "Vie sentimentale/amoureuse&nbsp;:"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Favoris de %1$s"
-#: ../../include/channel.php:1229
-msgid "Work/employment:"
-msgstr "Travail/Occupation&nbsp;"
+#: ../../include/import.php:41
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "L'import a échoué. Un canal existe déjà avec ce nom"
-#: ../../include/channel.php:1231
-msgid "School/education:"
-msgstr "Études&nbsp;"
+#: ../../include/import.php:105
+msgid "Cloned channel not found. Import failed."
+msgstr "Canal cloné non trouvé. Echec de l'import."
-#: ../../include/channel.php:1251
-msgid "Like this thing"
-msgstr "J'aime ceci"
+#: ../../include/text.php:478
+msgid "prev"
+msgstr "préc."
-#: ../../include/features.php:48
-msgid "General Features"
-msgstr "Fonctionnalités générales"
+#: ../../include/text.php:480
+msgid "first"
+msgstr "premier"
-#: ../../include/features.php:50
-msgid "Content Expiration"
-msgstr "Expiration du contenu"
+#: ../../include/text.php:509
+msgid "last"
+msgstr "dernier"
-#: ../../include/features.php:50
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Supprimer les contributions/commentaires et/ou messages privés plus tard"
+#: ../../include/text.php:512
+msgid "next"
+msgstr "Suivant"
-#: ../../include/features.php:51
-msgid "Multiple Profiles"
-msgstr "Profils multiples"
+#: ../../include/text.php:523
+msgid "older"
+msgstr "plus ancien"
-#: ../../include/features.php:51
-msgid "Ability to create multiple profiles"
-msgstr "Possibilité de créer plusieurs profils"
+#: ../../include/text.php:525
+msgid "newer"
+msgstr "plus récent"
-#: ../../include/features.php:52
-msgid "Advanced Profiles"
-msgstr "Profils Avancés"
+#: ../../include/text.php:945
+msgid "No connections"
+msgstr "Pas de relations."
-#: ../../include/features.php:52
-msgid "Additional profile sections and selections"
-msgstr "Sections et sélections supplémentaires du profil"
+#: ../../include/text.php:970
+#, php-format
+msgid "View all %s connections"
+msgstr "Voir les %s contacts"
-#: ../../include/features.php:53
-msgid "Profile Import/Export"
-msgstr "Importer/Exporter le profil"
+#: ../../include/text.php:1115 ../../include/text.php:1120
+msgid "poke"
+msgstr "tapoter"
-#: ../../include/features.php:53
-msgid "Save and load profile details across sites/channels"
-msgstr "Sauvegarder et charger les détails d'un profil entre sites/canaux"
+#: ../../include/text.php:1121
+msgid "ping"
+msgstr "ping"
-#: ../../include/features.php:54
-msgid "Web Pages"
-msgstr "Pages web"
+#: ../../include/text.php:1121
+msgid "pinged"
+msgstr "pingé"
-#: ../../include/features.php:54
-msgid "Provide managed web pages on your channel"
-msgstr "Fournir des pages web, sous votre contrôle, sur votre canal"
+#: ../../include/text.php:1122
+msgid "prod"
+msgstr "encourager"
-#: ../../include/features.php:55
-msgid "Hide Rating"
-msgstr "Masquer l'évaluation"
+#: ../../include/text.php:1122
+msgid "prodded"
+msgstr "encouragé"
-#: ../../include/features.php:55
-msgid ""
-"Hide the rating buttons on your channel and profile pages. Note: People can "
-"still rate you somewhere else."
-msgstr "Masquer les boutons d'évaluation sur les pages de votre canal et de votre profil. NB : vous pourrez toujours être évalué(e) ailleurs."
+#: ../../include/text.php:1123
+msgid "slap"
+msgstr "giffler"
-#: ../../include/features.php:56
-msgid "Private Notes"
-msgstr "Notes privées"
+#: ../../include/text.php:1123
+msgid "slapped"
+msgstr "gifflé(e)"
-#: ../../include/features.php:56
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Active un outil pour stocker des notes et des rappels (note&nbsp;:non chiffré)"
+#: ../../include/text.php:1124
+msgid "finger"
+msgstr "pointer"
-#: ../../include/features.php:57
-msgid "Navigation Channel Select"
-msgstr "Sélection du canal par la navigation"
+#: ../../include/text.php:1124
+msgid "fingered"
+msgstr "pointé"
-#: ../../include/features.php:57
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Changez de canal directement depuis le menu de navigation déroulant"
+#: ../../include/text.php:1125
+msgid "rebuff"
+msgstr "rejetter"
-#: ../../include/features.php:58
-msgid "Photo Location"
-msgstr "Site de prise de vue"
+#: ../../include/text.php:1125
+msgid "rebuffed"
+msgstr "rejeté"
-#: ../../include/features.php:58
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Si des informations géographiques sont présentes dans les images téléversées, les lier à une carte."
+#: ../../include/text.php:1137
+msgid "happy"
+msgstr "heureux"
-#: ../../include/features.php:59
-msgid "Access Controlled Chatrooms"
-msgstr ""
+#: ../../include/text.php:1138
+msgid "sad"
+msgstr "triste"
-#: ../../include/features.php:59
-msgid "Provide chatrooms and chat services with access control."
-msgstr ""
+#: ../../include/text.php:1139
+msgid "mellow"
+msgstr "mélancolique"
-#: ../../include/features.php:60
-msgid "Smart Birthdays"
-msgstr "Anniversaires intelligents"
+#: ../../include/text.php:1140
+msgid "tired"
+msgstr "fatigué"
-#: ../../include/features.php:60
-msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Adapter les anniversaires aux fuseaux horaires, utile pour vos amis sur d'autres continents."
+#: ../../include/text.php:1141
+msgid "perky"
+msgstr "impertinent"
-#: ../../include/features.php:61
-msgid "Expert Mode"
-msgstr "Mode expert"
+#: ../../include/text.php:1142
+msgid "angry"
+msgstr "en colère"
-#: ../../include/features.php:61
-msgid "Enable Expert Mode to provide advanced configuration options"
-msgstr "Activer le mode expert pour accéder aux options avancées"
+#: ../../include/text.php:1143
+msgid "stupefied"
+msgstr "stupéfait"
-#: ../../include/features.php:62
-msgid "Premium Channel"
-msgstr "Canal VIP"
+#: ../../include/text.php:1144
+msgid "puzzled"
+msgstr "perplexe"
-#: ../../include/features.php:62
-msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal"
+#: ../../include/text.php:1145
+msgid "interested"
+msgstr "intéressé"
-#: ../../include/features.php:67
-msgid "Post Composition Features"
-msgstr "Fonctionnalités de composition"
+#: ../../include/text.php:1146
+msgid "bitter"
+msgstr "amer"
-#: ../../include/features.php:70
-msgid "Large Photos"
-msgstr "Grandes photos"
+#: ../../include/text.php:1147
+msgid "cheerful"
+msgstr "plein d'entrain"
-#: ../../include/features.php:70
-msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Inclure de grands aperçus (1024px) dans les messages. Si désactivé, inclure de petits aperçus (640px)."
+#: ../../include/text.php:1148
+msgid "alive"
+msgstr "vivant"
-#: ../../include/features.php:71
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Importe automatiquement le contenus d'autres canaux ou flux dans le canal actif"
+#: ../../include/text.php:1149
+msgid "annoyed"
+msgstr "agaçé"
-#: ../../include/features.php:72
-msgid "Even More Encryption"
-msgstr "Encore plus de chiffrement"
+#: ../../include/text.php:1150
+msgid "anxious"
+msgstr "anxieux"
-#: ../../include/features.php:72
-msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Permettre le chiffrement optionnel du contenu de bout en bout au moyen d'un secret partagé"
+#: ../../include/text.php:1151
+msgid "cranky"
+msgstr "énervé"
-#: ../../include/features.php:73
-msgid "Enable Voting Tools"
-msgstr "Activer les outils de vote"
+#: ../../include/text.php:1152
+msgid "disturbed"
+msgstr "perturbé"
-#: ../../include/features.php:73
-msgid "Provide a class of post which others can vote on"
-msgstr "Fournit un type de publication sur lequel les utilisateurs peuvent voter"
+#: ../../include/text.php:1153
+msgid "frustrated"
+msgstr "frustré"
-#: ../../include/features.php:74
-msgid "Delayed Posting"
-msgstr "Publication plus tard"
+#: ../../include/text.php:1154
+msgid "depressed"
+msgstr "déprimé"
-#: ../../include/features.php:74
-msgid "Allow posts to be published at a later date"
-msgstr "Permettre de publier des messages à une date programmée"
+#: ../../include/text.php:1155
+msgid "motivated"
+msgstr "motivé"
-#: ../../include/features.php:75
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Supprimer les publications/commentaires en doublon"
+#: ../../include/text.php:1156
+msgid "relaxed"
+msgstr "détendu"
-#: ../../include/features.php:75
-msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Empêcher des messages aux contenus identiques d'être publiés à moins de deux minutes d'intervalle"
+#: ../../include/text.php:1157
+msgid "surprised"
+msgstr "surpris"
-#: ../../include/features.php:81
-msgid "Network and Stream Filtering"
-msgstr "Filtrage du réseau et des flux"
+#: ../../include/text.php:1330 ../../include/js_strings.php:70
+msgid "Monday"
+msgstr "Lundi"
-#: ../../include/features.php:82
-msgid "Search by Date"
-msgstr "Chercher par date"
+#: ../../include/text.php:1330 ../../include/js_strings.php:71
+msgid "Tuesday"
+msgstr "Mardi"
-#: ../../include/features.php:82
-msgid "Ability to select posts by date ranges"
-msgstr "Pouvoir choisir des publications par date"
+#: ../../include/text.php:1330 ../../include/js_strings.php:72
+msgid "Wednesday"
+msgstr "Mercredi"
-#: ../../include/features.php:83 ../../include/group.php:311
-msgid "Privacy Groups"
-msgstr "Groupes d'accès"
+#: ../../include/text.php:1330 ../../include/js_strings.php:73
+msgid "Thursday"
+msgstr "Jeudi"
-#: ../../include/features.php:83
-msgid "Enable management and selection of privacy groups"
-msgstr "Active la gestion et la sélection des groupes d'accès"
+#: ../../include/text.php:1330 ../../include/js_strings.php:74
+msgid "Friday"
+msgstr "Vendredi"
-#: ../../include/features.php:84
-msgid "Save search terms for re-use"
-msgstr "Sauvegarder des termes de recherche pour utilisation ultérieure"
+#: ../../include/text.php:1330 ../../include/js_strings.php:75
+msgid "Saturday"
+msgstr "Samedi"
-#: ../../include/features.php:85
-msgid "Network Personal Tab"
-msgstr "Onglet \"Me concernant\""
+#: ../../include/text.php:1330 ../../include/js_strings.php:69
+msgid "Sunday"
+msgstr "Dimanche"
-#: ../../include/features.php:85
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Activer un onglet affichant seulement les publications du réseau sur lesquelles vous êtes intervenu"
+#: ../../include/text.php:1334 ../../include/js_strings.php:45
+msgid "January"
+msgstr "Janvier"
-#: ../../include/features.php:86
-msgid "Network New Tab"
-msgstr "Onglet \"nouveautés réseau\""
+#: ../../include/text.php:1334 ../../include/js_strings.php:46
+msgid "February"
+msgstr "Février"
-#: ../../include/features.php:86
-msgid "Enable tab to display all new Network activity"
-msgstr "Activer un onglet présentant toute l'activité récente sur le réseau"
+#: ../../include/text.php:1334 ../../include/js_strings.php:47
+msgid "March"
+msgstr "Mars"
-#: ../../include/features.php:87
-msgid "Affinity Tool"
-msgstr "Gérer l'affinité"
+#: ../../include/text.php:1334 ../../include/js_strings.php:48
+msgid "April"
+msgstr "Avril"
-#: ../../include/features.php:87
-msgid "Filter stream activity by depth of relationships"
-msgstr "Filtrer le flux d'activité en fonction de la profondeur des relations"
+#: ../../include/text.php:1334
+msgid "May"
+msgstr "Mai"
-#: ../../include/features.php:88
-msgid "Connection Filtering"
-msgstr "Filtrage des contacts"
+#: ../../include/text.php:1334 ../../include/js_strings.php:50
+msgid "June"
+msgstr "Juin"
-#: ../../include/features.php:88
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Filtrer les publications entrantes de mes contacts sur la base de mots-clefs"
+#: ../../include/text.php:1334 ../../include/js_strings.php:51
+msgid "July"
+msgstr "Juillet"
-#: ../../include/features.php:89
-msgid "Show channel suggestions"
-msgstr "Montrer les suggestions de canaux"
+#: ../../include/text.php:1334 ../../include/js_strings.php:52
+msgid "August"
+msgstr "Août"
-#: ../../include/features.php:94
-msgid "Post/Comment Tools"
-msgstr "Gérer les publications/commentaires"
+#: ../../include/text.php:1334 ../../include/js_strings.php:53
+msgid "September"
+msgstr "Septembre"
-#: ../../include/features.php:95
-msgid "Community Tagging"
-msgstr "Etiquetage communautaire"
+#: ../../include/text.php:1334 ../../include/js_strings.php:54
+msgid "October"
+msgstr "Octobre"
-#: ../../include/features.php:95
-msgid "Ability to tag existing posts"
-msgstr "Permettre de marquer les publications existantes"
+#: ../../include/text.php:1334 ../../include/js_strings.php:55
+msgid "November"
+msgstr "Novembre"
-#: ../../include/features.php:96
-msgid "Post Categories"
-msgstr "Catégoriser les publications"
+#: ../../include/text.php:1334 ../../include/js_strings.php:56
+msgid "December"
+msgstr "Décembre"
-#: ../../include/features.php:96
-msgid "Add categories to your posts"
-msgstr "Ajouter des catégories à vos publications"
+#: ../../include/text.php:1411 ../../include/text.php:1415
+msgid "Unknown Attachment"
+msgstr "Pièce jointe inconnue"
-#: ../../include/features.php:97
-msgid "Emoji Reactions"
-msgstr ""
+#: ../../include/text.php:1417
+msgid "unknown"
+msgstr "Inconnu"
-#: ../../include/features.php:97
-msgid "Add emoji reaction ability to posts"
-msgstr ""
+#: ../../include/text.php:1453
+msgid "remove category"
+msgstr "supprimer la catégorie"
-#: ../../include/features.php:98
-msgid "Ability to file posts under folders"
-msgstr "Permettre de classer les publications dans des dossiers"
+#: ../../include/text.php:1527
+msgid "remove from file"
+msgstr "retirer du fichier"
-#: ../../include/features.php:99
-msgid "Dislike Posts"
-msgstr "\"Ne pas aimer\" les publications"
+#: ../../include/text.php:1789 ../../include/language.php:367
+msgid "default"
+msgstr "défaut"
-#: ../../include/features.php:99
-msgid "Ability to dislike posts/comments"
-msgstr "Possibilité de \"ne pas aimer\" les publications/commentaires"
+#: ../../include/text.php:1797
+msgid "Page layout"
+msgstr "Mise en page"
-#: ../../include/features.php:100
-msgid "Star Posts"
-msgstr "Pouvoir mettre en avant les publications"
+#: ../../include/text.php:1797
+msgid "You can create your own with the layouts tool"
+msgstr "Créez les vôtres avec les outils de mise en page"
-#: ../../include/features.php:100
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Pouvoir marquer certaines publications d'une étoile"
+#: ../../include/text.php:1825
+msgid "Page content type"
+msgstr "Type de contenu de la page"
-#: ../../include/features.php:101
-msgid "Tag Cloud"
-msgstr "Nuage de tags"
+#: ../../include/text.php:1958
+msgid "activity"
+msgstr "activité"
-#: ../../include/features.php:101
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Afficher un nuage de vos tags sur votre canal"
+#: ../../include/text.php:2272
+msgid "Design Tools"
+msgstr "Outils de conception"
-#: ../../include/oembed.php:324
-msgid "Embedded content"
-msgstr "Contenu imbriqué"
+#: ../../include/text.php:2278
+msgid "Pages"
+msgstr "Pages"
-#: ../../include/oembed.php:333
-msgid "Embedding disabled"
-msgstr "Imbrication désactivée"
+#: ../../include/text.php:2300
+msgid "Import website..."
+msgstr "Importer le site web…"
-#: ../../include/acl_selectors.php:271
-msgid "Who can see this?"
-msgstr ""
+#: ../../include/text.php:2301
+msgid "Select folder to import"
+msgstr "Sélectionner le dossier à importer"
-#: ../../include/acl_selectors.php:272
-msgid "Custom selection"
-msgstr ""
+#: ../../include/text.php:2302
+msgid "Import from a zipped folder:"
+msgstr "Importer à partir d'un dossier zippé :"
-#: ../../include/acl_selectors.php:273
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr ""
+#: ../../include/text.php:2303
+msgid "Import from cloud files:"
+msgstr "Importer à partir de fichiers dans le cloud :"
-#: ../../include/acl_selectors.php:274
-msgid "Show"
-msgstr "Montrer"
+#: ../../include/text.php:2304
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/channel/chemain/du/repertoire"
-#: ../../include/acl_selectors.php:275
-msgid "Don't show"
-msgstr "Cacher"
+#: ../../include/text.php:2305
+msgid "Enter path to website files"
+msgstr "Entrer le chemin vers les fichiers du site web"
-#: ../../include/acl_selectors.php:281
-msgid "Other networks and post services"
-msgstr "Autres réseaux et services de messagerie"
+#: ../../include/text.php:2306
+msgid "Select folder"
+msgstr "Sélectionner un répertoire"
-#: ../../include/acl_selectors.php:311
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr ""
+#: ../../include/text.php:2307
+msgid "Export website..."
+msgstr "Exporter le site web…"
-#: ../../include/auth.php:105
-msgid "Logged out."
-msgstr "Deconnecté."
+#: ../../include/text.php:2308
+msgid "Export to a zip file"
+msgstr "Exporter dans un fichier zip"
-#: ../../include/auth.php:212
-msgid "Failed authentication"
-msgstr "Échec de l'authentification"
+#: ../../include/text.php:2309
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/datetime.php:135
-msgid "Birthday"
-msgstr "Anniversaire"
+#: ../../include/text.php:2310
+msgid "Enter a name for the zip file."
+msgstr "Entrer un nom pour le fichier zip."
-#: ../../include/datetime.php:137
-msgid "Age: "
-msgstr "Age&nbsp;:"
+#: ../../include/text.php:2311
+msgid "Export to cloud files"
+msgstr "Exporter dans des fichiers sur le cloud"
-#: ../../include/datetime.php:139
-msgid "YYYY-MM-DD or MM-DD"
-msgstr "AAAA-MM-JJ ou MM-JJ"
+#: ../../include/text.php:2312
+msgid "/path/to/export/folder"
+msgstr "/chemin/vers/le/dossier/d'export"
-#: ../../include/datetime.php:272 ../../boot.php:2470
-msgid "never"
-msgstr "jamais"
+#: ../../include/text.php:2313
+msgid "Enter a path to a cloud files destination."
+msgstr "Entrer le chemin vers le cloud de fichiers"
-#: ../../include/datetime.php:278
-msgid "less than a second ago"
-msgstr "à l'instant"
+#: ../../include/text.php:2314
+msgid "Specify folder"
+msgstr "Spécifier un répertoire"
-#: ../../include/datetime.php:296
+#: ../../include/contact_widgets.php:11
#, php-format
-msgctxt "e.g. 22 hours ago, 1 minute ago"
-msgid "%1$d %2$s ago"
-msgstr "il y a %1$d %2$s"
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitation disponible"
+msgstr[1] "%d invitations disponibles"
-#: ../../include/datetime.php:307
-msgctxt "relative_date"
-msgid "year"
-msgid_plural "years"
-msgstr[0] "an"
-msgstr[1] "ans"
+#: ../../include/contact_widgets.php:19
+msgid "Find Channels"
+msgstr "Trouver des canaux"
-#: ../../include/datetime.php:310
-msgctxt "relative_date"
-msgid "month"
-msgid_plural "months"
-msgstr[0] "mois"
-msgstr[1] "mois"
+#: ../../include/contact_widgets.php:20
+msgid "Enter name or interest"
+msgstr "Saisir nom ou centre d'intérêt"
-#: ../../include/datetime.php:313
-msgctxt "relative_date"
-msgid "week"
-msgid_plural "weeks"
-msgstr[0] "semaine"
-msgstr[1] "semaines"
+#: ../../include/contact_widgets.php:21
+msgid "Connect/Follow"
+msgstr "Ajouter/Suivre"
-#: ../../include/datetime.php:316
-msgctxt "relative_date"
-msgid "day"
-msgid_plural "days"
-msgstr[0] "jour"
-msgstr[1] "jours"
+#: ../../include/contact_widgets.php:22
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Exemples: Guillaume Martin, Course à pieds"
-#: ../../include/datetime.php:319
-msgctxt "relative_date"
-msgid "hour"
-msgid_plural "hours"
-msgstr[0] "heure"
-msgstr[1] "heures"
+#: ../../include/contact_widgets.php:26
+msgid "Random Profile"
+msgstr "Un profil au hasard"
-#: ../../include/datetime.php:322
-msgctxt "relative_date"
-msgid "minute"
-msgid_plural "minutes"
-msgstr[0] "minute"
-msgstr[1] "minutes"
+#: ../../include/contact_widgets.php:27
+msgid "Invite Friends"
+msgstr "Inviter des amis"
-#: ../../include/datetime.php:325
-msgctxt "relative_date"
-msgid "second"
-msgid_plural "seconds"
-msgstr[0] "seconde"
-msgstr[1] "secondes"
+#: ../../include/contact_widgets.php:29
+msgid "Advanced example: name=fred and country=iceland"
+msgstr "Exemple avancé&nbsp;: name=fred and country=iceland"
-#: ../../include/datetime.php:562
+#: ../../include/contact_widgets.php:122
#, php-format
-msgid "%1$s's birthday"
-msgstr "Anniversaire de %1$s"
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d contact en commun"
+msgstr[1] "%d contacts en commun"
-#: ../../include/datetime.php:563
-#, php-format
-msgid "Happy Birthday %1$s"
-msgstr "Joyeux Anniversaire %1$s"
+#: ../../include/contact_widgets.php:127
+msgid "show more"
+msgstr "montrer plus"
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent."
+#: ../../include/markdown.php:444
+msgid "Attachments:"
+msgstr ""
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Ajouter de nouveaux contacts à ce groupe d'accès"
+#: ../../include/markdown.php:538 ../../include/event.php:22
+#: ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\à G\\hi"
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "modifier"
+#: ../../include/markdown.php:540
+msgid "$Projectname event notification:"
+msgstr ""
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Modifier le groupe"
+#: ../../include/markdown.php:544 ../../include/event.php:30
+#: ../../include/event.php:73
+msgid "Starts:"
+msgstr "Début&nbsp;:"
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Ajouter un groupe d'accès"
+#: ../../include/markdown.php:552 ../../include/event.php:40
+#: ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Fin&nbsp;:"
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Canaux n'étant dans aucun groupe d'accès"
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "Ce canal est bloqué sur ce site."
+
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Emplacement du canal introuvable."
+
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "La réponse du canal distant était incomplète."
+
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "Le canal a été supprimé et n'existe plus."
+
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protocole désactivé."
+
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "La tentative d'accéder au canal a échoué."
+
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "Ne peut pas se connecter à vous."
#: ../../include/js_strings.php:5
msgid "Delete this item?"
msgstr "Supprimer cet élément?"
#: ../../include/js_strings.php:8
-msgid "[-] show less"
-msgstr "[-] montrer moins"
+#, php-format
+msgid "%s show less"
+msgstr "%s afficher moins"
#: ../../include/js_strings.php:9
-msgid "[+] expand"
-msgstr "[+] déplier"
+#, php-format
+msgid "%s expand"
+msgstr "%s dérouler"
#: ../../include/js_strings.php:10
-msgid "[-] collapse"
-msgstr "[-] replier"
+#, php-format
+msgid "%s collapse"
+msgstr "%s enrouler"
#: ../../include/js_strings.php:11
msgid "Password too short"
@@ -9246,7 +11955,7 @@ msgstr "%d années"
#: ../../include/js_strings.php:42
msgid " "
-msgstr ""
+msgstr " "
#: ../../include/js_strings.php:43
msgid "timeago.numbers"
@@ -9359,470 +12068,1219 @@ msgctxt "calendar"
msgid "All day"
msgstr "Toute la journée"
-#: ../../include/network.php:657
+#: ../../include/message.php:30
+msgid "Unable to determine sender."
+msgstr "Impossible de déterminer l'émetteur."
+
+#: ../../include/message.php:67
+msgid "No recipient provided."
+msgstr "Pas de destinataire."
+
+#: ../../include/message.php:72
+msgid "[no subject]"
+msgstr "[sans objet]"
+
+#: ../../include/message.php:223
+msgid "Stored post could not be verified."
+msgstr "Le message stocké n'a pas pu être vérifié."
+
+#: ../../include/activities.php:41
+msgid " and "
+msgstr "et"
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "profil public"
+
+#: ../../include/activities.php:58
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s a changé %2$s en &ldquo;%3$s&rdquo;"
+
+#: ../../include/activities.php:59
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Visiter %2$s de %1$s"
+
+#: ../../include/activities.php:62
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s a mis à jour %2$s, modifiant %3$s."
+
+#: ../../include/attach.php:250 ../../include/attach.php:339
+msgid "Item was not found."
+msgstr "Élément introuvable."
+
+#: ../../include/attach.php:500
+msgid "No source file."
+msgstr "Pas de fichier source."
+
+#: ../../include/attach.php:522
+msgid "Cannot locate file to replace"
+msgstr "Impossible de trouver le fichier à remplacer."
+
+#: ../../include/attach.php:540
+msgid "Cannot locate file to revise/update"
+msgstr "Impossible de trouver le fichier à corriger/mettre à jour"
+
+#: ../../include/attach.php:671
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Le fichier dépasse la taille limite de %d"
+
+#: ../../include/attach.php:685
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Vous avez atteint votre limite de %1$.0f méga-octets autorisés pour le stockage des pièces-jointes."
+
+#: ../../include/attach.php:855
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Envoi du fichier impossible. Limite système ou action avortée."
+
+#: ../../include/attach.php:868
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Le fichier stocké n'a pu être vérifié. Echec de l'envoi."
+
+#: ../../include/attach.php:923 ../../include/attach.php:939
+msgid "Path not available."
+msgstr "Chemin non disponible."
+
+#: ../../include/attach.php:988 ../../include/attach.php:1153
+msgid "Empty pathname"
+msgstr "Chemin vide"
+
+#: ../../include/attach.php:1014
+msgid "duplicate filename or path"
+msgstr "doublon de chemin ou de fichier"
+
+#: ../../include/attach.php:1039
+msgid "Path not found."
+msgstr "Chemin introuvable."
+
+#: ../../include/attach.php:1107
+msgid "mkdir failed."
+msgstr "mkdir a échoué."
+
+#: ../../include/attach.php:1111
+msgid "database storage failed."
+msgstr "l'écriture dans la base de données a échoué."
+
+#: ../../include/attach.php:1159
+msgid "Empty path"
+msgstr "Chemin vide"
+
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "Visiteur"
+
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures)."
+
+#: ../../include/items.php:846 ../../include/items.php:893
+msgid "(Unknown)"
+msgstr "(Inconnu)"
+
+#: ../../include/items.php:1094
+msgid "Visible to anybody on the internet."
+msgstr "Visible pour tout le monde sur internet."
+
+#: ../../include/items.php:1096
+msgid "Visible to you only."
+msgstr "Visible pour vous seulement."
+
+#: ../../include/items.php:1098
+msgid "Visible to anybody in this network."
+msgstr "Visible pour tout le monde sur ce réseau."
+
+#: ../../include/items.php:1100
+msgid "Visible to anybody authenticated."
+msgstr "Visible aux utilisateurs authentifiés."
+
+#: ../../include/items.php:1102
+#, php-format
+msgid "Visible to anybody on %s."
+msgstr "Visible pour tous sur %s."
+
+#: ../../include/items.php:1104
+msgid "Visible to all connections."
+msgstr "Visible pour tous les contacts."
+
+#: ../../include/items.php:1106
+msgid "Visible to approved connections."
+msgstr "Visible aux contacts approuvés."
+
+#: ../../include/items.php:1108
+msgid "Visible to specific connections."
+msgstr "Visible pour certains contacts."
+
+#: ../../include/items.php:3925
+msgid "Privacy group is empty."
+msgstr "Groupe de contacts vide."
+
+#: ../../include/items.php:3932
+#, php-format
+msgid "Privacy group: %s"
+msgstr "Groupe de contacts&nbsp;: %s"
+
+#: ../../include/items.php:3944
+msgid "Connection not found."
+msgstr "Contact non trouvé."
+
+#: ../../include/items.php:4293
+msgid "profile photo"
+msgstr "photo de profil"
+
+#: ../../include/items.php:4489
+#, php-format
+msgid "[Edited %s]"
+msgstr "[%s édité]"
+
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Post"
+msgstr "Publier"
+
+#: ../../include/items.php:4489
+msgctxt "edit_activity"
+msgid "Comment"
+msgstr "Commenter"
+
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
+msgstr "Impossible d'obtenir les données d'identité depuis la base de données"
+
+#: ../../include/channel.php:67
+msgid "Empty name"
+msgstr "Nom vide"
+
+#: ../../include/channel.php:70
+msgid "Name too long"
+msgstr "Nom trop long"
+
+#: ../../include/channel.php:181
+msgid "No account identifier"
+msgstr "Pas d'identifiant de compte"
+
+#: ../../include/channel.php:193
+msgid "Nickname is required."
+msgstr "Un surnom est requis."
+
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
+msgstr "Surnom réservé. Merci d'en choisir un autre."
+
+#: ../../include/channel.php:212
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Le surnom contient des caractères interdits ou est déjà pris sur ce site."
+
+#: ../../include/channel.php:270
+msgid "Unable to retrieve created identity"
+msgstr "Impossible de récupérer l'identité créée"
+
+#: ../../include/channel.php:342
+msgid "Default Profile"
+msgstr "Profil par défaut"
+
+#: ../../include/channel.php:1043
+msgid "Create New Profile"
+msgstr "Créer un nouveau profil"
+
+#: ../../include/channel.php:1063
+msgid "Visible to everybody"
+msgstr "Visible de tous"
+
+#: ../../include/channel.php:1136 ../../include/channel.php:1250
+msgid "Gender:"
+msgstr "Sexe&nbsp;:"
+
+#: ../../include/channel.php:1138 ../../include/channel.php:1305
+msgid "Homepage:"
+msgstr "Site Internet&nbsp;:"
+
+#: ../../include/channel.php:1139
+msgid "Online Now"
+msgstr "Connecté"
+
+#: ../../include/channel.php:1255
+msgid "Like this channel"
+msgstr "J'aime ce canal"
+
+#: ../../include/channel.php:1279
+msgid "j F, Y"
+msgstr "j F, Y"
+
+#: ../../include/channel.php:1280
+msgid "j F"
+msgstr "j F"
+
+#: ../../include/channel.php:1287
+msgid "Birthday:"
+msgstr "Date de naissance&nbsp;:"
+
+#: ../../include/channel.php:1300
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "depuis %1$d %2$s"
+
+#: ../../include/channel.php:1303
+msgid "Sexual Preference:"
+msgstr "Orientation sexuelle&nbsp;:"
+
+#: ../../include/channel.php:1309
+msgid "Tags:"
+msgstr "Étiquettes&nbsp;:"
+
+#: ../../include/channel.php:1311
+msgid "Political Views:"
+msgstr "Opinions politiques&nbsp;:"
+
+#: ../../include/channel.php:1313
+msgid "Religion:"
+msgstr "Religion&nbsp;:"
+
+#: ../../include/channel.php:1317
+msgid "Hobbies/Interests:"
+msgstr "Occupations/Centres d'intérêt&nbsp;:"
+
+#: ../../include/channel.php:1319
+msgid "Likes:"
+msgstr "Aime&nbsp;:"
+
+#: ../../include/channel.php:1321
+msgid "Dislikes:"
+msgstr "N'aime pas&nbsp;:"
+
+#: ../../include/channel.php:1323
+msgid "Contact information and Social Networks:"
+msgstr "Coordonnées et réseaux sociaux&nbsp;:"
+
+#: ../../include/channel.php:1325
+msgid "My other channels:"
+msgstr "Mes autres canaux&nbsp;:"
+
+#: ../../include/channel.php:1327
+msgid "Musical interests:"
+msgstr "Goûts musicaux&nbsp;:"
+
+#: ../../include/channel.php:1329
+msgid "Books, literature:"
+msgstr "Lectures, goûts littéraires&nbsp;:"
+
+#: ../../include/channel.php:1331
+msgid "Television:"
+msgstr "Télévision&nbsp;:"
+
+#: ../../include/channel.php:1333
+msgid "Film/dance/culture/entertainment:"
+msgstr "Cinéma/danse/culture/divertissement&nsbp;:"
+
+#: ../../include/channel.php:1335
+msgid "Love/Romance:"
+msgstr "Vie sentimentale/amoureuse&nbsp;:"
+
+#: ../../include/channel.php:1337
+msgid "Work/employment:"
+msgstr "Travail/Occupation&nbsp;"
+
+#: ../../include/channel.php:1339
+msgid "School/education:"
+msgstr "Études&nbsp;"
+
+#: ../../include/channel.php:1362
+msgid "Like this thing"
+msgstr "J'aime ceci"
+
+#: ../../include/channel.php:2135
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Utilisateur '%s' supprimé"
+
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
+msgstr "Cet évènement a été ajouté dans votre calendrier."
+
+#: ../../include/event.php:1204
+msgid "Not specified"
+msgstr "Non spécifié"
+
+#: ../../include/event.php:1205
+msgid "Needs Action"
+msgstr "Besoin d'une action"
+
+#: ../../include/event.php:1206
+msgid "Completed"
+msgstr "Terminé"
+
+#: ../../include/event.php:1207
+msgid "In Process"
+msgstr "En cours"
+
+#: ../../include/event.php:1208
+msgid "Cancelled"
+msgstr "Annulé"
+
+#: ../../include/network.php:756
msgid "view full size"
msgstr "voir en taille réelle"
-#: ../../include/network.php:1885
+#: ../../include/network.php:2011
msgid "No Subject"
msgstr "Pas d'objet"
-#: ../../include/network.php:2146 ../../include/network.php:2147
+#: ../../include/network.php:2265 ../../include/network.php:2266
msgid "Friendica"
msgstr "Friendica"
-#: ../../include/network.php:2148
+#: ../../include/network.php:2267
msgid "OStatus"
msgstr "OStatus"
-#: ../../include/network.php:2149
+#: ../../include/network.php:2268
msgid "GNU-Social"
-msgstr ""
+msgstr "GNU-Social"
-#: ../../include/network.php:2150
+#: ../../include/network.php:2269
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/network.php:2152
+#: ../../include/network.php:2271
msgid "Diaspora"
msgstr "Diaspora"
-#: ../../include/network.php:2153
+#: ../../include/network.php:2272
msgid "Facebook"
msgstr "Facebook"
-#: ../../include/network.php:2154
+#: ../../include/network.php:2273
msgid "Zot"
msgstr "Zot"
-#: ../../include/network.php:2155
+#: ../../include/network.php:2274
msgid "LinkedIn"
msgstr "Linkedin"
-#: ../../include/network.php:2156
+#: ../../include/network.php:2275
msgid "XMPP/IM"
msgstr "XMPP/IM"
-#: ../../include/network.php:2157
+#: ../../include/network.php:2276
msgid "MySpace"
msgstr "MySpace"
-#: ../../include/photos.php:110
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "L'image dépasse la taille limite de %lu octets"
+#: ../../include/page_widgets.php:7
+msgid "New Page"
+msgstr "Nouvelle page"
-#: ../../include/photos.php:117
-msgid "Image file is empty."
-msgstr "L'image est vide."
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Choisir une langue alternative"
-#: ../../include/photos.php:255
-msgid "Photo storage failed."
-msgstr "Le stockage de l'image a échoué."
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "Qui peut voir cela"
-#: ../../include/photos.php:295
-msgid "a new photo"
-msgstr "une nouvelle photo"
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Sélection personnalisée"
-#: ../../include/photos.php:299
+#: ../../include/acl_selectors.php:210
+msgid ""
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\"."
+
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Montrer"
+
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "Cacher"
+
+#: ../../include/acl_selectors.php:245
#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s a publié %2$s pour %3$s"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message."
-#: ../../include/photos.php:506
-msgid "Upload New Photos"
-msgstr "Ajouter des photos"
+#: ../../include/dba/dba_driver.php:189
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Impossible de trouver les infos DNS du serveur de BDD '%s'"
-#: ../../include/zot.php:699
-msgid "Invalid data packet"
-msgstr "Paquet de données invalide"
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
+#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
+#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
+#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
+#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
+#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
+#: ../../include/bbcode.php:1079
+msgid "Image/photo"
+msgstr "Image/photo"
-#: ../../include/zot.php:715
-msgid "Unable to verify channel signature"
-msgstr "Impossible de vérifier la signature du canal"
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+msgid "Encrypted content"
+msgstr "Contenu chiffré"
-#: ../../include/zot.php:2363
+#: ../../include/bbcode.php:189
#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Impossible de vérifier la signature de site pour %s"
+msgid "Install %s element: "
+msgstr "Installer %s élément"
-#: ../../include/zot.php:3712
-msgid "invalid target signature"
-msgstr "signature de la cible invalide"
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Ce message contient un élément installable %s, mais vous n'avez pas l'autorisation de l'installer sur ce site."
-#: ../../include/page_widgets.php:6
-msgid "New Page"
-msgstr "Nouvelle page"
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s a écrit %2$s qui suit %3$s"
-#: ../../include/page_widgets.php:43
-msgid "Title"
-msgstr "Titre"
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Cliquer pour ouvrir/fermer"
-#: ../../include/permissions.php:26
-msgid "Can view my normal stream and posts"
-msgstr "Peut voir les publications ordinaires sur mon canal."
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "spoiler"
-#: ../../include/permissions.php:27
-msgid "Can view my default channel profile"
-msgstr "Peut voir le profil du canal par défaut."
+#: ../../include/bbcode.php:1028
+msgid "$1 wrote:"
+msgstr "$1 a écrit&nbsp;:"
-#: ../../include/permissions.php:28
-msgid "Can view my connections"
-msgstr "Peut voir mes contacts"
+#: ../../include/oembed.php:308
+msgid " by "
+msgstr "par"
-#: ../../include/permissions.php:29
-msgid "Can view my file storage and photos"
-msgstr "Peut voir mes fichiers et photos"
+#: ../../include/oembed.php:309
+msgid " on "
+msgstr "sur"
-#: ../../include/permissions.php:30
-msgid "Can view my webpages"
-msgstr "Peut voir mes pages web"
+#: ../../include/oembed.php:338
+msgid "Embedded content"
+msgstr "Contenu imbriqué"
-#: ../../include/permissions.php:33
-msgid "Can send me their channel stream and posts"
-msgstr "Peuvent m'envoyer leur flux et les publications de leur canal"
+#: ../../include/oembed.php:347
+msgid "Embedding disabled"
+msgstr "Imbrication désactivée"
-#: ../../include/permissions.php:34
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Peuvent poster sur la page de mon canal (\"mur\")"
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Fonctionnalités générales"
-#: ../../include/permissions.php:35
-msgid "Can comment on or like my posts"
-msgstr "Peuvent commenter et/ou aimer mes publications"
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Profils multiples"
-#: ../../include/permissions.php:36
-msgid "Can send me private mail messages"
-msgstr "Peuvent m'envoyer des messages privés"
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Possibilité de créer plusieurs profils"
-#: ../../include/permissions.php:37
-msgid "Can like/dislike stuff"
-msgstr "Peuvent aimer/ne pas aimer"
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Profils Avancés"
-#: ../../include/permissions.php:37
-msgid "Profiles and things other than posts/comments"
-msgstr "Profils et autres excluant les publications/commentaires."
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Sections et sélections supplémentaires du profil"
-#: ../../include/permissions.php:39
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Peut faire suivre à tous les contacts de mon canal via \"@mention\""
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Importer/Exporter le profil"
-#: ../../include/permissions.php:39
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Avancé - utile pour les canaux de type \"forum/groupe\""
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Sauvegarder et charger les détails d'un profil entre sites/canaux"
-#: ../../include/permissions.php:40
-msgid "Can chat with me (when available)"
-msgstr "Peut discuter avec moi (quand disponibie)"
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Pages web"
-#: ../../include/permissions.php:41
-msgid "Can write to my file storage and photos"
-msgstr "Peut charger des fichiers et des photos dans mon canal"
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Fournir des pages web, sous votre contrôle, sur votre canal"
-#: ../../include/permissions.php:42
-msgid "Can edit my webpages"
-msgstr "Peut modifier mes pages web"
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Fournir un wiki pour votre canal."
-#: ../../include/permissions.php:44
-msgid "Can source my public posts in derived channels"
-msgstr "Peut rediriger mes publications publiques vers des canaux dérivés"
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Notes privées"
-#: ../../include/permissions.php:44
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Plutôt avancé - très utile dans les communautés ouvertes"
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Active un outil pour stocker des notes et des rappels (note&nbsp;:non chiffré)"
-#: ../../include/permissions.php:46
-msgid "Can administer my channel resources"
-msgstr "Peut administrer les ressources de mon canal"
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Sélection du canal par la navigation"
-#: ../../include/permissions.php:46
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Changez de canal directement depuis le menu de navigation déroulant"
+
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Site de prise de vue"
+
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Si des informations géographiques sont présentes dans les images téléversées, les lier à une carte."
+
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Accéder au salons de discussions contrôlés."
+
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Fournir des salons de discussions et des services de discussions avec contrôle d'accès."
+
+#: ../../include/features.php:154
+msgid "Provide alternate connection permission roles."
+msgstr "Fournir des rôles d'autorisation différents pour ce contact."
+
+#: ../../include/features.php:162
+msgid "Smart Birthdays"
+msgstr "Anniversaires intelligents"
+
+#: ../../include/features.php:163
msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes"
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Adapter les anniversaires aux fuseaux horaires, utile pour vos amis sur d'autres continents."
-#: ../../include/permissions.php:877
-msgid "Social Networking"
-msgstr "Réseau social"
+#: ../../include/features.php:171
+msgid "Event Timezone Selection"
+msgstr "Sélection du fuseau horaire de l'événement"
-#: ../../include/permissions.php:877
-msgid "Social - Mostly Public"
-msgstr "Social - surtout public"
+#: ../../include/features.php:172
+msgid "Allow event creation in timezones other than your own."
+msgstr "Autorise la création d’événements sur d'autres fuseaux horaires que le vôtre."
-#: ../../include/permissions.php:877
-msgid "Social - Restricted"
-msgstr "Social - restreint"
+#: ../../include/features.php:180
+msgid "Advanced Directory Search"
+msgstr "Recherche avancée dans les répertoires"
-#: ../../include/permissions.php:877
-msgid "Social - Private"
-msgstr "Social - privé"
+#: ../../include/features.php:181
+msgid "Allows creation of complex directory search queries"
+msgstr "Autoriser la création d'entrées complexes de recherche de répertoire"
-#: ../../include/permissions.php:878
-msgid "Community Forum"
-msgstr "Forum communautaire"
+#: ../../include/features.php:189
+msgid "Advanced Theme and Layout Settings"
+msgstr "Paramètres avancés du thème et de l'agencement."
-#: ../../include/permissions.php:878
-msgid "Forum - Mostly Public"
-msgstr "Forum - surtout public"
+#: ../../include/features.php:190
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Autoriser la personnalisation fine des thèmes et des agencements."
-#: ../../include/permissions.php:878
-msgid "Forum - Restricted"
-msgstr "Forum - restreint"
+#: ../../include/features.php:200
+msgid "Post Composition Features"
+msgstr "Fonctionnalités de composition"
-#: ../../include/permissions.php:878
-msgid "Forum - Private"
-msgstr "Forum - privé"
+#: ../../include/features.php:204
+msgid "Large Photos"
+msgstr "Grandes photos"
-#: ../../include/permissions.php:879
-msgid "Feed Republish"
-msgstr "Republication de flux"
+#: ../../include/features.php:205
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Inclure de grands aperçus (1024px) dans les messages. Si désactivé, inclure de petits aperçus (640px)."
-#: ../../include/permissions.php:879
-msgid "Feed - Mostly Public"
-msgstr "Flux - surtout public"
+#: ../../include/features.php:214
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importe automatiquement le contenus d'autres canaux ou flux dans le canal actif"
-#: ../../include/permissions.php:879
-msgid "Feed - Restricted"
-msgstr "Flux - restreint"
+#: ../../include/features.php:222
+msgid "Even More Encryption"
+msgstr "Encore plus de chiffrement"
-#: ../../include/permissions.php:880
-msgid "Special Purpose"
-msgstr "Utilisation spécifique"
+#: ../../include/features.php:223
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Permettre le chiffrement optionnel du contenu de bout en bout au moyen d'un secret partagé"
-#: ../../include/permissions.php:880
-msgid "Special - Celebrity/Soapbox"
-msgstr "Spécial - célébrité/promotion"
+#: ../../include/features.php:231
+msgid "Enable Voting Tools"
+msgstr "Activer les outils de vote"
-#: ../../include/permissions.php:880
-msgid "Special - Group Repository"
-msgstr "Spécial - dépôt partagé"
+#: ../../include/features.php:232
+msgid "Provide a class of post which others can vote on"
+msgstr "Fournit un type de publication sur lequel les utilisateurs peuvent voter"
-#: ../../include/permissions.php:881
-msgid "Custom/Expert Mode"
-msgstr "Mode expert/spécifique"
+#: ../../include/features.php:240
+msgid "Disable Comments"
+msgstr "Désactiver les commentaires"
-#: ../../include/activities.php:41
-msgid " and "
-msgstr "et"
+#: ../../include/features.php:241
+msgid "Provide the option to disable comments for a post"
+msgstr "Fournir la possibilité de désactiver les commentaires pour une publication."
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "profil public"
+#: ../../include/features.php:249
+msgid "Delayed Posting"
+msgstr "Publication plus tard"
-#: ../../include/activities.php:58
+#: ../../include/features.php:250
+msgid "Allow posts to be published at a later date"
+msgstr "Permettre de publier des messages à une date programmée"
+
+#: ../../include/features.php:258
+msgid "Content Expiration"
+msgstr "Expiration du contenu"
+
+#: ../../include/features.php:259
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Supprimer les contributions/commentaires et/ou messages privés plus tard"
+
+#: ../../include/features.php:267
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Supprimer les publications/commentaires en doublon"
+
+#: ../../include/features.php:268
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Empêcher des messages aux contenus identiques d'être publiés à moins de deux minutes d'intervalle"
+
+#: ../../include/features.php:279
+msgid "Network and Stream Filtering"
+msgstr "Filtrage du réseau et des flux"
+
+#: ../../include/features.php:283
+msgid "Search by Date"
+msgstr "Chercher par date"
+
+#: ../../include/features.php:284
+msgid "Ability to select posts by date ranges"
+msgstr "Pouvoir choisir des publications par date"
+
+#: ../../include/features.php:292 ../../include/group.php:331
+msgid "Privacy Groups"
+msgstr "Groupes de contacts"
+
+#: ../../include/features.php:293
+msgid "Enable management and selection of privacy groups"
+msgstr "Active la gestion et la sélection des groupes de contacts"
+
+#: ../../include/features.php:302
+msgid "Save search terms for re-use"
+msgstr "Sauvegarder des termes de recherche pour utilisation ultérieure"
+
+#: ../../include/features.php:310
+msgid "Network Personal Tab"
+msgstr "Onglet \"Me concernant\""
+
+#: ../../include/features.php:311
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Activer un onglet affichant seulement les publications du réseau sur lesquelles vous êtes intervenu"
+
+#: ../../include/features.php:319
+msgid "Network New Tab"
+msgstr "Onglet \"nouveautés réseau\""
+
+#: ../../include/features.php:320
+msgid "Enable tab to display all new Network activity"
+msgstr "Activer un onglet présentant toute l'activité récente sur le réseau"
+
+#: ../../include/features.php:328
+msgid "Affinity Tool"
+msgstr "Gérer l'affinité"
+
+#: ../../include/features.php:329
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtrer le flux d'activité en fonction de la profondeur des relations"
+
+#: ../../include/features.php:338
+msgid "Show friend and connection suggestions"
+msgstr "Afficher un ami et les suggestions de relations"
+
+#: ../../include/features.php:346
+msgid "Connection Filtering"
+msgstr "Filtrage des contacts"
+
+#: ../../include/features.php:347
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Filtrer les publications entrantes de mes contacts sur la base de mots-clefs"
+
+#: ../../include/features.php:359
+msgid "Post/Comment Tools"
+msgstr "Gérer les publications/commentaires"
+
+#: ../../include/features.php:363
+msgid "Community Tagging"
+msgstr "Etiquetage communautaire"
+
+#: ../../include/features.php:364
+msgid "Ability to tag existing posts"
+msgstr "Permettre de marquer les publications existantes"
+
+#: ../../include/features.php:372
+msgid "Post Categories"
+msgstr "Catégoriser les publications"
+
+#: ../../include/features.php:373
+msgid "Add categories to your posts"
+msgstr "Ajouter des catégories à vos publications"
+
+#: ../../include/features.php:381
+msgid "Emoji Reactions"
+msgstr "Réactions par émoticônes"
+
+#: ../../include/features.php:382
+msgid "Add emoji reaction ability to posts"
+msgstr "Ajouter la possibilité de réagir aux publications par émoticônes"
+
+#: ../../include/features.php:391
+msgid "Ability to file posts under folders"
+msgstr "Permettre de classer les publications dans des dossiers"
+
+#: ../../include/features.php:399
+msgid "Dislike Posts"
+msgstr "\"Ne pas aimer\" les publications"
+
+#: ../../include/features.php:400
+msgid "Ability to dislike posts/comments"
+msgstr "Possibilité de \"ne pas aimer\" les publications/commentaires"
+
+#: ../../include/features.php:408
+msgid "Star Posts"
+msgstr "Pouvoir mettre en avant les publications"
+
+#: ../../include/features.php:409
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Pouvoir marquer certaines publications d'une étoile"
+
+#: ../../include/features.php:417
+msgid "Tag Cloud"
+msgstr "Nuage de tags"
+
+#: ../../include/features.php:418
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Afficher un nuage de vos tags sur votre canal"
+
+#: ../../include/features.php:430
+msgid "Premium Channel"
+msgstr "Canal VIP"
+
+#: ../../include/features.php:431
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal"
+
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Étiquettes"
+
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Mots-clefs"
+
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "ont"
+
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "a"
+
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "veulent"
+
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "veut"
+
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "aime"
+
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "n'aime pas"
+
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Ce n'est pas une adresse de courriel valide"
+
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site"
+
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Votre adresse de courriel est déjà inscrite sur ce site."
+
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Une invitation est requise."
+
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "Votre invitation n'a pas pu être vérifiée."
+
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Merci d'entrer les informations requises."
+
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "Impossible de stocker les informations liées au compte."
+
+#: ../../include/account.php:263
#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s a changé %2$s en &ldquo;%3$s&rdquo;"
+msgid "Registration confirmation for %s"
+msgstr "Confirmation de l'inscription pour %s"
-#: ../../include/activities.php:59
+#: ../../include/account.php:330
#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Visiter %2$s de %1$s"
+msgid "Registration request at %s"
+msgstr "Demande d'inscription sur %s"
-#: ../../include/activities.php:62
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "votre mot de passe d'inscription"
+
+#: ../../include/account.php:358 ../../include/account.php:420
#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s a mis à jour %2$s, modifiant %3$s."
+msgid "Registration details for %s"
+msgstr "Détails de l'inscription pour %s"
-#: ../../include/bb2diaspora.php:398
-msgid "Attachments:"
-msgstr "Pièces jointes&nbsp;:"
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Compte approuvé."
-#: ../../include/bb2diaspora.php:487
-msgid "$Projectname event notification:"
-msgstr "Notification d'événement de $Projectname&nbsp;:"
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Inscription révoquée pour %s"
-#: ../../view/theme/redbasic/php/config.php:82
-msgid "Focus (Hubzilla default)"
-msgstr "Focus (par défaut pour Hubzilla)"
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Cliquez ici pour mettre à jour."
-#: ../../view/theme/redbasic/php/config.php:103
-msgid "Theme settings"
-msgstr "Paramètres du thème"
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Cette action outrepasserait les limites prévues par votre forfait."
-#: ../../view/theme/redbasic/php/config.php:104
-msgid "Select scheme"
-msgstr "Définir la palette de couleurs"
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Cette action n'est pas disponible avec votre forfait."
-#: ../../view/theme/redbasic/php/config.php:105
-msgid "Narrow navbar"
-msgstr "Barre de navigation fine"
+#: ../../include/datetime.php:147
+msgid "Birthday"
+msgstr "Anniversaire"
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Navigation bar background color"
-msgstr "Couleur de fond de la barre de navigation"
+#: ../../include/datetime.php:149
+msgid "Age: "
+msgstr "Age&nbsp;:"
-#: ../../view/theme/redbasic/php/config.php:107
-msgid "Navigation bar gradient top color"
-msgstr "Dégradé de la barre de navigation - couleur du haut"
+#: ../../include/datetime.php:151
+msgid "YYYY-MM-DD or MM-DD"
+msgstr "AAAA-MM-JJ ou MM-JJ"
-#: ../../view/theme/redbasic/php/config.php:108
-msgid "Navigation bar gradient bottom color"
-msgstr "Dégradé de la barre de navigation - couleur du bas"
+#: ../../include/datetime.php:292
+msgid "less than a second ago"
+msgstr "à l'instant"
-#: ../../view/theme/redbasic/php/config.php:109
-msgid "Navigation active button gradient top color"
-msgstr "Dégradé du bouton de navigation actif - couleur du haut"
+#: ../../include/datetime.php:310
+#, php-format
+msgctxt "e.g. 22 hours ago, 1 minute ago"
+msgid "%1$d %2$s ago"
+msgstr "il y a %1$d %2$s"
-#: ../../view/theme/redbasic/php/config.php:110
-msgid "Navigation active button gradient bottom color"
-msgstr "Dégradé du bouton de navigation actif - couleur du bas"
+#: ../../include/datetime.php:321
+msgctxt "relative_date"
+msgid "year"
+msgid_plural "years"
+msgstr[0] "an"
+msgstr[1] "ans"
-#: ../../view/theme/redbasic/php/config.php:111
-msgid "Navigation bar border color "
-msgstr "Couleur de la bordure de la barre de navigation"
+#: ../../include/datetime.php:324
+msgctxt "relative_date"
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mois"
+msgstr[1] "mois"
-#: ../../view/theme/redbasic/php/config.php:112
-msgid "Navigation bar icon color "
-msgstr "Couleur des icônes de la barre de navigation"
+#: ../../include/datetime.php:327
+msgctxt "relative_date"
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semaine"
+msgstr[1] "semaines"
-#: ../../view/theme/redbasic/php/config.php:113
-msgid "Navigation bar active icon color "
-msgstr "Couleur de l'icône active de la barre de navigation"
+#: ../../include/datetime.php:330
+msgctxt "relative_date"
+msgid "day"
+msgid_plural "days"
+msgstr[0] "jour"
+msgstr[1] "jours"
-#: ../../view/theme/redbasic/php/config.php:114
-msgid "link color"
-msgstr "couleur des liens"
+#: ../../include/datetime.php:333
+msgctxt "relative_date"
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
-#: ../../view/theme/redbasic/php/config.php:115
-msgid "Set font-color for banner"
-msgstr "Définir la couleur du texte de la bannière"
+#: ../../include/datetime.php:336
+msgctxt "relative_date"
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
-#: ../../view/theme/redbasic/php/config.php:116
-msgid "Set the background color"
-msgstr "Définir la couleur d'arrière-plan"
+#: ../../include/datetime.php:339
+msgctxt "relative_date"
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] "seconde"
+msgstr[1] "secondes"
-#: ../../view/theme/redbasic/php/config.php:117
-msgid "Set the background image"
-msgstr "Définir l'image d'arrière-plan"
+#: ../../include/datetime.php:576
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Anniversaire de %1$s"
-#: ../../view/theme/redbasic/php/config.php:118
-msgid "Set the background color of items"
-msgstr "Définir la couleur de fond des contributions"
+#: ../../include/datetime.php:577
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Joyeux Anniversaire %1$s"
-#: ../../view/theme/redbasic/php/config.php:119
-msgid "Set the background color of comments"
-msgstr "Couleur de fond des commentaires"
+#: ../../include/nav.php:88
+msgid "Remote authentication"
+msgstr "Authentification distante"
-#: ../../view/theme/redbasic/php/config.php:120
-msgid "Set the border color of comments"
-msgstr "Couleur de la bordure des commentaires"
+#: ../../include/nav.php:88
+msgid "Click to authenticate to your home hub"
+msgstr "S'authentifier auprès de votre hub principal"
-#: ../../view/theme/redbasic/php/config.php:121
-msgid "Set the indent for comments"
-msgstr "Indentation des commentaires"
+#: ../../include/nav.php:99 ../../include/nav.php:123
+msgid "End this session"
+msgstr "Mettre fin à la session"
-#: ../../view/theme/redbasic/php/config.php:122
-msgid "Set the basic color for item icons"
-msgstr "Définir la couleur de base pour les icônes des éléments"
+#: ../../include/nav.php:102
+msgid "Your profile page"
+msgstr "Votre profil"
-#: ../../view/theme/redbasic/php/config.php:123
-msgid "Set the hover color for item icons"
-msgstr "Définir la couleur de survol des icônes des éléments"
+#: ../../include/nav.php:105
+msgid "Manage/Edit profiles"
+msgstr "Gérer/modifier vos profils"
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Set font-size for the entire application"
-msgstr "Définir la taille de police pour l'application entière"
+#: ../../include/nav.php:107
+msgid "Edit your profile"
+msgstr "Modifier votre profil"
-#: ../../view/theme/redbasic/php/config.php:124
-msgid "Example: 14px"
-msgstr "Exemple : 14px"
+#: ../../include/nav.php:113
+msgid "Sign in"
+msgstr "Connexion"
-#: ../../view/theme/redbasic/php/config.php:125
-msgid "Set font-size for posts and comments"
-msgstr "Définir la taille de police pour les contributions et commentaires"
+#: ../../include/nav.php:138
+msgid "Take me home"
+msgstr ""
-#: ../../view/theme/redbasic/php/config.php:126
-msgid "Set font-color for posts and comments"
-msgstr "Définir la couleur de police pour les contributions et commentaires"
+#: ../../include/nav.php:140
+msgid "Log me out of this site"
+msgstr "Déconnectez-moi de ce site"
-#: ../../view/theme/redbasic/php/config.php:127
-msgid "Set radius of corners"
-msgstr "Définir le rayon des arrondis"
+#: ../../include/nav.php:145
+msgid "Create an account"
+msgstr "Créer un compte"
-#: ../../view/theme/redbasic/php/config.php:128
-msgid "Set shadow depth of photos"
-msgstr "Définir la profondeur de l'ombre des photos"
+#: ../../include/nav.php:157
+msgid "Help and documentation"
+msgstr "Aide et documentation"
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Set maximum width of content region in pixel"
-msgstr "Définir la largeur maximale de la zone des contenus"
+#: ../../include/nav.php:160
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Recherche @nom, #tag, contenu"
-#: ../../view/theme/redbasic/php/config.php:129
-msgid "Leave empty for default width"
-msgstr "Laissez vide pour avoir la largeur par défaut"
+#: ../../include/nav.php:172
+msgid "Your grid"
+msgstr "Votre réseau"
-#: ../../view/theme/redbasic/php/config.php:130
-msgid "Left align page content"
-msgstr "Aligner à gauche le contenu de la page"
+#: ../../include/nav.php:173
+msgid "View your network/grid"
+msgstr "Voir votre réseau"
+
+#: ../../include/nav.php:174
+msgid "Mark all grid notifications seen"
+msgstr "Marquer toutes les notifications du réseau comme vues"
-#: ../../view/theme/redbasic/php/config.php:131
-msgid "Set minimum opacity of nav bar - to hide it"
-msgstr "Définir l'opacité minimum du bandeau de navigation - pour le cacher"
+#: ../../include/nav.php:176
+msgid "Channel home"
+msgstr "Mon canal"
-#: ../../view/theme/redbasic/php/config.php:132
-msgid "Set size of conversation author photo"
-msgstr "Définir la taille de la photo de l'auteur d'une conversation"
+#: ../../include/nav.php:177
+msgid "View your channel home"
+msgstr "Voir la page d'accueil de votre canal"
-#: ../../view/theme/redbasic/php/config.php:133
-msgid "Set size of followup author photos"
-msgstr "Définir la taille de la photo de l'auteur d'une réponse"
+#: ../../include/nav.php:178
+msgid "Mark all channel notifications seen"
+msgstr "Marquer toutes les notifications du canal comme vues"
-#: ../../boot.php:1162
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr ""
+#: ../../include/nav.php:184
+msgid "Notices"
+msgstr "Notifications"
-#: ../../boot.php:1162
-msgctxt "opensearch"
-msgid "$Projectname"
+#: ../../include/nav.php:184
+msgid "Notifications"
+msgstr "Notifications"
+
+#: ../../include/nav.php:185
+msgid "View all notifications"
+msgstr "Voir toutes les notifications"
+
+#: ../../include/nav.php:188
+msgid "Private mail"
+msgstr "Messages privés"
+
+#: ../../include/nav.php:189
+msgid "View your private messages"
+msgstr "Voir vos messages privés"
+
+#: ../../include/nav.php:190
+msgid "Mark all private messages seen"
+msgstr "Marquer tous les messages privés comme vus"
+
+#: ../../include/nav.php:196
+msgid "Event Calendar"
+msgstr "Calendrier des événements"
+
+#: ../../include/nav.php:197
+msgid "View events"
+msgstr "Voir les événements"
+
+#: ../../include/nav.php:198
+msgid "Mark all events seen"
+msgstr "Marquer tous les événements comme vus"
+
+#: ../../include/nav.php:201
+msgid "Manage Your Channels"
+msgstr "Gérer vos canaux"
+
+#: ../../include/nav.php:203
+msgid "Account/Channel Settings"
+msgstr "Paramètres du Compte/Canal"
+
+#: ../../include/nav.php:211
+msgid "Site Setup and Configuration"
+msgstr "Configuration du site"
+
+#: ../../include/nav.php:273
+msgid "@name, #tag, ?doc, content"
+msgstr "@nom, #étiquette, ?doc, contenu"
+
+#: ../../include/nav.php:274
+msgid "Please wait..."
+msgstr "Merci de patienter..."
+
+#: ../../include/nav.php:276
+msgid "Add Apps"
msgstr ""
-#: ../../boot.php:1480
+#: ../../include/photos.php:115
#, php-format
-msgid "Update %s failed. See error logs."
-msgstr "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur."
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "L'image dépasse la taille limite de %lu octets"
+
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "L'image est vide."
+
+#: ../../include/photos.php:261
+msgid "Photo storage failed."
+msgstr "Le stockage de l'image a échoué."
-#: ../../boot.php:1483
+#: ../../include/photos.php:301
+msgid "a new photo"
+msgstr "une nouvelle photo"
+
+#: ../../include/photos.php:305
#, php-format
-msgid "Update Error at %s"
-msgstr "Erreur de mise à jour sur %s"
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s a publié %2$s pour %3$s"
+
+#: ../../include/photos.php:532
+msgid "Upload New Photos"
+msgstr "Ajouter des photos"
+
+#: ../../include/zot.php:649
+msgid "Invalid data packet"
+msgstr "Paquet de données invalide"
-#: ../../boot.php:1684
+#: ../../include/zot.php:665
+msgid "Unable to verify channel signature"
+msgstr "Impossible de vérifier la signature du canal"
+
+#: ../../include/zot.php:2316
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Impossible de vérifier la signature de site pour %s"
+
+#: ../../include/zot.php:3722
+msgid "invalid target signature"
+msgstr "signature de la cible invalide"
+
+#: ../../include/group.php:26
msgid ""
-"Create an account to access services and applications within the Hubzilla"
-msgstr "Créez un compte pour pouvoir accéder aux services et applications de Hubzilla"
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent."
-#: ../../boot.php:1706
-msgid "Password"
-msgstr "Mot de passe"
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Ajouter de nouveaux contacts à ce groupe de contacts"
-#: ../../boot.php:1707
-msgid "Remember me"
-msgstr "Se souvenir de moi"
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "modifier"
-#: ../../boot.php:1710
-msgid "Forgot your password?"
-msgstr "Mot de passe oublié&nbsp;?"
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Modifier le groupe"
-#: ../../boot.php:2276
-msgid "toggle mobile"
-msgstr "(dés)activer mobile"
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Créer un groupe de contacts"
-#: ../../boot.php:2425
-msgid "Website SSL certificate is not valid. Please correct."
-msgstr "Le certificat SSL n'est pas valide. Corrigez le."
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Contacts n'étant dans aucun groupe de contacts"
-#: ../../boot.php:2428
-#, php-format
-msgid "[hubzilla] Website SSL error for %s"
-msgstr "[hubzilla] Erreur SSL pour %s"
+#: ../../include/connections.php:127
+msgid "New window"
+msgstr "Nouvelle fenêtre"
-#: ../../boot.php:2469
-msgid "Cron/Scheduled tasks not running."
-msgstr "Les taches planifiées ne tournent pas."
+#: ../../include/connections.php:128
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Ouvrir l'emplacement dans une fenêtre ou un onglet différent"
-#: ../../boot.php:2473
-#, php-format
-msgid "[hubzilla] Cron tasks not running on %s"
-msgstr "[hubzilla] Les tâches planifiées ne tournent pas sur %s"
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Deconnecté."
+
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Échec de l'authentification"
+
+#: ../../include/help.php:33
+msgid "Help:"
+msgstr "Aide&nbsp;:"
+
+#: ../../include/help.php:65
+msgid "Not Found"
+msgstr "Introuvable"
diff --git a/view/fr/hstrings.php b/view/fr/hstrings.php
index a1ff9f868..d883cc240 100644
--- a/view/fr/hstrings.php
+++ b/view/fr/hstrings.php
@@ -4,441 +4,53 @@ if(! function_exists("string_plural_select_fr")) {
function string_plural_select_fr($n){
return ($n > 1);;
}}
-;
-App::$strings["parent"] = "retour";
-App::$strings["Collection"] = "Groupe de contacts";
-App::$strings["Principal"] = "Principal";
-App::$strings["Addressbook"] = "Carnet d'adresse";
-App::$strings["Calendar"] = "Calendrier";
-App::$strings["Schedule Inbox"] = "Calendrier - Messages entrants";
-App::$strings["Schedule Outbox"] = "Calendrier - Messages sortants";
-App::$strings["Unknown"] = "Inconnu";
-App::$strings["Files"] = "Fichiers";
-App::$strings["Total"] = "Total";
-App::$strings["Shared"] = "Partagé";
-App::$strings["Create"] = "Créer";
-App::$strings["Upload"] = "Envoyer";
-App::$strings["Name"] = "Nom";
-App::$strings["Type"] = "Type";
-App::$strings["Size"] = "Taille";
-App::$strings["Last Modified"] = "Modifié le";
-App::$strings["Edit"] = "Modifier";
-App::$strings["Delete"] = "Supprimer";
-App::$strings["You are using %1\$s of your available file storage."] = "Vous utilisez %1\$s de votre espace de stockage.";
-App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Vous utilisez %1\$s sur %2\$s d'espace disponible. (%3\$s&#37;)";
-App::$strings["WARNING:"] = "AVERTISSEMENT&nbsp;:";
-App::$strings["Create new folder"] = "Nouveau dossier";
-App::$strings["Upload file"] = "Téléverser un fichier";
-App::$strings["Permission denied"] = "Accès refusé";
-App::$strings["Permission denied."] = "Permission refusée.";
-App::$strings["Not Found"] = "Introuvable";
-App::$strings["Page not found."] = "Page introuvable.";
-App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer.";
-App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenue %s. L'authentification distante a fonctionné.";
+App::$rtl = 0;
+App::$strings["Can view my channel stream and posts"] = "Peut voir mon canal et mes publicatiosn";
+App::$strings["Can send me their channel stream and posts"] = "Peuvent m'envoyer leur flux et les publications de leur canal";
+App::$strings["Can view my default channel profile"] = "Peut voir le profil par défaut du canal.";
+App::$strings["Can view my connections"] = "Peut voir mes contacts";
+App::$strings["Can view my file storage and photos"] = "Peut voir mes fichiers et photos";
+App::$strings["Can upload/modify my file storage and photos"] = "Peut télécharger/modifier mes fichiers et mes photos";
+App::$strings["Can view my channel webpages"] = "Peut voir les pages web de mon canal";
+App::$strings["Can view my wiki pages"] = "Peut voir les pages de mon wiki";
+App::$strings["Can create/edit my channel webpages"] = "Peut créer ou modifier les pages web de mon canal";
+App::$strings["Can write to my wiki pages"] = "Peut écrire sur mon wiki";
+App::$strings["Can post on my channel (wall) page"] = "Peut écrire sur le mur de mon canal (mur)";
+App::$strings["Can comment on or like my posts"] = "Peuvent commenter et/ou aimer mes publications";
+App::$strings["Can send me private mail messages"] = "Peuvent m'envoyer des messages privés";
+App::$strings["Can like/dislike profiles and profile things"] = "Peut aimer ou détester des profiles";
+App::$strings["Can forward to all my channel connections via @+ mentions in posts"] = "Peut faire suivre à tous mes contacts avec la mention @+ dans une publication";
+App::$strings["Can chat with me"] = "Peut discuter avec moi";
+App::$strings["Can source my public posts in derived channels"] = "Peut rediriger mes publications publiques vers des canaux dérivés";
+App::$strings["Can administer my channel"] = "Peut administrer mon canal";
+App::$strings["Social Networking"] = "Réseau social";
+App::$strings["Social - Mostly Public"] = "Social - principalement public";
+App::$strings["Social - Restricted"] = "Social - restreint";
+App::$strings["Social - Private"] = "Social - privé";
+App::$strings["Community Forum"] = "Forum communautaire";
+App::$strings["Forum - Mostly Public"] = "Forum - principalement public";
+App::$strings["Forum - Restricted"] = "Forum - restreint";
+App::$strings["Forum - Private"] = "Forum - privé";
+App::$strings["Feed Republish"] = "Republication de flux";
+App::$strings["Feed - Mostly Public"] = "Flux - principalement public";
+App::$strings["Feed - Restricted"] = "Flux - restreint";
+App::$strings["Special Purpose"] = "Utilisation spécifique";
+App::$strings["Special - Celebrity/Soapbox"] = "Spécial - célébrité/vitrine";
+App::$strings["Special - Group Repository"] = "Spécial - dépôt partagé";
+App::$strings["Other"] = "Autre";
+App::$strings["Custom/Expert Mode"] = "Mode expert/spécifique";
App::$strings["Requested profile is not available."] = "Profil demandé non disponible.";
-App::$strings["Some blurb about what to do when you're new here"] = "Quelques mots sur quoi faire quand on est nouveau ici";
+App::$strings["Permission denied."] = "Permission refusée.";
App::$strings["Block Name"] = "Nom du Bloc";
App::$strings["Blocks"] = "Blocs";
App::$strings["Block Title"] = "Titre du bloc";
App::$strings["Created"] = "Créé(e)";
App::$strings["Edited"] = "Modifié(e)";
+App::$strings["Create"] = "Créer";
+App::$strings["Edit"] = "Modifier";
App::$strings["Share"] = "Partager";
+App::$strings["Delete"] = "Supprimer";
App::$strings["View"] = "Voir";
-App::$strings["Channel not found."] = "Canal introuvable.";
-App::$strings["Permissions denied."] = "Permissions refusées.";
-App::$strings["l, F j"] = "l, F j";
-App::$strings["Link to Source"] = "Lien vers la Source";
-App::$strings["Edit Event"] = "Modifier l'événement";
-App::$strings["Create Event"] = "Créer un événement";
-App::$strings["Previous"] = "Précédent";
-App::$strings["Next"] = "Suivant";
-App::$strings["Export"] = "Export";
-App::$strings["Import"] = "Import";
-App::$strings["Submit"] = "Envoyer";
-App::$strings["Today"] = "Aujourd'hui";
-App::$strings["You must be logged in to see this page."] = "Vous devez vous connecter pour voir cette page.";
-App::$strings["Posts and comments"] = "";
-App::$strings["Only posts"] = "";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permissions insuffisantes. Demande redirigée vers la page du profil.";
-App::$strings["Room not found"] = "Salon introuvable";
-App::$strings["Leave Room"] = "Quitter le salon";
-App::$strings["Delete Room"] = "";
-App::$strings["I am away right now"] = "Je suis absent en ce moment";
-App::$strings["I am online"] = "Je suis en ligne";
-App::$strings["Bookmark this room"] = "Marquer ce salon comme favori";
-App::$strings["Please enter a link URL:"] = "Merci d'entrer l'URL d'un lien&nbsp;:";
-App::$strings["Encrypt text"] = "Chiffrer le texte";
-App::$strings["Insert web link"] = "Insérer lien web";
-App::$strings["Feature disabled."] = "";
-App::$strings["New Chatroom"] = "Nouveau salon de discussion";
-App::$strings["Chatroom name"] = "";
-App::$strings["Expiration of chats (minutes)"] = "Expiration des discussions (en minutes)";
-App::$strings["Permissions"] = "Autorisations";
-App::$strings["%1\$s's Chatrooms"] = "Salons de %1\$s";
-App::$strings["No chatrooms available"] = "";
-App::$strings["Create New"] = "";
-App::$strings["Expiration"] = "";
-App::$strings["min"] = "";
-App::$strings["Away"] = "Absent";
-App::$strings["Online"] = "En ligne";
-App::$strings["Invalid item."] = "Élément invalide.";
-App::$strings["Bookmark added"] = "Favori ajouté";
-App::$strings["My Bookmarks"] = "Mes Favoris";
-App::$strings["My Connections Bookmarks"] = "Favoris de mes contacts";
-App::$strings["Continue"] = "Continuer";
-App::$strings["Premium Channel Setup"] = "Configuration du canal VIP";
-App::$strings["Enable premium channel connection restrictions"] = "Activer les restrictions liées au canal VIP";
-App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Merci de saisir les restrictions et/ou conditions - reçu Paypal, transaction Bitcoin, ligne de conduite, ...";
-App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Avant d'autoriser la mise en relation, ce canal attire votre attention sur les conditions suivantes&nbsp;:";
-App::$strings["Potential connections will then see the following text before proceeding:"] = "Les contacts potentiels verront ce qui suit avant de pouvoir continuer&nbsp;:";
-App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "En continuant, je certifie que je me suis conformé à toutes les instructions indiquées sur cette page.";
-App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Aucune instruction spécifique n'a été fournie par le propriétaire du canal.)";
-App::$strings["Restricted or Premium Channel"] = "Canal VIP ou restreint";
-App::$strings["Could not access contact record."] = "Impossible d'accéder aux détails du contact.";
-App::$strings["Could not locate selected profile."] = "Impossible de localiser le profil sélectionné.";
-App::$strings["Connection updated."] = "Contact mis à jour.";
-App::$strings["Failed to update connection record."] = "Impossible de mettre à jour les détails du contact.";
-App::$strings["is now connected to"] = "est maintenant connecté avec";
-App::$strings["No"] = "Non";
-App::$strings["Yes"] = "Oui";
-App::$strings["Could not access address book record."] = "Impossible d'accéder aux détails du carnet d'adresses.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Actualisation impossible - le canal est indisponible.";
-App::$strings["Unable to set address book parameters."] = "Impossible de régler les paramètres du carnet d'adresses.";
-App::$strings["Connection has been removed."] = "Le contact a été supprimé.";
-App::$strings["View Profile"] = "Voir le profil";
-App::$strings["View %s's profile"] = "Voir le profil de %s";
-App::$strings["Refresh Permissions"] = "Actualiser les autorisations";
-App::$strings["Fetch updated permissions"] = "Récupérer les autorisations les plus récentes";
-App::$strings["Recent Activity"] = "Activité récente";
-App::$strings["View recent posts and comments"] = "Voir les publications et commentaires récents";
-App::$strings["Unblock"] = "Débloquer";
-App::$strings["Block"] = "Bloquer";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquer ou débloquer toute communication avec ce contact";
-App::$strings["This connection is blocked!"] = "Ce contact est bloqué&nbsp;!";
-App::$strings["Unignore"] = "Ne plus ignorer";
-App::$strings["Ignore"] = "Ignorer";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorer ou ne plus ignorer toute communication venant de ce contact";
-App::$strings["This connection is ignored!"] = "Ce contact est ignoré&nbsp;!";
-App::$strings["Unarchive"] = "Désarchiver";
-App::$strings["Archive"] = "Archiver";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiver ou désarchiver ce contact - le marquer comme inactif mais conserver le contenu";
-App::$strings["This connection is archived!"] = "Ce contact est archivé&nbsp;!";
-App::$strings["Unhide"] = "Ne plus cacher";
-App::$strings["Hide"] = "Cacher";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts";
-App::$strings["This connection is hidden!"] = "Ce contact est caché&nbsp;!";
-App::$strings["Delete this connection"] = "Supprimer ce contact";
-App::$strings["Me"] = "Moi";
-App::$strings["Family"] = "Famille";
-App::$strings["Friends"] = "Amis";
-App::$strings["Acquaintances"] = "Connaissances";
-App::$strings["All"] = "Tous";
-App::$strings["Approve this connection"] = "Autoriser ce contact";
-App::$strings["Accept connection to allow communication"] = "Accepter le contact pour permettre la communication";
-App::$strings["Set Affinity"] = "Définir le degré d'affinité";
-App::$strings["Set Profile"] = "Définir le profil";
-App::$strings["Set Affinity & Profile"] = "Définir le degré d'affinité et le profil";
-App::$strings["none"] = "Aucun";
-App::$strings["Connection Default Permissions"] = "Autorisations par défaut des contacts";
-App::$strings["Connection: %s"] = "Contact&nbsp;: %s";
-App::$strings["Apply these permissions automatically"] = "Appliquer ces permissions automatiquement";
-App::$strings["Connection requests will be approved without your interaction"] = "Les demandes de contact seront approuvées automatiquement";
-App::$strings["This connection's primary address is"] = "L'adresse principale de ce contact est";
-App::$strings["Available locations:"] = "Emplacements disponibles&nbsp;:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts.";
-App::$strings["Connection Tools"] = "";
-App::$strings["Slide to adjust your degree of friendship"] = "Faites glisser pour ajuster votre proximité avec le contact";
-App::$strings["Rating"] = "Evaluation";
-App::$strings["Slide to adjust your rating"] = "Faîtes glisser pour ajuster votre note";
-App::$strings["Optionally explain your rating"] = "Explication facultative de votre évaluation";
-App::$strings["Custom Filter"] = "Filtre personnalisé";
-App::$strings["Only import posts with this text"] = "N'importer que les publications comprenant ce texte";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "un mot par ligne ou #étiquettes ou /motif/ ou lang=xx, laisser vide pour importer toutes les publications";
-App::$strings["Do not import posts with this text"] = "Ne pas importer les publications comprenant ce texte";
-App::$strings["This information is public!"] = "Cette information est publique&nbsp;!";
-App::$strings["Connection Pending Approval"] = "Contact en attente d'approbation";
-App::$strings["inherited"] = "héritée";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée.";
-App::$strings["Their Settings"] = "Leurs paramètres";
-App::$strings["My Settings"] = "Mes paramètres";
-App::$strings["Individual Permissions"] = "Permissions individuelles";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
-App::$strings["Last update:"] = "Dernière mise à jour&nbsp;:";
-App::$strings["Public access denied."] = "Accès public refusé.";
-App::$strings["%d rating"] = array(
- 0 => "%d évaluation",
- 1 => "%d évaluations",
-);
-App::$strings["Gender: "] = "Sexe/genre&nbsp;:";
-App::$strings["Status: "] = "État&nbsp;:";
-App::$strings["Homepage: "] = "Site web&nbsp;:";
-App::$strings["Age:"] = "Age&nbsp;:";
-App::$strings["Location:"] = "Emplacement&nbsp;:";
-App::$strings["Description:"] = "Description&nbsp;:";
-App::$strings["Hometown:"] = "Ville natale&nbsp;:";
-App::$strings["About:"] = "À propos&nbsp;:";
-App::$strings["Connect"] = "Ajouter/Suivre";
-App::$strings["Public Forum:"] = "Forum public&nbsp;:";
-App::$strings["Keywords: "] = "Mots-clefs&nbsp;:";
-App::$strings["Don't suggest"] = "Ne pas suggérer";
-App::$strings["Common connections:"] = "Contacts en commun&nbsp;:";
-App::$strings["Global Directory"] = "Annuaire global";
-App::$strings["Local Directory"] = "Annuaire local";
-App::$strings["Find"] = "Trouver";
-App::$strings["Finding:"] = "Recherche&nbsp;:";
-App::$strings["Channel Suggestions"] = "Canaux suggérés";
-App::$strings["next page"] = "page suivante";
-App::$strings["previous page"] = "page précédente";
-App::$strings["Sort options"] = "Options de tri";
-App::$strings["Alphabetic"] = "Alphabétique";
-App::$strings["Reverse Alphabetic"] = "Alphabétique inversé";
-App::$strings["Newest to Oldest"] = "Du plus récent au moins récent";
-App::$strings["Oldest to Newest"] = "Du moins récent du plus récent";
-App::$strings["No entries (some entries may be hidden)."] = "Pas d'entrées (certaines peuvent être cachées).";
-App::$strings["Item not found."] = "Élément introuvable";
-App::$strings["Item not found"] = "Élément introuvable";
-App::$strings["Title (optional)"] = "Titre (facultatif)";
-App::$strings["Edit Block"] = "Modifier le bloc";
-App::$strings["No channel."] = "Pas de canal.";
-App::$strings["Common connections"] = "Contacts en commun";
-App::$strings["No connections in common."] = "Pas de contacts en commun.";
-App::$strings["Blocked"] = "Bloqué(e)";
-App::$strings["Ignored"] = "Ignoré(e)";
-App::$strings["Hidden"] = "Caché";
-App::$strings["Archived"] = "Archivé";
-App::$strings["New"] = "Nouveautés";
-App::$strings["New Connections"] = "Nouveaux contacts";
-App::$strings["Show pending (new) connections"] = "Voir les (nouveaux) contacts en attente";
-App::$strings["All Connections"] = "Tous les contacts";
-App::$strings["Show all connections"] = "Voir tous les contacts";
-App::$strings["Only show blocked connections"] = "Ne montrer que les contacts bloqués";
-App::$strings["Only show ignored connections"] = "Ne montrer que les contacts ignorés";
-App::$strings["Only show archived connections"] = "Ne montrer que les contacts archivés";
-App::$strings["Only show hidden connections"] = "Ne montrer que les contacts cachés";
-App::$strings["Pending approval"] = "En attente de validation";
-App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
-App::$strings["Edit connection"] = "Modifier le contact";
-App::$strings["Delete connection"] = "Supprimer le contact";
-App::$strings["Channel address"] = "Adresse du canal";
-App::$strings["Network"] = "Réseau";
-App::$strings["Status"] = "État";
-App::$strings["Connected"] = "Connecté";
-App::$strings["Approve connection"] = "Valider le contact";
-App::$strings["Approve"] = "Approuver";
-App::$strings["Ignore connection"] = "Ignorer le contact";
-App::$strings["Recent activity"] = "Activité récente";
-App::$strings["Connections"] = "Contacts";
-App::$strings["Search"] = "Recherche";
-App::$strings["Search your connections"] = "Chercher parmi vos contacts";
-App::$strings["Connections search"] = "Chercher des contacts";
-App::$strings["Image uploaded but image cropping failed."] = "L'image a été téléversée, mais le recadrage a échoué.";
-App::$strings["Cover Photos"] = "Photos de couverture";
-App::$strings["Image resize failed."] = "Le redimensionnement de l'image a échoué.";
-App::$strings["Unable to process image"] = "Impossible de traiter l'image";
-App::$strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
-App::$strings["Unable to process image."] = "Impossible de traîter l'image.";
-App::$strings["female"] = "femme";
-App::$strings["%1\$s updated her %2\$s"] = "%1\$s a mis à jour son %2\$s";
-App::$strings["male"] = "homme";
-App::$strings["%1\$s updated his %2\$s"] = "%1\$s a mis à jour son %2\$s";
-App::$strings["%1\$s updated their %2\$s"] = "%1\$s a mis a jour sa %2\$s";
-App::$strings["cover photo"] = "Photo principale";
-App::$strings["Photo not available."] = "Photo inaccessible.";
-App::$strings["Upload File:"] = "Téléverser fichier&nbsp;:";
-App::$strings["Select a profile:"] = "Choisir un profil&nbsp;:";
-App::$strings["Upload Cover Photo"] = "Téléverser une photo de couverture";
-App::$strings["or"] = "ou";
-App::$strings["skip this step"] = "passer cette étape";
-App::$strings["select a photo from your photo albums"] = "choisir une photo dans vos albums";
-App::$strings["Crop Image"] = "Recadrer l'image";
-App::$strings["Please adjust the image cropping for optimum viewing."] = "Merci d'ajuster le cadre pour une visualisation optimale.";
-App::$strings["Done Editing"] = "J'ai terminé";
-App::$strings["Item is not editable"] = "Elément non modifiable";
-App::$strings["Edit post"] = "Modifier la publication";
-App::$strings["Calendar entries imported."] = "Entrées du calendrier importées.";
-App::$strings["No calendar entries found."] = "Aucune entrée du calendrier trouvée.";
-App::$strings["Event can not end before it has started."] = "La fin de l'événement ne peut être antérieure à son début.";
-App::$strings["Unable to generate preview."] = "Impossible de générer l'aperçu.";
-App::$strings["Event title and start time are required."] = "Un titre et une date de début sont requises pour l'événement.";
-App::$strings["Event not found."] = "Événement introuvable.";
-App::$strings["event"] = "événement";
-App::$strings["Edit event title"] = "Modifier le titre de l'événement";
-App::$strings["Event title"] = "Titre de l'événement";
-App::$strings["Required"] = "Requis";
-App::$strings["Categories (comma-separated list)"] = "Catégories (séparées par des virgules)";
-App::$strings["Edit Category"] = "Modifier la catégorie";
-App::$strings["Category"] = "Catégorie";
-App::$strings["Edit start date and time"] = "Modifier la date et l'heure de début";
-App::$strings["Start date and time"] = "Date et heure de début";
-App::$strings["Finish date and time are not known or not relevant"] = "Date et heure de fin inconnues ou sans objet";
-App::$strings["Edit finish date and time"] = "Modifier la date et l'heure de fin";
-App::$strings["Finish date and time"] = "Date et heure de fin";
-App::$strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde.";
-App::$strings["Edit Description"] = "Modifier la description";
-App::$strings["Description"] = "Description";
-App::$strings["Edit Location"] = "Modifier l'emplacement";
-App::$strings["Location"] = "Emplacement";
-App::$strings["Share this event"] = "Partager cet événement";
-App::$strings["Preview"] = "Aperçu";
-App::$strings["Permission settings"] = "Gérer les autorisations";
-App::$strings["Advanced Options"] = "Options avancées";
-App::$strings["Edit event"] = "Modifier l'événement";
-App::$strings["Delete event"] = "Supprimer l'événement";
-App::$strings["calendar"] = "calendrier";
-App::$strings["Event removed"] = "Événement supprimé";
-App::$strings["Failed to remove event"] = "Impossible de supprimer l'événement";
-App::$strings["Photos"] = "Photos";
-App::$strings["Cancel"] = "Annuler";
-App::$strings["This site is not a directory server"] = "Ce site n'est pas un serveur d'annuaire";
-App::$strings["This directory server requires an access token"] = "Ce serveur d'annuaire requiert un jeton d'accès";
-App::$strings["Save to Folder:"] = "Classer dans le dossier&nbsp;:";
-App::$strings["- select -"] = "- choisir -";
-App::$strings["Save"] = "Enregistrer";
-App::$strings["Invalid message"] = "Message non valide";
-App::$strings["no results"] = "aucun résultat";
-App::$strings["Delivery report for %1\$s"] = "Rapport de distribution pour %1\$s";
-App::$strings["channel sync processed"] = "Synchro de canal effectuée";
-App::$strings["queued"] = "mis dans la file d'attente";
-App::$strings["posted"] = "publié";
-App::$strings["accepted for delivery"] = "accepté pour la distribution";
-App::$strings["updated"] = "mis à jour";
-App::$strings["update ignored"] = "mise à jour ignorée";
-App::$strings["permission denied"] = "permission refusée";
-App::$strings["recipient not found"] = "destinataire introuvable";
-App::$strings["mail recalled"] = "courriel rappelé";
-App::$strings["duplicate mail received"] = "courriel reçu en double";
-App::$strings["mail delivered"] = "courriel distribué";
-App::$strings["Layout Name"] = "Nom de la mise en page";
-App::$strings["Layout Description (Optional)"] = "Description de la mise en page (facultatif)";
-App::$strings["Edit Layout"] = "Modifier la mise en page";
-App::$strings["Page link"] = "";
-App::$strings["Edit Webpage"] = "Modifier la page web";
-App::$strings["Channel added."] = "Canal ajouté.";
-App::$strings["network"] = "réseau";
-App::$strings["RSS"] = "RSS";
-App::$strings["Privacy group created."] = "Groupe d'accès créé.";
-App::$strings["Could not create privacy group."] = "Impossible de créer le groupe d'accès.";
-App::$strings["Privacy group not found."] = "Groupe d'accès introuvable.";
-App::$strings["Privacy group updated."] = "Groupe d'accès mis à jour.";
-App::$strings["Create a group of channels."] = "Créer un groupe de canaux.";
-App::$strings["Privacy group name: "] = "Nom du groupe d'accès&nbsp;:";
-App::$strings["Members are visible to other channels"] = "Les membres sont visibles par les autres canaux";
-App::$strings["Privacy group removed."] = "Groupe d'accès supprimé.";
-App::$strings["Unable to remove privacy group."] = "Impossible de supprimer le groupe d'accès.";
-App::$strings["Privacy group editor"] = "Editeur de groupe d'accès.";
-App::$strings["Members"] = "Membres";
-App::$strings["All Connected Channels"] = "Tous les canaux connectés";
-App::$strings["Click on a channel to add or remove."] = "Cliquer sur un canal pour l'ajouter ou le supprimer";
-App::$strings["Share content from Firefox to \$Projectname"] = "Partager du contenu depuis Firefox avec \$Projectname";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Activer le connecteur \$Projectname pour Firefox";
-App::$strings["Authorize application connection"] = "Autoriser l'application à se connecter";
-App::$strings["Return to your app and insert this Securty Code:"] = "Merci de retourner vers votre application, et d'y insérer ce Code de Sécurité&nbsp;:";
-App::$strings["Please login to continue."] = "Merci de vous identifier pour continuer.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?";
-App::$strings["Documentation Search"] = "Chercher dans la documentation";
-App::$strings["Help:"] = "Aide&nbsp;:";
-App::$strings["Help"] = "Aide";
-App::$strings["\$Projectname Documentation"] = "Documentation \$Projectname";
-App::$strings["Permission Denied."] = "Permission refusée.";
-App::$strings["File not found."] = "Fichier introuvable.";
-App::$strings["Edit file permissions"] = "Modifier les autorisations d'accès au fichier";
-App::$strings["Set/edit permissions"] = "Définir/modifier les autorisations";
-App::$strings["Include all files and sub folders"] = "Inclure tous fichiers et sous-répertoires";
-App::$strings["Return to file list"] = "Retourner à la liste des fichiers";
-App::$strings["Copy/paste this code to attach file to a post"] = "Copiez/collez ce code pour joindre le fichier à une publication";
-App::$strings["Copy/paste this URL to link file from a web page"] = "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web";
-App::$strings["Share this file"] = "Partager ce fichier";
-App::$strings["Show URL to this file"] = "Montrer l'URL de ce fichier";
-App::$strings["Notify your contacts about this file"] = "Notifier vos contacts à propos de ce fichier";
-App::$strings["Apps"] = "Applications";
-App::$strings["Item not available."] = "Élément indisponible.";
-App::$strings["Your service plan only allows %d channels."] = "Votre forfait n'autorise que %d canaux.";
-App::$strings["Nothing to import."] = "Rien à importer.";
-App::$strings["Unable to download data from old server"] = "Impossible de récupérer les données de l'ancien serveur";
-App::$strings["Imported file is empty."] = "Le fichier importé est vide.";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Attention&nbsp;: les versions de bases de données diffèrent de %1\$d mises à jour.";
-App::$strings["Cloned channel not found. Import failed."] = "Canal cloné non trouvé. Echec de l'import.";
-App::$strings["No channel. Import failed."] = "Pas de canal. Echec de l'import.";
-App::$strings["Import completed."] = "L'import est terminé.";
-App::$strings["You must be logged in to use this feature."] = "Vous devez vous connecter pour utiliser cette fonctionnalité.";
-App::$strings["Import Channel"] = "Importation de canal";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import.";
-App::$strings["File to Upload"] = "Fichier à envoyer";
-App::$strings["Or provide the old server/hub details"] = "Ou fournissez les détails de l'ancien serveur/hub";
-App::$strings["Your old identity address (xyz@example.com)"] = "Votre ancienne identité (zyx@exemple.com)";
-App::$strings["Your old login email address"] = "Votre ancienne adresse de courriel";
-App::$strings["Your old login password"] = "Votre ancien mot de passe";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media.";
-App::$strings["Make this hub my primary location"] = "Faire de ce hub mon emplacement primaire";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importer les publications existantes si possible (expérimental - limité par la mémoire disponible)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin.";
-App::$strings["Unable to locate original post."] = "Impossible de localiser la publication initiale.";
-App::$strings["Empty post discarded."] = "Publication vide annulée.";
-App::$strings["Executable content type not permitted to this channel."] = "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal.";
-App::$strings["Duplicate post suppressed."] = "Publication en doublon supprimée.";
-App::$strings["System error. Post not saved."] = "Erreur système. Publication non sauvegardée.";
-App::$strings["Unable to obtain post information from database."] = "Impossible d'obtenir les informations de publication depuis la base de données.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Vous avez atteint votre limite de %1$.0f contributions \"racines\".";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Vous avez atteint votre limite de %1$.0f pages web.";
-App::$strings["Layouts"] = "Mises-en-page";
-App::$strings["Comanche page description language help"] = "Aide sur le langage de description de page Comanche";
-App::$strings["Layout Description"] = "Description de la mise en page";
-App::$strings["Download PDL file"] = "Télécharger le fichier PDL";
-App::$strings["\$Projectname"] = "\$Projectname";
-App::$strings["Welcome to %s"] = "Bienvenue sur %s";
-App::$strings["First Name"] = "Prénom";
-App::$strings["Last Name"] = "Nom de famille";
-App::$strings["Nickname"] = "Surnom";
-App::$strings["Full Name"] = "Nom complet";
-App::$strings["Email"] = "Courriel";
-App::$strings["Profile Photo"] = "Photo du Profil";
-App::$strings["Profile Photo 16px"] = "Photo de profil 16px";
-App::$strings["Profile Photo 32px"] = "Photo de profil 32px";
-App::$strings["Profile Photo 48px"] = "Photo de profil 48px";
-App::$strings["Profile Photo 64px"] = "Photo de profil 64px";
-App::$strings["Profile Photo 80px"] = "Photo de profil 80px";
-App::$strings["Profile Photo 128px"] = "Photo de profil 128px";
-App::$strings["Timezone"] = "Fuseau horaire";
-App::$strings["Homepage URL"] = "URL de mon site Internet&nbsp;:";
-App::$strings["Language"] = "Langue";
-App::$strings["Birth Year"] = "Année de naissance";
-App::$strings["Birth Month"] = "Mois de naissance";
-App::$strings["Birth Day"] = "Jour de naissance";
-App::$strings["Birthdate"] = "Date de naissance";
-App::$strings["Gender"] = "Sexe";
-App::$strings["Male"] = "Homme";
-App::$strings["Female"] = "Femme";
-App::$strings["webpage"] = "pages web";
-App::$strings["block"] = "bloquer";
-App::$strings["layout"] = "mise en page";
-App::$strings["menu"] = "menu";
-App::$strings["%s element installed"] = "Elément %s installé";
-App::$strings["%s element installation failed"] = "L'installation de l'élément %s a échoué";
-App::$strings["Like/Dislike"] = "Aime/n'aime pas";
-App::$strings["This action is restricted to members."] = "Cette action est réservée aux membres.";
-App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de \$Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de \$Projectname </a> pour continuer.";
-App::$strings["Invalid request."] = "Requête invalide.";
-App::$strings["channel"] = "canal";
-App::$strings["thing"] = "chose";
-App::$strings["Channel unavailable."] = "Canal indisponible.";
-App::$strings["Previous action reversed."] = "Action précédente annulée.";
-App::$strings["photo"] = "photo";
-App::$strings["status"] = "état";
-App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
-App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s n'aime pas %3\$s de %2\$s";
-App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s approuve %3\$s de %2\$s";
-App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s n'est pas d'accord avec %3\$s de %2\$s";
-App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s s'abstient de toute décision sur le %3\$s de %2\$s";
-App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s participe à %3\$s de %2\$s";
-App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s ne participe pas à %3\$s de %2\$s";
-App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s participe peut-être à %3\$s de %2\$s";
-App::$strings["Action completed."] = "Action terminée.";
-App::$strings["Thank you."] = "Merci.";
-App::$strings["Import completed"] = "L'import est terminé.";
-App::$strings["Import Items"] = "Importer";
-App::$strings["Use this form to import existing posts and content from an export file."] = "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export.";
App::$strings["Total invitation limit exceeded."] = "Limite du nombre total d'invitation dépassée.";
App::$strings["%s : Not a valid email address."] = "%s&nbsp;: adresse courriel invalide.";
App::$strings["Please join us on \$Projectname"] = "Rejoignez-nous sur \$Projectname";
@@ -458,120 +70,63 @@ App::$strings["1. Register at any \$Projectname location (they are all inter-con
App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Saisissez l'adresse de mon canal \$Projectname dans la barre de recherche du site.";
App::$strings["or visit"] = "ou rendez-vous sur";
App::$strings["3. Click [Connect]"] = "3. Cliquez sur [Ajouter]";
-App::$strings["Remote privacy information not available."] = "Les informations distantes de confidentialité ne sont pas disponibles.";
-App::$strings["Visible to:"] = "Visible par&nbsp;:";
+App::$strings["Submit"] = "Envoyer";
+App::$strings["Item not found"] = "Élément introuvable";
+App::$strings["Layout Name"] = "Nom de la mise en page";
+App::$strings["Layout Description (Optional)"] = "Description de la mise en page (facultatif)";
+App::$strings["Edit Layout"] = "Modifier la mise en page";
+App::$strings["Permission denied"] = "Accès refusé";
+App::$strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
+App::$strings["Profile Visibility Editor"] = "Éditeur de visibilité de profil";
+App::$strings["Profile"] = "Profil";
+App::$strings["Click on a contact to add or remove."] = "Cliquer sur un contact pour l'ajouter ou le retirer.";
+App::$strings["Visible To"] = "Visible par";
+App::$strings["All Connections"] = "Tous les contacts";
+App::$strings["This site is not a directory server"] = "Ce site n'est pas un serveur d'annuaire";
+App::$strings["You must be logged in to see this page."] = "Vous devez vous connecter pour voir cette page.";
+App::$strings["Posts and comments"] = "Publications et commentaires";
+App::$strings["Only posts"] = "Seulement les publications";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permissions insuffisantes. Demande redirigée vers la page du profil.";
+App::$strings["Export Channel"] = "Exporter le canal";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus.";
+App::$strings["Export Content"] = "Exporter le contenu";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence.";
+App::$strings["Export your posts from a given year."] = "Exporter vos publications d'une année en particulier";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1\$s\">%2\$s</a>";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1\$s\">%2\$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord).";
+App::$strings["Public access denied."] = "Accès public refusé.";
+App::$strings["Search"] = "Recherche";
+App::$strings["Items tagged with: %s"] = "Eléments étiquetés avec&nbsp;: %s";
+App::$strings["Search results for: %s"] = "Résultats de recherche pour&nbsp;: %s";
App::$strings["Location not found."] = "Emplacement introuvable.";
App::$strings["Location lookup failed."] = "Echec de la recherche de l'emplacement.";
App::$strings["Please select another location to become primary before removing the primary location."] = "Merci de sélectionner un autre emplacement comme nouvel emplacement primaire avant de supprimer l'emplacement primaire actuel.";
App::$strings["Syncing locations"] = "Synchronisation des emplacements";
App::$strings["No locations found."] = "Emplacement(s) introuvable.";
App::$strings["Manage Channel Locations"] = "Gérer les emplacements des canaux";
+App::$strings["Location"] = "Emplacement";
App::$strings["Address"] = "Adresse";
-App::$strings["Primary"] = "";
+App::$strings["Primary"] = "Primaire";
App::$strings["Drop"] = "Supprimer";
-App::$strings["Sync Now"] = "";
+App::$strings["Sync Now"] = "Synchronisez maintenant";
App::$strings["Please wait several minutes between consecutive operations."] = "Merci d'attendre plusieurs minutes entre opérations successives.";
App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Quand c'est possible, abandonnez un emplacement en vous connectant sur le site/hub et en supprimant votre canal.";
App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilisez ce formulaire pour abandonner l'emplacement si le hub n'est plus actif.";
-App::$strings["Hub not found."] = "Hub introuvable.";
-App::$strings["Unable to lookup recipient."] = "Impossible de localiser le destinataire.";
-App::$strings["Unable to communicate with requested channel."] = "Impossible de communiquer avec le canal demandé.";
-App::$strings["Cannot verify requested channel."] = "Impossible de vérifier le canal demandé.";
-App::$strings["Selected channel has private message restrictions. Send failed."] = "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué.";
-App::$strings["Messages"] = "Messages";
-App::$strings["Message recalled."] = "Message rappelé.";
-App::$strings["Conversation removed."] = "Conversation supprimée.";
-App::$strings["Expires YYYY-MM-DD HH:MM"] = "Expire le YYYY-MM-DD à HH:MM";
-App::$strings["Requested channel is not in this network"] = "Le canal demandé n'est pas sur ce réseau";
-App::$strings["Send Private Message"] = "Envoyer un message privé";
-App::$strings["To:"] = "À&nbsp;:";
-App::$strings["Subject:"] = "Objet&nbsp;:";
-App::$strings["Attach file"] = "Joindre un fichier";
-App::$strings["Send"] = "Envoyer";
-App::$strings["Set expiration date"] = "Définir la date d'expiration";
-App::$strings["Delete message"] = "Supprimer le message";
-App::$strings["Delivery report"] = "Rapport de distribution";
-App::$strings["Recall message"] = "Rappeler le message";
-App::$strings["Message has been recalled."] = "Le message a été rappelé.";
-App::$strings["Delete Conversation"] = "Supprimer la conversation";
-App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur.";
-App::$strings["Send Reply"] = "Envoyer la réponse";
-App::$strings["Your message for %s (%s):"] = "Votre message pour %s (%s)&nbsp;:";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Vous avez créé %1$.0f des %2$.0f canaux autorisés.";
-App::$strings["Create a new channel"] = "Créer un nouveau canal";
-App::$strings["Channel Manager"] = "Gérer les canaux";
-App::$strings["Current Channel"] = "Canal actif";
-App::$strings["Switch to one of your channels by selecting it."] = "Pour changer de canal, sélectionnez-en un";
-App::$strings["Default Channel"] = "Canal par défaut";
-App::$strings["Make Default"] = "Définir comme défaut";
-App::$strings["%d new messages"] = "%d nouveaux messages";
-App::$strings["%d new introductions"] = "%d nouvelles présentations";
-App::$strings["Delegated Channel"] = "";
-App::$strings["No valid account found."] = "Aucun compte valide trouvé.";
-App::$strings["Password reset request issued. Check your email."] = "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels.";
-App::$strings["Site Member (%s)"] = "Membre du site (%s)";
-App::$strings["Password reset requested at %s"] = "Demande de réinitialisation du mot de passe sur %s";
-App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué.";
-App::$strings["Password Reset"] = "Réinitialiser le mot de passe";
-App::$strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
-App::$strings["Your new password is"] = "Votre nouveau mot de passe est";
-App::$strings["Save or copy your new password - and then"] = "Enregistrez ou copiez votre nouveau mot de passe, puis";
-App::$strings["click here to login"] = "cliquez ici pour vous connecter";
-App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté.";
-App::$strings["Your password has changed at %s"] = "Votre mot de passe de %s a été changé";
-App::$strings["Forgot your Password?"] = "Mot de passe oublié&nbsp;?";
-App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions.";
-App::$strings["Email Address"] = "Adresse de courriel";
-App::$strings["Reset"] = "Réinitialiser";
-App::$strings["Unable to update menu."] = "Impossible de mettre le menu à jour.";
-App::$strings["Unable to create menu."] = "Impossible de créer le menu.";
-App::$strings["Menu Name"] = "Nom du menu";
-App::$strings["Unique name (not visible on webpage) - required"] = "Nom unique (non visible sur la page web) - requis";
-App::$strings["Menu Title"] = "Titre du menu";
-App::$strings["Visible on webpage - leave empty for no title"] = "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre";
-App::$strings["Allow Bookmarks"] = "Autoriser l'usage de favoris";
-App::$strings["Menu may be used to store saved bookmarks"] = "Le menu pourra être utilisé pour stocker des favoris";
-App::$strings["Submit and proceed"] = "Valider et continuer";
-App::$strings["Menus"] = "Menus";
-App::$strings["Bookmarks allowed"] = "Favoris autorisés";
-App::$strings["Delete this menu"] = "Supprimer ce menu";
-App::$strings["Edit menu contents"] = "Modifier le contenu du menu";
-App::$strings["Edit this menu"] = "Modifier ce menu";
-App::$strings["Menu could not be deleted."] = "Impossible de supprimer le menu.";
App::$strings["Menu not found."] = "Menu introuvable.";
-App::$strings["Edit Menu"] = "Modifier le menu";
-App::$strings["Add or remove entries to this menu"] = "Ajouter/supprimer des entrées à ce menu";
-App::$strings["Menu name"] = "Nom du menu";
-App::$strings["Must be unique, only seen by you"] = "Doit être unique, ne sera vu que par vous";
-App::$strings["Menu title"] = "Titre du menu";
-App::$strings["Menu title as seen by others"] = "Titre du menu tel que vu par les visiteurs";
-App::$strings["Allow bookmarks"] = "Autoriser l'usage de favoris";
-App::$strings["Not found."] = "Introuvable.";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s est %2\$s";
-App::$strings["Mood"] = "Humeur";
-App::$strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis";
-App::$strings["Profile Match"] = "Profils similaires";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clef à comparer. Merci d'ajouter des mots-clefs à votre profil par défaut.";
-App::$strings["is interested in:"] = "s'intéresse à&nbsp;:";
-App::$strings["No matches"] = "Pas de correspondance";
-App::$strings["No such group"] = "Groupe introuvable";
-App::$strings["No such channel"] = "Canal introuvable";
-App::$strings["forum"] = "forum";
-App::$strings["Search Results For:"] = "Résultats de recherche pour&nbsp;:";
-App::$strings["Privacy group is empty"] = "Groupe d'accès vide";
-App::$strings["Privacy group: "] = "Groupe d'accès&nbsp;:";
-App::$strings["Invalid connection."] = "Contact non valide.";
-App::$strings["No more system notifications."] = "Pas d'autre notification du système.";
-App::$strings["System Notifications"] = "Notifications du système";
App::$strings["Unable to create element."] = "Impossible de créer l'entrée.";
App::$strings["Unable to update menu element."] = "Impossible de mettre à jour l'entrée de menu.";
App::$strings["Unable to add menu element."] = "Impossible d'ajouter l'entrée de menu.";
+App::$strings["Not found."] = "Introuvable.";
App::$strings["Menu Item Permissions"] = "Permissions de l'entrée de menu";
App::$strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
App::$strings["Link Name"] = "Nom du lien";
App::$strings["Link or Submenu Target"] = "Lien ou sous-menu cible";
App::$strings["Enter URL of the link or select a menu name to create a submenu"] = "Entrez l'URL du lien ou sélectionnez un nom de menu pour créer un sous-menu";
App::$strings["Use magic-auth if available"] = "Utiliser l'authentification distante, quand disponible";
+App::$strings["No"] = "Non";
+App::$strings["Yes"] = "Oui";
App::$strings["Open link in new window"] = "Ouvrir le lien dans une nouvelle fenêtre";
App::$strings["Order in list"] = "Ordre dans la liste";
App::$strings["Higher numbers will sink to bottom of listing"] = "Les nombres les plus élevés seront au bas de la liste";
@@ -592,6 +147,77 @@ App::$strings["Menu item deleted."] = "Entrée de menu supprimée.";
App::$strings["Menu item could not be deleted."] = "Impossible de supprimer l'entrée de menu.";
App::$strings["Edit Menu Element"] = "Modifier l'entrée de menu";
App::$strings["Link text"] = "Texte du lien";
+App::$strings["Calendar entries imported."] = "Entrées du calendrier importées.";
+App::$strings["No calendar entries found."] = "Aucune entrée du calendrier trouvée.";
+App::$strings["Event can not end before it has started."] = "La fin de l'événement ne peut être antérieure à son début.";
+App::$strings["Unable to generate preview."] = "Impossible de générer l'aperçu.";
+App::$strings["Event title and start time are required."] = "Un titre et une date de début sont requises pour l'événement.";
+App::$strings["Event not found."] = "Événement introuvable.";
+App::$strings["event"] = "événement";
+App::$strings["Edit event title"] = "Modifier le titre de l'événement";
+App::$strings["Event title"] = "Titre de l'événement";
+App::$strings["Required"] = "Requis";
+App::$strings["Categories (comma-separated list)"] = "Catégories (séparées par des virgules)";
+App::$strings["Edit Category"] = "Modifier la catégorie";
+App::$strings["Category"] = "Catégorie";
+App::$strings["Edit start date and time"] = "Modifier la date et l'heure de début";
+App::$strings["Start date and time"] = "Date et heure de début";
+App::$strings["Finish date and time are not known or not relevant"] = "Date et heure de fin inconnues ou sans objet";
+App::$strings["Edit finish date and time"] = "Modifier la date et l'heure de fin";
+App::$strings["Finish date and time"] = "Date et heure de fin";
+App::$strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Important pour les événements se tenant en un lieu particulier. Pas pratique pour les vacances communes à de nombreux pays dans le monde.";
+App::$strings["Edit Description"] = "Modifier la description";
+App::$strings["Description"] = "Description";
+App::$strings["Edit Location"] = "Modifier l'emplacement";
+App::$strings["Preview"] = "Aperçu";
+App::$strings["Permission settings"] = "Gérer les autorisations";
+App::$strings["Timezone:"] = "Fuseau horaire&nbsp;:";
+App::$strings["Advanced Options"] = "Options avancées";
+App::$strings["l, F j"] = "l, F j";
+App::$strings["Edit event"] = "Modifier l'événement";
+App::$strings["Delete event"] = "Supprimer l'événement";
+App::$strings["Link to Source"] = "Lien vers la Source";
+App::$strings["calendar"] = "calendrier";
+App::$strings["Edit Event"] = "Modifier l'événement";
+App::$strings["Create Event"] = "Créer un événement";
+App::$strings["Previous"] = "Précédent";
+App::$strings["Next"] = "Suivant";
+App::$strings["Export"] = "Export";
+App::$strings["Month"] = "Mois";
+App::$strings["Week"] = "Semaine";
+App::$strings["Day"] = "Jour";
+App::$strings["Today"] = "Aujourd'hui";
+App::$strings["Event removed"] = "Événement supprimé";
+App::$strings["Failed to remove event"] = "Impossible de supprimer l'événement";
+App::$strings["App installed."] = "Application installée.";
+App::$strings["Malformed app."] = "Erreur de l'application - Malformée.";
+App::$strings["Embed code"] = "Imbriquer le code";
+App::$strings["Edit App"] = "Modifier l'application";
+App::$strings["Create App"] = "Créer une application";
+App::$strings["Name of app"] = "Nom de l'application";
+App::$strings["Location (URL) of app"] = "Emplacement (URL) de l'application";
+App::$strings["Photo icon URL"] = "URL de l'icône à utiliser pour cette photo";
+App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - facultatif";
+App::$strings["Categories (optional, comma separated list)"] = "Catégories (séparées par des virgules)";
+App::$strings["Version ID"] = "Identifiant de version";
+App::$strings["Price of app"] = "Prix de l'application";
+App::$strings["Location (URL) to purchase app"] = "Emplacement (URL) pour l'achat de l'application";
+App::$strings["Please login."] = "Merci de vous connecter.";
+App::$strings["Hub not found."] = "Hub introuvable.";
+App::$strings["photo"] = "photo";
+App::$strings["status"] = "état";
+App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s suit %3\$s de %2\$s";
+App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ne suit plus %3\$s de %2\$s";
+App::$strings["Nothing to import."] = "Rien à importer.";
+App::$strings["Unable to download data from old server"] = "Impossible de récupérer les données de l'ancien serveur";
+App::$strings["Imported file is empty."] = "Le fichier importé est vide.";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Attention&nbsp;: les versions de bases de données diffèrent de %1\$d mises à jour.";
+App::$strings["Import completed"] = "L'import est terminé.";
+App::$strings["Import Items"] = "Importer";
+App::$strings["Use this form to import existing posts and content from an export file."] = "Utiliser ce formulaire pour importer des publications et du contenu existant d'un fichier d'export.";
+App::$strings["File to Upload"] = "Fichier à envoyer";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Vous avez créé %1$.0f des %2$.0f canaux autorisés.";
App::$strings["Name or caption"] = "Nom ou libellé";
App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\""] = "Exemples&nbsp;: \"Jérôme Dutilleul\", \"Louise et ses chevaux\", \"Football\", \"Club d'aéromodélisme\"";
App::$strings["Choose a short nickname"] = "Choisissez un alias";
@@ -602,312 +228,134 @@ App::$strings["Read more about roles"] = "En savoir plus sur les rôles";
App::$strings["Create Channel"] = "Créer le canal";
App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Un canal est votre identité sur ce réseau. Il peut représenter une personne, un blog, ou un forum par exemple. Les canaux peuvent entrer en contact les uns avec les autres pour partager des informations avec des permissions d'accès très fines.";
App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "ou <a href=\"import\">importer un canal existant</a> d'un autre serveur.";
-App::$strings["Invalid request identifier."] = "Identifiant de requête invalide.";
-App::$strings["Discard"] = "Annuler";
-App::$strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme vues";
-App::$strings["Page owner information could not be retrieved."] = "Impossible d'obtenir des informations sur le propriétaire de la page.";
-App::$strings["Profile Photos"] = "Photos du profil";
-App::$strings["Album not found."] = "Album introuvable.";
-App::$strings["Delete Album"] = "Supprimer l'album";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "";
-App::$strings["Delete Photo"] = "Supprimer la photo";
-App::$strings["No photos selected"] = "Aucune photo selectionnée";
-App::$strings["Access to this item is restricted."] = "L'accès à l'élément est restreint.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f méga-octets utilisés pour le stockage des photos.";
-App::$strings["Upload Photos"] = "Téléverser des photos";
-App::$strings["Enter an album name"] = "Entrer un nom d'album";
-App::$strings["or select an existing album (doubleclick)"] = "ou sélectionner un album existant (double-clic)";
-App::$strings["Create a status post for this upload"] = "Créer une publication de statut pour cet envoi";
-App::$strings["Caption (optional):"] = "Légende (facultative)";
-App::$strings["Description (optional):"] = "Description (facultative)";
-App::$strings["Album name could not be decoded"] = "Le nom de l'Album n'a pu être décodé";
-App::$strings["Contact Photos"] = "Photos de contact";
-App::$strings["Show Newest First"] = "Les plus récent(e)s en premier";
-App::$strings["Show Oldest First"] = "Les moins récent(e)s en premier";
-App::$strings["View Photo"] = "Voir la photo";
-App::$strings["Edit Album"] = "Modifier l'album";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
-App::$strings["Photo not available"] = "Photo non disponible";
-App::$strings["Use as profile photo"] = "Utiliser comme photo du profil";
-App::$strings["Use as cover photo"] = "";
-App::$strings["Private Photo"] = "Photo privée";
-App::$strings["View Full Size"] = "Voir en taille réelle";
-App::$strings["Remove"] = "Retirer";
-App::$strings["Edit photo"] = "Modifier la photo";
-App::$strings["Rotate CW (right)"] = "Rotation horaire (droite)";
-App::$strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)";
-App::$strings["Enter a new album name"] = "Entrer un nouveau nom d'album";
-App::$strings["or select an existing one (doubleclick)"] = "ou en sélectionner un existant (double-clic)";
-App::$strings["Caption"] = "Titre/légende";
-App::$strings["Add a Tag"] = "Ajouter une étiquette";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon";
-App::$strings["Flag as adult in album view"] = "Marquer comme \"adulte\" dans l'affichage de l'album";
-App::$strings["I like this (toggle)"] = "J'aime (oui/non)";
-App::$strings["I don't like this (toggle)"] = "Je n'aime pas (oui/non)";
-App::$strings["Please wait"] = "Merci de patienter";
-App::$strings["This is you"] = "C'est vous";
-App::$strings["Comment"] = "Commenter";
-App::$strings["__ctx:title__ Likes"] = "Aime";
-App::$strings["__ctx:title__ Dislikes"] = "N'aime pas";
-App::$strings["__ctx:title__ Agree"] = "D'accord";
-App::$strings["__ctx:title__ Disagree"] = "Pas d'accord";
-App::$strings["__ctx:title__ Abstain"] = "Abstention";
-App::$strings["__ctx:title__ Attending"] = "Participations";
-App::$strings["__ctx:title__ Not attending"] = "Non-participations";
-App::$strings["__ctx:title__ Might attend"] = "Participation possible";
-App::$strings["View all"] = "Voir tout";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "Aime",
- 1 => "Aime",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "N'aime pas",
- 1 => "N'aime pas",
-);
-App::$strings["Photo Tools"] = "";
-App::$strings["In This Photo:"] = "Dans cette photo&nbsp;:";
-App::$strings["Map"] = "Carte";
-App::$strings["__ctx:noun__ Likes"] = "Aime";
-App::$strings["__ctx:noun__ Dislikes"] = "N'aime pas";
-App::$strings["Close"] = "Fermer";
-App::$strings["View Album"] = "Voir l'album";
-App::$strings["Recent Photos"] = "Photos récentes";
-App::$strings["sent you a private message"] = "vous a envoyé un message privé";
-App::$strings["added your channel"] = "a ajouté votre canal";
-App::$strings["g A l F d"] = "g A l F d";
-App::$strings["[today]"] = "[aujourd'hui]";
-App::$strings["posted an event"] = "a publié un événement";
-App::$strings["Unable to find your hub."] = "Impossible de trouver votre hub.";
-App::$strings["Post successful."] = "Publication réussie.";
-App::$strings["OpenID protocol error. No ID returned."] = "Erreur du protocole OpenID. Pas d'ID retourné.";
-App::$strings["Login failed."] = "Échec de la connexion.";
-App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
-App::$strings["This setting requires special processing and editing has been blocked."] = "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées.";
-App::$strings["Configuration Editor"] = "Editeur de configuration";
-App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité.";
-App::$strings["Layout updated."] = "Mise en page mise à jour.";
-App::$strings["Edit System Page Description"] = "Modifier la description de la page du système";
-App::$strings["Layout not found."] = "Mise en page introuvable.";
-App::$strings["Module Name:"] = "Nom du module&nbsp;:";
-App::$strings["Layout Help"] = "Aide à la mise en page";
-App::$strings["Poke"] = "Tapoter";
-App::$strings["Poke somebody"] = "Taquiner quelqu'un";
-App::$strings["Poke/Prod"] = "Tapoter/Encourager";
-App::$strings["Poke, prod or do other things to somebody"] = "Taquiner, pousser ou faire autre chose à quelqu'un";
-App::$strings["Recipient"] = "Destinataire";
-App::$strings["Choose what you wish to do to recipient"] = "Choisir ce que vous voulez faire au destinataire";
-App::$strings["Make this post private"] = "Rendre cette publication privée";
-App::$strings["Fetching URL returns error: %1\$s"] = "Récupération d'URL échouée&nbsp;: %1\$s";
-App::$strings["Profile not found."] = "Profil introuvable.";
-App::$strings["Profile deleted."] = "Profil supprimé.";
-App::$strings["Profile-"] = "Profil-";
-App::$strings["New profile created."] = "Nouveau profil créé.";
-App::$strings["Profile unavailable to clone."] = "Profil impossible à cloner.";
-App::$strings["Profile unavailable to export."] = "Impossible d'exporter le profil.";
-App::$strings["Profile Name is required."] = "Le nom du profil est obligatoire.";
-App::$strings["Marital Status"] = "Statut marital";
-App::$strings["Romantic Partner"] = "Partenaire amoureux";
-App::$strings["Likes"] = "Aime";
-App::$strings["Dislikes"] = "N'aime pas";
-App::$strings["Work/Employment"] = "Travail/Occupation";
-App::$strings["Religion"] = "Religion/Croyance";
-App::$strings["Political Views"] = "Opinions politiques";
-App::$strings["Sexual Preference"] = "Préférences sexuelle";
-App::$strings["Homepage"] = "Site Internet";
-App::$strings["Interests"] = "Centres d'intérêt";
-App::$strings["Profile updated."] = "Profil mis à jour.";
-App::$strings["Hide your connections list from viewers of this profile"] = "";
-App::$strings["Edit Profile Details"] = "Modifier les détails du profil";
-App::$strings["View this profile"] = "Voir ce profil";
-App::$strings["Edit visibility"] = "Changer la visibilité";
-App::$strings["Profile Tools"] = "";
-App::$strings["Change cover photo"] = "";
-App::$strings["Change profile photo"] = "Changer la photo du profil";
-App::$strings["Create a new profile using these settings"] = "Créer un nouveau profil avec ces paramètres";
-App::$strings["Clone this profile"] = "Cloner ce profil";
-App::$strings["Delete this profile"] = "Supprimer ce profil";
-App::$strings["Add profile things"] = "Ajouter des éléments de profil";
-App::$strings["Personal"] = "Me concernant";
-App::$strings["Relation"] = "";
-App::$strings["Miscellaneous"] = "Divers";
-App::$strings["Import profile from file"] = "Importer le profil à partir d'un fichier";
-App::$strings["Export profile to file"] = "Exporter le profil vers un fichier.";
-App::$strings["Your gender"] = "";
-App::$strings["Marital status"] = "";
-App::$strings["Sexual preference"] = "";
-App::$strings["Profile name"] = "";
-App::$strings["This is your default profile."] = "Ceci est votre profil par défaut.";
-App::$strings["Your full name"] = "";
-App::$strings["Title/Description"] = "Titre/description";
-App::$strings["Street address"] = "";
-App::$strings["Locality/City"] = "Ville";
-App::$strings["Region/State"] = "Région";
-App::$strings["Postal/Zip code"] = "";
-App::$strings["Country"] = "Pays";
-App::$strings["Who (if applicable)"] = "Qui (si applicable)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples&nbsp;: marie123, Marie Deschamps, marie@exemple.com";
-App::$strings["Since (date)"] = "";
-App::$strings["Tell us about yourself"] = "";
-App::$strings["Hometown"] = "Ville de naissance";
-App::$strings["Political views"] = "";
-App::$strings["Religious views"] = "";
-App::$strings["Keywords used in directory listings"] = "";
-App::$strings["Example: fishing photography software"] = "Exemple&nbsp;: escrime photographie modélisme";
-App::$strings["Musical interests"] = "Goûts musicaux";
-App::$strings["Books, literature"] = "Livres, littérature";
-App::$strings["Television"] = "Télévision";
-App::$strings["Film/Dance/Culture/Entertainment"] = "";
-App::$strings["Hobbies/Interests"] = "Loisirs/Centres d'intêret";
-App::$strings["Love/Romance"] = "";
-App::$strings["School/Education"] = "";
-App::$strings["Contact information and social networks"] = "";
-App::$strings["My other channels"] = "Mes autres canaux";
-App::$strings["Profile Image"] = "Image du profil";
-App::$strings["Edit Profiles"] = "Modifier les profils";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement.";
-App::$strings["Upload Profile Photo"] = "Téléverser une photo de profil";
-App::$strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
-App::$strings["Profile Visibility Editor"] = "Éditeur de visibilité de profil";
-App::$strings["Profile"] = "Profil";
-App::$strings["Click on a contact to add or remove."] = "Cliquer sur un contact pour l'ajouter ou le retirer.";
-App::$strings["Visible To"] = "Visible par";
-App::$strings["Public Hubs"] = "Instances publiques";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Les sites listés permettent l'enregistrement public de comptes pour le réseau \$Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires.";
-App::$strings["Hub URL"] = "URL du site";
-App::$strings["Access Type"] = "Type d'accès";
-App::$strings["Registration Policy"] = "Politique d'inscription";
-App::$strings["Stats"] = "";
-App::$strings["Software"] = "";
-App::$strings["Ratings"] = "Evaluations";
-App::$strings["Rate"] = "Evaluer";
-App::$strings["Website:"] = "Site web&nbsp;:";
-App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal distant [%s] (encore inconnu sur ce site)";
-App::$strings["Rating (this information is public)"] = "Evaluation (cette information est publique)";
-App::$strings["Optionally explain your rating (this information is public)"] = "Explication facultative de votre évaluation (cette information est publique)";
-App::$strings["No ratings"] = "Pas de note";
-App::$strings["Rating: "] = "Evaluation&nbsp:";
-App::$strings["Website: "] = "Site web&nbsp;:";
-App::$strings["Description: "] = "Description&nbsp;:";
-App::$strings["Theme settings updated."] = "Paramètres du thème mis à jour.";
-App::$strings["# Accounts"] = "# Comptes";
-App::$strings["# blocked accounts"] = "# comptes bloqués";
-App::$strings["# expired accounts"] = "# comptes expirés";
-App::$strings["# expiring accounts"] = "# comptes expirant";
-App::$strings["# Channels"] = "# Canaux";
-App::$strings["# primary"] = "# primaire";
-App::$strings["# clones"] = "# clones";
-App::$strings["Message queues"] = "File des messages";
-App::$strings["Your software should be updated"] = "";
-App::$strings["Administration"] = "Administration";
-App::$strings["Summary"] = "Résumé";
-App::$strings["Registered accounts"] = "Comptes enregistrés";
-App::$strings["Pending registrations"] = "Inscriptions en attente";
-App::$strings["Registered channels"] = "Canaux enregistrés";
-App::$strings["Active plugins"] = "Greffons actifs";
-App::$strings["Version"] = "Version";
-App::$strings["Repository version (master)"] = "";
-App::$strings["Repository version (dev)"] = "";
-App::$strings["Site settings updated."] = "Paramètres du site sauvegardés.";
-App::$strings["Default"] = "Défaut";
-App::$strings["mobile"] = "mobile";
-App::$strings["experimental"] = "expérimental";
-App::$strings["unsupported"] = "non maintenu";
-App::$strings["Yes - with approval"] = "Oui - avec approbation";
-App::$strings["My site is not a public server"] = "Mon site n'est pas un serveur public";
-App::$strings["My site has paid access only"] = "Mon site est à accès payant uniquement";
-App::$strings["My site has free access only"] = "Mon site est gratuit uniquement";
-App::$strings["My site offers free accounts with optional paid upgrades"] = "Mon site offre des comptes gratuits avec des améliorations payantes facultatives";
-App::$strings["Site"] = "Site";
-App::$strings["Registration"] = "Inscription";
-App::$strings["File upload"] = "Envoi de fichier";
-App::$strings["Policies"] = "Stratégies";
-App::$strings["Advanced"] = "Avancé";
-App::$strings["Site name"] = "Nom du site";
-App::$strings["Banner/Logo"] = "Bannière/logo";
-App::$strings["Administrator Information"] = "Informations de l'administrateur";
-App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Coordonnées de l'administrateur du site. Affichées sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici";
-App::$strings["System language"] = "Langue du système";
-App::$strings["System theme"] = "Thème du système";
-App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>";
-App::$strings["Mobile system theme"] = "Thème par défaut pour les mobiles";
-App::$strings["Theme for mobile devices"] = "Thème pour les mobiles";
-App::$strings["Allow Feeds as Connections"] = "Autoriser les Flux (RSS) comme contacts";
-App::$strings["(Heavy system resource usage)"] = "(Impact important sur les ressources)";
-App::$strings["Maximum image size"] = "Taille maximale des images";
-App::$strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite.";
-App::$strings["Does this site allow new member registration?"] = "Est-ce que l'enregistrement de nouveaux membres est autorisé sur ce site&nbsp;?";
-App::$strings["Invitation only"] = "Sur invitation seulement";
-App::$strings["Only allow new member registrations with an invitation code. Above register policy must be set to Yes."] = "N'autoriser que les nouvelles inscriptions avec code d'invitation. La stratégie d'inscription ci-dessus doit être mise sur \"Oui\".";
-App::$strings["Which best describes the types of account offered by this hub?"] = "Quelle est la meilleure description des types de comptes proposés sur ce hub&nbsp;?";
-App::$strings["Register text"] = "Texte d'inscription";
-App::$strings["Will be displayed prominently on the registration page."] = "Sera affiché de manière bien visible sur le formulaire d'inscription.";
-App::$strings["Site homepage to show visitors (default: login box)"] = "Page d'accueil du site à montrer aux visiteurs (par défaut&nbsp;:boîte de dialogue de connexion)";
-App::$strings["example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file."] = "exemple&nbsp;:'public' pour montrer le flux public, 'page/sys/home' pour montrer une page système appelée 'home' ou 'include:home.html' pour inclure un fichier.";
-App::$strings["Preserve site homepage URL"] = "Préserver l'adresse d'accueil du site";
-App::$strings["Present the site homepage in a frame at the original location instead of redirecting"] = "Présenter la page d'accueil du site dans un cadre à l'adresse d'origine, plutôt que de rediriger";
-App::$strings["Accounts abandoned after x days"] = "Les comptes sont abandonnés après x jours";
-App::$strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Eviter de gaspiller les ressources du système en interrogeant des hubs distants pour des canaux abandonnés. Mettez 0 pour ne pas avoir de limite de temps.";
-App::$strings["Allowed friend domains"] = "Domaines amicaux autorisés";
-App::$strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules pour lesquels ce site acceptera les demandes d'amitié. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
-App::$strings["Allowed email domains"] = "Domaines de courriels autorisés";
-App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
-App::$strings["Not allowed email domains"] = "Domaines de courriel non autorisés";
-App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis.";
-App::$strings["Verify Email Addresses"] = "Demander vérification des adresses de courriel";
-App::$strings["Check to verify email addresses used in account registration (recommended)."] = "Cocher pour que les adresses utilisées à l'inscription soient vérifiées (recommandé).";
-App::$strings["Force publish"] = "Publicité forcée";
-App::$strings["Check to force all profiles on this site to be listed in the site directory."] = "Cocher pour forcer la publication de tous les profils du site dans l'annuaire.";
-App::$strings["Import Public Streams"] = "Flux publics importés";
-App::$strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Importer du contenu public à partir d'autres sites et autoriser l'accès à ce contenu. Attention&nbsp;: ce contenu n'est pas modéré.";
-App::$strings["Login on Homepage"] = "";
-App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré.";
-App::$strings["Enable context help"] = "";
-App::$strings["Display contextual help for the current page when the help button is pressed."] = "";
-App::$strings["Directory Server URL"] = "URL du serveur d'annuaire";
-App::$strings["Default directory server"] = "Serveur d'annuaire par défaut";
-App::$strings["Proxy user"] = "Utilisateur du proxy";
-App::$strings["Proxy URL"] = "URL du proxy";
-App::$strings["Network timeout"] = "Délai maximal du réseau";
-App::$strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (non recommandé).";
-App::$strings["Delivery interval"] = "Intervalle de distribution";
-App::$strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées&nbsp;: 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés.";
-App::$strings["Deliveries per process"] = "Distributions par processus";
-App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé&nbsp;:1-5.";
-App::$strings["Poll interval"] = "Intervalle de scrutation";
-App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Temporise le processus de scrutation en tâche de fond de tant de secondes, pour réduire la charge. Si 0, utilise l'intervalle de distribution.";
-App::$strings["Maximum Load Average"] = "Charge maximale moyenne";
-App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50.";
-App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration pour le contenu importé (réseau)";
-App::$strings["0 for no expiration of imported content"] = "0 pour ne pas expirer le contenu importé";
+App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte.";
+App::$strings["Remove This Channel"] = "Supprimer ce canal";
+App::$strings["WARNING: "] = "AVERTISSEMENT&nbsp;:";
+App::$strings["This channel will be completely removed from the network. "] = "Ce canal sera complètement supprimé du réseau.";
+App::$strings["This action is permanent and can not be undone!"] = "Cette action est permanente et irréversible&nbsp;!";
+App::$strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification&nbsp;:";
+App::$strings["Remove this channel and all its clones from the network"] = "Supprimer ce canal ainsi que tous ses clones sur le réseau";
+App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau";
+App::$strings["Remove Channel"] = "Supprimer le canal";
+App::$strings["Files: shared with me"] = "Fichiers&nbsp;: partagés avec moi";
+App::$strings["Name"] = "Nom";
+App::$strings["NEW"] = "NOUVEAU";
+App::$strings["Size"] = "Taille";
+App::$strings["Last Modified"] = "Modifié le";
+App::$strings["Remove all files"] = "Supprimer tous les fichiers";
+App::$strings["Remove this file"] = "Supprimer ce fichier";
+App::$strings["\$Projectname Server - Setup"] = "Serveur \$Projectname - configuration";
+App::$strings["Could not connect to database."] = "Impossible de se connecter à la base de données.";
+App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS.";
+App::$strings["Could not create table."] = "Impossible de créer la table.";
+App::$strings["Your site database has been installed."] = "La base de données de votre site a été installée.";
+App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin).";
+App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Merci de consulter le fichier \"install/INSTALL.txt\".";
+App::$strings["System check"] = "Vérification du système";
+App::$strings["Check again"] = "Re-vérifier";
+App::$strings["Database connection"] = "Connexion à la base de données";
+App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Pour installer \$Projectname, nous avons besoin de savoir comment se connecter à votre base de données.";
+App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres.";
+App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer.";
+App::$strings["Database Server Name"] = "Nom du serveur de base de données";
+App::$strings["Default is 127.0.0.1"] = "Par défaut 127.0.0.1";
+App::$strings["Database Port"] = "Port de la base de données";
+App::$strings["Communication port number - use 0 for default"] = "Numéro TCP du port - utilisez 0 pour la valeur par défaut";
+App::$strings["Database Login Name"] = "Identifiant de connexion à la Base de Données";
+App::$strings["Database Login Password"] = "Mot de passe de connexion à la Base de Données";
+App::$strings["Database Name"] = "Nom de la Base de Données";
+App::$strings["Database Type"] = "Type de base de données";
+App::$strings["Site administrator email address"] = "Adresse de courriel de l'administrateur du site";
+App::$strings["Your account email address must match this in order to use the web admin panel."] = "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web.";
+App::$strings["Website URL"] = "URL du site web";
+App::$strings["Please use SSL (https) URL if available."] = "Veuillez utiliser SSL/TLS (https) si disponible.";
+App::$strings["Please select a default timezone for your website"] = "Veuillez choisir un fuseau horaire par défaut pour votre site";
+App::$strings["Basic/Minimal Social Networking"] = "Réseau social de base";
+App::$strings["Standard Configuration (default)"] = "Configuration standard par défaut";
+App::$strings["Professional"] = "Professionel";
+App::$strings["Site settings"] = "Paramètres du site";
+App::$strings["Server Configuration/Role"] = "Configuration du site.";
+App::$strings["PHP version 5.5 or greater is required."] = "PHP version 5.5 ou supérieur est requis";
+App::$strings["PHP version"] = "Version de PHP";
+App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver une version CLI de PHP dans le PATH du serveur web.";
+App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron.";
+App::$strings["PHP executable path"] = "Chemin vers l'éxecutable PHP";
+App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans.";
+App::$strings["Command line PHP"] = "PHP en ligne de commande (CLI)";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Impossible de vérifier la ligne de commande PHP, car shell_exec () est désactivé. Ceci est nécessaire.";
+App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée.";
+App::$strings["This is required for message delivery to work."] = "Elle est nécessaire pour la distribution des messages.";
+App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "Vous pouvez ajuster ces paramètres dans le fichier php.ini du serveur.";
+App::$strings["PHP upload limits"] = "Limites de téléversement de PHP";
+App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement";
+App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\".";
+App::$strings["Generate encryption keys"] = "Générer les clefs de chiffrement";
+App::$strings["libCurl PHP module"] = "module PHP libCurl";
+App::$strings["GD graphics PHP module"] = "module PHP GD graphics";
+App::$strings["OpenSSL PHP module"] = "module PHP OpenSSL";
+App::$strings["PDO database PHP module"] = "module PDO de la base de données PHP";
+App::$strings["mb_string PHP module"] = "module PHP mb_string";
+App::$strings["xml PHP module"] = "module PHP xml";
+App::$strings["Apache mod_rewrite module"] = "module Apache mod_rewrite";
+App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé.";
+App::$strings["exec"] = "exécuter";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Erreur: shell_exec est requis mais soit il n'est pas installé, soit il a été désactivé dans php.ini";
+App::$strings["Error: libCURL PHP module required but not installed."] = "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé.";
+App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé.";
+App::$strings["Error: openssl PHP module required but not installed."] = "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Erreur: le module PDO de base de données PHP est requis mais n'est pas installé.";
+App::$strings["Error: mb_string PHP module required but not installed."] = "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé.";
+App::$strings["Error: xml PHP module required for DAV but not installed."] = "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé.";
+App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable.";
+App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit.";
+App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de \$Projectname.";
+App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées.";
+App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu.";
+App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine.";
+App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire.";
+App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient.";
+App::$strings["%s is writable"] = "Permission d'écriture sur %s activée";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "Ce logiciel utilise le répertoire de stockage pour enregistrer les fichiers téléversés. Le serveur Web doit disposer d'un accès en écriture au répertoire de stockage selon le dossier web racine.";
+App::$strings["store is writable"] = "'store' est accessible en écriture";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé).";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub.";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité.";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "Si vous êtes certain que le certificat est valide et signé par une autorité de confiance, vérifiez si l'installation d'un certificat intermédiaire aurait échoué. Ceux-ci ne sont normalement pas requis par les navigateurs, mais ils sont requis pour les communications entre serveurs.";
+App::$strings["SSL certificate validation"] = "Validation du certificat SSL/TLS";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:";
+App::$strings["Url rewrite is working"] = "La réécriture d'URL fonctionne";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web.";
+App::$strings["Errors encountered creating database tables."] = "Erreurs rencontrées pendant la création de tables de BDD.";
+App::$strings["<h1>What next</h1>"] = "<h1>Et maintenant</h1>";
+App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau.";
+App::$strings["Continue"] = "Continuer";
+App::$strings["Premium Channel Setup"] = "Configuration du canal VIP";
+App::$strings["Enable premium channel connection restrictions"] = "Activer les restrictions liées au canal VIP";
+App::$strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Merci de saisir les restrictions et/ou conditions - reçu Paypal, transaction Bitcoin, ligne de conduite, ...";
+App::$strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Avant d'autoriser la mise en relation, ce canal attire votre attention sur les conditions suivantes&nbsp;:";
+App::$strings["Potential connections will then see the following text before proceeding:"] = "Les contacts potentiels verront ce qui suit avant de pouvoir continuer&nbsp;:";
+App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "En continuant, je certifie que je me suis conformé à toutes les instructions indiquées sur cette page.";
+App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Aucune instruction spécifique n'a été fournie par le propriétaire du canal.)";
+App::$strings["Restricted or Premium Channel"] = "Canal VIP ou restreint";
+App::$strings["Queue Statistics"] = "Statistiques de file d'attente";
+App::$strings["Total Entries"] = "Nombre d'entrées total";
+App::$strings["Priority"] = "Priorité";
+App::$strings["Destination URL"] = "URL de destination";
+App::$strings["Mark hub permanently offline"] = "Marquer le hub comme étant hors ligne de manière permanente";
+App::$strings["Empty queue for this hub"] = "Vider la file d'attente pour ce hub";
+App::$strings["Last known contact"] = "Dernier contact connu";
App::$strings["Off"] = "Inactif";
App::$strings["On"] = "Actif";
App::$strings["Lock feature %s"] = "Verrouiller fonctionnalité %s";
App::$strings["Manage Additional Features"] = "Gérer les fonctionnalités additionnelles";
-App::$strings["No server found"] = "Serveur introuvable";
-App::$strings["ID"] = "Identifiant";
-App::$strings["for channel"] = "pour le canal";
-App::$strings["on server"] = "sur le serveur";
-App::$strings["Server"] = "Serveur";
-App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "";
-App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "";
-App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "";
-App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "";
-App::$strings["Security"] = "Sécurité";
-App::$strings["Block public"] = "Bloquer \"public\"";
-App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web.";
-App::$strings["Set \"Transport Security\" HTTP header"] = "";
-App::$strings["Set \"Content Security Policy\" HTTP header"] = "";
-App::$strings["Allow communications only from these sites"] = "N'autorisez que les communications venant de ces sites";
-App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut.";
-App::$strings["Block communications from these sites"] = "Bloquer les communications de ces sites";
-App::$strings["Allow communications only from these channels"] = "N'autoriser que les communications de ces canaux";
-App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut";
-App::$strings["Block communications from these channels"] = "Bloquer les communications de ces canaux";
-App::$strings["Only allow embeds from secure (SSL) websites and links."] = "";
-App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "";
-App::$strings["One site per line. By default embedded content is filtered."] = "";
-App::$strings["Block embedded HTML from these domains"] = "Bloquer le HTML embarqué à partir de ces domaines";
App::$strings["Update has been marked successful"] = "La mise à jour a été marquée comme réussie";
App::$strings["Executing %s failed. Check system logs."] = "L'éxecution de %s a échoué. Merci de vérifier les journaux du système.";
App::$strings["Update %s was successfully applied."] = "La mise à jour %s a été appliquée avec succès.";
@@ -917,13 +365,37 @@ App::$strings["No failed updates."] = "Aucune mise à jour défaillante.";
App::$strings["Failed Updates"] = "Mises à jour défaillantes";
App::$strings["Mark success (if update was manually applied)"] = "Marquer comme réussie (si la mise à jour a été réalisée manuellement)";
App::$strings["Attempt to execute this update step automatically"] = "Tenter de réaliser cette étape de mise à jour automatiquement";
-App::$strings["Queue Statistics"] = "Statistiques de file d'attente";
-App::$strings["Total Entries"] = "Nombre d'entrées total";
-App::$strings["Priority"] = "Priorité";
-App::$strings["Destination URL"] = "URL de destination";
-App::$strings["Mark hub permanently offline"] = "Marquer le hub comme étant hors ligne de manière permanente";
-App::$strings["Empty queue for this hub"] = "Vider la file d'attente pour ce hub";
-App::$strings["Last known contact"] = "Dernier contact connu";
+App::$strings["Item not found."] = "Élément introuvable";
+App::$strings["Plugin %s disabled."] = "Greffon %s désactivé.";
+App::$strings["Plugin %s enabled."] = "Greffon %s activé.";
+App::$strings["Disable"] = "Désactiver";
+App::$strings["Enable"] = "Activer";
+App::$strings["Administration"] = "Administration";
+App::$strings["Plugins"] = "Greffons";
+App::$strings["Toggle"] = "(Dés)activer";
+App::$strings["Settings"] = "Paramètres";
+App::$strings["Author: "] = "Auteur&nbsp;:";
+App::$strings["Maintainer: "] = "Maintenu par&nbsp;:";
+App::$strings["Minimum project version: "] = "Version minimum du projet&nbsp;:";
+App::$strings["Maximum project version: "] = "Version maximum du projet&nbsp;:";
+App::$strings["Minimum PHP version: "] = "Version minimum de PHP&nbsp;:";
+App::$strings["Compatible Server Roles: "] = "Rôles du serveur ";
+App::$strings["Requires: "] = "Requiert&nbsp;:";
+App::$strings["Disabled - version incompatibility"] = "Désactivé - version incompatible";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Entrer l'URL du dépôt git public pour les greffons";
+App::$strings["Plugin repo git URL"] = "URL du git pour les plugin";
+App::$strings["Custom repo name"] = "Nom du dépôt";
+App::$strings["(optional)"] = "(en option)";
+App::$strings["Download Plugin Repo"] = "Télécharger l'extension";
+App::$strings["Install new repo"] = "Installer un nouveau dépôt";
+App::$strings["Install"] = "Installer";
+App::$strings["Cancel"] = "Annuler";
+App::$strings["Manage Repos"] = "Gérer les dépôts";
+App::$strings["Installed Plugin Repositories"] = "Dépôt des extensions installées";
+App::$strings["Install a New Plugin Repository"] = "Installer un nouveau dépôt pour extensions";
+App::$strings["Update"] = "Mise à jour";
+App::$strings["Switch branch"] = "Changer de branche";
+App::$strings["Remove"] = "Retirer";
App::$strings["%s account blocked/unblocked"] = array(
0 => "%s compte bloqué/débloqué",
1 => "%s comptes bloqués/débloqués",
@@ -938,10 +410,15 @@ App::$strings["Account '%s' blocked"] = "Compte '%s' bloqué";
App::$strings["Account '%s' unblocked"] = "Compte '%s' débloqué";
App::$strings["Accounts"] = "Comptes";
App::$strings["select all"] = "tout sélectionner";
-App::$strings["Registrations waiting for confirm"] = "";
+App::$strings["Registrations waiting for confirm"] = "Inscriptions en attente d'approbation";
App::$strings["Request date"] = "Date de la demande";
+App::$strings["Email"] = "Courriel";
App::$strings["No registrations."] = "Pas d'inscriptions.";
+App::$strings["Approve"] = "Approuver";
App::$strings["Deny"] = "Refuser";
+App::$strings["Block"] = "Bloquer";
+App::$strings["Unblock"] = "Débloquer";
+App::$strings["ID"] = "Identifiant";
App::$strings["All Channels"] = "Tous les canaux";
App::$strings["Register date"] = "Date d'inscription";
App::$strings["Last login"] = "Dernière connexion";
@@ -949,6 +426,13 @@ App::$strings["Expires"] = "Expire le";
App::$strings["Service Class"] = "Classe de service";
App::$strings["Selected accounts will be deleted!\\n\\nEverything these accounts had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les comptes sélectionnés seront supprimés&nbsp;!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
App::$strings["The account {0} will be deleted!\\n\\nEverything this account has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Le compte {0} sera supprimé&nbsp;!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
+App::$strings["Log settings updated."] = "Paramètres du journal mis à jour.";
+App::$strings["Logs"] = "Journaux";
+App::$strings["Clear"] = "Vider";
+App::$strings["Debugging"] = "Débogage";
+App::$strings["Log file"] = "Fichier du journal";
+App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Doit être permettre d'écrire par le serveur web. En relation avec le répertoire de votre site.";
+App::$strings["Log level"] = "Niveau de journalisation";
App::$strings["%s channel censored/uncensored"] = array(
0 => "%s canal censuré/dé-censuré",
1 => "%s canaux censurés/dé-censurés",
@@ -976,44 +460,96 @@ App::$strings["Channel"] = "Canal";
App::$strings["UID"] = "UID";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les canaux sélectionnés seront supprimés&nbsp;!\\n\\nTout ce qui a été publié dans ces canaux sur ce site sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr&nbsp;?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Le canal {0} sera supprimé&nbsp;!\\n\\nTout ce qui a été publié sur ce canal sera définitivement supprimé&nbsp;!\\n\\nÊtes-vous sûr(e)&nbsp;?";
-App::$strings["Plugin %s disabled."] = "Greffon %s désactivé.";
-App::$strings["Plugin %s enabled."] = "Greffon %s activé.";
-App::$strings["Disable"] = "Désactiver";
-App::$strings["Enable"] = "Activer";
-App::$strings["Plugins"] = "Greffons";
-App::$strings["Toggle"] = "(Dés)activer";
-App::$strings["Settings"] = "Paramètres";
-App::$strings["Author: "] = "Auteur&nbsp;:";
-App::$strings["Maintainer: "] = "Maintenu par&nbsp;:";
-App::$strings["Minimum project version: "] = "Version minimum du projet&nbsp;:";
-App::$strings["Maximum project version: "] = "Version maximum du projet&nbsp;:";
-App::$strings["Minimum PHP version: "] = "Version minimum de PHP&nbsp;:";
-App::$strings["Requires: "] = "Requiert&nbsp;:";
-App::$strings["Disabled - version incompatibility"] = "Désactivé - version incompatible";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "";
-App::$strings["Plugin repo git URL"] = "";
-App::$strings["Custom repo name"] = "";
-App::$strings["(optional)"] = "";
-App::$strings["Download Plugin Repo"] = "";
-App::$strings["Install new repo"] = "";
-App::$strings["Install"] = "Installer";
-App::$strings["Manage Repos"] = "";
-App::$strings["Installed Plugin Repositories"] = "";
-App::$strings["Install a New Plugin Repository"] = "";
-App::$strings["Update"] = "Mise à jour";
-App::$strings["Switch branch"] = "";
+App::$strings["Theme settings updated."] = "Paramètres du thème mis à jour.";
App::$strings["No themes found."] = "Aucun thème trouvé.";
App::$strings["Screenshot"] = "Capture d'écran";
App::$strings["Themes"] = "Thèmes";
App::$strings["[Experimental]"] = "[Expérimental]";
App::$strings["[Unsupported]"] = "[Non maintenu]";
-App::$strings["Log settings updated."] = "Paramètres du journal mis à jour.";
-App::$strings["Logs"] = "Journaux";
-App::$strings["Clear"] = "Vider";
-App::$strings["Debugging"] = "Débogage";
-App::$strings["Log file"] = "Fichier du journal";
-App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "";
-App::$strings["Log level"] = "Niveau de journalisation";
+App::$strings["Site settings updated."] = "Paramètres du site sauvegardés.";
+App::$strings["Default"] = "Défaut";
+App::$strings["%s - (Incompatible)"] = "";
+App::$strings["mobile"] = "mobile";
+App::$strings["experimental"] = "expérimental";
+App::$strings["unsupported"] = "non maintenu";
+App::$strings["Yes - with approval"] = "Oui - avec approbation";
+App::$strings["My site is not a public server"] = "Mon site n'est pas un serveur public";
+App::$strings["My site has paid access only"] = "Mon site est à accès payant uniquement";
+App::$strings["My site has free access only"] = "Mon site est gratuit uniquement";
+App::$strings["My site offers free accounts with optional paid upgrades"] = "Mon site offre des comptes gratuits avec des améliorations payantes facultatives";
+App::$strings["Beginner/Basic"] = "Pour débutant/ de base";
+App::$strings["Novice - not skilled but willing to learn"] = "Novice - pas qualifiés, mais prêt à apprendre";
+App::$strings["Intermediate - somewhat comfortable"] = "Intermédiaire - assez confortable";
+App::$strings["Advanced - very comfortable"] = "Niveau avancé - trés confortable";
+App::$strings["Expert - I can write computer code"] = "Niveau expert - Je peux programmer";
+App::$strings["Wizard - I probably know more than you do"] = "Crack - J'en sais probablement plus que beaucoup";
+App::$strings["Site"] = "Site";
+App::$strings["Registration"] = "Inscription";
+App::$strings["File upload"] = "Envoi de fichier";
+App::$strings["Policies"] = "Stratégies";
+App::$strings["Advanced"] = "Avancé";
+App::$strings["Site name"] = "Nom du site";
+App::$strings["Site default technical skill level"] = "Niveau technique par défaut pour le site";
+App::$strings["Used to provide a member experience matched to technical comfort level"] = "Utilisé pour fournir une expérience utilisateur correspondant au niveau de confort technique";
+App::$strings["Lock the technical skill level setting"] = "Bloque le niveau technique du paramétrage";
+App::$strings["Members can set their own technical comfort level by default"] = "Les utilisateurs peuvent paramétrer leur propre niveau technique.";
+App::$strings["Banner/Logo"] = "Bannière/logo";
+App::$strings["Administrator Information"] = "Informations de l'administrateur";
+App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Coordonnées de l'administrateur du site. Affichées sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici";
+App::$strings["Site Information"] = "Site information";
+App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Description du site visible publiquement. Affiché sur la page d'information du site. BBCode peut être utilisé ici.";
+App::$strings["System language"] = "Langue du système";
+App::$strings["System theme"] = "Thème du système";
+App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>";
+App::$strings["Mobile system theme"] = "Thème par défaut pour les mobiles";
+App::$strings["Theme for mobile devices"] = "Thème pour les mobiles";
+App::$strings["Allow Feeds as Connections"] = "Autoriser les Flux (RSS) comme contacts";
+App::$strings["(Heavy system resource usage)"] = "(Impact important sur les ressources)";
+App::$strings["Maximum image size"] = "Taille maximale des images";
+App::$strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite.";
+App::$strings["Does this site allow new member registration?"] = "Est-ce que l'enregistrement de nouveaux membres est autorisé sur ce site&nbsp;?";
+App::$strings["Invitation only"] = "Sur invitation seulement";
+App::$strings["Only allow new member registrations with an invitation code. Above register policy must be set to Yes."] = "N'autoriser que les nouvelles inscriptions avec code d'invitation. La stratégie d'inscription ci-dessus doit être mise sur \"Oui\".";
+App::$strings["Which best describes the types of account offered by this hub?"] = "Quelle est la meilleure description des types de comptes proposés sur ce hub&nbsp;?";
+App::$strings["Register text"] = "Texte d'inscription";
+App::$strings["Will be displayed prominently on the registration page."] = "Sera affiché de manière bien visible sur le formulaire d'inscription.";
+App::$strings["Site homepage to show visitors (default: login box)"] = "Page d'accueil du site à montrer aux visiteurs (par défaut&nbsp;: boîte de dialogue de connexion)";
+App::$strings["example: 'public' to show public stream, 'page/sys/home' to show a system webpage called 'home' or 'include:home.html' to include a file."] = "exemple&nbsp;:'public' pour montrer le flux public, 'page/sys/home' pour montrer une page système appelée 'home' ou 'include:home.html' pour inclure un fichier.";
+App::$strings["Preserve site homepage URL"] = "Préserver l'adresse d'accueil du site";
+App::$strings["Present the site homepage in a frame at the original location instead of redirecting"] = "Présenter la page d'accueil du site dans un cadre à l'adresse d'origine, plutôt que de rediriger";
+App::$strings["Accounts abandoned after x days"] = "Les comptes sont abandonnés après x jours";
+App::$strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Eviter de gaspiller les ressources du système en interrogeant des hubs distants pour des canaux abandonnés. Mettez 0 pour ne pas avoir de limite de temps.";
+App::$strings["Allowed friend domains"] = "Domaines amicaux autorisés";
+App::$strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules pour lesquels ce site acceptera les demandes d'amitié. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
+App::$strings["Verify Email Addresses"] = "Demander vérification des adresses de courriel";
+App::$strings["Check to verify email addresses used in account registration (recommended)."] = "Cocher pour que les adresses utilisées à l'inscription soient vérifiées (recommandé).";
+App::$strings["Force publish"] = "Publicité forcée";
+App::$strings["Check to force all profiles on this site to be listed in the site directory."] = "Cocher pour forcer la publication de tous les profils du site dans l'annuaire.";
+App::$strings["Import Public Streams"] = "Flux publics importés";
+App::$strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Importer du contenu public à partir d'autres sites et autoriser l'accès à ce contenu. Attention&nbsp;: ce contenu n'est pas modéré.";
+App::$strings["Login on Homepage"] = "Connexion sur la page d'accueil";
+App::$strings["Present a login box to visitors on the home page if no other content has been configured."] = "Présenter une boîte de dialogue de connexion aux visiteurs sur la page d'accueil si aucun autre contenu n'a été configuré.";
+App::$strings["Enable context help"] = "Permettre l'aide contextuelle";
+App::$strings["Display contextual help for the current page when the help button is pressed."] = "Afficher l'aide contextuel en cliquant sur le bouton aide.";
+App::$strings["Reply-to email address for system generated email."] = "";
+App::$strings["Sender (From) email address for system generated email."] = "";
+App::$strings["Name of email sender for system generated email."] = "";
+App::$strings["Directory Server URL"] = "URL du serveur d'annuaire";
+App::$strings["Default directory server"] = "Serveur d'annuaire par défaut";
+App::$strings["Proxy user"] = "Utilisateur du proxy";
+App::$strings["Proxy URL"] = "URL du proxy";
+App::$strings["Network timeout"] = "Délai maximal du réseau";
+App::$strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (non recommandé).";
+App::$strings["Delivery interval"] = "Intervalle de distribution";
+App::$strings["Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers."] = "Temporise le processus de distribution de tant de secondes pour réduire la charge sur le système. Valeurs recommandées&nbsp;: 4-5 pour les serveurs mutualisés, 2-3 pour les VPS. 0-1 pour les gros serveurs dédiés.";
+App::$strings["Deliveries per process"] = "Distributions par processus";
+App::$strings["Number of deliveries to attempt in a single operating system process. Adjust if necessary to tune system performance. Recommend: 1-5."] = "Nombre de distributions à tenter au sein d'un seul processus système. Ajuster si nécessaire pour affiner la performance du système. Recommandé&nbsp;:1-5.";
+App::$strings["Poll interval"] = "Intervalle de scrutation";
+App::$strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Temporise le processus de scrutation en tâche de fond de tant de secondes, pour réduire la charge. Si 0, utilise l'intervalle de distribution.";
+App::$strings["Maximum Load Average"] = "Charge maximale moyenne";
+App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50.";
+App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration pour le contenu importé (réseau)";
+App::$strings["0 for no expiration of imported content"] = "0 pour ne pas expirer le contenu importé";
App::$strings["New Profile Field"] = "Nouveau champ de profil";
App::$strings["Field nickname"] = "Nom court du champ";
App::$strings["System name of field"] = "Nom système du champ";
@@ -1022,6 +558,7 @@ App::$strings["Field Name"] = "Nom du champ";
App::$strings["Label on profile pages"] = "Étiquette sur les pages de profil";
App::$strings["Help text"] = "Aide à la saisie";
App::$strings["Additional info (optional)"] = "Informations additionnelles (facultatif)";
+App::$strings["Save"] = "Enregistrer";
App::$strings["Field definition not found"] = "Définition du champ introuvable";
App::$strings["Edit Profile Field"] = "Modifier le champ de profil";
App::$strings["Profile Fields"] = "Champs de profil";
@@ -1031,130 +568,51 @@ App::$strings["(In addition to basic fields)"] = "(en plus des champs de base)";
App::$strings["All available fields"] = "Tous les champs disponibles";
App::$strings["Custom Fields"] = "Champs personnalisés";
App::$strings["Create Custom Field"] = "Créer un champ personnalisé";
-App::$strings["App installed."] = "Application installée.";
-App::$strings["Malformed app."] = "Erreur de l'application - Malformée.";
-App::$strings["Embed code"] = "Imbriquer le code";
-App::$strings["Edit App"] = "Modifier l'application";
-App::$strings["Create App"] = "Créer une application";
-App::$strings["Name of app"] = "Nom de l'application";
-App::$strings["Location (URL) of app"] = "Emplacement (URL) de l'application";
-App::$strings["Photo icon URL"] = "URL de l'icône à utiliser pour cette photo";
-App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels - facultatif";
-App::$strings["Categories (optional, comma separated list)"] = "";
-App::$strings["Version ID"] = "Identifiant de version";
-App::$strings["Price of app"] = "Prix de l'application";
-App::$strings["Location (URL) to purchase app"] = "Emplacement (URL) pour l'achat de l'application";
-App::$strings["Select a bookmark folder"] = "Choisir un dossier de favoris";
-App::$strings["Save Bookmark"] = "Enregistrer le favori";
-App::$strings["URL of bookmark"] = "URL du favori";
-App::$strings["Or enter new bookmark folder name"] = "Ou entrez un nouveau nom de dossier de favoris";
-App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain.";
-App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué.";
-App::$strings["Passwords do not match."] = "Les mots de passe ne concordent pas.";
-App::$strings["Registration successful. Please check your email for validation instructions."] = "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte.";
-App::$strings["Your registration is pending approval by the site owner."] = "Votre inscription est en attente d'approbation par l'administrateur.";
-App::$strings["Your registration can not be processed."] = "Votre inscription ne peut être traîtée.";
-App::$strings["Registration on this hub is disabled."] = "La création de nouveaux comptes est désactivée pour ce site.";
-App::$strings["Registration on this hub is by approval only."] = "La création de compte sur ce site est soumise à approbation.";
-App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>";
-App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain.";
-App::$strings["Terms of Service"] = "Conditions de service";
-App::$strings["I accept the %s for this website"] = "J'accepte les %s de ce site";
-App::$strings["I am over 13 years of age and accept the %s for this website"] = "J'ai plus de 13 ans et j'accepte les %s de ce site";
-App::$strings["Your email address"] = "Votre adresse de courriel";
-App::$strings["Choose a password"] = "Choisissez un mot de passe";
-App::$strings["Please re-enter your password"] = "Merci de saisir à nouveau votre mot de passe";
-App::$strings["Please enter your invitation code"] = "Merci de saisir votre code d'invitation";
-App::$strings["no"] = "non";
-App::$strings["yes"] = "oui";
-App::$strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
-App::$strings["Register"] = "S'inscrire";
-App::$strings["Proceed to create your first channel"] = "Continuer pour créer votre premier canal";
-App::$strings["Please login."] = "Merci de vous connecter.";
-App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte.";
-App::$strings["Remove This Account"] = "Supprimer ce compte";
-App::$strings["WARNING: "] = "AVERTISSEMENT&nbsp;:";
-App::$strings["This account and all its channels will be completely removed from the network. "] = "Ce compte et tous ses canaux seront entièrement supprimés du réseau.";
-App::$strings["This action is permanent and can not be undone!"] = "Cette action est permanente et irréversible&nbsp;!";
-App::$strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification&nbsp;:";
-App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux.";
-App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau";
-App::$strings["Remove Account"] = "Supprimer le compte";
-App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un canal moins de 48 heures après avoir changé le mot de passe d'un compte.";
-App::$strings["Remove This Channel"] = "Supprimer ce canal";
-App::$strings["This channel will be completely removed from the network. "] = "Ce canal sera complètement supprimé du réseau.";
-App::$strings["Remove this channel and all its clones from the network"] = "Supprimer ce canal ainsi que tous ses clones sur le réseau";
-App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Par défaut, seule l'instance du canal présente sur ce hub sera supprimée du réseau";
-App::$strings["Remove Channel"] = "Supprimer le canal";
-App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Nous avons rencontré un problème avec l'OpenID que vous nous avez fourni. Merci de vérifier que l'ID est correctement saisi.";
-App::$strings["The error message was:"] = "Le message d'erreur était&nbsp;:";
-App::$strings["Authentication failed."] = "Échec de l'authentification.";
-App::$strings["Remote Authentication"] = "Authentification distante";
-App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)";
-App::$strings["Authenticate"] = "Authentifier";
-App::$strings["Items tagged with: %s"] = "Eléments étiquetés avec&nbsp;: %s";
-App::$strings["Search results for: %s"] = "Résultats de recherche pour&nbsp;: %s";
-App::$strings["No service class restrictions found."] = "Aucune restriction de classe de service trouvée.";
-App::$strings["Name is required"] = "Le nom est requis";
-App::$strings["Key and Secret are required"] = "Clef et secret sont requis";
-App::$strings["Not valid email."] = "Adresse de courriel non valide.";
-App::$strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser.";
-App::$strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau.";
-App::$strings["Password verification failed."] = "La vérification du mot de passe a échoué.";
-App::$strings["Passwords do not match. Password unchanged."] = "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé.";
-App::$strings["Empty passwords are not allowed. Password unchanged."] = "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé.";
-App::$strings["Password changed."] = "Le mot de passe a été changé.";
-App::$strings["Password update failed. Please try again."] = "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau.";
+App::$strings["Password changed for account %d."] = "Le mot de passe a été modifié pour le compte %d.";
+App::$strings["Account settings updated."] = "Paramétrage du compte mis à jour";
+App::$strings["Account not found."] = "Compte introuvable";
+App::$strings["Account Edit"] = "Modifier votre compte";
+App::$strings["New Password"] = "Nouveau mot de passe";
+App::$strings["New Password again"] = "Nouveau mot de passe (encore)";
+App::$strings["Technical skill level"] = "Niveau technique";
+App::$strings["Account language (for emails)"] = "Langue de votre compte (pour email)";
+App::$strings["Service class"] = "Classe de service";
+App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Par défaut le code HTML est autorisé pour les média par exemple les vidéos embarquées. Cependant cela peut poser un faille de sécurité.";
+App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Ce paramétrage autorisant le HTML pour les sites suivants.";
+App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
+App::$strings["All other embedded content will be filtered, <strong>unless</strong> embedded content from that site is explicitly blocked."] = "Les contenus html seront filtrés <strong>sauf</strong> ceux des sites explicitement bloqués.";
+App::$strings["Security"] = "Sécurité";
+App::$strings["Block public"] = "Bloquer \"public\"";
+App::$strings["Check to block public access to all otherwise public personal pages on this site unless you are currently authenticated."] = "Sélectionner pour ne permettre l'accès aux pages personnelles \"publiques\" du site qu'aux personnes authentifiées, pas aux personnes anonymes du web.";
+App::$strings["Set \"Transport Security\" HTTP header"] = "Paramétrer \"Transport Security\" pour l'entête HTTP";
+App::$strings["Set \"Content Security Policy\" HTTP header"] = "Paramétrer \"Content Security Policy\" pour l'entête HTTP";
+App::$strings["Allowed email domains"] = "Domaines de courriels autorisés";
+App::$strings["Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines séparés par des virgules dont les adresses de courriel seront autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
+App::$strings["Not allowed email domains"] = "Domaines de courriel non autorisés";
+App::$strings["Comma separated list of domains which are not allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains, unless allowed domains have been defined."] = "Liste de noms de domaines - séparés par des virgules - dont les adresses de courriel ne seront pas autorisées lors de l'inscription à ce site. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines, sauf si des domaines autorisés ont été définis.";
+App::$strings["Allow communications only from these sites"] = "N'autorisez que les communications venant de ces sites";
+App::$strings["One site per line. Leave empty to allow communication from anywhere by default"] = "Un site par ligne. Laisser vide pour autoriser les communications de tous les sites, par défaut.";
+App::$strings["Block communications from these sites"] = "Bloquer les communications de ces sites";
+App::$strings["Allow communications only from these channels"] = "N'autoriser que les communications de ces canaux";
+App::$strings["One channel (hash) per line. Leave empty to allow from any channel by default"] = "Un canal (adresse) par ligne. Laisser vide pour autoriser les communications de tous les canaux, par défaut";
+App::$strings["Block communications from these channels"] = "Bloquer les communications de ces canaux";
+App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Seuls les sites et liens sécurisés sont autorisé pour intégrer du code HTML";
+App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Autoriser le contenu HTML embarqué uniquement à partir de ces domaines";
+App::$strings["One site per line. By default embedded content is filtered."] = "Un site par ligne. Par défaut le contenu embarqué est filtré.";
+App::$strings["Block embedded HTML from these domains"] = "Bloquer le HTML embarqué à partir de ces domaines";
+App::$strings["Remote privacy information not available."] = "Les informations distantes de confidentialité ne sont pas disponibles.";
+App::$strings["Visible to:"] = "Visible par&nbsp;:";
+App::$strings["__ctx:acl__ Profile"] = "";
+App::$strings["Permission category saved."] = "Catégorie d'autorisation enregistrée.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilisez ce formulaire pour créer des règles d'accès pour différentes catégories de personnes ou de contacts.";
+App::$strings["Permission Categories"] = "Catégories d'autorisation";
+App::$strings["Permission Name"] = "Nom de l'autorisation";
+App::$strings["My Settings"] = "Mes paramètres";
+App::$strings["inherited"] = "héritée";
+App::$strings["Individual Permissions"] = "Permissions individuelles";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
+App::$strings["Friends"] = "Amis";
App::$strings["Settings updated."] = "Paramètres mis à jour.";
-App::$strings["Add application"] = "Ajouter une application";
-App::$strings["Name of application"] = "Nom de l'application";
-App::$strings["Consumer Key"] = "Clef client";
-App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères.";
-App::$strings["Consumer Secret"] = "Secret client";
-App::$strings["Redirect"] = "Redirection";
-App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement";
-App::$strings["Icon url"] = "URL de l'icône";
-App::$strings["Optional"] = "Facultatif";
-App::$strings["Application not found."] = "Application introuvable.";
-App::$strings["Connected Apps"] = "Applications connectées";
-App::$strings["Client key starts with"] = "La clef partagée commence par";
-App::$strings["No name"] = "Sans nom";
-App::$strings["Remove authorization"] = "Révoquer l'autorisation";
-App::$strings["No feature settings configured"] = "Aucun paramètre de fonctionnalité configuré";
-App::$strings["Feature/Addon Settings"] = "Paramètres des extensions/greffons";
-App::$strings["Account Settings"] = "Paramètres du compte";
-App::$strings["Current Password"] = "Mot de passe actuel";
-App::$strings["Enter New Password"] = "Entrez votre nouveau mot de passe";
-App::$strings["Confirm New Password"] = "Confirmez le nouveau mot de passe";
-App::$strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier";
-App::$strings["Email Address:"] = "Adresse de courriel&nbsp;:";
-App::$strings["Remove this account including all its channels"] = "Supprimer ce compte et tous ses canaux";
-App::$strings["Additional Features"] = "Fonctionnalités additionnelles";
-App::$strings["Connector Settings"] = "Paramètres du connecteur";
-App::$strings["No special theme for mobile devices"] = "Pas de thème spécifique aux mobiles";
-App::$strings["%s - (Experimental)"] = "%s - (Expérimental)";
-App::$strings["Display Settings"] = "Afficher les paramètres";
-App::$strings["Theme Settings"] = "Paramètres du thème";
-App::$strings["Custom Theme Settings"] = "Paramètres personnels du thème";
-App::$strings["Content Settings"] = "Paramètres liés au contenu";
-App::$strings["Display Theme:"] = "Afficher le thème&nbsp;:";
-App::$strings["Mobile Theme:"] = "Thème mobile&nbsp;:";
-App::$strings["Preload images before rendering the page"] = "Pré-charger les images avant d'afficher la page";
-App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera";
-App::$strings["Enable user zoom on mobile devices"] = "Permettre à l'utilisateur d'un mobile d'agrandir le contenu";
-App::$strings["Update browser every xx seconds"] = "Mettre à jour le navigateur toutes les xx secondes";
-App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 secondes, pas de maximum";
-App::$strings["Maximum number of conversations to load at any time:"] = "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:";
-App::$strings["Maximum of 100 items"] = "100 éléments au maximum";
-App::$strings["Show emoticons (smilies) as images"] = "Remplacer les émoticônes (smileys) par des images";
-App::$strings["Link post titles to source"] = "Lier les titres des publications à leur source";
-App::$strings["System Page Layout Editor - (advanced)"] = "Editeur de mise en page des pages systèmes - (avancé)";
-App::$strings["Use blog/list mode on channel page"] = "Utiliser le mode blog/liste sur la page du canal";
-App::$strings["(comments displayed separately)"] = "(commentaires affichés séparément)";
-App::$strings["Use blog/list mode on grid page"] = "Utiliser le mode blog/liste sur la page du réseau";
-App::$strings["Channel page max height of content (in pixels)"] = "Hauteur maximale du contenu pour la page du canal (en pixels)";
-App::$strings["click to expand content exceeding this height"] = "cliquer pour dérouler le contenu dépassant cette limite";
-App::$strings["Grid page max height of content (in pixels)"] = "Hauteur maximale du contenu sur la page du réseau (en pixels)";
App::$strings["Nobody except yourself"] = "Personne sauf vous";
App::$strings["Only those you specifically allow"] = "Seulement ceux que vous autorisez spécifiquement";
App::$strings["Approved connections"] = "Contacts approuvés";
@@ -1165,10 +623,13 @@ App::$strings["Anybody authenticated"] = "Tous les utilisateurs authentifiés";
App::$strings["Anybody on the internet"] = "Tous les utilisateurs d'Internet";
App::$strings["Publish your default profile in the network directory"] = "Publier votre profil par défaut dans l'annuaire du réseau";
App::$strings["Allow us to suggest you as a potential friend to new members?"] = "Nous autoriser à vous suggérer comme ami(e) potentiel(le) aux nouveaux membres?";
+App::$strings["or"] = "ou";
App::$strings["Your channel address is"] = "L'adresse de votre canal est";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Vos fichiers/photos sont accessibles via WebDAV à";
App::$strings["Channel Settings"] = "Paramètres du canal";
App::$strings["Basic Settings"] = "Paramètres standard";
App::$strings["Full Name:"] = "Nom complet&nbsp;:";
+App::$strings["Email Address:"] = "Adresse de courriel&nbsp;:";
App::$strings["Your Timezone:"] = "Votre fureau horaire&nbsp;:";
App::$strings["Default Post Location:"] = "Emplacement de publication par défaut&nbsp;:";
App::$strings["Geographical location to display on your posts"] = "Emplacement géographique à afficher sur vos publications";
@@ -1186,17 +647,18 @@ App::$strings["Private - <em>default private, never open or public</em>"] = "Pri
App::$strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>";
App::$strings["Allow others to tag your posts"] = "Autoriser les autres à \"étiqueter\" vos publications";
App::$strings["Often used by the community to retro-actively flag inappropriate content"] = "Souvent utilisé par la communauté pour identifier un contenu inapproprié a posteriori ";
-App::$strings["Advanced Privacy Settings"] = "Paramètres de confidentialité avancés";
+App::$strings["Channel Permission Limits"] = "Limites des permissions du canal";
App::$strings["Expire other channel content after this many days"] = "Faire expirer le contenu des autres canaux après n jours";
-App::$strings["0 or blank to use the website limit."] = "";
-App::$strings["This website expires after %d days."] = "";
-App::$strings["This website does not expire imported content."] = "";
-App::$strings["The website limit takes precedence if lower than your limit."] = "";
+App::$strings["0 or blank to use the website limit."] = "0 ou vide pour utiliser la limite du site web";
+App::$strings["This website expires after %d days."] = "Ce site web expirera après %d jours.";
+App::$strings["This website does not expire imported content."] = "Ce site web ne périme pas le contenu importé.";
+App::$strings["The website limit takes precedence if lower than your limit."] = "La limite du site Web a priorité si elle est inférieure à votre limite.";
App::$strings["Maximum Friend Requests/Day:"] = "Nombre maximum de demandes de contact par jour&nbsp;:";
App::$strings["May reduce spam activity"] = "Contribue à réduire l'impact des indésirables";
-App::$strings["Default Post and Publish Permissions"] = "";
-App::$strings["Use my default audience setting for the type of object published"] = "";
+App::$strings["Default Access Control List (ACL)"] = "Default Access Control List (ACL)";
+App::$strings["Use my default audience setting for the type of object published"] = "Utiliser mon paramètre de publication par défaut pour le type d'objet publié";
App::$strings["Channel permissions category:"] = "Catégorie de permissions du canal&nbsp;:";
+App::$strings["Default Permissions Group"] = "";
App::$strings["Maximum private messages per day from unknown people:"] = "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:";
App::$strings["Useful to reduce spamming"] = "Utile pour réduire les indésirables";
App::$strings["Notification Settings"] = "Paramètres de notification";
@@ -1213,6 +675,7 @@ App::$strings["You receive a private message"] = "Vous recevez un message privé
App::$strings["You receive a friend suggestion"] = "Vous recevez une suggestion d'amitié/contact";
App::$strings["You are tagged in a post"] = "Vous êtes étiqueté dans une publication";
App::$strings["You are poked/prodded/etc. in a post"] = "Vous êtes tapoté/encouragé/etc. dans une publication";
+App::$strings["Someone likes your post/comment"] = "Quelqu'un aime votre publication/commentaire";
App::$strings["Show visual notifications including:"] = "Afficher des notifications visuelles y compris&nbsp;:";
App::$strings["Unseen grid activity"] = "Activité du réseau pas encore consultée";
App::$strings["Unseen channel activity"] = "Activité non vue sur le canal";
@@ -1232,7 +695,6 @@ App::$strings["Notify me of events this many days in advance"] = "Me prévenir d
App::$strings["Must be greater than 0"] = "Doit être supérieur à 0";
App::$strings["Advanced Account/Page Type Settings"] = "Paramètres avancés de compte/type de page";
App::$strings["Change the behaviour of this account for special situations"] = "Modifie le comportement de ce compte pour des situations particulières";
-App::$strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Mode expert requis (<a href=\"settings/features\">Paramètres > Fonctions supplémentaires</a>) pour ajuster&nbsp;!";
App::$strings["Miscellaneous Settings"] = "Paramètres divers";
App::$strings["Default photo upload folder"] = "Répertoire par défaut pour les photos téléversées";
App::$strings["%Y - current year, %m - current month"] = "%Y - année en cours, %m - mois en cours";
@@ -1240,112 +702,611 @@ App::$strings["Default file upload folder"] = "Répertoire par défaut pour les
App::$strings["Personal menu to display in your channel pages"] = "Menu personnel à afficher sur les pages de votre canal";
App::$strings["Remove this channel."] = "Supprimer ce canal";
App::$strings["Firefox Share \$Projectname provider"] = "Connecteur \$Projectname pour Firefox Share";
-App::$strings["Start calendar week on monday"] = "Commencer la semaine du calendrier le lundi";
-App::$strings["\$Projectname Server - Setup"] = "Serveur \$Projectname - configuration";
-App::$strings["Could not connect to database."] = "Impossible de se connecter à la base de données.";
-App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Impossible de se connecter à l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS.";
-App::$strings["Could not create table."] = "Impossible de créer la table.";
-App::$strings["Your site database has been installed."] = "La base de données de votre site a été installée.";
-App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "Vous pourriez avoir besoin d'importer le fichier \"install/schema_xxx.sql\" manuellement via un client de base de données (ex: phpmyadmin).";
-App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Merci de consulter le fichier \"install/INSTALL.txt\".";
-App::$strings["System check"] = "Vérification du système";
-App::$strings["Check again"] = "Re-vérifier";
-App::$strings["Database connection"] = "Connexion à la base de données";
-App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "Pour installer \$Projectname, nous avons besoin de savoir comment se connecter à votre base de données.";
-App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Merci de contacter votre prestataire d'hébergement ou votre administrateur de site si vous avez des questions à propos de ces paramètres.";
-App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base de données que vous allez spécifier doit exister. Si ce n'est pas déjà le cas, merci de la créer avant de continuer.";
-App::$strings["Database Server Name"] = "Nom du serveur de base de données";
-App::$strings["Default is 127.0.0.1"] = "Par défaut 127.0.0.1";
-App::$strings["Database Port"] = "Port de la base de données";
-App::$strings["Communication port number - use 0 for default"] = "Numéro TCP du port - utilisez 0 pour la valeur par défaut";
-App::$strings["Database Login Name"] = "Identifiant de connexion à la Base de Données";
-App::$strings["Database Login Password"] = "Mot de passe de connexion à la Base de Données";
-App::$strings["Database Name"] = "Nom de la Base de Données";
-App::$strings["Database Type"] = "Type de base de données";
-App::$strings["Site administrator email address"] = "Adresse de courriel de l'administrateur du site";
-App::$strings["Your account email address must match this in order to use the web admin panel."] = "Votre compte devra utiliser la même adresse de courriel pour pouvoir utiliser l'administration web.";
-App::$strings["Website URL"] = "URL du site web";
-App::$strings["Please use SSL (https) URL if available."] = "Veuillez utiliser SSL/TLS (https) si disponible.";
-App::$strings["Please select a default timezone for your website"] = "Veuillez choisir un fuseau horaire par défaut pour votre site";
-App::$strings["Site settings"] = "Paramètres du site";
-App::$strings["Enable \$Projectname <strong>advanced</strong> features?"] = "Activer les fonctionnalités <strong>avancées</strong> de \$Projectname&nbsp;?";
-App::$strings["Some advanced features, while useful - may be best suited for technically proficient audiences"] = "Certaines fonctionnalités avancées, bien qu'utiles, sont plus adaptées aux utilisateurs chevronnés.";
-App::$strings["PHP version 5.5 or greater is required."] = "";
-App::$strings["PHP version"] = "";
-App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver une version CLI de PHP dans le PATH du serveur web.";
-App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "En l'absence de version CLI de PHP sur votre serveur, vous ne pourrez pas utiliser la synchronisation en arrière-plan via cron.";
-App::$strings["PHP executable path"] = "Chemin vers l'éxecutable PHP";
-App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Entrez le chemin complet vers l'exécutable php. Vous pouvez continuer l'installation sans.";
-App::$strings["Command line PHP"] = "PHP en ligne de commande (CLI)";
-App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version CLI de PHP sur votre système n'a pas l'option \"register_argc_argv\" activée.";
-App::$strings["This is required for message delivery to work."] = "Elle est nécessaire pour la distribution des messages.";
-App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Votre taille de téléversement maximale totale autorisée est fixée à %s. La taille maximale d'un seul fichier à téléverser est fixée à %s. Vous pouvez téléverser jusqu'à %d fichier(s) à la fois.";
-App::$strings["You can adjust these settings in the servers php.ini."] = "Vous pouvez ajuster ces paramètres dans le php.ini du serveur.";
-App::$strings["PHP upload limits"] = "Limites de téléversement de PHP";
-App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur&nbsp;: la fonction \"openssl_pkey_new\" de ce système n'est pas capable de générer des clefs de chiffrement";
-App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous êtes sur un serveur Windows, merci de consulter \"http://www.php.net/manual/fr/openssl.installation.php\".";
-App::$strings["Generate encryption keys"] = "Générer les clefs de chiffrement";
-App::$strings["libCurl PHP module"] = "module PHP libCurl";
-App::$strings["GD graphics PHP module"] = "module PHP GD graphics";
-App::$strings["OpenSSL PHP module"] = "module PHP OpenSSL";
-App::$strings["mysqli or postgres PHP module"] = "module PHP postgres ou mysqli";
-App::$strings["mb_string PHP module"] = "module PHP mb_string";
-App::$strings["mcrypt PHP module"] = "module PHP mcrypt";
-App::$strings["xml PHP module"] = "module PHP xml";
-App::$strings["Apache mod_rewrite module"] = "module Apache mod_rewrite";
-App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur&nbsp;: le module mod-rewrite du serveur web Apache est requis, mais pas installé.";
-App::$strings["proc_open"] = "proc_open";
-App::$strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Erreur&nbsp;: proc_open est requis, mais soit n'est pas installé, soit est désactivé dans le php.ini";
-App::$strings["Error: libCURL PHP module required but not installed."] = "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé.";
-App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur&nbsp;: le module GD de PHP avec support JPEG est requis, mais pas installé.";
-App::$strings["Error: openssl PHP module required but not installed."] = "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé.";
-App::$strings["Error: mysqli or postgres PHP module required but neither are installed."] = "Erreur&nbsp;: un module PHP mysqli ou postgres est requis, mais aucun des deux n'est installé.";
-App::$strings["Error: mb_string PHP module required but not installed."] = "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé.";
-App::$strings["Error: mcrypt PHP module required but not installed."] = "Erreur&nbsp;: le module mcrypt de PHP est requis, mais pas installé.";
-App::$strings["Error: xml PHP module required for DAV but not installed."] = "Erreur&nbsp;: le module xml de PHP est requis pour le DAV, mais pas installé.";
-App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable.";
-App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "C'est généralement lié à un problème de droits, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit.";
-App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de \$Projectname.";
-App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées.";
-App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture";
-App::$strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "\$Projectname utilise le moteur de gabarits Smarty3 pour mettre son contenu en forme. Smarty3 compile ses modèles vers du PHP natif pour accélérer le rendu.";
-App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "";
-App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire.";
-App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: Comme mesure de sécurité, assurez vous de donner les droits d'écriture au serveur web sur %s uniquement, pas sur les fichiers individuels (.tpl) qu'il contient.";
-App::$strings["%s is writable"] = "Permission d'écriture sur %s activée";
-App::$strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "\$Projectname utilise le répertoire 'store' - situé à la racine de votre installation de \$Projectname - pour sauvegarder les fichiers envoyés. Le serveur web aura donc besoin de pouvoir y écrire.";
-App::$strings["store is writable"] = "'store' est accessible en écriture";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Le certificat SSL/TLS n'a pas pu être validé. Merci de le corriger, ou de désactiver l'accès https à ce site (non recommandé).";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "Si votre serveur accepte les connexions https ou s'il permet les connexions sur le port TCP 443 (le port utilisé par le protocole https), vous DEVEZ utiliser un certificat valide. Vous ne DEVEZ PAS utiliser un certificat que vous avez vous-mêmes signé&nbsp;!";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Nous avons ajouté cette contrainte pour éviter que vos publications publiques ne fassent référence par exemple à des images sur votre propre hub.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Si votre certificat n'est pas reconnu, les membres des autres sites (qui eux peuvent avoir des certificats valides) recevront des messages d'avertissement sur leur propre site se plaignant de problèmes de sécurité.";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Ceci peut causer des problèmes d'ergonomie ailleurs (pas seulement sur votre site), nous devons donc insister sur ce prérequis.";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Il existe des autorités de certification qui vous fourniront gratuitement un certificat valide.";
-App::$strings["SSL certificate validation"] = "Validation du certificat SSL/TLS";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Vérifiez votre configuration serveur. Test&nbsp;:";
-App::$strings["Url rewrite is working"] = "La réécriture d'URL fonctionne";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Le fichier de configuration de la base de données - \".htconfig.php\" - ne peut être écrit. Merci de copier le texte généré dans un fichier à ce nom, à la racine de votre serveur web.";
-App::$strings["Errors encountered creating database tables."] = "Erreurs rencontrées pendant la création de tables de BDD.";
-App::$strings["<h1>What next</h1>"] = "<h1>Et maintenant</h1>";
-App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT&nbsp;: Vous devez créer [manuellement] une tâche planifiée pour les mises à jour du réseau.";
-App::$strings["Files: shared with me"] = "Fichiers&nbsp;: partagés avec moi";
-App::$strings["NEW"] = "NOUVEAU";
-App::$strings["Remove all files"] = "Supprimer tous les fichiers";
-App::$strings["Remove this file"] = "Supprimer ce fichier";
+App::$strings["Start calendar week on Monday"] = "";
+App::$strings["Additional Features"] = "Fonctionnalités additionnelles";
+App::$strings["This channel is limited to %d tokens"] = "Ce canal est limité à %d jetons";
+App::$strings["Name and Password are required."] = "Le nom et le mot de passe sont requis";
+App::$strings["Token saved."] = "Jeton sauvegardé";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Utilisez ce formulaire pour créer des identifiants d'accès temporaires pour partager des informations avec des non-membres. Ces identités peuvent être utilisées dans les listes de contrôle d'accès et les visiteurs peuvent se connecter en utilisant ces certificats d'identification pour accéder au contenu privé.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Vous pouvez également fournir des liens d'accès, style <em>dropbox</em>, aux amis et aux associés en ajoutant le mot de passe de connexion à l'URL d'un site spécifique, comme indiqué. Exemples:";
+App::$strings["Guest Access Tokens"] = "Jeton d'accès pour un invité";
+App::$strings["Login Name"] = "Nom d'utilisateur";
+App::$strings["Login Password"] = "Mot de passe";
+App::$strings["Expires (yyyy-mm-dd)"] = "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)";
+App::$strings["Their Settings"] = "Leurs paramètres";
+App::$strings["Not valid email."] = "Adresse de courriel non valide.";
+App::$strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser.";
+App::$strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau.";
+App::$strings["Technical skill level updated"] = "Niveau technique mis à jour";
+App::$strings["Password verification failed."] = "La vérification du mot de passe a échoué.";
+App::$strings["Passwords do not match. Password unchanged."] = "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé.";
+App::$strings["Empty passwords are not allowed. Password unchanged."] = "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé.";
+App::$strings["Password changed."] = "Le mot de passe a été changé.";
+App::$strings["Password update failed. Please try again."] = "La mise à jour du mot de passe a échoué. Merci d'essayer à nouveau.";
+App::$strings["Account Settings"] = "Paramètres du compte";
+App::$strings["Current Password"] = "Mot de passe actuel";
+App::$strings["Enter New Password"] = "Entrez votre nouveau mot de passe";
+App::$strings["Confirm New Password"] = "Confirmez le nouveau mot de passe";
+App::$strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier";
+App::$strings["Your technical skill level"] = "Votre niveau technique";
+App::$strings["Used to provide a member experience matched to your comfort level"] = "Utilisé pour fournir une expérience utilisateur correspondant à votre niveau de confort";
+App::$strings["Remove Account"] = "Supprimer le compte";
+App::$strings["Remove this account including all its channels"] = "Supprimer ce compte et tous ses canaux";
+App::$strings["Affinity Slider settings updated."] = "Paramètres de la réglette d'affinité mis à jour.";
+App::$strings["No feature settings configured"] = "Aucun paramètre de fonctionnalité configuré";
+App::$strings["Default maximum affinity level"] = "Niveau d'affinité maximum par défaut";
+App::$strings["Default minimum affinity level"] = "Niveau d'affinité minimum par défaut";
+App::$strings["Affinity Slider Settings"] = "Paramètres de la réglette d'affinité";
+App::$strings["Feature/Addon Settings"] = "Paramètres des extensions/greffons";
+App::$strings["No special theme for mobile devices"] = "Pas de thème spécifique aux mobiles";
+App::$strings["%s - (Experimental)"] = "%s - (Expérimental)";
+App::$strings["Display Settings"] = "Afficher les paramètres";
+App::$strings["Theme Settings"] = "Paramètres du thème";
+App::$strings["Custom Theme Settings"] = "Paramètres personnels du thème";
+App::$strings["Content Settings"] = "Paramètres liés au contenu";
+App::$strings["Display Theme:"] = "Afficher le thème&nbsp;:";
+App::$strings["Select scheme"] = "Définir la palette de couleurs";
+App::$strings["Mobile Theme:"] = "Thème mobile&nbsp;:";
+App::$strings["Preload images before rendering the page"] = "Pré-charger les images avant d'afficher la page";
+App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Le temps de charge perçu de la page sera plus long mais la page sera complète quand elle s'affichera";
+App::$strings["Enable user zoom on mobile devices"] = "Permettre à l'utilisateur d'un mobile d'agrandir le contenu";
+App::$strings["Update browser every xx seconds"] = "Mettre à jour le navigateur toutes les xx secondes";
+App::$strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 secondes, pas de maximum";
+App::$strings["Maximum number of conversations to load at any time:"] = "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:";
+App::$strings["Maximum of 100 items"] = "100 éléments au maximum";
+App::$strings["Show emoticons (smilies) as images"] = "Remplacer les émoticônes (smileys) par des images";
+App::$strings["Manual conversation updates"] = "Manuel de mises à jour des conversations";
+App::$strings["Default is on, turning this off may increase screen jumping"] = "Activé par défaut, le désactiver peut accroître les sauts d'écran";
+App::$strings["Link post titles to source"] = "Lier les titres des publications à leur source";
+App::$strings["System Page Layout Editor - (advanced)"] = "Editeur de mise en page des pages systèmes - (avancé)";
+App::$strings["Use blog/list mode on channel page"] = "Utiliser le mode blog/liste sur la page du canal";
+App::$strings["(comments displayed separately)"] = "(commentaires affichés séparément)";
+App::$strings["Use blog/list mode on grid page"] = "Utiliser le mode blog/liste sur la page du réseau";
+App::$strings["Channel page max height of content (in pixels)"] = "Hauteur maximale du contenu pour la page du canal (en pixels)";
+App::$strings["click to expand content exceeding this height"] = "cliquer pour dérouler le contenu dépassant cette limite";
+App::$strings["Grid page max height of content (in pixels)"] = "Hauteur maximale du contenu sur la page du réseau (en pixels)";
+App::$strings["Name is required"] = "Le nom est requis";
+App::$strings["Key and Secret are required"] = "Clef et secret sont requis";
+App::$strings["Add application"] = "Ajouter une application";
+App::$strings["Name of application"] = "Nom de l'application";
+App::$strings["Consumer Key"] = "Clef client";
+App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères.";
+App::$strings["Consumer Secret"] = "Secret client";
+App::$strings["Redirect"] = "Redirection";
+App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement";
+App::$strings["Icon url"] = "URL de l'icône";
+App::$strings["Optional"] = "Facultatif";
+App::$strings["Application not found."] = "Application introuvable.";
+App::$strings["Connected Apps"] = "Applications connectées";
+App::$strings["Client key starts with"] = "La clef partagée commence par";
+App::$strings["No name"] = "Sans nom";
+App::$strings["Remove authorization"] = "Révoquer l'autorisation";
+App::$strings["View Photo"] = "Voir la photo";
+App::$strings["Unknown"] = "Inconnu";
+App::$strings["Edit Album"] = "Modifier l'album";
+App::$strings["Upload"] = "Envoyer";
+App::$strings["Some blurb about what to do when you're new here"] = "Quelques mots sur quoi faire quand on est nouveau ici";
+App::$strings["Thing updated"] = "Elément mis à jour";
+App::$strings["Object store: failed"] = "Stockage de l'objet&nbsp;: échec";
+App::$strings["Thing added"] = "Elément ajouté";
+App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+App::$strings["Show Thing"] = "Montrer élément";
+App::$strings["item not found."] = "élément introuvable.";
+App::$strings["Edit Thing"] = "Modifier élément";
+App::$strings["Select a profile"] = "Choisissez un profil";
+App::$strings["Post an activity"] = "Publier une activité";
+App::$strings["Only sends to viewers of the applicable profile"] = "Envoie exclusivement aux visiteurs du profil concerné";
+App::$strings["Name of thing e.g. something"] = "Nom de l'élément, p.ex. quelque-chose";
+App::$strings["URL of thing (optional)"] = "URL de l'élément (facultatif)";
+App::$strings["URL for photo of thing (optional)"] = "URL d'une photo de l'élément (facultatif)";
+App::$strings["Permissions"] = "Autorisations";
+App::$strings["Add Thing to your Profile"] = "Ajouter l'élément à votre profil";
+App::$strings["No more system notifications."] = "Pas d'autre notification du système.";
+App::$strings["System Notifications"] = "Notifications du système";
+App::$strings["Channel added."] = "Canal ajouté.";
+App::$strings["Your service plan only allows %d channels."] = "Votre forfait n'autorise que %d canaux.";
+App::$strings["No channel. Import failed."] = "Pas de canal. Echec de l'import.";
+App::$strings["Import completed."] = "L'import est terminé.";
+App::$strings["You must be logged in to use this feature."] = "Vous devez vous connecter pour utiliser cette fonctionnalité.";
+App::$strings["Import Channel"] = "Importation de canal";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Utilisez ce formulaire pour importer un canal existant sur un autre serveur. Vous pouvez récupérer l'identité du canal sur l'ancien serveur directement par le réseau, ou bien fournir un fichier d'export/import.";
+App::$strings["Or provide the old server/hub details"] = "Ou fournissez les détails de l'ancien serveur/hub";
+App::$strings["Your old identity address (xyz@example.com)"] = "Votre ancienne identité (zyx@exemple.com)";
+App::$strings["Your old login email address"] = "Votre ancienne adresse de courriel";
+App::$strings["Your old login password"] = "Votre ancien mot de passe";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Quelle que soit l'option choisie, merci de décider si ce hub sera votre nouvelle adresse primaire, ou si votre ancien hub continuera à jouer ce rôle. Vous pourrez publier depuis l'emplacement de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media.";
+App::$strings["Make this hub my primary location"] = "Faire de ce hub mon emplacement primaire";
+App::$strings["Move this channel (disable all previous locations)"] = "Déplacer ce canal (désactiver tous les emplacements précédents)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importer plusieurs mois de messages si possible (limité par la mémoire disponible)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Ce processus peut prendre plusieurs minutes. Merci de ne valider le formulaire qu'une seule fois et de laisser cette page ouverte jusqu'à la fin.";
+App::$strings["Authentication failed."] = "Échec de l'authentification.";
+App::$strings["Remote Authentication"] = "Authentification distante";
+App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Entrez l'adresse de votre canal (par ex. moncanal@monsite.com)";
+App::$strings["Authenticate"] = "Authentifier";
+App::$strings["Channel not found."] = "Canal introuvable.";
+App::$strings["Permissions denied."] = "Permissions refusées.";
+App::$strings["Import"] = "Import";
+App::$strings["Authorize application connection"] = "Autoriser l'application à se connecter";
+App::$strings["Return to your app and insert this Security Code:"] = "Revenez dans votre application et mettez le code de sécurité";
+App::$strings["Please login to continue."] = "Merci de vous identifier pour continuer.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?";
+App::$strings["Item not available."] = "Élément indisponible.";
+App::$strings["Insert web link"] = "Insérer lien web";
+App::$strings["Title (optional)"] = "Titre (facultatif)";
+App::$strings["Edit Block"] = "Modifier le bloc";
+App::$strings["vcard"] = "vcard";
+App::$strings["Apps"] = "Applications";
+App::$strings["Manage apps"] = "";
+App::$strings["Create new app"] = "";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s est %2\$s";
+App::$strings["Mood"] = "Humeur";
+App::$strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis";
+App::$strings["Blocked"] = "Bloqué(e)";
+App::$strings["Ignored"] = "Ignoré(e)";
+App::$strings["Hidden"] = "Caché";
+App::$strings["Archived"] = "Archivé";
+App::$strings["New"] = "Nouveautés";
+App::$strings["All"] = "Tous";
+App::$strings["New Connections"] = "Nouveaux contacts";
+App::$strings["Show pending (new) connections"] = "Voir les (nouveaux) contacts en attente";
+App::$strings["Show all connections"] = "Voir tous les contacts";
+App::$strings["Only show blocked connections"] = "Ne montrer que les contacts bloqués";
+App::$strings["Only show ignored connections"] = "Ne montrer que les contacts ignorés";
+App::$strings["Only show archived connections"] = "Ne montrer que les contacts archivés";
+App::$strings["Only show hidden connections"] = "Ne montrer que les contacts cachés";
+App::$strings["Pending approval"] = "En attente de validation";
+App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+App::$strings["Edit connection"] = "Modifier le contact";
+App::$strings["Delete connection"] = "Supprimer le contact";
+App::$strings["Channel address"] = "Adresse du canal";
+App::$strings["Network"] = "Réseau";
+App::$strings["Call"] = "Appeler";
+App::$strings["Status"] = "État";
+App::$strings["Connected"] = "Ami depuis";
+App::$strings["Approve connection"] = "Valider le contact";
+App::$strings["Ignore connection"] = "Ignorer le contact";
+App::$strings["Ignore"] = "Ignorer";
+App::$strings["Recent activity"] = "Activité récente";
+App::$strings["Connections"] = "Contacts";
+App::$strings["Search your connections"] = "Chercher parmi vos contacts";
+App::$strings["Connections search"] = "Chercher des contacts";
+App::$strings["Find"] = "Trouver";
+App::$strings["Source of Item"] = "Source de l'élément";
+App::$strings["Bookmark added"] = "Favori ajouté";
+App::$strings["My Bookmarks"] = "Mes Favoris";
+App::$strings["My Connections Bookmarks"] = "Favoris de mes contacts";
+App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Il est impossible de supprimer un compte dans les 48 heures après avoir changé le mot de passe du compte.";
+App::$strings["Remove This Account"] = "Supprimer ce compte";
+App::$strings["This account and all its channels will be completely removed from the network. "] = "Ce compte et tous ses canaux seront entièrement supprimés du réseau.";
+App::$strings["Remove this account, all its channels and all its channel clones from the network"] = "Supprimer du réseau ce compte, tous ses canaux et tous les clones de ses canaux.";
+App::$strings["By default only the instances of the channels located on this hub will be removed from the network"] = "Par défaut, seules les instances des canaux situés sur ce hub seront supprimées du réseau";
+App::$strings["Page owner information could not be retrieved."] = "Impossible d'obtenir des informations sur le propriétaire de la page.";
+App::$strings["Album not found."] = "Album introuvable.";
+App::$strings["Delete Album"] = "Supprimer l'album";
+App::$strings["Delete Photo"] = "Supprimer la photo";
+App::$strings["No photos selected"] = "Aucune photo selectionnée";
+App::$strings["Access to this item is restricted."] = "L'accès à l'élément est restreint.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f méga-octets utilisés pour le stockage des photos.";
+App::$strings["Upload Photos"] = "Téléverser des photos";
+App::$strings["Enter an album name"] = "Entrer un nom d'album";
+App::$strings["or select an existing album (doubleclick)"] = "ou sélectionner un album existant (double-clic)";
+App::$strings["Create a status post for this upload"] = "Créer une publication de statut pour cet envoi";
+App::$strings["Caption (optional):"] = "Légende (facultative)";
+App::$strings["Description (optional):"] = "Description (facultative)";
+App::$strings["Show Newest First"] = "Les plus récent(e)s en premier";
+App::$strings["Show Oldest First"] = "Les moins récent(e)s en premier";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
+App::$strings["Photo not available"] = "Photo non disponible";
+App::$strings["Use as profile photo"] = "Utiliser comme photo du profil";
+App::$strings["Use as cover photo"] = "Utilisez comme bannière";
+App::$strings["Private Photo"] = "Photo privée";
+App::$strings["View Full Size"] = "Voir en taille réelle";
+App::$strings["Edit photo"] = "Modifier la photo";
+App::$strings["Rotate CW (right)"] = "Rotation horaire (droite)";
+App::$strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)";
+App::$strings["Move photo to album"] = "Déplacer la photo dans l'album";
+App::$strings["Enter a new album name"] = "Entrer un nouveau nom d'album";
+App::$strings["or select an existing one (doubleclick)"] = "ou en sélectionner un existant (double-clic)";
+App::$strings["Caption"] = "Titre/légende";
+App::$strings["Add a Tag"] = "Ajouter une étiquette";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Exemple&nbsp;: @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon";
+App::$strings["Flag as adult in album view"] = "Marquer comme \"adulte\" dans l'affichage de l'album";
+App::$strings["I like this (toggle)"] = "J'aime (oui/non)";
+App::$strings["I don't like this (toggle)"] = "Je n'aime pas (oui/non)";
+App::$strings["Please wait"] = "Merci de patienter";
+App::$strings["This is you"] = "C'est vous";
+App::$strings["Comment"] = "Commenter";
+App::$strings["__ctx:title__ Likes"] = "Aime";
+App::$strings["__ctx:title__ Dislikes"] = "N'aime pas";
+App::$strings["__ctx:title__ Agree"] = "D'accord";
+App::$strings["__ctx:title__ Disagree"] = "Pas d'accord";
+App::$strings["__ctx:title__ Abstain"] = "Abstention";
+App::$strings["__ctx:title__ Attending"] = "Participations";
+App::$strings["__ctx:title__ Not attending"] = "Non-participations";
+App::$strings["__ctx:title__ Might attend"] = "Participation possible";
+App::$strings["View all"] = "Voir tout";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "Aime",
+ 1 => "Aime",
+);
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "N'aime pas",
+ 1 => "N'aime pas",
+);
+App::$strings["Photo Tools"] = "Ouitls pour photos";
+App::$strings["In This Photo:"] = "Dans cette photo&nbsp;:";
+App::$strings["Map"] = "Carte";
+App::$strings["__ctx:noun__ Likes"] = "Aime";
+App::$strings["__ctx:noun__ Dislikes"] = "N'aime pas";
+App::$strings["Close"] = "Fermer";
+App::$strings["Recent Photos"] = "Photos récentes";
+App::$strings["Profile Unavailable."] = "Profil non disponible.";
+App::$strings["Not found"] = "Non trouvé";
+App::$strings["Invalid channel"] = "Canal invalide.";
+App::$strings["Wikis"] = "Wikis";
+App::$strings["Download"] = "Téléchargement";
+App::$strings["Create New"] = "Nouveau";
+App::$strings["Wiki name"] = "Nom du wiki";
+App::$strings["Content type"] = "Type de contenu";
+App::$strings["Type"] = "Type";
+App::$strings["Create a status post for this wiki"] = "Créer un statut de publication pour ce wiki";
+App::$strings["Wiki not found"] = "Wiki introuvable";
+App::$strings["Rename page"] = "Renommer la page";
+App::$strings["Error retrieving page content"] = "Erreur lors de la récupération du contenu de la page";
+App::$strings["New page"] = "";
+App::$strings["Revision Comparison"] = "Comparaison des révisions";
+App::$strings["Revert"] = "Revenir";
+App::$strings["Short description of your changes (optional)"] = "Description courte de vos modifications (optionnel)";
+App::$strings["Source"] = "Source";
+App::$strings["New page name"] = "Nouveau nom de la page";
+App::$strings["Embed image from photo albums"] = "Intégrer une image d'un album photo";
+App::$strings["Embed an image from your albums"] = "Intégrer une image de votre album photo";
+App::$strings["OK"] = "OK";
+App::$strings["Choose images to embed"] = "Choisissez des images à intégrer";
+App::$strings["Choose an album"] = "Choisir un album";
+App::$strings["Choose a different album"] = "Choisissez un autre album";
+App::$strings["Error getting album list"] = "Erreur venant de la liste de l'album";
+App::$strings["Error getting photo link"] = "Erreur provenant du lien de la photo";
+App::$strings["Error getting album"] = "Erreur venant de l'album";
+App::$strings["Error creating wiki. Invalid name."] = "Erreur lors de la création du wiki. Nom invalide.";
+App::$strings["A wiki with this name already exists."] = "";
+App::$strings["Wiki created, but error creating Home page."] = "Le wiki a été créé, mais une erreur est survenue lors de la création de sa page d'accueil.";
+App::$strings["Error creating wiki"] = "Erreur lors de la création du wiki.";
+App::$strings["Wiki delete permission denied."] = "Permission de supprimer le wiki refusée.";
+App::$strings["Error deleting wiki"] = "Erreur durant la suppression du wiki";
+App::$strings["New page created"] = "Nouvelle page créée";
+App::$strings["Cannot delete Home"] = "Impossible de supprimer la racine";
+App::$strings["Current Revision"] = "Version actuelle";
+App::$strings["Selected Revision"] = "Version sélectionnée";
+App::$strings["You must be authenticated."] = "Vous devez être connecté.";
+App::$strings["toggle full screen mode"] = "Basculer en mode plein écran.";
+App::$strings["Layout updated."] = "Mise en page mise à jour.";
+App::$strings["Feature disabled."] = "Fonctionnalité désactivée";
+App::$strings["Edit System Page Description"] = "Modifier la description de la page du système";
+App::$strings["Layout not found."] = "Mise en page introuvable.";
+App::$strings["Module Name:"] = "Nom du module&nbsp;:";
+App::$strings["Layout Help"] = "Aide à la mise en page";
+App::$strings["Poke"] = "Tapoter";
+App::$strings["Poke somebody"] = "Taquiner quelqu'un";
+App::$strings["Poke/Prod"] = "Tapoter/Encourager";
+App::$strings["Poke, prod or do other things to somebody"] = "Taquiner, pousser ou faire autre chose à quelqu'un";
+App::$strings["Recipient"] = "Destinataire";
+App::$strings["Choose what you wish to do to recipient"] = "Choisir ce que vous voulez faire au destinataire";
+App::$strings["Make this post private"] = "Rendre cette publication privée";
+App::$strings["Image uploaded but image cropping failed."] = "L'image a été téléversée, mais le recadrage a échoué.";
+App::$strings["Profile Photos"] = "Photos du profil";
+App::$strings["Image resize failed."] = "Le redimensionnement de l'image a échoué.";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement.";
+App::$strings["Unable to process image"] = "Impossible de traiter l'image";
+App::$strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
+App::$strings["Unable to process image."] = "Impossible de traîter l'image.";
+App::$strings["Photo not available."] = "Photo inaccessible.";
+App::$strings["Upload File:"] = "Téléverser fichier&nbsp;:";
+App::$strings["Select a profile:"] = "Choisir un profil&nbsp;:";
+App::$strings["Use Photo for Profile"] = "Utiliser la photo pour le profil";
+App::$strings["Upload Profile Photo"] = "Téléverser une photo de profil";
+App::$strings["Use"] = "Utiliser";
+App::$strings["skip this step"] = "passer cette étape";
+App::$strings["select a photo from your photo albums"] = "choisir une photo dans vos albums";
+App::$strings["Crop Image"] = "Recadrer l'image";
+App::$strings["Please adjust the image cropping for optimum viewing."] = "Merci d'ajuster le cadre pour une visualisation optimale.";
+App::$strings["Done Editing"] = "J'ai terminé";
+App::$strings["Away"] = "Absent";
+App::$strings["Online"] = "En ligne";
+App::$strings["Unable to locate original post."] = "Impossible de localiser la publication initiale.";
+App::$strings["Empty post discarded."] = "Publication vide annulée.";
+App::$strings["Duplicate post suppressed."] = "Publication en doublon supprimée.";
+App::$strings["System error. Post not saved."] = "Erreur système. Publication non sauvegardée.";
+App::$strings["Unable to obtain post information from database."] = "Impossible d'obtenir les informations de publication depuis la base de données.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Vous avez atteint votre limite de %1$.0f contributions \"racines\".";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Vous avez atteint votre limite de %1$.0f pages web.";
+App::$strings["sent you a private message"] = "vous a envoyé un message privé";
+App::$strings["added your channel"] = "a ajouté votre canal";
+App::$strings["g A l F d"] = "g A l F d";
+App::$strings["[today]"] = "[aujourd'hui]";
+App::$strings["posted an event"] = "a publié un événement";
+App::$strings["Invalid item."] = "Élément invalide.";
+App::$strings["Page not found."] = "Page introuvable.";
+App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
+App::$strings["Could not access contact record."] = "Impossible d'accéder aux détails du contact.";
+App::$strings["Could not locate selected profile."] = "Impossible de localiser le profil sélectionné.";
+App::$strings["Connection updated."] = "Contact mis à jour.";
+App::$strings["Failed to update connection record."] = "Impossible de mettre à jour les détails du contact.";
+App::$strings["is now connected to"] = "est maintenant connecté avec";
+App::$strings["Could not access address book record."] = "Impossible d'accéder aux détails du carnet d'adresses.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Actualisation impossible - le canal est indisponible.";
+App::$strings["Unable to set address book parameters."] = "Impossible de régler les paramètres du carnet d'adresses.";
+App::$strings["Connection has been removed."] = "Le contact a été supprimé.";
+App::$strings["View Profile"] = "Voir mon profil";
+App::$strings["View %s's profile"] = "Voir le profil de %s";
+App::$strings["Refresh Permissions"] = "Actualiser les autorisations";
+App::$strings["Fetch updated permissions"] = "Récupérer les autorisations les plus récentes";
+App::$strings["Refresh Photo"] = "";
+App::$strings["Fetch updated photo"] = "";
+App::$strings["Recent Activity"] = "Activité récente";
+App::$strings["View recent posts and comments"] = "Voir les publications et commentaires récents";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Bloquer ou débloquer toute communication avec ce contact";
+App::$strings["This connection is blocked!"] = "Ce contact est bloqué&nbsp;!";
+App::$strings["Unignore"] = "Ne plus ignorer";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Ignorer ou ne plus ignorer toute communication venant de ce contact";
+App::$strings["This connection is ignored!"] = "Ce contact est ignoré&nbsp;!";
+App::$strings["Unarchive"] = "Désarchiver";
+App::$strings["Archive"] = "Archiver";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiver ou désarchiver ce contact - le marquer comme inactif mais conserver le contenu";
+App::$strings["This connection is archived!"] = "Ce contact est archivé&nbsp;!";
+App::$strings["Unhide"] = "Ne plus cacher";
+App::$strings["Hide"] = "Cacher";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Cacher ou ne plus cacher ce contact vis-à-vis de vos autres contacts";
+App::$strings["This connection is hidden!"] = "Ce contact est caché&nbsp;!";
+App::$strings["Delete this connection"] = "Supprimer ce contact";
+App::$strings["Fetch Vcard"] = "";
+App::$strings["Fetch electronic calling card for this connection"] = "";
+App::$strings["Open Individual Permissions section by default"] = "Ouvrir par défaut la section des autorisations individuelles";
+App::$strings["Affinity"] = "Affinité";
+App::$strings["Open Set Affinity section by default"] = "Ouvrir par défaut la section Définir le degré d'affinité";
+App::$strings["Me"] = "Moi";
+App::$strings["Family"] = "Famille";
+App::$strings["Acquaintances"] = "Connaissances";
+App::$strings["Filter"] = "Filtrer";
+App::$strings["Open Custom Filter section by default"] = "Ouvrir par défaut la section Filtre personnalisé";
+App::$strings["Approve this connection"] = "Autoriser ce contact";
+App::$strings["Accept connection to allow communication"] = "Accepter le contact pour permettre la communication";
+App::$strings["Set Affinity"] = "Définir le degré d'affinité";
+App::$strings["Set Profile"] = "Définir le profil";
+App::$strings["Set Affinity & Profile"] = "Définir le degré d'affinité et le profil";
+App::$strings["none"] = "Aucun";
+App::$strings["Connection Default Permissions"] = "Autorisations par défaut des contacts";
+App::$strings["Connection: %s"] = "Contact&nbsp;: %s";
+App::$strings["Apply these permissions automatically"] = "Appliquer ces permissions automatiquement";
+App::$strings["Connection requests will be approved without your interaction"] = "Les demandes de contact seront approuvées automatiquement";
+App::$strings["Permission role"] = "Rôle d'accès";
+App::$strings["Add permission role"] = "Ajouter un rôle d'accès";
+App::$strings["This connection's primary address is"] = "L'adresse principale de ce contact est";
+App::$strings["Available locations:"] = "Emplacements disponibles&nbsp;:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Les permissions indiquées sur cette page seront appliquées à tous vos nouveaux contacts.";
+App::$strings["Connection Tools"] = "Actions du contact";
+App::$strings["Slide to adjust your degree of friendship"] = "Faites glisser pour ajuster votre proximité avec le contact";
+App::$strings["Rating"] = "Evaluation";
+App::$strings["Slide to adjust your rating"] = "Faîtes glisser pour ajuster votre note";
+App::$strings["Optionally explain your rating"] = "Explication facultative de votre évaluation";
+App::$strings["Custom Filter"] = "Filtre personnalisé";
+App::$strings["Only import posts with this text"] = "N'importer que les publications comprenant ce texte";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "un mot par ligne ou #étiquettes ou /motif/ ou lang=xx, laisser vide pour importer toutes les publications";
+App::$strings["Do not import posts with this text"] = "Ne pas importer les publications comprenant ce texte";
+App::$strings["This information is public!"] = "Cette information est publique&nbsp;!";
+App::$strings["Connection Pending Approval"] = "Contact en attente d'approbation";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Merci de choisir le profil que vous souhaitez montrer quand %s visite votre profil de manière authentifiée.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">paramètres de confidentialité</a> de canal, lesquels sont prioritaires sur les réglages individuels. Vous pouvez modifier ces permissions ici mais cela n'aura aucun effet à moins de changer les paramètres hérités.";
+App::$strings["Last update:"] = "Dernière mise à jour&nbsp;:";
+App::$strings["Details"] = "Détails";
+App::$strings["Organisation"] = "Organisation";
+App::$strings["Title"] = "Titre";
+App::$strings["Phone"] = "Téléphone";
+App::$strings["Instant messenger"] = "Instant messenger";
+App::$strings["Website"] = "Site web";
+App::$strings["Note"] = "Note";
+App::$strings["Mobile"] = "Mobile";
+App::$strings["Home"] = "Mon canal";
+App::$strings["Work"] = "Travail";
+App::$strings["Add Contact"] = "Ajouter un contact";
+App::$strings["Add Field"] = "Ajouter un champ";
+App::$strings["P.O. Box"] = "P.O. Box";
+App::$strings["Additional"] = "Information complémentaires";
+App::$strings["Street"] = "Rue";
+App::$strings["Locality"] = "Localité";
+App::$strings["Region"] = "Région";
+App::$strings["ZIP Code"] = "ZIP code";
+App::$strings["Country"] = "Pays";
+App::$strings["Room not found"] = "Salon introuvable";
+App::$strings["Leave Room"] = "Quitter le salon";
+App::$strings["Delete Room"] = "Supprimer le salon";
+App::$strings["I am away right now"] = "Je suis absent en ce moment";
+App::$strings["I am online"] = "Je suis en ligne";
+App::$strings["Bookmark this room"] = "Marquer ce salon comme favori";
+App::$strings["Please enter a link URL:"] = "Merci d'entrer l'URL d'un lien&nbsp;:";
+App::$strings["Encrypt text"] = "Chiffrer le texte";
+App::$strings["New Chatroom"] = "Nouveau salon de discussion";
+App::$strings["Chatroom name"] = "Nom du salon de conversation";
+App::$strings["Expiration of chats (minutes)"] = "Expiration des discussions (en minutes)";
+App::$strings["%1\$s's Chatrooms"] = "Salons de %1\$s";
+App::$strings["No chatrooms available"] = "Aucun salon de conversation disponible";
+App::$strings["Expiration"] = "Expiration";
+App::$strings["min"] = "min";
+App::$strings["Photos"] = "Photos";
+App::$strings["Files"] = "Fichiers";
+App::$strings["Unable to update menu."] = "Impossible de mettre le menu à jour.";
+App::$strings["Unable to create menu."] = "Impossible de créer le menu.";
+App::$strings["Menu Name"] = "Nom du menu";
+App::$strings["Unique name (not visible on webpage) - required"] = "Nom unique (non visible sur la page web) - requis";
+App::$strings["Menu Title"] = "Titre du menu";
+App::$strings["Visible on webpage - leave empty for no title"] = "Visible pour la page web - laisser vide pour qu'il n'y ait pas de titre";
+App::$strings["Allow Bookmarks"] = "Autoriser l'usage de favoris";
+App::$strings["Menu may be used to store saved bookmarks"] = "Le menu pourra être utilisé pour stocker des favoris";
+App::$strings["Submit and proceed"] = "Valider et continuer";
+App::$strings["Menus"] = "Menus";
+App::$strings["Bookmarks allowed"] = "Favoris autorisés";
+App::$strings["Delete this menu"] = "Supprimer ce menu";
+App::$strings["Edit menu contents"] = "Modifier le contenu du menu";
+App::$strings["Edit this menu"] = "Modifier ce menu";
+App::$strings["Menu could not be deleted."] = "Impossible de supprimer le menu.";
+App::$strings["Edit Menu"] = "Modifier le menu";
+App::$strings["Add or remove entries to this menu"] = "Ajouter/supprimer des entrées à ce menu";
+App::$strings["Menu name"] = "Nom du menu";
+App::$strings["Must be unique, only seen by you"] = "Doit être unique, ne sera vu que par vous";
+App::$strings["Menu title"] = "Titre du menu";
+App::$strings["Menu title as seen by others"] = "Titre du menu tel que vu par les visiteurs";
+App::$strings["Allow bookmarks"] = "Autoriser l'usage de favoris";
+App::$strings["Layouts"] = "Mises-en-page";
+App::$strings["Help"] = "Aide";
+App::$strings["Comanche page description language help"] = "Aide sur le langage de description de page Comanche";
+App::$strings["Layout Description"] = "Description de la mise en page";
+App::$strings["Download PDL file"] = "Télécharger le fichier PDL";
+App::$strings["post"] = "publication";
+App::$strings["comment"] = "commentaire";
+App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s avec %4\$s";
+App::$strings["This setting requires special processing and editing has been blocked."] = "Ce paramètre nécessité un traitement spécial, les modifications ont été bloquées.";
+App::$strings["Configuration Editor"] = "Editeur de configuration";
+App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Attention&nbsp;:modifier certains paramètres peut rendre votre canal inutilisable. Merci d'ignorer cette page à moins d'être suffisamment à l'aise de savoir comment utiliser correctement cette fonctionnalité.";
+App::$strings["Privacy group created."] = "Groupe de contacts créé.";
+App::$strings["Could not create privacy group."] = "Impossible de créer le groupe de contacts.";
+App::$strings["Privacy group not found."] = "Groupe de contacts introuvable.";
+App::$strings["Privacy group updated."] = "Groupe de contacts mis à jour.";
+App::$strings["Create a group of channels."] = "Créer un groupe de contacts.";
+App::$strings["Privacy group name: "] = "Nom du groupe de contacts&nbsp;:";
+App::$strings["Members are visible to other channels"] = "Les membres sont visibles par les autres canaux";
+App::$strings["Privacy group removed."] = "Groupe de contacts supprimé.";
+App::$strings["Unable to remove privacy group."] = "Impossible de supprimer le groupe de canaux.";
+App::$strings["Privacy group editor"] = "Editeur de groupe de contacts.";
+App::$strings["Members"] = "Membres";
+App::$strings["All Connected Channels"] = "Tous les canaux connectés";
+App::$strings["Click on a channel to add or remove."] = "Cliquer sur un canal pour l'ajouter ou le supprimer";
+App::$strings["Profile not found."] = "Profil introuvable.";
+App::$strings["Profile deleted."] = "Profil supprimé.";
+App::$strings["Profile-"] = "Profil-";
+App::$strings["New profile created."] = "Nouveau profil créé.";
+App::$strings["Profile unavailable to clone."] = "Profil impossible à cloner.";
+App::$strings["Profile unavailable to export."] = "Impossible d'exporter le profil.";
+App::$strings["Profile Name is required."] = "Le nom du profil est obligatoire.";
+App::$strings["Marital Status"] = "Statut marital";
+App::$strings["Romantic Partner"] = "Partenaire amoureux";
+App::$strings["Likes"] = "Aime";
+App::$strings["Dislikes"] = "N'aime pas";
+App::$strings["Work/Employment"] = "Travail/Occupation";
+App::$strings["Religion"] = "Religion/Croyance";
+App::$strings["Political Views"] = "Opinions politiques";
+App::$strings["Gender"] = "Sexe";
+App::$strings["Sexual Preference"] = "Préférences sexuelle";
+App::$strings["Homepage"] = "Site Internet";
+App::$strings["Interests"] = "Centres d'intérêt";
+App::$strings["Profile updated."] = "Profil mis à jour.";
+App::$strings["Hide your connections list from viewers of this profile"] = "Cacher la liste des relations pour les visiteurs de votre profile";
+App::$strings["Edit Profile Details"] = "Modifier les détails du profil";
+App::$strings["View this profile"] = "Voir ce profil";
+App::$strings["Edit visibility"] = "Changer la visibilité";
+App::$strings["Profile Tools"] = "Ouitls pour votre profile";
+App::$strings["Change cover photo"] = "Modifier votre bannière";
+App::$strings["Change profile photo"] = "Changer la photo du profil";
+App::$strings["Create a new profile using these settings"] = "Créer un nouveau profil avec ces paramètres";
+App::$strings["Clone this profile"] = "Cloner ce profil";
+App::$strings["Delete this profile"] = "Supprimer ce profil";
+App::$strings["Add profile things"] = "Ajouter des éléments de profil";
+App::$strings["Personal"] = "Me concernant";
+App::$strings["Relation"] = "Contacts";
+App::$strings["Miscellaneous"] = "Divers";
+App::$strings["Import profile from file"] = "Importer le profil à partir d'un fichier";
+App::$strings["Export profile to file"] = "Exporter le profil vers un fichier.";
+App::$strings["Your gender"] = "Votre genre";
+App::$strings["Marital status"] = "Etat civil";
+App::$strings["Sexual preference"] = "préférence sexuelle";
+App::$strings["Profile name"] = "Nom du profile";
+App::$strings["This is your default profile."] = "Ceci est votre profil par défaut.";
+App::$strings["Your full name"] = "Votre nom complet";
+App::$strings["Title/Description"] = "Titre/description";
+App::$strings["Street address"] = "Rue";
+App::$strings["Locality/City"] = "Ville";
+App::$strings["Region/State"] = "Région";
+App::$strings["Postal/Zip code"] = "Code postal";
+App::$strings["Who (if applicable)"] = "Qui (si applicable)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples&nbsp;: marie123, Marie Deschamps, marie@exemple.com";
+App::$strings["Since (date)"] = "Depuis (date)";
+App::$strings["Tell us about yourself"] = "Parlez nous de vous...";
+App::$strings["Homepage URL"] = "URL de mon site Internet&nbsp;:";
+App::$strings["Hometown"] = "Ville de naissance";
+App::$strings["Political views"] = "Opinions politiques";
+App::$strings["Religious views"] = "Convictions religieuses";
+App::$strings["Keywords used in directory listings"] = "Mots clés pour l'annuaire";
+App::$strings["Example: fishing photography software"] = "Exemple&nbsp;: escrime photographie modélisme";
+App::$strings["Musical interests"] = "Goûts musicaux";
+App::$strings["Books, literature"] = "Livres, littérature";
+App::$strings["Television"] = "Télévision";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Cinéma/Danse/Culture/Divertissement";
+App::$strings["Hobbies/Interests"] = "Loisirs/Centres d'intêret";
+App::$strings["Love/Romance"] = "Amour/Relation amoureuse";
+App::$strings["School/Education"] = "Niveau d'étude";
+App::$strings["Contact information and social networks"] = "Coordonnées et autres réseaux sociaux";
+App::$strings["My other channels"] = "Mes autres canaux";
+App::$strings["Communications"] = "";
+App::$strings["Profile Image"] = "Image du profil";
+App::$strings["Edit Profiles"] = "Modifier mes profils";
+App::$strings["Page link"] = "Lien";
+App::$strings["Edit Webpage"] = "Modifier la page web";
+App::$strings["Create a new channel"] = "Créer un nouveau canal";
+App::$strings["Channel Manager"] = "Gérer mes canaux";
+App::$strings["Current Channel"] = "Canal actif";
+App::$strings["Switch to one of your channels by selecting it."] = "Pour changer de canal, sélectionnez-en un";
+App::$strings["Default Channel"] = "Canal par défaut";
+App::$strings["Make Default"] = "Définir comme défaut";
+App::$strings["%d new messages"] = "%d nouveaux messages";
+App::$strings["%d new introductions"] = "%d nouvelles relations";
+App::$strings["Delegated Channel"] = "Canaux délégués";
+App::$strings["This directory server requires an access token"] = "Ce serveur d'annuaire requiert un jeton d'accès";
+App::$strings["About this site"] = "À propos de ce site";
+App::$strings["Site Name"] = "Nom du site";
+App::$strings["Administrator"] = "Administrateur";
+App::$strings["Terms of Service"] = "Conditions de service";
+App::$strings["Software and Project information"] = "Informations sur le logiciel et le projet";
+App::$strings["This site is powered by \$Projectname"] = "Ce site est propulsé par ";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Réseau fédéré et décentralisé, et services d'identification fournies par Zot";
App::$strings["Version %s"] = "Version %s";
-App::$strings["Installed plugins/addons/apps:"] = "Greffons/extensions/applications installés&nbsp;:";
-App::$strings["No installed plugins/addons/apps"] = "Aucun greffon/extension/application installé";
-App::$strings["This is a hub of \$Projectname - a global cooperative network of decentralized privacy enhanced websites."] = "Ceci est un serveur \$Projectname - un réseau collaboratif mondial de serveurs décentralisés à la confidentialité améliorée.";
-App::$strings["Tag: "] = "Étiquette&nbsp;:";
-App::$strings["Last background fetch: "] = "Dernière récupération en tâche de fond&nbsp;:";
-App::$strings["Current load average: "] = "Charge moyenne actuelle&nbsp;:";
-App::$strings["Running at web location"] = "Tourne à l'adresse internet";
-App::$strings["Please visit <a href=\"http://hubzilla.org\">hubzilla.org</a> to learn more about \$Projectname."] = "Merci de visiter <a href=\"http://hubzilla.org\">hubzilla.org</a> pour en apprendre davantage sur \$Projectname.";
-App::$strings["Bug reports and issues: please visit"] = "Pour remonter bogues et problèmes, merci de visiter";
-App::$strings["\$projectname issues"] = "Problèmes \$projectname";
-App::$strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Suggestions, demandes, etc. - merci de vous adresser à \"redmatrix\" à librelist - point com";
-App::$strings["Site Administrators"] = "Administrateurs du site";
+App::$strings["Project homepage"] = "Page d'accueil du projet";
+App::$strings["Developer homepage"] = "Page d'accueil des développeurs";
+App::$strings["No ratings"] = "Pas de note";
+App::$strings["Ratings"] = "Evaluations";
+App::$strings["Rating: "] = "Evaluation&nbsp:";
+App::$strings["Website: "] = "Site web&nbsp;:";
+App::$strings["Description: "] = "Description&nbsp;:";
+App::$strings["Import Webpage Elements"] = "Importer éléments de page web";
+App::$strings["Import selected"] = "Importation sélectionnée";
+App::$strings["Export Webpage Elements"] = "Exporter éléments de pages web";
+App::$strings["Export selected"] = "Export sélectionné";
+App::$strings["Webpages"] = "Pages web";
+App::$strings["Actions"] = "Actions";
+App::$strings["Page Link"] = "Lien vers la page";
+App::$strings["Page Title"] = "Titre de la page";
+App::$strings["Invalid file type."] = "Type de fichier invalide";
+App::$strings["Error opening zip file"] = "Erreur lors de l'ouverture du fichier zip";
+App::$strings["Invalid folder path."] = "Chemin du dossier invalide";
+App::$strings["No webpage elements detected."] = "Aucun élément de page Web détecté.";
+App::$strings["Import complete."] = "Importation terminée";
+App::$strings["Item is not editable"] = "Elément non modifiable";
+App::$strings["Edit post"] = "Modifier la publication";
+App::$strings["Invalid message"] = "Message non valide";
+App::$strings["no results"] = "aucun résultat";
+App::$strings["channel sync processed"] = "Synchro de canal effectuée";
+App::$strings["queued"] = "mis dans la file d'attente";
+App::$strings["posted"] = "publié";
+App::$strings["accepted for delivery"] = "accepté pour la distribution";
+App::$strings["updated"] = "mis à jour";
+App::$strings["update ignored"] = "mise à jour ignorée";
+App::$strings["permission denied"] = "permission refusée";
+App::$strings["recipient not found"] = "destinataire introuvable";
+App::$strings["mail recalled"] = "courriel rappelé";
+App::$strings["duplicate mail received"] = "courriel reçu en double";
+App::$strings["mail delivered"] = "courriel distribué";
+App::$strings["Delivery report for %1\$s"] = "Rapport de distribution pour %1\$s";
+App::$strings["Options"] = "Options";
+App::$strings["Redeliver"] = "Transférer à nouveau";
App::$strings["Failed to create source. No channel selected."] = "Impossible de créer la source. Aucun canal selectionné.";
App::$strings["Source created."] = "Source créée.";
App::$strings["Source updated."] = "Source mise à jour.";
@@ -1357,64 +1318,227 @@ App::$strings["Import all or selected content from the following channel into th
App::$strings["Only import content with these words (one per line)"] = "N'importer le contenu que s'il contient ces mots (un par ligne)";
App::$strings["Leave blank to import all public content"] = "Laissez vide pour importer tout le contenu public";
App::$strings["Channel Name"] = "Nom du canal";
-App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "";
+App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "Ajouter les catégories suivantes aux publications importées à partir de cette source (séparer par des virgules)";
App::$strings["Source not found."] = "Source introuvable.";
App::$strings["Edit Source"] = "Modifier la source";
App::$strings["Delete Source"] = "Supprimer la source";
App::$strings["Source removed"] = "Source supprimée";
App::$strings["Unable to remove source."] = "Impossible de supprimer la source.";
-App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s suit %3\$s de %2\$s";
-App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s ne suit plus %3\$s de %2\$s";
+App::$strings["Like/Dislike"] = "Aime/n'aime pas";
+App::$strings["This action is restricted to members."] = "Cette action est réservée aux membres.";
+App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "S'il vous plait, <a href=\"rmagic\">identifiez vous avec votre identifant de \$Projectname </a> ou <a href=\"register\">inscrivez vous comme nouveau membre de \$Projectname </a> pour continuer.";
+App::$strings["Invalid request."] = "Requête invalide.";
+App::$strings["channel"] = "canal";
+App::$strings["thing"] = "chose";
+App::$strings["Channel unavailable."] = "Canal indisponible.";
+App::$strings["Previous action reversed."] = "Action précédente annulée.";
+App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
+App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s n'aime pas %3\$s de %2\$s";
+App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s approuve %3\$s de %2\$s";
+App::$strings["%1\$s doesn't agree with %2\$s's %3\$s"] = "%1\$s n'est pas d'accord avec %3\$s de %2\$s";
+App::$strings["%1\$s abstains from a decision on %2\$s's %3\$s"] = "%1\$s s'abstient de toute décision sur le %3\$s de %2\$s";
+App::$strings["%1\$s is attending %2\$s's %3\$s"] = "%1\$s participe à %3\$s de %2\$s";
+App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s ne participe pas à %3\$s de %2\$s";
+App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s participe peut-être à %3\$s de %2\$s";
+App::$strings["Action completed."] = "Action terminée.";
+App::$strings["Thank you."] = "Merci.";
+App::$strings["%d rating"] = array(
+ 0 => "%d évaluation",
+ 1 => "%d évaluations",
+);
+App::$strings["Gender: "] = "Sexe/genre&nbsp;:";
+App::$strings["Status: "] = "État&nbsp;:";
+App::$strings["Homepage: "] = "Site web&nbsp;:";
+App::$strings["Age:"] = "Age&nbsp;:";
+App::$strings["Location:"] = "Emplacement&nbsp;:";
+App::$strings["Description:"] = "Description&nbsp;:";
+App::$strings["Hometown:"] = "Ville natale&nbsp;:";
+App::$strings["About:"] = "À propos&nbsp;:";
+App::$strings["Connect"] = "Ajouter/Suivre";
+App::$strings["Public Forum:"] = "Forum public&nbsp;:";
+App::$strings["Keywords: "] = "Mots-clefs&nbsp;:";
+App::$strings["Don't suggest"] = "Ne pas suggérer";
+App::$strings["Common connections:"] = "Contacts en commun&nbsp;:";
+App::$strings["Global Directory"] = "Annuaire global";
+App::$strings["Local Directory"] = "Annuaire local";
+App::$strings["Finding:"] = "Recherche&nbsp;:";
+App::$strings["Channel Suggestions"] = "Canaux suggérés";
+App::$strings["next page"] = "page suivante";
+App::$strings["previous page"] = "page précédente";
+App::$strings["Sort options"] = "Options de tri";
+App::$strings["Alphabetic"] = "Alphabétique";
+App::$strings["Reverse Alphabetic"] = "Alphabétique inversé";
+App::$strings["Newest to Oldest"] = "Du plus récent au moins récent";
+App::$strings["Oldest to Newest"] = "Du moins récent du plus récent";
+App::$strings["No entries (some entries may be hidden)."] = "Pas d'entrées (certaines peuvent être cachées).";
+App::$strings["Xchan Lookup"] = "Recherche xchan";
+App::$strings["Lookup xchan beginning with (or webbie): "] = "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Aucune suggestion disponible. Si le site est récent, merci de re-tenter dans 24 heures.";
App::$strings["Ignore/Hide"] = "Ignorer/Cacher";
-App::$strings["post"] = "publication";
-App::$strings["comment"] = "commentaire";
-App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s avec %4\$s";
+App::$strings["Unable to find your hub."] = "Impossible de trouver votre hub.";
+App::$strings["Post successful."] = "Publication réussie.";
+App::$strings["Unable to lookup recipient."] = "Impossible de localiser le destinataire.";
+App::$strings["Unable to communicate with requested channel."] = "Impossible de communiquer avec le canal demandé.";
+App::$strings["Cannot verify requested channel."] = "Impossible de vérifier le canal demandé.";
+App::$strings["Selected channel has private message restrictions. Send failed."] = "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué.";
+App::$strings["Messages"] = "Messages";
+App::$strings["Message recalled."] = "Message rappelé.";
+App::$strings["Conversation removed."] = "Conversation supprimée.";
+App::$strings["Expires YYYY-MM-DD HH:MM"] = "Expire le YYYY-MM-DD à HH:MM";
+App::$strings["Requested channel is not in this network"] = "Le canal demandé n'est pas sur ce réseau";
+App::$strings["Send Private Message"] = "Envoyer un message privé";
+App::$strings["To:"] = "À&nbsp;:";
+App::$strings["Subject:"] = "Objet&nbsp;:";
+App::$strings["Attach file"] = "Joindre un fichier";
+App::$strings["Send"] = "Envoyer";
+App::$strings["Set expiration date"] = "Définir la date d'expiration";
+App::$strings["Delete message"] = "Supprimer le message";
+App::$strings["Delivery report"] = "Rapport de distribution";
+App::$strings["Recall message"] = "Rappeler le message";
+App::$strings["Message has been recalled."] = "Le message a été rappelé.";
+App::$strings["Delete Conversation"] = "Supprimer la conversation";
+App::$strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Aucune communication sécurisée n'est possible. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur.";
+App::$strings["Send Reply"] = "Envoyer la réponse";
+App::$strings["Your message for %s (%s):"] = "Votre message pour %s (%s)&nbsp;:";
+App::$strings["Public Hubs"] = "Instances publiques";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Les sites listés permettent l'enregistrement public de comptes pour le réseau \$Projectname. Tous les sites du réseau sont reliés entre eux, être membre d'un site revient à être membre de tous. Certains sites peuvent demander une souscription ou proposer différents niveaux de service. Chaque site <strong>peut</strong> fournir des détails supplémentaires.";
+App::$strings["Hub URL"] = "URL du site";
+App::$strings["Access Type"] = "Type d'accès";
+App::$strings["Registration Policy"] = "Politique d'inscription";
+App::$strings["Stats"] = "Statistiques";
+App::$strings["Software"] = "Logiciel";
+App::$strings["Rate"] = "Evaluer";
+App::$strings["webpage"] = "pages web";
+App::$strings["block"] = "bloquer";
+App::$strings["layout"] = "mise en page";
+App::$strings["menu"] = "menu";
+App::$strings["%s element installed"] = "Elément %s installé";
+App::$strings["%s element installation failed"] = "L'installation de l'élément %s a échoué";
+App::$strings["Select a bookmark folder"] = "Choisir un dossier de favoris";
+App::$strings["Save Bookmark"] = "Enregistrer le favori";
+App::$strings["URL of bookmark"] = "URL du favori";
+App::$strings["Or enter new bookmark folder name"] = "Ou entrez un nouveau nom de dossier de favoris";
+App::$strings["Enter a folder name"] = "";
+App::$strings["or select an existing folder (doubleclick)"] = "";
+App::$strings["Save to Folder"] = "Enregistrer dans le dossier";
+App::$strings["Fetching URL returns error: %1\$s"] = "Récupération d'URL échouée&nbsp;: %1\$s";
+App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Nombre d'inscriptions quotidiennes dépassé. Merci d'essayer à nouveau demain.";
+App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Merci d'indiquer votre adhésion aux conditions de service. L'inscription a échoué.";
+App::$strings["Passwords do not match."] = "Les mots de passe ne concordent pas.";
+App::$strings["Registration successful. Please check your email for validation instructions."] = "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte.";
+App::$strings["Your registration is pending approval by the site owner."] = "Votre inscription est en attente d'approbation par l'administrateur.";
+App::$strings["Your registration can not be processed."] = "Votre inscription ne peut être traîtée.";
+App::$strings["Registration on this hub is disabled."] = "La création de nouveaux comptes est désactivée pour ce site.";
+App::$strings["Registration on this hub is by approval only."] = "La création de compte sur ce site est soumise à approbation.";
+App::$strings["<a href=\"pubsites\">Register at another affiliated hub.</a>"] = "<a href=\"pubsites\">S'enregistrer sur un autre site du réseau.</a>";
+App::$strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Ce site a dépassé le nombre de création de comptes autorisé chaque jour. Merci d'essayer à nouveau demain.";
+App::$strings["I accept the %s for this website"] = "J'accepte les %s de ce site";
+App::$strings["I am over 13 years of age and accept the %s for this website"] = "J'ai plus de 13 ans et j'accepte les %s de ce site";
+App::$strings["Your email address"] = "Votre adresse de courriel";
+App::$strings["Choose a password"] = "Choisissez un mot de passe";
+App::$strings["Please re-enter your password"] = "Merci de saisir à nouveau votre mot de passe";
+App::$strings["Please enter your invitation code"] = "Merci de saisir votre code d'invitation";
+App::$strings["no"] = "non";
+App::$strings["yes"] = "oui";
+App::$strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
+App::$strings["Register"] = "S'inscrire";
+App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Ce site peut demander une validation de votre email. Si vous revenez sur le formulaire de connexion, vérifiez vos emails et suivez les instructions. Regardez aussi les spams.";
+App::$strings["Cover Photos"] = "Photos de couverture";
+App::$strings["female"] = "femme";
+App::$strings["%1\$s updated her %2\$s"] = "%1\$s a mis à jour son %2\$s";
+App::$strings["male"] = "homme";
+App::$strings["%1\$s updated his %2\$s"] = "%1\$s a mis à jour son %2\$s";
+App::$strings["%1\$s updated their %2\$s"] = "%1\$s a mis a jour sa %2\$s";
+App::$strings["cover photo"] = "Photo principale";
+App::$strings["Upload Cover Photo"] = "Téléverser une photo de couverture";
+App::$strings["Documentation Search"] = "Chercher dans la documentation";
+App::$strings["About"] = "À propos";
+App::$strings["Administrators"] = "Administrateurs";
+App::$strings["Developers"] = "Développeurs";
+App::$strings["Tutorials"] = "Tutoriels";
+App::$strings["\$Projectname Documentation"] = "Documentation \$Projectname";
+App::$strings["Contents"] = "Contenus";
App::$strings["Tag removed"] = "Étiquette retirée";
App::$strings["Remove Item Tag"] = "Retirer une étiquette à l'élément";
App::$strings["Select a tag to remove: "] = "Étiquette à retirer&nbsp;:";
-App::$strings["Thing updated"] = "Elément mis à jour";
-App::$strings["Object store: failed"] = "Stockage de l'objet&nbsp;: échec";
-App::$strings["Thing added"] = "Elément ajouté";
-App::$strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
-App::$strings["Show Thing"] = "Montrer élément";
-App::$strings["item not found."] = "élément introuvable.";
-App::$strings["Edit Thing"] = "Modifier élément";
-App::$strings["Select a profile"] = "Choisissez un profil";
-App::$strings["Post an activity"] = "Publier une activité";
-App::$strings["Only sends to viewers of the applicable profile"] = "Envoie exclusivement aux visiteurs du profil concerné";
-App::$strings["Name of thing e.g. something"] = "Nom de l'élément, p.ex. quelque-chose";
-App::$strings["URL of thing (optional)"] = "URL de l'élément (facultatif)";
-App::$strings["URL for photo of thing (optional)"] = "URL d'une photo de l'élément (facultatif)";
-App::$strings["Add Thing to your Profile"] = "Ajouter l'élément à votre profil";
-App::$strings["Export Channel"] = "Exporter le canal";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportez les principales informations de votre canal dans un fichier. Celui-ci pourra servir de sauvegarde de vos contacts, permissions, profils et données de base. Il pourra être importé sur un nouveau hub/serveur, mais n'embarquera pas vos contenus.";
-App::$strings["Export Content"] = "Exporter le contenu";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exportez les informations du canal et les contenus récents dans un fichier JSON. Celui-ci contiendra toutes vos relations, permissions, profils, et plusieurs mois de publications. Ce fichier peut être TRÈS gros. Armez-vous de patience - plusieurs minutes peuvent s'écouler avant que le téléchargement ne commence.";
-App::$strings["Export your posts from a given year."] = "Exporter vos publications d'une année en particulier";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Vous pouvez également exporter vos publications et conversations pour une année ou un mois particulier. Ajustez la date dans la barre de votre navigateur pour sélectionner d'autres dates. Si l'export échoue (possible en cas de pénurie de mémoire sur le serveur de votre hub), essayez à nouveau en sélectionnant un intervalle de dates plus petit.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour une année donnée, telle que cette année, visitez <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Pour sélectionner toutes les publications pour un mois donné, par exemple janvier, visitez <a href=\"%1\$s\">%2\$s</a>";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Ces fichiers de contenu peuvent être importés ou restaurés en visitant <a href=\"%1\$s\">%2\$s</a> sur n'importe quel site hébergeant votre canal. Pour de meilleurs résultats merci de les importer par ordre chronologique (les plus anciens d'abord).";
+App::$strings["No such group"] = "Groupe introuvable";
+App::$strings["No such channel"] = "Canal introuvable";
+App::$strings["forum"] = "forum";
+App::$strings["Search Results For:"] = "Résultats de recherche pour&nbsp;:";
+App::$strings["Privacy group is empty"] = "Groupe de contacts vide";
+App::$strings["Privacy group: "] = "Groupe de contacts&nbsp;:";
+App::$strings["Invalid connection."] = "Contact non valide.";
+App::$strings["Invalid channel."] = "Canal invalide.";
+App::$strings["network"] = "réseau";
+App::$strings["RSS"] = "RSS";
+App::$strings["\$Projectname"] = "\$Projectname";
+App::$strings["Welcome to %s"] = "Bienvenue sur %s";
+App::$strings["Permission Denied."] = "Permission refusée.";
+App::$strings["File not found."] = "Fichier introuvable.";
+App::$strings["Edit file permissions"] = "Modifier les autorisations d'accès au fichier";
+App::$strings["Set/edit permissions"] = "Définir/modifier les autorisations";
+App::$strings["Include all files and sub folders"] = "Inclure tous fichiers et sous-répertoires";
+App::$strings["Return to file list"] = "Retourner à la liste des fichiers";
+App::$strings["Copy/paste this code to attach file to a post"] = "Copiez/collez ce code pour joindre le fichier à une publication";
+App::$strings["Copy/paste this URL to link file from a web page"] = "Copiez/collez cette URL pour pointer vers ce fichier depuis une page web";
+App::$strings["Share this file"] = "Partager ce fichier";
+App::$strings["Show URL to this file"] = "Montrer l'URL de ce fichier";
+App::$strings["Notify your contacts about this file"] = "Notifier vos contacts à propos de ce fichier";
+App::$strings["No channel."] = "Pas de canal.";
+App::$strings["Common connections"] = "Contacts en commun";
+App::$strings["No connections in common."] = "Pas de contacts en commun.";
App::$strings["No connections."] = "Aucun contact.";
App::$strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
App::$strings["View Connections"] = "Voir les contacts";
-App::$strings["Source of Item"] = "Source de l'élément";
-App::$strings["Webpages"] = "Pages web";
-App::$strings["Actions"] = "Actions";
-App::$strings["Page Link"] = "Lien vers la page";
-App::$strings["Page Title"] = "Titre de la page";
-App::$strings["Xchan Lookup"] = "Recherche xchan";
-App::$strings["Lookup xchan beginning with (or webbie): "] = "Recherche xchan commençant par (ou adresse \"webbie\")&nbsp;:";
+App::$strings["# Accounts"] = "# Comptes";
+App::$strings["# blocked accounts"] = "# comptes bloqués";
+App::$strings["# expired accounts"] = "# comptes expirés";
+App::$strings["# expiring accounts"] = "# comptes expirant";
+App::$strings["# Channels"] = "# Canaux";
+App::$strings["# primary"] = "# primaire";
+App::$strings["# clones"] = "# clones";
+App::$strings["Message queues"] = "File des messages";
+App::$strings["Your software should be updated"] = "Votre logiciel doit d'être mis à jour";
+App::$strings["Summary"] = "Résumé";
+App::$strings["Registered accounts"] = "Comptes enregistrés";
+App::$strings["Pending registrations"] = "Inscriptions en attente";
+App::$strings["Registered channels"] = "Canaux enregistrés";
+App::$strings["Active plugins"] = "Greffons actifs";
+App::$strings["Version"] = "Version";
+App::$strings["Repository version (master)"] = "Version du dépôt (maître)";
+App::$strings["Repository version (dev)"] = "Version du dépôt (développeur)";
+App::$strings["No service class restrictions found."] = "Aucune restriction de classe de service trouvée.";
+App::$strings["Website:"] = "Site web&nbsp;:";
+App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Canal distant [%s] (encore inconnu sur ce site)";
+App::$strings["Rating (this information is public)"] = "Evaluation (cette information est publique)";
+App::$strings["Optionally explain your rating (this information is public)"] = "Explication facultative de votre évaluation (cette information est publique)";
+App::$strings["No valid account found."] = "Aucun compte valide trouvé.";
+App::$strings["Password reset request issued. Check your email."] = "Demande de réinitialisation du mot de passe envoyée. Vérifiez vos courriels.";
+App::$strings["Site Member (%s)"] = "Membre du site (%s)";
+App::$strings["Password reset requested at %s"] = "Demande de réinitialisation du mot de passe sur %s";
+App::$strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La demande n'a pas pu être vérifiée. (Peut-être l'avez vous déjà utilisée.) La réinitialisation a échoué.";
+App::$strings["Password Reset"] = "Réinitialiser le mot de passe";
+App::$strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
+App::$strings["Your new password is"] = "Votre nouveau mot de passe est";
+App::$strings["Save or copy your new password - and then"] = "Enregistrez ou copiez votre nouveau mot de passe, puis";
+App::$strings["click here to login"] = "cliquez ici pour vous connecter";
+App::$strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Votre mot de passe peut être changé depuis la page des <em>Paramètres</em> une fois connecté.";
+App::$strings["Your password has changed at %s"] = "Votre mot de passe de %s a été changé";
+App::$strings["Forgot your Password?"] = "Mot de passe oublié&nbsp;?";
+App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Saisissez votre adresse de courriel, et validez, pour réinitialiser votre mot de passe. Vérifiez ensuite votre boîte aux lettres pour la suite des instructions.";
+App::$strings["Email Address"] = "Adresse de courriel";
+App::$strings["Reset"] = "Réinitialiser";
+App::$strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme vues";
App::$strings["Site Admin"] = "Administrateur";
-App::$strings["Bug Report"] = "";
-App::$strings["View Bookmarks"] = "";
-App::$strings["My Chatrooms"] = "";
-App::$strings["Firefox Share"] = "";
-App::$strings["Remote Diagnostics"] = "";
+App::$strings["Report Bug"] = "Reporter des bogues";
+App::$strings["View Bookmarks"] = "Voir les marques-pages";
+App::$strings["My Chatrooms"] = "Mes salons de discussions";
+App::$strings["Firefox Share"] = "Partager via Firefox";
+App::$strings["Remote Diagnostics"] = "Diagnostiques à distance";
App::$strings["Suggest Channels"] = "Suggérer des canaux";
App::$strings["Login"] = "Connexion";
App::$strings["Grid"] = "Réseau";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Channel Home"] = "Mon canal";
App::$strings["Events"] = "Événements";
App::$strings["Directory"] = "Annuaire";
@@ -1425,8 +1549,46 @@ App::$strings["Suggest"] = "Suggérer";
App::$strings["Random Channel"] = "Un canal au hasard";
App::$strings["Invite"] = "Invitation";
App::$strings["Features"] = "Fonctionalités";
+App::$strings["Language"] = "Langue";
App::$strings["Post"] = "Envoyer";
+App::$strings["Profile Photo"] = "Photo du Profil";
App::$strings["Purchase"] = "Acheter";
+App::$strings["Undelete"] = "Restaurer";
+App::$strings["Add to app-tray"] = "";
+App::$strings["Remove from app-tray"] = "";
+App::$strings["__ctx:permcat__ default"] = "défaut";
+App::$strings["__ctx:permcat__ follower"] = "abonné";
+App::$strings["__ctx:permcat__ contributor"] = "contributeur";
+App::$strings["__ctx:permcat__ publisher"] = "rédacteur";
+App::$strings["(No Title)"] = "(Pas de titre)";
+App::$strings["Wiki page create failed."] = "Échec de création de la page wiki.";
+App::$strings["Wiki not found."] = "Wiki introuvable.";
+App::$strings["Destination name already exists"] = "Le nom de destination est déjà pris";
+App::$strings["Page not found"] = "Page introuvable";
+App::$strings["Error reading page content"] = "Erreur de lecture du contenu de la page";
+App::$strings["Error reading wiki"] = "Erreur de lecture du wiki";
+App::$strings["Page update failed."] = "Echec de modification de la page.";
+App::$strings["Nothing deleted"] = "Rien n'a été supprimé";
+App::$strings["Compare: object not found."] = "Comparaison&nbsp;: objet introuvable.";
+App::$strings["Page updated"] = "Page modifiée";
+App::$strings["Untitled"] = "Sans titre";
+App::$strings["Wiki resource_id required for git commit"] = "\"resource_id\" du wiki nécessaire pour l'enregistrement dans git.";
+App::$strings["__ctx:wiki_history__ Message"] = "Message";
+App::$strings["Different viewers will see this text differently"] = "Ce texte aura un rendu différent en fonction des utilisateurs";
+App::$strings["Visible to your default audience"] = "Visible pour vos contacts seulement";
+App::$strings["Only me"] = "Seulement moi";
+App::$strings["Public"] = "Public";
+App::$strings["Anybody in the \$Projectname network"] = "N'importe qui dans le réseau de \$Projectname";
+App::$strings["Any account on %s"] = "N'importe quel compte sur %s";
+App::$strings["Any of my connections"] = "N'importe laquelle de mes connexions";
+App::$strings["Only connections I specifically allow"] = "Uniquement les connexions que j'ai expréssément autorisées";
+App::$strings["Anybody authenticated (could include visitors from other networks)"] = "N'importe qui d'authentifié (cela peut inclure des visiteurs d'autres réseaux)";
+App::$strings["Any connections including those who haven't yet been approved"] = "N'importe quelle connexions, y compris celles qui n'ont pas encore été approuvées";
+App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "Ceci est votre réglage par défaut de l'audience de vos publications sur votre canal normal.";
+App::$strings["This is your default setting for who can view your default channel profile"] = "Ceci est votre réglage par défaut à propos de qui peut voir votre canal de profil par défaut.";
+App::$strings["This is your default setting for who can view your connections"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos relations.";
+App::$strings["This is your default setting for who can view your file storage and photos"] = "Ceci est votre réglage par défaut à propos de qui peut voir vos fichiers ou photos stocké(e)s";
+App::$strings["This is your default setting for the audience of your webpages"] = "Ceci est votre réglage par défaut de l'audience de vos pages web.";
App::$strings["Missing room name"] = "Il manque le nom du salon";
App::$strings["Duplicate room name"] = "Un salon avec ce nom existe déjà";
App::$strings["Invalid room specifier."] = "Identifiant de salon invalide.";
@@ -1437,7 +1599,7 @@ App::$strings["\$projectname"] = "\$projectname";
App::$strings["Thank You,"] = "Merci,";
App::$strings["%s Administrator"] = "l'administrateur de %s";
App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Notify] Nouveau courriel reçu à %s";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notify] Nouveau mail reçu sur %s";
App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, vous avez reçu un message privé sur %3\$s, de la part de %2\$s.";
App::$strings["%1\$s sent you %2\$s."] = "%1\$s vous a envoyé %2\$s.";
App::$strings["a private message"] = "un message privé";
@@ -1445,48 +1607,53 @@ App::$strings["Please visit %s to view and/or reply to your private messages."]
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s a commenté sur [zrl=%3\$s]%4\$s[/zrl]";
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s a commenté sur [zrl=%3\$s]%5\$s de %4\$s[/zrl]";
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s a commenté [zrl=%3\$s]votre %4\$s[/zrl]";
-App::$strings["[Hubzilla:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Hubzilla:Notify] Commentaire de %2\$s sur conversation #%1\$d";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Commentaire effectué sur la conversation #%1\$d par %2\$s";
App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s a commenté un élément de conversation que vous suivez.";
App::$strings["Please visit %s to view and/or reply to the conversation."] = "Merci de visiter %s pour voir et/ou répondre sur cette conversation.";
-App::$strings["[Hubzilla:Notify] %s posted to your profile wall"] = "[Hubzilla:Notify] %s a publié sur votre profil";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s aiment [zrl=%3\$s]votre %4\$s[/zrl]";
+App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Aime reçu à la convesation #%1\$d par %2\$s";
+App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s a aimé un élément ou une conversation que vous avez créée.";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notify] %s a publié sur le mur de votre profil";
App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s a publié sur votre profil à %3\$s";
App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s a publié sur [zrl=%3\$s]votre profil[/zrl]";
-App::$strings["[Hubzilla:Notify] %s tagged you"] = "[Hubzilla:Notify] %s vous a étiqueté";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notify] %s vous a étiquetté";
App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, vous avez été étiqueté sur %3\$s par %2\$s";
App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]vous a étiqueté[/zrl].";
-App::$strings["[Hubzilla:Notify] %1\$s poked you"] = "[Hubzilla:Notify] %1\$s vous a tapoté";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notify] %1\$s vous a poké";
App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s vous a tapoté sur %3\$s";
App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]vous a tapoté[/zrl].";
-App::$strings["[Hubzilla:Notify] %s tagged your post"] = "[Hubzilla:Notify] %s a étiqueté votre publication";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notify] %s a étiquetté votre publication";
App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s a étiqueté votre publication sur %3\$s";
App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s a étiqueté [zrl=%3\$s]votre publication[/zrl]";
-App::$strings["[Hubzilla:Notify] Introduction received"] = "[Hubzilla:Notify] Nouvelle présentation";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notify] Demande de relation reçue";
App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une demande de contact de '%2\$s' sur %3\$s";
App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, vous avez reçu [zrl=%2\$s]une demande de contact[/zrl] de %3\$s.";
App::$strings["You may visit their profile at %s"] = "Vous pouvez visiter leur profil sur %s";
App::$strings["Please visit %s to approve or reject the connection request."] = "Merci de visiter %s avant d'approuver (ou non) cette demande de contact.";
-App::$strings["[Hubzilla:Notify] Friend suggestion received"] = "[Hubzilla:Notify] Nouvel(le) ami(e) suggéré(e)";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notify] Suggestion d'amitié reçue";
App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une suggestion d'ami(e) de '%2\$s' à %3\$s";
App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, avez reçu %3\$s comme [zrl=%2\$s]une suggestion d'ami(e)[/zrl] de %4\$s.";
App::$strings["Name:"] = "Nom&nbsp;:";
App::$strings["Photo:"] = "Photo&nbsp;:";
App::$strings["Please visit %s to approve or reject the suggestion."] = "Merci de visiter %s pour donner suite (ou non) à cette suggestion.";
-App::$strings["[Hubzilla:Notify]"] = "[Hubzilla:Notify]";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notify]";
App::$strings["created a new post"] = "a publié un nouveau message";
App::$strings["commented on %s's post"] = "a commenté la publication de %s";
+App::$strings["Wiki files deleted successfully"] = "Fichiers du wiki supprimés avec succès";
+App::$strings["Update Error at %s"] = "Erreur de mise à jour sur %s";
+App::$strings["Update %s failed. See error logs."] = "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur.";
App::$strings["Private Message"] = "Message Privé";
App::$strings["Select"] = "Sélectionner";
-App::$strings["Save to Folder"] = "Enregistrer dans le dossier";
App::$strings["I will attend"] = "Je participerai";
App::$strings["I will not attend"] = "Je ne participerai pas";
App::$strings["I might attend"] = "Je participerai peut-être";
App::$strings["I agree"] = "Je suis d'accord";
App::$strings["I disagree"] = "Je ne suis pas d'accord";
App::$strings["I abstain"] = "Je m'abstiens";
-App::$strings["Add Star"] = "Mettre en avant (étoile)";
-App::$strings["Remove Star"] = "Ne plus mettre en avant";
+App::$strings["Add Star"] = "Mettre de côté (étoile)";
+App::$strings["Remove Star"] = "Ne plus mettre de côté";
App::$strings["Toggle Star Status"] = "(Dés)activer l'étoile";
-App::$strings["starred"] = "mis en avant";
+App::$strings["starred"] = "mis de côté";
App::$strings["Message signature validated"] = "Signature du message validée";
App::$strings["Message signature incorrect"] = "Signature du message incorrecte";
App::$strings["Add Tag"] = "Ajouter une étiquette";
@@ -1507,10 +1674,14 @@ App::$strings["via Wall-To-Wall:"] = "par Mur-à-mur&nbsp;:";
App::$strings["from %s"] = "de %s";
App::$strings["last edited: %s"] = "dernière modification&nbsp;: %s";
App::$strings["Expires: %s"] = "Expire&nbsp;: %s";
+App::$strings["Attend"] = "En attente";
+App::$strings["Attendance Options"] = "Options d'attente";
+App::$strings["Vote"] = "Vote";
+App::$strings["Voting Options"] = "Options de vote";
App::$strings["Save Bookmarks"] = "Enregistrer les favoris";
App::$strings["Add to Calendar"] = "Ajouter au Calendrier";
App::$strings["Mark all seen"] = "Tout marquer comme vu";
-App::$strings["[+] show all"] = "[+] voir tous";
+App::$strings["%s show all"] = "%s montre tout";
App::$strings["Bold"] = "Gras";
App::$strings["Italic"] = "Italique";
App::$strings["Underline"] = "Souligné";
@@ -1519,274 +1690,783 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Image";
App::$strings["Insert Link"] = "Insérer un lien";
App::$strings["Video"] = "Vidéo";
-App::$strings["No username found in import file."] = "Aucun nom d'utilisateur dans le fichier d'import.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Impossible de créer une adresse de canal unique. Echec de l'import.";
-App::$strings["Cannot locate DNS info for database server '%s'"] = "Impossible de trouver les infos DNS du serveur de BDD '%s'";
+App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authentification distante bloquée. Vous êtes connecté(e) sur ce site localement. Merci de vous déconnecter et réessayer.";
+App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenue %s. L'authentification distante a fonctionné.";
+App::$strings["parent"] = "retour";
+App::$strings["Collection"] = "Groupe de contacts";
+App::$strings["Principal"] = "Principal";
+App::$strings["Addressbook"] = "Carnet d'adresse";
+App::$strings["Calendar"] = "Calendrier";
+App::$strings["Schedule Inbox"] = "Calendrier - Messages entrants";
+App::$strings["Schedule Outbox"] = "Calendrier - Messages sortants";
+App::$strings["Total"] = "Total";
+App::$strings["Shared"] = "Partagé";
+App::$strings["You are using %1\$s of your available file storage."] = "Vous utilisez %1\$s de votre espace de stockage.";
+App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Vous utilisez %1\$s sur %2\$s d'espace disponible. (%3\$s&#37;)";
+App::$strings["WARNING:"] = "AVERTISSEMENT&nbsp;:";
+App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "";
+App::$strings["Create new folder"] = "Nouveau dossier";
+App::$strings["Upload file"] = "Téléverser un fichier";
+App::$strings["Drop files here to immediately upload"] = "Mettez un fichier ici pour le télécharger immédiatement";
+App::$strings["Forums"] = "Forums";
App::$strings["Categories"] = "Catégories";
-App::$strings["Tags"] = "Étiquettes";
-App::$strings["Keywords"] = "Mots-clefs";
-App::$strings["have"] = "ont";
-App::$strings["has"] = "a";
-App::$strings["want"] = "veulent";
-App::$strings["wants"] = "veut";
-App::$strings["likes"] = "aime";
-App::$strings["dislikes"] = "n'aime pas";
-App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\à G\\hi";
-App::$strings["Starts:"] = "Début&nbsp;:";
-App::$strings["Finishes:"] = "Fin&nbsp;:";
-App::$strings["This event has been added to your calendar."] = "Cet évènement a été ajouté dans votre calendrier.";
-App::$strings["Not specified"] = "Non spécifié";
-App::$strings["Needs Action"] = "Besoin d'une action";
-App::$strings["Completed"] = "Terminé";
-App::$strings["In Process"] = "En cours";
-App::$strings["Cancelled"] = "Annulé";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "L'import a échoué. Un canal existe déjà avec ce nom";
-App::$strings["Channel clone failed. Import failed."] = "Echec du clonage du canal. Echec de l'impot.";
-App::$strings["(Unknown)"] = "(Inconnu)";
-App::$strings["Visible to anybody on the internet."] = "Visible pour tout le monde sur internet.";
-App::$strings["Visible to you only."] = "Visible pour vous seulement.";
-App::$strings["Visible to anybody in this network."] = "Visible pour tout le monde sur ce réseau.";
-App::$strings["Visible to anybody authenticated."] = "Visible aux utilisateurs authentifiés.";
-App::$strings["Visible to anybody on %s."] = "Visible pour tous sur %s.";
-App::$strings["Visible to all connections."] = "Visible pour tous les contacts.";
-App::$strings["Visible to approved connections."] = "Visible aux contacts approuvés.";
-App::$strings["Visible to specific connections."] = "Visible pour certains contacts.";
-App::$strings["Privacy group is empty."] = "Groupe d'accès vide.";
-App::$strings["Privacy group: %s"] = "Groupe d'accès&nbsp;: %s";
-App::$strings["Connection not found."] = "Contact non trouvé.";
-App::$strings["profile photo"] = "photo de profil";
-App::$strings["No recipient provided."] = "Pas de destinataire.";
-App::$strings["[no subject]"] = "[sans objet]";
-App::$strings["Unable to determine sender."] = "Impossible de déterminer l'émetteur.";
-App::$strings["Stored post could not be verified."] = "Le message stocké n'a pas pu être vérifié.";
-App::$strings["prev"] = "préc.";
-App::$strings["first"] = "premier";
-App::$strings["last"] = "dernier";
-App::$strings["next"] = "Suivant";
-App::$strings["older"] = "plus ancien";
-App::$strings["newer"] = "plus récent";
-App::$strings["No connections"] = "Pas de relations.";
-App::$strings["View all %s connections"] = "Voir les %s contacts";
-App::$strings["poke"] = "tapoter";
-App::$strings["poked"] = "a tapoté";
-App::$strings["ping"] = "ping";
-App::$strings["pinged"] = "pingé";
-App::$strings["prod"] = "encourager";
-App::$strings["prodded"] = "encouragé";
-App::$strings["slap"] = "giffler";
-App::$strings["slapped"] = "gifflé(e)";
-App::$strings["finger"] = "pointer";
-App::$strings["fingered"] = "pointé";
-App::$strings["rebuff"] = "rejetter";
-App::$strings["rebuffed"] = "rejeté";
-App::$strings["happy"] = "heureux";
-App::$strings["sad"] = "triste";
-App::$strings["mellow"] = "mélancolique";
-App::$strings["tired"] = "fatigué";
-App::$strings["perky"] = "impertinent";
-App::$strings["angry"] = "en colère";
-App::$strings["stupefied"] = "stupéfait";
-App::$strings["puzzled"] = "perplexe";
-App::$strings["interested"] = "intéressé";
-App::$strings["bitter"] = "amer";
-App::$strings["cheerful"] = "plein d'entrain";
-App::$strings["alive"] = "vivant";
-App::$strings["annoyed"] = "agaçé";
-App::$strings["anxious"] = "anxieux";
-App::$strings["cranky"] = "énervé";
-App::$strings["disturbed"] = "perturbé";
-App::$strings["frustrated"] = "frustré";
-App::$strings["depressed"] = "déprimé";
-App::$strings["motivated"] = "motivé";
-App::$strings["relaxed"] = "détendu";
-App::$strings["surprised"] = "surpris";
-App::$strings["Monday"] = "Lundi";
-App::$strings["Tuesday"] = "Mardi";
-App::$strings["Wednesday"] = "Mercredi";
-App::$strings["Thursday"] = "Jeudi";
-App::$strings["Friday"] = "Vendredi";
-App::$strings["Saturday"] = "Samedi";
-App::$strings["Sunday"] = "Dimanche";
-App::$strings["January"] = "Janvier";
-App::$strings["February"] = "Février";
-App::$strings["March"] = "Mars";
-App::$strings["April"] = "Avril";
-App::$strings["May"] = "Mai";
-App::$strings["June"] = "Juin";
-App::$strings["July"] = "Juillet";
-App::$strings["August"] = "Août";
-App::$strings["September"] = "Septembre";
-App::$strings["October"] = "Octobre";
-App::$strings["November"] = "Novembre";
-App::$strings["December"] = "Décembre";
-App::$strings["Unknown Attachment"] = "Pièce jointe inconnue";
-App::$strings["unknown"] = "Inconnu";
-App::$strings["remove category"] = "supprimer la catégorie";
-App::$strings["remove from file"] = "retirer du fichier";
-App::$strings["default"] = "défaut";
-App::$strings["Page layout"] = "Mise en page";
-App::$strings["You can create your own with the layouts tool"] = "Créez les vôtres avec les outils de mise en page";
-App::$strings["Page content type"] = "Type de contenu de la page";
-App::$strings["Select an alternate language"] = "Choisir une langue alternative";
-App::$strings["activity"] = "activité";
-App::$strings["Design Tools"] = "Outils de conception";
-App::$strings["Pages"] = "Pages";
-App::$strings["System"] = "Système";
-App::$strings["New App"] = "";
-App::$strings["Suggestions"] = "Suggestions";
-App::$strings["See more..."] = "Voir plus...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Vous avez %1$.0f sur %2$.0f contacts autorisés.";
-App::$strings["Add New Connection"] = "Ajouter un nouveau contact";
-App::$strings["Enter channel address"] = "Saisissez l'adresse du canal";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie";
-App::$strings["Notes"] = "Notes";
-App::$strings["Remove term"] = "Retirer le terme";
-App::$strings["Saved Searches"] = "Recherches sauvegardées";
-App::$strings["add"] = "ajouter";
-App::$strings["Saved Folders"] = "Dossiers sauvegardés";
App::$strings["Everything"] = "Tout";
-App::$strings["Archives"] = "Archives";
-App::$strings["Refresh"] = "Actualiser";
-App::$strings["Account settings"] = "Paramètres du compte";
-App::$strings["Channel settings"] = "Paramètres du canal";
-App::$strings["Additional features"] = "Fonctionnalités supplémentaires";
-App::$strings["Feature/Addon settings"] = "Paramètres des extensions/greffons";
-App::$strings["Display settings"] = "Paramètres d'affichage";
-App::$strings["Manage locations"] = "";
-App::$strings["Export channel"] = "Exporter le canal";
-App::$strings["Connected apps"] = "Applications connectées";
-App::$strings["Premium Channel Settings"] = "Paramètres de canal VIP";
+App::$strings["Events Tools"] = "Outils Evènements";
+App::$strings["Export Calendar"] = "Exporter le calendrier";
+App::$strings["Import Calendar"] = "Importer un calendrier";
+App::$strings["Suggested Chatrooms"] = "Salons suggérés";
App::$strings["Private Mail Menu"] = "Menu des messages privés";
App::$strings["Combined View"] = "Vue combinée";
App::$strings["Inbox"] = "Boîte de réception";
App::$strings["Outbox"] = "Boîte d'envoi";
App::$strings["New Message"] = "Nouveau message";
+App::$strings["Chatrooms"] = "Salons de clavardage";
+App::$strings["Overview"] = "Aperçu";
+App::$strings["Rating Tools"] = "Outils d'évaluation";
+App::$strings["Rate Me"] = "M'évaluer";
+App::$strings["View Ratings"] = "Voir mes évaluations";
+App::$strings["__ctx:widget__ Activity"] = "";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Vous avez %1$.0f sur %2$.0f contacts autorisés.";
+App::$strings["Add New Connection"] = "Ajouter un nouveau contact";
+App::$strings["Enter channel address"] = "Saisissez l'adresse du canal";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Exemples&nbsp;: pierre@exemple.com, https://exemple.com/sophie";
+App::$strings["Wiki List"] = "Liste de wikis";
+App::$strings["Archives"] = "Archives";
App::$strings["Conversations"] = "Conversations";
App::$strings["Received Messages"] = "Messages reçus";
App::$strings["Sent Messages"] = "Messages envoyés";
App::$strings["No messages."] = "Pas de message.";
App::$strings["Delete conversation"] = "Supprimer la conversation";
-App::$strings["Events Menu"] = "Menu Evènements";
-App::$strings["Day View"] = "Vue Jour";
-App::$strings["Week View"] = "Vue Semaine";
-App::$strings["Month View"] = "Vue Mois";
-App::$strings["Events Tools"] = "Outils Evènements";
-App::$strings["Export Calendar"] = "Exporter le calendrier";
-App::$strings["Import Calendar"] = "Importer un calendrier";
-App::$strings["Chatrooms"] = "Salons de clavardage";
-App::$strings["Overview"] = "";
-App::$strings["Chat Members"] = "";
-App::$strings["Bookmarked Chatrooms"] = "Salons favoris";
-App::$strings["Suggested Chatrooms"] = "Salons suggérés";
+App::$strings["Chat Members"] = "Membres du salon de discussion";
App::$strings["photo/image"] = "photo/image";
-App::$strings["Click to show more"] = "Cliquer pour voir plus";
-App::$strings["Rating Tools"] = "Outils d'évaluation";
-App::$strings["Rate Me"] = "M'évaluer";
-App::$strings["View Ratings"] = "Voir mes évaluations";
-App::$strings["Forums"] = "Membres du forum";
+App::$strings["Remove term"] = "Retirer le terme";
+App::$strings["Saved Searches"] = "Recherches sauvegardées";
+App::$strings["add"] = "ajouter";
+App::$strings["Notes"] = "Notes";
+App::$strings["Wiki Pages"] = "Pages wiki";
+App::$strings["Add new page"] = "Ajouter une nouvelle page";
+App::$strings["Page name"] = "Nom de la page";
+App::$strings["Refresh"] = "Actualiser";
App::$strings["Tasks"] = "Tâches";
-App::$strings["Documentation"] = "Documentation";
-App::$strings["Project/Site Information"] = "Information sur le site/projet";
-App::$strings["For Members"] = "Pour les membres";
-App::$strings["For Administrators"] = "Pour les administrateurs";
-App::$strings["For Developers"] = "Pour les développeurs";
-App::$strings["Member registrations waiting for confirmation"] = "";
+App::$strings["Suggestions"] = "Suggestions";
+App::$strings["See more..."] = "Voir plus...";
+App::$strings["Saved Folders"] = "Dossiers sauvegardés";
+App::$strings["Click to show more"] = "Cliquer pour voir plus";
+App::$strings["Member registrations waiting for confirmation"] = "Inscriptions en attente d'approbation";
App::$strings["Inspect queue"] = "Analyser la file d'attente";
App::$strings["DB updates"] = "Mises à jour BDD";
App::$strings["Admin"] = "Administrateur";
App::$strings["Plugin Features"] = "Fonctionnalités des greffons";
-App::$strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site.";
-App::$strings["Channel location missing."] = "Emplacement du canal introuvable.";
-App::$strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète.";
-App::$strings["Channel was deleted and no longer exists."] = "Le canal a été supprimé et n'existe plus.";
-App::$strings["Protocol disabled."] = "Protocole désactivé.";
-App::$strings["Channel discovery failed."] = "La tentative d'accéder au canal a échoué.";
-App::$strings["Cannot connect to yourself."] = "Ne peut pas se connecter à vous.";
-App::$strings["%1\$s's bookmarks"] = "Favoris de %1\$s";
-App::$strings["Public Timeline"] = "Fil public";
-App::$strings["Image/photo"] = "Image/photo";
-App::$strings["Encrypted content"] = "Contenu chiffré";
-App::$strings["Install %s element: "] = "Installer %s élément";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Ce message contient un élément installable %s, mais vous n'avez pas l'autorisation de l'installer sur ce site.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s a écrit %2\$s qui suit %3\$s";
-App::$strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
-App::$strings["spoiler"] = "";
-App::$strings["Different viewers will see this text differently"] = "Ce texte aura un rendu différent en fonction des utilisateurs";
-App::$strings["$1 wrote:"] = "$1 a écrit&nbsp;:";
-App::$strings["Directory Options"] = "Options d'annuaire";
-App::$strings["Safe Mode"] = "Mode sûr";
-App::$strings["Public Forums Only"] = "Les forums publics uniquement";
-App::$strings["This Website Only"] = "Ce site uniquement";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures).";
+App::$strings["Account settings"] = "Paramètres du compte";
+App::$strings["Channel settings"] = "Paramètres du canal";
+App::$strings["Additional features"] = "Fonctionnalités supplémentaires";
+App::$strings["Feature/Addon settings"] = "Paramètres des extensions/greffons";
+App::$strings["Display settings"] = "Paramètres d'affichage";
+App::$strings["Manage locations"] = "Gérer les emplacements";
+App::$strings["Export channel"] = "Exporter le canal";
+App::$strings["Connected apps"] = "Applications connectées";
+App::$strings["Permission Groups"] = "Groupes d'autorisation";
+App::$strings["Premium Channel Settings"] = "Paramètres de canal VIP";
+App::$strings["Bookmarked Chatrooms"] = "Salons favoris";
+App::$strings["Source channel not found."] = "Source du canal introuvable.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Recherche %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Create an account to access services and applications"] = "Créer un compte pour accéder aux services et applications";
App::$strings["Logout"] = "Déconnexion";
-App::$strings["End this session"] = "Mettre fin à la session";
-App::$strings["Home"] = "Mon canal";
-App::$strings["Your posts and conversations"] = "Vos publications et conversations";
-App::$strings["Your profile page"] = "Votre profil";
-App::$strings["Manage/Edit profiles"] = "Gérer/modifier les profils";
+App::$strings["Login/Email"] = "pseudo / email";
+App::$strings["Password"] = "Mot de passe";
+App::$strings["Remember me"] = "Se souvenir de moi";
+App::$strings["Forgot your password?"] = "Mot de passe oublié&nbsp;?";
+App::$strings["toggle mobile"] = "(dés)activer mobile";
+App::$strings["[\$Projectname] Website SSL error for %s"] = "";
+App::$strings["Website SSL certificate is not valid. Please correct."] = "Le certificat SSL n'est pas valide. Corrigez le.";
+App::$strings["[\$Projectname] Cron tasks not running on %s"] = "";
+App::$strings["Cron/Scheduled tasks not running."] = "Les taches planifiées ne tournent pas.";
+App::$strings["never"] = "jamais";
+App::$strings["Focus (Hubzilla default)"] = "Focus (par défaut pour Hubzilla)";
+App::$strings["Theme settings"] = "Paramètres du thème";
+App::$strings["Narrow navbar"] = "Barre de navigation fine";
+App::$strings["Navigation bar background color"] = "Couleur de fond de la barre de navigation";
+App::$strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
+App::$strings["Navigation bar active icon color "] = "Couleur de l'icône active de la barre de navigation";
+App::$strings["Link color"] = "";
+App::$strings["Set font-color for banner"] = "Définir la couleur du texte de la bannière";
+App::$strings["Set the background color"] = "Définir la couleur d'arrière-plan";
+App::$strings["Set the background image"] = "Définir l'image d'arrière-plan";
+App::$strings["Set the background color of items"] = "Définir la couleur de fond des contributions";
+App::$strings["Set the background color of comments"] = "Couleur de fond des commentaires";
+App::$strings["Set font-size for the entire application"] = "Définir la taille de police pour l'application entière";
+App::$strings["Examples: 87.5%, 14px"] = "";
+App::$strings["Set font-color for posts and comments"] = "Définir la couleur de police pour les contributions et commentaires";
+App::$strings["Set radius of corners"] = "Définir le rayon des arrondis";
+App::$strings["Example: 4px"] = "";
+App::$strings["Set shadow depth of photos"] = "Définir la profondeur de l'ombre des photos";
+App::$strings["Set maximum width of content region in pixel"] = "Définir la largeur maximale de la zone des contenus";
+App::$strings["Leave empty for default width"] = "Laissez vide pour avoir la largeur par défaut";
+App::$strings["Left align page content"] = "Aligner à gauche le contenu de la page";
+App::$strings["Set size of conversation author photo"] = "Définir la taille de la photo de l'auteur d'une conversation";
+App::$strings["Set size of followup author photos"] = "Définir la taille de la photo de l'auteur d'une réponse";
+App::$strings["Errors encountered deleting database table "] = "Des erreurs ont eu lieu lors de la suppression de la table de la base de données.";
+App::$strings["Submit Settings"] = "Emvoyer les paramètres";
+App::$strings["Drop tables when uninstalling?"] = "Lors de la désinstallation, purger les tables?";
+App::$strings["If checked, the Rendezvous database tables will be deleted when the plugin is uninstalled."] = "Si cette case est cochée, les tables de la base Rendezvous seront supprimées lorsque le plugin sera désinstallé.";
+App::$strings["Mapbox Access Token"] = "Jeton d'accès à la mapbox.";
+App::$strings["If you enter a Mapbox access token, it will be used to retrieve map tiles from Mapbox instead of the default OpenStreetMap tile server."] = "Si vous entrez un jeton d'accès Mapbox, il doit être utilisé pour récupérer les cartes à partir de Mapbox au lieu du serveur par défaut OpenStreetMap.";
+App::$strings["Rendezvous"] = "Rendezvous";
+App::$strings["This identity has been deleted by another member due to inactivity. Please press the \"New identity\" button or refresh the page to register a new identity. You may use the same name."] = "Cette identité a été supprimée par un autre membre en raison de l'inactivité. Appuyez sur le bouton \"Nouvelle identité\" ou actualisez la page pour enregistrer une nouvelle identité. Vous pouvez utiliser le même nom.";
+App::$strings["Welcome to Rendezvous!"] = "Bienvenue dans Rendevzvous!";
+App::$strings["Enter your name to join this rendezvous. To begin sharing your location with the other members, tap the GPS control. When your location is discovered, a red dot will appear and others will be able to see you on the map."] = "Entrez votre nom pour rejoindre ce rendez-vous. Pour commencer à partager votre emplacement avec les autres membres, appuyez sur le contrôle GPS. Lorsque votre emplacement est découvert, un point rouge apparaîtra et les autres seront en mesure de vous voir sur la carte.";
+App::$strings["Let's meet here"] = "Rencontrez-vous ici";
+App::$strings["New marker"] = "Nouveau marqueur";
+App::$strings["Edit marker"] = "Éditer le marqueur";
+App::$strings["New identity"] = "Nouvelle identité";
+App::$strings["Delete marker"] = "Supprimer le marqueur";
+App::$strings["Delete member"] = "Supprimer le membre";
+App::$strings["Edit proximity alert"] = "Éditer l'alerte de proximité";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera émise lorsque ce membre se trouve dans un certain périmètre autour de vous. Entrer un rayon en mètres (0 pour désactiver):";
+App::$strings["distance"] = "distance";
+App::$strings["Proximity alert distance (meters)"] = "Distance d'alerte de proximité (mètres)";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Une alerte de proximité sera déclenchée quand vous serez à une certaine distance du marqueur d'emplacement.<br><br>Indiquez une distance en mètres (0 pour désactiver)&nbsp;:";
+App::$strings["Marker proximity alert"] = "Alerte de proximité de marqueur";
+App::$strings["Reminder note"] = "Note de rappel";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Saisissez une note à afficher quand vous serez à la distance indiquée...";
+App::$strings["Add new rendezvous"] = "Ajouter un nouveau rendezvous";
+App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe.";
+App::$strings["Some setting"] = "Un certain paramètre";
+App::$strings["A setting"] = "Un paramètre";
+App::$strings["Skeleton Settings"] = "Paramètres du squelette";
+App::$strings["GNU-Social Protocol Settings updated."] = "";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "";
+App::$strings["GNU-Social Protocol Settings"] = "";
+App::$strings["Follow"] = "";
+App::$strings["%1\$s is now following %2\$s"] = "";
+App::$strings["INVALID EVENT DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
+App::$strings["Summary: "] = "Sommaire :";
+App::$strings["Date: "] = "Date :";
+App::$strings["Reason: "] = "Raison :";
+App::$strings["INVALID CARD DISMISSED!"] = "ÉVÉNEMENT INVALIDE REJETÉ!";
+App::$strings["Name: "] = "Nom :";
+App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Vous avez activé ce plugin dans Fonctionalités/Paramètres des extensions > CalDAV/CardDAV Paramètres avant que vous puissiez l'utiliser.";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Exemple : YYYY-MM-DD HH:mm";
+App::$strings["End date and time"] = "Date et heure de fin";
+App::$strings["List month"] = "Liste mois";
+App::$strings["List week"] = "Liste semaine";
+App::$strings["List day"] = "Liste jour";
+App::$strings["More"] = "Plus";
+App::$strings["Less"] = "Moins";
+App::$strings["Select calendar"] = "Sélectionner un calendrier";
+App::$strings["Delete all"] = "Tout supprimer";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Désolé ! L'édition d'événements récurrents n'est pas encore implémenté.";
+App::$strings["Errors encountered creating database table: "] = "Des erreurs se sont produites lors de la création de la table de la base de données :";
+App::$strings["Default Calendar"] = "Agenda par défaut";
+App::$strings["Default Addressbook"] = "Carnet d'adresses par défaut";
+App::$strings["CalDAV/CardDAV Settings saved."] = "Les paramètres CalDAV/CardDAV ont été sauvegardés.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Activer le serveur CalDAV/CardDAV pour ce canal";
+App::$strings["Your CalDAV resources are located at %s "] = "Vos ressources CalDAV sont situées à %s";
+App::$strings["Your CardDAV resources are located at %s "] = "Vos ressources CardDAV sont situées à %s";
+App::$strings["CalDAV/CardDAV Settings"] = "Paramètres CalDAV/CardDAV";
+App::$strings["Home, Voice"] = "Domicile, Voix";
+App::$strings["Home, Fax"] = "Domicile, Fax";
+App::$strings["Work, Voice"] = "Travail, Voix";
+App::$strings["Work, Fax"] = "Travail, Fax";
+App::$strings["Select Channel"] = "Sélectionner un canal";
+App::$strings["Read-write"] = "Lire et écrire";
+App::$strings["Read-only"] = "Lire uniquement";
+App::$strings["My Calendars"] = "Mes agendas";
+App::$strings["Shared Calendars"] = "Agendas partagés";
+App::$strings["Share this calendar"] = "Partager cet agenda";
+App::$strings["Calendar name and color"] = "Nom et couleur de l'agenda";
+App::$strings["Create new calendar"] = "Créer un nouvel agenda";
+App::$strings["Calendar Name"] = "Nom de l'agenda";
+App::$strings["Calendar Tools"] = "Outils pour les agendas";
+App::$strings["Import calendar"] = "Importer un agenda";
+App::$strings["Select a calendar to import to"] = "Sélectionner un agenda à importer dans";
+App::$strings["Addressbooks"] = "Carnet d'adresses";
+App::$strings["Addressbook name"] = "Nom du carnet d'adresses";
+App::$strings["Create new addressbook"] = "Créer un nouveau carnet d'adresses";
+App::$strings["Addressbook Name"] = "Nom du carnet d'adresses";
+App::$strings["Addressbook Tools"] = "Outils pour les carnets d'adresses";
+App::$strings["Import addressbook"] = "Importer un carnet d'adresses";
+App::$strings["Select an addressbook to import to"] = "Sélectionner un carnet d'adresses à importer dans";
+App::$strings["Planets Settings updated."] = "Paramètres Planets mis à jour.";
+App::$strings["Enable Planets Plugin"] = "Activer le plugin Planets";
+App::$strings["Planets Settings"] = "Paramètres Planets";
+App::$strings["System defaults:"] = "Paramètres par défaut du système :";
+App::$strings["Preferred Clipart IDs"] = "ID Clipart préférées";
+App::$strings["List of preferred clipart ids. These will be shown first."] = "Liste des ids clipart préférése. Celles-ci seront montrées en premier.";
+App::$strings["Default Search Term"] = "Terme de recherche par défaut";
+App::$strings["The default search term. These will be shown second."] = "Le terme de recherche par défaut. Ceci sera affiché en second.";
+App::$strings["Return After"] = "Retourner ensuite";
+App::$strings["Page to load after image selection."] = "Page à afficher après la sélection de l'image.";
App::$strings["Edit Profile"] = "Éditeur de profil";
-App::$strings["Edit your profile"] = "Modifier votre profil";
-App::$strings["Your photos"] = "Vos photos";
-App::$strings["Your files"] = "Vos fichiers";
-App::$strings["Your chatrooms"] = "Vos salons";
-App::$strings["Bookmarks"] = "Favoris";
-App::$strings["Your bookmarks"] = "Vos favoris";
-App::$strings["Your webpages"] = "Vos pages web";
-App::$strings["Sign in"] = "Connexion";
-App::$strings["%s - click to logout"] = "%s - cliquer ici pour déconnecter";
-App::$strings["Remote authentication"] = "Authentification distante";
-App::$strings["Click to authenticate to your home hub"] = "S'authentifier auprès de votre hub principal";
-App::$strings["Home Page"] = "Page d'accueil";
-App::$strings["Create an account"] = "Créer un compte";
-App::$strings["Help and documentation"] = "Aide et documentation";
-App::$strings["Applications, utilities, links, games"] = "Applications, utilitaires, liens, jeux";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Recherche @nom, #tag, contenu";
-App::$strings["Channel Directory"] = "Annuaire des canaux";
-App::$strings["Your grid"] = "Votre réseau";
-App::$strings["Mark all grid notifications seen"] = "Marquer toutes les notifications du réseau comme vues";
-App::$strings["Channel home"] = "Mon canal";
-App::$strings["Mark all channel notifications seen"] = "Marquer toutes les notifications du canal comme vues";
-App::$strings["Notices"] = "Notifications";
-App::$strings["Notifications"] = "Notifications";
-App::$strings["See all notifications"] = "Voir toutes les notifications";
-App::$strings["Private mail"] = "Messages privés";
-App::$strings["See all private messages"] = "Voir tous les messages privés";
-App::$strings["Mark all private messages seen"] = "Marquer tous les messages privés comme vus";
-App::$strings["Event Calendar"] = "Calendrier des événements";
-App::$strings["See all events"] = "Voir tous les événements";
-App::$strings["Mark all events seen"] = "Marquer tous les événements comme vus";
-App::$strings["Manage Your Channels"] = "Gérer vos canaux";
-App::$strings["Account/Channel Settings"] = "Paramètres du Compte/Canal";
-App::$strings["Site Setup and Configuration"] = "Configuration du site";
-App::$strings["Loading..."] = "Chargement...";
-App::$strings["@name, #tag, ?doc, content"] = "@nom, #étiquette, ?doc, contenu";
-App::$strings["Please wait..."] = "Merci de patienter...";
-App::$strings["New window"] = "Nouvelle fenêtre";
-App::$strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre ou un onglet différent";
-App::$strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
-App::$strings["%d invitation available"] = array(
- 0 => "%d invitation disponible",
- 1 => "%d invitations disponibles",
-);
-App::$strings["Find Channels"] = "Trouver des canaux";
-App::$strings["Enter name or interest"] = "Saisir nom ou centre d'intérêt";
-App::$strings["Connect/Follow"] = "Ajouter/Suivre";
-App::$strings["Examples: Robert Morgenstein, Fishing"] = "Exemples: Guillaume Martin, Course à pieds";
-App::$strings["Random Profile"] = "Un profil au hasard";
-App::$strings["Invite Friends"] = "Inviter des amis";
-App::$strings["Advanced example: name=fred and country=iceland"] = "Exemple avancé&nbsp;: name=fred and country=iceland";
-App::$strings["%d connection in common"] = array(
- 0 => "%d contact en commun",
- 1 => "%d contacts en commun",
-);
-App::$strings["show more"] = "montrer plus";
+App::$strings["Profile List"] = "Liste de profil";
+App::$strings["Order of Preferred"] = "Tri selon les préférences";
+App::$strings["Sort order of preferred clipart ids."] = "Ordre de tri des ids de clipart préférés.";
+App::$strings["Newest first"] = "Les plus récents en premier";
+App::$strings["As entered"] = "Comme entrés";
+App::$strings["Order of other"] = "Tri selon autre";
+App::$strings["Sort order of other clipart ids."] = "Ordre de tri des autres clipart ids.";
+App::$strings["Most downloaded first"] = "Les plus téléchargés en premier";
+App::$strings["Most liked first"] = "Les plus aimés en premier";
+App::$strings["Preferred IDs Message"] = "IDs des messages préférés";
+App::$strings["Message to display above preferred results."] = "Message à afficher au-dessus de la liste des résultats préférés.";
+App::$strings["Uploaded by: "] = "Téléversé par :";
+App::$strings["Drawn by: "] = "Dessiné par :";
+App::$strings["Or select from a free OpenClipart.org image:"] = "ou sélectionner une image libre d'OpenClipart.org :";
+App::$strings["Search Term"] = "Terme de recherche";
+App::$strings["Unknown error. Please try again later."] = "Erreur inconnue. Veuillez essayer à nouveau plus tard.";
+App::$strings["Profile photo updated successfully."] = "Photo de profil actualisée avec succès.";
+App::$strings["Flag Adult Photos"] = "Photo pour adulte";
+App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Fourni l'option d'édition d'une photo afin de cacher des photos inappropriées de la vue d''album par défaut";
+App::$strings["Post to WordPress"] = "Publier sur Wordpress";
+App::$strings["Enable WordPress Post Plugin"] = "Activer l'extension de publication WordPress";
+App::$strings["WordPress username"] = "Identifiant de connexion WordPress";
+App::$strings["WordPress password"] = "Mot de passe de connexion WordPress";
+App::$strings["WordPress API URL"] = "URL de l'API WordPress";
+App::$strings["Typically https://your-blog.tld/xmlrpc.php"] = "Typiquement https://your-blog.tld/xmlrpc.php";
+App::$strings["WordPress blogid"] = "ID de votre blog WordPress";
+App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Pour les sites multi-utilisateurs comme wordpress.com, sinon laisser vide";
+App::$strings["Post to WordPress by default"] = "Par défaut, publier sur WordPress";
+App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Transférer les commentaires (nécessite le plugin hubzila_wp)";
+App::$strings["WordPress Post Settings"] = "Paramètres de publications WordPress";
+App::$strings["Wordpress Settings saved."] = "Les paramètres WordPress ont été sauvegardés.";
+App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Ce plugin cherche dans les publications les mots/textes que vous spécifiez ci-dessous, et réduit tout contenu contenant ces mots-clés afin qu'ils ne s'affichent pas à des moments inappropriés, tels que les insinuations sexuelles qui peuvent être inappropriées dans un contexte de travail. Il est poli et recommandé de marquer tout contenu contenant de la nudité avec #NSFW. Ce filtre peut également correspondre à tout autre mot/texte que vous spécifiez et peut ainsi être utilisé comme un filtre de contenu à usage général.";
+App::$strings["Enable Content filter"] = "Activer le filtrage des contenus";
+App::$strings["Comma separated list of keywords to hide"] = "Liste séparée par des virgules des mots-clés à cacher";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Mot, /expression-régulière/, lang=xx, lang!=xx";
+App::$strings["Not Safe For Work Settings"] = "Paramètres NSFW (Not Safe For Work)";
+App::$strings["General Purpose Content Filter"] = "Filtre de contenu sujet général";
+App::$strings["NSFW Settings saved."] = "Paramètres NSFW sauvegardés.";
+App::$strings["Possible adult content"] = "Contenu pour adulte probable";
+App::$strings["%s - view"] = "";
+App::$strings["Post to Insanejournal"] = "Publier sur InsaneJournal";
+App::$strings["Enable InsaneJournal Post Plugin"] = "Activer le plugin de publication InsaneJournal";
+App::$strings["InsaneJournal username"] = "Identifiant InsaneJournal";
+App::$strings["InsaneJournal password"] = "Mot de passe InsaneJournal";
+App::$strings["Post to InsaneJournal by default"] = "Par défaut, publier dans InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "Paramètres de publication de InsaneJournal";
+App::$strings["Insane Journal Settings saved."] = "Les paramètres d'InsaneJournal ont été sauvegardés";
+App::$strings["Upload a file"] = "Téléverser un fichier";
+App::$strings["Drop files here to upload"] = "Glisser les fichiers ici pour téléversement";
+App::$strings["Failed"] = "Échec";
+App::$strings["No files were uploaded."] = "Aucun fichier n'a été téléversé.";
+App::$strings["Uploaded file is empty"] = "Le fichier téléversé est vide";
+App::$strings["Image exceeds size limit of "] = "L'image excède la taille limite de";
+App::$strings["File has an invalid extension, it should be one of "] = "L'extension du fichier est invalide, elle doit être l'une des suivantes";
+App::$strings["Upload was cancelled, or server error encountered"] = "Le téléversement a été annulé, ou le serveur a rencontré une erreur";
+App::$strings["Post to Dreamwidth"] = "Publier sur Dreamwidth";
+App::$strings["Enable Dreamwidth Post Plugin"] = "Activer le plugin de publication Dreamwidth";
+App::$strings["Dreamwidth username"] = "Nom d'utilisateur Dreamwidth";
+App::$strings["Dreamwidth password"] = "Mot de passe Dreamwidth";
+App::$strings["Post to Dreamwidth by default"] = "Publication avec Dreamwidth par défaut";
+App::$strings["Dreamwidth Post Settings"] = "Paramètres de publication Dreamwidth";
+App::$strings["Install Firefox Sharing Tools"] = "Installer Firefox Sharing Tools";
+App::$strings["Share content from Firefox to \$Projectname"] = "Partager du contenu depuis Firefox avec \$Projectname";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "Installer Firefox Sharing Tools sur ce navigateur";
+App::$strings["Hubzilla Directory Stats"] = "Statistiques de l'annuaire Hubzilla";
+App::$strings["Total Hubs"] = "Total de Hubs";
+App::$strings["Hubzilla Hubs"] = "Hubs Hubzilla";
+App::$strings["Friendica Hubs"] = "Hubs Friendica";
+App::$strings["Diaspora Pods"] = "Pods Diaspora";
+App::$strings["Hubzilla Channels"] = "Canaux Hubzilla";
+App::$strings["Friendica Channels"] = "Canaux Friendica";
+App::$strings["Diaspora Channels"] = "Canaux Diaspora";
+App::$strings["Aged 35 and above"] = "Âgé de 35 ans et plus";
+App::$strings["Aged 34 and under"] = "Âgé de 34 et moins";
+App::$strings["Average Age"] = "Âge moyen";
+App::$strings["Known Chatrooms"] = "Salons de discussion connus";
+App::$strings["Known Tags"] = "Étiquettes connues";
+App::$strings["Please note Diaspora and Friendica statistics are merely those **this directory** is aware of, and not all those known in the network. This also applies to chatrooms,"] = "Veuillez noter que les statistiques de Diaspora et Friendica sont simplement celles dont **ce répertoire** est au courant, et pas toutes celles connues dans le réseau. Cela s'applique également aux salles de discussion,";
+App::$strings["Email notification hub"] = "Notification par mail du hub";
+App::$strings["Hostname"] = "Nom d'hôte";
+App::$strings["Mailhost Settings"] = "Paramètres mail de l'hôte";
+App::$strings["MAILHOST Settings saved."] = "Paramètres mail de l'hôte sauvegardés.";
+App::$strings["Your Webbie:"] = "Vous êtes Webbie :";
+App::$strings["Fontsize (px):"] = "Taille de la police (px) :";
+App::$strings["Link:"] = "Lien :";
+App::$strings["Like us on Hubzilla"] = "Aimez-nous sur Hubzilla";
+App::$strings["Embed:"] = "Embarqué :";
+App::$strings["Photos imported"] = "Photos importées";
+App::$strings["Redmatrix Photo Album Import"] = "Import de l'album photo Redmatrix";
+App::$strings["This will import all your Redmatrix photo albums to this channel."] = "Ceci va importer l'intégralité de vos albums photos Redmatrix dans ce canal.";
+App::$strings["Redmatrix Server base URL"] = "URL de base du serveur Redmatrix";
+App::$strings["Redmatrix Login Username"] = "Identifiant de connexion Redmatrix";
+App::$strings["Redmatrix Login Password"] = "Mot de passe de connexion Redmatrix";
+App::$strings["Import just this album"] = "Importer uniquement cet album";
+App::$strings["Leave blank to import all albums"] = "Laisser vide pour importer tous les albums";
+App::$strings["Maximum count to import"] = "Nombre maximum de comptes à importer";
+App::$strings["0 or blank to import all available"] = "0 ou vide pour importer tout ce qui est disponible";
+App::$strings["Channels to auto connect"] = "Canaux à connecter automatiqument";
+App::$strings["Comma separated list"] = "Liste séparée par des virgules";
+App::$strings["Popular Channels"] = "Canaux populaires";
+App::$strings["IRC Settings"] = "Paramètres IRC";
+App::$strings["IRC settings saved."] = "Paramètres IRC sauvegardés";
+App::$strings["IRC Chatroom"] = "Salon de discussion IRC";
+App::$strings["Post to LiveJournal"] = "Publier sur LiveJournal";
+App::$strings["Enable LiveJournal Post Plugin"] = "Activer le plugin de publication LiveJournal";
+App::$strings["LiveJournal username"] = "Identifiant LiveJournal";
+App::$strings["LiveJournal password"] = "Mot de passe LiveJournal";
+App::$strings["Post to LiveJournal by default"] = "Par défaut, publier sur LiveJournal";
+App::$strings["LiveJournal Post Settings"] = "Paramètres de publication LiveJournal";
+App::$strings["LiveJournal Settings saved."] = "Paramètres LiveJournal sauvegardés.";
+App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Nous avons rencontrons un problème lors de l'identification avec l'OpenID que vous avez fournie. Veuillez vérifier que vous avez correctement écrit votre ID.";
+App::$strings["The error message was:"] = "Le message d'erreur était :";
+App::$strings["First Name"] = "Prénom";
+App::$strings["Last Name"] = "Nom";
+App::$strings["Nickname"] = "Surnom";
+App::$strings["Full Name"] = "Nom complet";
+App::$strings["Profile Photo 16px"] = "Photo de profil 16px";
+App::$strings["Profile Photo 32px"] = "Photo de profil 32px";
+App::$strings["Profile Photo 48px"] = "Photo de profil 48px";
+App::$strings["Profile Photo 64px"] = "Photo de profil 64px";
+App::$strings["Profile Photo 80px"] = "Photo de profil 80px";
+App::$strings["Profile Photo 128px"] = "Photo de profil 128px";
+App::$strings["Timezone"] = "Fuseau horaire";
+App::$strings["Birth Year"] = "Années de naissance";
+App::$strings["Birth Month"] = "Mois de naissance";
+App::$strings["Birth Day"] = "Jour de naissance";
+App::$strings["Birthdate"] = "Date de naissance";
+App::$strings["OpenID protocol error. No ID returned."] = "Erreur du protocole OpenID. Aucune ID trouvée.";
+App::$strings["Login failed."] = "Échec de la connexion.";
+App::$strings["Male"] = "Homme";
+App::$strings["Female"] = "Femme";
+App::$strings["You're welcome."] = "Bienvenue.";
+App::$strings["Ah shucks..."] = "Ah m…";
+App::$strings["Don't mention it."] = "De rien.";
+App::$strings["&lt;blush&gt;"] = "&lt;rougit&gt;";
+App::$strings["Page to load after login"] = "Page à charger après l'identification";
+App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Exemples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (laisser vide pour la page par défaut du réseau (grille).";
+App::$strings["Startpage Settings"] = "Paramètres de la page de démarrage";
+App::$strings["bitchslap"] = "giffler";
+App::$strings["bitchslapped"] = "gifflé(e)";
+App::$strings["shag"] = "baiser";
+App::$strings["shagged"] = "baisé";
+App::$strings["patent"] = "breveté";
+App::$strings["patented"] = "être breveté";
+App::$strings["hug"] = "étreindre";
+App::$strings["hugged"] = "être étreint";
+App::$strings["murder"] = "assassiner";
+App::$strings["murdered"] = "être assassiné";
+App::$strings["worship"] = "vénérer";
+App::$strings["worshipped"] = "être vénéré";
+App::$strings["kiss"] = "embrasser";
+App::$strings["kissed"] = "embrassé";
+App::$strings["tempt"] = "tenter";
+App::$strings["tempted"] = "tenté";
+App::$strings["raise eyebrows at"] = "soulever les sourcils à la vue de";
+App::$strings["raised their eyebrows at"] = "sourcils soulevés à la vue de";
+App::$strings["insult"] = "insulter";
+App::$strings["insulted"] = "insulté";
+App::$strings["praise"] = "louer";
+App::$strings["praised"] = "loué";
+App::$strings["be dubious of"] = "douter de";
+App::$strings["was dubious of"] = "avoir douté de";
+App::$strings["eat"] = "manger";
+App::$strings["ate"] = "a mangé";
+App::$strings["giggle and fawn at"] = "séduire, charmer";
+App::$strings["giggled and fawned at"] = "séduit(e), charmé(e)";
+App::$strings["doubt"] = "doute";
+App::$strings["doubted"] = "a douté";
+App::$strings["glare"] = "jeter un regard";
+App::$strings["glared at"] = "a jeté un regard à ";
+App::$strings["fuck"] = "baiser";
+App::$strings["fucked"] = "être baisé";
+App::$strings["bonk"] = "baiser";
+App::$strings["bonked"] = "baisé(e)";
+App::$strings["declare undying love for"] = "Déclarer un amour éternel pour";
+App::$strings["declared undying love for"] = "A déclaré l'amour éternel pour";
+App::$strings["Diaspora Protocol Settings updated."] = "";
+App::$strings["Enable the Diaspora protocol for this channel"] = "";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "";
+App::$strings["Diaspora Protocol Settings"] = "";
+App::$strings["No username found in import file."] = "";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Impossible de créer une adresse de canal unique. Echec de l'import.";
+App::$strings["Error retrieving wiki"] = "Erreur lors de la récupération du wiki";
+App::$strings["Error creating zip file export folder"] = "Erreur lors de la création du dossier d'exportation du fichier zip";
+App::$strings["Error downloading wiki: "] = "Erreur lors du téléchargement du wiki:";
+App::$strings["Your account on %s will expire in a few days."] = "Votre compte sur %s expirera dans quelques jours.";
+App::$strings["Your $Productname test account is about to expire."] = "Votre compte de test $NomDeProduit est sur le point d'expirer.";
+App::$strings["Enable Rainbowtag"] = "Activer Rainbowtag";
+App::$strings["Rainbowtag Settings"] = "Paramètres Rainbowtag";
+App::$strings["Rainbowtag Settings saved."] = "Paramètres Rainbowtag sauvegardés.";
+App::$strings["Show Upload Limits"] = "Afficher les limites de débit ascendant (upload)";
+App::$strings["Hubzilla configured maximum size: "] = "Taille maximale configurée par Hubzilla:";
+App::$strings["PHP upload_max_filesize: "] = "PHP upload_max_filesize: ";
+App::$strings["PHP post_max_size (must be larger than upload_max_filesize): "] = "PHP post_max_size (must be larger than upload_max_filesize): ";
+App::$strings["Recent Channel/Profile Viewers"] = "Visiteurs récents du canal/profil";
+App::$strings["This plugin/addon has not been configured."] = "Cette extension n'a pas été configurée.";
+App::$strings["Please visit the Visage settings on %s"] = "Veuillez visiter les paramètres de Visage sur %s";
+App::$strings["your feature settings page"] = "La page des paramètres de vos fonctionnalités";
+App::$strings["No entries."] = "Aucune entrée.";
+App::$strings["Enable Visage Visitor Logging"] = "Activer la connexion Visage Visitor";
+App::$strings["Visage Settings"] = "Paramètres Visage";
+App::$strings["Nsabait Settings updated."] = "Les paramètres Nsabait ont été enregistrés.";
+App::$strings["Enable NSAbait Plugin"] = "Activer le plugin NSAbait";
+App::$strings["NSAbait Settings"] = "Paramètres NSAbait";
+App::$strings["Send test email"] = "Envoyer un mail de test";
+App::$strings["No recipients found."] = "Aucun destinataire trouvé.";
+App::$strings["Mail sent."] = "Mail envoyé.";
+App::$strings["Sending of mail failed."] = "L'envoi du mail a échoué.";
+App::$strings["Mail Test"] = "Test du mail";
+App::$strings["Message subject"] = "Objet du message";
+App::$strings["Reconnecting %d connections"] = "";
+App::$strings["Diaspora Reconnect"] = "";
+App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
+App::$strings["Reconnect"] = "";
+App::$strings["View Larger"] = "Afficher en plus grand";
+App::$strings["Tile Server URL"] = "URL de la tuile du serveur";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">serveurs de cartes publics</a>";
+App::$strings["Nominatim (reverse geocoding) Server URL"] = "URL du serveur Nominatim (géocodage inversé)";
+App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">Nominatim servers</a>"] = "Une liste de <a href=\"http://wiki.openstreetmap.org/wiki/Nominatim\" target=\"_blank\">serveurs Nominatim</a>";
+App::$strings["Default zoom"] = "Zoom par défaut";
+App::$strings["The default zoom level. (1:world, 18:highest, also depends on tile server)"] = "Le niveau de zoom par défaut. (1: monde, 18: plus élevé, dépend également du serveur de tuiles)";
+App::$strings["Include marker on map"] = "Inclure le marqueur sur la carte";
+App::$strings["Include a marker on the map."] = "Inclure un marqueur sur la carte.";
+App::$strings["Save Settings"] = "Sauvegarder les paramètres";
+App::$strings["text to include in all outgoing posts from this site"] = "Texte à inclure dans tous les messages sortants de ce site";
+App::$strings["Post to Friendica"] = "Publier sur Friendica";
+App::$strings["rtof Settings saved."] = "Paramètres rtof sauvegardés.";
+App::$strings["Allow posting to Friendica"] = "Autoriser la publication sur Friendica";
+App::$strings["Send public postings to Friendica by default"] = "Par défaut, envoyer les publications publiques sur Friendica";
+App::$strings["Friendica API Path"] = "Chemin de l'API Friendica";
+App::$strings["https://{sitename}/api"] = "https://{nomdusite}/api";
+App::$strings["Friendica login name"] = "Identifiant de connexion Friendica";
+App::$strings["Friendica password"] = "Mot de passe de connexion Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Paramètres de publication de Hubzilla vers Friendica";
+App::$strings["Status:"] = "État&nbsp;:";
+App::$strings["Activate addon"] = "Activer l'extension";
+App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Cacher le widget de chat Jappixmini de l'interface web";
+App::$strings["Jabber username"] = "Identifiant Jabber";
+App::$strings["Jabber server"] = "Serveur Jabber";
+App::$strings["Jabber BOSH host URL"] = "Adresse hôte pour Jabber BOSH";
+App::$strings["Jabber password"] = "Mot de passe Jabber";
+App::$strings["Encrypt Jabber password with Hubzilla password"] = "Chiffrer le mot de passe Jabber avec le mot de passe Hubzilla";
+App::$strings["Hubzilla password"] = "Mot de passe Hubzilla";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Approuver automatiquement les demandes de connexion des contacts Hubzilla";
+App::$strings["Purge internal list of jabber addresses of contacts"] = "Purger la liste interne des adresses jabber des contacts";
+App::$strings["Configuration Help"] = "Aide pour la configuration";
+App::$strings["Jappix Mini Settings"] = "Paramètres de Jappix mini";
+App::$strings["Currently blocked"] = "Actuellement bloqué";
+App::$strings["No channels currently blocked"] = "Aucun canal n'est actuellement bloqué";
+App::$strings["\"Superblock\" Settings"] = "Paramètres \"Superblock\"";
+App::$strings["Block Completely"] = "Bloquer complètement";
+App::$strings["superblock settings updated"] = "Les paramètres du superblock ont été mis à jour";
+App::$strings["Federate"] = "Fédérer";
+App::$strings["nofed Settings saved."] = "Les paramètres nfed ont été enregistrés.";
+App::$strings["Allow Federation Toggle"] = "Autoriser la fédération avec Toggle";
+App::$strings["Federate posts by default"] = "Par défaut, fédérer les publications.";
+App::$strings["NoFed Settings"] = "Paramètres NoFed";
+App::$strings["Post to Red"] = "Publier sur Red";
+App::$strings["Channel is required."] = "Un canal est requis.";
+App::$strings["redred Settings saved."] = "Paramètres redred sauvegardés.";
+App::$strings["Allow posting to another Hubzilla Channel"] = "Autoriser la publication sur un autre canal Hubzilla";
+App::$strings["Send public postings to Hubzilla channel by default"] = "Par défaut, envoyer les publications publiques sur le canal Hubzilla";
+App::$strings["Hubzilla API Path"] = "Chemin de l'API Hubzilla";
+App::$strings["Hubzilla login name"] = "Identifiant de connexion Hubzilla";
+App::$strings["Hubzilla channel name"] = "Nom du canal Hubzilla";
+App::$strings["Hubzilla Crosspost Settings"] = "Paramètres Crosspost Hubzilla";
+App::$strings["Logfile archive directory"] = "Répertoire d'archivage du fichier journal";
+App::$strings["Directory to store rotated logs"] = "Répertoire où stocker les journaux de rotation";
+App::$strings["Logfile size in bytes before rotating"] = "Taille du fichier journal en octets avant la rotation";
+App::$strings["Number of logfiles to retain"] = "Nombre de fichiers de journal à conserver";
+App::$strings["Friendica Photo Album Import"] = "Importation de l'album photo Friendica ";
+App::$strings["This will import all your Friendica photo albums to this Red channel."] = "Ceci importera toutes vos albums photos Friendica dans ce canal Hubzilla.";
+App::$strings["Friendica Server base URL"] = "URL de base du serveur Friendica";
+App::$strings["Friendica Login Username"] = "Identifiant de connexion Friendica";
+App::$strings["Friendica Login Password"] = "Mot de passe de connexion Friendica";
+App::$strings["Project Servers and Resources"] = "Serveurs et ressources du projet";
+App::$strings["Project Creator and Tech Lead"] = "Créateur et Responsable Technique du projet";
+App::$strings["Admin, developer, directorymin, support bloke"] = "Administrateur, développeur, responsable d'annuaire, équipe support";
+App::$strings["And the hundreds of other people and organisations who helped make the Hubzilla possible."] = "Et les centaines d'autres personnes et organisations qui ont contribué à rendre le Hubzilla possible.";
+App::$strings["The Redmatrix/Hubzilla projects are provided primarily by volunteers giving their time and expertise - and often paying out of pocket for services they share with others."] = "Les projets Redmatrix / Hubzilla sont fournis principalement par des bénévoles qui donnent de leur temps et de leur expertise - et paient souvent de leur poche pour des services qu'ils partagent avec d'autres.";
+App::$strings["There is no corporate funding and no ads, and we do not collect and sell your personal information. (We don't control your personal information - <strong>you do</strong>.)"] = "Il n'y a ni financement d'entreprise ni publicités, et nous ne recueillons ni ne vendons vos données personnelles. (Nous ne contrôlons pas vos informations personnelles - vous le faites !)";
+App::$strings["Help support our ground-breaking work in decentralisation, web identity, and privacy."] = "Aider à soutenir notre travail novateur en matière de décentralisation, d'identité Web et de confidentialité.";
+App::$strings["Your donations keep servers and services running and also helps us to provide innovative new features and continued development."] = "Vos dons maintiennent les serveurs et les services en marche et nous aident également à fournir de nouvelles fonctionnalités innovantes et un développement continu.";
+App::$strings["Donate"] = "Donner";
+App::$strings["Choose a project, developer, or public hub to support with a one-time donation"] = "Choisissez un projet, un développeur ou un hub public à soutenir à l'aide d'un don unique";
+App::$strings["Donate Now"] = "Donner maintenant";
+App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla Project only)"] = "Or devenez un sponsor du projet (projet Hubzilla uniquement)";
+App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Veuillez indiquer si vous souhaitez que votre nom ou prénom (ou rien) apparaisse dans la liste de nos sponsors.";
+App::$strings["Sponsor"] = "Sponsors";
+App::$strings["Special thanks to: "] = "Remerciements particuliers à :";
+App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "Ceci est un dictionnaire d'accords de guitare assez complet et facile qui énumère la plupart des manières possibles de jouer un certain accord, à partir de la base de la touche jusqu'à quelques frettes au-delà de la douzième frette (au-delà de laquelle tout se répète). Un couple d'accordages non standard sont fournis au profit des joueurs de diapositives, etc.";
+App::$strings["Chord names start with a root note (A-G) and may include sharps (#) and flats (b). This software will parse most of the standard naming conventions such as maj, min, dim, sus(2 or 4), aug, with optional repeating elements."] = "Les noms des accords commencent par une note racine (A-G) et peuvent inclure des dièses (#) et des bémols (b). Ce logiciel analysera la plupart des conventions de dénomination standard telles que maj, min, dim, sus (2 ou 4), aug, avec des éléments répétitifs facultatifs.";
+App::$strings["Valid examples include A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ..."] = "Exemples valides comprennent A, A7, Am7, Amaj7, Amaj9, Ammaj7, Aadd4, Asus2Add4, E7b13b11 ...";
+App::$strings["Guitar Chords"] = "Acords de guitar";
+App::$strings["The complete online chord dictionary"] = "Le dictionnaire en ligne complet des accords";
+App::$strings["Tuning"] = "Réglage";
+App::$strings["Chord name: example: Em7"] = "Nom d'accord. Exemple : Em7.";
+App::$strings["Show for left handed stringing"] = "Montrer pour les gauchers";
+App::$strings["Quick Reference"] = "Référence rapide";
+App::$strings["Post to Libertree"] = "Publier sur Libertree";
+App::$strings["Enable Libertree Post Plugin"] = "Activer le plugin de publication Libertree";
+App::$strings["Libertree API token"] = "Jeton de l'API Libertree";
+App::$strings["Libertree site URL"] = "Adresse du site Libertree";
+App::$strings["Post to Libertree by default"] = "Par défaut, publier sur Libertree";
+App::$strings["Libertree Post Settings"] = "Paramètres de publication pour Libertree";
+App::$strings["Libertree Settings saved."] = "Paramètres de Libertree sauvegardés.";
+App::$strings["Flattr this!"] = "Flattr this!";
+App::$strings["Flattr widget settings updated."] = "Les paramètres du widget Flattr ont été mis à jour";
+App::$strings["Flattr user"] = "Utilisateur de Flattr";
+App::$strings["URL of the Thing to flattr"] = "URL de ce que vous voulez flattr";
+App::$strings["If empty channel URL is used"] = "Si une url vide est utilisée";
+App::$strings["Title of the Thing to flattr"] = "Titre de ce que vous voulez flattr";
+App::$strings["If empty \"channel name on The Hubzilla\" will be used"] = "Si vide, \"nom du canal sur Hubzilla\" sera utilisé";
+App::$strings["Static or dynamic flattr button"] = "Statique ou dynamique bouton Flattr";
+App::$strings["static"] = "statique";
+App::$strings["dynamic"] = "dynamique";
+App::$strings["Alignment of the widget"] = "Alignement du widget";
+App::$strings["left"] = "gauche";
+App::$strings["right"] = "droite";
+App::$strings["Enable Flattr widget"] = "Activer le widget Flattr";
+App::$strings["Flattr Widget Settings"] = "Paramètres du widget Flattr";
+App::$strings["Post to GNU social"] = "Publier sur GNU-social";
+App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Veuillez contacter l'administrateur de votre site. L'URL de l'API n'est pas valide.";
+App::$strings["We could not contact the GNU social API with the Path you entered."] = "Nous ne pouvons pas contacter l'API de GNU-social avec le chemin que vous avez entré.";
+App::$strings["GNU social settings updated."] = "Les paramètres GNU-social ont été mis à jour.";
+App::$strings["Globally Available GNU social OAuthKeys"] = "Les OAuthKeys GNU-social sont globalement disponibles.";
+App::$strings["There are preconfigured OAuth key pairs for some GNU social servers available. If you are using one of them, please use these credentials.<br />If not feel free to connect to any other GNU social instance (see below)."] = "Il existe des paires de clés OAuth préconfigurées pour certains serveurs GNU-social disponibles. Si vous utilisez l'un d'eux, utilisez ces informations d'identification.\nSi vous ne voulez pas vous connecter à une autre instance GNU social (voir ci-dessous).";
+App::$strings["Provide your own OAuth Credentials"] = "Fournissez vos propres informations d'identification OAuth";
+App::$strings["No consumer key pair for GNU social found. Register your Hubzilla Account as an desktop client on your GNU social account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Hubzilla installation at your favourite GNU social installation."] = "Aucune paire de clés utilisateur n'a été trouvée pour GNU-social. Enregistrer votre compte Hubzilla en tant que client de bureau sur votre compte GNU-social, puis copier la paire de clés utilisateur ici et entrer la racine de base de l'API.\nAvant d'enregistrer votre propre paire de clés OAuth, demandez à l'administrateur s'il existe déjà une paire de clés pour cette installation de Hubzilla à votre installation GNU-social préférée.";
+App::$strings["OAuth Consumer Key"] = "Clé d'utilisateur OAuth";
+App::$strings["OAuth Consumer Secret"] = "Secret d'utilisateur OAuth";
+App::$strings["Base API Path"] = "Chemin de l'API de base";
+App::$strings["Remember the trailing /"] = "N'oubliez pas le / final";
+App::$strings["GNU social application name"] = "Nom de l'application GNU-social";
+App::$strings["To connect to your GNU social account click the button below to get a security code from GNU social which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to GNU social."] = "Pour vous connecter à votre compte GNU-social, cliquez sur le bouton ci-dessous pour obtenir un code de sécurité de GNU-social. Vous devez le copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront visibles sur GNU-social.";
+App::$strings["Log in with GNU social"] = "Vous connecter avec GNU-social";
+App::$strings["Copy the security code from GNU social here"] = "Copier ici le code de sécurité de GNU-social.";
+App::$strings["Cancel Connection Process"] = "Annuler le processus de connexion";
+App::$strings["Current GNU social API is"] = "L'API GNU-social courante est";
+App::$strings["Cancel GNU social Connection"] = "Annuler la connexion GNU-social";
+App::$strings["Currently connected to: "] = "Actuellement connecté à :";
+App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Remarque : en raison de vos paramètres de confidentialité (masquer les détails de votre profil aux visiteurs inconnus? ), le lien potentiellement inclus dans les annonces publiques relayées sur GNU-social amènera le visiteur à une page vierge informant le visiteur que l'accès à votre profil a été restreint.";
+App::$strings["Allow posting to GNU social"] = "Autoriser la publication sur GNU-social";
+App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte GNU-social associé.";
+App::$strings["Post to GNU social by default"] = "Par défaut, publier sur GNU-social";
+App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte GNU-social associé";
+App::$strings["Clear OAuth configuration"] = "Effacer la configuration OAuth";
+App::$strings["GNU social Post Settings"] = "Paramètres de publication GNU-social";
+App::$strings["API URL"] = "URL de l'API";
+App::$strings["Application name"] = "Nom de l'application";
+App::$strings["QR code"] = "QR code";
+App::$strings["QR Generator"] = "Générateur de QRcode";
+App::$strings["Enter some text"] = "Entrer du texte";
+App::$strings["Invalid game."] = "Jeu invalide";
+App::$strings["You are not a player in this game."] = "Vous n'êtes pas un joueur de ce jeu.";
+App::$strings["You must be a local channel to create a game."] = "Vous devez être un canal local pour créer un jeu.";
+App::$strings["You must select one opponent that is not yourself."] = "Vous devez sélectionner un adversaire qui ne soit pas vous-même.";
+App::$strings["Creating new game..."] = "en train de créer un nouveau jeu…";
+App::$strings["You must select white or black."] = "Vous devez sélectionner les blancs ou les noirs.";
+App::$strings["Error creating new game."] = "Erreur lors de la création du nouveau jeu.";
+App::$strings["Requested channel is not available."] = "Canal demandé non disponible.";
+App::$strings["You must select a local channel /chess/channelname"] = "Vous devez sélectionner un canal local /échecs/nomducanal";
+App::$strings["Enable notifications"] = "Activer les notifications";
+App::$strings["Post to Twitter"] = "Publier sur Twitter";
+App::$strings["Twitter settings updated."] = "Les paramètres de Twitter ont été mis à jour.";
+App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Aucune paire de clés d'utilisateur pour Twitter n'a été trouvée. Veuillez contacter l'administrateur de votre site.";
+App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Dans cette instance de Hubzilla, le plugin Twitter a été activé, mais vous n'avez pas encore connecté votre compte à votre compte Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un code PIN de Twitter que vous devez copier dans la zone de saisie ci-dessous, puis soumettre le formulaire. Seuls vos messages publics seront publiés sur Twitter.";
+App::$strings["Log in with Twitter"] = "Connectez-vous avec votre compte Twitter";
+App::$strings["Copy the PIN from Twitter here"] = "Copier ici le PIN fourni par Twitter";
+App::$strings["<strong>Note:</strong> Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to Twitter will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Note : En raison de vos paramètres de confidentialité (Masquer les détails de votre profil aux visiteurs inconnus?), le lien potentiellement inclus dans les annonces publiques relayées vers Twitter amènera le visiteur à une page vierge l'informant que l'accès à votre profil a été restreint.";
+App::$strings["Allow posting to Twitter"] = "Autoriser la publication sur Twitter";
+App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte Twitter associé.";
+App::$strings["Send public postings to Twitter by default"] = "Par défaut, envoyer vos publications publiques sur Twitter.";
+App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Si cette option est activée, par défaut, vos publications publiques seront publiées sur le compte Twitter associé.";
+App::$strings["Twitter Post Settings"] = "Paramètres des publications Twitter";
+App::$strings["Deactivate the feature"] = "Désactiver la fonctionnalité";
+App::$strings["Hide the button and show the smilies directly."] = "Cacher le bouton et afficher les émoticônes directement.";
+App::$strings["Smileybutton Settings"] = "Paramètres du bouton des émoticônes";
+App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>.";
+App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out).";
+App::$strings["Piwik Base URL"] = "URL de base Piwik";
+App::$strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Chemin absolu vers votre installation Piwik. (sans le http/s, avec antislash)";
+App::$strings["Site ID"] = "ID du site";
+App::$strings["Show opt-out cookie link?"] = "Afficher le lien opt-out du cookie ?";
+App::$strings["Asynchronous tracking"] = "Traqueur asynchrone";
+App::$strings["Enable frontend JavaScript error tracking"] = "Activer le traqueur d'erreur du frontend JavaScript";
+App::$strings["This feature requires Piwik >= 2.2.0"] = "Cette fonctionnalité requiert une version de Piwik >=2.2.0";
+App::$strings["Edit your profile and change settings."] = "Éditer votre profil et changer les paramètres.";
+App::$strings["Click here to see activity from your connections."] = "Cliquer ici pour voir l'activité de vos connections.";
+App::$strings["Click here to see your channel home."] = "Cliquer ici pour voir votre canal principal.";
+App::$strings["You can access your private messages from here."] = "Vous pouvez accéder à vos messages privés à partir d'ici.";
+App::$strings["Create new events here."] = "Créer de nouveaux événements ici.";
+App::$strings["You can accept new connections and change permissions for existing ones here. You can also e.g. create groups of contacts."] = "Vous pouvez accepter de nouvelles connections et changer les permissions des connections existantes. Vous pouvez également créer des groupes de contacts.";
+App::$strings["System notifications will arrive here"] = "Les notifications du système arriveront ici.";
+App::$strings["Search for content and users"] = "Rechercher du contenu ou des utilisateurs";
+App::$strings["Browse for new contacts"] = "Rechercher de nouveaux contacts";
+App::$strings["Launch installed apps"] = "Démarrer des applications installées";
+App::$strings["Looking for help? Click here."] = "Un peu d'aide ? Cliquer ici.";
+App::$strings["New events have occurred in your network. Click here to see what has happened!"] = "De nouveaux événement se sont produits dans votre réseau. Cliquer ici pour voir ce qui s'est passé !";
+App::$strings["You have received a new private message. Click here to see from who!"] = "Vous avez reçu un nouveau message privé. Cliquer ici pour voir qui vous écrit !";
+App::$strings["There are events this week. Click here too see which!"] = "Il y a des événements cette semaine. Cliquer ici pour voir lesquels !";
+App::$strings["You have received a new introduction. Click here to see who!"] = "Vous avez reçu une nouvelle demande de relation. Cliquer ici pour voir de qui !";
+App::$strings["There is a new system notification. Click here to see what has happened!"] = "Vous avez reçu une notification du système. Cliquer ici pour voir ce qui se passe !";
+App::$strings["Click here to share text, images, videos and sound."] = "Cliquer ici pour partager du texte, des images, des vidéos ou du son.";
+App::$strings["You can write an optional title for your update (good for long posts)."] = "Vous pouvez ajouter à votre mise à jour un titre facultatif (pratique pour de longues publications).";
+App::$strings["Entering some categories here makes it easier to find your post later."] = "Renseigner certaines catégories ici permet de retrouver plus facilement votre message plus tard.";
+App::$strings["Share photos, links, location, etc."] = "Partager des photos, des liens, des localisations, etc.";
+App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "Envie de partager un contenu pour une durée limitée ? Faites-le expirer à une certaine date.";
+App::$strings["You can password protect content."] = "Vous pouvez protéger un contenu avec un mot de passe.";
+App::$strings["Choose who you share with."] = "Choisir avec qui vous partagez.";
+App::$strings["Click here when you are done."] = "Cliquer ici quand vous avez fini.";
+App::$strings["Adjust from which channels posts should be displayed."] = "Préciser de quels canaux les publications seront affichées.";
+App::$strings["Only show posts from channels in the specified privacy group."] = "Afficher uniquement les messages des canaux appartenant au groupe de contacts spécifié.";
+App::$strings["Easily find posts containing tags (keywords preceded by the \"#\" symbol)."] = "Trouvez facilement des publications contenant des tags (mots-clés précédés du symbole \"#\").";
+App::$strings["Easily find posts in given category."] = "Trouvez facilement des publications dans une catégorie donnée.";
+App::$strings["Easily find posts by date."] = "Trouvez facilement des publications en fonction de leur date.";
+App::$strings["Suggested users who have volounteered to be shown as suggestions, and who we think you might find interesting."] = "Voici des utilisateurs que vous pourriez trouver intéressants. Ces utilisateurs se sont portés volontaires pour être affichés comme exemples.";
+App::$strings["Here you see channels you have connected to."] = "Retrouvez ici les canaux auxquels vous vous êtes connectés.";
+App::$strings["Save your search so you can repeat it at a later date."] = "Enregistrer votre recherche de façon à pouvoir la répéter plus tard.";
+App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Si vous voyez cette icône, vous pouvez être sûr que l'expéditeur est qui il dit qu'il est. Il est normal qu'il ne soit pas toujours possible de vérifier l'expéditeur, donc l'icône manquera parfois. Il n'est généralement pas nécessaire de s'inquiéter à ce sujet.";
+App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Attention ! Il semble que quelqu'un a essayé de contrefaire un message ! Ce message n'a pas nécessairement été envoyé par la personne annoncée !";
+App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Bienvenue sur Hubzilla! Voulez-vous faire un tour de l'interface utilisateur? Vous pouvez le mettre en pause à tout moment et continuer où vous l'avez laissé en rechargeant la page ou en naviguant vers une autre page. Vous pouvez également avancer en appuyant sur la touche de retour.";
+App::$strings["Extended Identity Sharing"] = "Partage d'identification étendu";
+App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Partagez votre identification avec tous les sites Web sur Internet. Lorsqu'elle est désactivée, l'identification n'est partagée qu'avec les sites de la matrice.";
+App::$strings["Three Dimensional Tic-Tac-Toe"] = "Tic-tac-toe en 3 dimensions";
+App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+App::$strings["New game"] = "Nouveau jeu";
+App::$strings["New game with handicap"] = "Nouveau jeu avec handicap";
+App::$strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Trois dimensions tic-tac-toe est juste comme le jeu traditionnel, sauf qu'il est joué sur plusieurs niveaux simultanément.";
+App::$strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "Dans ce cas, il y a trois niveaux. Vous gagnez en obtenant trois dans une rangée à n'importe quel niveau, que ce soit vers le haut, le bas, ou en diagonale à travers les différents niveaux.";
+App::$strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Le jeu handicap désactive la position centrale au niveau intermédiaire, car le joueur qui revendique ce carré a souvent un avantage indu.";
+App::$strings["You go first..."] = "Vous commencez…";
+App::$strings["I'm going first this time..."] = "Cette fois, je commence…";
+App::$strings["You won!"] = "Vous avez gagné !";
+App::$strings["\"Cat\" game!"] = "Jeu de \"Chat\" !";
+App::$strings["I won!"] = "J'ai gagné !";
+App::$strings["Message to display on every page on this server"] = "Message à afficher sur chaque page de ce serveur";
+App::$strings["Pageheader Settings"] = "Paramètres du haut de page";
+App::$strings["pageheader Settings saved."] = "Paramètres du haut de page sauvegardés.";
+App::$strings["lonely"] = "isolé";
+App::$strings["drunk"] = "saoul";
+App::$strings["horny"] = "libidineux";
+App::$strings["stoned"] = "défoncé";
+App::$strings["fucked up"] = "cramé";
+App::$strings["clusterfucked"] = "énervé";
+App::$strings["crazy"] = "cinglé";
+App::$strings["hurt"] = "dommage";
+App::$strings["sleepy"] = "somnolent";
+App::$strings["grumpy"] = "grognon";
+App::$strings["high"] = "allumé";
+App::$strings["semi-conscious"] = "à demi-conscient";
+App::$strings["in love"] = "amoureux";
+App::$strings["in lust"] = "convoitise";
+App::$strings["naked"] = "nu";
+App::$strings["stinky"] = "puant";
+App::$strings["sweaty"] = "en sueur";
+App::$strings["bleeding out"] = "en sang";
+App::$strings["victorious"] = "victorieux";
+App::$strings["defeated"] = "vaincu";
+App::$strings["envious"] = "envieux";
+App::$strings["jealous"] = "jaloux";
+App::$strings["XMPP settings updated."] = "Les paramètres XMPP ont été mis à jour.";
+App::$strings["Enable Chat"] = "Activer le Chat";
+App::$strings["Individual credentials"] = "Informations d'identifications individuelles";
+App::$strings["Jabber BOSH server"] = "serveur Jabber BOSH";
+App::$strings["XMPP Settings"] = "Paramètres XMPP";
+App::$strings["Jabber BOSH host"] = "Hôte Jabber BOSH";
+App::$strings["Use central userbase"] = "Utiliser la base d'utilisateurs centrale";
+App::$strings["If enabled, members will automatically login to an ejabberd server that has to be installed on this machine with synchronized credentials via the \"auth_ejabberd.php\" script."] = "Si cette option est activée, les membres se connecteront automatiquement à un serveur ejabberd qui doit être installé sur cette machine avec des informations d'identification synchronisées via le script \"auth_ejabberd.php\".";
+App::$strings["Who likes me?"] = "Qui m'aime?";
+App::$strings["You are now authenticated to pumpio."] = "Vous êtes maintenant connecté à pumpio.";
+App::$strings["return to the featured settings page"] = "retourner à la page des paramètres des fonctionnalités";
+App::$strings["Post to Pump.io"] = "Publier sur Pump.io";
+App::$strings["Pump.io servername"] = "Nom du serveur Pump.io";
+App::$strings["Without \"http://\" or \"https://\""] = "Sans \"http://\" ou \"https://\"";
+App::$strings["Pump.io username"] = "Identifiant Pump.io";
+App::$strings["Without the servername"] = "Sans le nom de serveur";
+App::$strings["You are not authenticated to pumpio"] = "Vous n'êtes pas connecté à Pump.io";
+App::$strings["(Re-)Authenticate your pump.io connection"] = "Authentifiez-vous à nouveau auprès de Pump.io";
+App::$strings["Enable pump.io Post Plugin"] = "Activer le plugin de publication Pump.io";
+App::$strings["Post to pump.io by default"] = "Par défaut, publier sur Pump.io";
+App::$strings["Should posts be public"] = "Les publications doivent-elles être publiques ?";
+App::$strings["Mirror all public posts"] = "Créer une copie miroir de toutes les publications publiques";
+App::$strings["Pump.io Post Settings"] = "Paramètres de publication Pump.io";
+App::$strings["PumpIO Settings saved."] = "Paramètres Pump.io sauvegardés.";
+App::$strings["An account has been created for you."] = "Un compte a été créé pour vous.";
+App::$strings["Authentication successful but rejected: account creation is disabled."] = "L'authentification a réussi mais a été rejetée : la création de comptes est désactivée.";
+App::$strings["Search \$Projectname"] = "Chercher dans \$Projectname";
+App::$strings["Redmatrix File Storage Import"] = "Importation du fichier de stockage Redmatrix";
+App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Ceci importera tous vos fichiers Redmatrix dans ce canal.";
+App::$strings["file"] = "fichier";
+App::$strings["Send email to all members"] = "Envoyer un mail à tous les membres";
+App::$strings["$1%s Administrator"] = "$1%s administrateur";
+App::$strings["%1\$d of %2\$d messages sent."] = "%1\$d message(s) envoyés sur %2\$d.";
+App::$strings["Send email to all hub members."] = "Envoyer un e-mail à tous les membres du hub.";
+App::$strings["Sender Email address"] = "Adresse mail de l'expéditeur";
+App::$strings["Test mode (only send to hub administrator)"] = "Mode test (uniquement envoyé à l'administrateur du hub)";
+App::$strings["Frequently"] = "Fréquemment";
+App::$strings["Hourly"] = "Toutes les heures";
+App::$strings["Twice daily"] = "Deux fois par jour";
+App::$strings["Daily"] = "Chaque jour";
+App::$strings["Weekly"] = "Chaque semaine";
+App::$strings["Monthly"] = "Chaque mois";
+App::$strings["Currently Male"] = "Actuellement homme";
+App::$strings["Currently Female"] = "Actuellement femme";
+App::$strings["Mostly Male"] = "Surtout homme";
+App::$strings["Mostly Female"] = "Surtout femme";
+App::$strings["Transgender"] = "Transgenre";
+App::$strings["Intersex"] = "Intersexuel";
+App::$strings["Transsexual"] = "Transsexuel";
+App::$strings["Hermaphrodite"] = "Hermaphrodite";
+App::$strings["Neuter"] = "Neutre";
+App::$strings["Non-specific"] = "Non spécifique";
+App::$strings["Undecided"] = "Indécis";
+App::$strings["Males"] = "Hommes";
+App::$strings["Females"] = "Femmes";
+App::$strings["Gay"] = "Gay";
+App::$strings["Lesbian"] = "Lesbienne";
+App::$strings["No Preference"] = "Sans préférence";
+App::$strings["Bisexual"] = "Bisexuel";
+App::$strings["Autosexual"] = "Autosexuel";
+App::$strings["Abstinent"] = "Abstinent";
+App::$strings["Virgin"] = "Vierge";
+App::$strings["Deviant"] = "Déviant";
+App::$strings["Fetish"] = "Fétichiste";
+App::$strings["Oodles"] = "Une floppée";
+App::$strings["Nonsexual"] = "Non-sexuel";
+App::$strings["Single"] = "Célibataire";
+App::$strings["Lonely"] = "Solitaire";
+App::$strings["Available"] = "Disponible";
+App::$strings["Unavailable"] = "Indisponible";
+App::$strings["Has crush"] = "A un béguin";
+App::$strings["Infatuated"] = "Amoureux transi";
+App::$strings["Dating"] = "Sort avec quelqu'un";
+App::$strings["Unfaithful"] = "Infidèle";
+App::$strings["Sex Addict"] = "Accro au sexe";
+App::$strings["Friends/Benefits"] = "Amis avec bénéfices";
+App::$strings["Casual"] = "Sans engagement";
+App::$strings["Engaged"] = "Fiancé(e)";
+App::$strings["Married"] = "Marié(e)";
+App::$strings["Imaginarily married"] = "Marié(e) dans ses rêves";
+App::$strings["Partners"] = "Partenaires";
+App::$strings["Cohabiting"] = "En cohabitation";
+App::$strings["Common law"] = "Conjoints de fait";
+App::$strings["Happy"] = "Heureux";
+App::$strings["Not looking"] = "Pas en recherche";
+App::$strings["Swinger"] = "Echangiste";
+App::$strings["Betrayed"] = "Trahi(e)";
+App::$strings["Separated"] = "Séparé(e)";
+App::$strings["Unstable"] = "Instable";
+App::$strings["Divorced"] = "Divorcé(e)";
+App::$strings["Imaginarily divorced"] = "Divorcé(e) dans ses rêves";
+App::$strings["Widowed"] = "Veuf/veuve";
+App::$strings["Uncertain"] = "Incertain";
+App::$strings["It's complicated"] = "C'est compliqué";
+App::$strings["Don't care"] = "S'en fiche";
+App::$strings["Ask me"] = "Me demander";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ajoute %2\$s à ses contacts";
App::$strings["%1\$s poked %2\$s"] = "%1\$s a tapoté %2\$s";
+App::$strings["poked"] = "a tapoté";
App::$strings["View %s's profile @ %s"] = "Voir le profil de %s @ %s";
App::$strings["Categories:"] = "Catégories&nbsp;:";
App::$strings["Filed under:"] = "Classé sous&nbsp;:";
App::$strings["View in context"] = "Voir en contexte";
App::$strings["remove"] = "supprimer";
+App::$strings["Loading..."] = "Chargement...";
App::$strings["Delete Selected Items"] = "Supprimer les éléments selectionnés";
App::$strings["View Source"] = "Voir source";
App::$strings["Follow Thread"] = "Suivre la discussion";
@@ -1815,12 +2495,17 @@ App::$strings["Set your location"] = "Spécifier votre emplacement géographique
App::$strings["Clear browser location"] = "Supprimer l'emplacement géographique du navigateur";
App::$strings["Tag term:"] = "Étiquette&nbsp;:";
App::$strings["Where are you right now?"] = "Où êtes-vous en ce moment&nbsp;?";
+App::$strings["Choose a different album..."] = "Choisissez un autre album";
+App::$strings["Comments enabled"] = "Commentaires activés";
+App::$strings["Comments disabled"] = "Commentaires désactivés";
App::$strings["Page link name"] = "Nom du lien vers la page";
App::$strings["Post as"] = "Publier en tant que";
App::$strings["Toggle voting"] = "(Dés)activer le vote";
+App::$strings["Disable comments"] = "Désactiver les commentaires";
+App::$strings["Toggle comments"] = "Basculer les commentaires";
App::$strings["Categories (optional, comma-separated list)"] = "Catégories (facultatives, séparées par des virgules)";
+App::$strings["Other networks and post services"] = "Autres réseaux et services de messagerie";
App::$strings["Set publish date"] = "Définir la date de publication";
-App::$strings["OK"] = "OK";
App::$strings["Discover"] = "À découvrir";
App::$strings["Imported public streams"] = "Flux publics importés";
App::$strings["Commented Order"] = "Par date de commentaire";
@@ -1829,17 +2514,17 @@ App::$strings["Posted Order"] = "Par date de publication";
App::$strings["Sort by Post Date"] = "Trier par date de publication";
App::$strings["Posts that mention or involve you"] = "Publications qui vous mentionnent ou vous concernent d'une manière ou d'une autre";
App::$strings["Activity Stream - by date"] = "Flux d'activité - par date";
-App::$strings["Starred"] = "Mis en avant (étoiles)";
+App::$strings["Starred"] = "Avec étoile";
App::$strings["Favourite Posts"] = "Publications préférées";
App::$strings["Spam"] = "Indésirable";
App::$strings["Posts flagged as SPAM"] = "Publications marquées comme indésirables";
App::$strings["Status Messages and Posts"] = "Messages d'état et contributions";
-App::$strings["About"] = "À propos";
App::$strings["Profile Details"] = "Détails du profil";
App::$strings["Photo Albums"] = "Albums photo";
App::$strings["Files and Storage"] = "Fichiers et Stockage";
+App::$strings["Bookmarks"] = "Favoris";
App::$strings["Saved Bookmarks"] = "Favoris sauvegardés";
-App::$strings["Manage Webpages"] = "Gérer les pages web";
+App::$strings["View Webpages"] = "Voir les pages web";
App::$strings["__ctx:noun__ Attending"] = array(
0 => "Participe",
1 => "Participent",
@@ -1864,99 +2549,206 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "S'abstient",
1 => "S'abstiennent",
);
-App::$strings["Frequently"] = "Fréquemment";
-App::$strings["Hourly"] = "Toutes les heures";
-App::$strings["Twice daily"] = "Deux fois par jour";
-App::$strings["Daily"] = "Chaque jour";
-App::$strings["Weekly"] = "Chaque semaine";
-App::$strings["Monthly"] = "Chaque mois";
-App::$strings["Currently Male"] = "Actuellement homme";
-App::$strings["Currently Female"] = "Actuellement femme";
-App::$strings["Mostly Male"] = "Surtout homme";
-App::$strings["Mostly Female"] = "Surtout femme";
-App::$strings["Transgender"] = "Transgenre";
-App::$strings["Intersex"] = "Intersexuel";
-App::$strings["Transsexual"] = "Transsexuel";
-App::$strings["Hermaphrodite"] = "Hermaphrodite";
-App::$strings["Neuter"] = "Neutre";
-App::$strings["Non-specific"] = "Non spécifique";
-App::$strings["Other"] = "Autre";
-App::$strings["Undecided"] = "Indécis";
-App::$strings["Males"] = "Hommes";
-App::$strings["Females"] = "Femmes";
-App::$strings["Gay"] = "Gay";
-App::$strings["Lesbian"] = "Lesbienne";
-App::$strings["No Preference"] = "Sans préférence";
-App::$strings["Bisexual"] = "Bisexuel";
-App::$strings["Autosexual"] = "Autosexuel";
-App::$strings["Abstinent"] = "Abstinent";
-App::$strings["Virgin"] = "Vierge";
-App::$strings["Deviant"] = "Déviant";
-App::$strings["Fetish"] = "Fétichiste";
-App::$strings["Oodles"] = "Une floppée";
-App::$strings["Nonsexual"] = "Non-sexuel";
-App::$strings["Single"] = "Célibataire";
-App::$strings["Lonely"] = "Solitaire";
-App::$strings["Available"] = "Disponible";
-App::$strings["Unavailable"] = "Indisponible";
-App::$strings["Has crush"] = "A un béguin";
-App::$strings["Infatuated"] = "Amoureux transi";
-App::$strings["Dating"] = "Sort avec quelqu'un";
-App::$strings["Unfaithful"] = "Infidèle";
-App::$strings["Sex Addict"] = "Accro au sexe";
-App::$strings["Friends/Benefits"] = "Amis avec bénéfices";
-App::$strings["Casual"] = "Sans engagement";
-App::$strings["Engaged"] = "Fiancé(e)";
-App::$strings["Married"] = "Marié(e)";
-App::$strings["Imaginarily married"] = "Marié(e) dans ses rêves";
-App::$strings["Partners"] = "Partenaires";
-App::$strings["Cohabiting"] = "En cohabitation";
-App::$strings["Common law"] = "Conjoints de fait";
-App::$strings["Happy"] = "Heureux";
-App::$strings["Not looking"] = "Pas en recherche";
-App::$strings["Swinger"] = "Echangiste";
-App::$strings["Betrayed"] = "Trahi(e)";
-App::$strings["Separated"] = "Séparé(e)";
-App::$strings["Unstable"] = "Instable";
-App::$strings["Divorced"] = "Divorcé(e)";
-App::$strings["Imaginarily divorced"] = "Divorcé(e) dans ses rêves";
-App::$strings["Widowed"] = "Veuf/veuve";
-App::$strings["Uncertain"] = "Incertain";
-App::$strings["It's complicated"] = "C'est compliqué";
-App::$strings["Don't care"] = "S'en fiche";
-App::$strings["Ask me"] = "Me demander";
-App::$strings["Visible to your default audience"] = "Visible pour vos contacts seulement";
-App::$strings["Only me"] = "";
-App::$strings["Public"] = "Public";
-App::$strings["Anybody in the \$Projectname network"] = "";
-App::$strings["Any account on %s"] = "";
-App::$strings["Any of my connections"] = "";
-App::$strings["Only connections I specifically allow"] = "";
-App::$strings["Anybody authenticated (could include visitors from other networks)"] = "";
-App::$strings["Any connections including those who haven't yet been approved"] = "";
-App::$strings["This is your default setting for the audience of your normal stream, and posts."] = "";
-App::$strings["This is your default setting for who can view your default channel profile"] = "";
-App::$strings["This is your default setting for who can view your connections"] = "";
-App::$strings["This is your default setting for who can view your file storage and photos"] = "";
-App::$strings["This is your default setting for the audience of your webpages"] = "";
-App::$strings["Not a valid email address"] = "Ce n'est pas une adresse de courriel valide";
-App::$strings["Your email domain is not among those allowed on this site"] = "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site";
-App::$strings["Your email address is already registered at this site."] = "Votre adresse de courriel est déjà inscrite sur ce site.";
-App::$strings["An invitation is required."] = "Une invitation est requise.";
-App::$strings["Invitation could not be verified."] = "Votre invitation n'a pas pu être vérifiée.";
-App::$strings["Please enter the required information."] = "Merci d'entrer les informations requises.";
-App::$strings["Failed to store account information."] = "Impossible de stocker les informations liées au compte.";
-App::$strings["Registration confirmation for %s"] = "Confirmation de l'inscription pour %s";
-App::$strings["Registration request at %s"] = "Demande d'inscription sur %s";
-App::$strings["Administrator"] = "Administrateur";
-App::$strings["your registration password"] = "votre mot de passe d'inscription";
-App::$strings["Registration details for %s"] = "Détails de l'inscription pour %s";
-App::$strings["Account approved."] = "Compte approuvé.";
-App::$strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
-App::$strings["Account verified. Please login."] = "Compte vérifié. Veuillez vous connecter.";
-App::$strings["Click here to upgrade."] = "Cliquez ici pour mettre à jour.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Cette action outrepasserait les limites prévues par votre forfait.";
-App::$strings["This action is not available under your subscription plan."] = "Cette action n'est pas disponible avec votre forfait.";
+App::$strings["Can view my normal stream and posts"] = "Peut voir les publications ordinaires sur mon canal.";
+App::$strings["Can view my webpages"] = "Peut voir mes pages web";
+App::$strings["Can post on my channel page (\"wall\")"] = "Peuvent poster sur la page de mon canal (\"mur\")";
+App::$strings["Can like/dislike stuff"] = "Peuvent aimer/ne pas aimer";
+App::$strings["Profiles and things other than posts/comments"] = "Profils et autres excluant les publications/commentaires.";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Peut faire suivre à tous les contacts de mon canal via \"@mention\"";
+App::$strings["Advanced - useful for creating group forum channels"] = "Avancé - utile pour les canaux de type \"forum/groupe\"";
+App::$strings["Can chat with me (when available)"] = "Peut discuter avec moi (quand disponibie)";
+App::$strings["Can write to my file storage and photos"] = "Peut charger des fichiers et des photos dans mon canal";
+App::$strings["Can edit my webpages"] = "Peut modifier mes pages web";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Plutôt avancé - très utile dans les communautés ouvertes";
+App::$strings["Can administer my channel resources"] = "Peut administrer les ressources de mon canal";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes";
+App::$strings["Directory Options"] = "Options d'annuaire";
+App::$strings["Safe Mode"] = "Mode sûr";
+App::$strings["Public Forums Only"] = "Les forums publics uniquement";
+App::$strings["This Website Only"] = "Ce site uniquement";
+App::$strings["%1\$s's bookmarks"] = "Favoris de %1\$s";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "L'import a échoué. Un canal existe déjà avec ce nom";
+App::$strings["Cloned channel not found. Import failed."] = "Canal cloné non trouvé. Echec de l'import.";
+App::$strings["prev"] = "préc.";
+App::$strings["first"] = "premier";
+App::$strings["last"] = "dernier";
+App::$strings["next"] = "Suivant";
+App::$strings["older"] = "plus ancien";
+App::$strings["newer"] = "plus récent";
+App::$strings["No connections"] = "Pas de relations.";
+App::$strings["View all %s connections"] = "Voir les %s contacts";
+App::$strings["poke"] = "tapoter";
+App::$strings["ping"] = "ping";
+App::$strings["pinged"] = "pingé";
+App::$strings["prod"] = "encourager";
+App::$strings["prodded"] = "encouragé";
+App::$strings["slap"] = "giffler";
+App::$strings["slapped"] = "gifflé(e)";
+App::$strings["finger"] = "pointer";
+App::$strings["fingered"] = "pointé";
+App::$strings["rebuff"] = "rejetter";
+App::$strings["rebuffed"] = "rejeté";
+App::$strings["happy"] = "heureux";
+App::$strings["sad"] = "triste";
+App::$strings["mellow"] = "mélancolique";
+App::$strings["tired"] = "fatigué";
+App::$strings["perky"] = "impertinent";
+App::$strings["angry"] = "en colère";
+App::$strings["stupefied"] = "stupéfait";
+App::$strings["puzzled"] = "perplexe";
+App::$strings["interested"] = "intéressé";
+App::$strings["bitter"] = "amer";
+App::$strings["cheerful"] = "plein d'entrain";
+App::$strings["alive"] = "vivant";
+App::$strings["annoyed"] = "agaçé";
+App::$strings["anxious"] = "anxieux";
+App::$strings["cranky"] = "énervé";
+App::$strings["disturbed"] = "perturbé";
+App::$strings["frustrated"] = "frustré";
+App::$strings["depressed"] = "déprimé";
+App::$strings["motivated"] = "motivé";
+App::$strings["relaxed"] = "détendu";
+App::$strings["surprised"] = "surpris";
+App::$strings["Monday"] = "Lundi";
+App::$strings["Tuesday"] = "Mardi";
+App::$strings["Wednesday"] = "Mercredi";
+App::$strings["Thursday"] = "Jeudi";
+App::$strings["Friday"] = "Vendredi";
+App::$strings["Saturday"] = "Samedi";
+App::$strings["Sunday"] = "Dimanche";
+App::$strings["January"] = "Janvier";
+App::$strings["February"] = "Février";
+App::$strings["March"] = "Mars";
+App::$strings["April"] = "Avril";
+App::$strings["May"] = "Mai";
+App::$strings["June"] = "Juin";
+App::$strings["July"] = "Juillet";
+App::$strings["August"] = "Août";
+App::$strings["September"] = "Septembre";
+App::$strings["October"] = "Octobre";
+App::$strings["November"] = "Novembre";
+App::$strings["December"] = "Décembre";
+App::$strings["Unknown Attachment"] = "Pièce jointe inconnue";
+App::$strings["unknown"] = "Inconnu";
+App::$strings["remove category"] = "supprimer la catégorie";
+App::$strings["remove from file"] = "retirer du fichier";
+App::$strings["default"] = "défaut";
+App::$strings["Page layout"] = "Mise en page";
+App::$strings["You can create your own with the layouts tool"] = "Créez les vôtres avec les outils de mise en page";
+App::$strings["Page content type"] = "Type de contenu de la page";
+App::$strings["activity"] = "activité";
+App::$strings["Design Tools"] = "Outils de conception";
+App::$strings["Pages"] = "Pages";
+App::$strings["Import website..."] = "Importer le site web…";
+App::$strings["Select folder to import"] = "Sélectionner le dossier à importer";
+App::$strings["Import from a zipped folder:"] = "Importer à partir d'un dossier zippé :";
+App::$strings["Import from cloud files:"] = "Importer à partir de fichiers dans le cloud :";
+App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/chemain/du/repertoire";
+App::$strings["Enter path to website files"] = "Entrer le chemin vers les fichiers du site web";
+App::$strings["Select folder"] = "Sélectionner un répertoire";
+App::$strings["Export website..."] = "Exporter le site web…";
+App::$strings["Export to a zip file"] = "Exporter dans un fichier zip";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Entrer un nom pour le fichier zip.";
+App::$strings["Export to cloud files"] = "Exporter dans des fichiers sur le cloud";
+App::$strings["/path/to/export/folder"] = "/chemin/vers/le/dossier/d'export";
+App::$strings["Enter a path to a cloud files destination."] = "Entrer le chemin vers le cloud de fichiers";
+App::$strings["Specify folder"] = "Spécifier un répertoire";
+App::$strings["%d invitation available"] = array(
+ 0 => "%d invitation disponible",
+ 1 => "%d invitations disponibles",
+);
+App::$strings["Find Channels"] = "Trouver des canaux";
+App::$strings["Enter name or interest"] = "Saisir nom ou centre d'intérêt";
+App::$strings["Connect/Follow"] = "Ajouter/Suivre";
+App::$strings["Examples: Robert Morgenstein, Fishing"] = "Exemples: Guillaume Martin, Course à pieds";
+App::$strings["Random Profile"] = "Un profil au hasard";
+App::$strings["Invite Friends"] = "Inviter des amis";
+App::$strings["Advanced example: name=fred and country=iceland"] = "Exemple avancé&nbsp;: name=fred and country=iceland";
+App::$strings["%d connection in common"] = array(
+ 0 => "%d contact en commun",
+ 1 => "%d contacts en commun",
+);
+App::$strings["show more"] = "montrer plus";
+App::$strings["Attachments:"] = "";
+App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\à G\\hi";
+App::$strings["\$Projectname event notification:"] = "";
+App::$strings["Starts:"] = "Début&nbsp;:";
+App::$strings["Finishes:"] = "Fin&nbsp;:";
+App::$strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site.";
+App::$strings["Channel location missing."] = "Emplacement du canal introuvable.";
+App::$strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète.";
+App::$strings["Channel was deleted and no longer exists."] = "Le canal a été supprimé et n'existe plus.";
+App::$strings["Protocol disabled."] = "Protocole désactivé.";
+App::$strings["Channel discovery failed."] = "La tentative d'accéder au canal a échoué.";
+App::$strings["Cannot connect to yourself."] = "Ne peut pas se connecter à vous.";
+App::$strings["Delete this item?"] = "Supprimer cet élément?";
+App::$strings["%s show less"] = "%s afficher moins";
+App::$strings["%s expand"] = "%s dérouler";
+App::$strings["%s collapse"] = "%s enrouler";
+App::$strings["Password too short"] = "Mot de passe trop court";
+App::$strings["Passwords do not match"] = "Les mots de passe ne correspondent pas";
+App::$strings["everybody"] = "tout le monde";
+App::$strings["Secret Passphrase"] = "Phrase de passe secrète";
+App::$strings["Passphrase hint"] = "Indice pour la phrase de passe";
+App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Note&nbsp;: Les permissions ont changées, mais n'ont pas encore été sauvées.";
+App::$strings["close all"] = "fermer tout";
+App::$strings["Nothing new here"] = "Aucun nouveau contenu trouvé";
+App::$strings["Rate This Channel (this is public)"] = "Evaluer ce canal (publiquement)";
+App::$strings["Describe (optional)"] = "Description (facultative)";
+App::$strings["Please enter a link URL"] = "Merci d'insérer une URL";
+App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Changements en attente. Voulez-vous vraiment quitter cette page?";
+App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+App::$strings["ago"] = "auparavant";
+App::$strings["from now"] = "de maintenant";
+App::$strings["less than a minute"] = "moins d'une minute";
+App::$strings["about a minute"] = "environ une minute";
+App::$strings["%d minutes"] = "%d minutes";
+App::$strings["about an hour"] = "environ une heure";
+App::$strings["about %d hours"] = "environ %d heures";
+App::$strings["a day"] = "un jour";
+App::$strings["%d days"] = "%d jours";
+App::$strings["about a month"] = "environ un mois";
+App::$strings["%d months"] = "%d mois";
+App::$strings["about a year"] = "environ un an";
+App::$strings["%d years"] = "%d années";
+App::$strings[" "] = " ";
+App::$strings["timeago.numbers"] = "timeago.numbers";
+App::$strings["__ctx:long__ May"] = "Mai";
+App::$strings["Jan"] = "Jan";
+App::$strings["Feb"] = "Fev";
+App::$strings["Mar"] = "Mar";
+App::$strings["Apr"] = "Avr";
+App::$strings["__ctx:short__ May"] = "Mai";
+App::$strings["Jun"] = "Jun";
+App::$strings["Jul"] = "Jul";
+App::$strings["Aug"] = "Aou";
+App::$strings["Sep"] = "Sep";
+App::$strings["Oct"] = "Oct";
+App::$strings["Nov"] = "Nov";
+App::$strings["Dec"] = "Dec";
+App::$strings["Sun"] = "Dim";
+App::$strings["Mon"] = "Lun";
+App::$strings["Tue"] = "Mar";
+App::$strings["Wed"] = "Mer";
+App::$strings["Thu"] = "Jeu";
+App::$strings["Fri"] = "Ven";
+App::$strings["Sat"] = "Sam";
+App::$strings["__ctx:calendar__ today"] = "aujourd'hui";
+App::$strings["__ctx:calendar__ month"] = "mois";
+App::$strings["__ctx:calendar__ week"] = "semaine";
+App::$strings["__ctx:calendar__ day"] = "jour";
+App::$strings["__ctx:calendar__ All day"] = "Toute la journée";
+App::$strings["Unable to determine sender."] = "Impossible de déterminer l'émetteur.";
+App::$strings["No recipient provided."] = "Pas de destinataire.";
+App::$strings["[no subject]"] = "[sans objet]";
+App::$strings["Stored post could not be verified."] = "Le message stocké n'a pas pu être vérifié.";
+App::$strings[" and "] = "et";
+App::$strings["public profile"] = "profil public";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s a changé %2\$s en &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Visiter %2\$s de %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s a mis à jour %2\$s, modifiant %3\$s.";
App::$strings["Item was not found."] = "Élément introuvable.";
App::$strings["No source file."] = "Pas de fichier source.";
App::$strings["Cannot locate file to replace"] = "Impossible de trouver le fichier à remplacer.";
@@ -1972,6 +2764,24 @@ App::$strings["Path not found."] = "Chemin introuvable.";
App::$strings["mkdir failed."] = "mkdir a échoué.";
App::$strings["database storage failed."] = "l'écriture dans la base de données a échoué.";
App::$strings["Empty path"] = "Chemin vide";
+App::$strings["guest:"] = "Visiteur";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "Le formulaire n'est plus sécurisé, probablement parce qu'il est ouvert depuis trop longtemps (plus de 3 heures).";
+App::$strings["(Unknown)"] = "(Inconnu)";
+App::$strings["Visible to anybody on the internet."] = "Visible pour tout le monde sur internet.";
+App::$strings["Visible to you only."] = "Visible pour vous seulement.";
+App::$strings["Visible to anybody in this network."] = "Visible pour tout le monde sur ce réseau.";
+App::$strings["Visible to anybody authenticated."] = "Visible aux utilisateurs authentifiés.";
+App::$strings["Visible to anybody on %s."] = "Visible pour tous sur %s.";
+App::$strings["Visible to all connections."] = "Visible pour tous les contacts.";
+App::$strings["Visible to approved connections."] = "Visible aux contacts approuvés.";
+App::$strings["Visible to specific connections."] = "Visible pour certains contacts.";
+App::$strings["Privacy group is empty."] = "Groupe de contacts vide.";
+App::$strings["Privacy group: %s"] = "Groupe de contacts&nbsp;: %s";
+App::$strings["Connection not found."] = "Contact non trouvé.";
+App::$strings["profile photo"] = "photo de profil";
+App::$strings["[Edited %s]"] = "[%s édité]";
+App::$strings["__ctx:edit_activity__ Post"] = "Publier";
+App::$strings["__ctx:edit_activity__ Comment"] = "Commenter";
App::$strings["Unable to obtain identity information from database"] = "Impossible d'obtenir les données d'identité depuis la base de données";
App::$strings["Empty name"] = "Nom vide";
App::$strings["Name too long"] = "Nom trop long";
@@ -1981,11 +2791,9 @@ App::$strings["Reserved nickname. Please choose another."] = "Surnom réservé.
App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Le surnom contient des caractères interdits ou est déjà pris sur ce site.";
App::$strings["Unable to retrieve created identity"] = "Impossible de récupérer l'identité créée";
App::$strings["Default Profile"] = "Profil par défaut";
-App::$strings["Requested channel is not available."] = "Canal demandé non disponible.";
App::$strings["Create New Profile"] = "Créer un nouveau profil";
App::$strings["Visible to everybody"] = "Visible de tous";
App::$strings["Gender:"] = "Sexe&nbsp;:";
-App::$strings["Status:"] = "État&nbsp;:";
App::$strings["Homepage:"] = "Site Internet&nbsp;:";
App::$strings["Online Now"] = "Connecté";
App::$strings["Like this channel"] = "J'aime ce canal";
@@ -2010,9 +2818,47 @@ App::$strings["Love/Romance:"] = "Vie sentimentale/amoureuse&nbsp;:";
App::$strings["Work/employment:"] = "Travail/Occupation&nbsp;";
App::$strings["School/education:"] = "Études&nbsp;";
App::$strings["Like this thing"] = "J'aime ceci";
+App::$strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
+App::$strings["This event has been added to your calendar."] = "Cet évènement a été ajouté dans votre calendrier.";
+App::$strings["Not specified"] = "Non spécifié";
+App::$strings["Needs Action"] = "Besoin d'une action";
+App::$strings["Completed"] = "Terminé";
+App::$strings["In Process"] = "En cours";
+App::$strings["Cancelled"] = "Annulé";
+App::$strings["view full size"] = "voir en taille réelle";
+App::$strings["No Subject"] = "Pas d'objet";
+App::$strings["Friendica"] = "Friendica";
+App::$strings["OStatus"] = "OStatus";
+App::$strings["GNU-Social"] = "GNU-Social";
+App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["Diaspora"] = "Diaspora";
+App::$strings["Facebook"] = "Facebook";
+App::$strings["Zot"] = "Zot";
+App::$strings["LinkedIn"] = "Linkedin";
+App::$strings["XMPP/IM"] = "XMPP/IM";
+App::$strings["MySpace"] = "MySpace";
+App::$strings["New Page"] = "Nouvelle page";
+App::$strings["Select an alternate language"] = "Choisir une langue alternative";
+App::$strings["Who can see this?"] = "Qui peut voir cela";
+App::$strings["Custom selection"] = "Sélection personnalisée";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Sélectionnez \"Afficher\" pour permettre l'affichage. \"Ne pas afficher\" vous permet de remplacer et de limiter la portée de \"Afficher\".";
+App::$strings["Show"] = "Montrer";
+App::$strings["Don't show"] = "Cacher";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Les autorisations d'accès d'un message %s ne peuvent pas être modifiées %s une fois le message envoyé. Ces autorisations définissent qui est autorisé à afficher le message.";
+App::$strings["Cannot locate DNS info for database server '%s'"] = "Impossible de trouver les infos DNS du serveur de BDD '%s'";
+App::$strings["Image/photo"] = "Image/photo";
+App::$strings["Encrypted content"] = "Contenu chiffré";
+App::$strings["Install %s element: "] = "Installer %s élément";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Ce message contient un élément installable %s, mais vous n'avez pas l'autorisation de l'installer sur ce site.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s a écrit %2\$s qui suit %3\$s";
+App::$strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
+App::$strings["spoiler"] = "spoiler";
+App::$strings["$1 wrote:"] = "$1 a écrit&nbsp;:";
+App::$strings[" by "] = "par";
+App::$strings[" on "] = "sur";
+App::$strings["Embedded content"] = "Contenu imbriqué";
+App::$strings["Embedding disabled"] = "Imbrication désactivée";
App::$strings["General Features"] = "Fonctionnalités générales";
-App::$strings["Content Expiration"] = "Expiration du contenu";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Supprimer les contributions/commentaires et/ou messages privés plus tard";
App::$strings["Multiple Profiles"] = "Profils multiples";
App::$strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils";
App::$strings["Advanced Profiles"] = "Profils Avancés";
@@ -2021,22 +2867,24 @@ App::$strings["Profile Import/Export"] = "Importer/Exporter le profil";
App::$strings["Save and load profile details across sites/channels"] = "Sauvegarder et charger les détails d'un profil entre sites/canaux";
App::$strings["Web Pages"] = "Pages web";
App::$strings["Provide managed web pages on your channel"] = "Fournir des pages web, sous votre contrôle, sur votre canal";
-App::$strings["Hide Rating"] = "Masquer l'évaluation";
-App::$strings["Hide the rating buttons on your channel and profile pages. Note: People can still rate you somewhere else."] = "Masquer les boutons d'évaluation sur les pages de votre canal et de votre profil. NB : vous pourrez toujours être évalué(e) ailleurs.";
+App::$strings["Provide a wiki for your channel"] = "Fournir un wiki pour votre canal.";
App::$strings["Private Notes"] = "Notes privées";
App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Active un outil pour stocker des notes et des rappels (note&nbsp;:non chiffré)";
App::$strings["Navigation Channel Select"] = "Sélection du canal par la navigation";
App::$strings["Change channels directly from within the navigation dropdown menu"] = "Changez de canal directement depuis le menu de navigation déroulant";
App::$strings["Photo Location"] = "Site de prise de vue";
App::$strings["If location data is available on uploaded photos, link this to a map."] = "Si des informations géographiques sont présentes dans les images téléversées, les lier à une carte.";
-App::$strings["Access Controlled Chatrooms"] = "";
-App::$strings["Provide chatrooms and chat services with access control."] = "";
+App::$strings["Access Controlled Chatrooms"] = "Accéder au salons de discussions contrôlés.";
+App::$strings["Provide chatrooms and chat services with access control."] = "Fournir des salons de discussions et des services de discussions avec contrôle d'accès.";
+App::$strings["Provide alternate connection permission roles."] = "Fournir des rôles d'autorisation différents pour ce contact.";
App::$strings["Smart Birthdays"] = "Anniversaires intelligents";
App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Adapter les anniversaires aux fuseaux horaires, utile pour vos amis sur d'autres continents.";
-App::$strings["Expert Mode"] = "Mode expert";
-App::$strings["Enable Expert Mode to provide advanced configuration options"] = "Activer le mode expert pour accéder aux options avancées";
-App::$strings["Premium Channel"] = "Canal VIP";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal";
+App::$strings["Event Timezone Selection"] = "Sélection du fuseau horaire de l'événement";
+App::$strings["Allow event creation in timezones other than your own."] = "Autorise la création d’événements sur d'autres fuseaux horaires que le vôtre.";
+App::$strings["Advanced Directory Search"] = "Recherche avancée dans les répertoires";
+App::$strings["Allows creation of complex directory search queries"] = "Autoriser la création d'entrées complexes de recherche de répertoire";
+App::$strings["Advanced Theme and Layout Settings"] = "Paramètres avancés du thème et de l'agencement.";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Autoriser la personnalisation fine des thèmes et des agencements.";
App::$strings["Post Composition Features"] = "Fonctionnalités de composition";
App::$strings["Large Photos"] = "Grandes photos";
App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Inclure de grands aperçus (1024px) dans les messages. Si désactivé, inclure de petits aperçus (640px).";
@@ -2045,15 +2893,19 @@ App::$strings["Even More Encryption"] = "Encore plus de chiffrement";
App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permettre le chiffrement optionnel du contenu de bout en bout au moyen d'un secret partagé";
App::$strings["Enable Voting Tools"] = "Activer les outils de vote";
App::$strings["Provide a class of post which others can vote on"] = "Fournit un type de publication sur lequel les utilisateurs peuvent voter";
+App::$strings["Disable Comments"] = "Désactiver les commentaires";
+App::$strings["Provide the option to disable comments for a post"] = "Fournir la possibilité de désactiver les commentaires pour une publication.";
App::$strings["Delayed Posting"] = "Publication plus tard";
App::$strings["Allow posts to be published at a later date"] = "Permettre de publier des messages à une date programmée";
+App::$strings["Content Expiration"] = "Expiration du contenu";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Supprimer les contributions/commentaires et/ou messages privés plus tard";
App::$strings["Suppress Duplicate Posts/Comments"] = "Supprimer les publications/commentaires en doublon";
App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Empêcher des messages aux contenus identiques d'être publiés à moins de deux minutes d'intervalle";
App::$strings["Network and Stream Filtering"] = "Filtrage du réseau et des flux";
App::$strings["Search by Date"] = "Chercher par date";
App::$strings["Ability to select posts by date ranges"] = "Pouvoir choisir des publications par date";
-App::$strings["Privacy Groups"] = "Groupes d'accès";
-App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes d'accès";
+App::$strings["Privacy Groups"] = "Groupes de contacts";
+App::$strings["Enable management and selection of privacy groups"] = "Active la gestion et la sélection des groupes de contacts";
App::$strings["Save search terms for re-use"] = "Sauvegarder des termes de recherche pour utilisation ultérieure";
App::$strings["Network Personal Tab"] = "Onglet \"Me concernant\"";
App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Activer un onglet affichant seulement les publications du réseau sur lesquelles vous êtes intervenu";
@@ -2061,16 +2913,16 @@ App::$strings["Network New Tab"] = "Onglet \"nouveautés réseau\"";
App::$strings["Enable tab to display all new Network activity"] = "Activer un onglet présentant toute l'activité récente sur le réseau";
App::$strings["Affinity Tool"] = "Gérer l'affinité";
App::$strings["Filter stream activity by depth of relationships"] = "Filtrer le flux d'activité en fonction de la profondeur des relations";
+App::$strings["Show friend and connection suggestions"] = "Afficher un ami et les suggestions de relations";
App::$strings["Connection Filtering"] = "Filtrage des contacts";
App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filtrer les publications entrantes de mes contacts sur la base de mots-clefs";
-App::$strings["Show channel suggestions"] = "Montrer les suggestions de canaux";
App::$strings["Post/Comment Tools"] = "Gérer les publications/commentaires";
App::$strings["Community Tagging"] = "Etiquetage communautaire";
App::$strings["Ability to tag existing posts"] = "Permettre de marquer les publications existantes";
App::$strings["Post Categories"] = "Catégoriser les publications";
App::$strings["Add categories to your posts"] = "Ajouter des catégories à vos publications";
-App::$strings["Emoji Reactions"] = "";
-App::$strings["Add emoji reaction ability to posts"] = "";
+App::$strings["Emoji Reactions"] = "Réactions par émoticônes";
+App::$strings["Add emoji reaction ability to posts"] = "Ajouter la possibilité de réagir aux publications par émoticônes";
App::$strings["Ability to file posts under folders"] = "Permettre de classer les publications dans des dossiers";
App::$strings["Dislike Posts"] = "\"Ne pas aimer\" les publications";
App::$strings["Ability to dislike posts/comments"] = "Possibilité de \"ne pas aimer\" les publications/commentaires";
@@ -2078,21 +2930,35 @@ App::$strings["Star Posts"] = "Pouvoir mettre en avant les publications";
App::$strings["Ability to mark special posts with a star indicator"] = "Pouvoir marquer certaines publications d'une étoile";
App::$strings["Tag Cloud"] = "Nuage de tags";
App::$strings["Provide a personal tag cloud on your channel page"] = "Afficher un nuage de vos tags sur votre canal";
-App::$strings["Embedded content"] = "Contenu imbriqué";
-App::$strings["Embedding disabled"] = "Imbrication désactivée";
-App::$strings["Who can see this?"] = "";
-App::$strings["Custom selection"] = "";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "";
-App::$strings["Show"] = "Montrer";
-App::$strings["Don't show"] = "Cacher";
-App::$strings["Other networks and post services"] = "Autres réseaux et services de messagerie";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "";
-App::$strings["Logged out."] = "Deconnecté.";
-App::$strings["Failed authentication"] = "Échec de l'authentification";
+App::$strings["Premium Channel"] = "Canal VIP";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Vous permet d'appliquer des règles et restrictions aux contacts de votre canal";
+App::$strings["Tags"] = "Étiquettes";
+App::$strings["Keywords"] = "Mots-clefs";
+App::$strings["have"] = "ont";
+App::$strings["has"] = "a";
+App::$strings["want"] = "veulent";
+App::$strings["wants"] = "veut";
+App::$strings["likes"] = "aime";
+App::$strings["dislikes"] = "n'aime pas";
+App::$strings["Not a valid email address"] = "Ce n'est pas une adresse de courriel valide";
+App::$strings["Your email domain is not among those allowed on this site"] = "Votre domaine de courriel ne fait pas partie de ceux autorisés par ce site";
+App::$strings["Your email address is already registered at this site."] = "Votre adresse de courriel est déjà inscrite sur ce site.";
+App::$strings["An invitation is required."] = "Une invitation est requise.";
+App::$strings["Invitation could not be verified."] = "Votre invitation n'a pas pu être vérifiée.";
+App::$strings["Please enter the required information."] = "Merci d'entrer les informations requises.";
+App::$strings["Failed to store account information."] = "Impossible de stocker les informations liées au compte.";
+App::$strings["Registration confirmation for %s"] = "Confirmation de l'inscription pour %s";
+App::$strings["Registration request at %s"] = "Demande d'inscription sur %s";
+App::$strings["your registration password"] = "votre mot de passe d'inscription";
+App::$strings["Registration details for %s"] = "Détails de l'inscription pour %s";
+App::$strings["Account approved."] = "Compte approuvé.";
+App::$strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
+App::$strings["Click here to upgrade."] = "Cliquez ici pour mettre à jour.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Cette action outrepasserait les limites prévues par votre forfait.";
+App::$strings["This action is not available under your subscription plan."] = "Cette action n'est pas disponible avec votre forfait.";
App::$strings["Birthday"] = "Anniversaire";
App::$strings["Age: "] = "Age&nbsp;:";
App::$strings["YYYY-MM-DD or MM-DD"] = "AAAA-MM-JJ ou MM-JJ";
-App::$strings["never"] = "jamais";
App::$strings["less than a second ago"] = "à l'instant";
App::$strings["__ctx:e.g. 22 hours ago, 1 minute ago__ %1\$d %2\$s ago"] = "il y a %1\$d %2\$s";
App::$strings["__ctx:relative_date__ year"] = array(
@@ -2125,82 +2991,39 @@ App::$strings["__ctx:relative_date__ second"] = array(
);
App::$strings["%1\$s's birthday"] = "Anniversaire de %1\$s";
App::$strings["Happy Birthday %1\$s"] = "Joyeux Anniversaire %1\$s";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent.";
-App::$strings["Add new connections to this privacy group"] = "Ajouter de nouveaux contacts à ce groupe d'accès";
-App::$strings["edit"] = "modifier";
-App::$strings["Edit group"] = "Modifier le groupe";
-App::$strings["Add privacy group"] = "Ajouter un groupe d'accès";
-App::$strings["Channels not in any privacy group"] = "Canaux n'étant dans aucun groupe d'accès";
-App::$strings["Delete this item?"] = "Supprimer cet élément?";
-App::$strings["[-] show less"] = "[-] montrer moins";
-App::$strings["[+] expand"] = "[+] déplier";
-App::$strings["[-] collapse"] = "[-] replier";
-App::$strings["Password too short"] = "Mot de passe trop court";
-App::$strings["Passwords do not match"] = "Les mots de passe ne correspondent pas";
-App::$strings["everybody"] = "tout le monde";
-App::$strings["Secret Passphrase"] = "Phrase de passe secrète";
-App::$strings["Passphrase hint"] = "Indice pour la phrase de passe";
-App::$strings["Notice: Permissions have changed but have not yet been submitted."] = "Note&nbsp;: Les permissions ont changées, mais n'ont pas encore été sauvées.";
-App::$strings["close all"] = "fermer tout";
-App::$strings["Nothing new here"] = "Aucun nouveau contenu trouvé";
-App::$strings["Rate This Channel (this is public)"] = "Evaluer ce canal (publiquement)";
-App::$strings["Describe (optional)"] = "Description (facultative)";
-App::$strings["Please enter a link URL"] = "Merci d'insérer une URL";
-App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Changements en attente. Voulez-vous vraiment quitter cette page?";
-App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
-App::$strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
-App::$strings["ago"] = "auparavant";
-App::$strings["from now"] = "de maintenant";
-App::$strings["less than a minute"] = "moins d'une minute";
-App::$strings["about a minute"] = "environ une minute";
-App::$strings["%d minutes"] = "%d minutes";
-App::$strings["about an hour"] = "environ une heure";
-App::$strings["about %d hours"] = "environ %d heures";
-App::$strings["a day"] = "un jour";
-App::$strings["%d days"] = "%d jours";
-App::$strings["about a month"] = "environ un mois";
-App::$strings["%d months"] = "%d mois";
-App::$strings["about a year"] = "environ un an";
-App::$strings["%d years"] = "%d années";
-App::$strings[" "] = "";
-App::$strings["timeago.numbers"] = "timeago.numbers";
-App::$strings["__ctx:long__ May"] = "Mai";
-App::$strings["Jan"] = "Jan";
-App::$strings["Feb"] = "Fev";
-App::$strings["Mar"] = "Mar";
-App::$strings["Apr"] = "Avr";
-App::$strings["__ctx:short__ May"] = "Mai";
-App::$strings["Jun"] = "Jun";
-App::$strings["Jul"] = "Jul";
-App::$strings["Aug"] = "Aou";
-App::$strings["Sep"] = "Sep";
-App::$strings["Oct"] = "Oct";
-App::$strings["Nov"] = "Nov";
-App::$strings["Dec"] = "Dec";
-App::$strings["Sun"] = "Dim";
-App::$strings["Mon"] = "Lun";
-App::$strings["Tue"] = "Mar";
-App::$strings["Wed"] = "Mer";
-App::$strings["Thu"] = "Jeu";
-App::$strings["Fri"] = "Ven";
-App::$strings["Sat"] = "Sam";
-App::$strings["__ctx:calendar__ today"] = "aujourd'hui";
-App::$strings["__ctx:calendar__ month"] = "mois";
-App::$strings["__ctx:calendar__ week"] = "semaine";
-App::$strings["__ctx:calendar__ day"] = "jour";
-App::$strings["__ctx:calendar__ All day"] = "Toute la journée";
-App::$strings["view full size"] = "voir en taille réelle";
-App::$strings["No Subject"] = "Pas d'objet";
-App::$strings["Friendica"] = "Friendica";
-App::$strings["OStatus"] = "OStatus";
-App::$strings["GNU-Social"] = "";
-App::$strings["RSS/Atom"] = "RSS/Atom";
-App::$strings["Diaspora"] = "Diaspora";
-App::$strings["Facebook"] = "Facebook";
-App::$strings["Zot"] = "Zot";
-App::$strings["LinkedIn"] = "Linkedin";
-App::$strings["XMPP/IM"] = "XMPP/IM";
-App::$strings["MySpace"] = "MySpace";
+App::$strings["Remote authentication"] = "Authentification distante";
+App::$strings["Click to authenticate to your home hub"] = "S'authentifier auprès de votre hub principal";
+App::$strings["End this session"] = "Mettre fin à la session";
+App::$strings["Your profile page"] = "Votre profil";
+App::$strings["Manage/Edit profiles"] = "Gérer/modifier vos profils";
+App::$strings["Edit your profile"] = "Modifier votre profil";
+App::$strings["Sign in"] = "Connexion";
+App::$strings["Take me home"] = "";
+App::$strings["Log me out of this site"] = "Déconnectez-moi de ce site";
+App::$strings["Create an account"] = "Créer un compte";
+App::$strings["Help and documentation"] = "Aide et documentation";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Recherche @nom, #tag, contenu";
+App::$strings["Your grid"] = "Votre réseau";
+App::$strings["View your network/grid"] = "Voir votre réseau";
+App::$strings["Mark all grid notifications seen"] = "Marquer toutes les notifications du réseau comme vues";
+App::$strings["Channel home"] = "Mon canal";
+App::$strings["View your channel home"] = "Voir la page d'accueil de votre canal";
+App::$strings["Mark all channel notifications seen"] = "Marquer toutes les notifications du canal comme vues";
+App::$strings["Notices"] = "Notifications";
+App::$strings["Notifications"] = "Notifications";
+App::$strings["View all notifications"] = "Voir toutes les notifications";
+App::$strings["Private mail"] = "Messages privés";
+App::$strings["View your private messages"] = "Voir vos messages privés";
+App::$strings["Mark all private messages seen"] = "Marquer tous les messages privés comme vus";
+App::$strings["Event Calendar"] = "Calendrier des événements";
+App::$strings["View events"] = "Voir les événements";
+App::$strings["Mark all events seen"] = "Marquer tous les événements comme vus";
+App::$strings["Manage Your Channels"] = "Gérer vos canaux";
+App::$strings["Account/Channel Settings"] = "Paramètres du Compte/Canal";
+App::$strings["Site Setup and Configuration"] = "Configuration du site";
+App::$strings["@name, #tag, ?doc, content"] = "@nom, #étiquette, ?doc, contenu";
+App::$strings["Please wait..."] = "Merci de patienter...";
+App::$strings["Add Apps"] = "";
App::$strings["Image exceeds website size limit of %lu bytes"] = "L'image dépasse la taille limite de %lu octets";
App::$strings["Image file is empty."] = "L'image est vide.";
App::$strings["Photo storage failed."] = "Le stockage de l'image a échoué.";
@@ -2211,94 +3034,15 @@ App::$strings["Invalid data packet"] = "Paquet de données invalide";
App::$strings["Unable to verify channel signature"] = "Impossible de vérifier la signature du canal";
App::$strings["Unable to verify site signature for %s"] = "Impossible de vérifier la signature de site pour %s";
App::$strings["invalid target signature"] = "signature de la cible invalide";
-App::$strings["New Page"] = "Nouvelle page";
-App::$strings["Title"] = "Titre";
-App::$strings["Can view my normal stream and posts"] = "Peut voir les publications ordinaires sur mon canal.";
-App::$strings["Can view my default channel profile"] = "Peut voir le profil du canal par défaut.";
-App::$strings["Can view my connections"] = "Peut voir mes contacts";
-App::$strings["Can view my file storage and photos"] = "Peut voir mes fichiers et photos";
-App::$strings["Can view my webpages"] = "Peut voir mes pages web";
-App::$strings["Can send me their channel stream and posts"] = "Peuvent m'envoyer leur flux et les publications de leur canal";
-App::$strings["Can post on my channel page (\"wall\")"] = "Peuvent poster sur la page de mon canal (\"mur\")";
-App::$strings["Can comment on or like my posts"] = "Peuvent commenter et/ou aimer mes publications";
-App::$strings["Can send me private mail messages"] = "Peuvent m'envoyer des messages privés";
-App::$strings["Can like/dislike stuff"] = "Peuvent aimer/ne pas aimer";
-App::$strings["Profiles and things other than posts/comments"] = "Profils et autres excluant les publications/commentaires.";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Peut faire suivre à tous les contacts de mon canal via \"@mention\"";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avancé - utile pour les canaux de type \"forum/groupe\"";
-App::$strings["Can chat with me (when available)"] = "Peut discuter avec moi (quand disponibie)";
-App::$strings["Can write to my file storage and photos"] = "Peut charger des fichiers et des photos dans mon canal";
-App::$strings["Can edit my webpages"] = "Peut modifier mes pages web";
-App::$strings["Can source my public posts in derived channels"] = "Peut rediriger mes publications publiques vers des canaux dérivés";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Plutôt avancé - très utile dans les communautés ouvertes";
-App::$strings["Can administer my channel resources"] = "Peut administrer les ressources de mon canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Très avancé. Ne pas toucher, sauf si vous savez ce que vous faîtes";
-App::$strings["Social Networking"] = "Réseau social";
-App::$strings["Social - Mostly Public"] = "Social - surtout public";
-App::$strings["Social - Restricted"] = "Social - restreint";
-App::$strings["Social - Private"] = "Social - privé";
-App::$strings["Community Forum"] = "Forum communautaire";
-App::$strings["Forum - Mostly Public"] = "Forum - surtout public";
-App::$strings["Forum - Restricted"] = "Forum - restreint";
-App::$strings["Forum - Private"] = "Forum - privé";
-App::$strings["Feed Republish"] = "Republication de flux";
-App::$strings["Feed - Mostly Public"] = "Flux - surtout public";
-App::$strings["Feed - Restricted"] = "Flux - restreint";
-App::$strings["Special Purpose"] = "Utilisation spécifique";
-App::$strings["Special - Celebrity/Soapbox"] = "Spécial - célébrité/promotion";
-App::$strings["Special - Group Repository"] = "Spécial - dépôt partagé";
-App::$strings["Custom/Expert Mode"] = "Mode expert/spécifique";
-App::$strings[" and "] = "et";
-App::$strings["public profile"] = "profil public";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s a changé %2\$s en &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Visiter %2\$s de %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s a mis à jour %2\$s, modifiant %3\$s.";
-App::$strings["Attachments:"] = "Pièces jointes&nbsp;:";
-App::$strings["\$Projectname event notification:"] = "Notification d'événement de \$Projectname&nbsp;:";
-App::$strings["Focus (Hubzilla default)"] = "Focus (par défaut pour Hubzilla)";
-App::$strings["Theme settings"] = "Paramètres du thème";
-App::$strings["Select scheme"] = "Définir la palette de couleurs";
-App::$strings["Narrow navbar"] = "Barre de navigation fine";
-App::$strings["Navigation bar background color"] = "Couleur de fond de la barre de navigation";
-App::$strings["Navigation bar gradient top color"] = "Dégradé de la barre de navigation - couleur du haut";
-App::$strings["Navigation bar gradient bottom color"] = "Dégradé de la barre de navigation - couleur du bas";
-App::$strings["Navigation active button gradient top color"] = "Dégradé du bouton de navigation actif - couleur du haut";
-App::$strings["Navigation active button gradient bottom color"] = "Dégradé du bouton de navigation actif - couleur du bas";
-App::$strings["Navigation bar border color "] = "Couleur de la bordure de la barre de navigation";
-App::$strings["Navigation bar icon color "] = "Couleur des icônes de la barre de navigation";
-App::$strings["Navigation bar active icon color "] = "Couleur de l'icône active de la barre de navigation";
-App::$strings["link color"] = "couleur des liens";
-App::$strings["Set font-color for banner"] = "Définir la couleur du texte de la bannière";
-App::$strings["Set the background color"] = "Définir la couleur d'arrière-plan";
-App::$strings["Set the background image"] = "Définir l'image d'arrière-plan";
-App::$strings["Set the background color of items"] = "Définir la couleur de fond des contributions";
-App::$strings["Set the background color of comments"] = "Couleur de fond des commentaires";
-App::$strings["Set the border color of comments"] = "Couleur de la bordure des commentaires";
-App::$strings["Set the indent for comments"] = "Indentation des commentaires";
-App::$strings["Set the basic color for item icons"] = "Définir la couleur de base pour les icônes des éléments";
-App::$strings["Set the hover color for item icons"] = "Définir la couleur de survol des icônes des éléments";
-App::$strings["Set font-size for the entire application"] = "Définir la taille de police pour l'application entière";
-App::$strings["Example: 14px"] = "Exemple : 14px";
-App::$strings["Set font-size for posts and comments"] = "Définir la taille de police pour les contributions et commentaires";
-App::$strings["Set font-color for posts and comments"] = "Définir la couleur de police pour les contributions et commentaires";
-App::$strings["Set radius of corners"] = "Définir le rayon des arrondis";
-App::$strings["Set shadow depth of photos"] = "Définir la profondeur de l'ombre des photos";
-App::$strings["Set maximum width of content region in pixel"] = "Définir la largeur maximale de la zone des contenus";
-App::$strings["Leave empty for default width"] = "Laissez vide pour avoir la largeur par défaut";
-App::$strings["Left align page content"] = "Aligner à gauche le contenu de la page";
-App::$strings["Set minimum opacity of nav bar - to hide it"] = "Définir l'opacité minimum du bandeau de navigation - pour le cacher";
-App::$strings["Set size of conversation author photo"] = "Définir la taille de la photo de l'auteur d'une conversation";
-App::$strings["Set size of followup author photos"] = "Définir la taille de la photo de l'auteur d'une réponse";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "";
-App::$strings["Update %s failed. See error logs."] = "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur.";
-App::$strings["Update Error at %s"] = "Erreur de mise à jour sur %s";
-App::$strings["Create an account to access services and applications within the Hubzilla"] = "Créez un compte pour pouvoir accéder aux services et applications de Hubzilla";
-App::$strings["Password"] = "Mot de passe";
-App::$strings["Remember me"] = "Se souvenir de moi";
-App::$strings["Forgot your password?"] = "Mot de passe oublié&nbsp;?";
-App::$strings["toggle mobile"] = "(dés)activer mobile";
-App::$strings["Website SSL certificate is not valid. Please correct."] = "Le certificat SSL n'est pas valide. Corrigez le.";
-App::$strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Erreur SSL pour %s";
-App::$strings["Cron/Scheduled tasks not running."] = "Les taches planifiées ne tournent pas.";
-App::$strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Les tâches planifiées ne tournent pas sur %s";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Un groupe supprimé portant ce nom a été ressuscité. Les permissions liées aux éléments existants <strong>peuvent</strong> s'appliquer au groupe et aux membres futurs. Si ce n'est pas ce que vous attendiez, merci de créer un autre groupe avec un nom différent.";
+App::$strings["Add new connections to this privacy group"] = "Ajouter de nouveaux contacts à ce groupe de contacts";
+App::$strings["edit"] = "modifier";
+App::$strings["Edit group"] = "Modifier le groupe";
+App::$strings["Add privacy group"] = "Créer un groupe de contacts";
+App::$strings["Channels not in any privacy group"] = "Contacts n'étant dans aucun groupe de contacts";
+App::$strings["New window"] = "Nouvelle fenêtre";
+App::$strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre ou un onglet différent";
+App::$strings["Logged out."] = "Deconnecté.";
+App::$strings["Failed authentication"] = "Échec de l'authentification";
+App::$strings["Help:"] = "Aide&nbsp;:";
+App::$strings["Not Found"] = "Introuvable";
diff --git a/view/js/acl.js b/view/js/acl.js
index 4dd60d303..e016158e9 100644
--- a/view/js/acl.js
+++ b/view/js/acl.js
@@ -333,20 +333,20 @@ ACL.prototype.update_view = function(value) {
type = itemid[0];
id = itemid.substr(1);
- btshow = $(this).children(".acl-button-show").removeClass("btn-success").addClass("btn-default");
- bthide = $(this).children(".acl-button-hide").removeClass("btn-danger").addClass("btn-default");
+ btshow = $(this).children(".acl-button-show").removeClass("btn-success").addClass("btn-outline-success");
+ bthide = $(this).children(".acl-button-hide").removeClass("btn-danger").addClass("btn-outline-danger");
switch(type) {
case "g":
var uclass = "";
if (that.allow_gid.indexOf(id)>=0) {
- btshow.removeClass("btn-default").addClass("btn-success");
- bthide.removeClass("btn-danger").addClass("btn-default");
+ btshow.removeClass("btn-outline-success").addClass("btn-success");
+ bthide.removeClass("btn-danger").addClass("btn-outline-danger");
uclass="groupshow";
}
if (that.deny_gid.indexOf(id)>=0) {
- btshow.removeClass("btn-success").addClass("btn-default");
- bthide.removeClass("btn-default").addClass("btn-danger");
+ btshow.removeClass("btn-success").addClass("btn-outline-success");
+ bthide.removeClass("btn-outline-danger").addClass("btn-danger");
uclass = "grouphide";
}
$(that.group_uids[id]).each(function(i, v) {
@@ -366,13 +366,13 @@ ACL.prototype.update_view = function(value) {
case "c":
if (that.allow_cid.indexOf(id)>=0){
if(!$(this).hasClass("grouphide") ) {
- btshow.removeClass("btn-default").addClass("btn-success");
- bthide.removeClass("btn-danger").addClass("btn-default");
+ btshow.removeClass("btn-outline-success").addClass("btn-success");
+ bthide.removeClass("btn-danger").addClass("btn-outline-danger");
}
}
if (that.deny_cid.indexOf(id)>=0){
- btshow.removeClass("btn-success").addClass("btn-default");
- bthide.removeClass("btn-default").addClass("btn-danger");
+ btshow.removeClass("btn-success").addClass("btn-outline-success");
+ bthide.removeClass("btn-outline-danger").addClass("btn-danger");
$(this).removeClass("groupshow");
}
}
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
index 5a616b6fc..313e501e2 100644
--- a/view/js/autocomplete.js
+++ b/view/js/autocomplete.js
@@ -60,12 +60,20 @@ function contact_format(item) {
var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick);
if(typeof desc === 'undefined') desc = '';
if(desc) desc = ' ('+desc+')';
- return "<div class='{0}' title='{4}'><img class='dropdown-menu-img-sm' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span><div class='clear'></div></div>".format(item.taggable, item.photo, item.name, desc, item.link);
+ return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span></div>".format(item.taggable, item.photo, item.name, desc, item.link);
}
else
return "<div>" + item.text + "</div>";
}
+function smiley_format(item) {
+ return "<div class='dropdown-item'>" + item.icon + ' ' + item.text + "</div>";
+}
+
+function bbco_format(item) {
+ return "<div class='dropdown-item'>" + item + "</div>";
+}
+
function editor_replace(item) {
if(typeof item.replace !== 'undefined') {
return '$1$2' + item.replace;
@@ -181,15 +189,16 @@ function string2bb(element) {
index: 3,
search: function(term, callback) { contact_search(term, callback, backend_url, 'c', extra_channels, spinelement=false); },
replace: editor_replace,
- template: contact_format,
+ template: contact_format
};
smilies = {
match: /(^|\s)(:[a-z_:]{2,})$/,
index: 2,
search: function(term, callback) { $.getJSON('/smilies/json').done(function(data) { callback($.map(data, function(entry) { return entry.text.indexOf(term) === 0 ? entry : null; })); }); },
- template: function(item) { return item.icon + item.text; },
+ //template: function(item) { return item.icon + item.text; },
replace: function(item) { return "$1" + item.text + ' '; },
+ template: smiley_format
};
this.attr('autocomplete','off');
this.textcomplete([contacts,smilies], {className:'acpopup', zIndex:1020});
@@ -321,7 +330,8 @@ function string2bb(element) {
else {
return '\[' + element + '\] ';
}
- }
+ },
+ template: bbco_format
};
this.attr('autocomplete','off');
diff --git a/view/js/main.js b/view/js/main.js
index 5de4aa9a2..38b9754a1 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -369,10 +369,10 @@ function NavUpdate() {
updateCountsOnly = false;
if(data.network || data.home || data.intros || data.mail || data.all_events || data.notify) {
- $('#notifications-btn').css('color', 'white').prop('disabled', false);
+ $('#notifications-btn').css('opacity', 1);
}
else {
- $('#notifications-btn').css('color', 'grey').prop('disabled', true);
+ $('#notifications-btn').css('opacity', 0.5);
$('#navbar-collapse-1').removeClass('in');
}
@@ -695,7 +695,7 @@ function collapseHeight() {
$(".wall-item-content, .directory-collapse").each(function() {
var orgHeight = $(this).outerHeight(true);
if(orgHeight > divmore_height) {
- if(! $(this).hasClass('divmore')) {
+ if(! $(this).hasClass('divmore') && $(this).has('div.no-collapse').length == 0) {
// check if we will collapse some content above the visible content and compensate the diff later
if($(this).offset().top + divmore_height - $(window).scrollTop() + cDiff - ($(".divgrow-showmore").outerHeight() * i) < 65) {
@@ -939,6 +939,8 @@ function notify_popup_loader(notifyType) {
window.location.href=window.location.href;
}
+ console.log(data);
+
if(data.notify.length == 0){
$("#nav-" + notifyType + "-menu").html(aStr[nothingnew]);
} else {
diff --git a/view/js/mod_cloud.js b/view/js/mod_cloud.js
index 8b8a3ba3f..8af90863e 100644
--- a/view/js/mod_cloud.js
+++ b/view/js/mod_cloud.js
@@ -91,7 +91,7 @@ function prepareHtml(f, i) {
'<td><i class="fa ' + getIconFromType(f.type) + '" title="' + f.type + '"></i></td>' +
'<td>' + f.name + '</td>' +
'<td id="upload-progress-' + i + '"></td><td></td><td></td><td></td><td></td>' +
- '<td class="hidden-xs">' + formatSizeUnits(f.size) + '</td><td class="hidden-xs"></td>' +
+ '<td class="d-none d-md-table-cell">' + formatSizeUnits(f.size) + '</td><td class="d-none d-md-table-cell"></td>' +
'</tr>' +
'<tr id="new-upload-progress-bar-' + i + '" class="new-upload">' +
'<td id="upload-progress-bar-' + i + '" colspan="9" class="upload-progress-bar"></td>' +
diff --git a/view/js/mod_connedit.js b/view/js/mod_connedit.js
index 4739c490c..7100e0d07 100644
--- a/view/js/mod_connedit.js
+++ b/view/js/mod_connedit.js
@@ -82,7 +82,7 @@ $(document).ready(function() {
function doRemove() {
var what = $(this).data('remove');
var element = $(this).parents('div.form-' + what);
- var where = '#abook_edit_form' + $(this).data('id');
+ var where = '#abook-edit-form' + $(this).data('id');
if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
$(where + ' .add-' + what).show()
diff --git a/view/js/mod_display.js b/view/js/mod_display.js
new file mode 100644
index 000000000..60a1cdaa8
--- /dev/null
+++ b/view/js/mod_display.js
@@ -0,0 +1,7 @@
+<script>
+$(document).ready(function() {
+ $(".comment-edit-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1");
+ // make auto-complete work in more places
+ $(".wall-item-comment-wrapper textarea").editor_autocomplete(baseurl+"/acl?f=&n=1");
+});
+</script>
diff --git a/view/js/mod_network.js b/view/js/mod_network.js
index cd36786df..2899bbacd 100644
--- a/view/js/mod_network.js
+++ b/view/js/mod_network.js
@@ -1,5 +1,4 @@
$(document).ready(function() {
$("#search-text").contact_autocomplete(baseurl + '/search_ac','',true);
- $('.jslider-scale ins').addClass('hidden-xs');
});
diff --git a/view/js/mod_profiles.js b/view/js/mod_profiles.js
index acc9f9953..784f64458 100644
--- a/view/js/mod_profiles.js
+++ b/view/js/mod_profiles.js
@@ -38,7 +38,7 @@ $(document).ready(function() {
var what = $(this).data('add');
var id = $(this).data('id');
var element = '#template-form-' + what;
- var where = '#abook-edit-form';
+ var where = '#profile-edit-form';
$(element + ' .remove-field').attr('data-id', id)
@@ -58,7 +58,7 @@ $(document).ready(function() {
function doRemove() {
var what = $(this).data('remove');
var element = $(this).parents('div.form-' + what);
- var where = '#abook_edit_form' + $(this).data('id');
+ var where = '#profile-edit-form' + $(this).data('id');
if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
$(where + ' .add-' + what).show()
diff --git a/view/js/mod_settings.js b/view/js/mod_settings.js
index 5c729fa48..f9faa3d5c 100644
--- a/view/js/mod_settings.js
+++ b/view/js/mod_settings.js
@@ -37,12 +37,19 @@ function setTheme(elm) {
function previewTheme(elm) {
theme = $(elm).val();
+ var schema = $('#id_schema').val();
$.getJSON('theme_info/' + theme,function(data) {
$('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" style="max-width:100%; max-height:300px" alt="' + theme + '"></a>');
$('#id_schema').empty();
- $(data.schemas).each(function(index,item) {
- $('<option/>',{value:item['key'],text:item['val']}).appendTo('#id_schema');
- });
+ if(data.schemas.length) {
+ $(data.schemas).each(function(index,item) {
+ $('<option/>',{value:item['key'],text:item['val']}).appendTo('#id_schema');
+ });
+ $('#id_schema').val(schema ? schema : '---');
+ }
+ else {
+ $('<option/>',{value:'',text:'No schemes available'}).appendTo('#id_schema');
+ }
$('#custom-settings-content .section-content-tools-wrapper').html(data.config);
});
}
diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
index 55ce3e7b3..df00ee6b1 100644
--- a/view/nl/hmessages.po
+++ b/view/nl/hmessages.po
@@ -4,13 +4,13 @@
#
# Translators:
# jeroenpraat <social@jeroenvanrietpaap.nl>, 2015-2016
-# jeroenpraat <social@jeroenvanrietpaap.nl>, 2016
+# jeroenpraat <social@jeroenvanrietpaap.nl>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-12-16 00:04-0800\n"
-"PO-Revision-Date: 2016-12-19 15:18+0000\n"
+"POT-Creation-Date: 2017-03-03 00:05-0800\n"
+"PO-Revision-Date: 2017-03-06 21:47+0000\n"
"Last-Translator: jeroenpraat <social@jeroenvanrietpaap.nl>\n"
"Language-Team: Dutch (http://www.transifex.com/Friendica/red-matrix/language/nl/)\n"
"MIME-Version: 1.0\n"
@@ -19,90 +19,91 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/PermissionRoles.php:227
+#: ../../Zotlabs/Access/PermissionRoles.php:248
#: ../../include/permissions.php:945
msgid "Social Networking"
msgstr "Sociaal netwerk"
-#: ../../Zotlabs/Access/PermissionRoles.php:228
+#: ../../Zotlabs/Access/PermissionRoles.php:249
#: ../../include/permissions.php:945
msgid "Social - Mostly Public"
msgstr "Sociaal - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:229
+#: ../../Zotlabs/Access/PermissionRoles.php:250
#: ../../include/permissions.php:945
msgid "Social - Restricted"
msgstr "Sociaal - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:230
+#: ../../Zotlabs/Access/PermissionRoles.php:251
#: ../../include/permissions.php:945
msgid "Social - Private"
msgstr "Sociaal - Verborgen kanaal"
-#: ../../Zotlabs/Access/PermissionRoles.php:233
+#: ../../Zotlabs/Access/PermissionRoles.php:254
#: ../../include/permissions.php:946
msgid "Community Forum"
msgstr "Groepsforum"
-#: ../../Zotlabs/Access/PermissionRoles.php:234
+#: ../../Zotlabs/Access/PermissionRoles.php:255
#: ../../include/permissions.php:946
msgid "Forum - Mostly Public"
msgstr "Forum - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:235
+#: ../../Zotlabs/Access/PermissionRoles.php:256
#: ../../include/permissions.php:946
msgid "Forum - Restricted"
msgstr "Forum - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:236
+#: ../../Zotlabs/Access/PermissionRoles.php:257
#: ../../include/permissions.php:946
msgid "Forum - Private"
msgstr "Forum - Verborgen kanaal"
-#: ../../Zotlabs/Access/PermissionRoles.php:239
+#: ../../Zotlabs/Access/PermissionRoles.php:260
#: ../../include/permissions.php:947
msgid "Feed Republish"
msgstr "Feed herpubliceren"
-#: ../../Zotlabs/Access/PermissionRoles.php:240
+#: ../../Zotlabs/Access/PermissionRoles.php:261
#: ../../include/permissions.php:947
msgid "Feed - Mostly Public"
msgstr "Feed - Vrijwel alles openbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:241
+#: ../../Zotlabs/Access/PermissionRoles.php:262
#: ../../include/permissions.php:947
msgid "Feed - Restricted"
msgstr "Feed - Beperkt zichtbaar"
-#: ../../Zotlabs/Access/PermissionRoles.php:244
+#: ../../Zotlabs/Access/PermissionRoles.php:265
#: ../../include/permissions.php:948
msgid "Special Purpose"
msgstr "Speciaal doel"
-#: ../../Zotlabs/Access/PermissionRoles.php:245
+#: ../../Zotlabs/Access/PermissionRoles.php:266
#: ../../include/permissions.php:948
msgid "Special - Celebrity/Soapbox"
msgstr "Speciaal - Beroemdheid/alleen volgen"
-#: ../../Zotlabs/Access/PermissionRoles.php:246
+#: ../../Zotlabs/Access/PermissionRoles.php:267
#: ../../include/permissions.php:948
msgid "Special - Group Repository"
msgstr "Speciaal - Groepsopslag"
-#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../Zotlabs/Module/Register.php:213
+#: ../../Zotlabs/Access/PermissionRoles.php:270
+#: ../../Zotlabs/Module/Register.php:213 ../../Zotlabs/Module/Connedit.php:925
#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:445
-#: ../../extend/addon/addon/cdav/cdav.php:277
-#: ../../extend/addon/addon/cdav/cdav.php:284
+#: ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Settings/Channel.php:463
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1148
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:949
+#: ../../extend/addon/addon/cdav/cdav.php:277
+#: ../../extend/addon/addon/cdav/cdav.php:284 ../../include/selectors.php:49
+#: ../../include/selectors.php:66 ../../include/selectors.php:104
+#: ../../include/selectors.php:140 ../../include/connections.php:675
+#: ../../include/connections.php:682 ../../include/permissions.php:949
msgid "Other"
msgstr "Anders"
-#: ../../Zotlabs/Access/PermissionRoles.php:250
+#: ../../Zotlabs/Access/PermissionRoles.php:271
#: ../../include/permissions.php:949
msgid "Custom/Expert Mode"
msgstr "Expertmodus/handmatig aanpassen"
@@ -136,38 +137,46 @@ msgid "Can view my channel webpages"
msgstr "Kan de webpagina's van mijn kanaal bekijken"
#: ../../Zotlabs/Access/Permissions.php:53
+msgid "Can view my wiki pages"
+msgstr "Kan mijn wiki-pagina's bekijken"
+
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can create/edit my channel webpages"
msgstr "Kan wegpagina's van mijn kanaal aanmaken en bewerken"
-#: ../../Zotlabs/Access/Permissions.php:54
+#: ../../Zotlabs/Access/Permissions.php:55
+msgid "Can write to my wiki pages"
+msgstr "Kan mijn wiki-pagina's bewerken"
+
+#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can post on my channel (wall) page"
msgstr "Kan een bericht in mijn kanaal plaatsen"
-#: ../../Zotlabs/Access/Permissions.php:55 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
msgid "Can comment on or like my posts"
msgstr "Kan op mijn berichten reageren of deze (niet) leuk vinden"
-#: ../../Zotlabs/Access/Permissions.php:56 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
msgid "Can send me private mail messages"
msgstr "Kan mij privéberichten sturen"
-#: ../../Zotlabs/Access/Permissions.php:57
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can like/dislike profiles and profile things"
msgstr "Kan profielen en profieldingen leuk en niet leuk vinden "
-#: ../../Zotlabs/Access/Permissions.php:58
+#: ../../Zotlabs/Access/Permissions.php:60
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+"
-#: ../../Zotlabs/Access/Permissions.php:59
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can chat with me"
msgstr "Kan met mij chatten"
-#: ../../Zotlabs/Access/Permissions.php:60 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
msgid "Can source my public posts in derived channels"
msgstr "Kan mijn openbare berichten als bron voor andere kanalen gebruiken"
-#: ../../Zotlabs/Access/Permissions.php:61
+#: ../../Zotlabs/Access/Permissions.php:63
msgid "Can administer my channel"
msgstr "Kan mijn kanaal beheren"
@@ -175,7 +184,7 @@ msgstr "Kan mijn kanaal beheren"
msgid "parent"
msgstr "omhoog"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2682
+#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2700
msgid "Collection"
msgstr "map"
@@ -199,20 +208,19 @@ msgstr "Planning-postvak IN"
msgid "Schedule Outbox"
msgstr "Planning-postvak UIT"
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:789
-#: ../../Zotlabs/Module/Photos.php:1249
-#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:526
-#: ../../Zotlabs/Lib/Apps.php:603
+#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Module/Photos.php:784
+#: ../../Zotlabs/Module/Photos.php:1244
+#: ../../Zotlabs/Module/Embedphotos.php:145 ../../Zotlabs/Lib/Apps.php:561
+#: ../../Zotlabs/Lib/Apps.php:639
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:745
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:746
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:753
-#: ../../include/widgets.php:1684 ../../include/conversation.php:1029
+#: ../../include/widgets.php:1757 ../../include/conversation.php:1177
msgid "Unknown"
msgstr "Onbekend"
#: ../../Zotlabs/Storage/Browser.php:224 ../../Zotlabs/Module/Fbrowser.php:85
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/nav.php:96
-#: ../../include/conversation.php:1681
+#: ../../Zotlabs/Lib/Apps.php:224 ../../include/conversation.php:1843
msgid "Files"
msgstr "Bestanden"
@@ -224,44 +232,49 @@ msgstr "Totaal"
msgid "Shared"
msgstr "Gedeeld"
-#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:321
-#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Layouts.php:184
-#: ../../Zotlabs/Module/Webpages.php:239
+#: ../../Zotlabs/Storage/Browser.php:228 ../../Zotlabs/Storage/Browser.php:330
+#: ../../Zotlabs/Module/Menu.php:118 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Webpages.php:243 ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/Layouts.php:184 ../../Zotlabs/Module/Profiles.php:801
#: ../../extend/addon/addon/cdav/include/widgets.php:127
#: ../../extend/addon/addon/cdav/include/widgets.php:164
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1151
msgid "Create"
msgstr "Aanmaken"
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:323
+#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:332
#: ../../Zotlabs/Module/Cover_photo.php:357
-#: ../../Zotlabs/Module/Photos.php:816 ../../Zotlabs/Module/Photos.php:1370
-#: ../../Zotlabs/Module/Profile_photo.php:410
+#: ../../Zotlabs/Module/Photos.php:811 ../../Zotlabs/Module/Photos.php:1368
+#: ../../Zotlabs/Module/Profile_photo.php:421
#: ../../Zotlabs/Module/Embedphotos.php:157
#: ../../extend/addon/addon/cdav/include/widgets.php:132
#: ../../extend/addon/addon/cdav/include/widgets.php:168
-#: ../../include/widgets.php:1697
+#: ../../include/widgets.php:1770
msgid "Upload"
msgstr "Uploaden"
#: ../../Zotlabs/Storage/Browser.php:233
#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Sharedwithme.php:99 ../../Zotlabs/Module/Wiki.php:151
+#: ../../Zotlabs/Module/Connedit.php:913
+#: ../../Zotlabs/Module/Sharedwithme.php:99
#: ../../Zotlabs/Module/Settings/Oauth.php:89
#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Chat.php:250
+#: ../../Zotlabs/Module/Wiki.php:171 ../../Zotlabs/Module/Chat.php:248
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1136
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:164
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:156
+#: ../../include/widgets.php:976
msgid "Name"
msgstr "Naam"
-#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:152
+#: ../../Zotlabs/Storage/Browser.php:234 ../../Zotlabs/Module/Wiki.php:172
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:157
msgid "Type"
msgstr "Type"
#: ../../Zotlabs/Storage/Browser.php:235
-#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1390
+#: ../../Zotlabs/Module/Sharedwithme.php:101 ../../include/text.php:1414
msgid "Size"
msgstr "Grootte"
@@ -271,39 +284,43 @@ msgid "Last Modified"
msgstr "Laatst gewijzigd"
#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../Zotlabs/Module/Connections.php:290
-#: ../../Zotlabs/Module/Connections.php:310
+#: ../../Zotlabs/Module/Editblock.php:109
+#: ../../Zotlabs/Module/Connections.php:300
+#: ../../Zotlabs/Module/Connections.php:320
#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Editlayout.php:114
#: ../../Zotlabs/Module/Editwebpage.php:145 ../../Zotlabs/Module/Menu.php:112
-#: ../../Zotlabs/Module/Editblock.php:109 ../../Zotlabs/Module/Editpost.php:84
+#: ../../Zotlabs/Module/Editpost.php:85 ../../Zotlabs/Module/Webpages.php:244
#: ../../Zotlabs/Module/Blocks.php:160 ../../Zotlabs/Module/Layouts.php:192
-#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Wiki.php:144
-#: ../../Zotlabs/Module/Wiki.php:246
#: ../../Zotlabs/Module/Settings/Oauth.php:149
-#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Lib/ThreadItem.php:106
-#: ../../Zotlabs/Lib/Apps.php:346
+#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Wiki.php:164
+#: ../../Zotlabs/Module/Wiki.php:271 ../../Zotlabs/Lib/ThreadItem.php:106
+#: ../../Zotlabs/Lib/Apps.php:357
#: ../../extend/addon/addon/cdav/include/widgets.php:125
#: ../../extend/addon/addon/cdav/include/widgets.php:161
-#: ../../include/channel.php:961 ../../include/channel.php:965
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:149
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
-#: ../../include/menu.php:113
+#: ../../include/menu.php:113 ../../include/channel.php:1044
+#: ../../include/channel.php:1048
msgid "Edit"
msgstr "Bewerken"
-#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Module/Connedit.php:635
-#: ../../Zotlabs/Module/Connections.php:263
+#: ../../Zotlabs/Storage/Browser.php:239
+#: ../../Zotlabs/Module/Editblock.php:134
+#: ../../Zotlabs/Module/Connections.php:271
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Editlayout.php:137
#: ../../Zotlabs/Module/Editwebpage.php:170
-#: ../../Zotlabs/Module/Editblock.php:134 ../../Zotlabs/Module/Group.php:177
-#: ../../Zotlabs/Module/Photos.php:1179 ../../Zotlabs/Module/Blocks.php:162
-#: ../../Zotlabs/Module/Webpages.php:242
+#: ../../Zotlabs/Module/Connedit.php:661 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Photos.php:1174 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Blocks.php:162
+#: ../../Zotlabs/Module/Profiles.php:803
#: ../../Zotlabs/Module/Settings/Oauth.php:150
#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Lib/ThreadItem.php:126
-#: ../../Zotlabs/Lib/Apps.php:347
+#: ../../Zotlabs/Lib/Apps.php:358
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:864
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1153
#: ../../include/conversation.php:656
@@ -324,24 +341,42 @@ msgstr "Je gebruikt %1$s van totaal %2$s beschikbare bestandsopslag. (%3$s&#37;)
msgid "WARNING:"
msgstr "WAARSCHUWING:"
-#: ../../Zotlabs/Storage/Browser.php:320
+#: ../../Zotlabs/Storage/Browser.php:325
+msgid ""
+"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
+" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
+"Clients</a>"
+msgstr "Gebruik DAV om grote (video-, audio-) bestanden te uploaden.<br>Zie hiervoor de documentatie over de <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">cloud en desktopclients</a>."
+
+#: ../../Zotlabs/Storage/Browser.php:329
msgid "Create new folder"
msgstr "Nieuwe map aanmaken"
-#: ../../Zotlabs/Storage/Browser.php:322
+#: ../../Zotlabs/Storage/Browser.php:331
msgid "Upload file"
msgstr "Bestand uploaden"
-#: ../../Zotlabs/Storage/Browser.php:335
+#: ../../Zotlabs/Storage/Browser.php:345
msgid "Drop files here to immediately upload"
msgstr "Sleep bestanden hierheen om ze onmiddellijk te uploaden"
-#: ../../Zotlabs/Web/Router.php:67 ../../Zotlabs/Web/WebServer.php:128
-#: ../../Zotlabs/Module/Achievements.php:34
-#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Connedit.php:397
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Bookmarks.php:61
-#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Page.php:35
-#: ../../Zotlabs/Module/Page.php:91 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
+#: ../../Zotlabs/Module/Import_items.php:114
+#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
+#: ../../Zotlabs/Module/Subthread.php:62
+#: ../../extend/addon/addon/frphotos/frphotos.php:81
+#: ../../extend/addon/addon/redfiles/redfiles.php:109
+#: ../../extend/addon/addon/redphotos/redphotos.php:119
+#: ../../include/items.php:327
+msgid "Permission denied"
+msgstr "Toegang geweigerd"
+
+#: ../../Zotlabs/Web/WebServer.php:128
+#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Appman.php:82
+#: ../../Zotlabs/Module/Register.php:77 ../../Zotlabs/Module/Authtest.php:16
+#: ../../Zotlabs/Module/Bookmarks.php:61 ../../Zotlabs/Module/Editblock.php:67
+#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
#: ../../Zotlabs/Module/Connections.php:33
#: ../../Zotlabs/Module/Cover_photo.php:277
#: ../../Zotlabs/Module/Cover_photo.php:290
@@ -351,78 +386,69 @@ msgstr "Sleep bestanden hierheen om ze onmiddellijk te uploaden"
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:104
#: ../../Zotlabs/Module/Editwebpage.php:126
-#: ../../Zotlabs/Module/Channel.php:107 ../../Zotlabs/Module/Channel.php:237
-#: ../../Zotlabs/Module/Channel.php:277 ../../Zotlabs/Module/Network.php:15
-#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Appman.php:76
-#: ../../Zotlabs/Module/Filestorage.php:23
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Menu.php:78
+#: ../../Zotlabs/Module/Locs.php:87 ../../Zotlabs/Module/Connedit.php:388
+#: ../../Zotlabs/Module/Events.php:271 ../../Zotlabs/Module/Filestorage.php:23
#: ../../Zotlabs/Module/Filestorage.php:78
#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Item.php:220
-#: ../../Zotlabs/Module/Item.php:230 ../../Zotlabs/Module/Item.php:1064
-#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Mail.php:163
-#: ../../Zotlabs/Module/Block.php:26 ../../Zotlabs/Module/Block.php:76
+#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Photos.php:73
+#: ../../Zotlabs/Module/Settings.php:59 ../../Zotlabs/Module/Group.php:13
+#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Block.php:26
+#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Manage.php:10
+#: ../../Zotlabs/Module/Message.php:18 ../../Zotlabs/Module/Mitem.php:115
+#: ../../Zotlabs/Module/Editpost.php:17 ../../Zotlabs/Module/Api.php:24
#: ../../Zotlabs/Module/Invite.php:17 ../../Zotlabs/Module/Invite.php:94
-#: ../../Zotlabs/Module/Editblock.php:67 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Mitem.php:115 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Photos.php:73
-#: ../../Zotlabs/Module/Setup.php:212 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
+#: ../../Zotlabs/Module/Webpages.php:116
#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Module/Poke.php:137
-#: ../../Zotlabs/Module/Profiles.php:197 ../../Zotlabs/Module/Profiles.php:595
-#: ../../Zotlabs/Module/Profile.php:68 ../../Zotlabs/Module/Profile.php:76
-#: ../../Zotlabs/Module/Blocks.php:73 ../../Zotlabs/Module/Blocks.php:80
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Rate.php:113
-#: ../../Zotlabs/Module/Like.php:181
-#: ../../Zotlabs/Module/Profile_photo.php:273
-#: ../../Zotlabs/Module/Profile_photo.php:286
-#: ../../Zotlabs/Module/Common.php:39 ../../Zotlabs/Module/Api.php:24
+#: ../../Zotlabs/Module/Item.php:220 ../../Zotlabs/Module/Item.php:230
+#: ../../Zotlabs/Module/Item.php:1067 ../../Zotlabs/Module/Blocks.php:73
+#: ../../Zotlabs/Module/Blocks.php:80 ../../Zotlabs/Module/Layouts.php:71
+#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
+#: ../../Zotlabs/Module/Rate.php:113
+#: ../../Zotlabs/Module/Profile_photo.php:278
+#: ../../Zotlabs/Module/Profile_photo.php:291
+#: ../../Zotlabs/Module/Like.php:181 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Channel.php:115 ../../Zotlabs/Module/Channel.php:245
+#: ../../Zotlabs/Module/Channel.php:285 ../../Zotlabs/Module/Mood.php:116
#: ../../Zotlabs/Module/Regmod.php:21 ../../Zotlabs/Module/Pdledit.php:29
+#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Viewsrc.php:18
#: ../../Zotlabs/Module/Service_limits.php:11
-#: ../../Zotlabs/Module/Webpages.php:116
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Wiki.php:189
-#: ../../Zotlabs/Module/Wiki.php:286 ../../Zotlabs/Module/Sources.php:74
-#: ../../Zotlabs/Module/Suggest.php:30 ../../Zotlabs/Module/Thing.php:274
-#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
+#: ../../Zotlabs/Module/Sharedwithme.php:11
+#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Suggest.php:30
+#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Thing.php:274 ../../Zotlabs/Module/Thing.php:294
+#: ../../Zotlabs/Module/Thing.php:335 ../../Zotlabs/Module/Setup.php:212
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
-#: ../../Zotlabs/Module/Viewsrc.php:18 ../../Zotlabs/Module/Chat.php:100
-#: ../../Zotlabs/Module/Chat.php:105 ../../Zotlabs/Module/Events.php:267
-#: ../../Zotlabs/Lib/Chatroom.php:137
+#: ../../Zotlabs/Module/Wiki.php:50 ../../Zotlabs/Module/Wiki.php:215
+#: ../../Zotlabs/Module/Wiki.php:311 ../../Zotlabs/Module/Chat.php:98
+#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Lib/Chatroom.php:137
#: ../../extend/addon/addon/friendica/dfrn_confirm.php:55
#: ../../extend/addon/addon/keepout/keepout.php:36
#: ../../extend/addon/addon/pumpio/pumpio.php:40
#: ../../extend/addon/addon/openid/Mod_Id.php:53
#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../include/items.php:3422 ../../include/attach.php:142
-#: ../../include/attach.php:189 ../../include/attach.php:253
-#: ../../include/attach.php:267 ../../include/attach.php:274
-#: ../../include/attach.php:341 ../../include/attach.php:355
-#: ../../include/attach.php:362 ../../include/attach.php:439
-#: ../../include/attach.php:906 ../../include/attach.php:977
-#: ../../include/attach.php:1135 ../../include/photos.php:27
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:194
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:291
+#: ../../include/items.php:3447 ../../include/attach.php:144
+#: ../../include/attach.php:191 ../../include/attach.php:255
+#: ../../include/attach.php:269 ../../include/attach.php:276
+#: ../../include/attach.php:343 ../../include/attach.php:357
+#: ../../include/attach.php:364 ../../include/attach.php:441
+#: ../../include/attach.php:908 ../../include/attach.php:979
+#: ../../include/attach.php:1137 ../../include/photos.php:27
msgid "Permission denied."
msgstr "Toegang geweigerd."
-#: ../../Zotlabs/Web/Router.php:157 ../../Zotlabs/Module/Page.php:94
-#: ../../Zotlabs/Module/Display.php:120 ../../Zotlabs/Module/Block.php:79
-#: ../../include/help.php:66
+#: ../../Zotlabs/Web/Router.php:146 ../../Zotlabs/Module/Page.php:94
+#: ../../Zotlabs/Module/Display.php:122 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Lib/NativeWikiPage.php:518 ../../include/help.php:68
msgid "Page not found."
msgstr "Pagina niet gevonden."
-#: ../../Zotlabs/Web/WebServer.php:127 ../../Zotlabs/Module/Dreport.php:10
-#: ../../Zotlabs/Module/Dreport.php:68
-#: ../../Zotlabs/Module/Import_items.php:114 ../../Zotlabs/Module/Group.php:72
-#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Like.php:283
-#: ../../Zotlabs/Module/Subthread.php:62
-#: ../../extend/addon/addon/frphotos/frphotos.php:81
-#: ../../extend/addon/addon/redfiles/redfiles.php:109
-#: ../../extend/addon/addon/redphotos/redphotos.php:119
-#: ../../include/items.php:327
-msgid "Permission denied"
-msgstr "Toegang geweigerd"
-
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please"
@@ -431,19 +457,19 @@ msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelog
#: ../../Zotlabs/Zot/Auth.php:250
#: ../../extend/addon/addon/openid/Mod_Openid.php:76
-#: ../../extend/addon/addon/openid/Mod_Openid.php:183
+#: ../../extend/addon/addon/openid/Mod_Openid.php:178
#, php-format
msgid "Welcome %s. Remote authentication successful."
msgstr "Welkom %s. Authenticatie op afstand geslaagd."
#: ../../Zotlabs/Module/Achievements.php:15
-#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editlayout.php:31
+#: ../../Zotlabs/Module/Connect.php:17 ../../Zotlabs/Module/Editblock.php:31
+#: ../../Zotlabs/Module/Editlayout.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32
#: ../../Zotlabs/Module/Filestorage.php:59
-#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Hcard.php:12
-#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Blocks.php:33
-#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Webpages.php:33
-#: ../../include/channel.php:862
+#: ../../Zotlabs/Module/Webpages.php:33 ../../Zotlabs/Module/Hcard.php:12
+#: ../../Zotlabs/Module/Blocks.php:33 ../../Zotlabs/Module/Layouts.php:31
+#: ../../Zotlabs/Module/Profile.php:20 ../../include/channel.php:945
msgid "Requested profile is not available."
msgstr "Opgevraagd profiel is niet beschikbaar"
@@ -451,13 +477,159 @@ msgstr "Opgevraagd profiel is niet beschikbaar"
msgid "Some blurb about what to do when you're new here"
msgstr "Welkom op $Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van $Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met $Projectname klik je op het vraagteken."
-#: ../../Zotlabs/Module/Chatsvc.php:117
-msgid "Away"
-msgstr "Afwezig"
+#: ../../Zotlabs/Module/Appman.php:38 ../../Zotlabs/Module/Appman.php:55
+msgid "App installed."
+msgstr "App geïnstalleerd"
-#: ../../Zotlabs/Module/Chatsvc.php:122
-msgid "Online"
-msgstr "Online"
+#: ../../Zotlabs/Module/Appman.php:48
+msgid "Malformed app."
+msgstr "Misvormde app."
+
+#: ../../Zotlabs/Module/Appman.php:111
+msgid "Embed code"
+msgstr "Insluitcode"
+
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Edit App"
+msgstr "App bewerken"
+
+#: ../../Zotlabs/Module/Appman.php:117
+msgid "Create App"
+msgstr "App maken"
+
+#: ../../Zotlabs/Module/Appman.php:122
+msgid "Name of app"
+msgstr "Naam van app"
+
+#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
+#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
+#: ../../include/datetime.php:259
+msgid "Required"
+msgstr "Vereist"
+
+#: ../../Zotlabs/Module/Appman.php:123
+msgid "Location (URL) of app"
+msgstr "Locatie (URL) van app"
+
+#: ../../Zotlabs/Module/Appman.php:124 ../../Zotlabs/Module/Events.php:473
+#: ../../Zotlabs/Module/Rbmark.php:101
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:173
+msgid "Description"
+msgstr "Omschrijving"
+
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "Photo icon URL"
+msgstr "URL van pictogram"
+
+#: ../../Zotlabs/Module/Appman.php:125
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels (niet verplicht)"
+
+#: ../../Zotlabs/Module/Appman.php:126
+msgid "Categories (optional, comma separated list)"
+msgstr "Categorieën (niet verplicht, door komma's gescheiden lijst)"
+
+#: ../../Zotlabs/Module/Appman.php:127
+msgid "Version ID"
+msgstr "Versie-ID"
+
+#: ../../Zotlabs/Module/Appman.php:128
+msgid "Price of app"
+msgstr "Prijs van de app"
+
+#: ../../Zotlabs/Module/Appman.php:129
+msgid "Location (URL) to purchase app"
+msgstr "Locatie (URL) om de app aan te schaffen"
+
+#: ../../Zotlabs/Module/Appman.php:134 ../../Zotlabs/Module/Import.php:507
+#: ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Admin/Features.php:66
+#: ../../Zotlabs/Module/Admin/Logs.php:84
+#: ../../Zotlabs/Module/Admin/Profs.php:157
+#: ../../Zotlabs/Module/Admin/Security.php:104
+#: ../../Zotlabs/Module/Admin/Account_edit.php:74
+#: ../../Zotlabs/Module/Admin/Accounts.php:166
+#: ../../Zotlabs/Module/Admin/Channels.php:147
+#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../Zotlabs/Module/Admin/Plugins.php:438
+#: ../../Zotlabs/Module/Admin/Themes.php:158 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Connedit.php:893 ../../Zotlabs/Module/Events.php:493
+#: ../../Zotlabs/Module/Filestorage.php:165
+#: ../../Zotlabs/Module/Photos.php:667 ../../Zotlabs/Module/Photos.php:1053
+#: ../../Zotlabs/Module/Photos.php:1093 ../../Zotlabs/Module/Photos.php:1211
+#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Mail.php:413
+#: ../../Zotlabs/Module/Import_items.php:122
+#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Cal.php:342
+#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Poke.php:186
+#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Pdledit.php:74
+#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
+#: ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Settings/Features.php:47
+#: ../../Zotlabs/Module/Settings/Oauth.php:87
+#: ../../Zotlabs/Module/Settings/Account.php:118
+#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Permcats.php:112
+#: ../../Zotlabs/Module/Settings/Tokens.php:168
+#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
+#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:194
+#: ../../Zotlabs/Module/Chat.php:239 ../../Zotlabs/Module/Xchan.php:15
+#: ../../Zotlabs/Lib/ThreadItem.php:731
+#: ../../extend/addon/addon/chords/Mod_Chords.php:60
+#: ../../extend/addon/addon/diaspora/diaspora.php:714
+#: ../../extend/addon/addon/dwpost/dwpost.php:89
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
+#: ../../extend/addon/addon/friendica/friendica.php:128
+#: ../../extend/addon/addon/frphotos/frphotos.php:96
+#: ../../extend/addon/addon/hubwall/hubwall.php:95
+#: ../../extend/addon/addon/ijpost/ijpost.php:89
+#: ../../extend/addon/addon/irc/irc.php:53
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
+#: ../../extend/addon/addon/libertree/libertree.php:85
+#: ../../extend/addon/addon/ljpost/ljpost.php:86
+#: ../../extend/addon/addon/logrot/logrot.php:35
+#: ../../extend/addon/addon/mailhost/mailhost.php:40
+#: ../../extend/addon/addon/nofed/nofed.php:80
+#: ../../extend/addon/addon/nsabait/nsabait.php:161
+#: ../../extend/addon/addon/nsfw/nsfw.php:92
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
+#: ../../extend/addon/addon/pageheader/pageheader.php:48
+#: ../../extend/addon/addon/piwik/piwik.php:95
+#: ../../extend/addon/addon/planets/planets.php:157
+#: ../../extend/addon/addon/pumpio/pumpio.php:237
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
+#: ../../extend/addon/addon/redfiles/redfiles.php:124
+#: ../../extend/addon/addon/redphotos/redphotos.php:136
+#: ../../extend/addon/addon/redred/redred.php:119
+#: ../../extend/addon/addon/rtof/rtof.php:101
+#: ../../extend/addon/addon/skeleton/skeleton.php:65
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
+#: ../../extend/addon/addon/startpage/startpage.php:113
+#: ../../extend/addon/addon/statusnet/statusnet.php:322
+#: ../../extend/addon/addon/statusnet/statusnet.php:380
+#: ../../extend/addon/addon/statusnet/statusnet.php:432
+#: ../../extend/addon/addon/statusnet/statusnet.php:899
+#: ../../extend/addon/addon/superblock/superblock.php:120
+#: ../../extend/addon/addon/twitter/twitter.php:217
+#: ../../extend/addon/addon/twitter/twitter.php:259
+#: ../../extend/addon/addon/visage/visage.php:170
+#: ../../extend/addon/addon/wppost/wppost.php:113
+#: ../../extend/addon/addon/xmpp/xmpp.php:69
+#: ../../extend/addon/addon/cdav/cdav.php:246
+#: ../../extend/addon/addon/likebanner/likebanner.php:57
+#: ../../extend/addon/addon/mailtest/mailtest.php:100
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:153
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
+#: ../../include/widgets.php:801 ../../include/js_strings.php:22
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Submit"
+msgstr "Opslaan"
#: ../../Zotlabs/Module/Register.php:49
msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
@@ -581,7 +753,7 @@ msgid "yes"
msgstr "Ja"
#: ../../Zotlabs/Module/Register.php:253
-#: ../../Zotlabs/Module/Admin/Site.php:261
+#: ../../Zotlabs/Module/Admin/Site.php:269
msgid "Registration"
msgstr "Registratie"
@@ -589,8 +761,8 @@ msgstr "Registratie"
msgid "Membership on this site is by invitation only."
msgstr "Registreren op deze $Projectname-hub kan alleen op uitnodiging."
-#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:150
-#: ../../boot.php:1702
+#: ../../Zotlabs/Module/Register.php:270 ../../include/nav.php:162
+#: ../../boot.php:1730
msgid "Register"
msgstr "Registreren"
@@ -605,618 +777,156 @@ msgstr "Mogelijk moet op deze hub eerst jouw e-mail geverifieerd worden. Wanneer
msgid "Fetching URL returns error: %1$s"
msgstr "Ophalen URL gaf een foutmelding terug: %1$s"
-#: ../../Zotlabs/Module/Match.php:26
-msgid "Profile Match"
-msgstr "Profielovereenkomst"
-
-#: ../../Zotlabs/Module/Match.php:35
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
-
-#: ../../Zotlabs/Module/Match.php:67
-msgid "is interested in:"
-msgstr "is geïnteresseerd in:"
-
-#: ../../Zotlabs/Module/Match.php:68 ../../Zotlabs/Module/Directory.php:328
-#: ../../Zotlabs/Module/Suggest.php:56 ../../include/channel.php:1036
-#: ../../include/connections.php:78 ../../include/widgets.php:147
-#: ../../include/widgets.php:184 ../../include/conversation.php:937
-msgid "Connect"
-msgstr "Verbinden"
-
-#: ../../Zotlabs/Module/Match.php:74
-msgid "No matches"
-msgstr "Geen overeenkomsten"
-
-#: ../../Zotlabs/Module/Connedit.php:82
-msgid "Could not access contact record."
-msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
-
-#: ../../Zotlabs/Module/Connedit.php:106
-msgid "Could not locate selected profile."
-msgstr "Kon het gekozen profiel niet vinden."
-
-#: ../../Zotlabs/Module/Connedit.php:258
-msgid "Connection updated."
-msgstr "Connectie bijgewerkt."
-
-#: ../../Zotlabs/Module/Connedit.php:260
-msgid "Failed to update connection record."
-msgstr "Bijwerken van connectie-gegevens mislukt."
-
-#: ../../Zotlabs/Module/Connedit.php:310
-msgid "is now connected to"
-msgstr "is nu verbonden met"
-
-#: ../../Zotlabs/Module/Connedit.php:411 ../../Zotlabs/Module/Connedit.php:716
-#: ../../Zotlabs/Module/Admin/Site.php:218 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:97
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
-msgid "No"
-msgstr "Nee"
+#: ../../Zotlabs/Module/Rmagic.php:35
+msgid "Authentication failed."
+msgstr "Authenticatie mislukt."
-#: ../../Zotlabs/Module/Connedit.php:411
-#: ../../Zotlabs/Module/Admin/Site.php:220 ../../Zotlabs/Module/Menu.php:100
-#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../Zotlabs/Module/Mitem.php:162
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
-#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Photos.php:653
-#: ../../Zotlabs/Module/Profiles.php:641 ../../Zotlabs/Module/Api.php:96
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Wiki.php:159
-#: ../../Zotlabs/Module/Settings/Channel.php:289
-#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Events.php:463 ../../Zotlabs/Module/Events.php:464
-#: ../../extend/addon/addon/dwpost/dwpost.php:73
-#: ../../extend/addon/addon/dwpost/dwpost.php:85
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
-#: ../../extend/addon/addon/friendica/dfrn_request.php:865
-#: ../../extend/addon/addon/ijpost/ijpost.php:73
-#: ../../extend/addon/addon/ijpost/ijpost.php:85
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
-#: ../../extend/addon/addon/libertree/libertree.php:69
-#: ../../extend/addon/addon/libertree/libertree.php:81
-#: ../../extend/addon/addon/ljpost/ljpost.php:70
-#: ../../extend/addon/addon/ljpost/ljpost.php:82
-#: ../../extend/addon/addon/nofed/nofed.php:72
-#: ../../extend/addon/addon/nofed/nofed.php:76
-#: ../../extend/addon/addon/nsabait/nsabait.php:157
-#: ../../extend/addon/addon/nsfw/nsfw.php:84
-#: ../../extend/addon/addon/planets/planets.php:153
-#: ../../extend/addon/addon/pumpio/pumpio.php:219
-#: ../../extend/addon/addon/pumpio/pumpio.php:223
-#: ../../extend/addon/addon/pumpio/pumpio.php:227
-#: ../../extend/addon/addon/pumpio/pumpio.php:231
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
-#: ../../extend/addon/addon/redred/redred.php:95
-#: ../../extend/addon/addon/redred/redred.php:99
-#: ../../extend/addon/addon/rtof/rtof.php:81
-#: ../../extend/addon/addon/rtof/rtof.php:85
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
-#: ../../extend/addon/addon/statusnet/statusnet.php:389
-#: ../../extend/addon/addon/statusnet/statusnet.php:411
-#: ../../extend/addon/addon/statusnet/statusnet.php:415
-#: ../../extend/addon/addon/statusnet/statusnet.php:424
-#: ../../extend/addon/addon/twitter/twitter.php:242
-#: ../../extend/addon/addon/twitter/twitter.php:246
-#: ../../extend/addon/addon/twitter/twitter.php:255
-#: ../../extend/addon/addon/visage/visage.php:166
-#: ../../extend/addon/addon/wppost/wppost.php:82
-#: ../../extend/addon/addon/wppost/wppost.php:105
-#: ../../extend/addon/addon/wppost/wppost.php:109
-#: ../../extend/addon/addon/xmpp/xmpp.php:53
-#: ../../extend/addon/addon/cdav/cdav.php:234 ../../include/dir_fns.php:143
-#: ../../include/dir_fns.php:144 ../../include/dir_fns.php:145
-#: ../../view/theme/redbasic/php/config.php:111
-#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1724
-msgid "Yes"
-msgstr "Ja"
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1989
+msgid "Remote Authentication"
+msgstr "Authenticatie op afstand"
-#: ../../Zotlabs/Module/Connedit.php:443
-msgid "Could not access address book record."
-msgstr "Kon geen toegang krijgen tot de record van de connectie."
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1990
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Vul jouw kanaaladres in (bijv. channel@example.com)"
-#: ../../Zotlabs/Module/Connedit.php:463
-msgid "Refresh failed - channel is currently unavailable."
-msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1991
+msgid "Authenticate"
+msgstr "Authenticeren"
-#: ../../Zotlabs/Module/Connedit.php:478 ../../Zotlabs/Module/Connedit.php:487
-#: ../../Zotlabs/Module/Connedit.php:496 ../../Zotlabs/Module/Connedit.php:505
-#: ../../Zotlabs/Module/Connedit.php:518
-msgid "Unable to set address book parameters."
-msgstr "Niet in staat om de parameters van connecties in te stellen."
+#: ../../Zotlabs/Module/Import.php:57 ../../Zotlabs/Module/Import_items.php:42
+msgid "Nothing to import."
+msgstr "Niets gevonden om te importeren"
-#: ../../Zotlabs/Module/Connedit.php:542
-msgid "Connection has been removed."
-msgstr "Connectie is verwijderd"
+#: ../../Zotlabs/Module/Import.php:69 ../../Zotlabs/Module/Import.php:84
+#: ../../Zotlabs/Module/Import_items.php:66
+msgid "Unable to download data from old server"
+msgstr "Niet in staat om gegevens van de oude hub te downloaden"
-#: ../../Zotlabs/Module/Connedit.php:582 ../../Zotlabs/Lib/Apps.php:223
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
-#: ../../include/nav.php:89 ../../include/conversation.php:935
-msgid "View Profile"
-msgstr "Profiel weergeven"
+#: ../../Zotlabs/Module/Import.php:91 ../../Zotlabs/Module/Import_items.php:72
+msgid "Imported file is empty."
+msgstr "Geïmporteerde bestand is leeg"
-#: ../../Zotlabs/Module/Connedit.php:585
+#: ../../Zotlabs/Module/Import.php:111
+#: ../../Zotlabs/Module/Import_items.php:88
#, php-format
-msgid "View %s's profile"
-msgstr "Profiel van %s weergeven"
-
-#: ../../Zotlabs/Module/Connedit.php:589
-msgid "Refresh Permissions"
-msgstr "Permissies vernieuwen"
-
-#: ../../Zotlabs/Module/Connedit.php:592
-msgid "Fetch updated permissions"
-msgstr "Aangepaste permissies ophalen"
-
-#: ../../Zotlabs/Module/Connedit.php:596
-msgid "Recent Activity"
-msgstr "Recente activiteit/berichten"
-
-#: ../../Zotlabs/Module/Connedit.php:599
-msgid "View recent posts and comments"
-msgstr "Recente berichten en reacties weergeven"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-#: ../../Zotlabs/Module/Admin/Accounts.php:175
-msgid "Unblock"
-msgstr "Deblokkeren"
-
-#: ../../Zotlabs/Module/Connedit.php:603
-#: ../../Zotlabs/Module/Admin/Accounts.php:174
-msgid "Block"
-msgstr "Blokkeren"
-
-#: ../../Zotlabs/Module/Connedit.php:606
-msgid "Block (or Unblock) all communications with this connection"
-msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
-
-#: ../../Zotlabs/Module/Connedit.php:607
-msgid "This connection is blocked!"
-msgstr "Deze connectie is geblokkeerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:611
-msgid "Unignore"
-msgstr "Niet meer negeren"
-
-#: ../../Zotlabs/Module/Connedit.php:611
-#: ../../Zotlabs/Module/Connections.php:277
-msgid "Ignore"
-msgstr "Negeren"
-
-#: ../../Zotlabs/Module/Connedit.php:614
-msgid "Ignore (or Unignore) all inbound communications from this connection"
-msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
-
-#: ../../Zotlabs/Module/Connedit.php:615
-msgid "This connection is ignored!"
-msgstr "Deze connectie wordt genegeerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:619
-msgid "Unarchive"
-msgstr "Niet meer archiveren"
-
-#: ../../Zotlabs/Module/Connedit.php:619
-msgid "Archive"
-msgstr "Archiveren"
-
-#: ../../Zotlabs/Module/Connedit.php:622
-msgid ""
-"Archive (or Unarchive) this connection - mark channel dead but keep content"
-msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
-
-#: ../../Zotlabs/Module/Connedit.php:623
-msgid "This connection is archived!"
-msgstr "Deze connectie is gearchiveerd!"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-msgid "Unhide"
-msgstr "Niet meer verbergen"
-
-#: ../../Zotlabs/Module/Connedit.php:627
-msgid "Hide"
-msgstr "Verbergen"
-
-#: ../../Zotlabs/Module/Connedit.php:630
-msgid "Hide or Unhide this connection from your other connections"
-msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
-
-#: ../../Zotlabs/Module/Connedit.php:631
-msgid "This connection is hidden!"
-msgstr "Deze connectie is verborgen!"
-
-#: ../../Zotlabs/Module/Connedit.php:638
-msgid "Delete this connection"
-msgstr "Deze connectie verwijderen"
-
-#: ../../Zotlabs/Module/Connedit.php:655 ../../include/widgets.php:529
-msgid "Me"
-msgstr "Ik"
-
-#: ../../Zotlabs/Module/Connedit.php:656 ../../include/widgets.php:530
-msgid "Family"
-msgstr "Familie"
-
-#: ../../Zotlabs/Module/Connedit.php:657
-#: ../../Zotlabs/Module/Settings/Channel.php:61
-#: ../../Zotlabs/Module/Settings/Channel.php:65
-#: ../../Zotlabs/Module/Settings/Channel.php:66
-#: ../../Zotlabs/Module/Settings/Channel.php:69
-#: ../../Zotlabs/Module/Settings/Channel.php:80
-#: ../../include/selectors.php:123 ../../include/channel.php:402
-#: ../../include/channel.php:403 ../../include/channel.php:410
-#: ../../include/widgets.php:531
-msgid "Friends"
-msgstr "Vrienden"
-
-#: ../../Zotlabs/Module/Connedit.php:658 ../../include/widgets.php:532
-msgid "Acquaintances"
-msgstr "Kennissen"
-
-#: ../../Zotlabs/Module/Connedit.php:659
-#: ../../Zotlabs/Module/Connections.php:92
-#: ../../Zotlabs/Module/Connections.php:107 ../../include/widgets.php:533
-msgid "All"
-msgstr "Alles"
-
-#: ../../Zotlabs/Module/Connedit.php:716
-msgid "Approve this connection"
-msgstr "Deze connectie accepteren"
-
-#: ../../Zotlabs/Module/Connedit.php:716
-msgid "Accept connection to allow communication"
-msgstr "Keur deze connectie goed om communicatie toe te staan"
-
-#: ../../Zotlabs/Module/Connedit.php:721
-msgid "Set Affinity"
-msgstr "Verwantschapsfilter instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:724
-msgid "Set Profile"
-msgstr "Profiel instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:727
-msgid "Set Affinity & Profile"
-msgstr "Verwantschapsfilter en profiel instellen"
-
-#: ../../Zotlabs/Module/Connedit.php:776
-msgid "none"
-msgstr "geen"
-
-#: ../../Zotlabs/Module/Connedit.php:780 ../../include/widgets.php:656
-msgid "Connection Default Permissions"
-msgstr "Standaard permissies voor connecties"
+msgid "Warning: Database versions differ by %1$d updates."
+msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
-#: ../../Zotlabs/Module/Connedit.php:780 ../../include/items.php:3909
+#: ../../Zotlabs/Module/Import.php:134
#, php-format
-msgid "Connection: %s"
-msgstr "Connectie: %s"
-
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Apply these permissions automatically"
-msgstr "Deze permissies automatisch toepassen"
-
-#: ../../Zotlabs/Module/Connedit.php:781
-msgid "Connection requests will be approved without your interaction"
-msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
-
-#: ../../Zotlabs/Module/Connedit.php:784
-msgid "This connection's primary address is"
-msgstr "Het primaire kanaaladres van deze connectie is"
-
-#: ../../Zotlabs/Module/Connedit.php:785
-msgid "Available locations:"
-msgstr "Beschikbare locaties:"
-
-#: ../../Zotlabs/Module/Connedit.php:789
-msgid ""
-"The permissions indicated on this page will be applied to all new "
-"connections."
-msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
-
-#: ../../Zotlabs/Module/Connedit.php:790
-msgid "Connection Tools"
-msgstr "Hulpmiddelen"
-
-#: ../../Zotlabs/Module/Connedit.php:792
-msgid "Slide to adjust your degree of friendship"
-msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
-
-#: ../../Zotlabs/Module/Connedit.php:793 ../../Zotlabs/Module/Rate.php:155
-#: ../../include/js_strings.php:20
-msgid "Rating"
-msgstr "Beoordeling"
+msgid "Your service plan only allows %d channels."
+msgstr "Jouw abonnement staat maar %d kanalen toe."
-#: ../../Zotlabs/Module/Connedit.php:794
-msgid "Slide to adjust your rating"
-msgstr "Gebruik de schuif om je beoordeling te geven"
+#: ../../Zotlabs/Module/Import.php:149
+msgid "No channel. Import failed."
+msgstr "Geen kanaal. Importeren mislukt."
-#: ../../Zotlabs/Module/Connedit.php:795 ../../Zotlabs/Module/Connedit.php:800
-msgid "Optionally explain your rating"
-msgstr "Verklaar jouw beoordeling (niet verplicht)"
+#: ../../Zotlabs/Module/Import.php:467
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:142
+msgid "Import completed."
+msgstr "Import voltooid."
-#: ../../Zotlabs/Module/Connedit.php:797
-msgid "Custom Filter"
-msgstr "Berichtenfilter"
+#: ../../Zotlabs/Module/Import.php:488
+msgid "You must be logged in to use this feature."
+msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
-#: ../../Zotlabs/Module/Connedit.php:798
-msgid "Only import posts with this text"
-msgstr "Importeer alleen berichten met deze tekst"
+#: ../../Zotlabs/Module/Import.php:493
+msgid "Import Channel"
+msgstr "Kanaal importeren"
-#: ../../Zotlabs/Module/Connedit.php:798 ../../Zotlabs/Module/Connedit.php:799
+#: ../../Zotlabs/Module/Import.php:494
msgid ""
-"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
-"all posts"
-msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
+"Use this form to import an existing channel from a different server/hub. You"
+" may retrieve the channel identity from the old server/hub via the network "
+"or provide an export file."
+msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
-#: ../../Zotlabs/Module/Connedit.php:799
-msgid "Do not import posts with this text"
-msgstr "Importeer geen berichten met deze tekst"
+#: ../../Zotlabs/Module/Import.php:495
+#: ../../Zotlabs/Module/Import_items.php:121
+msgid "File to Upload"
+msgstr "Bestand om te uploaden"
-#: ../../Zotlabs/Module/Connedit.php:801
-msgid "This information is public!"
-msgstr "Deze informatie is openbaar!"
+#: ../../Zotlabs/Module/Import.php:496
+msgid "Or provide the old server/hub details"
+msgstr "Of vul de gegevens van de oude hub in"
-#: ../../Zotlabs/Module/Connedit.php:806
-msgid "Connection Pending Approval"
-msgstr "Connectie moet nog geaccepteerd worden"
+#: ../../Zotlabs/Module/Import.php:497
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Jouw oude kanaaladres (xyz@example.com)"
-#: ../../Zotlabs/Module/Connedit.php:809
-#: ../../Zotlabs/Module/Settings/Tokens.php:163
-msgid "inherited"
-msgstr "geërfd"
+#: ../../Zotlabs/Module/Import.php:498
+msgid "Your old login email address"
+msgstr "Het e-mailadres van je oude account"
-#: ../../Zotlabs/Module/Connedit.php:810 ../../Zotlabs/Module/Locs.php:121
-#: ../../Zotlabs/Module/Connect.php:98
-#: ../../Zotlabs/Module/Admin/Features.php:66
-#: ../../Zotlabs/Module/Admin/Logs.php:84
-#: ../../Zotlabs/Module/Admin/Plugins.php:429
-#: ../../Zotlabs/Module/Admin/Profs.php:157
-#: ../../Zotlabs/Module/Admin/Security.php:104
-#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Account_edit.php:74
-#: ../../Zotlabs/Module/Admin/Accounts.php:166
-#: ../../Zotlabs/Module/Admin/Channels.php:147
-#: ../../Zotlabs/Module/Admin/Site.php:260 ../../Zotlabs/Module/Appman.php:127
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Mail.php:412
-#: ../../Zotlabs/Module/Import_items.php:122
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Group.php:85
-#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Mood.php:139
-#: ../../Zotlabs/Module/Photos.php:668 ../../Zotlabs/Module/Photos.php:1058
-#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1216
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
-#: ../../Zotlabs/Module/Poke.php:186 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Pconfig.php:107 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Cal.php:342
-#: ../../Zotlabs/Module/Wiki.php:148 ../../Zotlabs/Module/Sources.php:114
-#: ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Settings/Features.php:47
-#: ../../Zotlabs/Module/Settings/Oauth.php:87
-#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Channel.php:455
-#: ../../Zotlabs/Module/Settings/Display.php:196
-#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Import.php:543 ../../Zotlabs/Module/Chat.php:196
-#: ../../Zotlabs/Module/Chat.php:241 ../../Zotlabs/Module/Xchan.php:15
-#: ../../Zotlabs/Module/Events.php:484 ../../Zotlabs/Lib/ThreadItem.php:729
-#: ../../extend/addon/addon/chords/Mod_Chords.php:60
-#: ../../extend/addon/addon/diaspora/diaspora.php:710
-#: ../../extend/addon/addon/dwpost/dwpost.php:89
-#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:124
-#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/frphotos/frphotos.php:96
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
-#: ../../extend/addon/addon/hubwall/hubwall.php:95
-#: ../../extend/addon/addon/ijpost/ijpost.php:89
-#: ../../extend/addon/addon/irc/irc.php:53
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
-#: ../../extend/addon/addon/libertree/libertree.php:85
-#: ../../extend/addon/addon/ljpost/ljpost.php:86
-#: ../../extend/addon/addon/logrot/logrot.php:35
-#: ../../extend/addon/addon/mailhost/mailhost.php:40
-#: ../../extend/addon/addon/nofed/nofed.php:80
-#: ../../extend/addon/addon/nsabait/nsabait.php:161
-#: ../../extend/addon/addon/nsfw/nsfw.php:92
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:52
-#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:168
-#: ../../extend/addon/addon/pageheader/pageheader.php:48
-#: ../../extend/addon/addon/piwik/piwik.php:95
-#: ../../extend/addon/addon/planets/planets.php:157
-#: ../../extend/addon/addon/pumpio/pumpio.php:237
-#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:85
-#: ../../extend/addon/addon/redfiles/redfiles.php:124
-#: ../../extend/addon/addon/redphotos/redphotos.php:136
-#: ../../extend/addon/addon/redred/redred.php:119
-#: ../../extend/addon/addon/rtof/rtof.php:101
-#: ../../extend/addon/addon/skeleton/skeleton.php:65
-#: ../../extend/addon/addon/smileybutton/smileybutton.php:281
-#: ../../extend/addon/addon/startpage/startpage.php:113
-#: ../../extend/addon/addon/statusnet/statusnet.php:322
-#: ../../extend/addon/addon/statusnet/statusnet.php:380
-#: ../../extend/addon/addon/statusnet/statusnet.php:432
-#: ../../extend/addon/addon/statusnet/statusnet.php:899
-#: ../../extend/addon/addon/superblock/superblock.php:118
-#: ../../extend/addon/addon/twitter/twitter.php:217
-#: ../../extend/addon/addon/twitter/twitter.php:259
-#: ../../extend/addon/addon/visage/visage.php:170
-#: ../../extend/addon/addon/wppost/wppost.php:113
-#: ../../extend/addon/addon/xmpp/xmpp.php:69
-#: ../../extend/addon/addon/cdav/cdav.php:246
-#: ../../extend/addon/addon/likebanner/likebanner.php:57
-#: ../../extend/addon/addon/mailtest/mailtest.php:100
-#: ../../include/js_strings.php:22 ../../include/widgets.php:796
-#: ../../view/theme/redbasic/php/config.php:106
-msgid "Submit"
-msgstr "Opslaan"
+#: ../../Zotlabs/Module/Import.php:499
+msgid "Your old login password"
+msgstr "Wachtwoord van jouw oude account"
-#: ../../Zotlabs/Module/Connedit.php:811
-#, php-format
+#: ../../Zotlabs/Module/Import.php:500
msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
-
-#: ../../Zotlabs/Module/Connedit.php:813
-#: ../../Zotlabs/Module/Settings/Tokens.php:160
-msgid "Their Settings"
-msgstr "Hun instellingen"
+"For either option, please choose whether to make this hub your new primary "
+"address, or whether your old location should continue this role. You will be"
+" able to post from either location, but only one can be marked as the "
+"primary location for files, photos, and media."
+msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
-#: ../../Zotlabs/Module/Connedit.php:814
-#: ../../Zotlabs/Module/Settings/Tokens.php:161
-msgid "My Settings"
-msgstr "Mijn instellingen"
+#: ../../Zotlabs/Module/Import.php:501
+msgid "Make this hub my primary location"
+msgstr "Stel deze hub als mijn primaire locatie in"
-#: ../../Zotlabs/Module/Connedit.php:816
-#: ../../Zotlabs/Module/Settings/Tokens.php:165
-msgid "Individual Permissions"
-msgstr "Individuele permissies"
+#: ../../Zotlabs/Module/Import.php:502
+msgid "Move this channel (disable all previous locations)"
+msgstr "Verplaats dit kanaal (schakelt alle voormalige locaties uit)"
-#: ../../Zotlabs/Module/Connedit.php:817
-#: ../../Zotlabs/Module/Settings/Tokens.php:166
-msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can <strong>not</strong> change those"
-" settings here."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
+#: ../../Zotlabs/Module/Import.php:503
+msgid "Import a few months of posts if possible (limited by available memory"
+msgstr "Importeer enkele maanden aan berichten wanneer mogelijk (afhankelijk van hoeveelheid geheugen hub)"
-#: ../../Zotlabs/Module/Connedit.php:818
+#: ../../Zotlabs/Module/Import.php:504
msgid ""
-"Some permissions may be inherited from your channel's <a "
-"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
-"priority than individual settings. You can change those settings here but "
-"they wont have any impact unless the inherited setting changes."
-msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
-
-#: ../../Zotlabs/Module/Connedit.php:819
-msgid "Last update:"
-msgstr "Laatste wijziging:"
-
-#: ../../Zotlabs/Module/Dreport.php:45
-msgid "Invalid message"
-msgstr "Ongeldig bericht"
-
-#: ../../Zotlabs/Module/Dreport.php:78
-msgid "no results"
-msgstr "geen resultaten"
-
-#: ../../Zotlabs/Module/Dreport.php:93
-msgid "channel sync processed"
-msgstr "kanaalsync verwerkt"
-
-#: ../../Zotlabs/Module/Dreport.php:97
-msgid "queued"
-msgstr "in wachtrij"
-
-#: ../../Zotlabs/Module/Dreport.php:101
-msgid "posted"
-msgstr "verstuurd"
-
-#: ../../Zotlabs/Module/Dreport.php:105
-msgid "accepted for delivery"
-msgstr "geaccepteerd om afgeleverd te worden"
+"This process may take several minutes to complete. Please submit the form "
+"only once and leave this page open until finished."
+msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
-#: ../../Zotlabs/Module/Dreport.php:109
-msgid "updated"
-msgstr "geüpdatet"
+#: ../../Zotlabs/Module/Chatsvc.php:131
+msgid "Away"
+msgstr "Afwezig"
-#: ../../Zotlabs/Module/Dreport.php:112
-msgid "update ignored"
-msgstr "update genegeerd"
+#: ../../Zotlabs/Module/Chatsvc.php:136
+msgid "Online"
+msgstr "Online"
-#: ../../Zotlabs/Module/Dreport.php:115
-msgid "permission denied"
-msgstr "toegang geweigerd"
+#: ../../Zotlabs/Module/Help.php:23
+msgid "Documentation Search"
+msgstr "Zoek documentatie"
-#: ../../Zotlabs/Module/Dreport.php:119
-msgid "recipient not found"
-msgstr "ontvanger niet gevonden"
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1827
+msgid "About"
+msgstr "Over"
-#: ../../Zotlabs/Module/Dreport.php:122
-msgid "mail recalled"
-msgstr "Privébericht ingetrokken"
+#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
+msgid "Members"
+msgstr "Kanalen"
-#: ../../Zotlabs/Module/Dreport.php:125
-msgid "duplicate mail received"
-msgstr "dubbel privébericht ontvangen"
+#: ../../Zotlabs/Module/Help.php:82
+msgid "Administrators"
+msgstr "Beheerders"
-#: ../../Zotlabs/Module/Dreport.php:128
-msgid "mail delivered"
-msgstr "privébericht afgeleverd"
+#: ../../Zotlabs/Module/Help.php:83
+msgid "Developers"
+msgstr "Ontwikkelaars"
-#: ../../Zotlabs/Module/Dreport.php:148
-#, php-format
-msgid "Delivery report for %1$s"
-msgstr "Afleveringsrapport voor %1$s"
+#: ../../Zotlabs/Module/Help.php:84
+msgid "Tutorials"
+msgstr "Zelfstudie"
-#: ../../Zotlabs/Module/Dreport.php:151
-msgid "Options"
-msgstr "Opties"
+#: ../../Zotlabs/Module/Help.php:93
+msgid "$Projectname Documentation"
+msgstr "$Projectname-documentatie"
-#: ../../Zotlabs/Module/Dreport.php:152
-msgid "Redeliver"
-msgstr "Opnieuw afleveren"
+#: ../../Zotlabs/Module/Help.php:94
+msgid "Contents"
+msgstr "Inhoud"
#: ../../Zotlabs/Module/Bookmarks.php:53
msgid "Bookmark added"
@@ -1230,81 +940,6 @@ msgstr "Mijn bladwijzers"
msgid "My Connections Bookmarks"
msgstr "Bladwijzers van mijn connecties"
-#: ../../Zotlabs/Module/Acl.php:313
-msgid "network"
-msgstr "netwerk"
-
-#: ../../Zotlabs/Module/Acl.php:323
-msgid "RSS"
-msgstr "RSS"
-
-#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
-msgid "Location not found."
-msgstr "Locatie niet gevonden."
-
-#: ../../Zotlabs/Module/Locs.php:62
-msgid "Location lookup failed."
-msgstr "Opzoeken locatie mislukt"
-
-#: ../../Zotlabs/Module/Locs.php:66
-msgid ""
-"Please select another location to become primary before removing the primary"
-" location."
-msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
-
-#: ../../Zotlabs/Module/Locs.php:95
-msgid "Syncing locations"
-msgstr "Locaties synchronizeren"
-
-#: ../../Zotlabs/Module/Locs.php:105
-msgid "No locations found."
-msgstr "Geen locaties gevonden."
-
-#: ../../Zotlabs/Module/Locs.php:116
-msgid "Manage Channel Locations"
-msgstr "Kanaallocaties beheren"
-
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
-#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:692
-#: ../../Zotlabs/Module/Events.php:468
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Locatie"
-
-#: ../../Zotlabs/Module/Locs.php:118
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Profiles.php:464
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Adres"
-
-#: ../../Zotlabs/Module/Locs.php:119
-msgid "Primary"
-msgstr "Primair"
-
-#: ../../Zotlabs/Module/Locs.php:120 ../../Zotlabs/Module/Menu.php:113
-msgid "Drop"
-msgstr "Verwijderen"
-
-#: ../../Zotlabs/Module/Locs.php:122
-msgid "Sync Now"
-msgstr "Nu synchroniseren"
-
-#: ../../Zotlabs/Module/Locs.php:123
-msgid "Please wait several minutes between consecutive operations."
-msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
-
-#: ../../Zotlabs/Module/Locs.php:124
-msgid ""
-"When possible, drop a location by logging into that website/hub and removing"
-" your channel."
-msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
-
-#: ../../Zotlabs/Module/Locs.php:125
-msgid "Use this form to drop the location if the hub is no longer operating."
-msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
-
#: ../../Zotlabs/Module/Connect.php:61 ../../Zotlabs/Module/Connect.php:109
msgid "Continue"
msgstr "Ga verder"
@@ -1348,12 +983,128 @@ msgstr "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigena
msgid "Restricted or Premium Channel"
msgstr "Beperkt of premiumkanaal"
+#: ../../Zotlabs/Module/Admin.php:60
+#: ../../Zotlabs/Module/Admin/Plugins.php:259
+#: ../../Zotlabs/Module/Admin/Themes.php:72
+#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:35
+#: ../../Zotlabs/Module/Viewsrc.php:24 ../../Zotlabs/Module/Thing.php:89
+#: ../../include/items.php:3368
+msgid "Item not found."
+msgstr "Item niet gevonden."
+
+#: ../../Zotlabs/Module/Admin.php:94
+msgid "# Accounts"
+msgstr "# accounts"
+
+#: ../../Zotlabs/Module/Admin.php:95
+msgid "# blocked accounts"
+msgstr "# geblokkeerde accounts"
+
+#: ../../Zotlabs/Module/Admin.php:96
+msgid "# expired accounts"
+msgstr "# verlopen accounts"
+
+#: ../../Zotlabs/Module/Admin.php:97
+msgid "# expiring accounts"
+msgstr "# accounts die nog moeten verlopen"
+
+#: ../../Zotlabs/Module/Admin.php:108
+msgid "# Channels"
+msgstr "# Kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:109
+msgid "# primary"
+msgstr "# primair"
+
+#: ../../Zotlabs/Module/Admin.php:110
+msgid "# clones"
+msgstr "# klonen"
+
+#: ../../Zotlabs/Module/Admin.php:116
+msgid "Message queues"
+msgstr "Berichtenwachtrij"
+
+#: ../../Zotlabs/Module/Admin.php:133
+msgid "Your software should be updated"
+msgstr "Jouw software moet worden bijgewerkt "
+
+#: ../../Zotlabs/Module/Admin.php:137 ../../Zotlabs/Module/Admin/Logs.php:82
+#: ../../Zotlabs/Module/Admin/Security.php:86
+#: ../../Zotlabs/Module/Admin/Accounts.php:164
+#: ../../Zotlabs/Module/Admin/Channels.php:145
+#: ../../Zotlabs/Module/Admin/Site.php:266
+#: ../../Zotlabs/Module/Admin/Plugins.php:341
+#: ../../Zotlabs/Module/Admin/Plugins.php:436
+#: ../../Zotlabs/Module/Admin/Themes.php:122
+#: ../../Zotlabs/Module/Admin/Themes.php:156
+msgid "Administration"
+msgstr "Beheer"
+
+#: ../../Zotlabs/Module/Admin.php:138
+msgid "Summary"
+msgstr "Samenvatting"
+
+#: ../../Zotlabs/Module/Admin.php:141
+msgid "Registered accounts"
+msgstr "Geregistreerde accounts"
+
+#: ../../Zotlabs/Module/Admin.php:142
+msgid "Pending registrations"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../Zotlabs/Module/Admin.php:143
+msgid "Registered channels"
+msgstr "Geregistreerde kanalen"
+
+#: ../../Zotlabs/Module/Admin.php:144
+msgid "Active plugins"
+msgstr "Ingeschakelde plugins"
+
+#: ../../Zotlabs/Module/Admin.php:145
+msgid "Version"
+msgstr "Versie"
+
+#: ../../Zotlabs/Module/Admin.php:146
+msgid "Repository version (master)"
+msgstr "Versie repository (master)"
+
+#: ../../Zotlabs/Module/Admin.php:147
+msgid "Repository version (dev)"
+msgstr "Versie repository (dev)"
+
+#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
+#: ../../Zotlabs/Module/Editlayout.php:79
+#: ../../Zotlabs/Module/Editwebpage.php:80
+#: ../../Zotlabs/Module/Editpost.php:24
+msgid "Item not found"
+msgstr "Item niet gevonden"
+
+#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
+#: ../../Zotlabs/Module/Blocks.php:155
+msgid "Block Name"
+msgstr "Bloknaam"
+
+#: ../../Zotlabs/Module/Editblock.php:111
+#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:287
+#: ../../Zotlabs/Module/Mail.php:412 ../../Zotlabs/Module/Chat.php:205
+#: ../../include/conversation.php:1295
+msgid "Insert web link"
+msgstr "Weblink invoegen"
+
+#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1406
+msgid "Title (optional)"
+msgstr "Titel (niet verplicht)"
+
+#: ../../Zotlabs/Module/Editblock.php:133
+msgid "Edit Block"
+msgstr "Blok bewerken"
+
#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
msgid "Invalid item."
msgstr "Ongeldig item."
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Block.php:43 ../../Zotlabs/Module/Cal.php:62
+#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Block.php:43
+#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
#: ../../Zotlabs/Module/Wall_upload.php:31
msgid "Channel not found."
msgstr "Kanaal niet gevonden."
@@ -1378,91 +1129,67 @@ msgstr "- kies map -"
#: ../../Zotlabs/Module/Filer.php:53 ../../Zotlabs/Module/Admin/Profs.php:74
#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
-#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/text.php:987
-#: ../../include/text.php:999 ../../include/widgets.php:201
+#: ../../Zotlabs/Module/Rbmark.php:104 ../../include/widgets.php:188
+#: ../../include/text.php:1011 ../../include/text.php:1023
msgid "Save"
msgstr "Opslaan"
-#: ../../Zotlabs/Module/Manage.php:136
-#: ../../Zotlabs/Module/New_channel.php:121
-#, php-format
-msgid "You have created %1$.0f of %2$.0f allowed channels."
-msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
-
-#: ../../Zotlabs/Module/Manage.php:143
-msgid "Create a new channel"
-msgstr "Nieuw kanaal aanmaken"
-
-#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:772
-#: ../../Zotlabs/Module/Wiki.php:147 ../../Zotlabs/Module/Chat.php:255
-msgid "Create New"
-msgstr "Nieuwe aanmaken"
-
-#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/nav.php:209
-msgid "Channel Manager"
-msgstr "Kanaalbeheer"
-
-#: ../../Zotlabs/Module/Manage.php:165
-msgid "Current Channel"
-msgstr "Huidig kanaal"
-
-#: ../../Zotlabs/Module/Manage.php:167
-msgid "Switch to one of your channels by selecting it."
-msgstr "Activeer een van jouw andere kanalen door er op te klikken."
-
-#: ../../Zotlabs/Module/Manage.php:168
-msgid "Default Channel"
-msgstr "Standaardkanaal"
+#: ../../Zotlabs/Module/Ping.php:254
+msgid "sent you a private message"
+msgstr "stuurde jou een privébericht"
-#: ../../Zotlabs/Module/Manage.php:169
-msgid "Make Default"
-msgstr "Als standaard instellen"
+#: ../../Zotlabs/Module/Ping.php:302
+msgid "added your channel"
+msgstr "voegde jouw kanaal toe"
-#: ../../Zotlabs/Module/Manage.php:172
-#, php-format
-msgid "%d new messages"
-msgstr "%d nieuwe berichten"
+#: ../../Zotlabs/Module/Ping.php:312
+msgid "g A l F d"
+msgstr "G:i, l d F"
-#: ../../Zotlabs/Module/Manage.php:173
-#, php-format
-msgid "%d new introductions"
-msgstr "%d nieuwe connectieverzoeken"
+#: ../../Zotlabs/Module/Ping.php:330
+msgid "[today]"
+msgstr "[vandaag]"
-#: ../../Zotlabs/Module/Manage.php:175
-msgid "Delegated Channel"
-msgstr "Uitbesteed kanaal"
+#: ../../Zotlabs/Module/Ping.php:339
+msgid "posted an event"
+msgstr "plaatste een gebeurtenis"
#: ../../Zotlabs/Module/Connections.php:56
#: ../../Zotlabs/Module/Connections.php:161
-#: ../../Zotlabs/Module/Connections.php:242
+#: ../../Zotlabs/Module/Connections.php:250
msgid "Blocked"
msgstr "Geblokkeerd"
#: ../../Zotlabs/Module/Connections.php:61
#: ../../Zotlabs/Module/Connections.php:168
-#: ../../Zotlabs/Module/Connections.php:241
+#: ../../Zotlabs/Module/Connections.php:249
msgid "Ignored"
msgstr "Genegeerd"
#: ../../Zotlabs/Module/Connections.php:66
#: ../../Zotlabs/Module/Connections.php:182
-#: ../../Zotlabs/Module/Connections.php:240
+#: ../../Zotlabs/Module/Connections.php:248
msgid "Hidden"
msgstr "Verborgen"
#: ../../Zotlabs/Module/Connections.php:71
#: ../../Zotlabs/Module/Connections.php:175
-#: ../../Zotlabs/Module/Connections.php:239
+#: ../../Zotlabs/Module/Connections.php:247
msgid "Archived"
msgstr "Gearchiveerd"
#: ../../Zotlabs/Module/Connections.php:76
#: ../../Zotlabs/Module/Connections.php:86 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1576
+#: ../../include/conversation.php:1724
msgid "New"
msgstr "Nieuw"
+#: ../../Zotlabs/Module/Connections.php:92
+#: ../../Zotlabs/Module/Connections.php:107
+#: ../../Zotlabs/Module/Connedit.php:720 ../../include/widgets.php:530
+msgid "All"
+msgstr "Alles"
+
#: ../../Zotlabs/Module/Connections.php:138
msgid "New Connections"
msgstr "Nieuwe connecties"
@@ -1472,7 +1199,7 @@ msgid "Show pending (new) connections"
msgstr "Nog te accepteren (nieuwe) connecties weergeven"
#: ../../Zotlabs/Module/Connections.php:145
-#: ../../Zotlabs/Module/Profperm.php:144
+#: ../../Zotlabs/Module/Profperm.php:140
msgid "All Connections"
msgstr "Alle connecties"
@@ -1496,79 +1223,88 @@ msgstr "Toon alleen gearchiveerde connecties"
msgid "Only show hidden connections"
msgstr "Toon alleen verborgen connecties"
-#: ../../Zotlabs/Module/Connections.php:238
+#: ../../Zotlabs/Module/Connections.php:246
msgid "Pending approval"
msgstr "Moet nog geaccepteerd worden"
-#: ../../Zotlabs/Module/Connections.php:254
+#: ../../Zotlabs/Module/Connections.php:262
#, php-format
msgid "%1$s [%2$s]"
msgstr "%1$s [%2$s]"
-#: ../../Zotlabs/Module/Connections.php:255
+#: ../../Zotlabs/Module/Connections.php:263
msgid "Edit connection"
msgstr "Connectie bewerken"
-#: ../../Zotlabs/Module/Connections.php:256
+#: ../../Zotlabs/Module/Connections.php:264
msgid "Delete connection"
msgstr "Connectie verwijderen"
-#: ../../Zotlabs/Module/Connections.php:265
+#: ../../Zotlabs/Module/Connections.php:273
msgid "Channel address"
msgstr "Kanaaladres"
-#: ../../Zotlabs/Module/Connections.php:267
+#: ../../Zotlabs/Module/Connections.php:275
msgid "Network"
msgstr "Netwerk"
-#: ../../Zotlabs/Module/Connections.php:270
+#: ../../Zotlabs/Module/Connections.php:278
+msgid "Call"
+msgstr "Bellen"
+
+#: ../../Zotlabs/Module/Connections.php:280
msgid "Status"
msgstr "Status"
-#: ../../Zotlabs/Module/Connections.php:272
+#: ../../Zotlabs/Module/Connections.php:282
msgid "Connected"
msgstr "Verbonden"
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:284
msgid "Approve connection"
msgstr "Connectie accepteren"
-#: ../../Zotlabs/Module/Connections.php:275
+#: ../../Zotlabs/Module/Connections.php:285
#: ../../Zotlabs/Module/Admin/Accounts.php:171
msgid "Approve"
msgstr "Goedkeuren"
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:286
msgid "Ignore connection"
msgstr "Connectie negeren"
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:287
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid "Ignore"
+msgstr "Negeren"
+
+#: ../../Zotlabs/Module/Connections.php:288
msgid "Recent activity"
msgstr "Recente activiteit"
-#: ../../Zotlabs/Module/Connections.php:302 ../../Zotlabs/Lib/Apps.php:211
-#: ../../include/nav.php:189 ../../include/text.php:916
+#: ../../Zotlabs/Module/Connections.php:312 ../../Zotlabs/Lib/Apps.php:216
+#: ../../include/nav.php:203 ../../include/text.php:940
msgid "Connections"
msgstr "Connecties"
-#: ../../Zotlabs/Module/Connections.php:306 ../../Zotlabs/Module/Search.php:44
-#: ../../Zotlabs/Lib/Apps.php:232 ../../include/nav.php:168
-#: ../../include/text.php:986 ../../include/text.php:998
-#: ../../include/acl_selectors.php:203 ../../include/widgets.php:315
+#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Lib/Apps.php:237 ../../include/widgets.php:302
+#: ../../include/acl_selectors.php:213 ../../include/nav.php:180
+#: ../../include/text.php:1010 ../../include/text.php:1022
msgid "Search"
msgstr "Zoeken"
-#: ../../Zotlabs/Module/Connections.php:307
+#: ../../Zotlabs/Module/Connections.php:317
msgid "Search your connections"
msgstr "Doorzoek jouw connecties"
-#: ../../Zotlabs/Module/Connections.php:308
+#: ../../Zotlabs/Module/Connections.php:318
msgid "Connections search"
msgstr "Connecties zoeken"
-#: ../../Zotlabs/Module/Connections.php:309
-#: ../../Zotlabs/Module/Directory.php:391
-#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
+#: ../../Zotlabs/Module/Connections.php:319
+#: ../../Zotlabs/Module/Directory.php:392
+#: ../../Zotlabs/Module/Directory.php:397 ../../include/contact_widgets.php:23
msgid "Find"
msgstr "Vinden"
@@ -1588,61 +1324,61 @@ msgid "Image resize failed."
msgstr "Afbeelding kon niet van grootte veranderd worden."
#: ../../Zotlabs/Module/Cover_photo.php:168
-#: ../../Zotlabs/Module/Profile_photo.php:196 ../../include/photos.php:149
+#: ../../Zotlabs/Module/Profile_photo.php:201 ../../include/photos.php:149
msgid "Unable to process image"
msgstr "Afbeelding kan niet verwerkt worden"
#: ../../Zotlabs/Module/Cover_photo.php:192
-#: ../../Zotlabs/Module/Profile_photo.php:231
+#: ../../Zotlabs/Module/Profile_photo.php:236
msgid "Image upload failed."
msgstr "Uploaden afbeelding mislukt"
#: ../../Zotlabs/Module/Cover_photo.php:210
-#: ../../Zotlabs/Module/Profile_photo.php:250
+#: ../../Zotlabs/Module/Profile_photo.php:255
msgid "Unable to process image."
msgstr "Niet in staat om afbeelding te verwerken."
-#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4253
+#: ../../Zotlabs/Module/Cover_photo.php:233 ../../include/items.php:4278
msgid "female"
msgstr "vrouw"
-#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4254
+#: ../../Zotlabs/Module/Cover_photo.php:234 ../../include/items.php:4279
#, php-format
msgid "%1$s updated her %2$s"
msgstr "%1$s heeft haar %2$s bijgewerkt"
-#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4255
+#: ../../Zotlabs/Module/Cover_photo.php:235 ../../include/items.php:4280
msgid "male"
msgstr "man"
-#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4256
+#: ../../Zotlabs/Module/Cover_photo.php:236 ../../include/items.php:4281
#, php-format
msgid "%1$s updated his %2$s"
msgstr "%1$s heeft zijn %2$s bijgewerkt"
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4258
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4283
#, php-format
msgid "%1$s updated their %2$s"
msgstr "De %2$s van %1$s is bijgewerkt"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1677
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/channel.php:1764
msgid "cover photo"
msgstr "omslagfoto"
#: ../../Zotlabs/Module/Cover_photo.php:303
#: ../../Zotlabs/Module/Cover_photo.php:318
-#: ../../Zotlabs/Module/Profile_photo.php:311
-#: ../../Zotlabs/Module/Profile_photo.php:352
+#: ../../Zotlabs/Module/Profile_photo.php:316
+#: ../../Zotlabs/Module/Profile_photo.php:363
msgid "Photo not available."
msgstr "Foto niet beschikbaar."
#: ../../Zotlabs/Module/Cover_photo.php:354
-#: ../../Zotlabs/Module/Profile_photo.php:407
+#: ../../Zotlabs/Module/Profile_photo.php:418
msgid "Upload File:"
msgstr "Bestand uploaden:"
#: ../../Zotlabs/Module/Cover_photo.php:355
-#: ../../Zotlabs/Module/Profile_photo.php:408
+#: ../../Zotlabs/Module/Profile_photo.php:419
msgid "Select a profile:"
msgstr "Kies een profiel:"
@@ -1651,33 +1387,33 @@ msgid "Upload Cover Photo"
msgstr "Omslagfoto uploaden"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
-#: ../../Zotlabs/Module/Settings/Channel.php:399
+#: ../../Zotlabs/Module/Profile_photo.php:427
+#: ../../Zotlabs/Module/Settings/Channel.php:404
msgid "or"
msgstr "of"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Profile_photo.php:427
msgid "skip this step"
msgstr "sla deze stap over"
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Module/Profile_photo.php:416
+#: ../../Zotlabs/Module/Profile_photo.php:427
msgid "select a photo from your photo albums"
msgstr "Kies een foto uit jouw fotoalbums"
#: ../../Zotlabs/Module/Cover_photo.php:377
-#: ../../Zotlabs/Module/Profile_photo.php:435
+#: ../../Zotlabs/Module/Profile_photo.php:446
msgid "Crop Image"
msgstr "Afbeelding bijsnijden"
#: ../../Zotlabs/Module/Cover_photo.php:378
-#: ../../Zotlabs/Module/Profile_photo.php:436
+#: ../../Zotlabs/Module/Profile_photo.php:447
msgid "Please adjust the image cropping for optimum viewing."
msgstr "Snij de afbeelding zo uit dat deze optimaal wordt weergegeven."
#: ../../Zotlabs/Module/Cover_photo.php:380
-#: ../../Zotlabs/Module/Profile_photo.php:438
+#: ../../Zotlabs/Module/Profile_photo.php:449
msgid "Done Editing"
msgstr "Klaar met bewerken"
@@ -1706,20 +1442,8 @@ msgstr "Beheer - Extra functies"
msgid "Log settings updated."
msgstr "Logboek-instellingen bijgewerkt."
-#: ../../Zotlabs/Module/Admin/Logs.php:82
-#: ../../Zotlabs/Module/Admin/Plugins.php:336
-#: ../../Zotlabs/Module/Admin/Plugins.php:427
-#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin/Themes.php:120
-#: ../../Zotlabs/Module/Admin/Themes.php:154
-#: ../../Zotlabs/Module/Admin/Accounts.php:164
-#: ../../Zotlabs/Module/Admin/Channels.php:145
-#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Module/Admin.php:137
-msgid "Administration"
-msgstr "Beheer"
-
-#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1588
-#: ../../include/widgets.php:1598
+#: ../../Zotlabs/Module/Admin/Logs.php:83 ../../include/widgets.php:1661
+#: ../../include/widgets.php:1671
msgid "Logs"
msgstr "Logboeken"
@@ -1745,156 +1469,6 @@ msgstr "Moet door de webserver beschrijfbaar zijn. Relatief ten opzichte van de
msgid "Log level"
msgstr "Logniveau"
-#: ../../Zotlabs/Module/Admin/Plugins.php:254
-#: ../../Zotlabs/Module/Admin/Themes.php:69
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Display.php:40
-#: ../../Zotlabs/Module/Admin.php:60 ../../Zotlabs/Module/Thing.php:89
-#: ../../Zotlabs/Module/Viewsrc.php:24 ../../include/items.php:3343
-msgid "Item not found."
-msgstr "Item niet gevonden."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:284
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s uitgeschakeld."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:289
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s ingeschakeld"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:305
-#: ../../Zotlabs/Module/Admin/Themes.php:93
-msgid "Disable"
-msgstr "Uitschakelen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:308
-#: ../../Zotlabs/Module/Admin/Themes.php:95
-msgid "Enable"
-msgstr "Inschakelen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:337
-#: ../../Zotlabs/Module/Admin/Plugins.php:428 ../../include/widgets.php:1566
-msgid "Plugins"
-msgstr "Plugins"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:338
-#: ../../Zotlabs/Module/Admin/Themes.php:122
-msgid "Toggle"
-msgstr "Omschakelen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:339
-#: ../../Zotlabs/Module/Admin/Themes.php:123 ../../Zotlabs/Lib/Apps.php:218
-#: ../../include/nav.php:211 ../../include/widgets.php:680
-msgid "Settings"
-msgstr "Instellingen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:346
-#: ../../Zotlabs/Module/Admin/Themes.php:132
-msgid "Author: "
-msgstr "Auteur: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:347
-#: ../../Zotlabs/Module/Admin/Themes.php:133
-msgid "Maintainer: "
-msgstr "Beheerder: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:348
-msgid "Minimum project version: "
-msgstr "Minimum versie Hubzilla: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:349
-msgid "Maximum project version: "
-msgstr "Maximum versie Hubzilla:"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:350
-msgid "Minimum PHP version: "
-msgstr "Minimum versie PHP: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:351
-msgid "Compatible Server Roles: "
-msgstr "Werkt met configuratietypes: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:352
-msgid "Requires: "
-msgstr "Vereist: "
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:353
-#: ../../Zotlabs/Module/Admin/Plugins.php:433
-msgid "Disabled - version incompatibility"
-msgstr "Uitgeschakeld - versie is incompatibel"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:402
-msgid "Enter the public git repository URL of the plugin repo."
-msgstr "Vul de openbare Git-URL in van de plugin-repository."
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:403
-msgid "Plugin repo git URL"
-msgstr "Git-URL plugin-repository"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:404
-msgid "Custom repo name"
-msgstr "Handmatige repository-naam"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:404
-msgid "(optional)"
-msgstr "(optioneel)"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:405
-msgid "Download Plugin Repo"
-msgstr "Plugin-repository downloaden"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:412
-msgid "Install new repo"
-msgstr "Nieuwe repository installeren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:413 ../../Zotlabs/Lib/Apps.php:339
-msgid "Install"
-msgstr "Installeren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:414
-#: ../../Zotlabs/Module/Fbrowser.php:66 ../../Zotlabs/Module/Fbrowser.php:88
-#: ../../Zotlabs/Module/Wiki.php:238 ../../Zotlabs/Module/Wiki.php:261
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
-#: ../../extend/addon/addon/friendica/dfrn_request.php:879
-#: ../../extend/addon/addon/js_upload/js_upload.php:46
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
-#: ../../include/conversation.php:1246 ../../include/conversation.php:1295
-msgid "Cancel"
-msgstr "Annuleren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:435
-msgid "Manage Repos"
-msgstr "Repositories beheren"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:436
-msgid "Installed Plugin Repositories"
-msgstr "Toegevoegde plugin-repositories"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:437
-msgid "Install a New Plugin Repository"
-msgstr "Nieuwe plugin-repository toevoegen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:443
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:339
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Bijwerken"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:444
-msgid "Switch branch"
-msgstr "Branch veranderen"
-
-#: ../../Zotlabs/Module/Admin/Plugins.php:445
-#: ../../Zotlabs/Module/Photos.php:989 ../../Zotlabs/Module/Tagrm.php:137
-#: ../../extend/addon/addon/superblock/superblock.php:114
-msgid "Remove"
-msgstr "Verwijderen"
-
#: ../../Zotlabs/Module/Admin/Profs.php:69
msgid "New Profile Field"
msgstr "Nieuw profielveld"
@@ -1932,7 +1506,7 @@ msgstr "Helptekst"
#: ../../Zotlabs/Module/Admin/Profs.php:73
#: ../../Zotlabs/Module/Admin/Profs.php:93
msgid "Additional info (optional)"
-msgstr "Extra informatie (optioneel)"
+msgstr "Extra informatie (niet verplicht)"
#: ../../Zotlabs/Module/Admin/Profs.php:83
msgid "Field definition not found"
@@ -1942,7 +1516,7 @@ msgstr "Velddefinitie niet gevonden"
msgid "Edit Profile Field"
msgstr "Profielveld bewerken"
-#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1569
+#: ../../Zotlabs/Module/Admin/Profs.php:147 ../../include/widgets.php:1642
msgid "Profile Fields"
msgstr "Profielvelden"
@@ -1970,34 +1544,6 @@ msgstr "Extra (handmatig toegevoegde) velden"
msgid "Create Custom Field"
msgstr "Extra velden aanmaken"
-#: ../../Zotlabs/Module/Admin/Queue.php:36
-msgid "Queue Statistics"
-msgstr "Wachtrij-statistieken"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:37
-msgid "Total Entries"
-msgstr "Aantal vermeldingen"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:38
-msgid "Priority"
-msgstr "Prioriteit"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:39
-msgid "Destination URL"
-msgstr "Doel-URL"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:40
-msgid "Mark hub permanently offline"
-msgstr "Hub als permanent offline markeren"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:41
-msgid "Empty queue for this hub"
-msgstr "Berichtenwachtrij voor deze hub legen"
-
-#: ../../Zotlabs/Module/Admin/Queue.php:42
-msgid "Last known contact"
-msgstr "Voor het laatst contact"
-
#: ../../Zotlabs/Module/Admin/Security.php:77
msgid ""
"By default, unfiltered HTML is allowed in embedded media. This is inherently"
@@ -2022,7 +1568,7 @@ msgid ""
"embedded content from that site is explicitly blocked."
msgstr "Alle andere ingesloten (embedded) inhoud wordt gefilterd, <strong>tenzij</strong> ingesloten (embedded) inhoud van een website expliciet wordt geblokkeerd."
-#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1564
+#: ../../Zotlabs/Module/Admin/Security.php:87 ../../include/widgets.php:1637
msgid "Security"
msgstr "Beveiliging"
@@ -2110,31 +1656,6 @@ msgstr "Eén website per regel. Standaard wordt ingesloten (embedded) inhoud gef
msgid "Block embedded HTML from these domains"
msgstr "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren"
-#: ../../Zotlabs/Module/Admin/Themes.php:18
-msgid "Theme settings updated."
-msgstr "Thema-instellingen bijgewerkt."
-
-#: ../../Zotlabs/Module/Admin/Themes.php:58
-msgid "No themes found."
-msgstr "Geen thema's gevonden"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:114
-msgid "Screenshot"
-msgstr "Schermafdruk"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:121
-#: ../../Zotlabs/Module/Admin/Themes.php:155 ../../include/widgets.php:1567
-msgid "Themes"
-msgstr "Thema's"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:160
-msgid "[Experimental]"
-msgstr "[Experimenteel]"
-
-#: ../../Zotlabs/Module/Admin/Themes.php:161
-msgid "[Unsupported]"
-msgstr "[Niet ondersteund]"
-
#: ../../Zotlabs/Module/Admin/Account_edit.php:29
#, php-format
msgid "Password changed for account %d."
@@ -2206,7 +1727,7 @@ msgid "Account '%s' unblocked"
msgstr "Account '%s' gedeblokkeerd"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
-#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1562
+#: ../../Zotlabs/Module/Admin/Accounts.php:178 ../../include/widgets.php:1635
msgid "Accounts"
msgstr "Accounts"
@@ -2225,12 +1746,13 @@ msgstr "Tijd/datum verzoek"
#: ../../Zotlabs/Module/Admin/Accounts.php:169
#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Profiles.php:790
#: ../../extend/addon/addon/redred/redred.php:107
#: ../../extend/addon/addon/rtof/rtof.php:93
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1140
#: ../../extend/addon/addon/openid/MysqlProvider.php:56
#: ../../extend/addon/addon/openid/MysqlProvider.php:57
-#: ../../include/network.php:2237
+#: ../../include/network.php:2270
msgid "Email"
msgstr "E-mail"
@@ -2242,11 +1764,21 @@ msgstr "Geen verzoeken."
msgid "Deny"
msgstr "Afkeuren"
+#: ../../Zotlabs/Module/Admin/Accounts.php:174
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Block"
+msgstr "Blokkeren"
+
+#: ../../Zotlabs/Module/Admin/Accounts.php:175
+#: ../../Zotlabs/Module/Connedit.php:629
+msgid "Unblock"
+msgstr "Deblokkeren"
+
#: ../../Zotlabs/Module/Admin/Accounts.php:180
msgid "ID"
msgstr "ID"
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:267
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
msgid "All Channels"
msgstr "Alle kanalen"
@@ -2328,7 +1860,7 @@ msgstr "Scripts toegestaan voor kanaal '%s'"
msgid "Channel '%s' code disallowed"
msgstr "Scripts niet toegestaan voor kanaal '%s'"
-#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1563
+#: ../../Zotlabs/Module/Admin/Channels.php:146 ../../include/widgets.php:1636
msgid "Channels"
msgstr "Kanalen"
@@ -2349,7 +1881,7 @@ msgid "Disallow Code"
msgstr "Scripts niet toestaan"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1653
+#: ../../include/conversation.php:1815
msgid "Channel"
msgstr "Kanaal"
@@ -2357,6 +1889,13 @@ msgstr "Kanaal"
msgid "UID"
msgstr "UID"
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Locs.php:118 ../../Zotlabs/Module/Connedit.php:920
+#: ../../Zotlabs/Module/Profiles.php:502 ../../Zotlabs/Module/Profiles.php:793
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1143
+msgid "Address"
+msgstr "Adres"
+
#: ../../Zotlabs/Module/Admin/Channels.php:162
msgid ""
"Selected channels will be deleted!\\n\\nEverything that was posted in these "
@@ -2409,432 +1948,768 @@ msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
msgid "Attempt to execute this update step automatically"
msgstr "Poging om deze stap van de update automatisch uit te voeren."
+#: ../../Zotlabs/Module/Admin/Queue.php:35
+msgid "Queue Statistics"
+msgstr "Wachtrij-statistieken"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:36
+msgid "Total Entries"
+msgstr "Aantal vermeldingen"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:37
+msgid "Priority"
+msgstr "Prioriteit"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:38
+msgid "Destination URL"
+msgstr "Doel-URL"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:39
+msgid "Mark hub permanently offline"
+msgstr "Hub als permanent offline markeren"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:40
+msgid "Empty queue for this hub"
+msgstr "Berichtenwachtrij voor deze hub legen"
+
+#: ../../Zotlabs/Module/Admin/Queue.php:41
+msgid "Last known contact"
+msgstr "Voor het laatst contact"
+
#: ../../Zotlabs/Module/Admin/Site.php:133
msgid "Site settings updated."
msgstr "Hub-instellingen bijgewerkt."
-#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2918
+#: ../../Zotlabs/Module/Admin/Site.php:159 ../../include/text.php:2936
msgid "Default"
msgstr "Standaard"
-#: ../../Zotlabs/Module/Admin/Site.php:169
-#: ../../Zotlabs/Module/Settings/Display.php:143
+#: ../../Zotlabs/Module/Admin/Site.php:170
+#: ../../Zotlabs/Module/Settings/Display.php:137
+#, php-format
+msgid "%s - (Incompatible)"
+msgstr "%s - (niet compatible)"
+
+#: ../../Zotlabs/Module/Admin/Site.php:177
+#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "mobiel"
-#: ../../Zotlabs/Module/Admin/Site.php:171
+#: ../../Zotlabs/Module/Admin/Site.php:179
msgid "experimental"
msgstr "experimenteel"
-#: ../../Zotlabs/Module/Admin/Site.php:173
+#: ../../Zotlabs/Module/Admin/Site.php:181
msgid "unsupported"
msgstr "Niet ondersteund"
-#: ../../Zotlabs/Module/Admin/Site.php:219
+#: ../../Zotlabs/Module/Admin/Site.php:226 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Connedit.php:402
+#: ../../Zotlabs/Module/Connedit.php:786 ../../Zotlabs/Module/Events.php:470
+#: ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168
+#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Api.php:97
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Wiki.php:179
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1753
+msgid "No"
+msgstr "Nee"
+
+#: ../../Zotlabs/Module/Admin/Site.php:227
msgid "Yes - with approval"
msgstr "Ja - met goedkeuring"
-#: ../../Zotlabs/Module/Admin/Site.php:225
+#: ../../Zotlabs/Module/Admin/Site.php:228 ../../Zotlabs/Module/Menu.php:100
+#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Connedit.php:402
+#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
+#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:168
+#: ../../Zotlabs/Module/Photos.php:652 ../../Zotlabs/Module/Mitem.php:162
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:240
+#: ../../Zotlabs/Module/Mitem.php:241 ../../Zotlabs/Module/Api.php:96
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Profiles.php:681
+#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Settings/Display.php:103
+#: ../../Zotlabs/Module/Wiki.php:179
+#: ../../extend/addon/addon/dwpost/dwpost.php:73
+#: ../../extend/addon/addon/dwpost/dwpost.php:85
+#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:120
+#: ../../extend/addon/addon/friendica/dfrn_request.php:865
+#: ../../extend/addon/addon/ijpost/ijpost.php:73
+#: ../../extend/addon/addon/ijpost/ijpost.php:85
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:309
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:313
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:351
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:355
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:359
+#: ../../extend/addon/addon/libertree/libertree.php:69
+#: ../../extend/addon/addon/libertree/libertree.php:81
+#: ../../extend/addon/addon/ljpost/ljpost.php:70
+#: ../../extend/addon/addon/ljpost/ljpost.php:82
+#: ../../extend/addon/addon/nofed/nofed.php:72
+#: ../../extend/addon/addon/nofed/nofed.php:76
+#: ../../extend/addon/addon/nsabait/nsabait.php:157
+#: ../../extend/addon/addon/nsfw/nsfw.php:84
+#: ../../extend/addon/addon/planets/planets.php:153
+#: ../../extend/addon/addon/pumpio/pumpio.php:219
+#: ../../extend/addon/addon/pumpio/pumpio.php:223
+#: ../../extend/addon/addon/pumpio/pumpio.php:227
+#: ../../extend/addon/addon/pumpio/pumpio.php:231
+#: ../../extend/addon/addon/rainbowtag/rainbowtag.php:81
+#: ../../extend/addon/addon/redred/redred.php:95
+#: ../../extend/addon/addon/redred/redred.php:99
+#: ../../extend/addon/addon/rtof/rtof.php:81
+#: ../../extend/addon/addon/rtof/rtof.php:85
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:273
+#: ../../extend/addon/addon/smileybutton/smileybutton.php:277
+#: ../../extend/addon/addon/statusnet/statusnet.php:389
+#: ../../extend/addon/addon/statusnet/statusnet.php:411
+#: ../../extend/addon/addon/statusnet/statusnet.php:415
+#: ../../extend/addon/addon/statusnet/statusnet.php:424
+#: ../../extend/addon/addon/twitter/twitter.php:242
+#: ../../extend/addon/addon/twitter/twitter.php:246
+#: ../../extend/addon/addon/twitter/twitter.php:255
+#: ../../extend/addon/addon/visage/visage.php:166
+#: ../../extend/addon/addon/wppost/wppost.php:82
+#: ../../extend/addon/addon/wppost/wppost.php:105
+#: ../../extend/addon/addon/wppost/wppost.php:109
+#: ../../extend/addon/addon/xmpp/xmpp.php:53
+#: ../../extend/addon/addon/cdav/cdav.php:234
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
+#: ../../include/dir_fns.php:145 ../../view/theme/redbasic/php/config.php:111
+#: ../../view/theme/redbasic/php/config.php:136 ../../boot.php:1753
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../Zotlabs/Module/Admin/Site.php:233
msgid "My site is not a public server"
msgstr "Mijn $Projectname-hub is niet openbaar"
-#: ../../Zotlabs/Module/Admin/Site.php:226
+#: ../../Zotlabs/Module/Admin/Site.php:234
msgid "My site has paid access only"
msgstr "Mijn $Projectname-hub kent alleen betaalde toegang"
-#: ../../Zotlabs/Module/Admin/Site.php:227
+#: ../../Zotlabs/Module/Admin/Site.php:235
msgid "My site has free access only"
msgstr "Mijn $Projectname-hub kent alleen gratis toegang"
-#: ../../Zotlabs/Module/Admin/Site.php:228
+#: ../../Zotlabs/Module/Admin/Site.php:236
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mijn $Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
-#: ../../Zotlabs/Module/Admin/Site.php:239 ../../Zotlabs/Module/Setup.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Module/Setup.php:328
msgid "Basic/Minimal Social Networking"
msgstr "Basic/eenvoudig sociaal netwerk"
-#: ../../Zotlabs/Module/Admin/Site.php:240 ../../Zotlabs/Module/Setup.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Module/Setup.php:329
msgid "Standard Configuration (default)"
msgstr "Standaard (standaard)"
-#: ../../Zotlabs/Module/Admin/Site.php:241 ../../Zotlabs/Module/Setup.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Module/Setup.php:330
msgid "Professional"
msgstr "Professioneel "
-#: ../../Zotlabs/Module/Admin/Site.php:245 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:253 ../../Zotlabs/Lib/Techlevels.php:10
msgid "Beginner/Basic"
msgstr "Beginner/basic"
-#: ../../Zotlabs/Module/Admin/Site.php:246 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:254 ../../Zotlabs/Lib/Techlevels.php:11
msgid "Novice - not skilled but willing to learn"
msgstr "Onervaren - niet bekwaam, maar wil graag leren"
-#: ../../Zotlabs/Module/Admin/Site.php:247 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:255 ../../Zotlabs/Lib/Techlevels.php:12
msgid "Intermediate - somewhat comfortable"
msgstr "Ervaren - voelt zich enigszins comfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:248 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:256 ../../Zotlabs/Lib/Techlevels.php:13
msgid "Advanced - very comfortable"
msgstr "Gevorderd - voelt zich comfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:249 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:257 ../../Zotlabs/Lib/Techlevels.php:14
msgid "Expert - I can write computer code"
msgstr "Expert - kan programmeren"
-#: ../../Zotlabs/Module/Admin/Site.php:250 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:258 ../../Zotlabs/Lib/Techlevels.php:15
msgid "Wizard - I probably know more than you do"
msgstr "Tovenaar - ik weet waarschijnlijk meer dan jij"
-#: ../../Zotlabs/Module/Admin/Site.php:259 ../../include/widgets.php:1561
+#: ../../Zotlabs/Module/Admin/Site.php:267 ../../include/widgets.php:1634
msgid "Site"
msgstr "Hub-instellingen"
-#: ../../Zotlabs/Module/Admin/Site.php:262
+#: ../../Zotlabs/Module/Admin/Site.php:270
msgid "File upload"
msgstr "Bestand uploaden"
-#: ../../Zotlabs/Module/Admin/Site.php:263
+#: ../../Zotlabs/Module/Admin/Site.php:271
msgid "Policies"
msgstr "Beleid"
-#: ../../Zotlabs/Module/Admin/Site.php:264
+#: ../../Zotlabs/Module/Admin/Site.php:272
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Geavanceerd"
-#: ../../Zotlabs/Module/Admin/Site.php:268
+#: ../../Zotlabs/Module/Admin/Site.php:276
#: ../../extend/addon/addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Hubnaam"
-#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Module/Setup.php:351
+#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Module/Setup.php:351
msgid "Server Configuration/Role"
msgstr "Configuratietype hub"
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "Site default technical skill level"
msgstr "Standaard technisch niveau voor deze hub"
-#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Admin/Site.php:280
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Wordt gebruikt om leden een gebruikerservaring te bieden die met hun technisch niveau overeenkomt"
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Lock the technical skill level setting"
msgstr "Vergrendel de functie 'Standaard technisch niveau voor deze hub'"
-#: ../../Zotlabs/Module/Admin/Site.php:274
+#: ../../Zotlabs/Module/Admin/Site.php:282
msgid "Members can set their own technical comfort level by default"
msgstr "Leden kunnen hun eigen technisch niveau standaard instellen"
-#: ../../Zotlabs/Module/Admin/Site.php:276
+#: ../../Zotlabs/Module/Admin/Site.php:284
msgid "Banner/Logo"
msgstr "Banner/logo"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Administrator Information"
msgstr "Informatie over de beheerder"
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:286
#: ../../Zotlabs/Module/Siteinfo.php:23
msgid "Site Information"
msgstr "Hub-informatie"
-#: ../../Zotlabs/Module/Admin/Site.php:278
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Openbaar zichtbare beschrijving van deze hub. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid "System language"
msgstr "Standaardtaal"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "System theme"
msgstr "Standaardthema"
-#: ../../Zotlabs/Module/Admin/Site.php:280
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Mobile system theme"
msgstr "Standaardthema voor mobiel"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "Theme for mobile devices"
msgstr "Thema voor mobiele apparaten"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "Allow Feeds as Connections"
msgstr "Sta feeds toe als connecties"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:291
msgid "(Heavy system resource usage)"
msgstr "(sterk negatieve invloed op systeembronnen hub)"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Maximum image size"
msgstr "Maximale grootte van afbeeldingen"
-#: ../../Zotlabs/Module/Admin/Site.php:284
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
-#: ../../Zotlabs/Module/Admin/Site.php:285
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Does this site allow new member registration?"
msgstr "Staat deze hub nieuwe accounts toe?"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Invitation only"
msgstr "Alleen op uitnodiging"
-#: ../../Zotlabs/Module/Admin/Site.php:286
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Sta alleen nieuwe registraties toe van mensen die een uitnodigingscode hebben. Bovenstaand accountbeleid moet op Ja staan."
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Which best describes the types of account offered by this hub?"
msgstr "Wat voor soort accounts biedt deze $Projectname-hub aan? Kies wat het meest in de buurt komt."
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Register text"
msgstr "Tekst tijdens registratie"
-#: ../../Zotlabs/Module/Admin/Site.php:288
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Will be displayed prominently on the registration page."
msgstr "Tekst dat op de pagina voor het registreren van nieuwe accounts wordt getoond."
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Site homepage to show visitors (default: login box)"
msgstr "Homepagina van deze hub die aan bezoekers wordt getoond (standaard: inlogformulier)"
-#: ../../Zotlabs/Module/Admin/Site.php:289
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "Preserve site homepage URL"
msgstr "Behoudt de URL van de hub (/)"
-#: ../../Zotlabs/Module/Admin/Site.php:290
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Toon de homepagina van de hub in een frame op de oorspronkelijke locatie (/), i.p.v. een doorverwijzing naar een andere locatie (bv. .../home.html)"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Accounts abandoned after x days"
msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Allowed friend domains"
msgstr "Toegestane domeinen"
-#: ../../Zotlabs/Module/Admin/Site.php:292
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze $Projectname-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Verify Email Addresses"
msgstr "E-mailadres verifieren"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Force publish"
msgstr "Dwing kanaalvermelding af"
-#: ../../Zotlabs/Module/Admin/Site.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Import Public Streams"
msgstr "Openbare streams importeren"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Login on Homepage"
msgstr "Inlogformulier op de homepagina"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. "
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Enable context help"
msgstr "Schakel contextuele hulp in"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Toon hulp en documentatie voor de op dat moment getoonde pagina, wanneer op de hulp-knop wordt geklikt."
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Directory Server URL"
msgstr "Server-URL voor de kanalengids"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:307
msgid "Default directory server"
msgstr "Standaardserver voor de kanalengids"
-#: ../../Zotlabs/Module/Admin/Site.php:301
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Proxy user"
msgstr "Gebruikersnaam proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Proxy URL"
msgstr "Proxy-URL"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Network timeout"
msgstr "Netwerktimeout"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:311
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Delivery interval"
msgstr "Afleveringsinterval"
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid ""
"Delay background delivery processes by this many seconds to reduce system "
"load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
"for large dedicated servers."
msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid "Deliveries per process"
msgstr "Leveringen per serverproces"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:313
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Poll interval"
msgstr "Poll-interval"
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Maximum Load Average"
msgstr "Maximaal gemiddelde systeembelasting"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50."
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd."
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "0 for no expiration of imported content"
msgstr "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud."
-#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1385
-msgid "Public Hubs"
-msgstr "Openbare hubs"
+#: ../../Zotlabs/Module/Admin/Plugins.php:289
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s uitgeschakeld."
-#: ../../Zotlabs/Module/Pubsites.php:27
-msgid ""
-"The listed hubs allow public registration for the $Projectname network. All "
-"hubs in the network are interlinked so membership on any of them conveys "
-"membership in the network as a whole. Some hubs may require subscription or "
-"provide tiered service plans. The hub itself <strong>may</strong> provide "
-"additional details."
-msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
+#: ../../Zotlabs/Module/Admin/Plugins.php:294
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s ingeschakeld"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Hub URL"
-msgstr "Hub-URL"
+#: ../../Zotlabs/Module/Admin/Plugins.php:310
+#: ../../Zotlabs/Module/Admin/Themes.php:95
+msgid "Disable"
+msgstr "Uitschakelen"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Access Type"
-msgstr "Toegangs-<br/>&nbsp;type"
+#: ../../Zotlabs/Module/Admin/Plugins.php:313
+#: ../../Zotlabs/Module/Admin/Themes.php:97
+msgid "Enable"
+msgstr "Inschakelen"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Registration Policy"
-msgstr "Registratie-<br/>&nbsp;beleid"
+#: ../../Zotlabs/Module/Admin/Plugins.php:342
+#: ../../Zotlabs/Module/Admin/Plugins.php:437 ../../include/widgets.php:1639
+msgid "Plugins"
+msgstr "Plugins"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Stats"
-msgstr "Stats"
+#: ../../Zotlabs/Module/Admin/Plugins.php:343
+#: ../../Zotlabs/Module/Admin/Themes.php:124
+msgid "Toggle"
+msgstr "Omschakelen"
-#: ../../Zotlabs/Module/Pubsites.php:33
-msgid "Software"
-msgstr "Software"
+#: ../../Zotlabs/Module/Admin/Plugins.php:344
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
+#: ../../include/widgets.php:685 ../../include/nav.php:225
+msgid "Settings"
+msgstr "Instellingen"
-#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
-#: ../../include/conversation.php:940
-msgid "Ratings"
-msgstr "Beoordelingen"
+#: ../../Zotlabs/Module/Admin/Plugins.php:351
+#: ../../Zotlabs/Module/Admin/Themes.php:134
+msgid "Author: "
+msgstr "Auteur: "
-#: ../../Zotlabs/Module/Pubsites.php:48
-msgid "Rate"
-msgstr "Beoordeel"
+#: ../../Zotlabs/Module/Admin/Plugins.php:352
+#: ../../Zotlabs/Module/Admin/Themes.php:135
+msgid "Maintainer: "
+msgstr "Beheerder: "
-#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Blocks.php:166
-#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Webpages.php:246
-#: ../../Zotlabs/Module/Wiki.php:146 ../../Zotlabs/Module/Events.php:685
-#: ../../include/page_widgets.php:42
-msgid "View"
-msgstr "Weergeven"
+#: ../../Zotlabs/Module/Admin/Plugins.php:353
+msgid "Minimum project version: "
+msgstr "Minimum versie Hubzilla: "
-#: ../../Zotlabs/Module/Editlayout.php:79
-#: ../../Zotlabs/Module/Editwebpage.php:80
-#: ../../Zotlabs/Module/Editblock.php:79 ../../Zotlabs/Module/Editblock.php:95
-#: ../../Zotlabs/Module/Editpost.php:24
-msgid "Item not found"
-msgstr "Item niet gevonden"
+#: ../../Zotlabs/Module/Admin/Plugins.php:354
+msgid "Maximum project version: "
+msgstr "Maximum versie Hubzilla:"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:355
+msgid "Minimum PHP version: "
+msgstr "Minimum versie PHP: "
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:356
+msgid "Compatible Server Roles: "
+msgstr "Werkt met configuratietypes: "
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:357
+msgid "Requires: "
+msgstr "Vereist: "
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:442
+msgid "Disabled - version incompatibility"
+msgstr "Uitgeschakeld - versie is incompatibel"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:411
+msgid "Enter the public git repository URL of the plugin repo."
+msgstr "Vul de openbare Git-URL in van de plugin-repository."
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:412
+msgid "Plugin repo git URL"
+msgstr "Git-URL plugin-repository"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "Custom repo name"
+msgstr "Handmatige repository-naam"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:413
+msgid "(optional)"
+msgstr "(niet verplicht)"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:414
+msgid "Download Plugin Repo"
+msgstr "Plugin-repository downloaden"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:421
+msgid "Install new repo"
+msgstr "Nieuwe repository installeren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:348
+msgid "Install"
+msgstr "Installeren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Tagrm.php:15 ../../Zotlabs/Module/Tagrm.php:138
+#: ../../Zotlabs/Module/Wiki.php:261 ../../Zotlabs/Module/Wiki.php:286
+#: ../../extend/addon/addon/friendica/dfrn_request.php:879
+#: ../../extend/addon/addon/js_upload/js_upload.php:46
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:866
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1154
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:243
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1394 ../../include/conversation.php:1443
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:445
+msgid "Manage Repos"
+msgstr "Repositories beheren"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:446
+msgid "Installed Plugin Repositories"
+msgstr "Toegevoegde plugin-repositories"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:447
+msgid "Install a New Plugin Repository"
+msgstr "Nieuwe plugin-repository toevoegen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Connedit.php:929 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113 ../../Zotlabs/Lib/Apps.php:348
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1152
+msgid "Update"
+msgstr "Bijwerken"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:454
+msgid "Switch branch"
+msgstr "Branch veranderen"
+
+#: ../../Zotlabs/Module/Admin/Plugins.php:455
+#: ../../Zotlabs/Module/Photos.php:984 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../extend/addon/addon/superblock/superblock.php:116
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:26
+msgid "Theme settings updated."
+msgstr "Thema-instellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Admin/Themes.php:61
+msgid "No themes found."
+msgstr "Geen thema's gevonden"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:116
+msgid "Screenshot"
+msgstr "Schermafdruk"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:123
+#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../include/widgets.php:1640
+msgid "Themes"
+msgstr "Thema's"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:162
+msgid "[Experimental]"
+msgstr "[Experimenteel]"
+
+#: ../../Zotlabs/Module/Admin/Themes.php:163
+msgid "[Unsupported]"
+msgstr "[Niet ondersteund]"
+
+#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
+msgid "Export Channel"
+msgstr "Kanaal exporteren"
+
+#: ../../Zotlabs/Module/Uexport.php:59
+msgid ""
+"Export your basic channel information to a file. This acts as a backup of "
+"your connections, permissions, profile and basic data, which can be used to "
+"import your data to a new server hub, but does not contain your content."
+msgstr "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal."
+
+#: ../../Zotlabs/Module/Uexport.php:60
+msgid "Export Content"
+msgstr "Inhoud exporteren"
+
+#: ../../Zotlabs/Module/Uexport.php:61
+msgid ""
+"Export your channel information and recent content to a JSON backup that can"
+" be restored or imported to another server hub. This backs up all of your "
+"connections, permissions, profile data and several months of posts. This "
+"file may be VERY large. Please be patient - it may take several minutes for"
+" this download to begin."
+msgstr "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint."
+
+#: ../../Zotlabs/Module/Uexport.php:63
+msgid "Export your posts from a given year."
+msgstr "Exporteer jouw berichten uit een bepaald jaar."
+
+#: ../../Zotlabs/Module/Uexport.php:65
+msgid ""
+"You may also export your posts and conversations for a particular year or "
+"month. Adjust the date in your browser location bar to select other dates. "
+"If the export fails (possibly due to memory exhaustion on your server hub), "
+"please try again selecting a more limited date range."
+msgstr "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak."
+
+#: ../../Zotlabs/Module/Uexport.php:66
+#, php-format
+msgid ""
+"To select all posts for a given year, such as this year, visit <a "
+"href=\"%1$s\">%2$s</a>"
+msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. "
+
+#: ../../Zotlabs/Module/Uexport.php:67
+#, php-format
+msgid ""
+"To select all posts for a given month, such as January of this year, visit "
+"<a href=\"%1$s\">%2$s</a>"
+msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren."
+
+#: ../../Zotlabs/Module/Uexport.php:68
+#, php-format
+msgid ""
+"These content files may be imported or restored by visiting <a "
+"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
+" please import or restore these in date order (oldest first)."
+msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
#: ../../Zotlabs/Module/Editlayout.php:127
#: ../../Zotlabs/Module/Layouts.php:128 ../../Zotlabs/Module/Layouts.php:188
@@ -2844,7 +2719,7 @@ msgstr "Naam lay-out"
#: ../../Zotlabs/Module/Editlayout.php:128
#: ../../Zotlabs/Module/Layouts.php:131
msgid "Layout Description (Optional)"
-msgstr "Lay-out-omschrijving (optioneel)"
+msgstr "Lay-out-omschrijving (niet verplicht)"
#: ../../Zotlabs/Module/Editlayout.php:136
msgid "Edit Layout"
@@ -2854,38 +2729,29 @@ msgstr "Lay-out bewerken"
msgid "Page link"
msgstr "Paginalink"
-#: ../../Zotlabs/Module/Editwebpage.php:146 ../../Zotlabs/Module/Mail.php:286
-#: ../../Zotlabs/Module/Mail.php:411 ../../Zotlabs/Module/Editblock.php:111
-#: ../../Zotlabs/Module/Chat.php:207 ../../include/conversation.php:1147
-msgid "Insert web link"
-msgstr "Weblink invoegen"
-
#: ../../Zotlabs/Module/Editwebpage.php:169
msgid "Edit Webpage"
msgstr "Webpagina bewerken"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:224
-#: ../../include/nav.php:95 ../../include/conversation.php:1674
-msgid "Photos"
-msgstr "Foto's"
+#: ../../Zotlabs/Module/Apps.php:45 ../../include/nav.php:178
+msgid "Apps"
+msgstr "Apps"
-#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Wiki.php:20
-#: ../../Zotlabs/Module/Chat.php:25
-#: ../../extend/addon/addon/chess/chess.php:400
-msgid "You must be logged in to see this page."
-msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
+#: ../../Zotlabs/Module/Apps.php:48
+msgid "Manage apps"
+msgstr "Apps beheren"
-#: ../../Zotlabs/Module/Channel.php:44
-msgid "Posts and comments"
-msgstr "Berichten en reacties"
+#: ../../Zotlabs/Module/Apps.php:49
+msgid "Create new app"
+msgstr "Nieuwe app aanmaken"
-#: ../../Zotlabs/Module/Channel.php:45
-msgid "Only posts"
-msgstr "Alleen berichten"
+#: ../../Zotlabs/Module/Dirsearch.php:25 ../../Zotlabs/Module/Regdir.php:49
+msgid "This site is not a directory server"
+msgstr "Deze hub is geen kanalengidshub (directoryserver)"
-#: ../../Zotlabs/Module/Channel.php:104
-msgid "Insufficient permissions. Request redirected to profile page."
-msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
+#: ../../Zotlabs/Module/Dirsearch.php:33
+msgid "This directory server requires an access token"
+msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
#: ../../Zotlabs/Module/Network.php:96
msgid "No such group"
@@ -2915,6 +2781,11 @@ msgstr "Privacygroep: "
msgid "Invalid connection."
msgstr "Ongeldige connectie."
+#: ../../Zotlabs/Module/Network.php:275
+#: ../../extend/addon/addon/redred/redred.php:65
+msgid "Invalid channel."
+msgstr "Onbekend kanaal."
+
#: ../../Zotlabs/Module/Menu.php:49
msgid "Unable to update menu."
msgstr "Niet in staat om menu aan te passen"
@@ -2951,18 +2822,22 @@ msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
msgid "Submit and proceed"
msgstr "Opslaan en doorgaan"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2271
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2289
msgid "Menus"
msgstr "Menu's"
-#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Blocks.php:157
-#: ../../Zotlabs/Module/Layouts.php:190 ../../Zotlabs/Module/Webpages.php:251
+#: ../../Zotlabs/Module/Menu.php:113 ../../Zotlabs/Module/Locs.php:120
+msgid "Drop"
+msgstr "Verwijderen"
+
+#: ../../Zotlabs/Module/Menu.php:114 ../../Zotlabs/Module/Webpages.php:255
+#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Layouts.php:190
#: ../../include/page_widgets.php:47
msgid "Created"
msgstr "Aangemaakt"
-#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Blocks.php:158
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:252
+#: ../../Zotlabs/Module/Menu.php:115 ../../Zotlabs/Module/Webpages.php:256
+#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Layouts.php:191
#: ../../include/page_widgets.php:48
msgid "Edited"
msgstr "Bewerkt"
@@ -3024,835 +2899,822 @@ msgstr "Bladwijzers toestaan"
msgid "Not found."
msgstr "Niet gevonden."
-#: ../../Zotlabs/Module/Appman.php:37 ../../Zotlabs/Module/Appman.php:53
-msgid "App installed."
-msgstr "App geïnstalleerd"
-
-#: ../../Zotlabs/Module/Appman.php:46
-msgid "Malformed app."
-msgstr "Misvormde app."
-
-#: ../../Zotlabs/Module/Appman.php:105
-msgid "Embed code"
-msgstr "Insluitcode"
-
-#: ../../Zotlabs/Module/Appman.php:111 ../../include/widgets.php:107
-msgid "Edit App"
-msgstr "App bewerken"
-
-#: ../../Zotlabs/Module/Appman.php:111
-msgid "Create App"
-msgstr "App maken"
-
-#: ../../Zotlabs/Module/Appman.php:116
-msgid "Name of app"
-msgstr "Naam van app"
-
-#: ../../Zotlabs/Module/Appman.php:116 ../../Zotlabs/Module/Appman.php:117
-#: ../../Zotlabs/Module/Profiles.php:703 ../../Zotlabs/Module/Profiles.php:707
-#: ../../Zotlabs/Module/Events.php:453 ../../Zotlabs/Module/Events.php:458
-#: ../../include/datetime.php:259
-msgid "Required"
-msgstr "Vereist"
-
-#: ../../Zotlabs/Module/Appman.php:117
-msgid "Location (URL) of app"
-msgstr "Locatie (URL) van app"
-
-#: ../../Zotlabs/Module/Appman.php:118 ../../Zotlabs/Module/Rbmark.php:101
-#: ../../Zotlabs/Module/Events.php:466
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:838
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:165
-msgid "Description"
-msgstr "Omschrijving"
-
-#: ../../Zotlabs/Module/Appman.php:119
-msgid "Photo icon URL"
-msgstr "URL van pictogram"
-
-#: ../../Zotlabs/Module/Appman.php:119
-msgid "80 x 80 pixels - optional"
-msgstr "80 x 80 pixels (optioneel)"
-
-#: ../../Zotlabs/Module/Appman.php:120
-msgid "Categories (optional, comma separated list)"
-msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
-
-#: ../../Zotlabs/Module/Appman.php:121
-msgid "Version ID"
-msgstr "Versie-ID"
-
-#: ../../Zotlabs/Module/Appman.php:122
-msgid "Price of app"
-msgstr "Prijs van de app"
-
-#: ../../Zotlabs/Module/Appman.php:123
-msgid "Location (URL) to purchase app"
-msgstr "Locatie (URL) om de app aan te schaffen"
-
-#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:107
+#: ../../Zotlabs/Module/Rpost.php:138 ../../Zotlabs/Module/Editpost.php:108
msgid "Edit post"
msgstr "Bericht bewerken"
-#: ../../Zotlabs/Module/Help.php:23
-msgid "Documentation Search"
-msgstr "Zoek documentatie"
+#: ../../Zotlabs/Module/Locs.php:25 ../../Zotlabs/Module/Locs.php:54
+msgid "Location not found."
+msgstr "Locatie niet gevonden."
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1665
-msgid "About"
-msgstr "Over"
+#: ../../Zotlabs/Module/Locs.php:62
+msgid "Location lookup failed."
+msgstr "Opzoeken locatie mislukt"
-#: ../../Zotlabs/Module/Help.php:81 ../../Zotlabs/Module/Group.php:197
-msgid "Members"
-msgstr "Kanalen"
+#: ../../Zotlabs/Module/Locs.php:66
+msgid ""
+"Please select another location to become primary before removing the primary"
+" location."
+msgstr "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen."
-#: ../../Zotlabs/Module/Help.php:82
-msgid "Administrators"
-msgstr "Beheerders"
+#: ../../Zotlabs/Module/Locs.php:95
+msgid "Syncing locations"
+msgstr "Locaties synchronizeren"
-#: ../../Zotlabs/Module/Help.php:83
-msgid "Developers"
-msgstr "Ontwikkelaars"
+#: ../../Zotlabs/Module/Locs.php:105
+msgid "No locations found."
+msgstr "Geen locaties gevonden."
-#: ../../Zotlabs/Module/Help.php:84
-msgid "Tutorials"
-msgstr "Zelfstudie"
+#: ../../Zotlabs/Module/Locs.php:116
+msgid "Manage Channel Locations"
+msgstr "Kanaallocaties beheren"
-#: ../../Zotlabs/Module/Help.php:93
-msgid "$Projectname Documentation"
-msgstr "$Projectname-documentatie"
+#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509
+#: ../../Zotlabs/Module/Profiles.php:737
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:839
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Locatie"
-#: ../../Zotlabs/Module/Help.php:94
-msgid "Contents"
-msgstr "Inhoud"
+#: ../../Zotlabs/Module/Locs.php:119
+msgid "Primary"
+msgstr "Primair"
-#: ../../Zotlabs/Module/Ffsapi.php:12
-msgid "Share content from Firefox to $Projectname"
-msgstr "Deel webpagina's vanuit Firefox met "
+#: ../../Zotlabs/Module/Locs.php:122
+msgid "Sync Now"
+msgstr "Nu synchroniseren"
-#: ../../Zotlabs/Module/Ffsapi.php:15
-msgid "Activate the Firefox $Projectname provider"
-msgstr "Activeer de $Projectname-service in Firefox"
+#: ../../Zotlabs/Module/Locs.php:123
+msgid "Please wait several minutes between consecutive operations."
+msgstr "Wacht enkele minuten tussen opeenvolgende handelingen."
-#: ../../Zotlabs/Module/Apps.php:46 ../../include/nav.php:166
-#: ../../include/widgets.php:102
-msgid "Apps"
-msgstr "Apps"
+#: ../../Zotlabs/Module/Locs.php:124
+msgid ""
+"When possible, drop a location by logging into that website/hub and removing"
+" your channel."
+msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen."
-#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
-msgid "$Projectname"
-msgstr "$Projectname"
+#: ../../Zotlabs/Module/Locs.php:125
+msgid "Use this form to drop the location if the hub is no longer operating."
+msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
-#: ../../Zotlabs/Module/Home.php:92
-#, php-format
-msgid "Welcome to %s"
-msgstr "Welkom op %s"
+#: ../../Zotlabs/Module/Pubsites.php:24 ../../include/widgets.php:1401
+msgid "Public Hubs"
+msgstr "Openbare hubs"
-#: ../../Zotlabs/Module/Filestorage.php:87
-msgid "Permission Denied."
-msgstr "Toegang geweigerd"
+#: ../../Zotlabs/Module/Pubsites.php:27
+msgid ""
+"The listed hubs allow public registration for the $Projectname network. All "
+"hubs in the network are interlinked so membership on any of them conveys "
+"membership in the network as a whole. Some hubs may require subscription or "
+"provide tiered service plans. The hub itself <strong>may</strong> provide "
+"additional details."
+msgstr "Op de hier weergegeven hubs kan iedereen zich voor het $Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
-#: ../../Zotlabs/Module/Filestorage.php:103
-msgid "File not found."
-msgstr "Bestand niet gevonden."
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Hub URL"
+msgstr "Hub-URL"
-#: ../../Zotlabs/Module/Filestorage.php:146
-msgid "Edit file permissions"
-msgstr "Bestandsrechten bewerken"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Access Type"
+msgstr "Toegangs-<br/>&nbsp;type"
-#: ../../Zotlabs/Module/Filestorage.php:152
-#: ../../Zotlabs/Module/Photos.php:658 ../../Zotlabs/Module/Photos.php:1047
-#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Chat.php:234 ../../include/acl_selectors.php:208
-msgid "Permissions"
-msgstr "Permissies"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Registration Policy"
+msgstr "Registratie-<br/>&nbsp;beleid"
-#: ../../Zotlabs/Module/Filestorage.php:159
-msgid "Set/edit permissions"
-msgstr "Rechten instellen/bewerken"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Stats"
+msgstr "Stats"
-#: ../../Zotlabs/Module/Filestorage.php:160
-msgid "Include all files and sub folders"
-msgstr "Toepassen op alle bestanden en submappen"
+#: ../../Zotlabs/Module/Pubsites.php:33
+msgid "Software"
+msgstr "Software"
-#: ../../Zotlabs/Module/Filestorage.php:161
-msgid "Return to file list"
-msgstr "Terugkeren naar bestandlijst "
+#: ../../Zotlabs/Module/Pubsites.php:35 ../../Zotlabs/Module/Ratings.php:97
+#: ../../include/conversation.php:941 ../../include/conversation.php:1099
+msgid "Ratings"
+msgstr "Beoordelingen"
-#: ../../Zotlabs/Module/Filestorage.php:163
-msgid "Copy/paste this code to attach file to a post"
-msgstr "Kopieer/plak deze code om het bestand aan een bericht te koppelen"
+#: ../../Zotlabs/Module/Pubsites.php:48
+msgid "Rate"
+msgstr "Beoordeel"
-#: ../../Zotlabs/Module/Filestorage.php:164
-msgid "Copy/paste this URL to link file from a web page"
-msgstr "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen"
+#: ../../Zotlabs/Module/Pubsites.php:59 ../../Zotlabs/Module/Events.php:694
+#: ../../Zotlabs/Module/Webpages.php:250 ../../Zotlabs/Module/Blocks.php:166
+#: ../../Zotlabs/Module/Layouts.php:197 ../../Zotlabs/Module/Wiki.php:166
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../include/page_widgets.php:42
+msgid "View"
+msgstr "Weergeven"
-#: ../../Zotlabs/Module/Filestorage.php:166
-msgid "Share this file"
-msgstr "Dit bestand delen"
+#: ../../Zotlabs/Module/Connedit.php:82
+msgid "Could not access contact record."
+msgstr "Kon geen toegang krijgen tot de connectie-gegevens."
-#: ../../Zotlabs/Module/Filestorage.php:167
-msgid "Show URL to this file"
-msgstr "Toon URL van dit bestand"
+#: ../../Zotlabs/Module/Connedit.php:112
+msgid "Could not locate selected profile."
+msgstr "Kon het gekozen profiel niet vinden."
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Jouw connecties over dit bestand berichten"
+#: ../../Zotlabs/Module/Connedit.php:249
+msgid "Connection updated."
+msgstr "Connectie bijgewerkt."
-#: ../../Zotlabs/Module/Directory.php:64 ../../Zotlabs/Module/Display.php:17
-#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Photos.php:509
-#: ../../Zotlabs/Module/Search.php:17
-#: ../../Zotlabs/Module/Viewconnections.php:23
-#: ../../extend/addon/addon/friendica/dfrn_request.php:794
-msgid "Public access denied."
-msgstr "Openbare toegang geweigerd."
+#: ../../Zotlabs/Module/Connedit.php:251
+msgid "Failed to update connection record."
+msgstr "Bijwerken van connectie-gegevens mislukt."
-#: ../../Zotlabs/Module/Directory.php:245
-#, php-format
-msgid "%d rating"
-msgid_plural "%d ratings"
-msgstr[0] "%d beoordeling"
-msgstr[1] "%d beoordelingen"
+#: ../../Zotlabs/Module/Connedit.php:301
+msgid "is now connected to"
+msgstr "is nu verbonden met"
-#: ../../Zotlabs/Module/Directory.php:256
-msgid "Gender: "
-msgstr "Geslacht:"
+#: ../../Zotlabs/Module/Connedit.php:434
+msgid "Could not access address book record."
+msgstr "Kon geen toegang krijgen tot de record van de connectie."
-#: ../../Zotlabs/Module/Directory.php:258
-msgid "Status: "
-msgstr "Status: "
+#: ../../Zotlabs/Module/Connedit.php:482
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
-#: ../../Zotlabs/Module/Directory.php:260
-msgid "Homepage: "
-msgstr "Homepage: "
+#: ../../Zotlabs/Module/Connedit.php:497 ../../Zotlabs/Module/Connedit.php:506
+#: ../../Zotlabs/Module/Connedit.php:515 ../../Zotlabs/Module/Connedit.php:524
+#: ../../Zotlabs/Module/Connedit.php:537
+msgid "Unable to set address book parameters."
+msgstr "Niet in staat om de parameters van connecties in te stellen."
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1215
-msgid "Age:"
-msgstr "Leeftijd:"
+#: ../../Zotlabs/Module/Connedit.php:561
+msgid "Connection has been removed."
+msgstr "Connectie is verwijderd"
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1051
-#: ../../include/bb2diaspora.php:521 ../../include/event.php:52
-#: ../../include/event.php:84
-msgid "Location:"
-msgstr "Plaats:"
+#: ../../Zotlabs/Module/Connedit.php:601 ../../Zotlabs/Lib/Apps.php:228
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
+#: ../../include/conversation.php:936 ../../include/conversation.php:1049
+#: ../../include/nav.php:103
+msgid "View Profile"
+msgstr "Profiel weergeven"
-#: ../../Zotlabs/Module/Directory.php:320
-msgid "Description:"
-msgstr "Omschrijving:"
+#: ../../Zotlabs/Module/Connedit.php:604
+#, php-format
+msgid "View %s's profile"
+msgstr "Profiel van %s weergeven"
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1231
-msgid "Hometown:"
-msgstr "Oorspronkelijk uit:"
+#: ../../Zotlabs/Module/Connedit.php:608
+msgid "Refresh Permissions"
+msgstr "Permissies vernieuwen"
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1239
-msgid "About:"
-msgstr "Over:"
+#: ../../Zotlabs/Module/Connedit.php:611
+msgid "Fetch updated permissions"
+msgstr "Aangepaste permissies ophalen"
-#: ../../Zotlabs/Module/Directory.php:329
-msgid "Public Forum:"
-msgstr "Openbaar forum:"
+#: ../../Zotlabs/Module/Connedit.php:615
+msgid "Refresh Photo"
+msgstr "Foto vernieuwen"
-#: ../../Zotlabs/Module/Directory.php:332
-msgid "Keywords: "
-msgstr "Trefwoorden: "
+#: ../../Zotlabs/Module/Connedit.php:618
+msgid "Fetch updated photo"
+msgstr "Aangepaste foto ophalen"
-#: ../../Zotlabs/Module/Directory.php:335
-msgid "Don't suggest"
-msgstr "Niet voorstellen"
+#: ../../Zotlabs/Module/Connedit.php:622
+msgid "Recent Activity"
+msgstr "Recente activiteit/berichten"
-#: ../../Zotlabs/Module/Directory.php:337
-msgid "Common connections:"
-msgstr "Gemeenschappelijke connecties:"
+#: ../../Zotlabs/Module/Connedit.php:625
+msgid "View recent posts and comments"
+msgstr "Recente berichten en reacties weergeven"
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Global Directory"
-msgstr "Volledige kanalengids"
+#: ../../Zotlabs/Module/Connedit.php:632
+msgid "Block (or Unblock) all communications with this connection"
+msgstr "Blokkeer (of deblokkeer) alle communicatie met deze connectie"
-#: ../../Zotlabs/Module/Directory.php:386
-msgid "Local Directory"
-msgstr "Lokale kanalengids"
+#: ../../Zotlabs/Module/Connedit.php:633
+msgid "This connection is blocked!"
+msgstr "Deze connectie is geblokkeerd!"
-#: ../../Zotlabs/Module/Directory.php:392
-msgid "Finding:"
-msgstr "Gezocht naar:"
+#: ../../Zotlabs/Module/Connedit.php:637
+msgid "Unignore"
+msgstr "Niet meer negeren"
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
-#: ../../include/contact_widgets.php:24
-msgid "Channel Suggestions"
-msgstr "Voorgestelde kanalen"
+#: ../../Zotlabs/Module/Connedit.php:640
+msgid "Ignore (or Unignore) all inbound communications from this connection"
+msgstr "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie"
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "next page"
-msgstr "volgende pagina"
+#: ../../Zotlabs/Module/Connedit.php:641
+msgid "This connection is ignored!"
+msgstr "Deze connectie wordt genegeerd!"
-#: ../../Zotlabs/Module/Directory.php:397
-msgid "previous page"
-msgstr "vorige pagina"
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid "Unarchive"
+msgstr "Niet meer archiveren"
-#: ../../Zotlabs/Module/Directory.php:398
-msgid "Sort options"
-msgstr "Sorteeropties"
+#: ../../Zotlabs/Module/Connedit.php:645
+msgid "Archive"
+msgstr "Archiveren"
-#: ../../Zotlabs/Module/Directory.php:399
-msgid "Alphabetic"
-msgstr "Alfabetisch"
+#: ../../Zotlabs/Module/Connedit.php:648
+msgid ""
+"Archive (or Unarchive) this connection - mark channel dead but keep content"
+msgstr "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud"
-#: ../../Zotlabs/Module/Directory.php:400
-msgid "Reverse Alphabetic"
-msgstr "Omgekeerd alfabetisch"
+#: ../../Zotlabs/Module/Connedit.php:649
+msgid "This connection is archived!"
+msgstr "Deze connectie is gearchiveerd!"
-#: ../../Zotlabs/Module/Directory.php:401
-msgid "Newest to Oldest"
-msgstr "Nieuw naar oud"
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Unhide"
+msgstr "Niet meer verbergen"
-#: ../../Zotlabs/Module/Directory.php:402
-msgid "Oldest to Newest"
-msgstr "Oud naar nieuw"
+#: ../../Zotlabs/Module/Connedit.php:653
+msgid "Hide"
+msgstr "Verbergen"
-#: ../../Zotlabs/Module/Directory.php:419
-msgid "No entries (some entries may be hidden)."
-msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
+#: ../../Zotlabs/Module/Connedit.php:656
+msgid "Hide or Unhide this connection from your other connections"
+msgstr "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties"
-#: ../../Zotlabs/Module/Item.php:184
-msgid "Unable to locate original post."
-msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
+#: ../../Zotlabs/Module/Connedit.php:657
+msgid "This connection is hidden!"
+msgstr "Deze connectie is verborgen!"
-#: ../../Zotlabs/Module/Item.php:447
-msgid "Empty post discarded."
-msgstr "Leeg bericht geannuleerd"
+#: ../../Zotlabs/Module/Connedit.php:664
+msgid "Delete this connection"
+msgstr "Deze connectie verwijderen"
-#: ../../Zotlabs/Module/Item.php:489
-msgid "Executable content type not permitted to this channel."
-msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
+#: ../../Zotlabs/Module/Connedit.php:672
+msgid "Fetch Vcard"
+msgstr "Vcard ophalen"
-#: ../../Zotlabs/Module/Item.php:837
-msgid "Duplicate post suppressed."
-msgstr "Dubbel bericht tegengehouden."
+#: ../../Zotlabs/Module/Connedit.php:675
+msgid "Fetch electronic calling card for this connection"
+msgstr "Visitekaartje van deze connectie ophalen"
-#: ../../Zotlabs/Module/Item.php:979
-msgid "System error. Post not saved."
-msgstr "Systeemfout. Bericht niet opgeslagen."
+#: ../../Zotlabs/Module/Connedit.php:683
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Photos.php:657 ../../Zotlabs/Module/Photos.php:1042
+#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
+#: ../../Zotlabs/Module/Chat.php:232 ../../include/acl_selectors.php:218
+msgid "Permissions"
+msgstr "Permissies"
-#: ../../Zotlabs/Module/Item.php:1111
-msgid "Unable to obtain post information from database."
-msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
+#: ../../Zotlabs/Module/Connedit.php:686
+msgid "Open Individual Permissions section by default"
+msgstr "Sectie met individuele permissies standaard openen"
-#: ../../Zotlabs/Module/Item.php:1118
-#, php-format
-msgid "You have reached your limit of %1$.0f top level posts."
-msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
+#: ../../Zotlabs/Module/Connedit.php:709
+msgid "Affinity"
+msgstr "Affiniteit"
-#: ../../Zotlabs/Module/Item.php:1125
-#, php-format
-msgid "You have reached your limit of %1$.0f webpages."
-msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
+#: ../../Zotlabs/Module/Connedit.php:712
+msgid "Open Set Affinity section by default"
+msgstr "Sectie met de affiniteitsinstelling standaard openen"
-#: ../../Zotlabs/Module/Chanview.php:134
-msgid "toggle full screen mode"
-msgstr "Volledig scherm"
+#: ../../Zotlabs/Module/Connedit.php:716 ../../include/widgets.php:526
+msgid "Me"
+msgstr "Ik"
-#: ../../Zotlabs/Module/Follow.php:31
-msgid "Channel added."
-msgstr "Kanaal toegevoegd."
+#: ../../Zotlabs/Module/Connedit.php:717 ../../include/widgets.php:527
+msgid "Family"
+msgstr "Familie"
-#: ../../Zotlabs/Module/Mail.php:66
-msgid "Unable to lookup recipient."
-msgstr "Niet in staat om ontvanger op te zoeken."
+#: ../../Zotlabs/Module/Connedit.php:718
+#: ../../Zotlabs/Module/Settings/Channel.php:62
+#: ../../Zotlabs/Module/Settings/Channel.php:66
+#: ../../Zotlabs/Module/Settings/Channel.php:67
+#: ../../Zotlabs/Module/Settings/Channel.php:70
+#: ../../Zotlabs/Module/Settings/Channel.php:81 ../../include/widgets.php:528
+#: ../../include/selectors.php:123 ../../include/channel.php:408
+#: ../../include/channel.php:409 ../../include/channel.php:416
+msgid "Friends"
+msgstr "Vrienden"
-#: ../../Zotlabs/Module/Mail.php:73
-msgid "Unable to communicate with requested channel."
-msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
+#: ../../Zotlabs/Module/Connedit.php:719 ../../include/widgets.php:529
+msgid "Acquaintances"
+msgstr "Kennissen"
-#: ../../Zotlabs/Module/Mail.php:80
-msgid "Cannot verify requested channel."
-msgstr "Kan opgevraagd kanaal niet verifieren"
+#: ../../Zotlabs/Module/Connedit.php:746
+msgid "Filter"
+msgstr "Filter"
-#: ../../Zotlabs/Module/Mail.php:98
-msgid "Selected channel has private message restrictions. Send failed."
-msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
+#: ../../Zotlabs/Module/Connedit.php:749
+msgid "Open Custom Filter section by default"
+msgstr "Sectie met de berichtenfilter standaard openen"
-#: ../../Zotlabs/Module/Mail.php:177
-msgid "Messages"
-msgstr "Berichten"
+#: ../../Zotlabs/Module/Connedit.php:786
+msgid "Approve this connection"
+msgstr "Deze connectie accepteren"
-#: ../../Zotlabs/Module/Mail.php:212
-msgid "Message recalled."
-msgstr "Bericht ingetrokken."
+#: ../../Zotlabs/Module/Connedit.php:786
+msgid "Accept connection to allow communication"
+msgstr "Keur deze connectie goed om communicatie toe te staan"
-#: ../../Zotlabs/Module/Mail.php:225
-msgid "Conversation removed."
-msgstr "Conversatie verwijderd"
+#: ../../Zotlabs/Module/Connedit.php:791
+msgid "Set Affinity"
+msgstr "Affiniteit instellen"
-#: ../../Zotlabs/Module/Mail.php:239 ../../Zotlabs/Module/Mail.php:348
-#: ../../Zotlabs/Module/Chat.php:205 ../../include/conversation.php:1182
-msgid "Please enter a link URL:"
-msgstr "Vul een URL in:"
+#: ../../Zotlabs/Module/Connedit.php:794
+msgid "Set Profile"
+msgstr "Profiel instellen"
-#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
-msgid "Expires YYYY-MM-DD HH:MM"
-msgstr "Verloopt op DD-MM-YYYY om HH:MM"
+#: ../../Zotlabs/Module/Connedit.php:797
+msgid "Set Affinity & Profile"
+msgstr "Affiniteit en profiel instellen"
-#: ../../Zotlabs/Module/Mail.php:268
-msgid "Requested channel is not in this network"
-msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
+#: ../../Zotlabs/Module/Connedit.php:855
+msgid "none"
+msgstr "geen"
-#: ../../Zotlabs/Module/Mail.php:276
-msgid "Send Private Message"
-msgstr "Privébericht versturen"
+#: ../../Zotlabs/Module/Connedit.php:858 ../../include/widgets.php:661
+msgid "Connection Default Permissions"
+msgstr "Standaard permissies voor connecties"
-#: ../../Zotlabs/Module/Mail.php:277 ../../Zotlabs/Module/Mail.php:402
-msgid "To:"
-msgstr "Aan:"
+#: ../../Zotlabs/Module/Connedit.php:858 ../../include/items.php:3934
+#, php-format
+msgid "Connection: %s"
+msgstr "Connectie: %s"
-#: ../../Zotlabs/Module/Mail.php:280 ../../Zotlabs/Module/Mail.php:404
-msgid "Subject:"
-msgstr "Onderwerp:"
+#: ../../Zotlabs/Module/Connedit.php:859
+msgid "Apply these permissions automatically"
+msgstr "Deze permissies automatisch toepassen"
-#: ../../Zotlabs/Module/Mail.php:283 ../../Zotlabs/Module/Invite.php:138
-msgid "Your message:"
-msgstr "Jouw bericht:"
+#: ../../Zotlabs/Module/Connedit.php:859
+msgid "Connection requests will be approved without your interaction"
+msgstr "Connectieverzoeken zullen automatisch worden geaccepteerd"
-#: ../../Zotlabs/Module/Mail.php:285 ../../Zotlabs/Module/Mail.php:410
-#: ../../include/conversation.php:1242
-msgid "Attach file"
-msgstr "Bestand toevoegen"
+#: ../../Zotlabs/Module/Connedit.php:860
+msgid "Permission role"
+msgstr "Permissietype"
-#: ../../Zotlabs/Module/Mail.php:287
-msgid "Send"
-msgstr "Verzenden"
+#: ../../Zotlabs/Module/Connedit.php:861
+msgid "Add permission role"
+msgstr "Permissietype toevoegen"
-#: ../../Zotlabs/Module/Mail.php:290 ../../Zotlabs/Module/Mail.php:415
-#: ../../include/conversation.php:1287
-msgid "Set expiration date"
-msgstr "Verloopdatum instellen"
+#: ../../Zotlabs/Module/Connedit.php:867
+msgid "This connection's primary address is"
+msgstr "Het primaire kanaaladres van deze connectie is"
-#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:417
-#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Lib/ThreadItem.php:741
-#: ../../include/conversation.php:1292
-msgid "Encrypt text"
-msgstr "Tekst versleutelen"
+#: ../../Zotlabs/Module/Connedit.php:868
+msgid "Available locations:"
+msgstr "Beschikbare locaties:"
-#: ../../Zotlabs/Module/Mail.php:374
-msgid "Delete message"
-msgstr "Bericht verwijderen"
+#: ../../Zotlabs/Module/Connedit.php:872
+msgid ""
+"The permissions indicated on this page will be applied to all new "
+"connections."
+msgstr "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast."
-#: ../../Zotlabs/Module/Mail.php:375
-msgid "Delivery report"
-msgstr "Afleveringsrapport"
+#: ../../Zotlabs/Module/Connedit.php:873
+msgid "Connection Tools"
+msgstr "Hulpmiddelen"
-#: ../../Zotlabs/Module/Mail.php:376
-msgid "Recall message"
-msgstr "Bericht intrekken"
+#: ../../Zotlabs/Module/Connedit.php:875
+msgid "Slide to adjust your degree of friendship"
+msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
-#: ../../Zotlabs/Module/Mail.php:378
-msgid "Message has been recalled."
-msgstr "Bericht is ingetrokken."
+#: ../../Zotlabs/Module/Connedit.php:876 ../../Zotlabs/Module/Rate.php:155
+#: ../../include/js_strings.php:20
+msgid "Rating"
+msgstr "Beoordeling"
-#: ../../Zotlabs/Module/Mail.php:395
-msgid "Delete Conversation"
-msgstr "Verwijder conversatie"
+#: ../../Zotlabs/Module/Connedit.php:877
+msgid "Slide to adjust your rating"
+msgstr "Gebruik de schuif om je beoordeling te geven"
-#: ../../Zotlabs/Module/Mail.php:397
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
+#: ../../Zotlabs/Module/Connedit.php:878 ../../Zotlabs/Module/Connedit.php:883
+msgid "Optionally explain your rating"
+msgstr "Verklaar jouw beoordeling (niet verplicht)"
-#: ../../Zotlabs/Module/Mail.php:401
-msgid "Send Reply"
-msgstr "Antwoord versturen"
+#: ../../Zotlabs/Module/Connedit.php:880
+msgid "Custom Filter"
+msgstr "Berichtenfilter"
-#: ../../Zotlabs/Module/Mail.php:406
-#, php-format
-msgid "Your message for %s (%s):"
-msgstr "Jouw privébericht aan %s (%s):"
+#: ../../Zotlabs/Module/Connedit.php:881
+msgid "Only import posts with this text"
+msgstr "Importeer alleen berichten met deze tekst"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
-msgid "webpage"
-msgstr "Webpagina"
+#: ../../Zotlabs/Module/Connedit.php:881 ../../Zotlabs/Module/Connedit.php:882
+msgid ""
+"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
+"all posts"
+msgstr "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
-msgid "block"
-msgstr "blok"
+#: ../../Zotlabs/Module/Connedit.php:882
+msgid "Do not import posts with this text"
+msgstr "Importeer geen berichten met deze tekst"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
-msgid "layout"
-msgstr "lay-out"
+#: ../../Zotlabs/Module/Connedit.php:884
+msgid "This information is public!"
+msgstr "Deze informatie is openbaar!"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
-msgid "menu"
-msgstr "menu"
+#: ../../Zotlabs/Module/Connedit.php:889
+msgid "Connection Pending Approval"
+msgstr "Connectie moet nog geaccepteerd worden"
-#: ../../Zotlabs/Module/Impel.php:191
-#, php-format
-msgid "%s element installed"
-msgstr "%s onderdeel geïnstalleerd"
+#: ../../Zotlabs/Module/Connedit.php:892
+#: ../../Zotlabs/Module/Settings/Permcats.php:107
+#: ../../Zotlabs/Module/Settings/Tokens.php:163
+msgid "inherited"
+msgstr "geërfd"
-#: ../../Zotlabs/Module/Impel.php:194
+#: ../../Zotlabs/Module/Connedit.php:894
#, php-format
-msgid "%s element installation failed"
-msgstr "Installatie %s-element mislukt"
-
-#: ../../Zotlabs/Module/Import_items.php:42 ../../Zotlabs/Module/Import.php:71
-msgid "Nothing to import."
-msgstr "Niets gevonden om te importeren"
-
-#: ../../Zotlabs/Module/Import_items.php:66 ../../Zotlabs/Module/Import.php:83
-#: ../../Zotlabs/Module/Import.php:98
-msgid "Unable to download data from old server"
-msgstr "Niet in staat om gegevens van de oude hub te downloaden"
-
-#: ../../Zotlabs/Module/Import_items.php:72
-#: ../../Zotlabs/Module/Import.php:105
-msgid "Imported file is empty."
-msgstr "Geïmporteerde bestand is leeg"
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
-#: ../../Zotlabs/Module/Import_items.php:88
-#: ../../Zotlabs/Module/Import.php:127
-#, php-format
-msgid "Warning: Database versions differ by %1$d updates."
-msgstr "Waarschuwing: database-versies lopen %1$d updates achter."
+#: ../../Zotlabs/Module/Connedit.php:896
+#: ../../Zotlabs/Module/Settings/Tokens.php:160
+msgid "Their Settings"
+msgstr "Hun instellingen"
-#: ../../Zotlabs/Module/Import_items.php:104
-msgid "Import completed"
-msgstr "Importeren voltooid"
+#: ../../Zotlabs/Module/Connedit.php:897
+#: ../../Zotlabs/Module/Settings/Permcats.php:105
+#: ../../Zotlabs/Module/Settings/Tokens.php:161
+msgid "My Settings"
+msgstr "Mijn instellingen"
-#: ../../Zotlabs/Module/Import_items.php:119
-msgid "Import Items"
-msgstr "Importeer items"
+#: ../../Zotlabs/Module/Connedit.php:899
+#: ../../Zotlabs/Module/Settings/Permcats.php:110
+#: ../../Zotlabs/Module/Settings/Tokens.php:166
+msgid "Individual Permissions"
+msgstr "Individuele permissies"
-#: ../../Zotlabs/Module/Import_items.php:120
+#: ../../Zotlabs/Module/Connedit.php:900
+#: ../../Zotlabs/Module/Settings/Permcats.php:111
+#: ../../Zotlabs/Module/Settings/Tokens.php:167
msgid ""
-"Use this form to import existing posts and content from an export file."
-msgstr "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren."
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can <strong>not</strong> change those"
+" settings here."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen."
-#: ../../Zotlabs/Module/Import_items.php:121
-#: ../../Zotlabs/Module/Import.php:532
-msgid "File to Upload"
-msgstr "Bestand om te uploaden"
+#: ../../Zotlabs/Module/Connedit.php:901
+msgid ""
+"Some permissions may be inherited from your channel's <a "
+"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
+"priority than individual settings. You can change those settings here but "
+"they wont have any impact unless the inherited setting changes."
+msgstr "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. "
-#: ../../Zotlabs/Module/Invite.php:29
-msgid "Total invitation limit exceeded."
-msgstr "Limiet voor aantal uitnodigingen overschreden."
+#: ../../Zotlabs/Module/Connedit.php:902
+msgid "Last update:"
+msgstr "Laatste wijziging:"
-#: ../../Zotlabs/Module/Invite.php:53
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Geen geldig e-mailadres."
+#: ../../Zotlabs/Module/Connedit.php:911
+msgid "Details"
+msgstr "Details"
-#: ../../Zotlabs/Module/Invite.php:67
-msgid "Please join us on $Projectname"
-msgstr "Uitnodiging voor $Projectname"
+#: ../../Zotlabs/Module/Connedit.php:914
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
+msgid "Organisation"
+msgstr "Organisatie"
-#: ../../Zotlabs/Module/Invite.php:77
-msgid "Invitation limit exceeded. Please contact your site administrator."
-msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
+#: ../../Zotlabs/Module/Connedit.php:915
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
+#: ../../include/page_widgets.php:46
+msgid "Title"
+msgstr "Titel"
-#: ../../Zotlabs/Module/Invite.php:82
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Aflevering bericht mislukt."
+#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:789
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
+msgid "Phone"
+msgstr "Telefoon"
-#: ../../Zotlabs/Module/Invite.php:86
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d bericht verzonden."
-msgstr[1] "%d berichten verzonden."
+#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:791
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
+msgid "Instant messenger"
+msgstr "Instant messenger"
-#: ../../Zotlabs/Module/Invite.php:105
-msgid "You have no more invitations available"
-msgstr "Je hebt geen uitnodigingen meer beschikbaar"
+#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Profiles.php:792
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
+msgid "Website"
+msgstr "Website"
-#: ../../Zotlabs/Module/Invite.php:136
-msgid "Send invitations"
-msgstr "Uitnodigingen verzenden"
+#: ../../Zotlabs/Module/Connedit.php:921 ../../Zotlabs/Module/Profiles.php:794
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
+msgid "Note"
+msgstr "Opmerking"
-#: ../../Zotlabs/Module/Invite.php:137
-msgid "Enter email addresses, one per line:"
-msgstr "Voer e-mailadressen in, één per regel:"
+#: ../../Zotlabs/Module/Connedit.php:922 ../../Zotlabs/Module/Profiles.php:795
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
+#: ../../extend/addon/addon/cdav/cdav.php:270
+#: ../../include/connections.php:668
+msgid "Mobile"
+msgstr "Mobiel"
-#: ../../Zotlabs/Module/Invite.php:139
-msgid "Please join my community on $Projectname."
-msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname op http://hubzilla.org"
+#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:796
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146
+#: ../../extend/addon/addon/cdav/cdav.php:271
+#: ../../include/connections.php:669
+msgid "Home"
+msgstr "Thuis"
-#: ../../Zotlabs/Module/Invite.php:141
-msgid "You will need to supply this invitation code:"
-msgstr "Je moet deze uitnodigingscode opgeven:"
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:797
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
+#: ../../extend/addon/addon/cdav/cdav.php:274
+#: ../../include/connections.php:672
+msgid "Work"
+msgstr "Werk"
-#: ../../Zotlabs/Module/Invite.php:142
-msgid ""
-"1. Register at any $Projectname location (they are all inter-connected)"
-msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
+#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:799
+#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
+msgid "Add Contact"
+msgstr "Contact toevoegen"
-#: ../../Zotlabs/Module/Invite.php:144
-msgid "2. Enter my $Projectname network address into the site searchbar."
-msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:800
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
+msgid "Add Field"
+msgstr "Veld toevoegen"
-#: ../../Zotlabs/Module/Invite.php:145
-msgid "or visit"
-msgstr "of bezoek"
+#: ../../Zotlabs/Module/Connedit.php:932
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
+msgid "P.O. Box"
+msgstr "Postbus"
-#: ../../Zotlabs/Module/Invite.php:147
-msgid "3. Click [Connect]"
-msgstr "3. Klik op [+ Verbinden]"
+#: ../../Zotlabs/Module/Connedit.php:933
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
+msgid "Additional"
+msgstr "Extra"
-#: ../../Zotlabs/Module/Editblock.php:108 ../../Zotlabs/Module/Blocks.php:97
-#: ../../Zotlabs/Module/Blocks.php:155
-msgid "Block Name"
-msgstr "Bloknaam"
+#: ../../Zotlabs/Module/Connedit.php:934
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
+msgid "Street"
+msgstr "Straat en huisnummer"
-#: ../../Zotlabs/Module/Editblock.php:124 ../../include/conversation.php:1258
-msgid "Title (optional)"
-msgstr "Titel (optioneel)"
+#: ../../Zotlabs/Module/Connedit.php:935
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
+msgid "Locality"
+msgstr "Plaats"
-#: ../../Zotlabs/Module/Editblock.php:133
-msgid "Edit Block"
-msgstr "Blok bewerken"
+#: ../../Zotlabs/Module/Connedit.php:936
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
+msgid "Region"
+msgstr "Provincie/staat/regio/enz."
-#: ../../Zotlabs/Module/Group.php:24
-msgid "Privacy group created."
-msgstr "Privacygroep aangemaakt"
+#: ../../Zotlabs/Module/Connedit.php:937
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
+msgid "ZIP Code"
+msgstr "Postcode"
-#: ../../Zotlabs/Module/Group.php:30
-msgid "Could not create privacy group."
-msgstr "Kon privacygroep niet aanmaken"
+#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Profiles.php:760
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
+msgid "Country"
+msgstr "Land"
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3876
-msgid "Privacy group not found."
-msgstr "Privacygroep niet gevonden"
+#: ../../Zotlabs/Module/Events.php:25
+msgid "Calendar entries imported."
+msgstr "Agenda-items geïmporteerd."
-#: ../../Zotlabs/Module/Group.php:58
-msgid "Privacy group updated."
-msgstr "Privacygroep bijgewerkt"
+#: ../../Zotlabs/Module/Events.php:27
+msgid "No calendar entries found."
+msgstr "Geen agenda-items gevonden."
-#: ../../Zotlabs/Module/Group.php:90
-msgid "Create a group of channels."
-msgstr "Privacygroep met kanalen aanmaken"
+#: ../../Zotlabs/Module/Events.php:110
+msgid "Event can not end before it has started."
+msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
-msgid "Privacy group name: "
-msgstr "Naam privacygroep: "
+#: ../../Zotlabs/Module/Events.php:112 ../../Zotlabs/Module/Events.php:121
+#: ../../Zotlabs/Module/Events.php:143
+msgid "Unable to generate preview."
+msgstr "Niet in staat om voorvertoning te genereren"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
-msgid "Members are visible to other channels"
-msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
+#: ../../Zotlabs/Module/Events.php:119
+msgid "Event title and start time are required."
+msgstr "Titel en begintijd van gebeurtenis zijn vereist."
-#: ../../Zotlabs/Module/Group.php:111
-msgid "Privacy group removed."
-msgstr "Privacygroep verwijderd."
+#: ../../Zotlabs/Module/Events.php:141 ../../Zotlabs/Module/Events.php:265
+msgid "Event not found."
+msgstr "Gebeurtenis niet gevonden"
-#: ../../Zotlabs/Module/Group.php:113
-msgid "Unable to remove privacy group."
-msgstr "Verwijderen privacygroep mislukt"
+#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Like.php:372
+#: ../../Zotlabs/Module/Tagger.php:51 ../../include/event.php:1141
+#: ../../include/conversation.php:123 ../../include/text.php:1961
+msgid "event"
+msgstr "gebeurtenis"
-#: ../../Zotlabs/Module/Group.php:183
-msgid "Privacy group editor"
-msgstr "Privacygroep bewerken"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
+msgstr "Titel bewerken"
-#: ../../Zotlabs/Module/Group.php:199
-msgid "All Connected Channels"
-msgstr "Alle kanaalconnecties"
+#: ../../Zotlabs/Module/Events.php:460
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
+msgid "Event title"
+msgstr "Titel"
-#: ../../Zotlabs/Module/Group.php:231
-msgid "Click on a channel to add or remove."
-msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
+#: ../../Zotlabs/Module/Events.php:462
+msgid "Categories (comma-separated list)"
+msgstr "Categorieën (door komma's gescheiden lijst)"
-#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
-msgid "Invalid profile identifier."
-msgstr "Ongeldige profiel-identificator"
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Edit Category"
+msgstr "Categorie"
-#: ../../Zotlabs/Module/Profperm.php:115
-msgid "Profile Visibility Editor"
-msgstr "Zichtbaarheid profiel "
+#: ../../Zotlabs/Module/Events.php:463
+msgid "Category"
+msgstr "Categorie"
-#: ../../Zotlabs/Module/Profperm.php:117 ../../include/channel.php:1282
-msgid "Profile"
-msgstr "Profiel"
+#: ../../Zotlabs/Module/Events.php:466
+msgid "Edit start date and time"
+msgstr "Begindatum en -tijd bewerken"
-#: ../../Zotlabs/Module/Profperm.php:119
-msgid "Click on a contact to add or remove."
-msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
+#: ../../Zotlabs/Module/Events.php:466
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
+msgid "Start date and time"
+msgstr "Begindatum en -tijd"
-#: ../../Zotlabs/Module/Profperm.php:128
-msgid "Visible To"
-msgstr "Zichtbaar voor"
+#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
+msgid "Finish date and time are not known or not relevant"
+msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
-#: ../../Zotlabs/Module/Magic.php:71
-msgid "Hub not found."
-msgstr "Hub niet gevonden."
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Edit finish date and time"
+msgstr "Einddatum en -tijd bewerken"
-#: ../../Zotlabs/Module/Mitem.php:52
-msgid "Unable to create element."
-msgstr "Niet in staat om onderdeel aan te maken."
+#: ../../Zotlabs/Module/Events.php:469
+msgid "Finish date and time"
+msgstr "Einddatum en -tijd"
-#: ../../Zotlabs/Module/Mitem.php:76
-msgid "Unable to update menu element."
-msgstr "Menu-onderdeel kan niet worden geüpdatet."
+#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Module/Events.php:472
+msgid "Adjust for viewer timezone"
+msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
-#: ../../Zotlabs/Module/Mitem.php:92
-msgid "Unable to add menu element."
-msgstr "Menu-onderdeel kan niet worden toegevoegd."
+#: ../../Zotlabs/Module/Events.php:471
+msgid ""
+"Important for events that happen in a particular place. Not practical for "
+"global holidays."
+msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
-#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
-msgid "Menu Item Permissions"
-msgstr "Permissies menu-item"
+#: ../../Zotlabs/Module/Events.php:473
+msgid "Edit Description"
+msgstr "Omschrijving bewerken"
-#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:489
-msgid "(click to open/close)"
-msgstr "(klik om te openen/sluiten)"
+#: ../../Zotlabs/Module/Events.php:475
+msgid "Edit Location"
+msgstr "Locatie bewerken"
-#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
-msgid "Link Name"
-msgstr "Linknaam"
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1094
+#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../include/page_widgets.php:43 ../../include/conversation.php:1347
+msgid "Preview"
+msgstr "Voorvertoning"
-#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
-msgid "Link or Submenu Target"
-msgstr "Linkdoel of submenu-doel"
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1410
+msgid "Permission settings"
+msgstr "Permissies"
-#: ../../Zotlabs/Module/Mitem.php:161
-msgid "Enter URL of the link or select a menu name to create a submenu"
-msgstr "Geef de URL van de link of kies een menunaam om een submenu aan te maken"
+#: ../../Zotlabs/Module/Events.php:489
+msgid "Timezone:"
+msgstr "Tijdzone:"
-#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
-msgid "Use magic-auth if available"
-msgstr "Gebruik magic-auth wanneer beschikbaar"
+#: ../../Zotlabs/Module/Events.php:494
+msgid "Advanced Options"
+msgstr "Geavanceerde opties"
-#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
-msgid "Open link in new window"
-msgstr "Open link in nieuw venster"
+#: ../../Zotlabs/Module/Events.php:605 ../../Zotlabs/Module/Cal.php:263
+msgid "l, F j"
+msgstr "l j F"
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Order in list"
-msgstr "Volgorde in lijst"
+#: ../../Zotlabs/Module/Events.php:633
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
-#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
-msgid "Higher numbers will sink to bottom of listing"
-msgstr "Hogere nummers komen onderaan de lijst terecht"
+#: ../../Zotlabs/Module/Events.php:635
+msgid "Delete event"
+msgstr "Gebeurtenis verwijderen"
-#: ../../Zotlabs/Module/Mitem.php:165
-msgid "Submit and finish"
-msgstr "Opslaan en afsluiten"
+#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:312
+#: ../../include/text.php:1766
+msgid "Link to Source"
+msgstr "Originele locatie"
-#: ../../Zotlabs/Module/Mitem.php:166
-msgid "Submit and continue"
-msgstr "Opslaan en doorgaan"
+#: ../../Zotlabs/Module/Events.php:669
+msgid "calendar"
+msgstr "agenda"
-#: ../../Zotlabs/Module/Mitem.php:174
-msgid "Menu:"
-msgstr "Menu:"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:335
+msgid "Edit Event"
+msgstr "Gebeurtenis bewerken"
-#: ../../Zotlabs/Module/Mitem.php:177
-msgid "Link Target"
-msgstr "Linkdoel"
+#: ../../Zotlabs/Module/Events.php:688 ../../Zotlabs/Module/Cal.php:335
+msgid "Create Event"
+msgstr "Gebeurtenis aanmaken"
-#: ../../Zotlabs/Module/Mitem.php:180
-msgid "Edit menu"
-msgstr "Menu bewerken"
+#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
+#: ../../Zotlabs/Module/Photos.php:935 ../../Zotlabs/Module/Cal.php:336
+#: ../../Zotlabs/Module/Cal.php:343
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
+msgid "Previous"
+msgstr "Vorige"
-#: ../../Zotlabs/Module/Mitem.php:183
-msgid "Edit element"
-msgstr "Onderdeel bewerken"
+#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
+#: ../../Zotlabs/Module/Photos.php:944 ../../Zotlabs/Module/Cal.php:337
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Setup.php:264
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
+msgid "Next"
+msgstr "Volgende"
-#: ../../Zotlabs/Module/Mitem.php:184
-msgid "Drop element"
-msgstr "Onderdeel verwijderen"
+#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:338
+#: ../../include/channel.php:1370
+msgid "Export"
+msgstr "Exporteren"
-#: ../../Zotlabs/Module/Mitem.php:185
-msgid "New element"
-msgstr "Nieuw element"
+#: ../../Zotlabs/Module/Events.php:695
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
+msgid "Month"
+msgstr "Maand"
-#: ../../Zotlabs/Module/Mitem.php:186
-msgid "Edit this menu container"
-msgstr "Deze menu-container bewerken"
+#: ../../Zotlabs/Module/Events.php:696
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
+msgid "Week"
+msgstr "Week"
-#: ../../Zotlabs/Module/Mitem.php:187
-msgid "Add menu element"
-msgstr "Menu-element toevoegen"
+#: ../../Zotlabs/Module/Events.php:697
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
+msgid "Day"
+msgstr "Dag"
-#: ../../Zotlabs/Module/Mitem.php:188
-msgid "Delete this menu item"
-msgstr "Dit menu-item verwijderen"
+#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:345
+#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
+msgid "Today"
+msgstr "Vandaag"
-#: ../../Zotlabs/Module/Mitem.php:189
-msgid "Edit this menu item"
-msgstr "Dit menu-item bewerken"
+#: ../../Zotlabs/Module/Events.php:731
+msgid "Event removed"
+msgstr "Gebeurtenis verwijderd"
-#: ../../Zotlabs/Module/Mitem.php:206
-msgid "Menu item not found."
-msgstr "Menu-item niet gevonden."
+#: ../../Zotlabs/Module/Events.php:734
+msgid "Failed to remove event"
+msgstr "Verwijderen gebeurtenis mislukt"
-#: ../../Zotlabs/Module/Mitem.php:219
-msgid "Menu item deleted."
-msgstr "Menu-item verwijderd."
+#: ../../Zotlabs/Module/Home.php:74 ../../Zotlabs/Module/Home.php:82
+#: ../../extend/addon/addon/opensearch/opensearch.php:42
+msgid "$Projectname"
+msgstr "$Projectname"
-#: ../../Zotlabs/Module/Mitem.php:221
-msgid "Menu item could not be deleted."
-msgstr "Menu-item kon niet worden verwijderd."
+#: ../../Zotlabs/Module/Home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Welkom op %s"
-#: ../../Zotlabs/Module/Mitem.php:228
-msgid "Edit Menu Element"
-msgstr "Menu-element bewerken"
+#: ../../Zotlabs/Module/Filestorage.php:87
+msgid "Permission Denied."
+msgstr "Toegang geweigerd"
-#: ../../Zotlabs/Module/Mitem.php:238
-msgid "Link text"
-msgstr "Linktekst"
+#: ../../Zotlabs/Module/Filestorage.php:103
+msgid "File not found."
+msgstr "Bestand niet gevonden."
-#: ../../Zotlabs/Module/Ratings.php:70
-msgid "No ratings"
-msgstr "Geen beoordelingen"
+#: ../../Zotlabs/Module/Filestorage.php:146
+msgid "Edit file permissions"
+msgstr "Bestandsrechten bewerken"
-#: ../../Zotlabs/Module/Ratings.php:98
-msgid "Rating: "
-msgstr "Beoordeling: "
+#: ../../Zotlabs/Module/Filestorage.php:159
+msgid "Set/edit permissions"
+msgstr "Rechten instellen/bewerken"
-#: ../../Zotlabs/Module/Ratings.php:99
-msgid "Website: "
-msgstr "Website: "
+#: ../../Zotlabs/Module/Filestorage.php:160
+msgid "Include all files and sub folders"
+msgstr "Toepassen op alle bestanden en submappen"
-#: ../../Zotlabs/Module/Ratings.php:101
-msgid "Description: "
-msgstr "Omschrijving: "
+#: ../../Zotlabs/Module/Filestorage.php:161
+msgid "Return to file list"
+msgstr "Terugkeren naar bestandlijst "
-#: ../../Zotlabs/Module/Attach.php:13
-msgid "Item not available."
-msgstr "Item is niet aanwezig."
+#: ../../Zotlabs/Module/Filestorage.php:163
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Kopieer/plak deze code om het bestand aan een bericht te koppelen"
-#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
-#, php-format
-msgctxt "mood"
-msgid "%1$s is %2$s"
-msgstr "%1$s is %2$s"
+#: ../../Zotlabs/Module/Filestorage.php:164
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Kopieer/plak deze URL om het bestand aan een externe webpagina te koppelen"
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:229
-msgid "Mood"
-msgstr "Stemming"
+#: ../../Zotlabs/Module/Filestorage.php:166
+msgid "Share this file"
+msgstr "Dit bestand delen"
-#: ../../Zotlabs/Module/Mood.php:136
-msgid "Set your current mood and tell your friends"
-msgstr "Noteer je huidige stemming en toon het aan je connecties"
+#: ../../Zotlabs/Module/Filestorage.php:167
+msgid "Show URL to this file"
+msgstr "Toon URL van dit bestand"
-#: ../../Zotlabs/Module/Notify.php:57
-#: ../../Zotlabs/Module/Notifications.php:35
-msgid "No more system notifications."
-msgstr "Geen systeemnotificaties meer."
+#: ../../Zotlabs/Module/Filestorage.php:168
+msgid "Notify your contacts about this file"
+msgstr "Jouw connecties over dit bestand berichten"
-#: ../../Zotlabs/Module/Notify.php:61
-#: ../../Zotlabs/Module/Notifications.php:39
-msgid "System Notifications"
-msgstr "Systeemnotificaties"
+#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/conversation.php:1836
+msgid "Photos"
+msgstr "Foto's"
#: ../../Zotlabs/Module/Photos.php:82
msgid "Page owner information could not be retrieved."
msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
-#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:734
+#: ../../Zotlabs/Module/Photos.php:97 ../../Zotlabs/Module/Photos.php:729
#: ../../Zotlabs/Module/Profile_photo.php:115
-#: ../../Zotlabs/Module/Profile_photo.php:219
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:225
-#: ../../include/photo/photo_driver.php:728
+#: ../../Zotlabs/Module/Profile_photo.php:224
+#: ../../include/photo/photo_driver.php:730
msgid "Profile Photos"
msgstr "Profielfoto's"
@@ -3871,1070 +3733,1045 @@ msgid ""
"manager"
msgstr "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder."
-#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1059
+#: ../../Zotlabs/Module/Photos.php:190 ../../Zotlabs/Module/Photos.php:1054
msgid "Delete Photo"
msgstr "Verwijder foto"
-#: ../../Zotlabs/Module/Photos.php:520
+#: ../../Zotlabs/Module/Photos.php:508 ../../Zotlabs/Module/Display.php:22
+#: ../../Zotlabs/Module/Ratings.php:83 ../../Zotlabs/Module/Search.php:17
+#: ../../Zotlabs/Module/Directory.php:64
+#: ../../Zotlabs/Module/Viewconnections.php:23
+#: ../../extend/addon/addon/friendica/dfrn_request.php:794
+msgid "Public access denied."
+msgstr "Openbare toegang geweigerd."
+
+#: ../../Zotlabs/Module/Photos.php:519
msgid "No photos selected"
msgstr "Geen foto's geselecteerd"
-#: ../../Zotlabs/Module/Photos.php:569
+#: ../../Zotlabs/Module/Photos.php:568
msgid "Access to this item is restricted."
msgstr "Toegang tot dit item is beperkt."
-#: ../../Zotlabs/Module/Photos.php:608
+#: ../../Zotlabs/Module/Photos.php:607
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
-#: ../../Zotlabs/Module/Photos.php:611
+#: ../../Zotlabs/Module/Photos.php:610
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f MB aan foto-opslag gebruikt."
-#: ../../Zotlabs/Module/Photos.php:647
+#: ../../Zotlabs/Module/Photos.php:646
msgid "Upload Photos"
msgstr "Foto's uploaden"
-#: ../../Zotlabs/Module/Photos.php:651
+#: ../../Zotlabs/Module/Photos.php:650
msgid "Enter an album name"
msgstr "Vul een albumnaam in"
-#: ../../Zotlabs/Module/Photos.php:652
+#: ../../Zotlabs/Module/Photos.php:651
msgid "or select an existing album (doubleclick)"
msgstr "of kies een bestaand album (dubbelklikken)"
-#: ../../Zotlabs/Module/Photos.php:653
+#: ../../Zotlabs/Module/Photos.php:652
msgid "Create a status post for this upload"
msgstr "Plaats een bericht voor deze upload."
-#: ../../Zotlabs/Module/Photos.php:654
+#: ../../Zotlabs/Module/Photos.php:653
msgid "Caption (optional):"
-msgstr "Bijschrift (optioneel):"
+msgstr "Bijschrift (niet verplicht):"
-#: ../../Zotlabs/Module/Photos.php:655
+#: ../../Zotlabs/Module/Photos.php:654
msgid "Description (optional):"
-msgstr "Omschrijving (optioneel):"
+msgstr "Omschrijving (niet verplicht):"
-#: ../../Zotlabs/Module/Photos.php:686
+#: ../../Zotlabs/Module/Photos.php:685
msgid "Album name could not be decoded"
msgstr "Albumnaam kon niet gedecodeerd worden"
-#: ../../Zotlabs/Module/Photos.php:734
+#: ../../Zotlabs/Module/Photos.php:729
msgid "Contact Photos"
msgstr "Connectiefoto's"
-#: ../../Zotlabs/Module/Photos.php:757
+#: ../../Zotlabs/Module/Photos.php:752
msgid "Show Newest First"
msgstr "Nieuwste eerst weergeven"
-#: ../../Zotlabs/Module/Photos.php:759
+#: ../../Zotlabs/Module/Photos.php:754
msgid "Show Oldest First"
msgstr "Oudste eerst weergeven"
-#: ../../Zotlabs/Module/Photos.php:783 ../../Zotlabs/Module/Photos.php:1337
-#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1678
+#: ../../Zotlabs/Module/Photos.php:778 ../../Zotlabs/Module/Photos.php:1335
+#: ../../Zotlabs/Module/Embedphotos.php:139 ../../include/widgets.php:1751
msgid "View Photo"
msgstr "Foto weergeven"
-#: ../../Zotlabs/Module/Photos.php:814
-#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1695
+#: ../../Zotlabs/Module/Photos.php:809
+#: ../../Zotlabs/Module/Embedphotos.php:155 ../../include/widgets.php:1768
msgid "Edit Album"
msgstr "Album bewerken"
-#: ../../Zotlabs/Module/Photos.php:861
+#: ../../Zotlabs/Module/Photos.php:856
msgid "Permission denied. Access to this item may be restricted."
msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
-#: ../../Zotlabs/Module/Photos.php:863
+#: ../../Zotlabs/Module/Photos.php:858
msgid "Photo not available"
msgstr "Foto niet aanwezig"
-#: ../../Zotlabs/Module/Photos.php:921
+#: ../../Zotlabs/Module/Photos.php:916
msgid "Use as profile photo"
msgstr "Als profielfoto gebruiken"
-#: ../../Zotlabs/Module/Photos.php:922
+#: ../../Zotlabs/Module/Photos.php:917
msgid "Use as cover photo"
msgstr "Als omslagfoto gebruiken"
-#: ../../Zotlabs/Module/Photos.php:929
+#: ../../Zotlabs/Module/Photos.php:924
msgid "Private Photo"
msgstr "Privéfoto"
-#: ../../Zotlabs/Module/Photos.php:940 ../../Zotlabs/Module/Cal.php:336
-#: ../../Zotlabs/Module/Cal.php:343 ../../Zotlabs/Module/Events.php:680
-#: ../../Zotlabs/Module/Events.php:689
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Vorige"
-
-#: ../../Zotlabs/Module/Photos.php:944
+#: ../../Zotlabs/Module/Photos.php:939
msgid "View Full Size"
msgstr "Volledige grootte weergeven"
-#: ../../Zotlabs/Module/Photos.php:949 ../../Zotlabs/Module/Setup.php:264
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
-#: ../../Zotlabs/Module/Events.php:681 ../../Zotlabs/Module/Events.php:690
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Volgende"
-
-#: ../../Zotlabs/Module/Photos.php:1033
+#: ../../Zotlabs/Module/Photos.php:1028
msgid "Edit photo"
msgstr "Foto bewerken"
-#: ../../Zotlabs/Module/Photos.php:1035
+#: ../../Zotlabs/Module/Photos.php:1030
msgid "Rotate CW (right)"
msgstr "Draai met de klok mee (naar rechts)"
-#: ../../Zotlabs/Module/Photos.php:1036
+#: ../../Zotlabs/Module/Photos.php:1031
msgid "Rotate CCW (left)"
msgstr "Draai tegen de klok in (naar links)"
-#: ../../Zotlabs/Module/Photos.php:1039
+#: ../../Zotlabs/Module/Photos.php:1034
msgid "Move photo to album"
msgstr "Verplaatst foto naar album"
-#: ../../Zotlabs/Module/Photos.php:1040
+#: ../../Zotlabs/Module/Photos.php:1035
msgid "Enter a new album name"
msgstr "Vul een nieuwe albumnaam in"
-#: ../../Zotlabs/Module/Photos.php:1041
+#: ../../Zotlabs/Module/Photos.php:1036
msgid "or select an existing one (doubleclick)"
msgstr "of kies een bestaand album (dubbelklikken)"
-#: ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Photos.php:1039
msgid "Caption"
msgstr "Bijschrift"
-#: ../../Zotlabs/Module/Photos.php:1046
+#: ../../Zotlabs/Module/Photos.php:1041
msgid "Add a Tag"
msgstr "Tag toevoegen"
-#: ../../Zotlabs/Module/Photos.php:1054
+#: ../../Zotlabs/Module/Photos.php:1049
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
-#: ../../Zotlabs/Module/Photos.php:1057
+#: ../../Zotlabs/Module/Photos.php:1052
msgid "Flag as adult in album view"
msgstr "Markeer als voor volwassenen in albumweergave"
-#: ../../Zotlabs/Module/Photos.php:1076 ../../Zotlabs/Lib/ThreadItem.php:268
+#: ../../Zotlabs/Module/Photos.php:1071 ../../Zotlabs/Lib/ThreadItem.php:268
msgid "I like this (toggle)"
msgstr "Vind ik leuk"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../Zotlabs/Lib/ThreadItem.php:269
+#: ../../Zotlabs/Module/Photos.php:1072 ../../Zotlabs/Lib/ThreadItem.php:269
msgid "I don't like this (toggle)"
msgstr "Vind ik niet leuk"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../Zotlabs/Module/Blocks.php:161
-#: ../../Zotlabs/Module/Layouts.php:193 ../../Zotlabs/Module/Webpages.php:241
+#: ../../Zotlabs/Module/Photos.php:1073 ../../Zotlabs/Module/Webpages.php:245
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Layouts.php:193
#: ../../extend/addon/addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1230
+#: ../../include/conversation.php:1378
msgid "Share"
msgstr "Delen"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../Zotlabs/Lib/ThreadItem.php:409
-#: ../../include/conversation.php:737
+#: ../../Zotlabs/Module/Photos.php:1074 ../../Zotlabs/Lib/ThreadItem.php:411
+#: ../../include/conversation.php:738
msgid "Please wait"
msgstr "Even wachten"
-#: ../../Zotlabs/Module/Photos.php:1095 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/ThreadItem.php:726
+#: ../../Zotlabs/Module/Photos.php:1090 ../../Zotlabs/Module/Photos.php:1208
+#: ../../Zotlabs/Lib/ThreadItem.php:728
msgid "This is you"
msgstr "Dit ben jij"
-#: ../../Zotlabs/Module/Photos.php:1097 ../../Zotlabs/Module/Photos.php:1215
-#: ../../Zotlabs/Lib/ThreadItem.php:728 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1092 ../../Zotlabs/Module/Photos.php:1210
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Reactie"
-#: ../../Zotlabs/Module/Photos.php:1099 ../../Zotlabs/Module/Webpages.php:247
-#: ../../Zotlabs/Module/Events.php:471 ../../Zotlabs/Lib/ThreadItem.php:738
-#: ../../include/page_widgets.php:43 ../../include/conversation.php:1199
-msgid "Preview"
-msgstr "Voorvertoning"
-
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
msgctxt "title"
msgid "Likes"
msgstr "vinden dit leuk"
-#: ../../Zotlabs/Module/Photos.php:1113 ../../include/conversation.php:577
+#: ../../Zotlabs/Module/Photos.php:1108 ../../include/conversation.php:577
msgctxt "title"
msgid "Dislikes"
msgstr "vinden dit niet leuk"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
msgctxt "title"
msgid "Agree"
msgstr "eens"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
msgctxt "title"
msgid "Disagree"
msgstr "oneens"
-#: ../../Zotlabs/Module/Photos.php:1114 ../../include/conversation.php:578
+#: ../../Zotlabs/Module/Photos.php:1109 ../../include/conversation.php:578
msgctxt "title"
msgid "Abstain"
msgstr "onthoudingen"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
msgctxt "title"
msgid "Attending"
msgstr "aanwezig"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
msgctxt "title"
msgid "Not attending"
msgstr "niet aanwezig"
-#: ../../Zotlabs/Module/Photos.php:1115 ../../include/conversation.php:579
+#: ../../Zotlabs/Module/Photos.php:1110 ../../include/conversation.php:579
msgctxt "title"
msgid "Might attend"
msgstr "mogelijk aanwezig"
-#: ../../Zotlabs/Module/Photos.php:1132 ../../Zotlabs/Module/Photos.php:1144
+#: ../../Zotlabs/Module/Photos.php:1127 ../../Zotlabs/Module/Photos.php:1139
#: ../../Zotlabs/Lib/ThreadItem.php:186 ../../Zotlabs/Lib/ThreadItem.php:198
-#: ../../include/conversation.php:1765
+#: ../../include/conversation.php:1928
msgid "View all"
msgstr "Toon alles"
-#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:190
-#: ../../include/channel.php:1190 ../../include/taxonomy.php:403
-#: ../../include/conversation.php:1789
+#: ../../Zotlabs/Module/Photos.php:1131 ../../Zotlabs/Lib/ThreadItem.php:190
+#: ../../include/taxonomy.php:403 ../../include/conversation.php:1952
+#: ../../include/channel.php:1273
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "vindt dit leuk"
msgstr[1] "vinden dit leuk"
-#: ../../Zotlabs/Module/Photos.php:1141 ../../Zotlabs/Lib/ThreadItem.php:195
-#: ../../include/conversation.php:1792
+#: ../../Zotlabs/Module/Photos.php:1136 ../../Zotlabs/Lib/ThreadItem.php:195
+#: ../../include/conversation.php:1955
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] "vindt dit niet leuk"
msgstr[1] "vinden dit niet leuk"
-#: ../../Zotlabs/Module/Photos.php:1241
+#: ../../Zotlabs/Module/Photos.php:1236
msgid "Photo Tools"
msgstr "Hulpmiddelen"
-#: ../../Zotlabs/Module/Photos.php:1250
+#: ../../Zotlabs/Module/Photos.php:1245
msgid "In This Photo:"
msgstr "Op deze foto:"
-#: ../../Zotlabs/Module/Photos.php:1255
+#: ../../Zotlabs/Module/Photos.php:1250
msgid "Map"
msgstr "Kaart"
-#: ../../Zotlabs/Module/Photos.php:1263 ../../Zotlabs/Lib/ThreadItem.php:398
+#: ../../Zotlabs/Module/Photos.php:1258 ../../Zotlabs/Lib/ThreadItem.php:400
msgctxt "noun"
msgid "Likes"
msgstr "vinden dit leuk"
-#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:399
+#: ../../Zotlabs/Module/Photos.php:1259 ../../Zotlabs/Lib/ThreadItem.php:401
msgctxt "noun"
msgid "Dislikes"
msgstr "vinden dit niet leuk"
-#: ../../Zotlabs/Module/Photos.php:1269 ../../Zotlabs/Lib/ThreadItem.php:404
-#: ../../include/acl_selectors.php:210
+#: ../../Zotlabs/Module/Photos.php:1264 ../../Zotlabs/Lib/ThreadItem.php:406
+#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr "Sluiten"
-#: ../../Zotlabs/Module/Photos.php:1343
+#: ../../Zotlabs/Module/Photos.php:1341
msgid "View Album"
msgstr "Album weergeven"
-#: ../../Zotlabs/Module/Photos.php:1354 ../../Zotlabs/Module/Photos.php:1367
-#: ../../Zotlabs/Module/Photos.php:1368
+#: ../../Zotlabs/Module/Photos.php:1352 ../../Zotlabs/Module/Photos.php:1365
+#: ../../Zotlabs/Module/Photos.php:1366
msgid "Recent Photos"
msgstr "Recente foto's"
-#: ../../Zotlabs/Module/Setup.php:176
-msgid "$Projectname Server - Setup"
-msgstr "$Projectname Hub - Setup"
+#: ../../Zotlabs/Module/Group.php:24
+msgid "Privacy group created."
+msgstr "Privacygroep aangemaakt"
-#: ../../Zotlabs/Module/Setup.php:180
-msgid "Could not connect to database."
-msgstr "Could not connect to database."
+#: ../../Zotlabs/Module/Group.php:30
+msgid "Could not create privacy group."
+msgstr "Kon privacygroep niet aanmaken"
-#: ../../Zotlabs/Module/Setup.php:184
-msgid ""
-"Could not connect to specified site URL. Possible SSL certificate or DNS "
-"issue."
-msgstr "Could not connect to specified hub URL. Possible SSL certificate or DNS issue."
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
+#: ../../include/items.php:3901
+msgid "Privacy group not found."
+msgstr "Privacygroep niet gevonden"
-#: ../../Zotlabs/Module/Setup.php:191
-msgid "Could not create table."
-msgstr "Could not create table."
+#: ../../Zotlabs/Module/Group.php:58
+msgid "Privacy group updated."
+msgstr "Privacygroep bijgewerkt"
-#: ../../Zotlabs/Module/Setup.php:196
-msgid "Your site database has been installed."
-msgstr "Your hub database has been installed."
+#: ../../Zotlabs/Module/Group.php:90
+msgid "Create a group of channels."
+msgstr "Privacygroep met kanalen aanmaken"
-#: ../../Zotlabs/Module/Setup.php:200
-msgid ""
-"You may need to import the file \"install/schema_xxx.sql\" manually using a "
-"database client."
-msgstr "You may need to import the file \"install/schema_xxx.sql\" manually using a database client."
+#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+msgid "Privacy group name: "
+msgstr "Naam privacygroep: "
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:745
-msgid "Please see the file \"install/INSTALL.txt\"."
-msgstr "Please see the file \"install/INSTALL.txt\"."
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+msgid "Members are visible to other channels"
+msgstr "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen"
-#: ../../Zotlabs/Module/Setup.php:260
-msgid "System check"
-msgstr "System check"
+#: ../../Zotlabs/Module/Group.php:111
+msgid "Privacy group removed."
+msgstr "Privacygroep verwijderd."
-#: ../../Zotlabs/Module/Setup.php:265
-msgid "Check again"
-msgstr "Check again"
+#: ../../Zotlabs/Module/Group.php:113
+msgid "Unable to remove privacy group."
+msgstr "Verwijderen privacygroep mislukt"
-#: ../../Zotlabs/Module/Setup.php:287
-msgid "Database connection"
-msgstr "Database connection"
+#: ../../Zotlabs/Module/Group.php:183
+msgid "Privacy group editor"
+msgstr "Privacygroep bewerken"
-#: ../../Zotlabs/Module/Setup.php:288
-msgid ""
-"In order to install $Projectname we need to know how to connect to your "
-"database."
-msgstr "In order to install $Projectname we need to know how to connect to your database."
+#: ../../Zotlabs/Module/Group.php:199
+msgid "All Connected Channels"
+msgstr "Alle kanaalconnecties"
-#: ../../Zotlabs/Module/Setup.php:289
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Please contact your hosting provider or server administrator if you have questions about these settings."
+#: ../../Zotlabs/Module/Group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
-#: ../../Zotlabs/Module/Setup.php:290
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "The database you specify below should already exist. If it does not, please create it before continuing."
+#: ../../Zotlabs/Module/Dreport.php:45
+msgid "Invalid message"
+msgstr "Ongeldig bericht"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Database Server Name"
-msgstr "Database Server Name"
+#: ../../Zotlabs/Module/Dreport.php:78
+msgid "no results"
+msgstr "geen resultaten"
-#: ../../Zotlabs/Module/Setup.php:294
-msgid "Default is 127.0.0.1"
-msgstr "Default is 127.0.0.1"
+#: ../../Zotlabs/Module/Dreport.php:93
+msgid "channel sync processed"
+msgstr "kanaalsync verwerkt"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Database Port"
-msgstr "Database Port"
+#: ../../Zotlabs/Module/Dreport.php:97
+msgid "queued"
+msgstr "in wachtrij"
-#: ../../Zotlabs/Module/Setup.php:295
-msgid "Communication port number - use 0 for default"
-msgstr "Communication port number - use 0 for default"
+#: ../../Zotlabs/Module/Dreport.php:101
+msgid "posted"
+msgstr "verstuurd"
-#: ../../Zotlabs/Module/Setup.php:296
-msgid "Database Login Name"
-msgstr "Database Login Name"
+#: ../../Zotlabs/Module/Dreport.php:105
+msgid "accepted for delivery"
+msgstr "geaccepteerd om afgeleverd te worden"
-#: ../../Zotlabs/Module/Setup.php:297
-msgid "Database Login Password"
-msgstr "Database Login Password"
+#: ../../Zotlabs/Module/Dreport.php:109
+msgid "updated"
+msgstr "geüpdatet"
-#: ../../Zotlabs/Module/Setup.php:298
-msgid "Database Name"
-msgstr "Database Name"
+#: ../../Zotlabs/Module/Dreport.php:112
+msgid "update ignored"
+msgstr "update genegeerd"
-#: ../../Zotlabs/Module/Setup.php:299
-msgid "Database Type"
-msgstr "Database Type"
+#: ../../Zotlabs/Module/Dreport.php:115
+msgid "permission denied"
+msgstr "toegang geweigerd"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid "Site administrator email address"
-msgstr "Hub administrator email address"
+#: ../../Zotlabs/Module/Dreport.php:119
+msgid "recipient not found"
+msgstr "ontvanger niet gevonden"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Your account email address must match this in order to use the web admin panel."
+#: ../../Zotlabs/Module/Dreport.php:122
+msgid "mail recalled"
+msgstr "Privébericht ingetrokken"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Website URL"
-msgstr "Hub URL"
+#: ../../Zotlabs/Module/Dreport.php:125
+msgid "duplicate mail received"
+msgstr "dubbel privébericht ontvangen"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
-msgid "Please use SSL (https) URL if available."
-msgstr "Please use SSL (https) URL if available."
+#: ../../Zotlabs/Module/Dreport.php:128
+msgid "mail delivered"
+msgstr "privébericht afgeleverd"
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
-msgid "Please select a default timezone for your website"
-msgstr "Please select a default timezone for your hub"
+#: ../../Zotlabs/Module/Dreport.php:148
+#, php-format
+msgid "Delivery report for %1$s"
+msgstr "Afleveringsrapport voor %1$s"
-#: ../../Zotlabs/Module/Setup.php:336
-msgid "Site settings"
-msgstr "Hub settings"
+#: ../../Zotlabs/Module/Dreport.php:151
+msgid "Options"
+msgstr "Opties"
-#: ../../Zotlabs/Module/Setup.php:392
-msgid "PHP version 5.5 or greater is required."
-msgstr "PHP version 5.5 or greater is required."
+#: ../../Zotlabs/Module/Dreport.php:152
+msgid "Redeliver"
+msgstr "Opnieuw afleveren"
-#: ../../Zotlabs/Module/Setup.php:393
-msgid "PHP version"
-msgstr "PHP version"
+#: ../../Zotlabs/Module/Mail.php:65
+msgid "Unable to lookup recipient."
+msgstr "Niet in staat om ontvanger op te zoeken."
-#: ../../Zotlabs/Module/Setup.php:409
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Could not find a command line version of PHP in the web server PATH."
+#: ../../Zotlabs/Module/Mail.php:72
+msgid "Unable to communicate with requested channel."
+msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
-#: ../../Zotlabs/Module/Setup.php:410
-msgid ""
-"If you don't have a command line version of PHP installed on server, you "
-"will not be able to run background polling via cron."
-msgstr "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."
+#: ../../Zotlabs/Module/Mail.php:79
+msgid "Cannot verify requested channel."
+msgstr "Kan opgevraagd kanaal niet verifieren"
-#: ../../Zotlabs/Module/Setup.php:414
-msgid "PHP executable path"
-msgstr "PHP executable path"
+#: ../../Zotlabs/Module/Mail.php:97
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
-#: ../../Zotlabs/Module/Setup.php:414
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Enter full path to php executable. You can leave this blank to continue the installation."
+#: ../../Zotlabs/Module/Mail.php:178
+msgid "Messages"
+msgstr "Berichten"
-#: ../../Zotlabs/Module/Setup.php:419
-msgid "Command line PHP"
-msgstr "Command line PHP"
+#: ../../Zotlabs/Module/Mail.php:213
+msgid "Message recalled."
+msgstr "Bericht ingetrokken."
-#: ../../Zotlabs/Module/Setup.php:429
-msgid ""
-"Unable to check command line PHP, as shell_exec() is disabled. This is "
-"required."
-msgstr "Unable to check command line PHP, as shell_exec() is disabled. This is required."
+#: ../../Zotlabs/Module/Mail.php:226
+msgid "Conversation removed."
+msgstr "Conversatie verwijderd"
-#: ../../Zotlabs/Module/Setup.php:432
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "The command line version of PHP on your system does not have \"register_argc_argv\" enabled."
+#: ../../Zotlabs/Module/Mail.php:240 ../../Zotlabs/Module/Mail.php:349
+#: ../../Zotlabs/Module/Chat.php:203 ../../include/conversation.php:1330
+msgid "Please enter a link URL:"
+msgstr "Vul een URL in:"
-#: ../../Zotlabs/Module/Setup.php:433
-msgid "This is required for message delivery to work."
-msgstr "This is required for message delivery to work."
+#: ../../Zotlabs/Module/Mail.php:241 ../../Zotlabs/Module/Mail.php:350
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verloopt op DD-MM-YYYY om HH:MM"
-#: ../../Zotlabs/Module/Setup.php:436
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../Zotlabs/Module/Mail.php:269
+msgid "Requested channel is not in this network"
+msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
-#: ../../Zotlabs/Module/Setup.php:454
-#, php-format
-msgid ""
-"Your max allowed total upload size is set to %s. Maximum size of one file to"
-" upload is set to %s. You are allowed to upload up to %d files at once."
-msgstr "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."
+#: ../../Zotlabs/Module/Mail.php:277
+msgid "Send Private Message"
+msgstr "Privébericht versturen"
-#: ../../Zotlabs/Module/Setup.php:459
-msgid "You can adjust these settings in the server php.ini file."
-msgstr "You can adjust these settings in the server php.ini file."
+#: ../../Zotlabs/Module/Mail.php:278 ../../Zotlabs/Module/Mail.php:403
+msgid "To:"
+msgstr "Aan:"
-#: ../../Zotlabs/Module/Setup.php:461
-msgid "PHP upload limits"
-msgstr "PHP upload limits"
+#: ../../Zotlabs/Module/Mail.php:281 ../../Zotlabs/Module/Mail.php:405
+msgid "Subject:"
+msgstr "Onderwerp:"
-#: ../../Zotlabs/Module/Setup.php:484
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"
+#: ../../Zotlabs/Module/Mail.php:284 ../../Zotlabs/Module/Invite.php:138
+msgid "Your message:"
+msgstr "Jouw bericht:"
-#: ../../Zotlabs/Module/Setup.php:485
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../Zotlabs/Module/Mail.php:286 ../../Zotlabs/Module/Mail.php:411
+#: ../../include/conversation.php:1390
+msgid "Attach file"
+msgstr "Bestand toevoegen"
-#: ../../Zotlabs/Module/Setup.php:488
-msgid "Generate encryption keys"
-msgstr "Generate encryption keys"
+#: ../../Zotlabs/Module/Mail.php:288
+msgid "Send"
+msgstr "Verzenden"
-#: ../../Zotlabs/Module/Setup.php:500
-msgid "libCurl PHP module"
-msgstr "libCurl PHP module"
+#: ../../Zotlabs/Module/Mail.php:291 ../../Zotlabs/Module/Mail.php:416
+#: ../../include/conversation.php:1435
+msgid "Set expiration date"
+msgstr "Verloopdatum instellen"
-#: ../../Zotlabs/Module/Setup.php:501
-msgid "GD graphics PHP module"
-msgstr "GD graphics PHP module"
+#: ../../Zotlabs/Module/Mail.php:293 ../../Zotlabs/Module/Mail.php:418
+#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Lib/ThreadItem.php:743
+#: ../../include/conversation.php:1440
+msgid "Encrypt text"
+msgstr "Tekst versleutelen"
-#: ../../Zotlabs/Module/Setup.php:502
-msgid "OpenSSL PHP module"
-msgstr "OpenSSL PHP module"
+#: ../../Zotlabs/Module/Mail.php:375
+msgid "Delete message"
+msgstr "Bericht verwijderen"
-#: ../../Zotlabs/Module/Setup.php:503
-msgid "PDO database PHP module"
-msgstr "PDO database PHP module"
+#: ../../Zotlabs/Module/Mail.php:376
+msgid "Delivery report"
+msgstr "Afleveringsrapport"
-#: ../../Zotlabs/Module/Setup.php:504
-msgid "mb_string PHP module"
-msgstr "mb_string PHP module"
+#: ../../Zotlabs/Module/Mail.php:377
+msgid "Recall message"
+msgstr "Bericht intrekken"
-#: ../../Zotlabs/Module/Setup.php:505
-msgid "xml PHP module"
-msgstr "xml PHP module"
+#: ../../Zotlabs/Module/Mail.php:379
+msgid "Message has been recalled."
+msgstr "Bericht is ingetrokken."
-#: ../../Zotlabs/Module/Setup.php:509 ../../Zotlabs/Module/Setup.php:511
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
+#: ../../Zotlabs/Module/Mail.php:396
+msgid "Delete Conversation"
+msgstr "Verwijder conversatie"
-#: ../../Zotlabs/Module/Setup.php:509
+#: ../../Zotlabs/Module/Mail.php:398
msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Error: Apache webserver mod-rewrite module is required but not installed."
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Geen veilige communicatie beschikbaar. <strong>Mogelijk</strong> kan je reageren op de kanaalpagina van de afzender."
-#: ../../Zotlabs/Module/Setup.php:515 ../../Zotlabs/Module/Setup.php:518
-msgid "exec"
-msgstr "exec"
+#: ../../Zotlabs/Module/Mail.php:402
+msgid "Send Reply"
+msgstr "Antwoord versturen"
-#: ../../Zotlabs/Module/Setup.php:515
-msgid ""
-"Error: exec is required but is either not installed or has been disabled in "
-"php.ini"
-msgstr "Error: exec is required but is either not installed or has been disabled in php.ini"
+#: ../../Zotlabs/Module/Mail.php:407
+#, php-format
+msgid "Your message for %s (%s):"
+msgstr "Jouw privébericht aan %s (%s):"
-#: ../../Zotlabs/Module/Setup.php:521 ../../Zotlabs/Module/Setup.php:524
-msgid "shell_exec"
-msgstr "shell_exec"
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+msgid "webpage"
+msgstr "Webpagina"
-#: ../../Zotlabs/Module/Setup.php:521
-msgid ""
-"Error: shell_exec is required but is either not installed or has been "
-"disabled in php.ini"
-msgstr "Error: shell_exec is required but is either not installed or has been disabled in php.ini"
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+msgid "block"
+msgstr "blok"
-#: ../../Zotlabs/Module/Setup.php:529
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Error: libCURL PHP module required but not installed."
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+msgid "layout"
+msgstr "lay-out"
-#: ../../Zotlabs/Module/Setup.php:533
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+msgid "menu"
+msgstr "menu"
-#: ../../Zotlabs/Module/Setup.php:537
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Error: openssl PHP module required but not installed."
+#: ../../Zotlabs/Module/Impel.php:191
+#, php-format
+msgid "%s element installed"
+msgstr "%s onderdeel geïnstalleerd"
-#: ../../Zotlabs/Module/Setup.php:541
-msgid "Error: PDO database PHP module required but not installed."
-msgstr "Error: PDO database PHP module required but not installed."
+#: ../../Zotlabs/Module/Impel.php:194
+#, php-format
+msgid "%s element installation failed"
+msgstr "Installatie %s-element mislukt"
-#: ../../Zotlabs/Module/Setup.php:545
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Error: mb_string PHP module required but not installed."
+#: ../../Zotlabs/Module/Import_items.php:104
+msgid "Import completed"
+msgstr "Importeren voltooid"
-#: ../../Zotlabs/Module/Setup.php:549
-msgid "Error: xml PHP module required for DAV but not installed."
-msgstr "Error: xml PHP module required for DAV but not installed."
+#: ../../Zotlabs/Module/Import_items.php:119
+msgid "Import Items"
+msgstr "Importeer items"
-#: ../../Zotlabs/Module/Setup.php:567
+#: ../../Zotlabs/Module/Import_items.php:120
msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."
+"Use this form to import existing posts and content from an export file."
+msgstr "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren."
-#: ../../Zotlabs/Module/Setup.php:568
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."
+#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt."
-#: ../../Zotlabs/Module/Setup.php:569
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Red top folder."
-msgstr "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."
+#: ../../Zotlabs/Module/Manage.php:143
+msgid "Create a new channel"
+msgstr "Nieuw kanaal aanmaken"
-#: ../../Zotlabs/Module/Setup.php:570
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"install/INSTALL.txt\" for instructions."
-msgstr "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."
+#: ../../Zotlabs/Module/Manage.php:143 ../../Zotlabs/Module/Profiles.php:834
+#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Chat.php:253
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:152
+msgid "Create New"
+msgstr "Nieuwe aanmaken"
-#: ../../Zotlabs/Module/Setup.php:573
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php is writable"
+#: ../../Zotlabs/Module/Manage.php:164 ../../Zotlabs/Lib/Apps.php:221
+#: ../../include/nav.php:223
+msgid "Channel Manager"
+msgstr "Kanaalbeheer"
-#: ../../Zotlabs/Module/Setup.php:587
-msgid ""
-"This software uses the Smarty3 template engine to render its web views. "
-"Smarty3 compiles templates to PHP to speed up rendering."
-msgstr "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
+#: ../../Zotlabs/Module/Manage.php:165
+msgid "Current Channel"
+msgstr "Huidig kanaal"
-#: ../../Zotlabs/Module/Setup.php:588
-#, php-format
-msgid ""
-"In order to store these compiled templates, the web server needs to have "
-"write access to the directory %s under the top level web folder."
-msgstr "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."
+#: ../../Zotlabs/Module/Manage.php:167
+msgid "Switch to one of your channels by selecting it."
+msgstr "Activeer een van jouw andere kanalen door er op te klikken."
-#: ../../Zotlabs/Module/Setup.php:589 ../../Zotlabs/Module/Setup.php:610
-msgid ""
-"Please ensure that the user that your web server runs as (e.g. www-data) has"
-" write access to this folder."
-msgstr "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."
+#: ../../Zotlabs/Module/Manage.php:168
+msgid "Default Channel"
+msgstr "Standaardkanaal"
+
+#: ../../Zotlabs/Module/Manage.php:169
+msgid "Make Default"
+msgstr "Als standaard instellen"
-#: ../../Zotlabs/Module/Setup.php:590
+#: ../../Zotlabs/Module/Manage.php:172
#, php-format
-msgid ""
-"Note: as a security measure, you should give the web server write access to "
-"%s only--not the template files (.tpl) that it contains."
-msgstr "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."
+msgid "%d new messages"
+msgstr "%d nieuwe berichten"
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Manage.php:173
#, php-format
-msgid "%s is writable"
-msgstr "%s is writable"
+msgid "%d new introductions"
+msgstr "%d nieuwe connectieverzoeken"
-#: ../../Zotlabs/Module/Setup.php:609
-msgid ""
-"This software uses the store directory to save uploaded files. The web "
-"server needs to have write access to the store directory under the top level"
-" web folder"
-msgstr "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"
+#: ../../Zotlabs/Module/Manage.php:175
+msgid "Delegated Channel"
+msgstr "Uitbesteed kanaal"
-#: ../../Zotlabs/Module/Setup.php:613
-msgid "store is writable"
-msgstr "store is writable"
+#: ../../Zotlabs/Module/Magic.php:71
+msgid "Hub not found."
+msgstr "Hub niet gevonden."
-#: ../../Zotlabs/Module/Setup.php:646
-msgid ""
-"SSL certificate cannot be validated. Fix certificate or disable https access"
-" to this site."
-msgstr "SSL certificate cannot be validated. Fix certificate or disable https access to this hub."
+#: ../../Zotlabs/Module/Mitem.php:52
+msgid "Unable to create element."
+msgstr "Niet in staat om onderdeel aan te maken."
-#: ../../Zotlabs/Module/Setup.php:647
-msgid ""
-"If you have https access to your website or allow connections to TCP port "
-"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
-"NOT use self-signed certificates!"
-msgstr "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"
+#: ../../Zotlabs/Module/Mitem.php:76
+msgid "Unable to update menu element."
+msgstr "Menu-onderdeel kan niet worden geüpdatet."
-#: ../../Zotlabs/Module/Setup.php:648
-msgid ""
-"This restriction is incorporated because public posts from you may for "
-"example contain references to images on your own hub."
-msgstr "This restriction is incorporated because public posts from you may for example contain references to images on your own hub."
+#: ../../Zotlabs/Module/Mitem.php:92
+msgid "Unable to add menu element."
+msgstr "Menu-onderdeel kan niet worden toegevoegd."
-#: ../../Zotlabs/Module/Setup.php:649
-msgid ""
-"If your certificate is not recognized, members of other sites (who may "
-"themselves have valid certificates) will get a warning message on their own "
-"site complaining about security issues."
-msgstr "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues."
+#: ../../Zotlabs/Module/Mitem.php:153 ../../Zotlabs/Module/Mitem.php:230
+msgid "Menu Item Permissions"
+msgstr "Permissies menu-item"
-#: ../../Zotlabs/Module/Setup.php:650
-msgid ""
-"This can cause usability issues elsewhere (not just on your own site) so we "
-"must insist on this requirement."
-msgstr "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement."
+#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
+#: ../../Zotlabs/Module/Settings/Channel.php:510
+msgid "(click to open/close)"
+msgstr "(klik om te openen/sluiten)"
-#: ../../Zotlabs/Module/Setup.php:651
-msgid ""
-"Providers are available that issue free certificates which are browser-"
-"valid."
-msgstr "Providers are available that issue free certificates which are browser-valid."
+#: ../../Zotlabs/Module/Mitem.php:160 ../../Zotlabs/Module/Mitem.php:176
+msgid "Link Name"
+msgstr "Linknaam"
-#: ../../Zotlabs/Module/Setup.php:653
-msgid ""
-"If you are confident that the certificate is valid and signed by a trusted "
-"authority, check to see if you have failed to install an intermediate cert. "
-"These are not normally required by browsers, but are required for server-to-"
-"server communications."
-msgstr "If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."
+#: ../../Zotlabs/Module/Mitem.php:161 ../../Zotlabs/Module/Mitem.php:239
+msgid "Link or Submenu Target"
+msgstr "Linkdoel of submenu-doel"
-#: ../../Zotlabs/Module/Setup.php:655
-msgid "SSL certificate validation"
-msgstr "SSL certificate validation"
+#: ../../Zotlabs/Module/Mitem.php:161
+msgid "Enter URL of the link or select a menu name to create a submenu"
+msgstr "Geef de URL van de link of kies een menunaam om een submenu aan te maken"
-#: ../../Zotlabs/Module/Setup.php:661
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server "
-"configuration.Test: "
-msgstr "Url rewrite in .htaccess is not working. Check your server configuration.Test: "
+#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:240
+msgid "Use magic-auth if available"
+msgstr "Gebruik magic-auth wanneer beschikbaar"
-#: ../../Zotlabs/Module/Setup.php:664
-msgid "Url rewrite is working"
-msgstr "Url rewrite is working"
+#: ../../Zotlabs/Module/Mitem.php:163 ../../Zotlabs/Module/Mitem.php:241
+msgid "Open link in new window"
+msgstr "Open link in nieuw venster"
-#: ../../Zotlabs/Module/Setup.php:678
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Order in list"
+msgstr "Volgorde in lijst"
-#: ../../Zotlabs/Module/Setup.php:702
-#: ../../extend/addon/addon/cdav/cdav.php:41
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:385
-msgid "Errors encountered creating database tables."
-msgstr "Errors encountered creating database tables."
+#: ../../Zotlabs/Module/Mitem.php:164 ../../Zotlabs/Module/Mitem.php:242
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Hogere nummers komen onderaan de lijst terecht"
-#: ../../Zotlabs/Module/Setup.php:743
-msgid "<h1>What next</h1>"
-msgstr "<h1>What next</h1>"
+#: ../../Zotlabs/Module/Mitem.php:165
+msgid "Submit and finish"
+msgstr "Opslaan en afsluiten"
-#: ../../Zotlabs/Module/Setup.php:744
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
+#: ../../Zotlabs/Module/Mitem.php:166
+msgid "Submit and continue"
+msgstr "Opslaan en doorgaan"
-#: ../../Zotlabs/Module/Editpost.php:35
-msgid "Item is not editable"
-msgstr "Item is niet te bewerken"
+#: ../../Zotlabs/Module/Mitem.php:174
+msgid "Menu:"
+msgstr "Menu:"
-#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
-msgid "This site is not a directory server"
-msgstr "Deze hub is geen kanalengidshub (directoryserver)"
+#: ../../Zotlabs/Module/Mitem.php:177
+msgid "Link Target"
+msgstr "Linkdoel"
-#: ../../Zotlabs/Module/New_channel.php:140
-msgid "Create Channel"
-msgstr "Kanaal aanmaken"
+#: ../../Zotlabs/Module/Mitem.php:180
+msgid "Edit menu"
+msgstr "Menu bewerken"
-#: ../../Zotlabs/Module/New_channel.php:141
-msgid ""
-"A channel is your identity on this network. It can represent a person, a "
-"blog, or a forum to name a few. Channels can make connections with other "
-"channels to share information with highly detailed permissions."
-msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
+#: ../../Zotlabs/Module/Mitem.php:183
+msgid "Edit element"
+msgstr "Onderdeel bewerken"
-#: ../../Zotlabs/Module/New_channel.php:142
-msgid ""
-"or <a href=\"import\">import an existing channel</a> from another location."
-msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
+#: ../../Zotlabs/Module/Mitem.php:184
+msgid "Drop element"
+msgstr "Onderdeel verwijderen"
-#: ../../Zotlabs/Module/Notifications.php:40 ../../include/nav.php:194
-msgid "Mark all system notifications seen"
-msgstr "Markeer alle systeemnotificaties als bekeken"
+#: ../../Zotlabs/Module/Mitem.php:185
+msgid "New element"
+msgstr "Nieuw element"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:230
-#: ../../include/conversation.php:941
-msgid "Poke"
-msgstr "Aanstoten"
+#: ../../Zotlabs/Module/Mitem.php:186
+msgid "Edit this menu container"
+msgstr "Deze menu-container bewerken"
-#: ../../Zotlabs/Module/Poke.php:169
-msgid "Poke somebody"
-msgstr "Iemand aanstoten"
+#: ../../Zotlabs/Module/Mitem.php:187
+msgid "Add menu element"
+msgstr "Menu-element toevoegen"
-#: ../../Zotlabs/Module/Poke.php:172
-msgid "Poke/Prod"
-msgstr "Aanstoten/porren"
+#: ../../Zotlabs/Module/Mitem.php:188
+msgid "Delete this menu item"
+msgstr "Dit menu-item verwijderen"
-#: ../../Zotlabs/Module/Poke.php:173
-msgid "Poke, prod or do other things to somebody"
-msgstr "Iemand bijvoorbeeld aanstoten of poren"
+#: ../../Zotlabs/Module/Mitem.php:189
+msgid "Edit this menu item"
+msgstr "Dit menu-item bewerken"
-#: ../../Zotlabs/Module/Poke.php:180
-msgid "Recipient"
-msgstr "Ontvanger"
+#: ../../Zotlabs/Module/Mitem.php:206
+msgid "Menu item not found."
+msgstr "Menu-item niet gevonden."
-#: ../../Zotlabs/Module/Poke.php:181
-msgid "Choose what you wish to do to recipient"
-msgstr "Kies wat je met de ontvanger wil doen"
+#: ../../Zotlabs/Module/Mitem.php:219
+msgid "Menu item deleted."
+msgstr "Menu-item verwijderd."
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
-msgid "Make this post private"
-msgstr "Maak dit bericht privé"
+#: ../../Zotlabs/Module/Mitem.php:221
+msgid "Menu item could not be deleted."
+msgstr "Menu-item kon niet worden verwijderd."
-#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:183
-#: ../../Zotlabs/Module/Profiles.php:240 ../../Zotlabs/Module/Profiles.php:619
-#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profiel niet gevonden."
+#: ../../Zotlabs/Module/Mitem.php:228
+msgid "Edit Menu Element"
+msgstr "Menu-element bewerken"
-#: ../../Zotlabs/Module/Profiles.php:44
-msgid "Profile deleted."
-msgstr "Profiel verwijderd."
+#: ../../Zotlabs/Module/Mitem.php:238
+msgid "Link text"
+msgstr "Linktekst"
-#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:104
-msgid "Profile-"
-msgstr "Profiel-"
+#: ../../Zotlabs/Module/Editpost.php:35
+msgid "Item is not editable"
+msgstr "Item is niet te bewerken"
-#: ../../Zotlabs/Module/Profiles.php:89 ../../Zotlabs/Module/Profiles.php:126
-msgid "New profile created."
-msgstr "Nieuw profiel aangemaakt."
+#: ../../Zotlabs/Module/Ratings.php:70
+msgid "No ratings"
+msgstr "Geen beoordelingen"
-#: ../../Zotlabs/Module/Profiles.php:110
-msgid "Profile unavailable to clone."
-msgstr "Profiel niet beschikbaar om te klonen"
+#: ../../Zotlabs/Module/Ratings.php:98
+msgid "Rating: "
+msgstr "Beoordeling: "
-#: ../../Zotlabs/Module/Profiles.php:145
-msgid "Profile unavailable to export."
-msgstr "Geen profiel beschikbaar om te exporteren"
+#: ../../Zotlabs/Module/Ratings.php:99
+msgid "Website: "
+msgstr "Website: "
-#: ../../Zotlabs/Module/Profiles.php:250
-msgid "Profile Name is required."
-msgstr "Profielnaam is vereist"
+#: ../../Zotlabs/Module/Ratings.php:101
+msgid "Description: "
+msgstr "Omschrijving: "
-#: ../../Zotlabs/Module/Profiles.php:421
-msgid "Marital Status"
-msgstr "Huwelijke status"
+#: ../../Zotlabs/Module/Attach.php:13
+msgid "Item not available."
+msgstr "Item is niet aanwezig."
-#: ../../Zotlabs/Module/Profiles.php:425
-msgid "Romantic Partner"
-msgstr "Romantische partner"
+#: ../../Zotlabs/Module/Cal.php:69
+msgid "Permissions denied."
+msgstr "Permissies niet toegestaan"
-#: ../../Zotlabs/Module/Profiles.php:429 ../../Zotlabs/Module/Profiles.php:730
-msgid "Likes"
-msgstr "Houdt van"
+#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2312
+msgid "Import"
+msgstr "Importeren"
-#: ../../Zotlabs/Module/Profiles.php:433 ../../Zotlabs/Module/Profiles.php:731
-msgid "Dislikes"
-msgstr "Houdt niet van"
+#: ../../Zotlabs/Module/Notify.php:57
+#: ../../Zotlabs/Module/Notifications.php:38
+msgid "No more system notifications."
+msgstr "Geen systeemnotificaties meer."
-#: ../../Zotlabs/Module/Profiles.php:437 ../../Zotlabs/Module/Profiles.php:738
-msgid "Work/Employment"
-msgstr "Werk/arbeid"
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "Systeemnotificaties"
-#: ../../Zotlabs/Module/Profiles.php:440
-msgid "Religion"
-msgstr "Religie"
+#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
+msgid "Authorize application connection"
+msgstr "Geef toestemming voor applicatiekoppeling"
-#: ../../Zotlabs/Module/Profiles.php:444
-msgid "Political Views"
-msgstr "Politieke overtuigingen"
+#: ../../Zotlabs/Module/Api.php:73
+msgid "Return to your app and insert this Security Code:"
+msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
-#: ../../Zotlabs/Module/Profiles.php:448
-#: ../../extend/addon/addon/openid/MysqlProvider.php:74
-msgid "Gender"
-msgstr "Geslacht"
+#: ../../Zotlabs/Module/Api.php:83
+msgid "Please login to continue."
+msgstr "Inloggen om verder te kunnen gaan."
-#: ../../Zotlabs/Module/Profiles.php:452
-msgid "Sexual Preference"
-msgstr "Seksuele voorkeur"
+#: ../../Zotlabs/Module/Api.php:95
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
-#: ../../Zotlabs/Module/Profiles.php:456
-msgid "Homepage"
-msgstr "Homepage"
+#: ../../Zotlabs/Module/Invite.php:29
+msgid "Total invitation limit exceeded."
+msgstr "Limiet voor aantal uitnodigingen overschreden."
-#: ../../Zotlabs/Module/Profiles.php:460
-msgid "Interests"
-msgstr "Interesses"
+#: ../../Zotlabs/Module/Invite.php:53
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Geen geldig e-mailadres."
-#: ../../Zotlabs/Module/Profiles.php:554
-msgid "Profile updated."
-msgstr "Profiel bijgewerkt"
+#: ../../Zotlabs/Module/Invite.php:67
+msgid "Please join us on $Projectname"
+msgstr "Uitnodiging voor $Projectname"
-#: ../../Zotlabs/Module/Profiles.php:638
-msgid "Hide your connections list from viewers of this profile"
-msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
+#: ../../Zotlabs/Module/Invite.php:77
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
-#: ../../Zotlabs/Module/Profiles.php:680
-msgid "Edit Profile Details"
-msgstr "Profiel bewerken"
+#: ../../Zotlabs/Module/Invite.php:82
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s: Aflevering bericht mislukt."
-#: ../../Zotlabs/Module/Profiles.php:682
-msgid "View this profile"
-msgstr "Profiel weergeven"
+#: ../../Zotlabs/Module/Invite.php:86
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d bericht verzonden."
+msgstr[1] "%d berichten verzonden."
-#: ../../Zotlabs/Module/Profiles.php:683 ../../Zotlabs/Module/Profiles.php:765
-#: ../../include/channel.php:983
-msgid "Edit visibility"
-msgstr "Zichtbaarheid bewerken"
+#: ../../Zotlabs/Module/Invite.php:105
+msgid "You have no more invitations available"
+msgstr "Je hebt geen uitnodigingen meer beschikbaar"
-#: ../../Zotlabs/Module/Profiles.php:684
-msgid "Profile Tools"
-msgstr "Hulpmiddelen"
+#: ../../Zotlabs/Module/Invite.php:136
+msgid "Send invitations"
+msgstr "Uitnodigingen verzenden"
-#: ../../Zotlabs/Module/Profiles.php:685
-msgid "Change cover photo"
-msgstr "Omslagfoto wijzigen"
+#: ../../Zotlabs/Module/Invite.php:137
+msgid "Enter email addresses, one per line:"
+msgstr "Voer e-mailadressen in, één per regel:"
-#: ../../Zotlabs/Module/Profiles.php:686 ../../include/channel.php:954
-msgid "Change profile photo"
-msgstr "Profielfoto veranderen"
+#: ../../Zotlabs/Module/Invite.php:139
+msgid "Please join my community on $Projectname."
+msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname op http://hubzilla.org"
-#: ../../Zotlabs/Module/Profiles.php:687
-msgid "Create a new profile using these settings"
-msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
+#: ../../Zotlabs/Module/Invite.php:141
+msgid "You will need to supply this invitation code:"
+msgstr "Je moet deze uitnodigingscode opgeven:"
-#: ../../Zotlabs/Module/Profiles.php:688
-msgid "Clone this profile"
-msgstr "Dit profiel klonen"
+#: ../../Zotlabs/Module/Invite.php:142
+msgid ""
+"1. Register at any $Projectname location (they are all inter-connected)"
+msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
-#: ../../Zotlabs/Module/Profiles.php:689
-msgid "Delete this profile"
-msgstr "Dit profiel verwijderen"
+#: ../../Zotlabs/Module/Invite.php:144
+msgid "2. Enter my $Projectname network address into the site searchbar."
+msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
-#: ../../Zotlabs/Module/Profiles.php:690
-msgid "Add profile things"
-msgstr "Dingen aan je profiel toevoegen"
+#: ../../Zotlabs/Module/Invite.php:145
+msgid "or visit"
+msgstr "of bezoek"
-#: ../../Zotlabs/Module/Profiles.php:691 ../../include/widgets.php:105
-#: ../../include/conversation.php:1567
-msgid "Personal"
-msgstr "Persoonlijk"
+#: ../../Zotlabs/Module/Invite.php:147
+msgid "3. Click [Connect]"
+msgstr "3. Klik op [+ Verbinden]"
-#: ../../Zotlabs/Module/Profiles.php:693
-msgid "Relation"
-msgstr "Relatie"
+#: ../../Zotlabs/Module/Siteinfo.php:20
+msgid "About this site"
+msgstr "Over deze hub"
-#: ../../Zotlabs/Module/Profiles.php:694 ../../include/datetime.php:55
-msgid "Miscellaneous"
-msgstr "Diversen"
+#: ../../Zotlabs/Module/Siteinfo.php:21
+msgid "Site Name"
+msgstr "Hubnaam"
-#: ../../Zotlabs/Module/Profiles.php:696
-msgid "Import profile from file"
-msgstr "Profiel vanuit bestand importeren"
+#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1995
+msgid "Administrator"
+msgstr "Beheerder"
-#: ../../Zotlabs/Module/Profiles.php:697
-msgid "Export profile to file"
-msgstr "Profiel naar bestand exporteren"
+#: ../../Zotlabs/Module/Siteinfo.php:28
+msgid "Software and Project information"
+msgstr "Software- en projectinformatie"
-#: ../../Zotlabs/Module/Profiles.php:698
-msgid "Your gender"
-msgstr "Jouw geslacht"
+#: ../../Zotlabs/Module/Siteinfo.php:29
+msgid "This site is powered by $Projectname"
+msgstr "Dit is een $Projectname-hub"
-#: ../../Zotlabs/Module/Profiles.php:699
-msgid "Marital status"
-msgstr "Burgerlijke staat"
+#: ../../Zotlabs/Module/Siteinfo.php:30
+msgid ""
+"Federated and decentralised networking and identity services provided by Zot"
+msgstr "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot"
-#: ../../Zotlabs/Module/Profiles.php:700
-msgid "Sexual preference"
-msgstr "Seksuele voorkeur"
+#: ../../Zotlabs/Module/Siteinfo.php:32
+#, php-format
+msgid "Version %s"
+msgstr "Versie %s"
-#: ../../Zotlabs/Module/Profiles.php:703
-msgid "Profile name"
-msgstr "Profielnaam"
+#: ../../Zotlabs/Module/Siteinfo.php:33
+msgid "Project homepage"
+msgstr "Projectwebsite"
-#: ../../Zotlabs/Module/Profiles.php:705
-msgid "This is your default profile."
-msgstr "Dit is jouw standaardprofiel"
+#: ../../Zotlabs/Module/Siteinfo.php:34
+msgid "Developer homepage"
+msgstr "Ontwikkelaarswebsite"
-#: ../../Zotlabs/Module/Profiles.php:707
-msgid "Your full name"
-msgstr "Jouw volledige naam"
+#: ../../Zotlabs/Module/New_channel.php:140
+msgid "Create Channel"
+msgstr "Kanaal aanmaken"
-#: ../../Zotlabs/Module/Profiles.php:708
-msgid "Title/Description"
-msgstr "Titel/omschrijving"
+#: ../../Zotlabs/Module/New_channel.php:141
+msgid ""
+"A channel is your identity on this network. It can represent a person, a "
+"blog, or a forum to name a few. Channels can make connections with other "
+"channels to share information with highly detailed permissions."
+msgstr "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen."
-#: ../../Zotlabs/Module/Profiles.php:711
-msgid "Street address"
-msgstr "Straat en huisnummer"
+#: ../../Zotlabs/Module/New_channel.php:142
+msgid ""
+"or <a href=\"import\">import an existing channel</a> from another location."
+msgstr "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie"
-#: ../../Zotlabs/Module/Profiles.php:712
-msgid "Locality/City"
-msgstr "Woonplaats"
+#: ../../Zotlabs/Module/Webpages.php:52
+msgid "Import Webpage Elements"
+msgstr "Webpagina-elementen importeren"
-#: ../../Zotlabs/Module/Profiles.php:713
-msgid "Region/State"
-msgstr "Provincie/gewest/deelstaat"
+#: ../../Zotlabs/Module/Webpages.php:53
+msgid "Import selected"
+msgstr "Importbestand geselecteerd"
-#: ../../Zotlabs/Module/Profiles.php:714
-msgid "Postal/Zip code"
-msgstr "Postcode"
+#: ../../Zotlabs/Module/Webpages.php:76
+msgid "Export Webpage Elements"
+msgstr "Webpagina-elementen exporteren"
-#: ../../Zotlabs/Module/Profiles.php:715
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
-msgstr "Land"
+#: ../../Zotlabs/Module/Webpages.php:77
+msgid "Export selected"
+msgstr "Selectie exporteren"
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Who (if applicable)"
-msgstr "Wie (wanneer van toepassing)"
+#: ../../Zotlabs/Module/Webpages.php:241 ../../Zotlabs/Lib/Apps.php:225
+#: ../../include/conversation.php:1889
+msgid "Webpages"
+msgstr "Webpagina's"
-#: ../../Zotlabs/Module/Profiles.php:720
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
+#: ../../Zotlabs/Module/Webpages.php:252 ../../include/page_widgets.php:44
+msgid "Actions"
+msgstr "Acties"
-#: ../../Zotlabs/Module/Profiles.php:721
-msgid "Since (date)"
-msgstr "Sinds (datum)"
+#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:45
+msgid "Page Link"
+msgstr "Paginalink"
-#: ../../Zotlabs/Module/Profiles.php:724
-msgid "Tell us about yourself"
-msgstr "Vertel ons iets over jezelf"
+#: ../../Zotlabs/Module/Webpages.php:254
+msgid "Page Title"
+msgstr "Paginatitel"
-#: ../../Zotlabs/Module/Profiles.php:725
-#: ../../extend/addon/addon/openid/MysqlProvider.php:68
-msgid "Homepage URL"
-msgstr "URL homepagina"
+#: ../../Zotlabs/Module/Webpages.php:284
+msgid "Invalid file type."
+msgstr "Ongeldig bestandsformaat"
-#: ../../Zotlabs/Module/Profiles.php:726
-msgid "Hometown"
-msgstr "Oorspronkelijk uit"
+#: ../../Zotlabs/Module/Webpages.php:296
+msgid "Error opening zip file"
+msgstr "Fout tijdens openen zipbestand"
-#: ../../Zotlabs/Module/Profiles.php:727
-msgid "Political views"
-msgstr "Politieke overtuigingen"
+#: ../../Zotlabs/Module/Webpages.php:307
+msgid "Invalid folder path."
+msgstr "Ongeldige maplocatie"
-#: ../../Zotlabs/Module/Profiles.php:728
-msgid "Religious views"
-msgstr "Religieuze overtuigingen"
+#: ../../Zotlabs/Module/Webpages.php:334
+msgid "No webpage elements detected."
+msgstr "Geen webpagina-elementen gedecteerd"
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Keywords used in directory listings"
-msgstr "Trefwoorden voor in de kanalengids"
+#: ../../Zotlabs/Module/Webpages.php:409
+msgid "Import complete."
+msgstr "Importeren voltooid."
-#: ../../Zotlabs/Module/Profiles.php:729
-msgid "Example: fishing photography software"
-msgstr "Voorbeeld: muziek, fotografie, software"
+#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:208
+msgid "Mark all system notifications seen"
+msgstr "Markeer alle systeemnotificaties als bekeken"
-#: ../../Zotlabs/Module/Profiles.php:732
-msgid "Musical interests"
-msgstr "Muzikale interesses"
+#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
+#: ../../include/conversation.php:942 ../../include/conversation.php:1109
+msgid "Poke"
+msgstr "Aanstoten"
-#: ../../Zotlabs/Module/Profiles.php:733
-msgid "Books, literature"
-msgstr "Boeken/literatuur"
+#: ../../Zotlabs/Module/Poke.php:169
+msgid "Poke somebody"
+msgstr "Iemand aanstoten"
-#: ../../Zotlabs/Module/Profiles.php:734
-msgid "Television"
-msgstr "Televisie"
+#: ../../Zotlabs/Module/Poke.php:172
+msgid "Poke/Prod"
+msgstr "Aanstoten/porren"
-#: ../../Zotlabs/Module/Profiles.php:735
-msgid "Film/Dance/Culture/Entertainment"
-msgstr "Film/dans/cultuur/entertainment"
+#: ../../Zotlabs/Module/Poke.php:173
+msgid "Poke, prod or do other things to somebody"
+msgstr "Iemand bijvoorbeeld aanstoten of poren"
-#: ../../Zotlabs/Module/Profiles.php:736
-msgid "Hobbies/Interests"
-msgstr "Hobby's/interesses"
+#: ../../Zotlabs/Module/Poke.php:180
+msgid "Recipient"
+msgstr "Ontvanger"
-#: ../../Zotlabs/Module/Profiles.php:737
-msgid "Love/Romance"
-msgstr "Liefde/romantiek"
+#: ../../Zotlabs/Module/Poke.php:181
+msgid "Choose what you wish to do to recipient"
+msgstr "Kies wat je met de ontvanger wil doen"
-#: ../../Zotlabs/Module/Profiles.php:739
-msgid "School/Education"
-msgstr "School/opleiding"
+#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+msgid "Make this post private"
+msgstr "Maak dit bericht privé"
-#: ../../Zotlabs/Module/Profiles.php:740
-msgid "Contact information and social networks"
-msgstr "Contactinformatie en sociale netwerken"
+#: ../../Zotlabs/Module/Profperm.php:34 ../../Zotlabs/Module/Profperm.php:63
+msgid "Invalid profile identifier."
+msgstr "Ongeldige profiel-identificator"
-#: ../../Zotlabs/Module/Profiles.php:741
-msgid "My other channels"
-msgstr "Mijn andere kanalen"
+#: ../../Zotlabs/Module/Profperm.php:111
+msgid "Profile Visibility Editor"
+msgstr "Zichtbaarheid profiel "
-#: ../../Zotlabs/Module/Profiles.php:761 ../../include/channel.php:979
-msgid "Profile Image"
-msgstr "Profielfoto"
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1367
+msgid "Profile"
+msgstr "Profiel"
-#: ../../Zotlabs/Module/Profiles.php:771 ../../include/channel.php:961
-#: ../../include/nav.php:91
-msgid "Edit Profiles"
-msgstr "Bewerk profielen"
+#: ../../Zotlabs/Module/Profperm.php:115
+msgid "Click on a contact to add or remove."
+msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
-#: ../../Zotlabs/Module/Oexchange.php:27
-msgid "Unable to find your hub."
-msgstr "Niet in staat om je hub te vinden"
+#: ../../Zotlabs/Module/Profperm.php:124
+msgid "Visible To"
+msgstr "Zichtbaar voor"
-#: ../../Zotlabs/Module/Oexchange.php:41
-msgid "Post successful."
-msgstr "Verzenden bericht geslaagd."
+#: ../../Zotlabs/Module/Hcard.php:35 ../../Zotlabs/Module/Channel.php:47
+#: ../../Zotlabs/Module/Profile.php:43
+msgid "Posts and comments"
+msgstr "Berichten en reacties"
+
+#: ../../Zotlabs/Module/Hcard.php:42 ../../Zotlabs/Module/Channel.php:54
+#: ../../Zotlabs/Module/Profile.php:50
+msgid "Only posts"
+msgstr "Alleen berichten"
+
+#: ../../Zotlabs/Module/Item.php:184
+msgid "Unable to locate original post."
+msgstr "Niet in staat om de originele locatie van het bericht te vinden. "
+
+#: ../../Zotlabs/Module/Item.php:450
+msgid "Empty post discarded."
+msgstr "Leeg bericht geannuleerd"
+
+#: ../../Zotlabs/Module/Item.php:492
+msgid "Executable content type not permitted to this channel."
+msgstr "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal."
+
+#: ../../Zotlabs/Module/Item.php:842
+msgid "Duplicate post suppressed."
+msgstr "Dubbel bericht tegengehouden."
+
+#: ../../Zotlabs/Module/Item.php:984
+msgid "System error. Post not saved."
+msgstr "Systeemfout. Bericht niet opgeslagen."
+
+#: ../../Zotlabs/Module/Item.php:1114
+msgid "Unable to obtain post information from database."
+msgstr "Niet in staat om informatie over dit bericht uit de database te verkrijgen."
+
+#: ../../Zotlabs/Module/Item.php:1121
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Je hebt jouw limiet van %1$.0f berichten bereikt."
+
+#: ../../Zotlabs/Module/Item.php:1128
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Je hebt jouw limiet van %1$.0f webpagina's bereikt."
#: ../../Zotlabs/Module/Pconfig.php:26 ../../Zotlabs/Module/Pconfig.php:59
msgid "This setting requires special processing and editing has been blocked."
@@ -4951,7 +4788,31 @@ msgid ""
" to correctly use this feature."
msgstr "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. "
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2270
+#: ../../Zotlabs/Module/Search.php:224
+#, php-format
+msgid "Items tagged with: %s"
+msgstr "Items getagd met %s"
+
+#: ../../Zotlabs/Module/Search.php:226
+#, php-format
+msgid "Search results for: %s"
+msgstr "Zoekresultaten voor %s"
+
+#: ../../Zotlabs/Module/Lockview.php:75
+msgid "Remote privacy information not available."
+msgstr "Privacy-informatie op afstand niet beschikbaar."
+
+#: ../../Zotlabs/Module/Lockview.php:96
+msgid "Visible to:"
+msgstr "Zichtbaar voor:"
+
+#: ../../Zotlabs/Module/Lockview.php:117 ../../Zotlabs/Module/Lockview.php:153
+#: ../../Zotlabs/Module/Acl.php:117 ../../include/acl_selectors.php:183
+msgctxt "acl"
+msgid "Profile"
+msgstr "Profiel"
+
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2288
msgid "Blocks"
msgstr "Blokken"
@@ -4959,13 +4820,13 @@ msgstr "Blokken"
msgid "Block Title"
msgstr "Bloktitel"
-#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2272
+#: ../../Zotlabs/Module/Layouts.php:183 ../../include/text.php:2290
msgid "Layouts"
msgstr "Lay-outs"
-#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:227
-#: ../../include/nav.php:162 ../../include/help.php:53
-#: ../../include/help.php:59
+#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/help.php:55 ../../include/help.php:61
+#: ../../include/nav.php:174 ../../include/nav.php:288
msgid "Help"
msgstr "Hulp"
@@ -4998,6 +4859,27 @@ msgstr "Beoordeling (deze informatie is openbaar)"
msgid "Optionally explain your rating (this information is public)"
msgstr "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)"
+#: ../../Zotlabs/Module/Profile_photo.php:194
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:298
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
+
+#: ../../Zotlabs/Module/Profile_photo.php:420
+msgid "Use Photo for Profile"
+msgstr "Als profielfoto gebruiken"
+
+#: ../../Zotlabs/Module/Profile_photo.php:420
+msgid "Upload Profile Photo"
+msgstr "Profielfoto uploaden"
+
+#: ../../Zotlabs/Module/Profile_photo.php:421
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:182
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+msgid "Use"
+msgstr "Gebruiken"
+
#: ../../Zotlabs/Module/Like.php:19
msgid "Like/Dislike"
msgstr "Leuk/niet leuk"
@@ -5037,22 +4919,16 @@ msgstr "Vorige actie omgedraaid"
#: ../../Zotlabs/Module/Tagger.php:47
#: ../../extend/addon/addon/diaspora/inbound.php:1794
#: ../../extend/addon/addon/redphotos/redphotohelper.php:74
-#: ../../include/text.php:1940 ../../include/conversation.php:120
+#: ../../include/conversation.php:120 ../../include/text.php:1958
msgid "photo"
msgstr "foto"
#: ../../Zotlabs/Module/Like.php:370 ../../Zotlabs/Module/Subthread.php:87
#: ../../extend/addon/addon/diaspora/inbound.php:1794
-#: ../../include/text.php:1946 ../../include/conversation.php:148
+#: ../../include/conversation.php:148 ../../include/text.php:1964
msgid "status"
msgstr "bericht"
-#: ../../Zotlabs/Module/Like.php:372 ../../Zotlabs/Module/Tagger.php:51
-#: ../../Zotlabs/Module/Events.php:256 ../../include/text.php:1943
-#: ../../include/event.php:961 ../../include/conversation.php:123
-msgid "event"
-msgstr "gebeurtenis"
-
#: ../../Zotlabs/Module/Like.php:419
#: ../../extend/addon/addon/diaspora/inbound.php:1823
#: ../../include/conversation.php:164
@@ -5103,37 +4979,6 @@ msgstr "Actie voltooid"
msgid "Thank you."
msgstr "Bedankt"
-#: ../../Zotlabs/Module/Profile_photo.php:186
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:293
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven."
-
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Use Photo for Profile"
-msgstr "Als profielfoto gebruiken"
-
-#: ../../Zotlabs/Module/Profile_photo.php:409
-msgid "Upload Profile Photo"
-msgstr "Profielfoto uploaden"
-
-#: ../../Zotlabs/Module/Profile_photo.php:410
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:181
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:193
-msgid "Use"
-msgstr "Gebruiken"
-
-#: ../../Zotlabs/Module/Search.php:223
-#, php-format
-msgid "Items tagged with: %s"
-msgstr "Items getagd met %s"
-
-#: ../../Zotlabs/Module/Search.php:225
-#, php-format
-msgid "Search results for: %s"
-msgstr "Zoekresultaten voor %s"
-
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
msgstr "Geen kanaal."
@@ -5146,81 +4991,29 @@ msgstr "Veel voorkomende connecties"
msgid "No connections in common."
msgstr "Geen gemeenschappelijke connecties."
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Geef toestemming voor applicatiekoppeling"
-
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Ga terug naar je app en voeg deze beveiligingscode in:"
-
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Inloggen om verder te kunnen gaan."
-
-#: ../../Zotlabs/Module/Api.php:95
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?"
-
-#: ../../Zotlabs/Module/Ping.php:254
-msgid "sent you a private message"
-msgstr "stuurde jou een privébericht"
-
-#: ../../Zotlabs/Module/Ping.php:302
-msgid "added your channel"
-msgstr "voegde jouw kanaal toe"
-
-#: ../../Zotlabs/Module/Ping.php:312
-msgid "g A l F d"
-msgstr "G:i, l d F"
-
-#: ../../Zotlabs/Module/Ping.php:330
-msgid "[today]"
-msgstr "[vandaag]"
-
-#: ../../Zotlabs/Module/Ping.php:339
-msgid "posted an event"
-msgstr "plaatste een gebeurtenis"
-
-#: ../../Zotlabs/Module/Siteinfo.php:20
-msgid "About this site"
-msgstr "Over deze hub"
-
-#: ../../Zotlabs/Module/Siteinfo.php:21
-msgid "Site Name"
-msgstr "Hubnaam"
-
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:1962
-msgid "Administrator"
-msgstr "Beheerder"
-
-#: ../../Zotlabs/Module/Siteinfo.php:28
-msgid "Software and Project information"
-msgstr "Software- en projectinformatie"
-
-#: ../../Zotlabs/Module/Siteinfo.php:29
-msgid "This site is powered by $Projectname"
-msgstr "Dit is een $Projectname-hub"
+#: ../../Zotlabs/Module/Chanview.php:134
+msgid "toggle full screen mode"
+msgstr "Volledig scherm"
-#: ../../Zotlabs/Module/Siteinfo.php:30
-msgid ""
-"Federated and decentralised networking and identity services provided by Zot"
-msgstr "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot"
+#: ../../Zotlabs/Module/Subthread.php:118
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s volgt het %3$s van %2$s"
-#: ../../Zotlabs/Module/Siteinfo.php:32
+#: ../../Zotlabs/Module/Subthread.php:120
#, php-format
-msgid "Version %s"
-msgstr "Versie %s"
+msgid "%1$s stopped following %2$s's %3$s"
+msgstr "%1$s volgt het %3$s van %2$s niet meer"
-#: ../../Zotlabs/Module/Siteinfo.php:33
-msgid "Project homepage"
-msgstr "Projectwebsite"
+#: ../../Zotlabs/Module/Channel.php:32 ../../Zotlabs/Module/Chat.php:25
+#: ../../extend/addon/addon/chess/chess.php:403
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:26
+msgid "You must be logged in to see this page."
+msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
-#: ../../Zotlabs/Module/Siteinfo.php:34
-msgid "Developer homepage"
-msgstr "Ontwikkelaarswebsite"
+#: ../../Zotlabs/Module/Channel.php:112
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Onvoldoende permissies. Doorgestuurd naar profielpagina."
#: ../../Zotlabs/Module/Lostpass.php:19
msgid "No valid account found."
@@ -5246,7 +5039,7 @@ msgid ""
"Password reset failed."
msgstr "Het verzoek kon niet worden geverifieerd. (Mogelijk heb je al eerder een verzoek ingediend.) Opnieuw instellen van wachtwoord is mislukt."
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1728
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1757
msgid "Password Reset"
msgstr "Wachtwoord vergeten?"
@@ -5311,25 +5104,23 @@ msgstr "URL van bladwijzer"
msgid "Or enter new bookmark folder name"
msgstr "Of geef de naam op van een nieuwe bladwijzermap"
-#: ../../Zotlabs/Module/Dirsearch.php:33
-msgid "This directory server requires an access token"
-msgstr "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig"
-
-#: ../../Zotlabs/Module/Rmagic.php:35
-msgid "Authentication failed."
-msgstr "Authenticatie mislukt."
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanaal toegevoegd."
-#: ../../Zotlabs/Module/Rmagic.php:75
-msgid "Remote Authentication"
-msgstr "Authenticatie op afstand"
+#: ../../Zotlabs/Module/Mood.php:67 ../../include/conversation.php:260
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s is %2$s"
-#: ../../Zotlabs/Module/Rmagic.php:76
-msgid "Enter your channel address (e.g. channel@example.com)"
-msgstr "Vul jouw kanaaladres in (bijv. channel@example.com)"
+#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+msgid "Mood"
+msgstr "Stemming"
-#: ../../Zotlabs/Module/Rmagic.php:77
-msgid "Authenticate"
-msgstr "Authenticeren"
+#: ../../Zotlabs/Module/Mood.php:136
+msgid "Set your current mood and tell your friends"
+msgstr "Noteer je huidige stemming en toon het aan je connecties"
#: ../../Zotlabs/Module/Regmod.php:15
msgid "Please login."
@@ -5387,7 +5178,7 @@ msgstr "Account verwijderen"
msgid "Layout updated."
msgstr "Lay-out bijgewerkt."
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:218
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:216
msgid "Feature disabled."
msgstr "Functie uitgeschakeld."
@@ -5407,230 +5198,146 @@ msgstr "Modulenaam:"
msgid "Layout Help"
msgstr "Lay-out-hulp"
-#: ../../Zotlabs/Module/Uexport.php:55 ../../Zotlabs/Module/Uexport.php:56
-msgid "Export Channel"
-msgstr "Kanaal exporteren"
-
-#: ../../Zotlabs/Module/Uexport.php:57
-msgid ""
-"Export your basic channel information to a file. This acts as a backup of "
-"your connections, permissions, profile and basic data, which can be used to "
-"import your data to a new server hub, but does not contain your content."
-msgstr "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal."
-
-#: ../../Zotlabs/Module/Uexport.php:58
-msgid "Export Content"
-msgstr "Inhoud exporteren"
-
-#: ../../Zotlabs/Module/Uexport.php:59
-msgid ""
-"Export your channel information and recent content to a JSON backup that can"
-" be restored or imported to another server hub. This backs up all of your "
-"connections, permissions, profile data and several months of posts. This "
-"file may be VERY large. Please be patient - it may take several minutes for"
-" this download to begin."
-msgstr "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint."
-
-#: ../../Zotlabs/Module/Uexport.php:60
-msgid "Export your posts from a given year."
-msgstr "Exporteer jouw berichten uit een bepaald jaar."
-
-#: ../../Zotlabs/Module/Uexport.php:62
-msgid ""
-"You may also export your posts and conversations for a particular year or "
-"month. Adjust the date in your browser location bar to select other dates. "
-"If the export fails (possibly due to memory exhaustion on your server hub), "
-"please try again selecting a more limited date range."
-msgstr "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak."
-
-#: ../../Zotlabs/Module/Uexport.php:63
+#: ../../Zotlabs/Module/Directory.php:246
#, php-format
-msgid ""
-"To select all posts for a given year, such as this year, visit <a "
-"href=\"%1$s\">%2$s</a>"
-msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. "
+msgid "%d rating"
+msgid_plural "%d ratings"
+msgstr[0] "%d beoordeling"
+msgstr[1] "%d beoordelingen"
-#: ../../Zotlabs/Module/Uexport.php:64
-#, php-format
-msgid ""
-"To select all posts for a given month, such as January of this year, visit "
-"<a href=\"%1$s\">%2$s</a>"
-msgstr "Bezoek <a href=\"%1$s\">%2$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren."
+#: ../../Zotlabs/Module/Directory.php:257
+msgid "Gender: "
+msgstr "Geslacht:"
-#: ../../Zotlabs/Module/Uexport.php:65
-#, php-format
-msgid ""
-"These content files may be imported or restored by visiting <a "
-"href=\"%1$s\">%2$s</a> on any site containing your channel. For best results"
-" please import or restore these in date order (oldest first)."
-msgstr "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1$s\">%2$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen."
+#: ../../Zotlabs/Module/Directory.php:259
+msgid "Status: "
+msgstr "Status: "
-#: ../../Zotlabs/Module/Cal.php:69
-msgid "Permissions denied."
-msgstr "Permissies niet toegestaan"
+#: ../../Zotlabs/Module/Directory.php:261
+msgid "Homepage: "
+msgstr "Homepage: "
-#: ../../Zotlabs/Module/Cal.php:263 ../../Zotlabs/Module/Events.php:596
-msgid "l, F j"
-msgstr "l j F"
+#: ../../Zotlabs/Module/Directory.php:310 ../../include/channel.php:1298
+msgid "Age:"
+msgstr "Leeftijd:"
-#: ../../Zotlabs/Module/Cal.php:312 ../../Zotlabs/Module/Events.php:651
-#: ../../include/text.php:1748
-msgid "Link to Source"
-msgstr "Originele locatie"
+#: ../../Zotlabs/Module/Directory.php:315 ../../include/event.php:52
+#: ../../include/event.php:84 ../../include/markdown.php:562
+#: ../../include/channel.php:1134
+msgid "Location:"
+msgstr "Plaats:"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
-msgid "Edit Event"
-msgstr "Gebeurtenis bewerken"
+#: ../../Zotlabs/Module/Directory.php:321
+msgid "Description:"
+msgstr "Omschrijving:"
-#: ../../Zotlabs/Module/Cal.php:335 ../../Zotlabs/Module/Events.php:679
-msgid "Create Event"
-msgstr "Gebeurtenis aanmaken"
+#: ../../Zotlabs/Module/Directory.php:326 ../../include/channel.php:1314
+msgid "Hometown:"
+msgstr "Oorspronkelijk uit:"
-#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Events.php:682
-msgid "Export"
-msgstr "Exporteren"
+#: ../../Zotlabs/Module/Directory.php:328 ../../include/channel.php:1322
+msgid "About:"
+msgstr "Over:"
-#: ../../Zotlabs/Module/Cal.php:341 ../../include/text.php:2294
-msgid "Import"
-msgstr "Importeren"
+#: ../../Zotlabs/Module/Directory.php:329 ../../Zotlabs/Module/Suggest.php:56
+#: ../../include/widgets.php:134 ../../include/widgets.php:171
+#: ../../include/connections.php:110 ../../include/conversation.php:938
+#: ../../include/conversation.php:1069 ../../include/channel.php:1119
+msgid "Connect"
+msgstr "Verbinden"
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Events.php:691
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Vandaag"
+#: ../../Zotlabs/Module/Directory.php:330
+msgid "Public Forum:"
+msgstr "Openbaar forum:"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "# accounts"
+#: ../../Zotlabs/Module/Directory.php:333
+msgid "Keywords: "
+msgstr "Trefwoorden: "
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "# geblokkeerde accounts"
+#: ../../Zotlabs/Module/Directory.php:336
+msgid "Don't suggest"
+msgstr "Niet voorstellen"
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "# verlopen accounts"
+#: ../../Zotlabs/Module/Directory.php:338
+msgid "Common connections:"
+msgstr "Gemeenschappelijke connecties:"
-#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "# accounts die nog moeten verlopen"
+#: ../../Zotlabs/Module/Directory.php:387
+msgid "Global Directory"
+msgstr "Volledige kanalengids"
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "# Kanalen"
+#: ../../Zotlabs/Module/Directory.php:387
+msgid "Local Directory"
+msgstr "Lokale kanalengids"
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "# primair"
+#: ../../Zotlabs/Module/Directory.php:393
+msgid "Finding:"
+msgstr "Gezocht naar:"
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "# klonen"
+#: ../../Zotlabs/Module/Directory.php:396 ../../Zotlabs/Module/Suggest.php:64
+#: ../../include/contact_widgets.php:24
+msgid "Channel Suggestions"
+msgstr "Voorgestelde kanalen"
-#: ../../Zotlabs/Module/Admin.php:116
-msgid "Message queues"
-msgstr "Berichtenwachtrij"
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "next page"
+msgstr "volgende pagina"
-#: ../../Zotlabs/Module/Admin.php:133
-msgid "Your software should be updated"
-msgstr "Jouw software moet worden bijgewerkt "
+#: ../../Zotlabs/Module/Directory.php:398
+msgid "previous page"
+msgstr "vorige pagina"
-#: ../../Zotlabs/Module/Admin.php:138
-msgid "Summary"
-msgstr "Samenvatting"
+#: ../../Zotlabs/Module/Directory.php:399
+msgid "Sort options"
+msgstr "Sorteeropties"
-#: ../../Zotlabs/Module/Admin.php:141
-msgid "Registered accounts"
-msgstr "Geregistreerde accounts"
+#: ../../Zotlabs/Module/Directory.php:400
+msgid "Alphabetic"
+msgstr "Alfabetisch"
-#: ../../Zotlabs/Module/Admin.php:142
-msgid "Pending registrations"
-msgstr "Accounts die op goedkeuring wachten"
+#: ../../Zotlabs/Module/Directory.php:401
+msgid "Reverse Alphabetic"
+msgstr "Omgekeerd alfabetisch"
-#: ../../Zotlabs/Module/Admin.php:143
-msgid "Registered channels"
-msgstr "Geregistreerde kanalen"
+#: ../../Zotlabs/Module/Directory.php:402
+msgid "Newest to Oldest"
+msgstr "Nieuw naar oud"
-#: ../../Zotlabs/Module/Admin.php:144
-msgid "Active plugins"
-msgstr "Ingeschakelde plugins"
+#: ../../Zotlabs/Module/Directory.php:403
+msgid "Oldest to Newest"
+msgstr "Oud naar nieuw"
-#: ../../Zotlabs/Module/Admin.php:145
-msgid "Version"
-msgstr "Versie"
+#: ../../Zotlabs/Module/Directory.php:420
+msgid "No entries (some entries may be hidden)."
+msgstr "Niets gevonden (sommige kanalen kunnen verborgen zijn)."
-#: ../../Zotlabs/Module/Admin.php:146
-msgid "Repository version (master)"
-msgstr "Versie repository (master)"
+#: ../../Zotlabs/Module/Profile.php:91
+msgid "vcard"
+msgstr "vcard"
-#: ../../Zotlabs/Module/Admin.php:147
-msgid "Repository version (dev)"
-msgstr "Versie repository (dev)"
+#: ../../Zotlabs/Module/Oexchange.php:27
+msgid "Unable to find your hub."
+msgstr "Niet in staat om je hub te vinden"
-#: ../../Zotlabs/Module/Lockview.php:75
-msgid "Remote privacy information not available."
-msgstr "Privacy-informatie op afstand niet beschikbaar."
+#: ../../Zotlabs/Module/Oexchange.php:41
+msgid "Post successful."
+msgstr "Verzenden bericht geslaagd."
-#: ../../Zotlabs/Module/Lockview.php:96
-msgid "Visible to:"
-msgstr "Zichtbaar voor:"
+#: ../../Zotlabs/Module/Viewsrc.php:46
+msgid "Source of Item"
+msgstr "Bron van item"
#: ../../Zotlabs/Module/Service_limits.php:23
msgid "No service class restrictions found."
msgstr "Geen abonnementsbeperkingen gevonden."
-#: ../../Zotlabs/Module/Webpages.php:52
-msgid "Import Webpage Elements"
-msgstr "Webpagina-elementen importeren"
-
-#: ../../Zotlabs/Module/Webpages.php:53
-msgid "Import selected"
-msgstr "Importbestand geselecteerd"
-
-#: ../../Zotlabs/Module/Webpages.php:76
-msgid "Export Webpage Elements"
-msgstr "Webpagina-elementen exporteren"
-
-#: ../../Zotlabs/Module/Webpages.php:77
-msgid "Export selected"
-msgstr "Selectie exporteren"
-
-#: ../../Zotlabs/Module/Webpages.php:237 ../../Zotlabs/Lib/Apps.php:220
-#: ../../include/nav.php:109 ../../include/conversation.php:1727
-msgid "Webpages"
-msgstr "Webpagina's"
-
-#: ../../Zotlabs/Module/Webpages.php:248 ../../include/page_widgets.php:44
-msgid "Actions"
-msgstr "Acties"
-
-#: ../../Zotlabs/Module/Webpages.php:249 ../../include/page_widgets.php:45
-msgid "Page Link"
-msgstr "Paginalink"
-
-#: ../../Zotlabs/Module/Webpages.php:250
-msgid "Page Title"
-msgstr "Paginatitel"
-
-#: ../../Zotlabs/Module/Webpages.php:280
-msgid "Invalid file type."
-msgstr "Ongeldig bestandsformaat"
-
-#: ../../Zotlabs/Module/Webpages.php:292
-msgid "Error opening zip file"
-msgstr "Fout tijdens openen zipbestand"
-
-#: ../../Zotlabs/Module/Webpages.php:303
-msgid "Invalid folder path."
-msgstr "Ongeldige maplocatie"
-
-#: ../../Zotlabs/Module/Webpages.php:330
-msgid "No webpage elements detected."
-msgstr "Geen webpagina-elementen gedecteerd"
+#: ../../Zotlabs/Module/Acl.php:344
+msgid "network"
+msgstr "netwerk"
-#: ../../Zotlabs/Module/Webpages.php:405
-msgid "Import complete."
-msgstr "Importeren voltooid."
+#: ../../Zotlabs/Module/Acl.php:354
+msgid "RSS"
+msgstr "RSS"
#: ../../Zotlabs/Module/Removeme.php:35
msgid ""
@@ -5657,7 +5364,7 @@ msgid ""
msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het $Projectname-netwerk verwijderd"
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:575
msgid "Remove Channel"
msgstr "Kanaal verwijderen"
@@ -5677,127 +5384,19 @@ msgstr "Verwijder alle bestanden"
msgid "Remove this file"
msgstr "Verwijder dit bestand"
-#: ../../Zotlabs/Module/Wiki.php:34
-msgid "Not found"
-msgstr "Niet gevonden"
-
-#: ../../Zotlabs/Module/Wiki.php:55
-msgid "Invalid channel"
-msgstr "Onbekend kanaal"
-
-#: ../../Zotlabs/Module/Wiki.php:100
-msgid "Error retrieving wiki"
-msgstr "Fout tijdens ophalen wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:107
-msgid "Error creating zip file export folder"
-msgstr "Fout tijdens aanmaken exportmap zipbestand"
-
-#: ../../Zotlabs/Module/Wiki.php:125
-msgid "Error downloading wiki: "
-msgstr "Fout tijdens downloaden wiki: "
-
-#: ../../Zotlabs/Module/Wiki.php:139 ../../include/nav.php:111
-#: ../../include/conversation.php:1737
-msgid "Wikis"
-msgstr "Wiki's"
-
-#: ../../Zotlabs/Module/Wiki.php:145
-msgid "Download"
-msgstr "Download"
-
-#: ../../Zotlabs/Module/Wiki.php:149
-msgid "Wiki name"
-msgstr "Naam wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:150
-msgid "Content type"
-msgstr "Opmaaktype"
-
-#: ../../Zotlabs/Module/Wiki.php:159
-msgid "Create a status post for this wiki"
-msgstr "Plaats een bericht over deze wiki"
-
-#: ../../Zotlabs/Module/Wiki.php:178
-msgid "Wiki not found"
-msgstr "Wiki is niet gevonden"
-
-#: ../../Zotlabs/Module/Wiki.php:203
-msgid "Rename page"
-msgstr "Pagina hernoemen"
-
-#: ../../Zotlabs/Module/Wiki.php:207
-msgid "Error retrieving page content"
-msgstr "Fout tijdens ophalen inhoud pagina"
-
-#: ../../Zotlabs/Module/Wiki.php:236
-msgid "Revision Comparison"
-msgstr "Revisies vergelijken"
-
-#: ../../Zotlabs/Module/Wiki.php:237
-msgid "Revert"
-msgstr "Ongedaan maken"
-
-#: ../../Zotlabs/Module/Wiki.php:246
-msgid "Source"
-msgstr "Bron"
-
-#: ../../Zotlabs/Module/Wiki.php:254
-msgid "New page name"
-msgstr "Nieuwe paginanaam"
-
-#: ../../Zotlabs/Module/Wiki.php:259 ../../include/conversation.php:1151
-msgid "Embed image from photo albums"
-msgstr "Afbeelding uit een fotoalbum invoegen"
-
-#: ../../Zotlabs/Module/Wiki.php:260 ../../include/conversation.php:1245
-msgid "Embed an image from your albums"
-msgstr "Afbeelding uit jouw albums invoegen"
-
-#: ../../Zotlabs/Module/Wiki.php:262 ../../include/conversation.php:1247
-#: ../../include/conversation.php:1294
-msgid "OK"
-msgstr "OK"
-
-#: ../../Zotlabs/Module/Wiki.php:263 ../../include/conversation.php:1187
-msgid "Choose images to embed"
-msgstr "Kies afbeeldingen om in te voegen"
-
-#: ../../Zotlabs/Module/Wiki.php:264 ../../include/conversation.php:1188
-msgid "Choose an album"
-msgstr "Kies een album"
-
-#: ../../Zotlabs/Module/Wiki.php:265
-msgid "Choose a different album"
-msgstr "Kies een ander album"
-
-#: ../../Zotlabs/Module/Wiki.php:266 ../../include/conversation.php:1190
-msgid "Error getting album list"
-msgstr "Fout tijdens ophalen albumlijst"
-
-#: ../../Zotlabs/Module/Wiki.php:267 ../../include/conversation.php:1191
-msgid "Error getting photo link"
-msgstr "Fout tijdens ophalen fotolink"
-
-#: ../../Zotlabs/Module/Wiki.php:268 ../../include/conversation.php:1192
-msgid "Error getting album"
-msgstr "Fout tijdens ophalen album"
-
-#: ../../Zotlabs/Module/Wiki.php:332
-msgid "Error creating wiki. Invalid name."
-msgstr "Fout tijdens aanmaken wiki. Ongeldige naam."
-
-#: ../../Zotlabs/Module/Wiki.php:343
-msgid "Wiki created, but error creating Home page."
-msgstr "Wiki aangemaakt, maar fout tijdens aanmaken homepagina."
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+msgid "post"
+msgstr "bericht"
-#: ../../Zotlabs/Module/Wiki.php:348
-msgid "Error creating wiki"
-msgstr "Fout tijdens aanmaken wiki."
+#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:150
+#: ../../include/text.php:1966
+msgid "comment"
+msgstr "reactie"
-#: ../../Zotlabs/Module/Wiki.php:394
-msgid "New page created"
-msgstr "Nieuwe pagina aangemaakt"
+#: ../../Zotlabs/Module/Tagger.php:95
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s heeft het %3$s van %2$s getagd met %4$s"
#: ../../Zotlabs/Module/Sources.php:37
msgid "Failed to create source. No channel selected."
@@ -5815,8 +5414,8 @@ msgstr "Bron aangemaakt."
msgid "*"
msgstr "*"
-#: ../../Zotlabs/Module/Sources.php:96 ../../include/features.php:195
-#: ../../include/widgets.php:672
+#: ../../Zotlabs/Module/Sources.php:96 ../../include/widgets.php:677
+#: ../../include/features.php:213
msgid "Channel Sources"
msgstr "Kanaalbronnen"
@@ -5855,7 +5454,7 @@ msgstr "De volgende categorieën aan berichten toevoegen die uit deze bron zijn
#: ../../Zotlabs/Module/Sources.php:112 ../../Zotlabs/Module/Sources.php:147
#: ../../Zotlabs/Module/Settings/Oauth.php:93
msgid "Optional"
-msgstr "Optioneel"
+msgstr "Niet verplicht"
#: ../../Zotlabs/Module/Sources.php:133 ../../Zotlabs/Module/Sources.php:161
msgid "Source not found."
@@ -5877,39 +5476,293 @@ msgstr "Bron verwijderd"
msgid "Unable to remove source."
msgstr "Verwijderen bron mislukt."
-#: ../../Zotlabs/Module/Subthread.php:118
-#, php-format
-msgid "%1$s is following %2$s's %3$s"
-msgstr "%1$s volgt het %3$s van %2$s"
-
-#: ../../Zotlabs/Module/Subthread.php:120
-#, php-format
-msgid "%1$s stopped following %2$s's %3$s"
-msgstr "%1$s volgt het %3$s van %2$s niet meer"
-
#: ../../Zotlabs/Module/Suggest.php:39
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer."
-#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:149
+#: ../../Zotlabs/Module/Suggest.php:58 ../../include/widgets.php:136
msgid "Ignore/Hide"
msgstr "Negeren/Verbergen"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
-msgid "post"
-msgstr "bericht"
+#: ../../Zotlabs/Module/Profiles.php:24 ../../Zotlabs/Module/Profiles.php:184
+#: ../../Zotlabs/Module/Profiles.php:241 ../../Zotlabs/Module/Profiles.php:659
+#: ../../extend/addon/addon/friendica/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profiel niet gevonden."
-#: ../../Zotlabs/Module/Tagger.php:57 ../../include/text.php:1948
-#: ../../include/conversation.php:150
-msgid "comment"
-msgstr "reactie"
+#: ../../Zotlabs/Module/Profiles.php:44
+msgid "Profile deleted."
+msgstr "Profiel verwijderd."
-#: ../../Zotlabs/Module/Tagger.php:100
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s heeft het %3$s van %2$s getagd met %4$s"
+#: ../../Zotlabs/Module/Profiles.php:68 ../../Zotlabs/Module/Profiles.php:105
+msgid "Profile-"
+msgstr "Profiel-"
+
+#: ../../Zotlabs/Module/Profiles.php:90 ../../Zotlabs/Module/Profiles.php:127
+msgid "New profile created."
+msgstr "Nieuw profiel aangemaakt."
+
+#: ../../Zotlabs/Module/Profiles.php:111
+msgid "Profile unavailable to clone."
+msgstr "Profiel niet beschikbaar om te klonen"
+
+#: ../../Zotlabs/Module/Profiles.php:146
+msgid "Profile unavailable to export."
+msgstr "Geen profiel beschikbaar om te exporteren"
+
+#: ../../Zotlabs/Module/Profiles.php:252
+msgid "Profile Name is required."
+msgstr "Profielnaam is vereist"
+
+#: ../../Zotlabs/Module/Profiles.php:459
+msgid "Marital Status"
+msgstr "Huwelijke status"
+
+#: ../../Zotlabs/Module/Profiles.php:463
+msgid "Romantic Partner"
+msgstr "Romantische partner"
+
+#: ../../Zotlabs/Module/Profiles.php:467 ../../Zotlabs/Module/Profiles.php:775
+msgid "Likes"
+msgstr "Houdt van"
+
+#: ../../Zotlabs/Module/Profiles.php:471 ../../Zotlabs/Module/Profiles.php:776
+msgid "Dislikes"
+msgstr "Houdt niet van"
+
+#: ../../Zotlabs/Module/Profiles.php:475 ../../Zotlabs/Module/Profiles.php:783
+msgid "Work/Employment"
+msgstr "Werk/arbeid"
+
+#: ../../Zotlabs/Module/Profiles.php:478
+msgid "Religion"
+msgstr "Religie"
+
+#: ../../Zotlabs/Module/Profiles.php:482
+msgid "Political Views"
+msgstr "Politieke overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:486
+#: ../../extend/addon/addon/openid/MysqlProvider.php:74
+msgid "Gender"
+msgstr "Geslacht"
+
+#: ../../Zotlabs/Module/Profiles.php:490
+msgid "Sexual Preference"
+msgstr "Seksuele voorkeur"
+
+#: ../../Zotlabs/Module/Profiles.php:494
+msgid "Homepage"
+msgstr "Homepage"
+
+#: ../../Zotlabs/Module/Profiles.php:498
+msgid "Interests"
+msgstr "Interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:594
+msgid "Profile updated."
+msgstr "Profiel bijgewerkt"
+
+#: ../../Zotlabs/Module/Profiles.php:678
+msgid "Hide your connections list from viewers of this profile"
+msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
+
+#: ../../Zotlabs/Module/Profiles.php:725
+msgid "Edit Profile Details"
+msgstr "Profiel bewerken"
+
+#: ../../Zotlabs/Module/Profiles.php:727
+msgid "View this profile"
+msgstr "Profiel weergeven"
+
+#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
+#: ../../include/channel.php:1066
+msgid "Edit visibility"
+msgstr "Zichtbaarheid bewerken"
+
+#: ../../Zotlabs/Module/Profiles.php:729
+msgid "Profile Tools"
+msgstr "Hulpmiddelen"
+
+#: ../../Zotlabs/Module/Profiles.php:730
+msgid "Change cover photo"
+msgstr "Omslagfoto wijzigen"
+
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
+msgid "Change profile photo"
+msgstr "Profielfoto veranderen"
+
+#: ../../Zotlabs/Module/Profiles.php:732
+msgid "Create a new profile using these settings"
+msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
+
+#: ../../Zotlabs/Module/Profiles.php:733
+msgid "Clone this profile"
+msgstr "Dit profiel klonen"
+
+#: ../../Zotlabs/Module/Profiles.php:734
+msgid "Delete this profile"
+msgstr "Dit profiel verwijderen"
+
+#: ../../Zotlabs/Module/Profiles.php:735
+msgid "Add profile things"
+msgstr "Dingen aan je profiel toevoegen"
+
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1715
+msgid "Personal"
+msgstr "Persoonlijk"
+
+#: ../../Zotlabs/Module/Profiles.php:738
+msgid "Relation"
+msgstr "Relatie"
+
+#: ../../Zotlabs/Module/Profiles.php:739 ../../include/datetime.php:55
+msgid "Miscellaneous"
+msgstr "Diversen"
+
+#: ../../Zotlabs/Module/Profiles.php:741
+msgid "Import profile from file"
+msgstr "Profiel vanuit bestand importeren"
+
+#: ../../Zotlabs/Module/Profiles.php:742
+msgid "Export profile to file"
+msgstr "Profiel naar bestand exporteren"
+
+#: ../../Zotlabs/Module/Profiles.php:743
+msgid "Your gender"
+msgstr "Jouw geslacht"
+
+#: ../../Zotlabs/Module/Profiles.php:744
+msgid "Marital status"
+msgstr "Burgerlijke staat"
+
+#: ../../Zotlabs/Module/Profiles.php:745
+msgid "Sexual preference"
+msgstr "Seksuele voorkeur"
+
+#: ../../Zotlabs/Module/Profiles.php:748
+msgid "Profile name"
+msgstr "Profielnaam"
+
+#: ../../Zotlabs/Module/Profiles.php:750
+msgid "This is your default profile."
+msgstr "Dit is jouw standaardprofiel"
+
+#: ../../Zotlabs/Module/Profiles.php:752
+msgid "Your full name"
+msgstr "Jouw volledige naam"
+
+#: ../../Zotlabs/Module/Profiles.php:753
+msgid "Title/Description"
+msgstr "Titel/omschrijving"
+
+#: ../../Zotlabs/Module/Profiles.php:756
+msgid "Street address"
+msgstr "Straat en huisnummer"
+
+#: ../../Zotlabs/Module/Profiles.php:757
+msgid "Locality/City"
+msgstr "Woonplaats"
+
+#: ../../Zotlabs/Module/Profiles.php:758
+msgid "Region/State"
+msgstr "Provincie/gewest/deelstaat"
+
+#: ../../Zotlabs/Module/Profiles.php:759
+msgid "Postal/Zip code"
+msgstr "Postcode"
+
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Who (if applicable)"
+msgstr "Wie (wanneer van toepassing)"
+
+#: ../../Zotlabs/Module/Profiles.php:765
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl"
+
+#: ../../Zotlabs/Module/Profiles.php:766
+msgid "Since (date)"
+msgstr "Sinds (datum)"
+
+#: ../../Zotlabs/Module/Profiles.php:769
+msgid "Tell us about yourself"
+msgstr "Vertel ons iets over jezelf"
+
+#: ../../Zotlabs/Module/Profiles.php:770
+#: ../../extend/addon/addon/openid/MysqlProvider.php:68
+msgid "Homepage URL"
+msgstr "URL homepagina"
+
+#: ../../Zotlabs/Module/Profiles.php:771
+msgid "Hometown"
+msgstr "Oorspronkelijk uit"
+
+#: ../../Zotlabs/Module/Profiles.php:772
+msgid "Political views"
+msgstr "Politieke overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:773
+msgid "Religious views"
+msgstr "Religieuze overtuigingen"
+
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Keywords used in directory listings"
+msgstr "Trefwoorden voor in de kanalengids"
+
+#: ../../Zotlabs/Module/Profiles.php:774
+msgid "Example: fishing photography software"
+msgstr "Voorbeeld: muziek, fotografie, software"
+
+#: ../../Zotlabs/Module/Profiles.php:777
+msgid "Musical interests"
+msgstr "Muzikale interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:778
+msgid "Books, literature"
+msgstr "Boeken/literatuur"
+
+#: ../../Zotlabs/Module/Profiles.php:779
+msgid "Television"
+msgstr "Televisie"
+
+#: ../../Zotlabs/Module/Profiles.php:780
+msgid "Film/Dance/Culture/Entertainment"
+msgstr "Film/dans/cultuur/entertainment"
+
+#: ../../Zotlabs/Module/Profiles.php:781
+msgid "Hobbies/Interests"
+msgstr "Hobby's/interesses"
+
+#: ../../Zotlabs/Module/Profiles.php:782
+msgid "Love/Romance"
+msgstr "Liefde/romantiek"
+
+#: ../../Zotlabs/Module/Profiles.php:784
+msgid "School/Education"
+msgstr "School/opleiding"
+
+#: ../../Zotlabs/Module/Profiles.php:785
+msgid "Contact information and social networks"
+msgstr "Contactinformatie en sociale netwerken"
+
+#: ../../Zotlabs/Module/Profiles.php:786
+msgid "My other channels"
+msgstr "Mijn andere kanalen"
+
+#: ../../Zotlabs/Module/Profiles.php:788
+msgid "Communications"
+msgstr "Communicatie"
+
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
+msgid "Profile Image"
+msgstr "Profielfoto"
+
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/nav.php:105
+#: ../../include/channel.php:1044
+msgid "Edit Profiles"
+msgstr "Bewerk profielen"
#: ../../Zotlabs/Module/Settings/Features.php:45
msgid "Additional Features"
@@ -5988,49 +5841,6 @@ msgstr "Geen naam"
msgid "Remove authorization"
msgstr "Autorisatie verwijderen"
-#: ../../Zotlabs/Module/Settings/Tokens.php:31
-#, php-format
-msgid "This channel is limited to %d tokens"
-msgstr "Dit kanaal heeft een limiet van %d tokens"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:37
-msgid "Name and Password are required."
-msgstr "Naam en wachtwoord zijn vereist"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:77
-msgid "Token saved."
-msgstr "Token opgeslagen."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:113
-msgid ""
-"Use this form to create temporary access identifiers to share things with "
-"non-members. These identities may be used in Access Control Lists and "
-"visitors may login using these credentials to access private content."
-msgstr "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud."
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:115
-msgid ""
-"You may also provide <em>dropbox</em> style access links to friends and "
-"associates by adding the Login Password to any specific site URL as shown. "
-"Examples:"
-msgstr "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:647
-msgid "Guest Access Tokens"
-msgstr "Gasttoegang"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:157
-msgid "Login Name"
-msgstr "Inlognaam"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:158
-msgid "Login Password"
-msgstr "Wachtwoord:"
-
-#: ../../Zotlabs/Module/Settings/Tokens.php:159
-msgid "Expires (yyyy-mm-dd)"
-msgstr "Geldig t/m (yyyy-mm-dd)"
-
#: ../../Zotlabs/Module/Settings/Account.php:20
msgid "Not valid email."
msgstr "Geen geldig e-mailadres."
@@ -6096,7 +5906,7 @@ msgid "Used to provide a member experience matched to your comfort level"
msgstr "Wordt gebruikt om je een gebruikerservaring te bieden die met jouw technisch niveau overeenkomt"
#: ../../Zotlabs/Module/Settings/Account.php:119
-#: ../../Zotlabs/Module/Settings/Channel.php:462
+#: ../../Zotlabs/Module/Settings/Channel.php:483
msgid "Email Address:"
msgstr "E-mailadres:"
@@ -6104,7 +5914,7 @@ msgstr "E-mailadres:"
msgid "Remove this account including all its channels"
msgstr "Dit account en al zijn kanalen verwijderen"
-#: ../../Zotlabs/Module/Settings/Channel.php:246
+#: ../../Zotlabs/Module/Settings/Channel.php:251
#: ../../extend/addon/addon/logrot/logrot.php:54
#: ../../extend/addon/addon/msgfooter/msgfooter.php:54
#: ../../extend/addon/addon/openstreetmap/openstreetmap.php:184
@@ -6115,489 +5925,570 @@ msgstr "Dit account en al zijn kanalen verwijderen"
msgid "Settings updated."
msgstr "Instellingen bijgewerkt."
-#: ../../Zotlabs/Module/Settings/Channel.php:307
+#: ../../Zotlabs/Module/Settings/Channel.php:312
msgid "Nobody except yourself"
msgstr "Niemand, behalve jezelf"
-#: ../../Zotlabs/Module/Settings/Channel.php:308
+#: ../../Zotlabs/Module/Settings/Channel.php:313
msgid "Only those you specifically allow"
msgstr "Alleen connecties met uitdrukkelijke toestemming"
-#: ../../Zotlabs/Module/Settings/Channel.php:309
+#: ../../Zotlabs/Module/Settings/Channel.php:314
msgid "Approved connections"
msgstr "Geaccepteerde connecties"
-#: ../../Zotlabs/Module/Settings/Channel.php:310
+#: ../../Zotlabs/Module/Settings/Channel.php:315
msgid "Any connections"
msgstr "Alle connecties"
-#: ../../Zotlabs/Module/Settings/Channel.php:311
+#: ../../Zotlabs/Module/Settings/Channel.php:316
msgid "Anybody on this website"
msgstr "Iedereen op deze hub"
-#: ../../Zotlabs/Module/Settings/Channel.php:312
+#: ../../Zotlabs/Module/Settings/Channel.php:317
msgid "Anybody in this network"
msgstr "Iedereen in dit netwerk"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
+#: ../../Zotlabs/Module/Settings/Channel.php:318
msgid "Anybody authenticated"
msgstr "Geauthenticeerd"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
+#: ../../Zotlabs/Module/Settings/Channel.php:319
msgid "Anybody on the internet"
msgstr "Iedereen op het internet"
-#: ../../Zotlabs/Module/Settings/Channel.php:390
+#: ../../Zotlabs/Module/Settings/Channel.php:395
msgid "Publish your default profile in the network directory"
msgstr "Publiceer je standaardprofiel in de kanalengids"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
+#: ../../Zotlabs/Module/Settings/Channel.php:400
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen"
-#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Settings/Channel.php:409
msgid "Your channel address is"
msgstr "Jouw kanaaladres is"
-#: ../../Zotlabs/Module/Settings/Channel.php:407
+#: ../../Zotlabs/Module/Settings/Channel.php:412
msgid "Your files/photos are accessible via WebDAV at"
msgstr "Jouw bestanden/foto's zijn beschikbaar via WebDAV op"
-#: ../../Zotlabs/Module/Settings/Channel.php:453
+#: ../../Zotlabs/Module/Settings/Channel.php:474
msgid "Channel Settings"
msgstr "Kanaal-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:460
+#: ../../Zotlabs/Module/Settings/Channel.php:481
msgid "Basic Settings"
msgstr "Basis-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:461
-#: ../../include/channel.php:1172
+#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../include/channel.php:1255
msgid "Full Name:"
msgstr "Volledige naam:"
-#: ../../Zotlabs/Module/Settings/Channel.php:463
+#: ../../Zotlabs/Module/Settings/Channel.php:484
msgid "Your Timezone:"
msgstr "Jouw tijdzone:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Default Post Location:"
msgstr "Standaardlocatie bericht:"
-#: ../../Zotlabs/Module/Settings/Channel.php:464
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Geographical location to display on your posts"
msgstr "Geografische locatie die bij het bericht moet worden vermeld"
-#: ../../Zotlabs/Module/Settings/Channel.php:465
+#: ../../Zotlabs/Module/Settings/Channel.php:486
msgid "Use Browser Location:"
msgstr "Locatie van webbrowser gebruiken:"
-#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Adult Content"
msgstr "Inhoud voor volwassenen"
-#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassenen. (Gebruik de tag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)"
-#: ../../Zotlabs/Module/Settings/Channel.php:469
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Security and Privacy Settings"
msgstr "Veiligheids- en privacy-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:472
+#: ../../Zotlabs/Module/Settings/Channel.php:493
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Jouw permissies zijn al ingesteld. Klik om ze te bekijken of aan te passen."
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:495
msgid "Hide my online presence"
msgstr "Verberg mijn aanwezigheid"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:495
msgid "Prevents displaying in your profile that you are online"
msgstr "Voorkomt dat op je kanaalpagina te zien valt dat je momenteel op $Projectname aanwezig bent"
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid "Simple Privacy Settings:"
msgstr "Eenvoudige privacy-instellingen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:477
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:478
+#: ../../Zotlabs/Module/Settings/Channel.php:499
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:479
+#: ../../Zotlabs/Module/Settings/Channel.php:500
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privé <em>(standaard privé en nooit openbaar)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:480
+#: ../../Zotlabs/Module/Settings/Channel.php:501
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Allow others to tag your posts"
msgstr "Anderen toestaan om je berichten te taggen"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:505
msgid "Channel Permission Limits"
msgstr "Geavanceerde permissies"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "Expire other channel content after this many days"
msgstr "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "0 or blank to use the website limit."
msgstr "0 of leeg om het standaard aantal dagen van deze hub te gebruiken."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
#, php-format
msgid "This website expires after %d days."
msgstr "Deze hub laat de inhoud van andere kanalen na %d dagen verlopen."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "This website does not expire imported content."
msgstr "Deze hub laat de inhoud van andere kanalen niet verlopen."
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "The website limit takes precedence if lower than your limit."
msgstr "Wanneer de standaard aantal dagen van deze hub lager ligt dan jouw aantal, dan heeft de limiet van deze hub voorrang."
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "Maximum Friend Requests/Day:"
msgstr "Maximum aantal connectieverzoeken per dag:"
-#: ../../Zotlabs/Module/Settings/Channel.php:487
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "May reduce spam activity"
msgstr "Kan eventuele spam verminderen"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "Default Access Control List (ACL)"
msgstr "Standaard permissies voor nieuwe berichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:490
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Use my default audience setting for the type of object published"
msgstr "Gebruik mijn standaard privacy-instelling voor dit type publicatie"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "Channel permissions category:"
msgstr "Kanaaltype en -permissies:"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:519
+msgid "Default Permissions Group"
+msgstr "Standaard permissiegroep"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:525
msgid "Maximum private messages per day from unknown people:"
msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:525
msgid "Useful to reduce spamming"
msgstr "Kan eventuele spam verminderen"
-#: ../../Zotlabs/Module/Settings/Channel.php:506
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Notification Settings"
msgstr "Notificatie-instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "By default post a status message when:"
msgstr "Plaats automatisch een bericht wanneer:"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "accepting a friend request"
msgstr "Een connectieverzoek wordt geaccepteerd"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "joining a forum/community"
msgstr "Je lid wordt van een forum/groep"
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "making an <em>interesting</em> profile change"
msgstr "Er sprake is van een <em>interessante</em> profielwijziging"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "Send a notification email when:"
msgstr "Verzend een notificatie per e-mail wanneer:"
-#: ../../Zotlabs/Module/Settings/Channel.php:512
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "You receive a connection request"
msgstr "Je een connectieverzoek ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:513
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "Your connections are confirmed"
msgstr "Jouw connecties zijn bevestigd"
-#: ../../Zotlabs/Module/Settings/Channel.php:514
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "Someone writes on your profile wall"
msgstr "Iemand iets op jouw kanaal heeft geschreven"
-#: ../../Zotlabs/Module/Settings/Channel.php:515
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "Someone writes a followup comment"
msgstr "Iemand een reactie schrijft"
-#: ../../Zotlabs/Module/Settings/Channel.php:516
+#: ../../Zotlabs/Module/Settings/Channel.php:538
msgid "You receive a private message"
msgstr "Je een privé-bericht ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:517
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "You receive a friend suggestion"
msgstr "Je een kanaalvoorstel ontvangt"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "You are tagged in a post"
msgstr "Je expliciet in een bericht bent genoemd"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "You are poked/prodded/etc. in a post"
msgstr "Je bent in een bericht aangestoten/gepord/etc."
-#: ../../Zotlabs/Module/Settings/Channel.php:521
+#: ../../Zotlabs/Module/Settings/Channel.php:543
msgid "Someone likes your post/comment"
msgstr "Iemand jouw bericht/reactie leuk vindt"
-#: ../../Zotlabs/Module/Settings/Channel.php:524
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Show visual notifications including:"
msgstr "Toon de volgende zichtbare notificaties:"
-#: ../../Zotlabs/Module/Settings/Channel.php:526
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Unseen grid activity"
msgstr "Niet bekeken grid-activiteit"
-#: ../../Zotlabs/Module/Settings/Channel.php:527
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Unseen channel activity"
msgstr "Niet bekeken kanaal-activiteit"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Unseen private messages"
msgstr "Niet bekeken privéberichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
-#: ../../Zotlabs/Module/Settings/Channel.php:533
-#: ../../Zotlabs/Module/Settings/Channel.php:534
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:557
#: ../../extend/addon/addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Aanbevolen"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Upcoming events"
msgstr "Aankomende gebeurtenissen"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Events today"
msgstr "Gebeurtenissen van vandaag"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Upcoming birthdays"
msgstr "Aankomende verjaardagen"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Not available in all themes"
msgstr "Niet in alle thema's beschikbaar"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:554
msgid "System (personal) notifications"
msgstr "(Persoonlijke) systeemnotificaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:555
msgid "System info messages"
msgstr "Systeemmededelingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "System critical alerts"
msgstr "Kritische systeemwaarschuwingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:557
msgid "New connections"
msgstr "Nieuwe connecties"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:558
msgid "System Registrations"
msgstr "Nieuwe accountregistraties op deze hub"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Toon tevens nieuwe kanaalberichten, privéberichten en connecties onder Notificaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "Notify me of events this many days in advance"
msgstr "Herinner mij zoveel dagen van te voren aan gebeurtenissen"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "Must be greater than 0"
msgstr "Moet hoger dan 0 zijn"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:567
msgid "Advanced Account/Page Type Settings"
msgstr "Instellingen geavanceerd account/paginatype"
-#: ../../Zotlabs/Module/Settings/Channel.php:542
+#: ../../Zotlabs/Module/Settings/Channel.php:568
msgid "Change the behaviour of this account for special situations"
msgstr "Verander het gedrag van dit account voor speciale situaties"
-#: ../../Zotlabs/Module/Settings/Channel.php:544
+#: ../../Zotlabs/Module/Settings/Channel.php:570
msgid "Miscellaneous Settings"
msgstr "Diverse instellingen"
-#: ../../Zotlabs/Module/Settings/Channel.php:545
+#: ../../Zotlabs/Module/Settings/Channel.php:571
msgid "Default photo upload folder"
msgstr "Standaard fotoalbum voor uploads"
-#: ../../Zotlabs/Module/Settings/Channel.php:545
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "%Y - current year, %m - current month"
msgstr "%Y - dit jaar, %m - deze maand"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "Default file upload folder"
msgstr "Standaard bestandsmap voor uploads"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:574
msgid "Personal menu to display in your channel pages"
msgstr "Persoonlijk menu om op je kanaalpagina's weer te geven"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:576
msgid "Remove this channel."
msgstr "Verwijder dit kanaal."
-#: ../../Zotlabs/Module/Settings/Channel.php:551
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "Firefox Share $Projectname provider"
msgstr "$Projectname-service voor Firefox Share"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
+#: ../../Zotlabs/Module/Settings/Channel.php:578
msgid "Start calendar week on monday"
msgstr "Begin in de agenda de week op maandag"
-#: ../../Zotlabs/Module/Settings/Display.php:137
+#: ../../Zotlabs/Module/Settings/Featured.php:20
+msgid "Affinity Slider settings updated."
+msgstr "Affiniteitsinstellingen bijgewerkt."
+
+#: ../../Zotlabs/Module/Settings/Featured.php:34
+msgid "No feature settings configured"
+msgstr "Geen plugin-instellingen aanwezig"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:41
+msgid "Default maximum affinity level"
+msgstr "Standaard hoogste affiniteitsniveau"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:46
+msgid "Default minimum affinity level"
+msgstr "Standaard laagste affiniteitsniveau"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:50
+msgid "Affinity Slider Settings"
+msgstr "Affiniteitsinstellingen"
+
+#: ../../Zotlabs/Module/Settings/Featured.php:60
+msgid "Feature/Addon Settings"
+msgstr "Plugin-instellingen"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:37
+msgid "Permission category saved."
+msgstr "Permissiegroep opgeslagen."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:63
+msgid ""
+"Use this form to create permission rules for various classes of people or "
+"connections."
+msgstr "Gebruik dit formulier om permissieregels voor diverse soorten mensen en connecties aan te maken."
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:96
+msgid "Permission Categories"
+msgstr "Permissiegroepen"
+
+#: ../../Zotlabs/Module/Settings/Permcats.php:104
+msgid "Permission Name"
+msgstr "Permissienaam"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:31
+#, php-format
+msgid "This channel is limited to %d tokens"
+msgstr "Dit kanaal heeft een limiet van %d tokens"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:37
+msgid "Name and Password are required."
+msgstr "Naam en wachtwoord zijn vereist"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:77
+msgid "Token saved."
+msgstr "Token opgeslagen."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:113
+msgid ""
+"Use this form to create temporary access identifiers to share things with "
+"non-members. These identities may be used in Access Control Lists and "
+"visitors may login using these credentials to access private content."
+msgstr "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud."
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:115
+msgid ""
+"You may also provide <em>dropbox</em> style access links to friends and "
+"associates by adding the Login Password to any specific site URL as shown. "
+"Examples:"
+msgstr "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:150 ../../include/widgets.php:644
+msgid "Guest Access Tokens"
+msgstr "Gasttoegang"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:157
+msgid "Login Name"
+msgstr "Inlognaam"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:158
+msgid "Login Password"
+msgstr "Wachtwoord:"
+
+#: ../../Zotlabs/Module/Settings/Tokens.php:159
+msgid "Expires (yyyy-mm-dd)"
+msgstr "Geldig t/m (yyyy-mm-dd)"
+
+#: ../../Zotlabs/Module/Settings/Display.php:145
msgid "No special theme for mobile devices"
msgstr "Geen speciaal thema voor mobiele apparaten"
-#: ../../Zotlabs/Module/Settings/Display.php:140
+#: ../../Zotlabs/Module/Settings/Display.php:148
#, php-format
msgid "%s - (Experimental)"
msgstr "%s - (experimenteel)"
-#: ../../Zotlabs/Module/Settings/Display.php:191
+#: ../../Zotlabs/Module/Settings/Display.php:198
msgid "Display Settings"
msgstr "Weergave-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:192
+#: ../../Zotlabs/Module/Settings/Display.php:199
msgid "Theme Settings"
msgstr "Thema-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:193
+#: ../../Zotlabs/Module/Settings/Display.php:200
msgid "Custom Theme Settings"
msgstr "Handmatige thema-instellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:194
+#: ../../Zotlabs/Module/Settings/Display.php:201
msgid "Content Settings"
msgstr "Inhoudsinstellingen"
-#: ../../Zotlabs/Module/Settings/Display.php:200
+#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Display Theme:"
msgstr "Gebruik thema:"
-#: ../../Zotlabs/Module/Settings/Display.php:201
+#: ../../Zotlabs/Module/Settings/Display.php:208
msgid "Select scheme"
msgstr "Kies schema van thema"
-#: ../../Zotlabs/Module/Settings/Display.php:203
+#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Mobile Theme:"
msgstr "Mobiel thema:"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid "Preload images before rendering the page"
msgstr "Afbeeldingen laden voordat de pagina wordt weergegeven"
-#: ../../Zotlabs/Module/Settings/Display.php:204
+#: ../../Zotlabs/Module/Settings/Display.php:211
msgid ""
"The subjective page load time will be longer but the page will be ready when"
" displayed"
msgstr "De laadtijd van een pagina lijkt langer, maar de pagina is wel meteen helemaal geladen wanneer deze wordt weergeven"
-#: ../../Zotlabs/Module/Settings/Display.php:205
+#: ../../Zotlabs/Module/Settings/Display.php:212
msgid "Enable user zoom on mobile devices"
msgstr "Inzoomen op smartphones en tablets toestaan"
-#: ../../Zotlabs/Module/Settings/Display.php:206
+#: ../../Zotlabs/Module/Settings/Display.php:213
msgid "Update browser every xx seconds"
msgstr "Ververs de webbrowser om de zoveel seconde"
-#: ../../Zotlabs/Module/Settings/Display.php:206
+#: ../../Zotlabs/Module/Settings/Display.php:213
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimaal 10 seconde, geen maximum"
-#: ../../Zotlabs/Module/Settings/Display.php:207
+#: ../../Zotlabs/Module/Settings/Display.php:214
msgid "Maximum number of conversations to load at any time:"
msgstr "Maximaal aantal conversaties die per keer geladen worden:"
-#: ../../Zotlabs/Module/Settings/Display.php:207
+#: ../../Zotlabs/Module/Settings/Display.php:214
msgid "Maximum of 100 items"
msgstr "Maximaal 100 conversaties"
-#: ../../Zotlabs/Module/Settings/Display.php:208
+#: ../../Zotlabs/Module/Settings/Display.php:215
msgid "Show emoticons (smilies) as images"
msgstr "Toon emoticons (smilies) als afbeeldingen"
-#: ../../Zotlabs/Module/Settings/Display.php:209
+#: ../../Zotlabs/Module/Settings/Display.php:216
msgid "Manual conversation updates"
msgstr "Handmatige conversatie-updates"
-#: ../../Zotlabs/Module/Settings/Display.php:209
-msgid "Default is automatic, which may increase screen jumping"
-msgstr "Standaard is automatisch, maar soms kan het zorgen voor het verspringen van items"
+#: ../../Zotlabs/Module/Settings/Display.php:216
+msgid "Default is on, turning this off may increase screen jumping"
+msgstr "Dit is standaard ingeschakeld en door dit uit te schakelen kunnen items soms verspringen."
-#: ../../Zotlabs/Module/Settings/Display.php:210
+#: ../../Zotlabs/Module/Settings/Display.php:217
msgid "Link post titles to source"
msgstr "Berichtkoppen naar originele locatie linken"
-#: ../../Zotlabs/Module/Settings/Display.php:211
+#: ../../Zotlabs/Module/Settings/Display.php:218
msgid "System Page Layout Editor - (advanced)"
msgstr "Lay-out bewerken van systeempagina's (geavanceerd)"
-#: ../../Zotlabs/Module/Settings/Display.php:214
+#: ../../Zotlabs/Module/Settings/Display.php:221
msgid "Use blog/list mode on channel page"
msgstr "Gebruik blog/lijst-modus op kanaalpagina"
-#: ../../Zotlabs/Module/Settings/Display.php:214
-#: ../../Zotlabs/Module/Settings/Display.php:215
+#: ../../Zotlabs/Module/Settings/Display.php:221
+#: ../../Zotlabs/Module/Settings/Display.php:222
msgid "(comments displayed separately)"
msgstr "(reacties worden afzonderlijk weergeven)"
-#: ../../Zotlabs/Module/Settings/Display.php:215
+#: ../../Zotlabs/Module/Settings/Display.php:222
msgid "Use blog/list mode on grid page"
msgstr "Gebruik blog/lijst-modus op gridpagina"
-#: ../../Zotlabs/Module/Settings/Display.php:216
+#: ../../Zotlabs/Module/Settings/Display.php:223
msgid "Channel page max height of content (in pixels)"
msgstr "Maximale hoogte berichtinhoud op kanaalpagina (in pixels)"
-#: ../../Zotlabs/Module/Settings/Display.php:216
-#: ../../Zotlabs/Module/Settings/Display.php:217
+#: ../../Zotlabs/Module/Settings/Display.php:223
+#: ../../Zotlabs/Module/Settings/Display.php:224
msgid "click to expand content exceeding this height"
msgstr "klik om inhoud uit te klappen die deze hoogte overschrijdt"
-#: ../../Zotlabs/Module/Settings/Display.php:217
+#: ../../Zotlabs/Module/Settings/Display.php:224
msgid "Grid page max height of content (in pixels)"
msgstr "Maximale hoogte berichtinhoud op gridpagina (in pixels)"
-#: ../../Zotlabs/Module/Settings/Featured.php:24
-msgid "No feature settings configured"
-msgstr "Geen plugin-instellingen aanwezig"
-
-#: ../../Zotlabs/Module/Settings/Featured.php:31
-msgid "Feature/Addon Settings"
-msgstr "Plugin-instellingen"
-
#: ../../Zotlabs/Module/Tagrm.php:48 ../../Zotlabs/Module/Tagrm.php:98
msgid "Tag removed"
msgstr "Tag verwijderd"
@@ -6657,88 +6548,450 @@ msgstr "Naam van ding"
#: ../../Zotlabs/Module/Thing.php:309 ../../Zotlabs/Module/Thing.php:361
msgid "URL of thing (optional)"
-msgstr "URL van ding (optioneel)"
+msgstr "URL van ding (niet verplicht)"
#: ../../Zotlabs/Module/Thing.php:311 ../../Zotlabs/Module/Thing.php:362
msgid "URL for photo of thing (optional)"
-msgstr "URL voor foto van ding (optioneel)"
+msgstr "URL voor foto van ding (niet verplicht)"
#: ../../Zotlabs/Module/Thing.php:353
msgid "Add Thing to your Profile"
msgstr "Ding aan je profiel toevoegen"
-#: ../../Zotlabs/Module/Import.php:33
+#: ../../Zotlabs/Module/Setup.php:176
+msgid "$Projectname Server - Setup"
+msgstr "$Projectname Hub - Setup"
+
+#: ../../Zotlabs/Module/Setup.php:180
+msgid "Could not connect to database."
+msgstr "Could not connect to database."
+
+#: ../../Zotlabs/Module/Setup.php:184
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Could not connect to specified hub URL. Possible SSL certificate or DNS issue."
+
+#: ../../Zotlabs/Module/Setup.php:191
+msgid "Could not create table."
+msgstr "Could not create table."
+
+#: ../../Zotlabs/Module/Setup.php:196
+msgid "Your site database has been installed."
+msgstr "Your hub database has been installed."
+
+#: ../../Zotlabs/Module/Setup.php:200
+msgid ""
+"You may need to import the file \"install/schema_xxx.sql\" manually using a "
+"database client."
+msgstr "You may need to import the file \"install/schema_xxx.sql\" manually using a database client."
+
+#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Setup.php:750
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Please see the file \"install/INSTALL.txt\"."
+
+#: ../../Zotlabs/Module/Setup.php:260
+msgid "System check"
+msgstr "System check"
+
+#: ../../Zotlabs/Module/Setup.php:265
+msgid "Check again"
+msgstr "Check again"
+
+#: ../../Zotlabs/Module/Setup.php:287
+msgid "Database connection"
+msgstr "Database connection"
+
+#: ../../Zotlabs/Module/Setup.php:288
+msgid ""
+"In order to install $Projectname we need to know how to connect to your "
+"database."
+msgstr "In order to install $Projectname we need to know how to connect to your database."
+
+#: ../../Zotlabs/Module/Setup.php:289
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Please contact your hosting provider or server administrator if you have questions about these settings."
+
+#: ../../Zotlabs/Module/Setup.php:290
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "The database you specify below should already exist. If it does not, please create it before continuing."
+
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Database Server Name"
+msgstr "Database Server Name"
+
+#: ../../Zotlabs/Module/Setup.php:294
+msgid "Default is 127.0.0.1"
+msgstr "Default is 127.0.0.1"
+
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Database Port"
+msgstr "Database Port"
+
+#: ../../Zotlabs/Module/Setup.php:295
+msgid "Communication port number - use 0 for default"
+msgstr "Communication port number - use 0 for default"
+
+#: ../../Zotlabs/Module/Setup.php:296
+msgid "Database Login Name"
+msgstr "Database Login Name"
+
+#: ../../Zotlabs/Module/Setup.php:297
+msgid "Database Login Password"
+msgstr "Database Login Password"
+
+#: ../../Zotlabs/Module/Setup.php:298
+msgid "Database Name"
+msgstr "Database Name"
+
+#: ../../Zotlabs/Module/Setup.php:299
+msgid "Database Type"
+msgstr "Database Type"
+
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid "Site administrator email address"
+msgstr "Hub administrator email address"
+
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Your account email address must match this in order to use the web admin panel."
+
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Website URL"
+msgstr "Hub URL"
+
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+msgid "Please use SSL (https) URL if available."
+msgstr "Please use SSL (https) URL if available."
+
+#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+msgid "Please select a default timezone for your website"
+msgstr "Please select a default timezone for your hub"
+
+#: ../../Zotlabs/Module/Setup.php:336
+msgid "Site settings"
+msgstr "Hub settings"
+
+#: ../../Zotlabs/Module/Setup.php:392
+msgid "PHP version 5.5 or greater is required."
+msgstr "PHP version 5.5 or greater is required."
+
+#: ../../Zotlabs/Module/Setup.php:393
+msgid "PHP version"
+msgstr "PHP version"
+
+#: ../../Zotlabs/Module/Setup.php:409
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Could not find a command line version of PHP in the web server PATH."
+
+#: ../../Zotlabs/Module/Setup.php:410
+msgid ""
+"If you don't have a command line version of PHP installed on server, you "
+"will not be able to run background polling via cron."
+msgstr "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."
+
+#: ../../Zotlabs/Module/Setup.php:414
+msgid "PHP executable path"
+msgstr "PHP executable path"
+
+#: ../../Zotlabs/Module/Setup.php:414
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Enter full path to php executable. You can leave this blank to continue the installation."
+
+#: ../../Zotlabs/Module/Setup.php:419
+msgid "Command line PHP"
+msgstr "Command line PHP"
+
+#: ../../Zotlabs/Module/Setup.php:429
+msgid ""
+"Unable to check command line PHP, as shell_exec() is disabled. This is "
+"required."
+msgstr "Unable to check command line PHP, as shell_exec() is disabled. This is required."
+
+#: ../../Zotlabs/Module/Setup.php:432
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "The command line version of PHP on your system does not have \"register_argc_argv\" enabled."
+
+#: ../../Zotlabs/Module/Setup.php:433
+msgid "This is required for message delivery to work."
+msgstr "This is required for message delivery to work."
+
+#: ../../Zotlabs/Module/Setup.php:436
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
+
+#: ../../Zotlabs/Module/Setup.php:454
#, php-format
-msgid "Your service plan only allows %d channels."
-msgstr "Jouw abonnement staat maar %d kanalen toe."
+msgid ""
+"Your max allowed total upload size is set to %s. Maximum size of one file to"
+" upload is set to %s. You are allowed to upload up to %d files at once."
+msgstr "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."
-#: ../../Zotlabs/Module/Import.php:157 ../../include/import.php:100
-msgid "Cloned channel not found. Import failed."
-msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
+#: ../../Zotlabs/Module/Setup.php:459
+msgid "You can adjust these settings in the server php.ini file."
+msgstr "You can adjust these settings in the server php.ini file."
-#: ../../Zotlabs/Module/Import.php:167
-msgid "No channel. Import failed."
-msgstr "Geen kanaal. Importeren mislukt."
+#: ../../Zotlabs/Module/Setup.php:461
+msgid "PHP upload limits"
+msgstr "PHP upload limits"
-#: ../../Zotlabs/Module/Import.php:503
-#: ../../include/Import/import_diaspora.php:142
-msgid "Import completed."
-msgstr "Import voltooid."
+#: ../../Zotlabs/Module/Setup.php:484
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"
-#: ../../Zotlabs/Module/Import.php:525
-msgid "You must be logged in to use this feature."
-msgstr "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken."
+#: ../../Zotlabs/Module/Setup.php:485
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Import.php:530
-msgid "Import Channel"
-msgstr "Kanaal importeren"
+#: ../../Zotlabs/Module/Setup.php:488
+msgid "Generate encryption keys"
+msgstr "Generate encryption keys"
+
+#: ../../Zotlabs/Module/Setup.php:505
+msgid "libCurl PHP module"
+msgstr "libCurl PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:506
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:507
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:508
+msgid "PDO database PHP module"
+msgstr "PDO database PHP module"
-#: ../../Zotlabs/Module/Import.php:531
+#: ../../Zotlabs/Module/Setup.php:509
+msgid "mb_string PHP module"
+msgstr "mb_string PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:510
+msgid "xml PHP module"
+msgstr "xml PHP module"
+
+#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite module"
+
+#: ../../Zotlabs/Module/Setup.php:514
msgid ""
-"Use this form to import an existing channel from a different server/hub. You"
-" may retrieve the channel identity from the old server/hub via the network "
-"or provide an export file."
-msgstr "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken."
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Error: Apache webserver mod-rewrite module is required but not installed."
-#: ../../Zotlabs/Module/Import.php:533
-msgid "Or provide the old server/hub details"
-msgstr "Of vul de gegevens van de oude hub in"
+#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+msgid "exec"
+msgstr "exec"
-#: ../../Zotlabs/Module/Import.php:534
-msgid "Your old identity address (xyz@example.com)"
-msgstr "Jouw oude kanaaladres (xyz@example.com)"
+#: ../../Zotlabs/Module/Setup.php:520
+msgid ""
+"Error: exec is required but is either not installed or has been disabled in "
+"php.ini"
+msgstr "Error: exec is required but is either not installed or has been disabled in php.ini"
-#: ../../Zotlabs/Module/Import.php:535
-msgid "Your old login email address"
-msgstr "Het e-mailadres van je oude account"
+#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+msgid "shell_exec"
+msgstr "shell_exec"
-#: ../../Zotlabs/Module/Import.php:536
-msgid "Your old login password"
-msgstr "Wachtwoord van jouw oude account"
+#: ../../Zotlabs/Module/Setup.php:526
+msgid ""
+"Error: shell_exec is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Error: shell_exec is required but is either not installed or has been disabled in php.ini"
+
+#: ../../Zotlabs/Module/Setup.php:534
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Error: libCURL PHP module required but not installed."
-#: ../../Zotlabs/Module/Import.php:537
+#: ../../Zotlabs/Module/Setup.php:538
msgid ""
-"For either option, please choose whether to make this hub your new primary "
-"address, or whether your old location should continue this role. You will be"
-" able to post from either location, but only one can be marked as the "
-"primary location for files, photos, and media."
-msgstr "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen."
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Error: GD graphics PHP module with JPEG support required but not installed."
-#: ../../Zotlabs/Module/Import.php:538
-msgid "Make this hub my primary location"
-msgstr "Stel deze hub als mijn primaire locatie in"
+#: ../../Zotlabs/Module/Setup.php:542
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Error: openssl PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:546
+msgid "Error: PDO database PHP module required but not installed."
+msgstr "Error: PDO database PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:550
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Error: mb_string PHP module required but not installed."
+
+#: ../../Zotlabs/Module/Setup.php:554
+msgid "Error: xml PHP module required for DAV but not installed."
+msgstr "Error: xml PHP module required for DAV but not installed."
-#: ../../Zotlabs/Module/Import.php:539
+#: ../../Zotlabs/Module/Setup.php:572
msgid ""
-"Import existing posts if possible (experimental - limited by available "
-"memory"
-msgstr "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)"
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."
-#: ../../Zotlabs/Module/Import.php:540
+#: ../../Zotlabs/Module/Setup.php:573
msgid ""
-"This process may take several minutes to complete. Please submit the form "
-"only once and leave this page open until finished."
-msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."
+
+#: ../../Zotlabs/Module/Setup.php:574
+msgid ""
+"At the end of this procedure, we will give you a text to save in a file "
+"named .htconfig.php in your Red top folder."
+msgstr "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."
+
+#: ../../Zotlabs/Module/Setup.php:575
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."
+
+#: ../../Zotlabs/Module/Setup.php:578
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php is writable"
+
+#: ../../Zotlabs/Module/Setup.php:592
+msgid ""
+"This software uses the Smarty3 template engine to render its web views. "
+"Smarty3 compiles templates to PHP to speed up rendering."
+msgstr "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."
+
+#: ../../Zotlabs/Module/Setup.php:593
+#, php-format
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory %s under the top level web folder."
+msgstr "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."
+
+#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."
+
+#: ../../Zotlabs/Module/Setup.php:595
+#, php-format
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"%s only--not the template files (.tpl) that it contains."
+msgstr "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."
+
+#: ../../Zotlabs/Module/Setup.php:598
+#, php-format
+msgid "%s is writable"
+msgstr "%s is writable"
+
+#: ../../Zotlabs/Module/Setup.php:614
+msgid ""
+"This software uses the store directory to save uploaded files. The web "
+"server needs to have write access to the store directory under the top level"
+" web folder"
+msgstr "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"
+
+#: ../../Zotlabs/Module/Setup.php:618
+msgid "store is writable"
+msgstr "store is writable"
+
+#: ../../Zotlabs/Module/Setup.php:651
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "SSL certificate cannot be validated. Fix certificate or disable https access to this hub."
+
+#: ../../Zotlabs/Module/Setup.php:652
+msgid ""
+"If you have https access to your website or allow connections to TCP port "
+"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
+"NOT use self-signed certificates!"
+msgstr "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"
+
+#: ../../Zotlabs/Module/Setup.php:653
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "This restriction is incorporated because public posts from you may for example contain references to images on your own hub."
+
+#: ../../Zotlabs/Module/Setup.php:654
+msgid ""
+"If your certificate is not recognized, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues."
+
+#: ../../Zotlabs/Module/Setup.php:655
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement."
+
+#: ../../Zotlabs/Module/Setup.php:656
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Providers are available that issue free certificates which are browser-valid."
+
+#: ../../Zotlabs/Module/Setup.php:658
+msgid ""
+"If you are confident that the certificate is valid and signed by a trusted "
+"authority, check to see if you have failed to install an intermediate cert. "
+"These are not normally required by browsers, but are required for server-to-"
+"server communications."
+msgstr "If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."
+
+#: ../../Zotlabs/Module/Setup.php:660
+msgid "SSL certificate validation"
+msgstr "SSL certificate validation"
+
+#: ../../Zotlabs/Module/Setup.php:666
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server "
+"configuration.Test: "
+msgstr "Url rewrite in .htaccess is not working. Check your server configuration.Test: "
+
+#: ../../Zotlabs/Module/Setup.php:669
+msgid "Url rewrite is working"
+msgstr "Url rewrite is working"
+
+#: ../../Zotlabs/Module/Setup.php:683
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."
+
+#: ../../Zotlabs/Module/Setup.php:707
+#: ../../extend/addon/addon/cdav/cdav.php:41
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:401
+msgid "Errors encountered creating database tables."
+msgstr "Errors encountered creating database tables."
+
+#: ../../Zotlabs/Module/Setup.php:748
+msgid "<h1>What next</h1>"
+msgstr "<h1>What next</h1>"
+
+#: ../../Zotlabs/Module/Setup.php:749
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
#: ../../Zotlabs/Module/Viewconnections.php:65
msgid "No connections."
@@ -6753,60 +7006,232 @@ msgstr "Bezoek het profiel van %s [%s]"
msgid "View Connections"
msgstr "Connecties weergeven"
-#: ../../Zotlabs/Module/Viewsrc.php:44
-msgid "Source of Item"
-msgstr "Bron van item"
+#: ../../Zotlabs/Module/Wiki.php:30
+msgid "Profile Unavailable."
+msgstr "Profiel niet beschikbaar."
+
+#: ../../Zotlabs/Module/Wiki.php:44
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:40
+msgid "Not found"
+msgstr "Niet gevonden"
+
+#: ../../Zotlabs/Module/Wiki.php:68
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:60
+msgid "Invalid channel"
+msgstr "Onbekend kanaal"
+
+#: ../../Zotlabs/Module/Wiki.php:159
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:144
+#: ../../include/conversation.php:1900
+msgid "Wikis"
+msgstr "Wiki's"
+
+#: ../../Zotlabs/Module/Wiki.php:165
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:150
+msgid "Download"
+msgstr "Download"
+
+#: ../../Zotlabs/Module/Wiki.php:169
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:154
+msgid "Wiki name"
+msgstr "Naam wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:170
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:155
+msgid "Content type"
+msgstr "Opmaaktype"
+
+#: ../../Zotlabs/Module/Wiki.php:179
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:164
+msgid "Create a status post for this wiki"
+msgstr "Plaats een bericht over deze wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:204
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:183
+msgid "Wiki not found"
+msgstr "Wiki is niet gevonden"
+
+#: ../../Zotlabs/Module/Wiki.php:228
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:208
+msgid "Rename page"
+msgstr "Pagina hernoemen"
+
+#: ../../Zotlabs/Module/Wiki.php:232
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:212
+msgid "Error retrieving page content"
+msgstr "Fout tijdens ophalen inhoud pagina"
+
+#: ../../Zotlabs/Module/Wiki.php:259
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:241
+msgid "Revision Comparison"
+msgstr "Revisies vergelijken"
+
+#: ../../Zotlabs/Module/Wiki.php:260
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:242
+msgid "Revert"
+msgstr "Ongedaan maken"
+
+#: ../../Zotlabs/Module/Wiki.php:264
+msgid "Short description of your changes (optional)"
+msgstr "Korte omschrijving van jouw wijzigingen (niet verplicht)"
+
+#: ../../Zotlabs/Module/Wiki.php:271
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:251
+msgid "Source"
+msgstr "Bron"
+
+#: ../../Zotlabs/Module/Wiki.php:279
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:259
+msgid "New page name"
+msgstr "Nieuwe paginanaam"
+
+#: ../../Zotlabs/Module/Wiki.php:284
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:264
+#: ../../include/conversation.php:1299
+msgid "Embed image from photo albums"
+msgstr "Afbeelding uit een fotoalbum invoegen"
+
+#: ../../Zotlabs/Module/Wiki.php:285
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1393
+msgid "Embed an image from your albums"
+msgstr "Afbeelding uit jouw albums invoegen"
+
+#: ../../Zotlabs/Module/Wiki.php:287
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:267
+#: ../../include/conversation.php:1395 ../../include/conversation.php:1442
+msgid "OK"
+msgstr "OK"
+
+#: ../../Zotlabs/Module/Wiki.php:288
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1335
+msgid "Choose images to embed"
+msgstr "Kies afbeeldingen om in te voegen"
+
+#: ../../Zotlabs/Module/Wiki.php:289
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1336
+msgid "Choose an album"
+msgstr "Kies een album"
+
+#: ../../Zotlabs/Module/Wiki.php:290
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:270
+msgid "Choose a different album"
+msgstr "Kies een ander album"
+
+#: ../../Zotlabs/Module/Wiki.php:291
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:271
+#: ../../include/conversation.php:1338
+msgid "Error getting album list"
+msgstr "Fout tijdens ophalen albumlijst"
+
+#: ../../Zotlabs/Module/Wiki.php:292
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1339
+msgid "Error getting photo link"
+msgstr "Fout tijdens ophalen fotolink"
+
+#: ../../Zotlabs/Module/Wiki.php:293
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1340
+msgid "Error getting album"
+msgstr "Fout tijdens ophalen album"
+
+#: ../../Zotlabs/Module/Wiki.php:357
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:337
+msgid "Error creating wiki. Invalid name."
+msgstr "Fout tijdens aanmaken wiki. Ongeldige naam."
+
+#: ../../Zotlabs/Module/Wiki.php:369
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:348
+msgid "Wiki created, but error creating Home page."
+msgstr "Wiki aangemaakt, maar fout tijdens aanmaken homepagina."
+
+#: ../../Zotlabs/Module/Wiki.php:376
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:353
+msgid "Error creating wiki"
+msgstr "Fout tijdens aanmaken wiki."
+
+#: ../../Zotlabs/Module/Wiki.php:388
+msgid "Wiki delete permission denied."
+msgstr "Toegang geweigerd tijdens verwijderen wiki."
+
+#: ../../Zotlabs/Module/Wiki.php:398
+msgid "Error deleting wiki"
+msgstr "Fout tijdens verwijderen wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:424
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:400
+msgid "New page created"
+msgstr "Nieuwe pagina aangemaakt"
+
+#: ../../Zotlabs/Module/Wiki.php:539
+msgid "Cannot delete Home"
+msgstr "Kan Home niet verwijderen"
+
+#: ../../Zotlabs/Module/Wiki.php:603
+msgid "Current Revision"
+msgstr "Huidige revisie"
-#: ../../Zotlabs/Module/Chat.php:181
+#: ../../Zotlabs/Module/Wiki.php:603
+msgid "Selected Revision"
+msgstr "Geselecteerde revisie"
+
+#: ../../Zotlabs/Module/Wiki.php:653
+msgid "You must be authenticated."
+msgstr "Je moet geauthenticeerd zijn"
+
+#: ../../Zotlabs/Module/Chat.php:179
msgid "Room not found"
msgstr "Chatkanaal niet gevonden"
-#: ../../Zotlabs/Module/Chat.php:197
+#: ../../Zotlabs/Module/Chat.php:195
msgid "Leave Room"
msgstr "Chatkanaal verlaten"
-#: ../../Zotlabs/Module/Chat.php:198
+#: ../../Zotlabs/Module/Chat.php:196
msgid "Delete Room"
msgstr "Chatkanaal verwijderen"
-#: ../../Zotlabs/Module/Chat.php:199
+#: ../../Zotlabs/Module/Chat.php:197
msgid "I am away right now"
msgstr "Ik ben momenteel afwezig"
-#: ../../Zotlabs/Module/Chat.php:200
+#: ../../Zotlabs/Module/Chat.php:198
msgid "I am online"
msgstr "Ik ben online"
-#: ../../Zotlabs/Module/Chat.php:202
+#: ../../Zotlabs/Module/Chat.php:200
msgid "Bookmark this room"
msgstr "Chatkanaal aan bladwijzers toevoegen"
-#: ../../Zotlabs/Module/Chat.php:231
+#: ../../Zotlabs/Module/Chat.php:229
msgid "New Chatroom"
msgstr "Nieuw chatkanaal"
-#: ../../Zotlabs/Module/Chat.php:232
+#: ../../Zotlabs/Module/Chat.php:230
msgid "Chatroom name"
msgstr "Naam chatkanaal"
-#: ../../Zotlabs/Module/Chat.php:233
+#: ../../Zotlabs/Module/Chat.php:231
msgid "Expiration of chats (minutes)"
msgstr "Aantal minuten voordat chatberichten worden verwijderd"
-#: ../../Zotlabs/Module/Chat.php:249
+#: ../../Zotlabs/Module/Chat.php:247
#, php-format
msgid "%1$s's Chatrooms"
msgstr "Chatkanalen van %1$s"
-#: ../../Zotlabs/Module/Chat.php:254
+#: ../../Zotlabs/Module/Chat.php:252
msgid "No chatrooms available"
msgstr "Geen chatkanalen beschikbaar"
-#: ../../Zotlabs/Module/Chat.php:258
+#: ../../Zotlabs/Module/Chat.php:256
msgid "Expiration"
msgstr "Verloopt na"
-#: ../../Zotlabs/Module/Chat.php:259
+#: ../../Zotlabs/Module/Chat.php:257
msgid "min"
msgstr "min"
@@ -6818,153 +7243,248 @@ msgstr "Xchan opzoeken"
msgid "Lookup xchan beginning with (or webbie): "
msgstr "Zoek een xchan (of webbie) die begint met:"
-#: ../../Zotlabs/Module/Events.php:25
-msgid "Calendar entries imported."
-msgstr "Agenda-items geïmporteerd."
+#: ../../Zotlabs/Lib/Chatroom.php:27
+msgid "Missing room name"
+msgstr "Naam chatkanaal ontbreekt"
-#: ../../Zotlabs/Module/Events.php:27
-msgid "No calendar entries found."
-msgstr "Geen agenda-items gevonden."
+#: ../../Zotlabs/Lib/Chatroom.php:36
+msgid "Duplicate room name"
+msgstr "Naam chatkanaal bestaat al"
-#: ../../Zotlabs/Module/Events.php:106
-msgid "Event can not end before it has started."
-msgstr "Gebeurtenis kan niet eindigen voordat het is begonnen"
+#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
+msgid "Invalid room specifier."
+msgstr "Ongeldige omschrijving chatkanaal"
-#: ../../Zotlabs/Module/Events.php:108 ../../Zotlabs/Module/Events.php:117
-#: ../../Zotlabs/Module/Events.php:139
-msgid "Unable to generate preview."
-msgstr "Niet in staat om voorvertoning te genereren"
+#: ../../Zotlabs/Lib/Chatroom.php:126
+msgid "Room not found."
+msgstr "Chatkanaal niet gevonden"
-#: ../../Zotlabs/Module/Events.php:115
-msgid "Event title and start time are required."
-msgstr "Titel en begintijd van gebeurtenis zijn vereist."
+#: ../../Zotlabs/Lib/Chatroom.php:147
+msgid "Room is full"
+msgstr "Chatkanaal is vol"
-#: ../../Zotlabs/Module/Events.php:137 ../../Zotlabs/Module/Events.php:261
-msgid "Event not found."
-msgstr "Gebeurtenis niet gevonden"
+#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1947
+msgid "$Projectname Notification"
+msgstr "$Projectname-notificatie"
-#: ../../Zotlabs/Module/Events.php:453
-msgid "Edit event title"
-msgstr "Titel bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
+#: ../../extend/addon/addon/diaspora/util.php:218
+#: ../../extend/addon/addon/diaspora/util.php:231
+#: ../../include/network.php:1948
+msgid "$projectname"
+msgstr "$projectname"
-#: ../../Zotlabs/Module/Events.php:453
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Titel"
+#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1950
+msgid "Thank You,"
+msgstr "Bedankt,"
-#: ../../Zotlabs/Module/Events.php:455
-msgid "Categories (comma-separated list)"
-msgstr "Categorieën (door komma's gescheiden lijst)"
+#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1952
+#, php-format
+msgid "%s Administrator"
+msgstr "Beheerder %s"
-#: ../../Zotlabs/Module/Events.php:456
-msgid "Edit Category"
-msgstr "Categorie"
+#: ../../Zotlabs/Lib/Enotify.php:116
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../Zotlabs/Module/Events.php:456
-msgid "Category"
-msgstr "Categorie"
+#: ../../Zotlabs/Lib/Enotify.php:120
+#, php-format
+msgid "[$Projectname:Notify] New mail received at %s"
+msgstr "[$Projectname:Notificatie] Nieuw privébericht ontvangen op %s"
-#: ../../Zotlabs/Module/Events.php:459
-msgid "Edit start date and time"
-msgstr "Begindatum en -tijd bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:122
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s zond jou een nieuw privébericht om %3$s."
-#: ../../Zotlabs/Module/Events.php:459
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Begindatum en -tijd"
+#: ../../Zotlabs/Lib/Enotify.php:123
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s zond jou %2$s."
-#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:463
-msgid "Finish date and time are not known or not relevant"
-msgstr "Einddatum en -tijd zijn niet bekend of niet van toepassing"
+#: ../../Zotlabs/Lib/Enotify.php:123
+msgid "a private message"
+msgstr "een privébericht"
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Edit finish date and time"
-msgstr "Einddatum en -tijd bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:124
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bezoek %s om je privéberichten te bekijken en/of er op te reageren."
-#: ../../Zotlabs/Module/Events.php:462
-msgid "Finish date and time"
-msgstr "Einddatum en -tijd"
+#: ../../Zotlabs/Lib/Enotify.php:183
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %4$s[/zrl]"
-#: ../../Zotlabs/Module/Events.php:464 ../../Zotlabs/Module/Events.php:465
-msgid "Adjust for viewer timezone"
-msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
+#: ../../Zotlabs/Lib/Enotify.php:191
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %5$s van %4$s[/zrl]"
-#: ../../Zotlabs/Module/Events.php:464
-msgid ""
-"Important for events that happen in a particular place. Not practical for "
-"global holidays."
-msgstr "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen."
+#: ../../Zotlabs/Lib/Enotify.php:200
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]jouw %4$s[/zrl]"
-#: ../../Zotlabs/Module/Events.php:466
-msgid "Edit Description"
-msgstr "Omschrijving bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:211
+#, php-format
+msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notificatie] %2$s gaf een reactie in conversatie #%1$d"
-#: ../../Zotlabs/Module/Events.php:468
-msgid "Edit Location"
-msgstr "Locatie bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:212
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s gaf een reactie in een conversatie die jij volgt."
-#: ../../Zotlabs/Module/Events.php:472 ../../include/conversation.php:1262
-msgid "Permission settings"
-msgstr "Permissies"
+#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
+#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
+#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bezoek %s om de conversatie te bekijken en/of er op te reageren."
-#: ../../Zotlabs/Module/Events.php:485
-msgid "Advanced Options"
-msgstr "Geavanceerde opties"
+#: ../../Zotlabs/Lib/Enotify.php:273
+#, php-format
+msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s vindt [zrl=%3$s]jouw %4$s[/zrl] leuk"
-#: ../../Zotlabs/Module/Events.php:624
-msgid "Edit event"
-msgstr "Gebeurtenis bewerken"
+#: ../../Zotlabs/Lib/Enotify.php:288
+#, php-format
+msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Notificatie] %2$s vindt iets leuk in conversatie #%1$d"
-#: ../../Zotlabs/Module/Events.php:626
-msgid "Delete event"
-msgstr "Gebeurtenis verwijderen"
+#: ../../Zotlabs/Lib/Enotify.php:289
+#, php-format
+msgid "%1$s, %2$s liked an item/conversation you created."
+msgstr "%1$s, %2$s vindt iets leuk in een conversatie die jij bent gestart."
-#: ../../Zotlabs/Module/Events.php:660
-msgid "calendar"
-msgstr "agenda"
+#: ../../Zotlabs/Lib/Enotify.php:300
+#, php-format
+msgid "[$Projectname:Notify] %s posted to your profile wall"
+msgstr "[$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst"
-#: ../../Zotlabs/Module/Events.php:686
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Maand"
+#: ../../Zotlabs/Lib/Enotify.php:302
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s heeft om %3$s een bericht op jouw kanaal geplaatst"
-#: ../../Zotlabs/Module/Events.php:687
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Week"
+#: ../../Zotlabs/Lib/Enotify.php:304
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s heeft een bericht op [zrl=%3$s]jouw kanaal[/zrl] geplaatst"
-#: ../../Zotlabs/Module/Events.php:688
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Dag"
+#: ../../Zotlabs/Lib/Enotify.php:328
+#, php-format
+msgid "[$Projectname:Notify] %s tagged you"
+msgstr "[$Projectname:Notificatie] %s heeft jou genoemd"
-#: ../../Zotlabs/Module/Events.php:722
-msgid "Event removed"
-msgstr "Gebeurtenis verwijderd"
+#: ../../Zotlabs/Lib/Enotify.php:329
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s noemde jou op %3$s"
-#: ../../Zotlabs/Module/Events.php:725
-msgid "Failed to remove event"
-msgstr "Verwijderen gebeurtenis mislukt"
+#: ../../Zotlabs/Lib/Enotify.php:330
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]noemde jou[/zrl]."
-#: ../../Zotlabs/Lib/Chatroom.php:27
-msgid "Missing room name"
-msgstr "Naam chatkanaal ontbreekt"
+#: ../../Zotlabs/Lib/Enotify.php:342
+#, php-format
+msgid "[$Projectname:Notify] %1$s poked you"
+msgstr "[$Projectname:Notificatie] %1$s heeft jou aangestoten"
-#: ../../Zotlabs/Lib/Chatroom.php:36
-msgid "Duplicate room name"
-msgstr "Naam chatkanaal bestaat al"
+#: ../../Zotlabs/Lib/Enotify.php:343
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s heeft je aangestoten op %3$s"
-#: ../../Zotlabs/Lib/Chatroom.php:86 ../../Zotlabs/Lib/Chatroom.php:94
-msgid "Invalid room specifier."
-msgstr "Ongeldige omschrijving chatkanaal"
+#: ../../Zotlabs/Lib/Enotify.php:344
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]heeft je aangestoten[/zrl]."
-#: ../../Zotlabs/Lib/Chatroom.php:126
-msgid "Room not found."
-msgstr "Chatkanaal niet gevonden"
+#: ../../Zotlabs/Lib/Enotify.php:360
+#, php-format
+msgid "[$Projectname:Notify] %s tagged your post"
+msgstr "[$Projectname:Notificatie] %s heeft jouw bericht getagd"
-#: ../../Zotlabs/Lib/Chatroom.php:147
-msgid "Room is full"
-msgstr "Chatkanaal is vol"
+#: ../../Zotlabs/Lib/Enotify.php:361
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s heeft jouw bericht om %3$s getagd"
+
+#: ../../Zotlabs/Lib/Enotify.php:362
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s heeft [zrl=%3$s]jouw bericht[/zrl] getagd"
+
+#: ../../Zotlabs/Lib/Enotify.php:374
+msgid "[$Projectname:Notify] Introduction received"
+msgstr "[$Projectname:Notificatie] Connectieverzoek ontvangen"
+
+#: ../../Zotlabs/Lib/Enotify.php:375
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een nieuw connectieverzoek ontvangen van '%2$s' op %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:376
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, je hebt een [zrl=%2$s]nieuw connectieverzoek[/zrl] ontvangen van %3$s."
+
+#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Je kan het profiel bekijken op %s"
+
+#: ../../Zotlabs/Lib/Enotify.php:382
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Bezoek %s om het connectieverzoek te accepteren of af te wijzen."
+
+#: ../../Zotlabs/Lib/Enotify.php:389
+msgid "[$Projectname:Notify] Friend suggestion received"
+msgstr "[$Projectname:Notificatie] Kanaalvoorstel ontvangen"
+
+#: ../../Zotlabs/Lib/Enotify.php:390
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een kanaalvoorstel ontvangen van '%2$s' om %3$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:391
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, je hebt [zrl=%2$s]een kanaalvoorstel[/zrl] ontvangen voor %3$s van %4$s."
+
+#: ../../Zotlabs/Lib/Enotify.php:397
+msgid "Name:"
+msgstr "Naam:"
+
+#: ../../Zotlabs/Lib/Enotify.php:398
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../Zotlabs/Lib/Enotify.php:401
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bezoek %s om het voorstel te accepteren of af te wijzen."
+
+#: ../../Zotlabs/Lib/Enotify.php:619
+msgid "[$Projectname:Notify]"
+msgstr "[$Projectname:Notificatie]"
+
+#: ../../Zotlabs/Lib/Enotify.php:779
+msgid "created a new post"
+msgstr "maakte een nieuw bericht aan"
+
+#: ../../Zotlabs/Lib/Enotify.php:780
+#, php-format
+msgid "commented on %s's post"
+msgstr "gaf een reactie op een bericht van %s"
#: ../../Zotlabs/Lib/PermissionDescription.php:34
#: ../../include/acl_selectors.php:128
@@ -6972,7 +7492,7 @@ msgid "Visible to your default audience"
msgstr "Voor iedereen zichtbaar, mits niet anders ingesteld"
#: ../../Zotlabs/Lib/PermissionDescription.php:107
-#: ../../include/acl_selectors.php:191
+#: ../../include/acl_selectors.php:201
msgid "Only me"
msgstr "Alleen ik"
@@ -7029,6 +7549,89 @@ msgstr "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's
msgid "This is your default setting for the audience of your webpages"
msgstr "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken"
+#: ../../Zotlabs/Lib/NativeWikiPage.php:31
+#: ../../Zotlabs/Lib/NativeWikiPage.php:70
+msgid "(No Title)"
+msgstr "(Geen titel)"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:84
+msgid "Wiki page create failed."
+msgstr "Aanmaken wiki-pagina mislukt."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:97
+msgid "Wiki not found."
+msgstr "Wiki niet gevonden"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:108
+msgid "Destination name already exists"
+msgstr "Naam van doel bestaat al"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:134
+#: ../../Zotlabs/Lib/NativeWikiPage.php:361
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:164
+msgid "Error reading page content"
+msgstr "Fout tijdens lezen pagina-inhoud"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:346
+#: ../../Zotlabs/Lib/NativeWikiPage.php:399
+#: ../../Zotlabs/Lib/NativeWikiPage.php:466
+#: ../../Zotlabs/Lib/NativeWikiPage.php:507
+msgid "Error reading wiki"
+msgstr "Fout tijdens lezen wiki"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:387
+msgid "Page update failed."
+msgstr "Bijwerken van pagina mislukt."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:421
+msgid "Nothing deleted"
+msgstr "Niets verwijderd"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:487
+msgid "Compare: object not found."
+msgstr "Vergelijken: object niet gevonden."
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:493
+msgid "Page updated"
+msgstr "Pagina bijgewerkt"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:496
+msgid "Untitled"
+msgstr "Naamloos"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:502
+msgid "Wiki resource_id required for git commit"
+msgstr "Resource_id wiki voor git commit vereist"
+
+#: ../../Zotlabs/Lib/NativeWikiPage.php:573
+#: ../../extend/addon/addon/gitwiki/gitwiki_backend.php:579
+#: ../../include/bbcode.php:610 ../../include/bbcode.php:756
+msgid "Different viewers will see this text differently"
+msgstr "Deze tekst wordt per persoon anders weergeven."
+
+#: ../../Zotlabs/Lib/Permcat.php:58
+msgctxt "permcat"
+msgid "default"
+msgstr "standaard"
+
+#: ../../Zotlabs/Lib/Permcat.php:96
+msgctxt "permcat"
+msgid "follower"
+msgstr "volger"
+
+#: ../../Zotlabs/Lib/Permcat.php:100
+msgctxt "permcat"
+msgid "contributor"
+msgstr "bijdrager"
+
+#: ../../Zotlabs/Lib/Permcat.php:104
+msgctxt "permcat"
+msgid "publisher"
+msgstr "publichist "
+
#: ../../Zotlabs/Lib/ThreadItem.php:95 ../../include/conversation.php:663
msgid "Private Message"
msgstr "Niet voor iedereen zichtbaar"
@@ -7141,417 +7744,206 @@ msgstr "Kanaal-naar-kanaal"
msgid "via Wall-To-Wall:"
msgstr "via kanaal-naar-kanaal"
-#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:716
+#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:717
#, php-format
msgid "from %s"
msgstr "van %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:719
+#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:720
#, php-format
msgid "last edited: %s"
msgstr "laatst bewerkt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:720
+#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:721
#, php-format
msgid "Expires: %s"
msgstr "Verloopt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:358
+#: ../../Zotlabs/Lib/ThreadItem.php:360
msgid "Attend"
msgstr "Aanwezig"
-#: ../../Zotlabs/Lib/ThreadItem.php:359
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "Attendance Options"
msgstr "Aanwezigheidsopties"
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:362
msgid "Vote"
msgstr "Stem"
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:363
msgid "Voting Options"
msgstr "Stemopties"
-#: ../../Zotlabs/Lib/ThreadItem.php:381
+#: ../../Zotlabs/Lib/ThreadItem.php:383
#: ../../extend/addon/addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Bladwijzers opslaan"
-#: ../../Zotlabs/Lib/ThreadItem.php:382
+#: ../../Zotlabs/Lib/ThreadItem.php:384
msgid "Add to Calendar"
msgstr "Aan agenda toevoegen"
-#: ../../Zotlabs/Lib/ThreadItem.php:391
+#: ../../Zotlabs/Lib/ThreadItem.php:393
msgid "Mark all seen"
msgstr "Markeer alles als bekeken"
-#: ../../Zotlabs/Lib/ThreadItem.php:440 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:442 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s alle"
-#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../include/conversation.php:1237
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1385
msgid "Bold"
msgstr "Vet"
-#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1238
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1386
msgid "Italic"
msgstr "Cursief"
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1239
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1387
msgid "Underline"
msgstr "Onderstrepen"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1240
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1388
msgid "Quote"
msgstr "Citeren"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1241
+#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1389
msgid "Code"
msgstr "Broncode"
-#: ../../Zotlabs/Lib/ThreadItem.php:735
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Image"
msgstr "Afbeelding"
-#: ../../Zotlabs/Lib/ThreadItem.php:736
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Insert Link"
msgstr "Link invoegen"
-#: ../../Zotlabs/Lib/ThreadItem.php:737
+#: ../../Zotlabs/Lib/ThreadItem.php:739
msgid "Video"
msgstr "Video"
-#: ../../Zotlabs/Lib/Apps.php:207
+#: ../../Zotlabs/Lib/NativeWiki.php:126
+msgid "Wiki files deleted successfully"
+msgstr "Verwijderen wiki-bestanden geslaagd"
+
+#: ../../Zotlabs/Lib/Apps.php:212
msgid "Site Admin"
msgstr "Hubbeheerder"
-#: ../../Zotlabs/Lib/Apps.php:208
+#: ../../Zotlabs/Lib/Apps.php:213
#: ../../extend/addon/addon/buglink/buglink.php:16
msgid "Report Bug"
msgstr "Bugrapport indienen"
-#: ../../Zotlabs/Lib/Apps.php:209
+#: ../../Zotlabs/Lib/Apps.php:214
msgid "View Bookmarks"
msgstr "Bladwijzers bekijken"
-#: ../../Zotlabs/Lib/Apps.php:210
+#: ../../Zotlabs/Lib/Apps.php:215
msgid "My Chatrooms"
msgstr "Mijn chatkanalen"
-#: ../../Zotlabs/Lib/Apps.php:212
+#: ../../Zotlabs/Lib/Apps.php:217
msgid "Firefox Share"
msgstr "Firefox Share"
-#: ../../Zotlabs/Lib/Apps.php:213
+#: ../../Zotlabs/Lib/Apps.php:218
msgid "Remote Diagnostics"
msgstr "Diagnose op afstand"
-#: ../../Zotlabs/Lib/Apps.php:214 ../../include/features.php:319
+#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
msgid "Suggest Channels"
msgstr "Kanalen voorstellen"
-#: ../../Zotlabs/Lib/Apps.php:215 ../../include/nav.php:115
-#: ../../boot.php:1720
+#: ../../Zotlabs/Lib/Apps.php:220 ../../include/nav.php:130
+#: ../../boot.php:1749
msgid "Login"
msgstr "Inloggen"
-#: ../../Zotlabs/Lib/Apps.php:217 ../../include/nav.php:182
+#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:194
msgid "Grid"
msgstr "Grid"
-#: ../../Zotlabs/Lib/Apps.php:221 ../../include/features.php:99
-#: ../../include/conversation.php:1740
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1903
+#: ../../include/features.php:99
msgid "Wiki"
msgstr "Wiki"
-#: ../../Zotlabs/Lib/Apps.php:222 ../../include/nav.php:185
+#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:198
msgid "Channel Home"
msgstr "Jouw kanaal"
-#: ../../Zotlabs/Lib/Apps.php:225 ../../include/nav.php:204
-#: ../../include/conversation.php:1691 ../../include/conversation.php:1694
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1853
+#: ../../include/conversation.php:1856 ../../include/nav.php:218
msgid "Events"
msgstr "Agenda"
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/nav.php:170
+#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:182
msgid "Directory"
msgstr "Kanalengids"
-#: ../../Zotlabs/Lib/Apps.php:228 ../../include/nav.php:196
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:210
msgid "Mail"
msgstr "Privéberichten"
-#: ../../Zotlabs/Lib/Apps.php:231 ../../include/nav.php:99
+#: ../../Zotlabs/Lib/Apps.php:236
msgid "Chat"
msgstr "Chatten"
-#: ../../Zotlabs/Lib/Apps.php:233
+#: ../../Zotlabs/Lib/Apps.php:238
msgid "Probe"
msgstr "Onderzoeken"
-#: ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Lib/Apps.php:239
msgid "Suggest"
msgstr "Voorstellen"
-#: ../../Zotlabs/Lib/Apps.php:235
+#: ../../Zotlabs/Lib/Apps.php:240
msgid "Random Channel"
msgstr "Willekeurig kanaal"
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:241
msgid "Invite"
msgstr "Uitnodigen "
-#: ../../Zotlabs/Lib/Apps.php:237 ../../include/widgets.php:1565
+#: ../../Zotlabs/Lib/Apps.php:242 ../../include/widgets.php:1638
msgid "Features"
msgstr "Extra functies"
-#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Lib/Apps.php:243
#: ../../extend/addon/addon/openid/MysqlProvider.php:69
msgid "Language"
msgstr "Taal"
-#: ../../Zotlabs/Lib/Apps.php:239
+#: ../../Zotlabs/Lib/Apps.php:244
msgid "Post"
msgstr "Bericht"
-#: ../../Zotlabs/Lib/Apps.php:240
+#: ../../Zotlabs/Lib/Apps.php:245
#: ../../extend/addon/addon/openid/MysqlProvider.php:58
#: ../../extend/addon/addon/openid/MysqlProvider.php:59
#: ../../extend/addon/addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Profielfoto"
-#: ../../Zotlabs/Lib/Apps.php:344
+#: ../../Zotlabs/Lib/Apps.php:355
msgid "Purchase"
msgstr "Aanschaffen"
-#: ../../Zotlabs/Lib/Apps.php:348
+#: ../../Zotlabs/Lib/Apps.php:359
msgid "Undelete"
msgstr "Verwijdering ongedaan maken"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1914
-msgid "$Projectname Notification"
-msgstr "$Projectname-notificatie"
-
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../extend/addon/addon/diaspora/p.php:46
-#: ../../extend/addon/addon/diaspora/util.php:218
-#: ../../extend/addon/addon/diaspora/util.php:231
-#: ../../include/network.php:1915
-msgid "$projectname"
-msgstr "$projectname"
-
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1917
-msgid "Thank You,"
-msgstr "Bedankt,"
-
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1919
-#, php-format
-msgid "%s Administrator"
-msgstr "Beheerder %s"
-
-#: ../../Zotlabs/Lib/Enotify.php:116
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
-
-#: ../../Zotlabs/Lib/Enotify.php:120
-#, php-format
-msgid "[$Projectname:Notify] New mail received at %s"
-msgstr "[$Projectname:Notificatie] Nieuw privébericht ontvangen op %s"
-
-#: ../../Zotlabs/Lib/Enotify.php:122
-#, php-format
-msgid "%1$s, %2$s sent you a new private message at %3$s."
-msgstr "%1$s, %2$s zond jou een nieuw privébericht om %3$s."
-
-#: ../../Zotlabs/Lib/Enotify.php:123
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s zond jou %2$s."
+#: ../../Zotlabs/Lib/Apps.php:364
+msgid "Add to app-tray"
+msgstr "Aan appmenu toevoegen"
-#: ../../Zotlabs/Lib/Enotify.php:123
-msgid "a private message"
-msgstr "een privébericht"
-
-#: ../../Zotlabs/Lib/Enotify.php:124
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bezoek %s om je privéberichten te bekijken en/of er op te reageren."
-
-#: ../../Zotlabs/Lib/Enotify.php:183
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %4$s[/zrl]"
-
-#: ../../Zotlabs/Lib/Enotify.php:191
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %5$s van %4$s[/zrl]"
-
-#: ../../Zotlabs/Lib/Enotify.php:200
-#, php-format
-msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]jouw %4$s[/zrl]"
-
-#: ../../Zotlabs/Lib/Enotify.php:211
-#, php-format
-msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[$Projectname:Notificatie] %2$s gaf een reactie in conversatie #%1$d"
-
-#: ../../Zotlabs/Lib/Enotify.php:212
-#, php-format
-msgid "%1$s, %2$s commented on an item/conversation you have been following."
-msgstr "%1$s, %2$s gaf een reactie in een conversatie die jij volgt."
-
-#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
-#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
-#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bezoek %s om de conversatie te bekijken en/of er op te reageren."
-
-#: ../../Zotlabs/Lib/Enotify.php:273
-#, php-format
-msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
-msgstr "%1$s, %2$s vindt [zrl=%3$s]jouw %4$s[/zrl] leuk"
-
-#: ../../Zotlabs/Lib/Enotify.php:288
-#, php-format
-msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
-msgstr "[$Projectname:Notificatie] %2$s vindt iets leuk in conversatie #%1$d"
-
-#: ../../Zotlabs/Lib/Enotify.php:289
-#, php-format
-msgid "%1$s, %2$s liked an item/conversation you created."
-msgstr "%1$s, %2$s vindt iets leuk in een conversatie die jij bent gestart."
-
-#: ../../Zotlabs/Lib/Enotify.php:300
-#, php-format
-msgid "[$Projectname:Notify] %s posted to your profile wall"
-msgstr "[$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst"
-
-#: ../../Zotlabs/Lib/Enotify.php:302
-#, php-format
-msgid "%1$s, %2$s posted to your profile wall at %3$s"
-msgstr "%1$s, %2$s heeft om %3$s een bericht op jouw kanaal geplaatst"
-
-#: ../../Zotlabs/Lib/Enotify.php:304
-#, php-format
-msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
-msgstr "%1$s, %2$s heeft een bericht op [zrl=%3$s]jouw kanaal[/zrl] geplaatst"
-
-#: ../../Zotlabs/Lib/Enotify.php:328
-#, php-format
-msgid "[$Projectname:Notify] %s tagged you"
-msgstr "[$Projectname:Notificatie] %s heeft jou genoemd"
-
-#: ../../Zotlabs/Lib/Enotify.php:329
-#, php-format
-msgid "%1$s, %2$s tagged you at %3$s"
-msgstr "%1$s, %2$s noemde jou op %3$s"
-
-#: ../../Zotlabs/Lib/Enotify.php:330
-#, php-format
-msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%3$s]noemde jou[/zrl]."
-
-#: ../../Zotlabs/Lib/Enotify.php:342
-#, php-format
-msgid "[$Projectname:Notify] %1$s poked you"
-msgstr "[$Projectname:Notificatie] %1$s heeft jou aangestoten"
-
-#: ../../Zotlabs/Lib/Enotify.php:343
-#, php-format
-msgid "%1$s, %2$s poked you at %3$s"
-msgstr "%1$s, %2$s heeft je aangestoten op %3$s"
-
-#: ../../Zotlabs/Lib/Enotify.php:344
-#, php-format
-msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
-msgstr "%1$s, %2$s [zrl=%2$s]heeft je aangestoten[/zrl]."
-
-#: ../../Zotlabs/Lib/Enotify.php:360
-#, php-format
-msgid "[$Projectname:Notify] %s tagged your post"
-msgstr "[$Projectname:Notificatie] %s heeft jouw bericht getagd"
-
-#: ../../Zotlabs/Lib/Enotify.php:361
-#, php-format
-msgid "%1$s, %2$s tagged your post at %3$s"
-msgstr "%1$s, %2$s heeft jouw bericht om %3$s getagd"
-
-#: ../../Zotlabs/Lib/Enotify.php:362
-#, php-format
-msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
-msgstr "%1$s, %2$s heeft [zrl=%3$s]jouw bericht[/zrl] getagd"
-
-#: ../../Zotlabs/Lib/Enotify.php:374
-msgid "[$Projectname:Notify] Introduction received"
-msgstr "[$Projectname:Notificatie] Connectieverzoek ontvangen"
-
-#: ../../Zotlabs/Lib/Enotify.php:375
-#, php-format
-msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
-msgstr "%1$s, je hebt een nieuw connectieverzoek ontvangen van '%2$s' op %3$s"
-
-#: ../../Zotlabs/Lib/Enotify.php:376
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
-msgstr "%1$s, je hebt een [zrl=%2$s]nieuw connectieverzoek[/zrl] ontvangen van %3$s."
-
-#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Je kan het profiel bekijken op %s"
-
-#: ../../Zotlabs/Lib/Enotify.php:382
-#, php-format
-msgid "Please visit %s to approve or reject the connection request."
-msgstr "Bezoek %s om het connectieverzoek te accepteren of af te wijzen."
-
-#: ../../Zotlabs/Lib/Enotify.php:389
-msgid "[$Projectname:Notify] Friend suggestion received"
-msgstr "[$Projectname:Notificatie] Kanaalvoorstel ontvangen"
-
-#: ../../Zotlabs/Lib/Enotify.php:390
-#, php-format
-msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
-msgstr "%1$s, je hebt een kanaalvoorstel ontvangen van '%2$s' om %3$s"
-
-#: ../../Zotlabs/Lib/Enotify.php:391
-#, php-format
-msgid ""
-"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
-"%4$s."
-msgstr "%1$s, je hebt [zrl=%2$s]een kanaalvoorstel[/zrl] ontvangen voor %3$s van %4$s."
-
-#: ../../Zotlabs/Lib/Enotify.php:397
-msgid "Name:"
-msgstr "Naam:"
-
-#: ../../Zotlabs/Lib/Enotify.php:398
-msgid "Photo:"
-msgstr "Foto:"
-
-#: ../../Zotlabs/Lib/Enotify.php:401
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bezoek %s om het voorstel te accepteren of af te wijzen."
-
-#: ../../Zotlabs/Lib/Enotify.php:619
-msgid "[$Projectname:Notify]"
-msgstr "[$Projectname:Notificatie]"
-
-#: ../../Zotlabs/Lib/Enotify.php:779
-msgid "created a new post"
-msgstr "maakte een nieuw bericht aan"
-
-#: ../../Zotlabs/Lib/Enotify.php:780
-#, php-format
-msgid "commented on %s's post"
-msgstr "gaf een reactie op een bericht van %s"
+#: ../../Zotlabs/Lib/Apps.php:365
+msgid "Remove from app-tray"
+msgstr "Uit appmenu verwijderen"
#: ../../extend/addon/addon/adultphotoflag/adultphotoflag.php:24
msgid "Flag Adult Photos"
@@ -7609,27 +8001,36 @@ msgstr "Toon voor linkshandige gitaar"
msgid "Quick Reference"
msgstr "Beknopt overzicht"
-#: ../../extend/addon/addon/diaspora/diaspora.php:671
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:16
+msgid "No username found in import file."
+msgstr "Geen gebruikersnaam in het importbestand gevonden."
+
+#: ../../extend/addon/addon/diaspora/import_diaspora.php:41
+#: ../../include/import.php:51
+msgid "Unable to create a unique channel address. Import failed."
+msgstr "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt."
+
+#: ../../extend/addon/addon/diaspora/diaspora.php:677
msgid "Diaspora Protocol Settings updated."
msgstr "Diaspora-protocol-instellingen bijgewerkt."
-#: ../../extend/addon/addon/diaspora/diaspora.php:692
+#: ../../extend/addon/addon/diaspora/diaspora.php:696
msgid "Enable the Diaspora protocol for this channel"
msgstr "Het Diaspora-protocol voor dit kanaal inschakelen"
-#: ../../extend/addon/addon/diaspora/diaspora.php:696
+#: ../../extend/addon/addon/diaspora/diaspora.php:700
msgid "Allow any Diaspora member to comment on your public posts"
msgstr "Geef elk Diaspora-lid toestemming om op jouw openbare berichten te reageren"
-#: ../../extend/addon/addon/diaspora/diaspora.php:700
+#: ../../extend/addon/addon/diaspora/diaspora.php:704
msgid "Prevent your hashtags from being redirected to other sites"
msgstr "Voorkom dat jouw hashtags naar andere websites worden doorverwezen"
-#: ../../extend/addon/addon/diaspora/diaspora.php:705
+#: ../../extend/addon/addon/diaspora/diaspora.php:709
msgid "Followed hashtags (comma separated, do not include the #)"
msgstr "Gevolgde hashtags (door komma's gescheiden lijst, zonder de #)"
-#: ../../extend/addon/addon/diaspora/diaspora.php:710
+#: ../../extend/addon/addon/diaspora/diaspora.php:714
msgid "Diaspora Protocol Settings"
msgstr "Diaspora-protocol (incl. Friendica)"
@@ -7772,7 +8173,7 @@ msgstr "Speciale dank gaat naar: "
#: ../../extend/addon/addon/dwpost/dwpost.php:42
msgid "Post to Dreamwidth"
-msgstr "Doorplaatsen naar Dreamwidth"
+msgstr "Dreamwidth"
#: ../../extend/addon/addon/dwpost/dwpost.php:73
msgid "Enable Dreamwidth Post Plugin"
@@ -7792,7 +8193,7 @@ msgstr "Standaard doorplaatsen naar Dreamwidth"
#: ../../extend/addon/addon/dwpost/dwpost.php:89
msgid "Dreamwidth Post Settings"
-msgstr "Doorplaatsen naar Dreamwidth"
+msgstr "Dreamwidth (berichten doorplaatsen)"
#: ../../extend/addon/addon/flattrwidget/flattrwidget.php:45
msgid "Flattr this!"
@@ -8112,7 +8513,7 @@ msgid "Add a personal note:"
msgstr "Add a personal note:"
#: ../../extend/addon/addon/friendica/dfrn_request.php:871
-#: ../../include/network.php:2232 ../../include/network.php:2233
+#: ../../include/network.php:2265 ../../include/network.php:2266
msgid "Friendica"
msgstr "Friendica"
@@ -8121,7 +8522,7 @@ msgid "StatusNet/Federated Social Web"
msgstr "StatusNet/Federated Social Web"
#: ../../extend/addon/addon/friendica/dfrn_request.php:873
-#: ../../include/network.php:2238
+#: ../../include/network.php:2271
msgid "Diaspora"
msgstr "Diaspora"
@@ -8141,7 +8542,7 @@ msgid "Submit Request"
msgstr "Submit Request"
#: ../../extend/addon/addon/friendica/friendica.php:113
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:114
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:118
msgid "GNU-Social Protocol Settings updated."
msgstr "GNU social-protocol-instellingen bijgewerkt."
@@ -8150,17 +8551,17 @@ msgid "Enable the (experimental) GNU-Social protocol for this channel"
msgstr "GNU social-protocol voor dit kanaal inschakelen (experimenteel)"
#: ../../extend/addon/addon/friendica/friendica.php:128
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:133
msgid "GNU-Social Protocol Settings"
msgstr "GNU social-protocol"
#: ../../extend/addon/addon/friendica/friendica.php:185
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:319
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:323
msgid "Follow"
msgstr "Volgen"
#: ../../extend/addon/addon/friendica/friendica.php:188
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:322
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:326
#, php-format
msgid "%1$s is now following %2$s"
msgstr "%1$s volgt nu %2$s"
@@ -8185,10 +8586,6 @@ msgstr "Gebruikersnaam Friendica"
msgid "Friendica Login Password"
msgstr "Wachtwoord Friendica"
-#: ../../extend/addon/addon/gnusoc/gnusoc.php:125
-msgid "Enable the GNU-Social protocol for this channel"
-msgstr "GNU social-protocol voor dit kanaal inschakelen"
-
#: ../../extend/addon/addon/hubwall/hubwall.php:19
msgid "Send email to all members"
msgstr "Naar alle leden e-mail versturen"
@@ -8227,7 +8624,7 @@ msgstr "Testmodus (alleen naar hubbeheerder sturen)"
#: ../../extend/addon/addon/ijpost/ijpost.php:42
msgid "Post to Insanejournal"
-msgstr "Doorplaatsen naar InsaneJournal"
+msgstr "InsaneJournal"
#: ../../extend/addon/addon/ijpost/ijpost.php:73
msgid "Enable InsaneJournal Post Plugin"
@@ -8247,7 +8644,7 @@ msgstr "Standaard doorplaatsen naar InsaneJournal"
#: ../../extend/addon/addon/ijpost/ijpost.php:89
msgid "InsaneJournal Post Settings"
-msgstr "Doorplaatsen naar InsaneJournal"
+msgstr "InsaneJournal (berichten doorplaatsen)"
#: ../../extend/addon/addon/ijpost/ijpost.php:104
msgid "Insane Journal Settings saved."
@@ -8280,7 +8677,7 @@ msgid "IRC Chatroom"
msgstr "IRC-chatkanaal"
#: ../../extend/addon/addon/jappixmini/jappixmini.php:305
-#: ../../include/channel.php:1056 ../../include/channel.php:1218
+#: ../../include/channel.php:1139 ../../include/channel.php:1301
msgid "Status:"
msgstr "Status:"
@@ -8330,11 +8727,6 @@ msgstr "Purge internal list of jabber addresses of contacts"
msgid "Configuration Help"
msgstr "Configuratiehulp"
-#: ../../extend/addon/addon/jappixmini/jappixmini.php:368
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1149
-msgid "Add Contact"
-msgstr "Contact toevoegen"
-
#: ../../extend/addon/addon/jappixmini/jappixmini.php:371
msgid "Jappix Mini Settings"
msgstr "Jappix Mini"
@@ -8381,7 +8773,7 @@ msgstr "Authenticatie geslaagd, maar afgekeurd: aanmaken accounts uitgeschakeld.
#: ../../extend/addon/addon/libertree/libertree.php:38
msgid "Post to Libertree"
-msgstr "Doorplaatsen naar Libertree"
+msgstr "Libertree"
#: ../../extend/addon/addon/libertree/libertree.php:69
msgid "Enable Libertree Post Plugin"
@@ -8401,7 +8793,7 @@ msgstr "Standaard doorplaatsen naar Libertree"
#: ../../extend/addon/addon/libertree/libertree.php:85
msgid "Libertree Post Settings"
-msgstr "Doorplaatsen naar Libertree"
+msgstr "Libertree (berichten doorplaatsen)"
#: ../../extend/addon/addon/libertree/libertree.php:99
msgid "Libertree Settings saved."
@@ -8409,7 +8801,7 @@ msgstr "Libertree-instellingen opgeslagen."
#: ../../extend/addon/addon/ljpost/ljpost.php:42
msgid "Post to LiveJournal"
-msgstr "Doorplaatsen naar LiveJournal"
+msgstr "LiveJournal"
#: ../../extend/addon/addon/ljpost/ljpost.php:70
msgid "Enable LiveJournal Post Plugin"
@@ -8425,11 +8817,11 @@ msgstr "Wachtwoord LiveJournal"
#: ../../extend/addon/addon/ljpost/ljpost.php:82
msgid "Post to LiveJournal by default"
-msgstr "Standaard doorplaatsen naar "
+msgstr "Standaard doorplaatsen naar LiveJournal"
#: ../../extend/addon/addon/ljpost/ljpost.php:86
msgid "LiveJournal Post Settings"
-msgstr "Doorplaatsen naar LiveJournal"
+msgstr "LiveJournal (berichten doorplaatsen)"
#: ../../extend/addon/addon/ljpost/ljpost.php:101
msgid "LiveJournal Settings saved."
@@ -8767,8 +9159,8 @@ msgid "Comma separated list of keywords to hide"
msgstr "Door komma's gescheiden lijst met woorden die gefilterd moeten worden."
#: ../../extend/addon/addon/nsfw/nsfw.php:88
-msgid "Use /expression/ to provide regular expressions"
-msgstr "Gebruik /expressie/ voor reguliere expressies"
+msgid "Word, /regular-expression/, lang=xx, lang!=xx"
+msgstr "Woord, /reguliere expressie/, lang=xx, lang!=xx"
#: ../../extend/addon/addon/nsfw/nsfw.php:92
msgid "Not Safe For Work Settings"
@@ -8788,109 +9180,109 @@ msgstr "Mogelijk inhoud voor volwassenen"
#: ../../extend/addon/addon/nsfw/nsfw.php:211
#, php-format
-msgid "%s - click to open/close"
-msgstr "%s - Klik om te openen of te sluiten"
+msgid "%s - view"
+msgstr "%s - tonen"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:49
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:127
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:50
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:128
msgid "System defaults:"
msgstr "Systeemstandaarden:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
msgid "Preferred Clipart IDs"
msgstr "Voorkeursclipart"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:53
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
msgid "List of preferred clipart ids. These will be shown first."
msgstr "Lijst met clipartnummers die als eerste moeten worden getoond."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
msgid "Default Search Term"
msgstr "Standaard zoekterm"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:54
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
msgid "The default search term. These will be shown second."
msgstr "Standaard zoekterm. Deze worden als tweede getoond."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
msgid "Return After"
msgstr "Ga na afloop naar"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:55
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:56
msgid "Page to load after image selection."
msgstr "Pagina die na het kiezen van een afbeelding moet laden."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:57
-#: ../../include/channel.php:965 ../../include/nav.php:93
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+#: ../../include/nav.php:107 ../../include/channel.php:1048
msgid "Edit Profile"
msgstr "Profiel bewerken"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:58
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:59
msgid "Profile List"
msgstr "Profiellijst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
msgid "Order of Preferred"
msgstr "Voorkeursclipart sorteren op"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:60
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
msgid "Sort order of preferred clipart ids."
msgstr "Als eerste getoonde clipart hierop sorteren."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:61
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:62
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
msgid "Newest first"
msgstr "Nieuwste eerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:64
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:65
msgid "As entered"
msgstr "Zoals ingevoerd"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
msgid "Order of other"
msgstr "Overige clipart sorteren op"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:66
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:67
msgid "Sort order of other clipart ids."
msgstr "Overige clipart hierop sorteren."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:68
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
msgid "Most downloaded first"
msgstr "Meest gedownload eerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:69
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:70
msgid "Most liked first"
msgstr "Meest geliked eerst"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
msgid "Preferred IDs Message"
msgstr "Tekst voorkeursclipart"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:71
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:72
msgid "Message to display above preferred results."
msgstr "Tekst die bovenaan de resultaten met voorkeursclipart moet worden getoond."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
msgid "Uploaded by: "
msgstr "Geüpload door: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:77
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:78
msgid "Drawn by: "
msgstr "Getekend door: "
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:191
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:192
msgid "Or select from a free OpenClipart.org image:"
msgstr "Of kies uit een vrije OpenClipart.org-afbeelding:"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:194
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:195
msgid "Search Term"
msgstr "Zoekterm"
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:216
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:232
msgid "Unknown error. Please try again later."
msgstr "Onbekende fout. Probeer later nog eens."
-#: ../../extend/addon/addon/openclipatar/openclipatar.php:303
+#: ../../extend/addon/addon/openclipatar/openclipatar.php:308
msgid "Profile photo updated successfully."
msgstr "Bijwerken profielfoto geslaagd."
@@ -9013,7 +9405,7 @@ msgstr "Ga terug naar pagina met plugin-instellingen"
#: ../../extend/addon/addon/pumpio/pumpio.php:163
msgid "Post to Pump.io"
-msgstr "Doorplaatsen naar Pump.io"
+msgstr "Pump.io"
#: ../../extend/addon/addon/pumpio/pumpio.php:198
msgid "Pump.io servername"
@@ -9057,7 +9449,7 @@ msgstr "Alle openbare berichten doorplaatsen"
#: ../../extend/addon/addon/pumpio/pumpio.php:237
msgid "Pump.io Post Settings"
-msgstr "Doorplaatsen naar Pump.io"
+msgstr "Pump.io (berichten doorplaatsen)"
#: ../../extend/addon/addon/pumpio/pumpio.php:266
msgid "PumpIO Settings saved."
@@ -9160,16 +9552,12 @@ msgstr "0 of leeg om alles te importeren"
#: ../../extend/addon/addon/redred/redred.php:45
msgid "Post to Red"
-msgstr "Doorplaatsen naar Hubzilla"
+msgstr "Hubzilla"
#: ../../extend/addon/addon/redred/redred.php:60
msgid "Channel is required."
msgstr "Een kanaal is vereist."
-#: ../../extend/addon/addon/redred/redred.php:65
-msgid "Invalid channel."
-msgstr "Onbekend kanaal."
-
#: ../../extend/addon/addon/redred/redred.php:76
msgid "redred Settings saved."
msgstr "RedRed-instellingen opgeslagen."
@@ -9206,11 +9594,11 @@ msgstr "Bijnaam"
#: ../../extend/addon/addon/redred/redred.php:119
msgid "Hubzilla Crosspost Settings"
-msgstr "Doorplaatsen naar Hubzilla"
+msgstr "Hubzilla (berichten doorplaatsen)"
#: ../../extend/addon/addon/rtof/rtof.php:45
msgid "Post to Friendica"
-msgstr "Doorplaatsen naar Friendica"
+msgstr "Friendica"
#: ../../extend/addon/addon/rtof/rtof.php:62
msgid "rtof Settings saved."
@@ -9238,7 +9626,7 @@ msgstr "Wachtwoord Friendica"
#: ../../extend/addon/addon/rtof/rtof.php:101
msgid "Hubzilla to Friendica Post Settings"
-msgstr "Doorplaatsen naar Friendica"
+msgstr "Friendica (berichten doorplaatsen)"
#: ../../extend/addon/addon/sendzid/sendzid.php:25
msgid "Extended Identity Sharing"
@@ -9291,7 +9679,7 @@ msgstr "Startpagina"
#: ../../extend/addon/addon/statusnet/statusnet.php:143
msgid "Post to GNU social"
-msgstr "Doorplaatsen naar GNU social"
+msgstr "GNU social"
#: ../../extend/addon/addon/statusnet/statusnet.php:195
msgid ""
@@ -9419,7 +9807,7 @@ msgstr "OAuth-configuratie wissen"
#: ../../extend/addon/addon/statusnet/statusnet.php:432
msgid "GNU social Post Settings"
-msgstr "Doorplaatsen naar GNU social"
+msgstr "GNU social (berichten doorplaatsen)"
#: ../../extend/addon/addon/statusnet/statusnet.php:891
msgid "API URL"
@@ -9429,23 +9817,23 @@ msgstr "API-URL"
msgid "Application name"
msgstr "Naam applicatie"
-#: ../../extend/addon/addon/superblock/superblock.php:110
+#: ../../extend/addon/addon/superblock/superblock.php:112
msgid "Currently blocked"
msgstr "Momenteel geblokkeerd"
-#: ../../extend/addon/addon/superblock/superblock.php:112
+#: ../../extend/addon/addon/superblock/superblock.php:114
msgid "No channels currently blocked"
msgstr "Momenteel geen kanalen geblokkeerd"
-#: ../../extend/addon/addon/superblock/superblock.php:118
+#: ../../extend/addon/addon/superblock/superblock.php:120
msgid "\"Superblock\" Settings"
msgstr "Superblock"
-#: ../../extend/addon/addon/superblock/superblock.php:316
+#: ../../extend/addon/addon/superblock/superblock.php:345
msgid "Block Completely"
msgstr "Volledig blokkeren"
-#: ../../extend/addon/addon/superblock/superblock.php:361
+#: ../../extend/addon/addon/superblock/superblock.php:394
msgid "superblock settings updated"
msgstr "Superblock-instellingen bijgewerkt"
@@ -9588,7 +9976,7 @@ msgstr "Klik hier om tekst, afbeeldingen, video en audio te delen."
#: ../../extend/addon/addon/tour/tour.php:94
msgid "You can write an optional title for your update (good for long posts)."
-msgstr "Je kan optioneel een titel voor je nieuwe bericht verzinnen. Vooral goed voor langere berichten."
+msgstr "Je kan een titel voor je nieuwe bericht verzinnen, maar dit is niet verplicht. Vooral goed voor langere berichten."
#: ../../extend/addon/addon/tour/tour.php:95
msgid "Entering some categories here makes it easier to find your post later."
@@ -9672,7 +10060,7 @@ msgstr "Welkom op Hubzilla! Wil jij een rondleiding hebben langs de gebruikersin
#: ../../extend/addon/addon/twitter/twitter.php:99
msgid "Post to Twitter"
-msgstr "Doorplaatsen naar Twitter"
+msgstr "Twitter"
#: ../../extend/addon/addon/twitter/twitter.php:154
msgid "Twitter settings updated."
@@ -9731,7 +10119,7 @@ msgstr "Wanneer dit is ingeschakeld worden al jouw <strong>openbare</strong> ber
#: ../../extend/addon/addon/twitter/twitter.php:264
msgid "Twitter Post Settings"
-msgstr "Doorplaatsen naar Twitter"
+msgstr "Twitter (berichten doorplaatsen)"
#: ../../extend/addon/addon/twitter/twitter.php:773
#: ../../extend/addon/addon/rendezvous/rendezvous.php:95
@@ -9789,7 +10177,7 @@ msgstr "Wie vindt mij leuk?"
#: ../../extend/addon/addon/wppost/wppost.php:45
msgid "Post to WordPress"
-msgstr "Doorplaatsen naar WordPress"
+msgstr "WordPress"
#: ../../extend/addon/addon/wppost/wppost.php:82
msgid "Enable WordPress Post Plugin"
@@ -9829,7 +10217,7 @@ msgstr "Reacties doorplaatsen (Hubzilla_WP-plugin vereist)"
#: ../../extend/addon/addon/wppost/wppost.php:113
msgid "WordPress Post Settings"
-msgstr "Doorplaatsen naar WordPress"
+msgstr "WordPress (berichten doorplaatsen)"
#: ../../extend/addon/addon/wppost/wppost.php:129
msgid "Wordpress Settings saved."
@@ -9946,71 +10334,6 @@ msgstr "Importeren"
msgid "Select an addressbook to import to"
msgstr "Kies een adresboek om te importeren"
-#: ../../extend/addon/addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Fouten opgetreden tijdens aanmaken databasetabel: "
-
-#: ../../extend/addon/addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Standaard agenda"
-
-#: ../../extend/addon/addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Standaard adresboek"
-
-#: ../../extend/addon/addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "CalDAV/CardDAV-instellingen opgeslagen."
-
-#: ../../extend/addon/addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "CalDAV/CardDAV-server voor dit kanaal inschakelen"
-
-#: ../../extend/addon/addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Jouw CalDAV-URL is %s "
-
-#: ../../extend/addon/addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Jouw CardDAV-URL is %s "
-
-#: ../../extend/addon/addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "CalDAV/CardDAV"
-
-#: ../../extend/addon/addon/cdav/cdav.php:270
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1145
-msgid "Mobile"
-msgstr "Mobiel"
-
-#: ../../extend/addon/addon/cdav/cdav.php:271
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1146 ../../include/nav.php:88
-msgid "Home"
-msgstr "Thuis"
-
-#: ../../extend/addon/addon/cdav/cdav.php:272
-msgid "Home, Voice"
-msgstr "Thuis, spraak"
-
-#: ../../extend/addon/addon/cdav/cdav.php:273
-msgid "Home, Fax"
-msgstr "Thuis, fax"
-
-#: ../../extend/addon/addon/cdav/cdav.php:274
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1147
-msgid "Work"
-msgstr "Werk"
-
-#: ../../extend/addon/addon/cdav/cdav.php:275
-msgid "Work, Voice"
-msgstr "Werk, spraak"
-
-#: ../../extend/addon/addon/cdav/cdav.php:276
-msgid "Work, Fax"
-msgstr "Werk, fax"
-
#: ../../extend/addon/addon/cdav/Mod_Cdav.php:744
msgid "INVALID EVENT DISMISSED!"
msgstr "ONGELDIGE GEBEURTENIS VERWIJDERD!"
@@ -10083,66 +10406,67 @@ msgstr "Alles verwijderen"
msgid "Sorry! Editing of recurrent events is not yet implemented."
msgstr "Excuses! Bewerken van herhalende gebeurtenissen is nog niet geïmplementeerd."
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr "Organisatie"
-
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Titel"
+#: ../../extend/addon/addon/cdav/cdav.php:36
+msgid "Errors encountered creating database table: "
+msgstr "Fouten opgetreden tijdens aanmaken databasetabel: "
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr "Telefoon"
+#: ../../extend/addon/addon/cdav/cdav.php:197
+msgid "Default Calendar"
+msgstr "Standaard agenda"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr "Instant messenger"
+#: ../../extend/addon/addon/cdav/cdav.php:206
+msgid "Default Addressbook"
+msgstr "Standaard adresboek"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr "Website"
+#: ../../extend/addon/addon/cdav/cdav.php:215
+msgid "CalDAV/CardDAV Settings saved."
+msgstr "CalDAV/CardDAV-instellingen opgeslagen."
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr "Opmerking"
+#: ../../extend/addon/addon/cdav/cdav.php:234
+msgid "Enable CalDAV/CardDAV Server for this channel"
+msgstr "CalDAV/CardDAV-server voor dit kanaal inschakelen"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr "Veld toevoegen"
+#: ../../extend/addon/addon/cdav/cdav.php:237
+#, php-format
+msgid "Your CalDAV resources are located at %s "
+msgstr "Jouw CalDAV-URL is %s "
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr "Postbus"
+#: ../../extend/addon/addon/cdav/cdav.php:240
+#, php-format
+msgid "Your CardDAV resources are located at %s "
+msgstr "Jouw CardDAV-URL is %s "
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr "Extra"
+#: ../../extend/addon/addon/cdav/cdav.php:246
+msgid "CalDAV/CardDAV Settings"
+msgstr "CalDAV/CardDAV"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr "Straat en huisnummer"
+#: ../../extend/addon/addon/cdav/cdav.php:272
+#: ../../include/connections.php:670
+msgid "Home, Voice"
+msgstr "Thuis, spraak"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr "Plaats"
+#: ../../extend/addon/addon/cdav/cdav.php:273
+#: ../../include/connections.php:671
+msgid "Home, Fax"
+msgstr "Thuis, fax"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr "Provincie/staat/regio/enz."
+#: ../../extend/addon/addon/cdav/cdav.php:275
+#: ../../include/connections.php:673
+msgid "Work, Voice"
+msgstr "Werk, spraak"
-#: ../../extend/addon/addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr "Postcode"
+#: ../../extend/addon/addon/cdav/cdav.php:276
+#: ../../include/connections.php:674
+msgid "Work, Fax"
+msgstr "Werk, fax"
#: ../../extend/addon/addon/chess/chess.php:276
-#: ../../extend/addon/addon/chess/chess.php:430
+#: ../../extend/addon/addon/chess/chess.php:433
msgid "Invalid game."
msgstr "Ongeldig spel."
#: ../../extend/addon/addon/chess/chess.php:282
-#: ../../extend/addon/addon/chess/chess.php:436
+#: ../../extend/addon/addon/chess/chess.php:439
msgid "You are not a player in this game."
msgstr "Jij doet niet aan dit speel mee."
@@ -10166,15 +10490,15 @@ msgstr "Je moet wit of zwart kiezen."
msgid "Error creating new game."
msgstr "Fout tijdens aanmaken nieuw spel."
-#: ../../extend/addon/addon/chess/chess.php:379 ../../include/channel.php:816
+#: ../../extend/addon/addon/chess/chess.php:381 ../../include/channel.php:899
msgid "Requested channel is not available."
msgstr "Opgevraagd kanaal is niet beschikbaar."
-#: ../../extend/addon/addon/chess/chess.php:392
+#: ../../extend/addon/addon/chess/chess.php:395
msgid "You must select a local channel /chess/channelname"
msgstr "Je moet een lokaal kanaal kiezen: .../chess/kanaalnaam"
-#: ../../extend/addon/addon/chess/chess.php:920
+#: ../../extend/addon/addon/chess/chess.php:923
msgid "Enable notifications"
msgstr "Notificaties inschakelen"
@@ -10208,15 +10532,6 @@ msgstr "Man"
msgid "Female"
msgstr "Vrouw"
-#: ../../extend/addon/addon/openid/Mod_Openid.php:30
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID-protocolfout. Geen ID terugontvangen."
-
-#: ../../extend/addon/addon/openid/Mod_Openid.php:193
-#: ../../include/auth.php:286
-msgid "Login failed."
-msgstr "Inloggen mislukt."
-
#: ../../extend/addon/addon/openid/MysqlProvider.php:52
msgid "First Name"
msgstr "Voornaam"
@@ -10283,6 +10598,15 @@ msgstr "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je
msgid "The error message was:"
msgstr "Foutmelding was:"
+#: ../../extend/addon/addon/openid/Mod_Openid.php:30
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID-protocolfout. Geen ID terugontvangen."
+
+#: ../../extend/addon/addon/openid/Mod_Openid.php:188
+#: ../../include/auth.php:286
+msgid "Login failed."
+msgstr "Inloggen mislukt."
+
#: ../../extend/addon/addon/diaspora_reconnect/diaspora_reconnect.php:44
#, php-format
msgid "Reconnecting %d connections"
@@ -10342,71 +10666,96 @@ msgid ""
"from Mapbox instead of the default OpenStreetMap tile server."
msgstr "De Mapbox-toegangstoken wordt gebruikt om kaarttegels (tiles) van Mapbox op te halen in plaats van de standaard tile-server van OpenStreetMap."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:154
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:162
msgid "Rendezvous"
msgstr "Rendezvous"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:159
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
msgid ""
"This identity has been deleted by another member due to inactivity. Please "
"press the \"New identity\" button or refresh the page to register a new "
"identity. You may use the same name."
msgstr "Deze identiteit is door een ander lid verwijderd als gevolg van inactiviteit. Klik op de knop \"Nieuwe identiteit\" of herlaad de pagina om een nieuwe identiteit aan te maken. Je kan eventueel dezelfde naam gebruiken."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:160
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
msgid "Welcome to Rendezvous!"
msgstr "Welkom bij Rendezvous!"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:161
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
msgid ""
"Enter your name to join this rendezvous. To begin sharing your location with"
" the other members, tap the GPS control. When your location is discovered, a"
" red dot will appear and others will be able to see you on the map."
msgstr "Vul je naam in om deel te nemen aan deze rendezvous. Om met het delen van je locatie met de andere leden te beginnen, klik je op de locatieknop van je webbrowser. Nadat jouw locatie is gevonden verschijnt er een rode stip en kunnen andere leden jou zien op de kaart."
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:163
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
msgid "Let's meet here"
msgstr "Laten we elkaar hier ontmoeten"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:166
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:174
msgid "New marker"
msgstr "Nieuwe markering"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:167
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:175
msgid "Edit marker"
msgstr "Markering bewerken"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:168
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:176
msgid "New identity"
msgstr "Nieuwe identiteit"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:169
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:177
msgid "Delete marker"
msgstr "Markering verwijderen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:170
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:178
msgid "Delete member"
msgstr "Lid verwijderen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:171
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:179
msgid "Edit proximity alert"
msgstr "Nabijheidswaarschuwing bewerken"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
msgid ""
"A proximity alert will be issued when this member is within a certain radius"
" of you.<br><br>Enter a radius in meters (0 to disable):"
-msgstr "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):"
+msgstr "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal rond jouw locatie bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:172
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:180
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:185
msgid "distance"
msgstr "afstand"
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:181
+msgid "Proximity alert distance (meters)"
+msgstr "Afstand nabijheidswaarschuwing (meter)"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:182
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+msgid ""
+"A proximity alert will be issued when you are within a certain radius of the"
+" marker location.<br><br>Enter a radius in meters (0 to disable):"
+msgstr "Een nabijheidswaarschuwing wordt actief wanneer je je binnen een bepaalde straal rond een specifieke locatie bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):"
+
#: ../../extend/addon/addon/rendezvous/rendezvous.php:183
+msgid "Marker proximity alert"
+msgstr "Locatiemarkering nabijheidswaarschuwing"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:186
+msgid "Reminder note"
+msgstr "Herinnering"
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:187
+msgid ""
+"Enter a note to be displayed when you are within the specified proximity..."
+msgstr "Vul de tekst in die getoond moet worden wanneer je je op de aangegeven afstand bevindt..."
+
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:199
msgid "Add new rendezvous"
msgstr "Nieuwe rendezvous toevoegen"
-#: ../../extend/addon/addon/rendezvous/rendezvous.php:184
+#: ../../extend/addon/addon/rendezvous/rendezvous.php:200
msgid ""
"Create a new rendezvous and share the access link with those you wish to "
"invite to the group. Those who open the link become members of the "
@@ -10414,19 +10763,457 @@ msgid ""
" share their own locations with the group."
msgstr "Maak een nieuwe rendezvous aan en deel de toegangslink met wie je wil uitnodigen voor de groep. Wie op de link klikt wordt lid van rendezvous. Zij kunnen dan de locaties zien van andere leden, markeringen aan de kaart toevoegen of hun eigen locaties met de groep delen."
-#: ../../include/Import/import_diaspora.php:16
-msgid "No username found in import file."
-msgstr "Geen gebruikersnaam in het importbestand gevonden."
+#: ../../extend/addon/addon/firefox/firefox.php:23
+msgid "Install Firefox Sharing Tools"
+msgstr "Firefox Share"
-#: ../../include/Import/import_diaspora.php:41 ../../include/import.php:51
-msgid "Unable to create a unique channel address. Import failed."
-msgstr "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt."
+#: ../../extend/addon/addon/firefox/firefox.php:34
+msgid "Share content from Firefox to $Projectname"
+msgstr "Deel webpagina's vanuit Firefox met "
+
+#: ../../extend/addon/addon/firefox/firefox.php:37
+msgid "Install Firefox Sharing Tools to this web browser"
+msgstr "Activeer de $Projectname-service in Firefox"
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:105
+msgid "Error retrieving wiki"
+msgstr "Fout tijdens ophalen wiki"
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:112
+msgid "Error creating zip file export folder"
+msgstr "Fout tijdens aanmaken exportmap zipbestand"
+
+#: ../../extend/addon/addon/gitwiki/Mod_Gitwiki.php:130
+msgid "Error downloading wiki: "
+msgstr "Fout tijdens downloaden wiki: "
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:76
+#: ../../include/widgets.php:956
+msgid "Wiki Pages"
+msgstr "Wikipagina's"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:81
+#: ../../include/widgets.php:962
+msgid "Add new page"
+msgstr "Nieuwe pagina toevoegen"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:82
+#: ../../include/widgets.php:963
+msgid "Page name"
+msgstr "Paginanaam"
+
+#: ../../extend/addon/addon/gitwiki/gitwiki.php:95
+#: ../../include/widgets.php:913
+msgid "Wiki List"
+msgstr "Wiki's"
+
+#: ../../extend/addon/addon/gnusoc/gnusoc.php:129
+msgid "Enable the GNU-Social protocol for this channel"
+msgstr "GNU social-protocol voor dit kanaal inschakelen"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:26 ../../boot.php:1186
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Zoek %1$s (%2$s)"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:28 ../../boot.php:1186
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
+#: ../../extend/addon/addon/opensearch/opensearch.php:43
+msgid "Search $Projectname"
+msgstr "Zoek in "
#: ../../include/dba/dba_driver.php:187
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "Kan DNS-informatie voor databaseserver '%s' niet vinden"
+#: ../../include/language.php:367 ../../include/text.php:1788
+msgid "default"
+msgstr "standaard"
+
+#: ../../include/language.php:380
+msgid "Select an alternate language"
+msgstr "Kies een andere taal"
+
+#: ../../include/account.php:35
+msgid "Not a valid email address"
+msgstr "Geen geldig e-mailadres"
+
+#: ../../include/account.php:37
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Jouw e-maildomein is op deze hub niet toegestaan"
+
+#: ../../include/account.php:43
+msgid "Your email address is already registered at this site."
+msgstr "Jouw e-mailadres is al op deze hub geregistreerd."
+
+#: ../../include/account.php:75
+msgid "An invitation is required."
+msgstr "Een uitnodiging is vereist"
+
+#: ../../include/account.php:79
+msgid "Invitation could not be verified."
+msgstr "Uitnodiging kon niet geverifieerd worden"
+
+#: ../../include/account.php:130
+msgid "Please enter the required information."
+msgstr "Vul de vereiste informatie in."
+
+#: ../../include/account.php:198
+msgid "Failed to store account information."
+msgstr "Account-informatie kon niet opgeslagen worden."
+
+#: ../../include/account.php:263
+#, php-format
+msgid "Registration confirmation for %s"
+msgstr "Registratiebevestiging voor %s"
+
+#: ../../include/account.php:330
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registratiebevestiging voor %s"
+
+#: ../../include/account.php:352
+msgid "your registration password"
+msgstr "jouw registratiewachtwoord"
+
+#: ../../include/account.php:358 ../../include/account.php:420
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registratiegegevens voor %s"
+
+#: ../../include/account.php:431
+msgid "Account approved."
+msgstr "Account goedgekeurd"
+
+#: ../../include/account.php:471
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registratie ingetrokken voor %s"
+
+#: ../../include/account.php:756 ../../include/account.php:758
+msgid "Click here to upgrade."
+msgstr "Klik hier om te upgraden."
+
+#: ../../include/account.php:764
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
+
+#: ../../include/account.php:769
+msgid "This action is not available under your subscription plan."
+msgstr "Deze handeling is niet mogelijk met jouw abonnement."
+
+#: ../../include/widgets.php:46 ../../include/widgets.php:455
+#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+#: ../../include/contact_widgets.php:91
+msgid "Categories"
+msgstr "Categorieën"
+
+#: ../../include/widgets.php:141
+msgid "Suggestions"
+msgstr "Voorgestelde kanalen"
+
+#: ../../include/widgets.php:142
+msgid "See more..."
+msgstr "Meer..."
+
+#: ../../include/widgets.php:162
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Je hebt %1$.0f van de %2$.0f toegestane connecties."
+
+#: ../../include/widgets.php:168
+msgid "Add New Connection"
+msgstr "Nieuwe connectie toevoegen"
+
+#: ../../include/widgets.php:169
+msgid "Enter channel address"
+msgstr "Vul kanaaladres in"
+
+#: ../../include/widgets.php:170
+msgid "Examples: bob@example.com, https://example.com/barbara"
+msgstr "Voorbeelden: bob@example.com, http://example.com/barbara"
+
+#: ../../include/widgets.php:186
+msgid "Notes"
+msgstr "Aantekeningen"
+
+#: ../../include/widgets.php:262
+msgid "Remove term"
+msgstr "Verwijder zoekterm"
+
+#: ../../include/widgets.php:270 ../../include/features.php:301
+msgid "Saved Searches"
+msgstr "Opgeslagen zoekopdrachten"
+
+#: ../../include/widgets.php:271 ../../include/group.php:336
+msgid "add"
+msgstr "toevoegen"
+
+#: ../../include/widgets.php:333 ../../include/contact_widgets.php:53
+#: ../../include/features.php:390
+msgid "Saved Folders"
+msgstr "Bewaarde mappen"
+
+#: ../../include/widgets.php:336 ../../include/widgets.php:458
+#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
+msgid "Everything"
+msgstr "Alles"
+
+#: ../../include/widgets.php:377
+msgid "Archives"
+msgstr "Archieven"
+
+#: ../../include/widgets.php:549
+msgid "Refresh"
+msgstr "Vernieuwen"
+
+#: ../../include/widgets.php:589
+msgid "Account settings"
+msgstr "Account"
+
+#: ../../include/widgets.php:595
+msgid "Channel settings"
+msgstr "Kanaal"
+
+#: ../../include/widgets.php:604
+msgid "Additional features"
+msgstr "Extra functies"
+
+#: ../../include/widgets.php:611
+msgid "Feature/Addon settings"
+msgstr "Plugin-instellingen"
+
+#: ../../include/widgets.php:617
+msgid "Display settings"
+msgstr "Weergave"
+
+#: ../../include/widgets.php:624
+msgid "Manage locations"
+msgstr "Locaties beheren"
+
+#: ../../include/widgets.php:631
+msgid "Export channel"
+msgstr "Kanaal exporteren"
+
+#: ../../include/widgets.php:637
+msgid "Connected apps"
+msgstr "Verbonden applicaties"
+
+#: ../../include/widgets.php:652 ../../include/features.php:153
+msgid "Permission Groups"
+msgstr "Permissiegroepen"
+
+#: ../../include/widgets.php:669
+msgid "Premium Channel Settings"
+msgstr "Instellingen premiumkanaal"
+
+#: ../../include/widgets.php:698
+msgid "Private Mail Menu"
+msgstr "Privéberichten"
+
+#: ../../include/widgets.php:700
+msgid "Combined View"
+msgstr "Gecombineerd postvak"
+
+#: ../../include/widgets.php:705 ../../include/nav.php:213
+msgid "Inbox"
+msgstr "Postvak IN"
+
+#: ../../include/widgets.php:710 ../../include/nav.php:214
+msgid "Outbox"
+msgstr "Postvak UIT"
+
+#: ../../include/widgets.php:715 ../../include/nav.php:215
+msgid "New Message"
+msgstr "Nieuw bericht"
+
+#: ../../include/widgets.php:732 ../../include/widgets.php:744
+msgid "Conversations"
+msgstr "Conversaties"
+
+#: ../../include/widgets.php:736
+msgid "Received Messages"
+msgstr "Ontvangen berichten"
+
+#: ../../include/widgets.php:740
+msgid "Sent Messages"
+msgstr "Verzonden berichten"
+
+#: ../../include/widgets.php:754
+msgid "No messages."
+msgstr "Geen berichten"
+
+#: ../../include/widgets.php:772
+msgid "Delete conversation"
+msgstr "Verwijder conversatie"
+
+#: ../../include/widgets.php:798
+msgid "Events Tools"
+msgstr "Agenda-hulpmiddelen"
+
+#: ../../include/widgets.php:799
+msgid "Export Calendar"
+msgstr "Exporteren"
+
+#: ../../include/widgets.php:800
+msgid "Import Calendar"
+msgstr "Importeren"
+
+#: ../../include/widgets.php:888 ../../include/conversation.php:1866
+#: ../../include/conversation.php:1869
+msgid "Chatrooms"
+msgstr "Chatkanalen"
+
+#: ../../include/widgets.php:892
+msgid "Overview"
+msgstr "Overzicht"
+
+#: ../../include/widgets.php:899
+msgid "Chat Members"
+msgstr "Chatleden"
+
+#: ../../include/widgets.php:977
+msgctxt "wiki_history"
+msgid "Message"
+msgstr "Bericht"
+
+#: ../../include/widgets.php:999
+msgid "Bookmarked Chatrooms"
+msgstr "Bladwijzers van chatkanalen"
+
+#: ../../include/widgets.php:1030
+msgid "Suggested Chatrooms"
+msgstr "Voorgestelde chatkanalen"
+
+#: ../../include/widgets.php:1175 ../../include/widgets.php:1287
+msgid "photo/image"
+msgstr "foto/afbeelding"
+
+#: ../../include/widgets.php:1230
+msgid "Click to show more"
+msgstr "Klik voor meer"
+
+#: ../../include/widgets.php:1381
+msgid "Rating Tools"
+msgstr "Beoordelingen"
+
+#: ../../include/widgets.php:1385 ../../include/widgets.php:1387
+msgid "Rate Me"
+msgstr "Beoordeel mij"
+
+#: ../../include/widgets.php:1390
+msgid "View Ratings"
+msgstr "Bekijk beoordelingen"
+
+#: ../../include/widgets.php:1483
+msgid "Forums"
+msgstr "Forums"
+
+#: ../../include/widgets.php:1540
+msgctxt "widget"
+msgid "Activity"
+msgstr "Activiteit"
+
+#: ../../include/widgets.php:1569
+msgid "Tasks"
+msgstr "Taken"
+
+#: ../../include/widgets.php:1635 ../../include/widgets.php:1673
+msgid "Member registrations waiting for confirmation"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../include/widgets.php:1641
+msgid "Inspect queue"
+msgstr "Inspecteer berichtenwachtrij"
+
+#: ../../include/widgets.php:1643
+msgid "DB updates"
+msgstr "Database-updates"
+
+#: ../../include/widgets.php:1668 ../../include/nav.php:233
+msgid "Admin"
+msgstr "Beheer"
+
+#: ../../include/widgets.php:1669
+msgid "Plugin Features"
+msgstr "Plugin-opties"
+
+#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+msgid "Tags"
+msgstr "Tags"
+
+#: ../../include/taxonomy.php:293
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+#: ../../include/taxonomy.php:314
+msgid "have"
+msgstr "heb"
+
+#: ../../include/taxonomy.php:314
+msgid "has"
+msgstr "heeft"
+
+#: ../../include/taxonomy.php:315
+msgid "want"
+msgstr "wil"
+
+#: ../../include/taxonomy.php:315
+msgid "wants"
+msgstr "wil"
+
+#: ../../include/taxonomy.php:316
+msgid "likes"
+msgstr "vindt dit leuk"
+
+#: ../../include/taxonomy.php:317
+msgid "dislikes"
+msgstr "vindt dit niet leuk"
+
+#: ../../include/event.php:22 ../../include/event.php:69
+#: ../../include/markdown.php:540
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\@ G:i"
+
+#: ../../include/event.php:30 ../../include/event.php:73
+#: ../../include/markdown.php:546
+msgid "Starts:"
+msgstr "Start:"
+
+#: ../../include/event.php:40 ../../include/event.php:77
+#: ../../include/markdown.php:554
+msgid "Finishes:"
+msgstr "Einde:"
+
+#: ../../include/event.php:1004
+msgid "This event has been added to your calendar."
+msgstr "Dit evenement is aan jouw agenda toegevoegd."
+
+#: ../../include/event.php:1204
+msgid "Not specified"
+msgstr "Niet aangegeven"
+
+#: ../../include/event.php:1205
+msgid "Needs Action"
+msgstr "Actie vereist"
+
+#: ../../include/event.php:1206
+msgid "Completed"
+msgstr "Voltooid"
+
+#: ../../include/event.php:1207
+msgid "In Process"
+msgstr "In behandeling"
+
+#: ../../include/event.php:1208
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
#: ../../include/datetime.php:147
msgid "Birthday"
msgstr "Verjaardag of geboortedatum"
@@ -10439,7 +11226,7 @@ msgstr "Leeftijd:"
msgid "YYYY-MM-DD or MM-DD"
msgstr "JJJJ-MM-DD of MM-DD"
-#: ../../include/datetime.php:286 ../../boot.php:2564
+#: ../../include/datetime.php:286 ../../boot.php:2598
msgid "never"
msgstr "nooit"
@@ -10512,74 +11299,6 @@ msgstr "Verjaardag van %1$s"
msgid "Happy Birthday %1$s"
msgstr "Gefeliciteerd met je verjaardag %1$s"
-#: ../../include/account.php:35
-msgid "Not a valid email address"
-msgstr "Geen geldig e-mailadres"
-
-#: ../../include/account.php:37
-msgid "Your email domain is not among those allowed on this site"
-msgstr "Jouw e-maildomein is op deze hub niet toegestaan"
-
-#: ../../include/account.php:43
-msgid "Your email address is already registered at this site."
-msgstr "Jouw e-mailadres is al op deze hub geregistreerd."
-
-#: ../../include/account.php:75
-msgid "An invitation is required."
-msgstr "Een uitnodiging is vereist"
-
-#: ../../include/account.php:79
-msgid "Invitation could not be verified."
-msgstr "Uitnodiging kon niet geverifieerd worden"
-
-#: ../../include/account.php:130
-msgid "Please enter the required information."
-msgstr "Vul de vereiste informatie in."
-
-#: ../../include/account.php:198
-msgid "Failed to store account information."
-msgstr "Account-informatie kon niet opgeslagen worden."
-
-#: ../../include/account.php:263
-#, php-format
-msgid "Registration confirmation for %s"
-msgstr "Registratiebevestiging voor %s"
-
-#: ../../include/account.php:330
-#, php-format
-msgid "Registration request at %s"
-msgstr "Registratiebevestiging voor %s"
-
-#: ../../include/account.php:352
-msgid "your registration password"
-msgstr "jouw registratiewachtwoord"
-
-#: ../../include/account.php:358 ../../include/account.php:420
-#, php-format
-msgid "Registration details for %s"
-msgstr "Registratiegegevens voor %s"
-
-#: ../../include/account.php:431
-msgid "Account approved."
-msgstr "Account goedgekeurd"
-
-#: ../../include/account.php:471
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registratie ingetrokken voor %s"
-
-#: ../../include/account.php:756 ../../include/account.php:758
-msgid "Click here to upgrade."
-msgstr "Klik hier om te upgraden."
-
-#: ../../include/account.php:764
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
-
-#: ../../include/account.php:769
-msgid "This action is not available under your subscription plan."
-msgstr "Deze handeling is niet mogelijk met jouw abonnement."
-
#: ../../include/selectors.php:30
msgid "Frequently"
msgstr "Regelmatig"
@@ -10820,745 +11539,103 @@ msgstr "Maakt mij niks uit"
msgid "Ask me"
msgstr "Vraag het me"
-#: ../../include/channel.php:33
-msgid "Unable to obtain identity information from database"
-msgstr "Niet in staat om identiteitsinformatie uit de database te verkrijgen"
-
-#: ../../include/channel.php:67
-msgid "Empty name"
-msgstr "Ontbrekende naam"
-
-#: ../../include/channel.php:70
-msgid "Name too long"
-msgstr "Naam te lang"
-
-#: ../../include/channel.php:181
-msgid "No account identifier"
-msgstr "Geen account-identificator"
-
-#: ../../include/channel.php:193
-msgid "Nickname is required."
-msgstr "Bijnaam is verplicht"
+#: ../../include/acl_selectors.php:208
+msgid "Who can see this?"
+msgstr "Wie kan dit zien?"
-#: ../../include/channel.php:207
-msgid "Reserved nickname. Please choose another."
-msgstr "Deze naam is gereserveerd. Kies een andere."
+#: ../../include/acl_selectors.php:209
+msgid "Custom selection"
+msgstr "Handmatige selectie"
-#: ../../include/channel.php:212
+#: ../../include/acl_selectors.php:210
msgid ""
-"Nickname has unsupported characters or is already being used on this site."
-msgstr "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik."
-
-#: ../../include/channel.php:272
-msgid "Unable to retrieve created identity"
-msgstr "Niet in staat om aangemaakte identiteit te vinden"
-
-#: ../../include/channel.php:341
-msgid "Default Profile"
-msgstr "Standaardprofiel"
-
-#: ../../include/channel.php:962
-msgid "Create New Profile"
-msgstr "Nieuw profiel aanmaken"
-
-#: ../../include/channel.php:982
-msgid "Visible to everybody"
-msgstr "Voor iedereen zichtbaar"
-
-#: ../../include/channel.php:1055 ../../include/channel.php:1174
-msgid "Gender:"
-msgstr "Geslacht:"
-
-#: ../../include/channel.php:1057 ../../include/channel.php:1229
-msgid "Homepage:"
-msgstr "Homepagina:"
-
-#: ../../include/channel.php:1058
-msgid "Online Now"
-msgstr "Nu online"
-
-#: ../../include/channel.php:1179
-msgid "Like this channel"
-msgstr "Vind dit kanaal leuk"
-
-#: ../../include/channel.php:1203
-msgid "j F, Y"
-msgstr "F j Y"
+"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
+" the scope of \"Show\"."
+msgstr "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\"."
-#: ../../include/channel.php:1204
-msgid "j F"
-msgstr "F j"
+#: ../../include/acl_selectors.php:211
+msgid "Show"
+msgstr "Tonen"
-#: ../../include/channel.php:1211
-msgid "Birthday:"
-msgstr "Geboortedatum:"
+#: ../../include/acl_selectors.php:212
+msgid "Don't show"
+msgstr "Niet tonen"
-#: ../../include/channel.php:1224
+#: ../../include/acl_selectors.php:245
#, php-format
-msgid "for %1$d %2$s"
-msgstr "voor %1$d %2$s"
-
-#: ../../include/channel.php:1227
-msgid "Sexual Preference:"
-msgstr "Seksuele voorkeur:"
-
-#: ../../include/channel.php:1233
-msgid "Tags:"
-msgstr "Tags:"
-
-#: ../../include/channel.php:1235
-msgid "Political Views:"
-msgstr "Politieke overtuigingen:"
-
-#: ../../include/channel.php:1237
-msgid "Religion:"
-msgstr "Religie:"
-
-#: ../../include/channel.php:1241
-msgid "Hobbies/Interests:"
-msgstr "Hobby's/interesses:"
-
-#: ../../include/channel.php:1243
-msgid "Likes:"
-msgstr "Houdt van:"
-
-#: ../../include/channel.php:1245
-msgid "Dislikes:"
-msgstr "Houdt niet van:"
-
-#: ../../include/channel.php:1247
-msgid "Contact information and Social Networks:"
-msgstr "Contactinformatie en sociale netwerken:"
+msgid ""
+"Post permissions %s cannot be changed %s after a post is shared.</br />These"
+" permissions set who is allowed to view the post."
+msgstr "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien."
-#: ../../include/channel.php:1249
-msgid "My other channels:"
-msgstr "Mijn andere kanalen"
+#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
+#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
+#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
+#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
+#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
+#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
+#: ../../include/bbcode.php:1079
+msgid "Image/photo"
+msgstr "Afbeelding/foto"
-#: ../../include/channel.php:1251
-msgid "Musical interests:"
-msgstr "Muzikale interesses:"
+#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+msgid "Encrypted content"
+msgstr "Versleutelde inhoud"
-#: ../../include/channel.php:1253
-msgid "Books, literature:"
-msgstr "Boeken, literatuur:"
+#: ../../include/bbcode.php:189
+#, php-format
+msgid "Install %s element: "
+msgstr "Installeer %s-element: "
-#: ../../include/channel.php:1255
-msgid "Television:"
-msgstr "Televisie:"
+#: ../../include/bbcode.php:193
+#, php-format
+msgid ""
+"This post contains an installable %s element, however you lack permissions "
+"to install it on this site."
+msgstr "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren."
-#: ../../include/channel.php:1257
-msgid "Film/dance/culture/entertainment:"
-msgstr "Films/dansen/cultuur/vermaak:"
+#: ../../include/bbcode.php:272
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schreef het volgende %2$s %3$s"
-#: ../../include/channel.php:1259
-msgid "Love/Romance:"
-msgstr "Liefde/romantiek:"
+#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+msgid "Click to open/close"
+msgstr "Klik om te openen of te sluiten"
-#: ../../include/channel.php:1261
-msgid "Work/employment:"
-msgstr "Werk/beroep:"
+#: ../../include/bbcode.php:357
+msgid "spoiler"
+msgstr "spoiler"
-#: ../../include/channel.php:1263
-msgid "School/education:"
-msgstr "School/opleiding:"
+#: ../../include/bbcode.php:1028
+msgid "$1 wrote:"
+msgstr "$1 schreef:"
-#: ../../include/channel.php:1284
-msgid "Like this thing"
-msgstr "Vind dit ding leuk"
+#: ../../include/bookmarks.php:34
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Bladwijzers van %1$s"
-#: ../../include/connections.php:95
+#: ../../include/connections.php:127
msgid "New window"
msgstr "Nieuw venster"
-#: ../../include/connections.php:96
+#: ../../include/connections.php:128
msgid "Open the selected location in a different window or browser tab"
msgstr "Open de geselecteerde locatie in een ander venster of tab"
-#: ../../include/connections.php:214
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Account '%s' verwijderd"
-
-#: ../../include/dir_fns.php:141
-msgid "Directory Options"
-msgstr "Opties kanalengids"
-
-#: ../../include/dir_fns.php:143
-msgid "Safe Mode"
-msgstr "Veilig zoeken"
-
-#: ../../include/dir_fns.php:144
-msgid "Public Forums Only"
-msgstr "Alleen openbare forums"
-
-#: ../../include/dir_fns.php:145
-msgid "This Website Only"
-msgstr "Alleen deze hub"
-
-#: ../../include/nav.php:85 ../../include/nav.php:118 ../../boot.php:1719
-msgid "Logout"
-msgstr "Uitloggen"
-
-#: ../../include/nav.php:85 ../../include/nav.php:118
-msgid "End this session"
-msgstr "Beëindig deze sessie"
-
-#: ../../include/nav.php:88
-msgid "Your posts and conversations"
-msgstr "Jouw kanaal"
-
-#: ../../include/nav.php:89
-msgid "Your profile page"
-msgstr "Jouw profielpagina"
-
-#: ../../include/nav.php:91
-msgid "Manage/Edit profiles"
-msgstr "Beheer/wijzig profielen"
-
-#: ../../include/nav.php:93
-msgid "Edit your profile"
-msgstr "Jouw profiel bewerken"
-
-#: ../../include/nav.php:95
-msgid "Your photos"
-msgstr "Jouw foto's"
-
-#: ../../include/nav.php:96
-msgid "Your files"
-msgstr "Jouw bestanden"
-
-#: ../../include/nav.php:99
-msgid "Your chatrooms"
-msgstr "Jouw chatkanalen"
-
-#: ../../include/nav.php:105 ../../include/conversation.php:1717
-msgid "Bookmarks"
-msgstr "Bladwijzers"
-
-#: ../../include/nav.php:105
-msgid "Your bookmarks"
-msgstr "Jouw bladwijzers"
-
-#: ../../include/nav.php:109
-msgid "Your webpages"
-msgstr "Jouw webpagina's"
-
-#: ../../include/nav.php:111
-msgid "Your wikis"
-msgstr "Jouw wiki's"
-
-#: ../../include/nav.php:115
-msgid "Sign in"
-msgstr "Inloggen"
-
-#: ../../include/nav.php:131
-msgid "Remote authentication"
-msgstr "Authenticatie op afstand"
-
-#: ../../include/nav.php:131
-msgid "Click to authenticate to your home hub"
-msgstr "Authenticeer jezelf via (bijvoorbeeld) jouw hub"
-
-#: ../../include/nav.php:143
-msgid "Get me home"
-msgstr "Terug naar mijn hub"
-
-#: ../../include/nav.php:145
-msgid "Log me out of this site"
-msgstr "Uitloggen op deze hub"
-
-#: ../../include/nav.php:150
-msgid "Create an account"
-msgstr "Maak een account aan"
-
-#: ../../include/nav.php:162
-msgid "Help and documentation"
-msgstr "Hulp en documentatie"
-
-#: ../../include/nav.php:166
-msgid "Applications, utilities, links, games"
-msgstr "Apps"
-
-#: ../../include/nav.php:168
-msgid "Search site @name, #tag, ?docs, content"
-msgstr "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie "
-
-#: ../../include/nav.php:170
-msgid "Channel Directory"
-msgstr "Kanalengids"
-
-#: ../../include/nav.php:182
-msgid "Your grid"
-msgstr "Jouw grid"
-
-#: ../../include/nav.php:183
-msgid "Mark all grid notifications seen"
-msgstr "Markeer alle gridnotificaties als bekeken"
-
-#: ../../include/nav.php:185
-msgid "Channel home"
-msgstr "Jouw kanaal"
-
-#: ../../include/nav.php:186
-msgid "Mark all channel notifications seen"
-msgstr "Alle kanaalnotificaties als gelezen markeren"
-
-#: ../../include/nav.php:192
-msgid "Notices"
-msgstr "Notificaties"
-
-#: ../../include/nav.php:192
-msgid "Notifications"
-msgstr "Notificaties"
-
-#: ../../include/nav.php:193
-msgid "See all notifications"
-msgstr "Alle notificaties weergeven"
-
-#: ../../include/nav.php:196
-msgid "Private mail"
-msgstr "Privéberichten"
-
-#: ../../include/nav.php:197
-msgid "See all private messages"
-msgstr "Alle privéberichten weergeven"
-
-#: ../../include/nav.php:198
-msgid "Mark all private messages seen"
-msgstr "Markeer alle privéberichten als bekeken"
-
-#: ../../include/nav.php:199 ../../include/widgets.php:700
-msgid "Inbox"
-msgstr "Postvak IN"
-
-#: ../../include/nav.php:200 ../../include/widgets.php:705
-msgid "Outbox"
-msgstr "Postvak UIT"
-
-#: ../../include/nav.php:201 ../../include/widgets.php:710
-msgid "New Message"
-msgstr "Nieuw bericht"
-
-#: ../../include/nav.php:204
-msgid "Event Calendar"
-msgstr "Agenda"
-
-#: ../../include/nav.php:205
-msgid "See all events"
-msgstr "Alle gebeurtenissen weergeven"
-
-#: ../../include/nav.php:206
-msgid "Mark all events seen"
-msgstr "Markeer alle gebeurtenissen als bekeken"
-
-#: ../../include/nav.php:209
-msgid "Manage Your Channels"
-msgstr "Beheer je kanalen"
-
-#: ../../include/nav.php:211
-msgid "Account/Channel Settings"
-msgstr "Account-/kanaal-instellingen"
-
-#: ../../include/nav.php:219 ../../include/widgets.php:1595
-msgid "Admin"
-msgstr "Beheer"
-
-#: ../../include/nav.php:219
-msgid "Site Setup and Configuration"
-msgstr "Hub instellen en beheren"
-
-#: ../../include/nav.php:250 ../../include/conversation.php:835
-msgid "Loading..."
-msgstr "Aan het laden..."
-
-#: ../../include/nav.php:255
-msgid "@name, #tag, ?doc, content"
-msgstr "@kanaal, #tag, inhoud, ?hulp"
-
-#: ../../include/nav.php:256
-msgid "Please wait..."
-msgstr "Wachten aub..."
-
-#: ../../include/features.php:58
-msgid "General Features"
-msgstr "Algemene functies"
-
-#: ../../include/features.php:63
-msgid "Multiple Profiles"
-msgstr "Meerdere profielen"
-
-#: ../../include/features.php:64
-msgid "Ability to create multiple profiles"
-msgstr "Mogelijkheid om meerdere profielen aan te maken"
-
-#: ../../include/features.php:72
-msgid "Advanced Profiles"
-msgstr "Geavanceerde profielen"
-
-#: ../../include/features.php:73
-msgid "Additional profile sections and selections"
-msgstr "Extra onderdelen en keuzes voor je profiel"
-
-#: ../../include/features.php:81
-msgid "Profile Import/Export"
-msgstr "Profiel importen/exporteren"
-
-#: ../../include/features.php:82
-msgid "Save and load profile details across sites/channels"
-msgstr "Profielgegevens opslaan en in andere hubs/kanalen gebruiken."
-
-#: ../../include/features.php:90
-msgid "Web Pages"
-msgstr "Webpagina's"
-
-#: ../../include/features.php:91
-msgid "Provide managed web pages on your channel"
-msgstr "Sta beheerde webpagina's op jouw kanaal toe"
-
-#: ../../include/features.php:100
-msgid "Provide a wiki for your channel"
-msgstr "Voeg een wiki aan jouw kanaal toe"
-
-#: ../../include/features.php:117
-msgid "Private Notes"
-msgstr "Privé-aantekeningen"
-
-#: ../../include/features.php:118
-msgid "Enables a tool to store notes and reminders (note: not encrypted)"
-msgstr "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)"
-
-#: ../../include/features.php:126
-msgid "Navigation Channel Select"
-msgstr "Kanaal kiezen in navigatiemenu"
-
-#: ../../include/features.php:127
-msgid "Change channels directly from within the navigation dropdown menu"
-msgstr "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk"
-
-#: ../../include/features.php:135
-msgid "Photo Location"
-msgstr "Fotolocatie"
-
-#: ../../include/features.php:136
-msgid "If location data is available on uploaded photos, link this to a map."
-msgstr "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart."
-
-#: ../../include/features.php:144
-msgid "Access Controlled Chatrooms"
-msgstr "Chatkanalen met toegangscontrole "
-
-#: ../../include/features.php:145
-msgid "Provide chatrooms and chat services with access control."
-msgstr "Chatkanalen en chatdiensten met toegangscontrole aanbieden."
-
-#: ../../include/features.php:153
-msgid "Smart Birthdays"
-msgstr "Slimme verjaardagen"
-
-#: ../../include/features.php:154
-msgid ""
-"Make birthday events timezone aware in case your friends are scattered "
-"across the planet."
-msgstr "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn."
-
-#: ../../include/features.php:162
-msgid "Advanced Directory Search"
-msgstr "Geavanceerd in de kanalengids zoeken"
-
-#: ../../include/features.php:163
-msgid "Allows creation of complex directory search queries"
-msgstr "Gebruik complexe zoekopdrachten in de kanalengids"
-
-#: ../../include/features.php:171
-msgid "Advanced Theme and Layout Settings"
-msgstr "Geavanceerde thema- en lay-out-instellingen"
-
-#: ../../include/features.php:172
-msgid "Allows fine tuning of themes and page layouts"
-msgstr "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden "
-
-#: ../../include/features.php:182
-msgid "Post Composition Features"
-msgstr "Functies voor het opstellen van berichten"
-
-#: ../../include/features.php:186
-msgid "Large Photos"
-msgstr "Grote foto's"
-
-#: ../../include/features.php:187
-msgid ""
-"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
-"(640px) photo thumbnails"
-msgstr "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt."
-
-#: ../../include/features.php:196
-msgid "Automatically import channel content from other channels or feeds"
-msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
-
-#: ../../include/features.php:204
-msgid "Even More Encryption"
-msgstr "Extra encryptie"
-
-#: ../../include/features.php:205
-msgid ""
-"Allow optional encryption of content end-to-end with a shared secret key"
-msgstr "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel."
-
-#: ../../include/features.php:213
-msgid "Enable Voting Tools"
-msgstr "Peilingen inschakelen"
-
-#: ../../include/features.php:214
-msgid "Provide a class of post which others can vote on"
-msgstr "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen."
-
-#: ../../include/features.php:222
-msgid "Disable Comments"
-msgstr "Reacties uitschakelen"
-
-#: ../../include/features.php:223
-msgid "Provide the option to disable comments for a post"
-msgstr "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld"
-
-#: ../../include/features.php:231
-msgid "Delayed Posting"
-msgstr "Berichten uitstellen"
-
-#: ../../include/features.php:232
-msgid "Allow posts to be published at a later date"
-msgstr "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden."
-
-#: ../../include/features.php:240
-msgid "Content Expiration"
-msgstr "Inhoud laten verlopen"
-
-#: ../../include/features.php:241
-msgid "Remove posts/comments and/or private messages at a future time"
-msgstr "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen"
-
-#: ../../include/features.php:249
-msgid "Suppress Duplicate Posts/Comments"
-msgstr "Dubbele berichten/reacties tegenhouden"
-
-#: ../../include/features.php:250
-msgid ""
-"Prevent posts with identical content to be published with less than two "
-"minutes in between submissions."
-msgstr "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. "
-
-#: ../../include/features.php:261
-msgid "Network and Stream Filtering"
-msgstr "Netwerk- en streamfilter"
-
-#: ../../include/features.php:265
-msgid "Search by Date"
-msgstr "Zoek op datum"
-
-#: ../../include/features.php:266
-msgid "Ability to select posts by date ranges"
-msgstr "Mogelijkheid om berichten op datum te filteren "
-
-#: ../../include/features.php:274 ../../include/group.php:311
-msgid "Privacy Groups"
-msgstr "Privacygroepen"
-
-#: ../../include/features.php:275
-msgid "Enable management and selection of privacy groups"
-msgstr "Beheer en selectie van privacygroepen inschakelen"
-
-#: ../../include/features.php:283 ../../include/widgets.php:283
-msgid "Saved Searches"
-msgstr "Opgeslagen zoekopdrachten"
-
-#: ../../include/features.php:284
-msgid "Save search terms for re-use"
-msgstr "Sla zoekopdrachten op voor hergebruik"
-
-#: ../../include/features.php:292
-msgid "Network Personal Tab"
-msgstr "Persoonlijke netwerktab"
-
-#: ../../include/features.php:293
-msgid "Enable tab to display only Network posts that you've interacted on"
-msgstr "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had"
-
-#: ../../include/features.php:301
-msgid "Network New Tab"
-msgstr "Nieuwe netwerktab"
-
-#: ../../include/features.php:302
-msgid "Enable tab to display all new Network activity"
-msgstr "Laat de tab alle nieuwe netwerkactiviteit tonen"
-
-#: ../../include/features.php:310
-msgid "Affinity Tool"
-msgstr "Verwantschapsfilter"
-
-#: ../../include/features.php:311
-msgid "Filter stream activity by depth of relationships"
-msgstr "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag"
-
-#: ../../include/features.php:320
-msgid "Show friend and connection suggestions"
-msgstr "Toon kanaalvoorstellen"
-
-#: ../../include/features.php:328
-msgid "Connection Filtering"
-msgstr "Berichtenfilters"
-
-#: ../../include/features.php:329
-msgid "Filter incoming posts from connections based on keywords/content"
-msgstr "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal"
-
-#: ../../include/features.php:341
-msgid "Post/Comment Tools"
-msgstr "Bericht- en reactiehulpmiddelen"
-
-#: ../../include/features.php:345
-msgid "Community Tagging"
-msgstr "Taggen door anderen"
-
-#: ../../include/features.php:346
-msgid "Ability to tag existing posts"
-msgstr "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen"
-
-#: ../../include/features.php:354
-msgid "Post Categories"
-msgstr "Categorieën berichten"
-
-#: ../../include/features.php:355
-msgid "Add categories to your posts"
-msgstr "Voeg categorieën toe aan je berichten"
-
-#: ../../include/features.php:363
-msgid "Emoji Reactions"
-msgstr "Emoji-reacties"
-
-#: ../../include/features.php:364
-msgid "Add emoji reaction ability to posts"
-msgstr "Emoji-reacties in berichten toestaan"
-
-#: ../../include/features.php:372 ../../include/contact_widgets.php:53
-#: ../../include/widgets.php:346
-msgid "Saved Folders"
-msgstr "Bewaarde mappen"
-
-#: ../../include/features.php:373
-msgid "Ability to file posts under folders"
-msgstr "Mogelijkheid om berichten in mappen op te slaan"
-
-#: ../../include/features.php:381
-msgid "Dislike Posts"
-msgstr "Vind berichten niet leuk"
-
-#: ../../include/features.php:382
-msgid "Ability to dislike posts/comments"
-msgstr "Mogelijkheid om berichten en reacties niet leuk te vinden"
-
-#: ../../include/features.php:390
-msgid "Star Posts"
-msgstr "Geef berichten een ster"
-
-#: ../../include/features.php:391
-msgid "Ability to mark special posts with a star indicator"
-msgstr "Mogelijkheid om speciale berichten met een ster te markeren"
-
-#: ../../include/features.php:399
-msgid "Tag Cloud"
-msgstr "Tagwolk"
-
-#: ../../include/features.php:400
-msgid "Provide a personal tag cloud on your channel page"
-msgstr "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina"
-
-#: ../../include/features.php:412
-msgid "Premium Channel"
-msgstr "Premiumkanaal"
-
-#: ../../include/features.php:413
-msgid ""
-"Allows you to set restrictions and terms on those that connect with your "
-"channel"
-msgstr "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal"
-
-#: ../../include/bb2diaspora.php:404
-msgid "Attachments:"
-msgstr "Bijlagen:"
-
-#: ../../include/bb2diaspora.php:499 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d F Y \\@ G:i"
-
-#: ../../include/bb2diaspora.php:501
-msgid "$Projectname event notification:"
-msgstr "Notificatie $Projectname-gebeurtenis:"
-
-#: ../../include/bb2diaspora.php:505 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr "Start:"
-
-#: ../../include/bb2diaspora.php:513 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
-msgstr "Einde:"
-
-#: ../../include/bookmarks.php:35
-#, php-format
-msgid "%1$s's bookmarks"
-msgstr "Bladwijzers van %1$s"
-
-#: ../../include/help.php:31
+#: ../../include/help.php:33
msgid "Help:"
msgstr "Hulp:"
-#: ../../include/help.php:63
+#: ../../include/help.php:65
msgid "Not Found"
msgstr "Niet gevonden"
-#: ../../include/wiki.php:546 ../../include/bbcode.php:552
-#: ../../include/bbcode.php:683
-msgid "Different viewers will see this text differently"
-msgstr "Deze tekst wordt per persoon anders weergeven."
-
-#: ../../include/zot.php:667
-msgid "Invalid data packet"
-msgstr "Datapakket ongeldig"
-
-#: ../../include/zot.php:683
-msgid "Unable to verify channel signature"
-msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
-
-#: ../../include/zot.php:2325
-#, php-format
-msgid "Unable to verify site signature for %s"
-msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
-
-#: ../../include/zot.php:3723
-msgid "invalid target signature"
-msgstr "ongeldig doelkenmerk"
-
#: ../../include/page_widgets.php:7
msgid "New Page"
msgstr "Nieuwe pagina"
-#: ../../include/message.php:32
-msgid "Unable to determine sender."
-msgstr "Afzender kan niet bepaald worden."
-
-#: ../../include/message.php:69
-msgid "No recipient provided."
-msgstr "Geen ontvanger opgegeven."
-
-#: ../../include/message.php:74
-msgid "[no subject]"
-msgstr "[geen onderwerp]"
-
-#: ../../include/message.php:225
-msgid "Stored post could not be verified."
-msgstr "Opgeslagen bericht kon niet worden geverifieerd."
-
#: ../../include/contact_widgets.php:11
#, php-format
msgid "%d invitation available"
@@ -11594,17 +11671,6 @@ msgstr "Vrienden uitnodigen"
msgid "Advanced example: name=fred and country=iceland"
msgstr "Geavanceerd voorbeeld (Engels): name=jan en country=nederland"
-#: ../../include/contact_widgets.php:56 ../../include/contact_widgets.php:94
-#: ../../include/widgets.php:349 ../../include/widgets.php:468
-msgid "Everything"
-msgstr "Alles"
-
-#: ../../include/contact_widgets.php:91 ../../include/taxonomy.php:188
-#: ../../include/taxonomy.php:270 ../../include/widgets.php:46
-#: ../../include/widgets.php:465
-msgid "Categories"
-msgstr "Categorieën"
-
#: ../../include/contact_widgets.php:122
#, php-format
msgid "%d connection in common"
@@ -11673,7 +11739,7 @@ msgstr "Beoordeel dit kanaal (dit is openbaar)"
#: ../../include/js_strings.php:21
msgid "Describe (optional)"
-msgstr "Omschrijving (optioneel)"
+msgstr "Omschrijving (niet verplicht)"
#: ../../include/js_strings.php:23
msgid "Please enter a link URL"
@@ -11756,19 +11822,19 @@ msgstr " "
msgid "timeago.numbers"
msgstr "timeago.numbers"
-#: ../../include/js_strings.php:45 ../../include/text.php:1307
+#: ../../include/js_strings.php:45 ../../include/text.php:1331
msgid "January"
msgstr "januari"
-#: ../../include/js_strings.php:46 ../../include/text.php:1307
+#: ../../include/js_strings.php:46 ../../include/text.php:1331
msgid "February"
msgstr "februari"
-#: ../../include/js_strings.php:47 ../../include/text.php:1307
+#: ../../include/js_strings.php:47 ../../include/text.php:1331
msgid "March"
msgstr "maart"
-#: ../../include/js_strings.php:48 ../../include/text.php:1307
+#: ../../include/js_strings.php:48 ../../include/text.php:1331
msgid "April"
msgstr "april"
@@ -11777,31 +11843,31 @@ msgctxt "long"
msgid "May"
msgstr "mei"
-#: ../../include/js_strings.php:50 ../../include/text.php:1307
+#: ../../include/js_strings.php:50 ../../include/text.php:1331
msgid "June"
msgstr "juni"
-#: ../../include/js_strings.php:51 ../../include/text.php:1307
+#: ../../include/js_strings.php:51 ../../include/text.php:1331
msgid "July"
msgstr "juli"
-#: ../../include/js_strings.php:52 ../../include/text.php:1307
+#: ../../include/js_strings.php:52 ../../include/text.php:1331
msgid "August"
msgstr "augustus"
-#: ../../include/js_strings.php:53 ../../include/text.php:1307
+#: ../../include/js_strings.php:53 ../../include/text.php:1331
msgid "September"
msgstr "september"
-#: ../../include/js_strings.php:54 ../../include/text.php:1307
+#: ../../include/js_strings.php:54 ../../include/text.php:1331
msgid "October"
msgstr "oktober"
-#: ../../include/js_strings.php:55 ../../include/text.php:1307
+#: ../../include/js_strings.php:55 ../../include/text.php:1331
msgid "November"
msgstr "november"
-#: ../../include/js_strings.php:56 ../../include/text.php:1307
+#: ../../include/js_strings.php:56 ../../include/text.php:1331
msgid "December"
msgstr "december"
@@ -11854,31 +11920,31 @@ msgstr "nov"
msgid "Dec"
msgstr "dec"
-#: ../../include/js_strings.php:69 ../../include/text.php:1303
+#: ../../include/js_strings.php:69 ../../include/text.php:1327
msgid "Sunday"
msgstr "zondag"
-#: ../../include/js_strings.php:70 ../../include/text.php:1303
+#: ../../include/js_strings.php:70 ../../include/text.php:1327
msgid "Monday"
msgstr "maandag"
-#: ../../include/js_strings.php:71 ../../include/text.php:1303
+#: ../../include/js_strings.php:71 ../../include/text.php:1327
msgid "Tuesday"
msgstr "dinsdag"
-#: ../../include/js_strings.php:72 ../../include/text.php:1303
+#: ../../include/js_strings.php:72 ../../include/text.php:1327
msgid "Wednesday"
msgstr "woensdag"
-#: ../../include/js_strings.php:73 ../../include/text.php:1303
+#: ../../include/js_strings.php:73 ../../include/text.php:1327
msgid "Thursday"
msgstr "donderdag"
-#: ../../include/js_strings.php:74 ../../include/text.php:1303
+#: ../../include/js_strings.php:74 ../../include/text.php:1327
msgid "Friday"
msgstr "vrijdag"
-#: ../../include/js_strings.php:75 ../../include/text.php:1303
+#: ../../include/js_strings.php:75 ../../include/text.php:1327
msgid "Saturday"
msgstr "zaterdag"
@@ -11935,905 +12001,1043 @@ msgctxt "calendar"
msgid "All day"
msgstr "hele dag"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
-msgid "Tags"
-msgstr "Tags"
-
-#: ../../include/taxonomy.php:293
-msgid "Keywords"
-msgstr "Trefwoorden"
+#: ../../include/dir_fns.php:141
+msgid "Directory Options"
+msgstr "Opties kanalengids"
-#: ../../include/taxonomy.php:314
-msgid "have"
-msgstr "heb"
+#: ../../include/dir_fns.php:143
+msgid "Safe Mode"
+msgstr "Veilig zoeken"
-#: ../../include/taxonomy.php:314
-msgid "has"
-msgstr "heeft"
+#: ../../include/dir_fns.php:144
+msgid "Public Forums Only"
+msgstr "Alleen openbare forums"
-#: ../../include/taxonomy.php:315
-msgid "want"
-msgstr "wil"
+#: ../../include/dir_fns.php:145
+msgid "This Website Only"
+msgstr "Alleen deze hub"
-#: ../../include/taxonomy.php:315
-msgid "wants"
-msgstr "wil"
+#: ../../include/network.php:756
+msgid "view full size"
+msgstr "volledige grootte tonen"
-#: ../../include/taxonomy.php:316
-msgid "likes"
-msgstr "vindt dit leuk"
+#: ../../include/network.php:2011
+msgid "No Subject"
+msgstr "Geen onderwerp"
-#: ../../include/taxonomy.php:317
-msgid "dislikes"
-msgstr "vindt dit niet leuk"
+#: ../../include/network.php:2267
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../include/text.php:460
-msgid "prev"
-msgstr "vorige"
+#: ../../include/network.php:2268
+msgid "GNU-Social"
+msgstr "GNU social"
-#: ../../include/text.php:462
-msgid "first"
-msgstr "eerste"
+#: ../../include/network.php:2269
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../include/text.php:491
-msgid "last"
-msgstr "laatste"
+#: ../../include/network.php:2272
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../include/text.php:494
-msgid "next"
-msgstr "volgende"
+#: ../../include/network.php:2273
+msgid "Zot"
+msgstr "Zot"
-#: ../../include/text.php:505
-msgid "older"
-msgstr "ouder"
+#: ../../include/network.php:2274
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../include/text.php:507
-msgid "newer"
-msgstr "nieuwer"
+#: ../../include/network.php:2275
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../include/text.php:904
-msgid "No connections"
-msgstr "Geen connecties"
+#: ../../include/network.php:2276
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../include/text.php:929
+#: ../../include/conversation.php:204
#, php-format
-msgid "View all %s connections"
-msgstr "Toon alle %s connecties"
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s is nu met %2$s verbonden"
-#: ../../include/text.php:1074 ../../include/text.php:1079
-msgid "poke"
-msgstr "aanstoten"
+#: ../../include/conversation.php:239
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s heeft %2$s aangestoten"
-#: ../../include/text.php:1074 ../../include/text.php:1079
-#: ../../include/conversation.php:243
+#: ../../include/conversation.php:243 ../../include/text.php:1098
+#: ../../include/text.php:1103
msgid "poked"
msgstr "aangestoten"
-#: ../../include/text.php:1080
-msgid "ping"
-msgstr "ping"
+#: ../../include/conversation.php:690
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Bekijk het profiel van %s @ %s"
-#: ../../include/text.php:1080
-msgid "pinged"
-msgstr "gepingd"
+#: ../../include/conversation.php:710
+msgid "Categories:"
+msgstr "Categorieën:"
-#: ../../include/text.php:1081
-msgid "prod"
-msgstr "por"
+#: ../../include/conversation.php:711
+msgid "Filed under:"
+msgstr "Bewaard onder:"
-#: ../../include/text.php:1081
-msgid "prodded"
-msgstr "gepord"
+#: ../../include/conversation.php:736
+msgid "View in context"
+msgstr "In context bekijken"
-#: ../../include/text.php:1082
-msgid "slap"
-msgstr "slaan"
+#: ../../include/conversation.php:832
+msgid "remove"
+msgstr "verwijderen"
-#: ../../include/text.php:1082
-msgid "slapped"
-msgstr "sloeg"
+#: ../../include/conversation.php:836 ../../include/nav.php:292
+msgid "Loading..."
+msgstr "Aan het laden..."
-#: ../../include/text.php:1083
-msgid "finger"
-msgstr "finger"
+#: ../../include/conversation.php:837
+msgid "Delete Selected Items"
+msgstr "Verwijder de geselecteerde items"
-#: ../../include/text.php:1083
-msgid "fingered"
-msgstr "gefingerd"
+#: ../../include/conversation.php:930 ../../include/conversation.php:972
+msgid "View Source"
+msgstr "Bron weergeven"
-#: ../../include/text.php:1084
-msgid "rebuff"
-msgstr "afpoeieren"
+#: ../../include/conversation.php:931 ../../include/conversation.php:982
+msgid "Follow Thread"
+msgstr "Conversatie volgen"
-#: ../../include/text.php:1084
-msgid "rebuffed"
-msgstr "afgepoeierd"
+#: ../../include/conversation.php:932 ../../include/conversation.php:991
+msgid "Unfollow Thread"
+msgstr "Conversatie niet meer volgen"
-#: ../../include/text.php:1096
-msgid "happy"
-msgstr "gelukkig"
+#: ../../include/conversation.php:937 ../../include/conversation.php:1059
+msgid "Activity/Posts"
+msgstr "Activiteit/berichten connectie"
-#: ../../include/text.php:1097
-msgid "sad"
-msgstr "bedroefd"
+#: ../../include/conversation.php:939 ../../include/conversation.php:1079
+msgid "Edit Connection"
+msgstr "Connectie bewerken"
-#: ../../include/text.php:1098
-msgid "mellow"
-msgstr "mellow"
+#: ../../include/conversation.php:940 ../../include/conversation.php:1089
+msgid "Message"
+msgstr "Bericht"
-#: ../../include/text.php:1099
-msgid "tired"
-msgstr "moe"
+#: ../../include/conversation.php:1223
+#, php-format
+msgid "%s likes this."
+msgstr "%s vindt dit leuk."
-#: ../../include/text.php:1100
-msgid "perky"
-msgstr "parmantig"
+#: ../../include/conversation.php:1223
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s vindt dit niet leuk."
-#: ../../include/text.php:1101
-msgid "angry"
-msgstr "boos"
+#: ../../include/conversation.php:1227
+#, php-format
+msgid "<span %1$s>%2$d people</span> like this."
+msgid_plural "<span %1$s>%2$d people</span> like this."
+msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit leuk."
-#: ../../include/text.php:1102
-msgid "stupefied"
-msgstr "verbijsterd"
+#: ../../include/conversation.php:1229
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgid_plural "<span %1$s>%2$d people</span> don't like this."
+msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit niet leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit niet leuk."
-#: ../../include/text.php:1103
-msgid "puzzled"
-msgstr "verward"
+#: ../../include/conversation.php:1235
+msgid "and"
+msgstr "en"
-#: ../../include/text.php:1104
-msgid "interested"
-msgstr "geïnteresseerd"
+#: ../../include/conversation.php:1238
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", en %d ander persoon"
+msgstr[1] ", en %d andere personen"
-#: ../../include/text.php:1105
-msgid "bitter"
-msgstr "verbitterd"
+#: ../../include/conversation.php:1239
+#, php-format
+msgid "%s like this."
+msgstr "%s vinden dit leuk."
-#: ../../include/text.php:1106
-msgid "cheerful"
-msgstr "vrolijk"
+#: ../../include/conversation.php:1239
+#, php-format
+msgid "%s don't like this."
+msgstr "%s vinden dit niet leuk."
-#: ../../include/text.php:1107
-msgid "alive"
-msgstr "levendig"
+#: ../../include/conversation.php:1282
+msgid "Set your location"
+msgstr "Locatie instellen"
-#: ../../include/text.php:1108
-msgid "annoyed"
-msgstr "geërgerd"
+#: ../../include/conversation.php:1283
+msgid "Clear browser location"
+msgstr "Locatie van webbrowser wissen"
-#: ../../include/text.php:1109
-msgid "anxious"
-msgstr "bezorgd"
+#: ../../include/conversation.php:1331
+msgid "Tag term:"
+msgstr "Tag:"
-#: ../../include/text.php:1110
-msgid "cranky"
-msgstr "humeurig"
+#: ../../include/conversation.php:1332
+msgid "Where are you right now?"
+msgstr "Waar bevind je je op dit moment?"
-#: ../../include/text.php:1111
-msgid "disturbed"
-msgstr "verontrust"
+#: ../../include/conversation.php:1337
+msgid "Choose a different album..."
+msgstr "Kies een ander album..."
-#: ../../include/text.php:1112
-msgid "frustrated"
-msgstr "gefrustreerd "
+#: ../../include/conversation.php:1341
+msgid "Comments enabled"
+msgstr "Reacties ingeschakeld"
-#: ../../include/text.php:1113
-msgid "depressed"
-msgstr "gedeprimeerd"
+#: ../../include/conversation.php:1342
+msgid "Comments disabled"
+msgstr "Reacties uitgeschakeld"
-#: ../../include/text.php:1114
-msgid "motivated"
-msgstr "gemotiveerd"
+#: ../../include/conversation.php:1380
+msgid "Page link name"
+msgstr "Linknaam pagina"
-#: ../../include/text.php:1115
-msgid "relaxed"
-msgstr "ontspannen"
+#: ../../include/conversation.php:1383
+msgid "Post as"
+msgstr "Bericht plaatsen als"
-#: ../../include/text.php:1116
-msgid "surprised"
-msgstr "verrast"
+#: ../../include/conversation.php:1397
+msgid "Toggle voting"
+msgstr "Peiling in- of uitschakelen"
-#: ../../include/text.php:1307
-msgid "May"
-msgstr "mei"
+#: ../../include/conversation.php:1400
+msgid "Disable comments"
+msgstr "Reacties uitschakelen"
-#: ../../include/text.php:1384 ../../include/text.php:1388
-msgid "Unknown Attachment"
-msgstr "Onbekende bijlage"
+#: ../../include/conversation.php:1401
+msgid "Toggle comments"
+msgstr "Reacties in- of uitschakelen"
-#: ../../include/text.php:1390
-msgid "unknown"
-msgstr "onbekend"
+#: ../../include/conversation.php:1409
+msgid "Categories (optional, comma-separated list)"
+msgstr "Categorieën (niet verplicht, door komma's gescheiden lijst)"
-#: ../../include/text.php:1426
-msgid "remove category"
-msgstr "categorie verwijderen"
+#: ../../include/conversation.php:1432
+msgid "Other networks and post services"
+msgstr "Andere netwerken en diensten"
-#: ../../include/text.php:1503
-msgid "remove from file"
-msgstr "uit map verwijderen"
+#: ../../include/conversation.php:1438
+msgid "Set publish date"
+msgstr "Publicatiedatum instellen"
-#: ../../include/text.php:1770 ../../include/language.php:367
-msgid "default"
-msgstr "standaard"
+#: ../../include/conversation.php:1692
+msgid "Discover"
+msgstr "Ontdekken"
-#: ../../include/text.php:1778
-msgid "Page layout"
-msgstr "Pagina-lay-out"
+#: ../../include/conversation.php:1695
+msgid "Imported public streams"
+msgstr "Openbare streams importeren"
-#: ../../include/text.php:1778
-msgid "You can create your own with the layouts tool"
-msgstr "Je kan jouw eigen lay-out ontwerpen onder lay-outs"
+#: ../../include/conversation.php:1700
+msgid "Commented Order"
+msgstr "Nieuwe reacties bovenaan"
-#: ../../include/text.php:1820
-msgid "Page content type"
-msgstr "Opmaaktype"
+#: ../../include/conversation.php:1703
+msgid "Sort by Comment Date"
+msgstr "Berichten met nieuwe reacties bovenaan"
-#: ../../include/text.php:1953
-msgid "activity"
-msgstr "activiteit"
+#: ../../include/conversation.php:1707
+msgid "Posted Order"
+msgstr "Nieuwe berichten bovenaan"
-#: ../../include/text.php:2267
-msgid "Design Tools"
-msgstr "Ontwerp-hulpmiddelen"
+#: ../../include/conversation.php:1710
+msgid "Sort by Post Date"
+msgstr "Nieuwe berichten bovenaan"
-#: ../../include/text.php:2273
-msgid "Pages"
-msgstr "Pagina's"
+#: ../../include/conversation.php:1718
+msgid "Posts that mention or involve you"
+msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
-#: ../../include/text.php:2295
-msgid "Import website..."
-msgstr "Website importeren..."
+#: ../../include/conversation.php:1727
+msgid "Activity Stream - by date"
+msgstr "Activiteitenstroom - volgens datum"
-#: ../../include/text.php:2296
-msgid "Select folder to import"
-msgstr "Kies een map om te importeren"
+#: ../../include/conversation.php:1733
+msgid "Starred"
+msgstr "Met ster"
-#: ../../include/text.php:2297
-msgid "Import from a zipped folder:"
-msgstr "Vanuit een zipbestand importeren:"
+#: ../../include/conversation.php:1736
+msgid "Favourite Posts"
+msgstr "Favoriete berichten"
-#: ../../include/text.php:2298
-msgid "Import from cloud files:"
-msgstr "Vanuit de cloud importeren:"
+#: ../../include/conversation.php:1743
+msgid "Spam"
+msgstr "Spam"
-#: ../../include/text.php:2299
-msgid "/cloud/channel/path/to/folder"
-msgstr "/cloud/channel/maplocatie"
+#: ../../include/conversation.php:1746
+msgid "Posts flagged as SPAM"
+msgstr "Berichten gemarkeerd als SPAM"
-#: ../../include/text.php:2300
-msgid "Enter path to website files"
-msgstr "Voer de locatie in van de websitebestanden"
+#: ../../include/conversation.php:1818
+msgid "Status Messages and Posts"
+msgstr "Berichten in dit kanaal"
-#: ../../include/text.php:2301
-msgid "Select folder"
-msgstr "Kies een map"
+#: ../../include/conversation.php:1830
+msgid "Profile Details"
+msgstr "Profiel"
-#: ../../include/text.php:2302
-msgid "Export website..."
-msgstr "Website exporteren..."
+#: ../../include/conversation.php:1839 ../../include/photos.php:515
+msgid "Photo Albums"
+msgstr "Fotoalbums"
-#: ../../include/text.php:2303
-msgid "Export to a zip file"
-msgstr "Naar een zipbestand exporteren"
+#: ../../include/conversation.php:1846
+msgid "Files and Storage"
+msgstr "Bestanden en opslagruimte"
-#: ../../include/text.php:2304
-msgid "website.zip"
-msgstr "website.zip"
+#: ../../include/conversation.php:1879
+msgid "Bookmarks"
+msgstr "Bladwijzers"
-#: ../../include/text.php:2305
-msgid "Enter a name for the zip file."
-msgstr "Vul een naam in voor het zipbestand."
+#: ../../include/conversation.php:1882
+msgid "Saved Bookmarks"
+msgstr "Opgeslagen bladwijzers"
-#: ../../include/text.php:2306
-msgid "Export to cloud files"
-msgstr "Naar de cloud exporteren"
+#: ../../include/conversation.php:1892
+msgid "View Webpages"
+msgstr "Webpagina's weergeven"
-#: ../../include/text.php:2307
-msgid "/path/to/export/folder"
-msgstr "/locatie/van/export/map"
+#: ../../include/conversation.php:1958
+msgctxt "noun"
+msgid "Attending"
+msgid_plural "Attending"
+msgstr[0] "aanwezig"
+msgstr[1] "aanwezig"
-#: ../../include/text.php:2308
-msgid "Enter a path to a cloud files destination."
-msgstr "Voer de locatie in van de cloudbestemming"
+#: ../../include/conversation.php:1961
+msgctxt "noun"
+msgid "Not Attending"
+msgid_plural "Not Attending"
+msgstr[0] "niet aanwezig"
+msgstr[1] "niet aanwezig"
-#: ../../include/text.php:2309
-msgid "Specify folder"
-msgstr "Selecteer een map"
+#: ../../include/conversation.php:1964
+msgctxt "noun"
+msgid "Undecided"
+msgid_plural "Undecided"
+msgstr[0] "nog niet beslist"
+msgstr[1] "nog niet beslist"
-#: ../../include/import.php:30
+#: ../../include/conversation.php:1967
+msgctxt "noun"
+msgid "Agree"
+msgid_plural "Agrees"
+msgstr[0] "eens"
+msgstr[1] "eens"
+
+#: ../../include/conversation.php:1970
+msgctxt "noun"
+msgid "Disagree"
+msgid_plural "Disagrees"
+msgstr[0] "oneens"
+msgstr[1] "oneens"
+
+#: ../../include/conversation.php:1973
+msgctxt "noun"
+msgid "Abstain"
+msgid_plural "Abstains"
+msgstr[0] "onthouding"
+msgstr[1] "onthoudingen"
+
+#: ../../include/group.php:26
msgid ""
-"Cannot create a duplicate channel identifier on this system. Import failed."
-msgstr "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt."
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken."
-#: ../../include/import.php:90
-msgid "Channel clone failed. Import failed."
-msgstr "Het klonen van het kanaal is mislukt. Importeren mislukt."
+#: ../../include/group.php:268
+msgid "Add new connections to this privacy group"
+msgstr "Voeg nieuwe connecties aan deze privacygroep toe"
-#: ../../include/import.php:1354
-msgid "Unable to import element \""
-msgstr "Niet in staat om dit element te importeren: \""
+#: ../../include/group.php:309
+msgid "edit"
+msgstr "bewerken"
-#: ../../include/security.php:117
-msgid "guest:"
-msgstr "gast:"
+#: ../../include/group.php:331 ../../include/features.php:292
+msgid "Privacy Groups"
+msgstr "Privacygroepen"
-#: ../../include/security.php:535
-msgid ""
-"The form security token was not correct. This probably happened because the "
-"form has been opened for too long (>3 hours) before submitting it."
-msgstr "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. "
+#: ../../include/group.php:332
+msgid "Edit group"
+msgstr "Privacygroep bewerken"
+
+#: ../../include/group.php:333
+msgid "Add privacy group"
+msgstr "Privacygroep toevoegen"
+
+#: ../../include/group.php:334
+msgid "Channels not in any privacy group"
+msgstr "Kanalen die zich in geen enkele privacygroep bevinden"
-#: ../../include/items.php:837 ../../include/items.php:882
+#: ../../include/items.php:843 ../../include/items.php:890
msgid "(Unknown)"
msgstr "(Onbekend)"
-#: ../../include/items.php:1080
+#: ../../include/items.php:1091
msgid "Visible to anybody on the internet."
msgstr "Voor iedereen op het internet zichtbaar."
-#: ../../include/items.php:1082
+#: ../../include/items.php:1093
msgid "Visible to you only."
msgstr "Alleen voor jou zichtbaar."
-#: ../../include/items.php:1084
+#: ../../include/items.php:1095
msgid "Visible to anybody in this network."
msgstr "Voor iedereen in dit netwerk zichtbaar."
-#: ../../include/items.php:1086
+#: ../../include/items.php:1097
msgid "Visible to anybody authenticated."
msgstr "Voor iedereen die geauthenticeerd is zichtbaar."
-#: ../../include/items.php:1088
+#: ../../include/items.php:1099
#, php-format
msgid "Visible to anybody on %s."
msgstr "Voor iedereen op %s zichtbaar."
-#: ../../include/items.php:1090
+#: ../../include/items.php:1101
msgid "Visible to all connections."
msgstr "Voor alle connecties zichtbaar."
-#: ../../include/items.php:1092
+#: ../../include/items.php:1103
msgid "Visible to approved connections."
msgstr "Voor alle geaccepteerde connecties zichtbaar."
-#: ../../include/items.php:1094
+#: ../../include/items.php:1105
msgid "Visible to specific connections."
msgstr "Voor specifieke connecties zichtbaar."
-#: ../../include/items.php:3892
+#: ../../include/items.php:3917
msgid "Privacy group is empty."
msgstr "Privacygroep is leeg"
-#: ../../include/items.php:3899
+#: ../../include/items.php:3924
#, php-format
msgid "Privacy group: %s"
msgstr "Privacygroep: %s"
-#: ../../include/items.php:3911
+#: ../../include/items.php:3936
msgid "Connection not found."
msgstr "Connectie niet gevonden."
-#: ../../include/items.php:4260
+#: ../../include/items.php:4285
msgid "profile photo"
msgstr "profielfoto"
-#: ../../include/items.php:4456
+#: ../../include/items.php:4481
#, php-format
msgid "[Edited %s]"
msgstr "[%s bewerkt]"
-#: ../../include/items.php:4456
+#: ../../include/items.php:4481
msgctxt "edit_activity"
msgid "Post"
msgstr "Bericht"
-#: ../../include/items.php:4456
+#: ../../include/items.php:4481
msgctxt "edit_activity"
msgid "Comment"
msgstr "Reactie"
-#: ../../include/auth.php:148
-msgid "Logged out."
-msgstr "Uitgelogd."
+#: ../../include/markdown.php:445
+msgid "Attachments:"
+msgstr "Bijlagen:"
-#: ../../include/auth.php:275
-msgid "Failed authentication"
-msgstr "Mislukte authenticatie"
+#: ../../include/markdown.php:542
+msgid "$Projectname event notification:"
+msgstr "Notificatie $Projectname-gebeurtenis:"
-#: ../../include/activities.php:41
-msgid " and "
-msgstr " en "
+#: ../../include/security.php:117
+msgid "guest:"
+msgstr "gast:"
-#: ../../include/activities.php:49
-msgid "public profile"
-msgstr "openbaar profiel"
+#: ../../include/security.php:532
+msgid ""
+"The form security token was not correct. This probably happened because the "
+"form has been opened for too long (>3 hours) before submitting it."
+msgstr "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. "
-#: ../../include/activities.php:58
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s veranderde %2$s naar &ldquo;%3$s&rdquo;"
+#: ../../include/nav.php:88
+msgid "Remote authentication"
+msgstr "Authenticatie op afstand"
-#: ../../include/activities.php:59
-#, php-format
-msgid "Visit %1$s's %2$s"
-msgstr "Bezoek het %2$s van %1$s"
+#: ../../include/nav.php:88
+msgid "Click to authenticate to your home hub"
+msgstr "Authenticeer jezelf via (bijvoorbeeld) jouw hub"
-#: ../../include/activities.php:62
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s heeft een aangepaste %2$s, %3$s veranderd."
+#: ../../include/nav.php:99 ../../include/nav.php:140 ../../boot.php:1748
+msgid "Logout"
+msgstr "Uitloggen"
+
+#: ../../include/nav.php:99 ../../include/nav.php:140
+msgid "End this session"
+msgstr "Beëindig deze sessie"
+
+#: ../../include/nav.php:103
+msgid "Your profile page"
+msgstr "Jouw profielpagina"
+
+#: ../../include/nav.php:105
+msgid "Manage/Edit profiles"
+msgstr "Beheer/wijzig profielen"
+
+#: ../../include/nav.php:107
+msgid "Edit your profile"
+msgstr "Jouw profiel bewerken"
+
+#: ../../include/nav.php:130
+msgid "Sign in"
+msgstr "Inloggen"
+
+#: ../../include/nav.php:155
+msgid "Get me home"
+msgstr "Terug naar mijn hub"
+
+#: ../../include/nav.php:157
+msgid "Log me out of this site"
+msgstr "Uitloggen op deze hub"
+
+#: ../../include/nav.php:162
+msgid "Create an account"
+msgstr "Maak een account aan"
+
+#: ../../include/nav.php:174
+msgid "Help and documentation"
+msgstr "Hulp en documentatie"
+
+#: ../../include/nav.php:178
+msgid "Applications, utilities, links, games"
+msgstr "Apps"
+
+#: ../../include/nav.php:180
+msgid "Search site @name, #tag, ?docs, content"
+msgstr "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie "
+
+#: ../../include/nav.php:182
+msgid "Channel Directory"
+msgstr "Kanalengids"
+
+#: ../../include/nav.php:194
+msgid "Your grid"
+msgstr "Jouw grid"
+
+#: ../../include/nav.php:195
+msgid "View your network/grid"
+msgstr "Jouw grid/netwerk weergeven"
+
+#: ../../include/nav.php:196
+msgid "Mark all grid notifications seen"
+msgstr "Markeer alle gridnotificaties als bekeken"
+
+#: ../../include/nav.php:198
+msgid "Channel home"
+msgstr "Jouw kanaal"
+
+#: ../../include/nav.php:199
+msgid "View your channel home"
+msgstr "Jouw kanaal weergeven"
+
+#: ../../include/nav.php:200
+msgid "Mark all channel notifications seen"
+msgstr "Alle kanaalnotificaties als gelezen markeren"
+
+#: ../../include/nav.php:206
+msgid "Notices"
+msgstr "Notificaties"
+
+#: ../../include/nav.php:206
+msgid "Notifications"
+msgstr "Notificaties"
+
+#: ../../include/nav.php:207
+msgid "View all notifications"
+msgstr "Alle notificaties weergeven"
+
+#: ../../include/nav.php:210
+msgid "Private mail"
+msgstr "Privéberichten"
+
+#: ../../include/nav.php:211
+msgid "View your private messages"
+msgstr "Privéberichten weergeven"
+
+#: ../../include/nav.php:212
+msgid "Mark all private messages seen"
+msgstr "Markeer alle privéberichten als bekeken"
+
+#: ../../include/nav.php:218
+msgid "Event Calendar"
+msgstr "Agenda"
+
+#: ../../include/nav.php:219
+msgid "View events"
+msgstr "Agenda weergeven"
+
+#: ../../include/nav.php:220
+msgid "Mark all events seen"
+msgstr "Markeer alle gebeurtenissen als bekeken"
+
+#: ../../include/nav.php:223
+msgid "Manage Your Channels"
+msgstr "Beheer je kanalen"
+
+#: ../../include/nav.php:225
+msgid "Account/Channel Settings"
+msgstr "Account-/kanaal-instellingen"
+
+#: ../../include/nav.php:233
+msgid "Site Setup and Configuration"
+msgstr "Hub instellen en beheren"
+
+#: ../../include/nav.php:297
+msgid "@name, #tag, ?doc, content"
+msgstr "@kanaal, #tag, inhoud, ?hulp"
+
+#: ../../include/nav.php:298
+msgid "Please wait..."
+msgstr "Wachten aub..."
-#: ../../include/attach.php:248 ../../include/attach.php:336
+#: ../../include/nav.php:300
+msgid "Add Apps"
+msgstr "Apps toevoegen"
+
+#: ../../include/attach.php:250 ../../include/attach.php:338
msgid "Item was not found."
msgstr "Item niet gevonden"
-#: ../../include/attach.php:497
+#: ../../include/attach.php:499
msgid "No source file."
msgstr "Geen bronbestand."
-#: ../../include/attach.php:519
+#: ../../include/attach.php:521
msgid "Cannot locate file to replace"
msgstr "Kan het te vervangen bestand niet vinden"
-#: ../../include/attach.php:537
+#: ../../include/attach.php:539
msgid "Cannot locate file to revise/update"
msgstr "Kan het bestand wat aangepast moet worden niet vinden"
-#: ../../include/attach.php:668
+#: ../../include/attach.php:670
#, php-format
msgid "File exceeds size limit of %d"
msgstr "Bestand is groter dan de toegelaten %d"
-#: ../../include/attach.php:682
+#: ../../include/attach.php:684
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt."
-#: ../../include/attach.php:852
+#: ../../include/attach.php:854
msgid "File upload failed. Possible system limit or action terminated."
msgstr "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken."
-#: ../../include/attach.php:865
+#: ../../include/attach.php:867
msgid "Stored file could not be verified. Upload failed."
msgstr "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt."
-#: ../../include/attach.php:920 ../../include/attach.php:936
+#: ../../include/attach.php:922 ../../include/attach.php:938
msgid "Path not available."
msgstr "Locatie niet beschikbaar."
-#: ../../include/attach.php:982 ../../include/attach.php:1140
+#: ../../include/attach.php:984 ../../include/attach.php:1142
msgid "Empty pathname"
msgstr "Ontbrekende locatienaam"
-#: ../../include/attach.php:1008
+#: ../../include/attach.php:1010
msgid "duplicate filename or path"
msgstr "dubbele bestandsnaam of locatie"
-#: ../../include/attach.php:1030
+#: ../../include/attach.php:1032
msgid "Path not found."
msgstr "Locatie niet gevonden"
-#: ../../include/attach.php:1094
+#: ../../include/attach.php:1096
msgid "mkdir failed."
msgstr "directory aanmaken (mkdir) mislukt."
-#: ../../include/attach.php:1098
+#: ../../include/attach.php:1100
msgid "database storage failed."
msgstr "opslag in database mislukt."
-#: ../../include/attach.php:1146
+#: ../../include/attach.php:1148
msgid "Empty path"
msgstr "Ontbrekende locatie"
-#: ../../include/event.php:824
-msgid "This event has been added to your calendar."
-msgstr "Dit evenement is aan jouw agenda toegevoegd."
-
-#: ../../include/event.php:1024
-msgid "Not specified"
-msgstr "Niet aangegeven"
-
-#: ../../include/event.php:1025
-msgid "Needs Action"
-msgstr "Actie vereist"
-
-#: ../../include/event.php:1026
-msgid "Completed"
-msgstr "Voltooid"
-
-#: ../../include/event.php:1027
-msgid "In Process"
-msgstr "In behandeling"
-
-#: ../../include/event.php:1028
-msgid "Cancelled"
-msgstr "Geannuleerd"
-
-#: ../../include/follow.php:27
-msgid "Channel is blocked on this site."
-msgstr "Kanaal is op deze hub geblokkeerd."
-
-#: ../../include/follow.php:32
-msgid "Channel location missing."
-msgstr "Ontbrekende kanaallocatie."
-
-#: ../../include/follow.php:80
-msgid "Response from remote channel was incomplete."
-msgstr "Antwoord van het kanaal op afstand was niet volledig."
+#: ../../include/text.php:461
+msgid "prev"
+msgstr "vorige"
-#: ../../include/follow.php:97
-msgid "Channel was deleted and no longer exists."
-msgstr "Kanaal is verwijderd en bestaat niet meer."
+#: ../../include/text.php:463
+msgid "first"
+msgstr "eerste"
-#: ../../include/follow.php:147 ../../include/follow.php:183
-msgid "Protocol disabled."
-msgstr "Protocol uitgeschakeld."
+#: ../../include/text.php:492
+msgid "last"
+msgstr "laatste"
-#: ../../include/follow.php:171
-msgid "Channel discovery failed."
-msgstr "Kanaal ontdekken mislukt."
+#: ../../include/text.php:495
+msgid "next"
+msgstr "volgende"
-#: ../../include/follow.php:210
-msgid "Cannot connect to yourself."
-msgstr "Kan niet met jezelf verbinden"
+#: ../../include/text.php:506
+msgid "older"
+msgstr "ouder"
-#: ../../include/group.php:26
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken."
+#: ../../include/text.php:508
+msgid "newer"
+msgstr "nieuwer"
-#: ../../include/group.php:248
-msgid "Add new connections to this privacy group"
-msgstr "Voeg nieuwe connecties aan deze privacygroep toe"
+#: ../../include/text.php:928
+msgid "No connections"
+msgstr "Geen connecties"
-#: ../../include/group.php:289
-msgid "edit"
-msgstr "bewerken"
+#: ../../include/text.php:953
+#, php-format
+msgid "View all %s connections"
+msgstr "Toon alle %s connecties"
-#: ../../include/group.php:312
-msgid "Edit group"
-msgstr "Privacygroep bewerken"
+#: ../../include/text.php:1098 ../../include/text.php:1103
+msgid "poke"
+msgstr "aanstoten"
-#: ../../include/group.php:313
-msgid "Add privacy group"
-msgstr "Privacygroep toevoegen"
+#: ../../include/text.php:1104
+msgid "ping"
+msgstr "ping"
-#: ../../include/group.php:314
-msgid "Channels not in any privacy group"
-msgstr "Kanalen die zich in geen enkele privacygroep bevinden"
+#: ../../include/text.php:1104
+msgid "pinged"
+msgstr "gepingd"
-#: ../../include/group.php:316 ../../include/widgets.php:284
-msgid "add"
-msgstr "toevoegen"
+#: ../../include/text.php:1105
+msgid "prod"
+msgstr "por"
-#: ../../include/language.php:380
-msgid "Select an alternate language"
-msgstr "Kies een andere taal"
+#: ../../include/text.php:1105
+msgid "prodded"
+msgstr "gepord"
-#: ../../include/photos.php:115
-#, php-format
-msgid "Image exceeds website size limit of %lu bytes"
-msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
+#: ../../include/text.php:1106
+msgid "slap"
+msgstr "slaan"
-#: ../../include/photos.php:122
-msgid "Image file is empty."
-msgstr "Afbeeldingsbestand is leeg"
+#: ../../include/text.php:1106
+msgid "slapped"
+msgstr "sloeg"
-#: ../../include/photos.php:260
-msgid "Photo storage failed."
-msgstr "Foto kan niet worden opgeslagen"
+#: ../../include/text.php:1107
+msgid "finger"
+msgstr "finger"
-#: ../../include/photos.php:300
-msgid "a new photo"
-msgstr "een nieuwe foto"
+#: ../../include/text.php:1107
+msgid "fingered"
+msgstr "gefingerd"
-#: ../../include/photos.php:304
-#, php-format
-msgctxt "photo_upload"
-msgid "%1$s posted %2$s to %3$s"
-msgstr "%1$s plaatste %2$s op %3$s"
+#: ../../include/text.php:1108
+msgid "rebuff"
+msgstr "afpoeieren"
-#: ../../include/photos.php:507 ../../include/conversation.php:1677
-msgid "Photo Albums"
-msgstr "Fotoalbums"
+#: ../../include/text.php:1108
+msgid "rebuffed"
+msgstr "afgepoeierd"
-#: ../../include/photos.php:511
-msgid "Upload New Photos"
-msgstr "Nieuwe foto's uploaden"
+#: ../../include/text.php:1120
+msgid "happy"
+msgstr "gelukkig"
-#: ../../include/acl_selectors.php:198
-msgid "Who can see this?"
-msgstr "Wie kan dit zien?"
+#: ../../include/text.php:1121
+msgid "sad"
+msgstr "bedroefd"
-#: ../../include/acl_selectors.php:199
-msgid "Custom selection"
-msgstr "Handmatige selectie"
+#: ../../include/text.php:1122
+msgid "mellow"
+msgstr "mellow"
-#: ../../include/acl_selectors.php:200
-msgid ""
-"Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit"
-" the scope of \"Show\"."
-msgstr "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\"."
+#: ../../include/text.php:1123
+msgid "tired"
+msgstr "moe"
-#: ../../include/acl_selectors.php:201
-msgid "Show"
-msgstr "Tonen"
+#: ../../include/text.php:1124
+msgid "perky"
+msgstr "parmantig"
-#: ../../include/acl_selectors.php:202
-msgid "Don't show"
-msgstr "Niet tonen"
+#: ../../include/text.php:1125
+msgid "angry"
+msgstr "boos"
-#: ../../include/acl_selectors.php:235
-#, php-format
-msgid ""
-"Post permissions %s cannot be changed %s after a post is shared.</br />These"
-" permissions set who is allowed to view the post."
-msgstr "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien."
+#: ../../include/text.php:1126
+msgid "stupefied"
+msgstr "verbijsterd"
-#: ../../include/oembed.php:312
-msgid " by "
-msgstr " door "
+#: ../../include/text.php:1127
+msgid "puzzled"
+msgstr "verward"
-#: ../../include/oembed.php:313
-msgid " on "
-msgstr " op "
+#: ../../include/text.php:1128
+msgid "interested"
+msgstr "geïnteresseerd"
-#: ../../include/oembed.php:342
-msgid "Embedded content"
-msgstr "Ingesloten (embedded) inhoud"
+#: ../../include/text.php:1129
+msgid "bitter"
+msgstr "verbitterd"
-#: ../../include/oembed.php:351
-msgid "Embedding disabled"
-msgstr "Insluiten (embedding) uitgeschakeld"
+#: ../../include/text.php:1130
+msgid "cheerful"
+msgstr "vrolijk"
-#: ../../include/widgets.php:103
-msgid "System"
-msgstr "Systeem"
+#: ../../include/text.php:1131
+msgid "alive"
+msgstr "levendig"
-#: ../../include/widgets.php:106
-msgid "New App"
-msgstr "Nieuwe app"
+#: ../../include/text.php:1132
+msgid "annoyed"
+msgstr "geërgerd"
-#: ../../include/widgets.php:154
-msgid "Suggestions"
-msgstr "Voorgestelde kanalen"
+#: ../../include/text.php:1133
+msgid "anxious"
+msgstr "bezorgd"
-#: ../../include/widgets.php:155
-msgid "See more..."
-msgstr "Meer..."
+#: ../../include/text.php:1134
+msgid "cranky"
+msgstr "humeurig"
-#: ../../include/widgets.php:175
-#, php-format
-msgid "You have %1$.0f of %2$.0f allowed connections."
-msgstr "Je hebt %1$.0f van de %2$.0f toegestane connecties."
+#: ../../include/text.php:1135
+msgid "disturbed"
+msgstr "verontrust"
-#: ../../include/widgets.php:181
-msgid "Add New Connection"
-msgstr "Nieuwe connectie toevoegen"
+#: ../../include/text.php:1136
+msgid "frustrated"
+msgstr "gefrustreerd "
-#: ../../include/widgets.php:182
-msgid "Enter channel address"
-msgstr "Vul kanaaladres in"
+#: ../../include/text.php:1137
+msgid "depressed"
+msgstr "gedeprimeerd"
-#: ../../include/widgets.php:183
-msgid "Examples: bob@example.com, https://example.com/barbara"
-msgstr "Voorbeelden: bob@example.com, http://example.com/barbara"
+#: ../../include/text.php:1138
+msgid "motivated"
+msgstr "gemotiveerd"
-#: ../../include/widgets.php:199
-msgid "Notes"
-msgstr "Aantekeningen"
+#: ../../include/text.php:1139
+msgid "relaxed"
+msgstr "ontspannen"
-#: ../../include/widgets.php:275
-msgid "Remove term"
-msgstr "Verwijder zoekterm"
+#: ../../include/text.php:1140
+msgid "surprised"
+msgstr "verrast"
-#: ../../include/widgets.php:390
-msgid "Archives"
-msgstr "Archieven"
+#: ../../include/text.php:1331
+msgid "May"
+msgstr "mei"
-#: ../../include/widgets.php:552
-msgid "Refresh"
-msgstr "Vernieuwen"
+#: ../../include/text.php:1408 ../../include/text.php:1412
+msgid "Unknown Attachment"
+msgstr "Onbekende bijlage"
-#: ../../include/widgets.php:592
-msgid "Account settings"
-msgstr "Account"
+#: ../../include/text.php:1414
+msgid "unknown"
+msgstr "onbekend"
-#: ../../include/widgets.php:598
-msgid "Channel settings"
-msgstr "Kanaal"
+#: ../../include/text.php:1450
+msgid "remove category"
+msgstr "categorie verwijderen"
-#: ../../include/widgets.php:607
-msgid "Additional features"
-msgstr "Extra functies"
+#: ../../include/text.php:1527
+msgid "remove from file"
+msgstr "uit map verwijderen"
-#: ../../include/widgets.php:614
-msgid "Feature/Addon settings"
-msgstr "Plugin-instellingen"
+#: ../../include/text.php:1796
+msgid "Page layout"
+msgstr "Pagina-lay-out"
-#: ../../include/widgets.php:620
-msgid "Display settings"
-msgstr "Weergave"
+#: ../../include/text.php:1796
+msgid "You can create your own with the layouts tool"
+msgstr "Je kan jouw eigen lay-out ontwerpen onder lay-outs"
-#: ../../include/widgets.php:627
-msgid "Manage locations"
-msgstr "Locaties beheren"
+#: ../../include/text.php:1838
+msgid "Page content type"
+msgstr "Opmaaktype"
-#: ../../include/widgets.php:634
-msgid "Export channel"
-msgstr "Kanaal exporteren"
+#: ../../include/text.php:1971
+msgid "activity"
+msgstr "activiteit"
-#: ../../include/widgets.php:640
-msgid "Connected apps"
-msgstr "Verbonden applicaties"
+#: ../../include/text.php:2285
+msgid "Design Tools"
+msgstr "Ontwerp-hulpmiddelen"
-#: ../../include/widgets.php:664
-msgid "Premium Channel Settings"
-msgstr "Instellingen premiumkanaal"
+#: ../../include/text.php:2291
+msgid "Pages"
+msgstr "Pagina's"
-#: ../../include/widgets.php:693
-msgid "Private Mail Menu"
-msgstr "Privéberichten"
+#: ../../include/text.php:2313
+msgid "Import website..."
+msgstr "Website importeren..."
-#: ../../include/widgets.php:695
-msgid "Combined View"
-msgstr "Gecombineerd postvak"
+#: ../../include/text.php:2314
+msgid "Select folder to import"
+msgstr "Kies een map om te importeren"
-#: ../../include/widgets.php:727 ../../include/widgets.php:739
-msgid "Conversations"
-msgstr "Conversaties"
+#: ../../include/text.php:2315
+msgid "Import from a zipped folder:"
+msgstr "Vanuit een zipbestand importeren:"
-#: ../../include/widgets.php:731
-msgid "Received Messages"
-msgstr "Ontvangen berichten"
+#: ../../include/text.php:2316
+msgid "Import from cloud files:"
+msgstr "Vanuit de cloud importeren:"
-#: ../../include/widgets.php:735
-msgid "Sent Messages"
-msgstr "Verzonden berichten"
+#: ../../include/text.php:2317
+msgid "/cloud/channel/path/to/folder"
+msgstr "/cloud/channel/maplocatie"
-#: ../../include/widgets.php:749
-msgid "No messages."
-msgstr "Geen berichten"
+#: ../../include/text.php:2318
+msgid "Enter path to website files"
+msgstr "Voer de locatie in van de websitebestanden"
-#: ../../include/widgets.php:767
-msgid "Delete conversation"
-msgstr "Verwijder conversatie"
+#: ../../include/text.php:2319
+msgid "Select folder"
+msgstr "Kies een map"
-#: ../../include/widgets.php:793
-msgid "Events Tools"
-msgstr "Agenda-hulpmiddelen"
+#: ../../include/text.php:2320
+msgid "Export website..."
+msgstr "Website exporteren..."
-#: ../../include/widgets.php:794
-msgid "Export Calendar"
-msgstr "Exporteren"
+#: ../../include/text.php:2321
+msgid "Export to a zip file"
+msgstr "Naar een zipbestand exporteren"
-#: ../../include/widgets.php:795
-msgid "Import Calendar"
-msgstr "Importeren"
+#: ../../include/text.php:2322
+msgid "website.zip"
+msgstr "website.zip"
-#: ../../include/widgets.php:883 ../../include/conversation.php:1704
-#: ../../include/conversation.php:1707
-msgid "Chatrooms"
-msgstr "Chatkanalen"
+#: ../../include/text.php:2323
+msgid "Enter a name for the zip file."
+msgstr "Vul een naam in voor het zipbestand."
-#: ../../include/widgets.php:887
-msgid "Overview"
-msgstr "Overzicht"
+#: ../../include/text.php:2324
+msgid "Export to cloud files"
+msgstr "Naar de cloud exporteren"
-#: ../../include/widgets.php:894
-msgid "Chat Members"
-msgstr "Chatleden"
+#: ../../include/text.php:2325
+msgid "/path/to/export/folder"
+msgstr "/locatie/van/export/map"
-#: ../../include/widgets.php:906
-msgid "Wiki List"
-msgstr "Wiki's"
+#: ../../include/text.php:2326
+msgid "Enter a path to a cloud files destination."
+msgstr "Voer de locatie in van de cloudbestemming"
-#: ../../include/widgets.php:944
-msgid "Wiki Pages"
-msgstr "Wikipagina's"
+#: ../../include/text.php:2327
+msgid "Specify folder"
+msgstr "Selecteer een map"
-#: ../../include/widgets.php:949
-msgid "Add new page"
-msgstr "Nieuwe pagina toevoegen"
+#: ../../include/auth.php:148
+msgid "Logged out."
+msgstr "Uitgelogd."
-#: ../../include/widgets.php:950
-msgid "Page name"
-msgstr "Paginanaam"
+#: ../../include/auth.php:275
+msgid "Failed authentication"
+msgstr "Mislukte authenticatie"
-#: ../../include/widgets.php:983
-msgid "Bookmarked Chatrooms"
-msgstr "Bladwijzers van chatkanalen"
+#: ../../include/follow.php:26
+msgid "Channel is blocked on this site."
+msgstr "Kanaal is op deze hub geblokkeerd."
-#: ../../include/widgets.php:1014
-msgid "Suggested Chatrooms"
-msgstr "Voorgestelde chatkanalen"
+#: ../../include/follow.php:31
+msgid "Channel location missing."
+msgstr "Ontbrekende kanaallocatie."
-#: ../../include/widgets.php:1159 ../../include/widgets.php:1271
-msgid "photo/image"
-msgstr "foto/afbeelding"
+#: ../../include/follow.php:73
+msgid "Response from remote channel was incomplete."
+msgstr "Antwoord van het kanaal op afstand was niet volledig."
-#: ../../include/widgets.php:1214
-msgid "Click to show more"
-msgstr "Klik voor meer"
+#: ../../include/follow.php:90
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanaal is verwijderd en bestaat niet meer."
-#: ../../include/widgets.php:1365
-msgid "Rating Tools"
-msgstr "Beoordelingen"
+#: ../../include/follow.php:140 ../../include/follow.php:175
+msgid "Protocol disabled."
+msgstr "Protocol uitgeschakeld."
-#: ../../include/widgets.php:1369 ../../include/widgets.php:1371
-msgid "Rate Me"
-msgstr "Beoordeel mij"
+#: ../../include/follow.php:163
+msgid "Channel discovery failed."
+msgstr "Kanaal ontdekken mislukt."
-#: ../../include/widgets.php:1374
-msgid "View Ratings"
-msgstr "Bekijk beoordelingen"
+#: ../../include/follow.php:202
+msgid "Cannot connect to yourself."
+msgstr "Kan niet met jezelf verbinden"
-#: ../../include/widgets.php:1467
-msgid "Forums"
-msgstr "Forums"
+#: ../../include/import.php:30
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt."
-#: ../../include/widgets.php:1496
-msgid "Tasks"
-msgstr "Taken"
+#: ../../include/import.php:90
+msgid "Channel clone failed. Import failed."
+msgstr "Het klonen van het kanaal is mislukt. Importeren mislukt."
-#: ../../include/widgets.php:1562 ../../include/widgets.php:1600
-msgid "Member registrations waiting for confirmation"
-msgstr "Accounts die op goedkeuring wachten"
+#: ../../include/import.php:100
+msgid "Cloned channel not found. Import failed."
+msgstr "Gekloond kanaal niet gevonden. Importeren mislukt."
-#: ../../include/widgets.php:1568
-msgid "Inspect queue"
-msgstr "Inspecteer berichtenwachtrij"
+#: ../../include/import.php:1373
+msgid "Unable to import element \""
+msgstr "Niet in staat om dit element te importeren: \""
-#: ../../include/widgets.php:1570
-msgid "DB updates"
-msgstr "Database-updates"
+#: ../../include/message.php:32
+msgid "Unable to determine sender."
+msgstr "Afzender kan niet bepaald worden."
-#: ../../include/widgets.php:1596
-msgid "Plugin Features"
-msgstr "Plugin-opties"
+#: ../../include/message.php:69
+msgid "No recipient provided."
+msgstr "Geen ontvanger opgegeven."
-#: ../../include/network.php:729
-msgid "view full size"
-msgstr "volledige grootte tonen"
+#: ../../include/message.php:74
+msgid "[no subject]"
+msgstr "[geen onderwerp]"
-#: ../../include/network.php:1978
-msgid "No Subject"
-msgstr "Geen onderwerp"
+#: ../../include/message.php:225
+msgid "Stored post could not be verified."
+msgstr "Opgeslagen bericht kon niet worden geverifieerd."
-#: ../../include/network.php:2234
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../include/oembed.php:308
+msgid " by "
+msgstr " door "
-#: ../../include/network.php:2235
-msgid "GNU-Social"
-msgstr "GNU social"
+#: ../../include/oembed.php:309
+msgid " on "
+msgstr " op "
-#: ../../include/network.php:2236
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../include/oembed.php:338
+msgid "Embedded content"
+msgstr "Ingesloten (embedded) inhoud"
-#: ../../include/network.php:2239
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/oembed.php:347
+msgid "Embedding disabled"
+msgstr "Insluiten (embedding) uitgeschakeld"
-#: ../../include/network.php:2240
-msgid "Zot"
-msgstr "Zot"
+#: ../../include/zot.php:649
+msgid "Invalid data packet"
+msgstr "Datapakket ongeldig"
-#: ../../include/network.php:2241
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/zot.php:665
+msgid "Unable to verify channel signature"
+msgstr "Kanaalkenmerk kon niet worden geverifieerd. "
-#: ../../include/network.php:2242
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../include/zot.php:2316
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
-#: ../../include/network.php:2243
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../include/zot.php:3722
+msgid "invalid target signature"
+msgstr "ongeldig doelkenmerk"
#: ../../include/permissions.php:35
msgid "Can view my normal stream and posts"
@@ -12888,322 +13092,507 @@ msgid ""
"Extremely advanced. Leave this alone unless you know what you are doing"
msgstr "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet."
-#: ../../include/conversation.php:204
+#: ../../include/activities.php:41
+msgid " and "
+msgstr " en "
+
+#: ../../include/activities.php:49
+msgid "public profile"
+msgstr "openbaar profiel"
+
+#: ../../include/activities.php:58
#, php-format
-msgid "%1$s is now connected with %2$s"
-msgstr "%1$s is nu met %2$s verbonden"
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s veranderde %2$s naar &ldquo;%3$s&rdquo;"
-#: ../../include/conversation.php:239
+#: ../../include/activities.php:59
#, php-format
-msgid "%1$s poked %2$s"
-msgstr "%1$s heeft %2$s aangestoten"
+msgid "Visit %1$s's %2$s"
+msgstr "Bezoek het %2$s van %1$s"
-#: ../../include/conversation.php:690
+#: ../../include/activities.php:62
#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Bekijk het profiel van %s @ %s"
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s heeft een aangepaste %2$s, %3$s veranderd."
-#: ../../include/conversation.php:709
-msgid "Categories:"
-msgstr "Categorieën:"
+#: ../../include/features.php:58
+msgid "General Features"
+msgstr "Algemene functies"
-#: ../../include/conversation.php:710
-msgid "Filed under:"
-msgstr "Bewaard onder:"
+#: ../../include/features.php:63
+msgid "Multiple Profiles"
+msgstr "Meerdere profielen"
-#: ../../include/conversation.php:735
-msgid "View in context"
-msgstr "In context bekijken"
+#: ../../include/features.php:64
+msgid "Ability to create multiple profiles"
+msgstr "Mogelijkheid om meerdere profielen aan te maken"
-#: ../../include/conversation.php:831
-msgid "remove"
-msgstr "verwijderen"
+#: ../../include/features.php:72
+msgid "Advanced Profiles"
+msgstr "Geavanceerde profielen"
-#: ../../include/conversation.php:836
-msgid "Delete Selected Items"
-msgstr "Verwijder de geselecteerde items"
+#: ../../include/features.php:73
+msgid "Additional profile sections and selections"
+msgstr "Extra onderdelen en keuzes voor je profiel"
-#: ../../include/conversation.php:929
-msgid "View Source"
-msgstr "Bron weergeven"
+#: ../../include/features.php:81
+msgid "Profile Import/Export"
+msgstr "Profiel importen/exporteren"
-#: ../../include/conversation.php:930
-msgid "Follow Thread"
-msgstr "Conversatie volgen"
+#: ../../include/features.php:82
+msgid "Save and load profile details across sites/channels"
+msgstr "Profielgegevens opslaan en in andere hubs/kanalen gebruiken."
-#: ../../include/conversation.php:931
-msgid "Unfollow Thread"
-msgstr "Conversatie niet meer volgen"
+#: ../../include/features.php:90
+msgid "Web Pages"
+msgstr "Webpagina's"
-#: ../../include/conversation.php:936
-msgid "Activity/Posts"
-msgstr "Activiteit/berichten connectie"
+#: ../../include/features.php:91
+msgid "Provide managed web pages on your channel"
+msgstr "Sta beheerde webpagina's op jouw kanaal toe"
-#: ../../include/conversation.php:938
-msgid "Edit Connection"
-msgstr "Connectie bewerken"
+#: ../../include/features.php:100
+msgid "Provide a wiki for your channel"
+msgstr "Voeg een wiki aan jouw kanaal toe"
-#: ../../include/conversation.php:939
-msgid "Message"
-msgstr "Bericht"
+#: ../../include/features.php:117
+msgid "Private Notes"
+msgstr "Privé-aantekeningen"
-#: ../../include/conversation.php:1075
-#, php-format
-msgid "%s likes this."
-msgstr "%s vindt dit leuk."
+#: ../../include/features.php:118
+msgid "Enables a tool to store notes and reminders (note: not encrypted)"
+msgstr "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)"
-#: ../../include/conversation.php:1075
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s vindt dit niet leuk."
+#: ../../include/features.php:126
+msgid "Navigation Channel Select"
+msgstr "Kanaal kiezen in navigatiemenu"
-#: ../../include/conversation.php:1079
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgid_plural "<span %1$s>%2$d people</span> like this."
-msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit leuk."
-msgstr[1] "<span %1$s>%2$d personen</span> vinden dit leuk."
+#: ../../include/features.php:127
+msgid "Change channels directly from within the navigation dropdown menu"
+msgstr "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk"
-#: ../../include/conversation.php:1081
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgid_plural "<span %1$s>%2$d people</span> don't like this."
-msgstr[0] "<span %1$s>%2$d persoon</span> vindt dit niet leuk."
-msgstr[1] "<span %1$s>%2$d personen</span> vinden dit niet leuk."
+#: ../../include/features.php:135
+msgid "Photo Location"
+msgstr "Fotolocatie"
-#: ../../include/conversation.php:1087
-msgid "and"
-msgstr "en"
+#: ../../include/features.php:136
+msgid "If location data is available on uploaded photos, link this to a map."
+msgstr "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart."
-#: ../../include/conversation.php:1090
-#, php-format
-msgid ", and %d other people"
-msgid_plural ", and %d other people"
-msgstr[0] ", en %d ander persoon"
-msgstr[1] ", en %d andere personen"
+#: ../../include/features.php:144
+msgid "Access Controlled Chatrooms"
+msgstr "Chatkanalen met toegangscontrole "
-#: ../../include/conversation.php:1091
-#, php-format
-msgid "%s like this."
-msgstr "%s vinden dit leuk."
+#: ../../include/features.php:145
+msgid "Provide chatrooms and chat services with access control."
+msgstr "Chatkanalen en chatdiensten met toegangscontrole aanbieden."
-#: ../../include/conversation.php:1091
-#, php-format
-msgid "%s don't like this."
-msgstr "%s vinden dit niet leuk."
+#: ../../include/features.php:154
+msgid "Provide alternate connection permission roles."
+msgstr "Extra permissietypes voor connecties aanmaken"
-#: ../../include/conversation.php:1134
-msgid "Set your location"
-msgstr "Locatie instellen"
+#: ../../include/features.php:162
+msgid "Smart Birthdays"
+msgstr "Slimme verjaardagen"
-#: ../../include/conversation.php:1135
-msgid "Clear browser location"
-msgstr "Locatie van webbrowser wissen"
+#: ../../include/features.php:163
+msgid ""
+"Make birthday events timezone aware in case your friends are scattered "
+"across the planet."
+msgstr "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn."
-#: ../../include/conversation.php:1183
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../include/features.php:171
+msgid "Event Timezone Selection"
+msgstr "Tijdzone gebeurtenis"
-#: ../../include/conversation.php:1184
-msgid "Where are you right now?"
-msgstr "Waar bevind je je op dit moment?"
+#: ../../include/features.php:172
+msgid "Allow event creation in timezones other than your own."
+msgstr "Sta het aanmaken van gebeurtenissen in andere tijdzones toe."
-#: ../../include/conversation.php:1189
-msgid "Choose a different album..."
-msgstr "Kies een ander album..."
+#: ../../include/features.php:180
+msgid "Advanced Directory Search"
+msgstr "Geavanceerd in de kanalengids zoeken"
-#: ../../include/conversation.php:1193
-msgid "Comments enabled"
-msgstr "Reacties ingeschakeld"
+#: ../../include/features.php:181
+msgid "Allows creation of complex directory search queries"
+msgstr "Gebruik complexe zoekopdrachten in de kanalengids"
-#: ../../include/conversation.php:1194
-msgid "Comments disabled"
-msgstr "Reacties uitgeschakeld"
+#: ../../include/features.php:189
+msgid "Advanced Theme and Layout Settings"
+msgstr "Geavanceerde thema- en lay-out-instellingen"
-#: ../../include/conversation.php:1232
-msgid "Page link name"
-msgstr "Linknaam pagina"
+#: ../../include/features.php:190
+msgid "Allows fine tuning of themes and page layouts"
+msgstr "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden "
-#: ../../include/conversation.php:1235
-msgid "Post as"
-msgstr "Bericht plaatsen als"
+#: ../../include/features.php:200
+msgid "Post Composition Features"
+msgstr "Functies voor het opstellen van berichten"
-#: ../../include/conversation.php:1249
-msgid "Toggle voting"
-msgstr "Peiling in- of uitschakelen"
+#: ../../include/features.php:204
+msgid "Large Photos"
+msgstr "Grote foto's"
-#: ../../include/conversation.php:1252
-msgid "Disable comments"
+#: ../../include/features.php:205
+msgid ""
+"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
+"(640px) photo thumbnails"
+msgstr "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt."
+
+#: ../../include/features.php:214
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
+
+#: ../../include/features.php:222
+msgid "Even More Encryption"
+msgstr "Extra encryptie"
+
+#: ../../include/features.php:223
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel."
+
+#: ../../include/features.php:231
+msgid "Enable Voting Tools"
+msgstr "Peilingen inschakelen"
+
+#: ../../include/features.php:232
+msgid "Provide a class of post which others can vote on"
+msgstr "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen."
+
+#: ../../include/features.php:240
+msgid "Disable Comments"
msgstr "Reacties uitschakelen"
-#: ../../include/conversation.php:1253
-msgid "Toggle comments"
-msgstr "Reacties in- of uitschakelen"
+#: ../../include/features.php:241
+msgid "Provide the option to disable comments for a post"
+msgstr "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld"
-#: ../../include/conversation.php:1261
-msgid "Categories (optional, comma-separated list)"
-msgstr "Categorieën (optioneel, door komma's gescheiden lijst)"
+#: ../../include/features.php:249
+msgid "Delayed Posting"
+msgstr "Berichten uitstellen"
-#: ../../include/conversation.php:1284
-msgid "Other networks and post services"
-msgstr "Andere netwerken en diensten"
+#: ../../include/features.php:250
+msgid "Allow posts to be published at a later date"
+msgstr "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden."
-#: ../../include/conversation.php:1290
-msgid "Set publish date"
-msgstr "Publicatiedatum instellen"
+#: ../../include/features.php:258
+msgid "Content Expiration"
+msgstr "Inhoud laten verlopen"
-#: ../../include/conversation.php:1544
-msgid "Discover"
-msgstr "Ontdekken"
+#: ../../include/features.php:259
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen"
-#: ../../include/conversation.php:1547
-msgid "Imported public streams"
-msgstr "Openbare streams importeren"
+#: ../../include/features.php:267
+msgid "Suppress Duplicate Posts/Comments"
+msgstr "Dubbele berichten/reacties tegenhouden"
-#: ../../include/conversation.php:1552
-msgid "Commented Order"
-msgstr "Nieuwe reacties bovenaan"
+#: ../../include/features.php:268
+msgid ""
+"Prevent posts with identical content to be published with less than two "
+"minutes in between submissions."
+msgstr "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. "
-#: ../../include/conversation.php:1555
-msgid "Sort by Comment Date"
-msgstr "Berichten met nieuwe reacties bovenaan"
+#: ../../include/features.php:279
+msgid "Network and Stream Filtering"
+msgstr "Netwerk- en streamfilter"
-#: ../../include/conversation.php:1559
-msgid "Posted Order"
-msgstr "Nieuwe berichten bovenaan"
+#: ../../include/features.php:283
+msgid "Search by Date"
+msgstr "Zoek op datum"
-#: ../../include/conversation.php:1562
-msgid "Sort by Post Date"
-msgstr "Nieuwe berichten bovenaan"
+#: ../../include/features.php:284
+msgid "Ability to select posts by date ranges"
+msgstr "Mogelijkheid om berichten op datum te filteren "
-#: ../../include/conversation.php:1570
-msgid "Posts that mention or involve you"
-msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
+#: ../../include/features.php:293
+msgid "Enable management and selection of privacy groups"
+msgstr "Beheer en selectie van privacygroepen inschakelen"
-#: ../../include/conversation.php:1579
-msgid "Activity Stream - by date"
-msgstr "Activiteitenstroom - volgens datum"
+#: ../../include/features.php:302
+msgid "Save search terms for re-use"
+msgstr "Sla zoekopdrachten op voor hergebruik"
-#: ../../include/conversation.php:1585
-msgid "Starred"
-msgstr "Met ster"
+#: ../../include/features.php:310
+msgid "Network Personal Tab"
+msgstr "Persoonlijke netwerktab"
-#: ../../include/conversation.php:1588
-msgid "Favourite Posts"
-msgstr "Favoriete berichten"
+#: ../../include/features.php:311
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had"
-#: ../../include/conversation.php:1595
-msgid "Spam"
-msgstr "Spam"
+#: ../../include/features.php:319
+msgid "Network New Tab"
+msgstr "Nieuwe netwerktab"
-#: ../../include/conversation.php:1598
-msgid "Posts flagged as SPAM"
-msgstr "Berichten gemarkeerd als SPAM"
+#: ../../include/features.php:320
+msgid "Enable tab to display all new Network activity"
+msgstr "Laat de tab alle nieuwe netwerkactiviteit tonen"
-#: ../../include/conversation.php:1656
-msgid "Status Messages and Posts"
-msgstr "Berichten in dit kanaal"
+#: ../../include/features.php:328
+msgid "Affinity Tool"
+msgstr "Affiniteitsfilter"
-#: ../../include/conversation.php:1668
-msgid "Profile Details"
-msgstr "Profiel"
+#: ../../include/features.php:329
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag"
-#: ../../include/conversation.php:1684
-msgid "Files and Storage"
-msgstr "Bestanden en opslagruimte"
+#: ../../include/features.php:338
+msgid "Show friend and connection suggestions"
+msgstr "Toon kanaalvoorstellen"
-#: ../../include/conversation.php:1720
-msgid "Saved Bookmarks"
-msgstr "Opgeslagen bladwijzers"
+#: ../../include/features.php:346
+msgid "Connection Filtering"
+msgstr "Berichtenfilters"
-#: ../../include/conversation.php:1730
-msgid "Manage Webpages"
-msgstr "Webpagina's beheren"
+#: ../../include/features.php:347
+msgid "Filter incoming posts from connections based on keywords/content"
+msgstr "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal"
-#: ../../include/conversation.php:1795
-msgctxt "noun"
-msgid "Attending"
-msgid_plural "Attending"
-msgstr[0] "aanwezig"
-msgstr[1] "aanwezig"
+#: ../../include/features.php:359
+msgid "Post/Comment Tools"
+msgstr "Bericht- en reactiehulpmiddelen"
-#: ../../include/conversation.php:1798
-msgctxt "noun"
-msgid "Not Attending"
-msgid_plural "Not Attending"
-msgstr[0] "niet aanwezig"
-msgstr[1] "niet aanwezig"
+#: ../../include/features.php:363
+msgid "Community Tagging"
+msgstr "Taggen door anderen"
-#: ../../include/conversation.php:1801
-msgctxt "noun"
-msgid "Undecided"
-msgid_plural "Undecided"
-msgstr[0] "nog niet beslist"
-msgstr[1] "nog niet beslist"
+#: ../../include/features.php:364
+msgid "Ability to tag existing posts"
+msgstr "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen"
-#: ../../include/conversation.php:1804
-msgctxt "noun"
-msgid "Agree"
-msgid_plural "Agrees"
-msgstr[0] "eens"
-msgstr[1] "eens"
+#: ../../include/features.php:372
+msgid "Post Categories"
+msgstr "Categorieën berichten"
-#: ../../include/conversation.php:1807
-msgctxt "noun"
-msgid "Disagree"
-msgid_plural "Disagrees"
-msgstr[0] "oneens"
-msgstr[1] "oneens"
+#: ../../include/features.php:373
+msgid "Add categories to your posts"
+msgstr "Voeg categorieën toe aan je berichten"
-#: ../../include/conversation.php:1810
-msgctxt "noun"
-msgid "Abstain"
-msgid_plural "Abstains"
-msgstr[0] "onthouding"
-msgstr[1] "onthoudingen"
+#: ../../include/features.php:381
+msgid "Emoji Reactions"
+msgstr "Emoji-reacties"
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:962
-#: ../../include/bbcode.php:965 ../../include/bbcode.php:970
-#: ../../include/bbcode.php:973 ../../include/bbcode.php:976
-#: ../../include/bbcode.php:979 ../../include/bbcode.php:984
-#: ../../include/bbcode.php:987 ../../include/bbcode.php:992
-#: ../../include/bbcode.php:995 ../../include/bbcode.php:998
-#: ../../include/bbcode.php:1001
-msgid "Image/photo"
-msgstr "Afbeelding/foto"
+#: ../../include/features.php:382
+msgid "Add emoji reaction ability to posts"
+msgstr "Emoji-reacties in berichten toestaan"
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1012
-msgid "Encrypted content"
-msgstr "Versleutelde inhoud"
+#: ../../include/features.php:391
+msgid "Ability to file posts under folders"
+msgstr "Mogelijkheid om berichten in mappen op te slaan"
-#: ../../include/bbcode.php:189
+#: ../../include/features.php:399
+msgid "Dislike Posts"
+msgstr "Vind berichten niet leuk"
+
+#: ../../include/features.php:400
+msgid "Ability to dislike posts/comments"
+msgstr "Mogelijkheid om berichten en reacties niet leuk te vinden"
+
+#: ../../include/features.php:408
+msgid "Star Posts"
+msgstr "Geef berichten een ster"
+
+#: ../../include/features.php:409
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mogelijkheid om speciale berichten met een ster te markeren"
+
+#: ../../include/features.php:417
+msgid "Tag Cloud"
+msgstr "Tagwolk"
+
+#: ../../include/features.php:418
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina"
+
+#: ../../include/features.php:430
+msgid "Premium Channel"
+msgstr "Premiumkanaal"
+
+#: ../../include/features.php:431
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal"
+
+#: ../../include/photos.php:115
#, php-format
-msgid "Install %s element: "
-msgstr "Installeer %s-element: "
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
-#: ../../include/bbcode.php:193
+#: ../../include/photos.php:122
+msgid "Image file is empty."
+msgstr "Afbeeldingsbestand is leeg"
+
+#: ../../include/photos.php:260
+msgid "Photo storage failed."
+msgstr "Foto kan niet worden opgeslagen"
+
+#: ../../include/photos.php:300
+msgid "a new photo"
+msgstr "een nieuwe foto"
+
+#: ../../include/photos.php:304
#, php-format
+msgctxt "photo_upload"
+msgid "%1$s posted %2$s to %3$s"
+msgstr "%1$s plaatste %2$s op %3$s"
+
+#: ../../include/photos.php:519
+msgid "Upload New Photos"
+msgstr "Nieuwe foto's uploaden"
+
+#: ../../include/channel.php:33
+msgid "Unable to obtain identity information from database"
+msgstr "Niet in staat om identiteitsinformatie uit de database te verkrijgen"
+
+#: ../../include/channel.php:67
+msgid "Empty name"
+msgstr "Ontbrekende naam"
+
+#: ../../include/channel.php:70
+msgid "Name too long"
+msgstr "Naam te lang"
+
+#: ../../include/channel.php:181
+msgid "No account identifier"
+msgstr "Geen account-identificator"
+
+#: ../../include/channel.php:193
+msgid "Nickname is required."
+msgstr "Bijnaam is verplicht"
+
+#: ../../include/channel.php:207
+msgid "Reserved nickname. Please choose another."
+msgstr "Deze naam is gereserveerd. Kies een andere."
+
+#: ../../include/channel.php:212
msgid ""
-"This post contains an installable %s element, however you lack permissions "
-"to install it on this site."
-msgstr "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren."
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik."
-#: ../../include/bbcode.php:272
+#: ../../include/channel.php:272
+msgid "Unable to retrieve created identity"
+msgstr "Niet in staat om aangemaakte identiteit te vinden"
+
+#: ../../include/channel.php:344
+msgid "Default Profile"
+msgstr "Standaardprofiel"
+
+#: ../../include/channel.php:1045
+msgid "Create New Profile"
+msgstr "Nieuw profiel aanmaken"
+
+#: ../../include/channel.php:1065
+msgid "Visible to everybody"
+msgstr "Voor iedereen zichtbaar"
+
+#: ../../include/channel.php:1138 ../../include/channel.php:1257
+msgid "Gender:"
+msgstr "Geslacht:"
+
+#: ../../include/channel.php:1140 ../../include/channel.php:1312
+msgid "Homepage:"
+msgstr "Homepagina:"
+
+#: ../../include/channel.php:1141
+msgid "Online Now"
+msgstr "Nu online"
+
+#: ../../include/channel.php:1262
+msgid "Like this channel"
+msgstr "Vind dit kanaal leuk"
+
+#: ../../include/channel.php:1286
+msgid "j F, Y"
+msgstr "F j Y"
+
+#: ../../include/channel.php:1287
+msgid "j F"
+msgstr "F j"
+
+#: ../../include/channel.php:1294
+msgid "Birthday:"
+msgstr "Geboortedatum:"
+
+#: ../../include/channel.php:1307
#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s schreef het volgende %2$s %3$s"
+msgid "for %1$d %2$s"
+msgstr "voor %1$d %2$s"
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
-msgid "Click to open/close"
-msgstr "Klik om te openen of te sluiten"
+#: ../../include/channel.php:1310
+msgid "Sexual Preference:"
+msgstr "Seksuele voorkeur:"
-#: ../../include/bbcode.php:357
-msgid "spoiler"
-msgstr "spoiler"
+#: ../../include/channel.php:1316
+msgid "Tags:"
+msgstr "Tags:"
-#: ../../include/bbcode.php:950
-msgid "$1 wrote:"
-msgstr "$1 schreef:"
+#: ../../include/channel.php:1318
+msgid "Political Views:"
+msgstr "Politieke overtuigingen:"
+
+#: ../../include/channel.php:1320
+msgid "Religion:"
+msgstr "Religie:"
+
+#: ../../include/channel.php:1324
+msgid "Hobbies/Interests:"
+msgstr "Hobby's/interesses:"
+
+#: ../../include/channel.php:1326
+msgid "Likes:"
+msgstr "Houdt van:"
+
+#: ../../include/channel.php:1328
+msgid "Dislikes:"
+msgstr "Houdt niet van:"
+
+#: ../../include/channel.php:1330
+msgid "Contact information and Social Networks:"
+msgstr "Contactinformatie en sociale netwerken:"
+
+#: ../../include/channel.php:1332
+msgid "My other channels:"
+msgstr "Mijn andere kanalen"
+
+#: ../../include/channel.php:1334
+msgid "Musical interests:"
+msgstr "Muzikale interesses:"
+
+#: ../../include/channel.php:1336
+msgid "Books, literature:"
+msgstr "Boeken, literatuur:"
+
+#: ../../include/channel.php:1338
+msgid "Television:"
+msgstr "Televisie:"
+
+#: ../../include/channel.php:1340
+msgid "Film/dance/culture/entertainment:"
+msgstr "Films/dansen/cultuur/vermaak:"
+
+#: ../../include/channel.php:1342
+msgid "Love/Romance:"
+msgstr "Liefde/romantiek:"
+
+#: ../../include/channel.php:1344
+msgid "Work/employment:"
+msgstr "Werk/beroep:"
+
+#: ../../include/channel.php:1346
+msgid "School/education:"
+msgstr "School/opleiding:"
+
+#: ../../include/channel.php:1369
+msgid "Like this thing"
+msgstr "Vind dit ding leuk"
+
+#: ../../include/channel.php:2103
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Account '%s' verwijderd"
#: ../../util/nconfig.php:34
msgid "Source channel not found."
@@ -13341,66 +13730,54 @@ msgstr "Grootte profielfoto's van berichten instellen"
msgid "Set size of followup author photos"
msgstr "Grootte profielfoto's van reacties instellen"
-#: ../../boot.php:1176
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Zoek %1$s (%2$s)"
-
-#: ../../boot.php:1176
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../boot.php:1494
+#: ../../boot.php:1522
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Update %s mislukt. Zie foutenlogboek."
-#: ../../boot.php:1497
+#: ../../boot.php:1525
#, php-format
msgid "Update Error at %s"
msgstr "Update-fout op %s"
-#: ../../boot.php:1701
-msgid ""
-"Create an account to access services and applications within the Hubzilla"
-msgstr "Maak een account aan om toegang te krijgen tot diensten en toepassingen van Hubzilla"
+#: ../../boot.php:1729
+msgid "Create an account to access services and applications"
+msgstr "Maak een account aan om toegang te krijgen tot diensten en toepassingen"
-#: ../../boot.php:1722
+#: ../../boot.php:1751
msgid "Login/Email"
msgstr "E-mailadres of inlognaam"
-#: ../../boot.php:1723
+#: ../../boot.php:1752
msgid "Password"
msgstr "Wachtwoord"
-#: ../../boot.php:1724
+#: ../../boot.php:1753
msgid "Remember me"
msgstr "Aangemeld blijven"
-#: ../../boot.php:1727
+#: ../../boot.php:1756
msgid "Forgot your password?"
msgstr "Wachtwoord vergeten?"
-#: ../../boot.php:2288
+#: ../../boot.php:2320
msgid "toggle mobile"
msgstr "mobiele weergave omschakelen"
-#: ../../boot.php:2443
+#: ../../boot.php:2475
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Het SSL-certificaat van deze website is ongeldig. Corrigeer dit a.u.b."
-#: ../../boot.php:2446
+#: ../../boot.php:2478
#, php-format
msgid "[hubzilla] Website SSL error for %s"
msgstr "[hubzilla] Probleem met SSL-certificaat voor %s"
-#: ../../boot.php:2563
+#: ../../boot.php:2597
msgid "Cron/Scheduled tasks not running."
msgstr "Cron is niet actief"
-#: ../../boot.php:2567
+#: ../../boot.php:2601
#, php-format
msgid "[hubzilla] Cron tasks not running on %s"
msgstr "[hubzilla] Cron-taken zijn niet actief op %s"
diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php
index 000c8043c..c221f6670 100644
--- a/view/nl/hstrings.php
+++ b/view/nl/hstrings.php
@@ -28,7 +28,9 @@ App::$strings["Can view my connections"] = "Kan een lijst met mijn connecties be
App::$strings["Can view my file storage and photos"] = "Kan mijn foto's en andere bestanden bekijken";
App::$strings["Can upload/modify my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
App::$strings["Can view my channel webpages"] = "Kan de webpagina's van mijn kanaal bekijken";
+App::$strings["Can view my wiki pages"] = "Kan mijn wiki-pagina's bekijken";
App::$strings["Can create/edit my channel webpages"] = "Kan wegpagina's van mijn kanaal aanmaken en bewerken";
+App::$strings["Can write to my wiki pages"] = "Kan mijn wiki-pagina's bewerken";
App::$strings["Can post on my channel (wall) page"] = "Kan een bericht in mijn kanaal plaatsen";
App::$strings["Can comment on or like my posts"] = "Kan op mijn berichten reageren of deze (niet) leuk vinden";
App::$strings["Can send me private mail messages"] = "Kan mij privéberichten sturen";
@@ -59,18 +61,33 @@ App::$strings["Delete"] = "Verwijderen";
App::$strings["You are using %1\$s of your available file storage."] = "Je gebruikt %1\$s van de beschikbare bestandsopslag.";
App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s&#37;)"] = "Je gebruikt %1\$s van totaal %2\$s beschikbare bestandsopslag. (%3\$s&#37;)";
App::$strings["WARNING:"] = "WAARSCHUWING:";
+App::$strings["Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"] = "Gebruik DAV om grote (video-, audio-) bestanden te uploaden.<br>Zie hiervoor de documentatie over de <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">cloud en desktopclients</a>.";
App::$strings["Create new folder"] = "Nieuwe map aanmaken";
App::$strings["Upload file"] = "Bestand uploaden";
App::$strings["Drop files here to immediately upload"] = "Sleep bestanden hierheen om ze onmiddellijk te uploaden";
+App::$strings["Permission denied"] = "Toegang geweigerd";
App::$strings["Permission denied."] = "Toegang geweigerd.";
App::$strings["Page not found."] = "Pagina niet gevonden.";
-App::$strings["Permission denied"] = "Toegang geweigerd";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
App::$strings["Welcome %s. Remote authentication successful."] = "Welkom %s. Authenticatie op afstand geslaagd.";
App::$strings["Requested profile is not available."] = "Opgevraagd profiel is niet beschikbaar";
App::$strings["Some blurb about what to do when you're new here"] = "Welkom op \$Projectname. Klik op de tab ontdekken of klik rechtsboven op de <a href=\"directory\">kanalengids</a>, om kanalen te vinden. Rechtsboven vind je ook <a href=\"directory\">apps</a>, waar je vrijwel alle functies van \$Projectname kunt vinden. Voor <a href=\"directory\">hulp</a> met \$Projectname klik je op het vraagteken.";
-App::$strings["Away"] = "Afwezig";
-App::$strings["Online"] = "Online";
+App::$strings["App installed."] = "App geïnstalleerd";
+App::$strings["Malformed app."] = "Misvormde app.";
+App::$strings["Embed code"] = "Insluitcode";
+App::$strings["Edit App"] = "App bewerken";
+App::$strings["Create App"] = "App maken";
+App::$strings["Name of app"] = "Naam van app";
+App::$strings["Required"] = "Vereist";
+App::$strings["Location (URL) of app"] = "Locatie (URL) van app";
+App::$strings["Description"] = "Omschrijving";
+App::$strings["Photo icon URL"] = "URL van pictogram";
+App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels (niet verplicht)";
+App::$strings["Categories (optional, comma separated list)"] = "Categorieën (niet verplicht, door komma's gescheiden lijst)";
+App::$strings["Version ID"] = "Versie-ID";
+App::$strings["Price of app"] = "Prijs van de app";
+App::$strings["Location (URL) to purchase app"] = "Locatie (URL) om de app aan te schaffen";
+App::$strings["Submit"] = "Opslaan";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximum toegestane dagelijkse registraties op deze \$Projectname-hub bereikt. Probeer het morgen (UTC) nogmaals.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden.";
App::$strings["Passwords do not match."] = "Wachtwoorden komen niet met elkaar overeen.";
@@ -102,118 +119,43 @@ App::$strings["Membership on this site is by invitation only."] = "Registreren o
App::$strings["Register"] = "Registreren";
App::$strings["This site may require email verification after submitting this form. If you are returned to a login page, please check your email for instructions."] = "Mogelijk moet op deze hub eerst jouw e-mail geverifieerd worden. Wanneer je na het indienen van dit formulier op de inlogpagina terecht komt, dan dien je jouw e-mail te controleren voor instructies. Controleer eventueel ook jouw spamfolder.";
App::$strings["Fetching URL returns error: %1\$s"] = "Ophalen URL gaf een foutmelding terug: %1\$s";
-App::$strings["Profile Match"] = "Profielovereenkomst";
-App::$strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
-App::$strings["is interested in:"] = "is geïnteresseerd in:";
-App::$strings["Connect"] = "Verbinden";
-App::$strings["No matches"] = "Geen overeenkomsten";
-App::$strings["Could not access contact record."] = "Kon geen toegang krijgen tot de connectie-gegevens.";
-App::$strings["Could not locate selected profile."] = "Kon het gekozen profiel niet vinden.";
-App::$strings["Connection updated."] = "Connectie bijgewerkt.";
-App::$strings["Failed to update connection record."] = "Bijwerken van connectie-gegevens mislukt.";
-App::$strings["is now connected to"] = "is nu verbonden met";
-App::$strings["No"] = "Nee";
-App::$strings["Yes"] = "Ja";
-App::$strings["Could not access address book record."] = "Kon geen toegang krijgen tot de record van de connectie.";
-App::$strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
-App::$strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
-App::$strings["Connection has been removed."] = "Connectie is verwijderd";
-App::$strings["View Profile"] = "Profiel weergeven";
-App::$strings["View %s's profile"] = "Profiel van %s weergeven";
-App::$strings["Refresh Permissions"] = "Permissies vernieuwen";
-App::$strings["Fetch updated permissions"] = "Aangepaste permissies ophalen";
-App::$strings["Recent Activity"] = "Recente activiteit/berichten";
-App::$strings["View recent posts and comments"] = "Recente berichten en reacties weergeven";
-App::$strings["Unblock"] = "Deblokkeren";
-App::$strings["Block"] = "Blokkeren";
-App::$strings["Block (or Unblock) all communications with this connection"] = "Blokkeer (of deblokkeer) alle communicatie met deze connectie";
-App::$strings["This connection is blocked!"] = "Deze connectie is geblokkeerd!";
-App::$strings["Unignore"] = "Niet meer negeren";
-App::$strings["Ignore"] = "Negeren";
-App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie";
-App::$strings["This connection is ignored!"] = "Deze connectie wordt genegeerd!";
-App::$strings["Unarchive"] = "Niet meer archiveren";
-App::$strings["Archive"] = "Archiveren";
-App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud";
-App::$strings["This connection is archived!"] = "Deze connectie is gearchiveerd!";
-App::$strings["Unhide"] = "Niet meer verbergen";
-App::$strings["Hide"] = "Verbergen";
-App::$strings["Hide or Unhide this connection from your other connections"] = "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties";
-App::$strings["This connection is hidden!"] = "Deze connectie is verborgen!";
-App::$strings["Delete this connection"] = "Deze connectie verwijderen";
-App::$strings["Me"] = "Ik";
-App::$strings["Family"] = "Familie";
-App::$strings["Friends"] = "Vrienden";
-App::$strings["Acquaintances"] = "Kennissen";
-App::$strings["All"] = "Alles";
-App::$strings["Approve this connection"] = "Deze connectie accepteren";
-App::$strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
-App::$strings["Set Affinity"] = "Verwantschapsfilter instellen";
-App::$strings["Set Profile"] = "Profiel instellen";
-App::$strings["Set Affinity & Profile"] = "Verwantschapsfilter en profiel instellen";
-App::$strings["none"] = "geen";
-App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
-App::$strings["Connection: %s"] = "Connectie: %s";
-App::$strings["Apply these permissions automatically"] = "Deze permissies automatisch toepassen";
-App::$strings["Connection requests will be approved without your interaction"] = "Connectieverzoeken zullen automatisch worden geaccepteerd";
-App::$strings["This connection's primary address is"] = "Het primaire kanaaladres van deze connectie is";
-App::$strings["Available locations:"] = "Beschikbare locaties:";
-App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast.";
-App::$strings["Connection Tools"] = "Hulpmiddelen";
-App::$strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
-App::$strings["Rating"] = "Beoordeling";
-App::$strings["Slide to adjust your rating"] = "Gebruik de schuif om je beoordeling te geven";
-App::$strings["Optionally explain your rating"] = "Verklaar jouw beoordeling (niet verplicht)";
-App::$strings["Custom Filter"] = "Berichtenfilter";
-App::$strings["Only import posts with this text"] = "Importeer alleen berichten met deze tekst";
-App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren";
-App::$strings["Do not import posts with this text"] = "Importeer geen berichten met deze tekst";
-App::$strings["This information is public!"] = "Deze informatie is openbaar!";
-App::$strings["Connection Pending Approval"] = "Connectie moet nog geaccepteerd worden";
-App::$strings["inherited"] = "geërfd";
-App::$strings["Submit"] = "Opslaan";
-App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken.";
-App::$strings["Their Settings"] = "Hun instellingen";
-App::$strings["My Settings"] = "Mijn instellingen";
-App::$strings["Individual Permissions"] = "Individuele permissies";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen.";
-App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. ";
-App::$strings["Last update:"] = "Laatste wijziging:";
-App::$strings["Invalid message"] = "Ongeldig bericht";
-App::$strings["no results"] = "geen resultaten";
-App::$strings["channel sync processed"] = "kanaalsync verwerkt";
-App::$strings["queued"] = "in wachtrij";
-App::$strings["posted"] = "verstuurd";
-App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
-App::$strings["updated"] = "geüpdatet";
-App::$strings["update ignored"] = "update genegeerd";
-App::$strings["permission denied"] = "toegang geweigerd";
-App::$strings["recipient not found"] = "ontvanger niet gevonden";
-App::$strings["mail recalled"] = "Privébericht ingetrokken";
-App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
-App::$strings["mail delivered"] = "privébericht afgeleverd";
-App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
-App::$strings["Options"] = "Opties";
-App::$strings["Redeliver"] = "Opnieuw afleveren";
+App::$strings["Authentication failed."] = "Authenticatie mislukt.";
+App::$strings["Remote Authentication"] = "Authenticatie op afstand";
+App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Vul jouw kanaaladres in (bijv. channel@example.com)";
+App::$strings["Authenticate"] = "Authenticeren";
+App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
+App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
+App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
+App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
+App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
+App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
+App::$strings["Import completed."] = "Import voltooid.";
+App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
+App::$strings["Import Channel"] = "Kanaal importeren";
+App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
+App::$strings["File to Upload"] = "Bestand om te uploaden";
+App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
+App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
+App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
+App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
+App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
+App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
+App::$strings["Move this channel (disable all previous locations)"] = "Verplaats dit kanaal (schakelt alle voormalige locaties uit)";
+App::$strings["Import a few months of posts if possible (limited by available memory"] = "Importeer enkele maanden aan berichten wanneer mogelijk (afhankelijk van hoeveelheid geheugen hub)";
+App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
+App::$strings["Away"] = "Afwezig";
+App::$strings["Online"] = "Online";
+App::$strings["Documentation Search"] = "Zoek documentatie";
+App::$strings["About"] = "Over";
+App::$strings["Members"] = "Kanalen";
+App::$strings["Administrators"] = "Beheerders";
+App::$strings["Developers"] = "Ontwikkelaars";
+App::$strings["Tutorials"] = "Zelfstudie";
+App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
+App::$strings["Contents"] = "Inhoud";
App::$strings["Bookmark added"] = "Bladwijzer toegevoegd";
App::$strings["My Bookmarks"] = "Mijn bladwijzers";
App::$strings["My Connections Bookmarks"] = "Bladwijzers van mijn connecties";
-App::$strings["network"] = "netwerk";
-App::$strings["RSS"] = "RSS";
-App::$strings["Location not found."] = "Locatie niet gevonden.";
-App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
-App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
-App::$strings["Syncing locations"] = "Locaties synchronizeren";
-App::$strings["No locations found."] = "Geen locaties gevonden.";
-App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
-App::$strings["Location"] = "Locatie";
-App::$strings["Address"] = "Adres";
-App::$strings["Primary"] = "Primair";
-App::$strings["Drop"] = "Verwijderen";
-App::$strings["Sync Now"] = "Nu synchroniseren";
-App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
-App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
-App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
App::$strings["Continue"] = "Ga verder";
App::$strings["Premium Channel Setup"] = "Instellen premiumkanaal ";
App::$strings["Enable premium channel connection restrictions"] = "Restricties voor connecties van premiumkanaal toestaan";
@@ -223,28 +165,47 @@ App::$strings["Potential connections will then see the following text before pro
App::$strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Door verder te gaan ga ik automatisch akkoord met alle voorwaarden en aanwijzingen op deze pagina.";
App::$strings["(No specific instructions have been provided by the channel owner.)"] = "(Er zijn geen speciale voorwaarden en aanwijzingen door de kanaal-eigenaar verstrekt) ";
App::$strings["Restricted or Premium Channel"] = "Beperkt of premiumkanaal";
+App::$strings["Item not found."] = "Item niet gevonden.";
+App::$strings["# Accounts"] = "# accounts";
+App::$strings["# blocked accounts"] = "# geblokkeerde accounts";
+App::$strings["# expired accounts"] = "# verlopen accounts";
+App::$strings["# expiring accounts"] = "# accounts die nog moeten verlopen";
+App::$strings["# Channels"] = "# Kanalen";
+App::$strings["# primary"] = "# primair";
+App::$strings["# clones"] = "# klonen";
+App::$strings["Message queues"] = "Berichtenwachtrij";
+App::$strings["Your software should be updated"] = "Jouw software moet worden bijgewerkt ";
+App::$strings["Administration"] = "Beheer";
+App::$strings["Summary"] = "Samenvatting";
+App::$strings["Registered accounts"] = "Geregistreerde accounts";
+App::$strings["Pending registrations"] = "Accounts die op goedkeuring wachten";
+App::$strings["Registered channels"] = "Geregistreerde kanalen";
+App::$strings["Active plugins"] = "Ingeschakelde plugins";
+App::$strings["Version"] = "Versie";
+App::$strings["Repository version (master)"] = "Versie repository (master)";
+App::$strings["Repository version (dev)"] = "Versie repository (dev)";
+App::$strings["Item not found"] = "Item niet gevonden";
+App::$strings["Block Name"] = "Bloknaam";
+App::$strings["Insert web link"] = "Weblink invoegen";
+App::$strings["Title (optional)"] = "Titel (niet verplicht)";
+App::$strings["Edit Block"] = "Blok bewerken";
App::$strings["Invalid item."] = "Ongeldig item.";
App::$strings["Channel not found."] = "Kanaal niet gevonden.";
App::$strings["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
App::$strings["Save to Folder:"] = "Bewaar in map: ";
App::$strings["- select -"] = "- kies map -";
App::$strings["Save"] = "Opslaan";
-App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
-App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
-App::$strings["Create New"] = "Nieuwe aanmaken";
-App::$strings["Channel Manager"] = "Kanaalbeheer";
-App::$strings["Current Channel"] = "Huidig kanaal";
-App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
-App::$strings["Default Channel"] = "Standaardkanaal";
-App::$strings["Make Default"] = "Als standaard instellen";
-App::$strings["%d new messages"] = "%d nieuwe berichten";
-App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
-App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
+App::$strings["sent you a private message"] = "stuurde jou een privébericht";
+App::$strings["added your channel"] = "voegde jouw kanaal toe";
+App::$strings["g A l F d"] = "G:i, l d F";
+App::$strings["[today]"] = "[vandaag]";
+App::$strings["posted an event"] = "plaatste een gebeurtenis";
App::$strings["Blocked"] = "Geblokkeerd";
App::$strings["Ignored"] = "Genegeerd";
App::$strings["Hidden"] = "Verborgen";
App::$strings["Archived"] = "Gearchiveerd";
App::$strings["New"] = "Nieuw";
+App::$strings["All"] = "Alles";
App::$strings["New Connections"] = "Nieuwe connecties";
App::$strings["Show pending (new) connections"] = "Nog te accepteren (nieuwe) connecties weergeven";
App::$strings["All Connections"] = "Alle connecties";
@@ -259,11 +220,13 @@ App::$strings["Edit connection"] = "Connectie bewerken";
App::$strings["Delete connection"] = "Connectie verwijderen";
App::$strings["Channel address"] = "Kanaaladres";
App::$strings["Network"] = "Netwerk";
+App::$strings["Call"] = "Bellen";
App::$strings["Status"] = "Status";
App::$strings["Connected"] = "Verbonden";
App::$strings["Approve connection"] = "Connectie accepteren";
App::$strings["Approve"] = "Goedkeuren";
App::$strings["Ignore connection"] = "Connectie negeren";
+App::$strings["Ignore"] = "Negeren";
App::$strings["Recent activity"] = "Recente activiteit";
App::$strings["Connections"] = "Connecties";
App::$strings["Search"] = "Zoeken";
@@ -297,43 +260,12 @@ App::$strings["On"] = "Aan";
App::$strings["Lock feature %s"] = " Vergrendel de functie '%s'";
App::$strings["Manage Additional Features"] = "Beheer - Extra functies";
App::$strings["Log settings updated."] = "Logboek-instellingen bijgewerkt.";
-App::$strings["Administration"] = "Beheer";
App::$strings["Logs"] = "Logboeken";
App::$strings["Clear"] = "Leegmaken";
App::$strings["Debugging"] = "Debuggen";
App::$strings["Log file"] = "Logbestand";
App::$strings["Must be writable by web server. Relative to your top-level webserver directory."] = "Moet door de webserver beschrijfbaar zijn. Relatief ten opzichte van de bovenste map van je \$Projectname-installatie.";
App::$strings["Log level"] = "Logniveau";
-App::$strings["Item not found."] = "Item niet gevonden.";
-App::$strings["Plugin %s disabled."] = "Plugin %s uitgeschakeld.";
-App::$strings["Plugin %s enabled."] = "Plugin %s ingeschakeld";
-App::$strings["Disable"] = "Uitschakelen";
-App::$strings["Enable"] = "Inschakelen";
-App::$strings["Plugins"] = "Plugins";
-App::$strings["Toggle"] = "Omschakelen";
-App::$strings["Settings"] = "Instellingen";
-App::$strings["Author: "] = "Auteur: ";
-App::$strings["Maintainer: "] = "Beheerder: ";
-App::$strings["Minimum project version: "] = "Minimum versie Hubzilla: ";
-App::$strings["Maximum project version: "] = "Maximum versie Hubzilla:";
-App::$strings["Minimum PHP version: "] = "Minimum versie PHP: ";
-App::$strings["Compatible Server Roles: "] = "Werkt met configuratietypes: ";
-App::$strings["Requires: "] = "Vereist: ";
-App::$strings["Disabled - version incompatibility"] = "Uitgeschakeld - versie is incompatibel";
-App::$strings["Enter the public git repository URL of the plugin repo."] = "Vul de openbare Git-URL in van de plugin-repository.";
-App::$strings["Plugin repo git URL"] = "Git-URL plugin-repository";
-App::$strings["Custom repo name"] = "Handmatige repository-naam";
-App::$strings["(optional)"] = "(optioneel)";
-App::$strings["Download Plugin Repo"] = "Plugin-repository downloaden";
-App::$strings["Install new repo"] = "Nieuwe repository installeren";
-App::$strings["Install"] = "Installeren";
-App::$strings["Cancel"] = "Annuleren";
-App::$strings["Manage Repos"] = "Repositories beheren";
-App::$strings["Installed Plugin Repositories"] = "Toegevoegde plugin-repositories";
-App::$strings["Install a New Plugin Repository"] = "Nieuwe plugin-repository toevoegen";
-App::$strings["Update"] = "Bijwerken";
-App::$strings["Switch branch"] = "Branch veranderen";
-App::$strings["Remove"] = "Verwijderen";
App::$strings["New Profile Field"] = "Nieuw profielveld";
App::$strings["Field nickname"] = "Bijnaam voor veld";
App::$strings["System name of field"] = "Systeemnaam voor veld";
@@ -341,7 +273,7 @@ App::$strings["Input type"] = "Invoertype";
App::$strings["Field Name"] = "Veldnaam";
App::$strings["Label on profile pages"] = "Tekstlabel voor op profielpagina's";
App::$strings["Help text"] = "Helptekst";
-App::$strings["Additional info (optional)"] = "Extra informatie (optioneel)";
+App::$strings["Additional info (optional)"] = "Extra informatie (niet verplicht)";
App::$strings["Field definition not found"] = "Velddefinitie niet gevonden";
App::$strings["Edit Profile Field"] = "Profielveld bewerken";
App::$strings["Profile Fields"] = "Profielvelden";
@@ -351,13 +283,6 @@ App::$strings["(In addition to basic fields)"] = "(als toevoeging op de standaar
App::$strings["All available fields"] = "Alle beschikbare velden";
App::$strings["Custom Fields"] = "Extra (handmatig toegevoegde) velden";
App::$strings["Create Custom Field"] = "Extra velden aanmaken";
-App::$strings["Queue Statistics"] = "Wachtrij-statistieken";
-App::$strings["Total Entries"] = "Aantal vermeldingen";
-App::$strings["Priority"] = "Prioriteit";
-App::$strings["Destination URL"] = "Doel-URL";
-App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markeren";
-App::$strings["Empty queue for this hub"] = "Berichtenwachtrij voor deze hub legen";
-App::$strings["Last known contact"] = "Voor het laatst contact";
App::$strings["By default, unfiltered HTML is allowed in embedded media. This is inherently insecure."] = "Standaard is ongefilterde HTML in ingesloten (embedded) media toegestaan. Dit is inherent onveilig.";
App::$strings["The recommended setting is to only allow unfiltered HTML from the following sites:"] = "Het wordt aanbevolen om alleen ongefilterde HTML van de volgende websites toe te staan:";
App::$strings["https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />"] = "https://youtube.com/<br />https://www.youtube.com/<br />https://youtu.be/<br />https://vimeo.com/<br />https://soundcloud.com/<br />";
@@ -381,12 +306,6 @@ App::$strings["Only allow embeds from secure (SSL) websites and links."] = "Alle
App::$strings["Allow unfiltered embedded HTML content only from these domains"] = "Alleen ongefilterde ingesloten (embedded) HTML van deze websites toestaan";
App::$strings["One site per line. By default embedded content is filtered."] = "Eén website per regel. Standaard wordt ingesloten (embedded) inhoud gefilterd.";
App::$strings["Block embedded HTML from these domains"] = "Ingesloten (embedded) HTML vanaf deze domeinen blokkeren";
-App::$strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
-App::$strings["No themes found."] = "Geen thema's gevonden";
-App::$strings["Screenshot"] = "Schermafdruk";
-App::$strings["Themes"] = "Thema's";
-App::$strings["[Experimental]"] = "[Experimenteel]";
-App::$strings["[Unsupported]"] = "[Niet ondersteund]";
App::$strings["Password changed for account %d."] = "Wachtwoord veranderd voor account %d.";
App::$strings["Account settings updated."] = "Account-instellingen bijgewerkt.";
App::$strings["Account not found."] = "Account niet gevonden.";
@@ -415,6 +334,8 @@ App::$strings["Request date"] = "Tijd/datum verzoek";
App::$strings["Email"] = "E-mail";
App::$strings["No registrations."] = "Geen verzoeken.";
App::$strings["Deny"] = "Afkeuren";
+App::$strings["Block"] = "Blokkeren";
+App::$strings["Unblock"] = "Deblokkeren";
App::$strings["ID"] = "ID";
App::$strings["All Channels"] = "Alle kanalen";
App::$strings["Register date"] = "Geregistreerd";
@@ -448,6 +369,7 @@ App::$strings["Allow Code"] = "Scripts toestaan";
App::$strings["Disallow Code"] = "Scripts niet toestaan";
App::$strings["Channel"] = "Kanaal";
App::$strings["UID"] = "UID";
+App::$strings["Address"] = "Adres";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
App::$strings["Update has been marked successful"] = "Update is als succesvol gemarkeerd";
@@ -459,12 +381,22 @@ App::$strings["No failed updates."] = "Geen mislukte updates.";
App::$strings["Failed Updates"] = "Mislukte updates";
App::$strings["Mark success (if update was manually applied)"] = "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)";
App::$strings["Attempt to execute this update step automatically"] = "Poging om deze stap van de update automatisch uit te voeren.";
+App::$strings["Queue Statistics"] = "Wachtrij-statistieken";
+App::$strings["Total Entries"] = "Aantal vermeldingen";
+App::$strings["Priority"] = "Prioriteit";
+App::$strings["Destination URL"] = "Doel-URL";
+App::$strings["Mark hub permanently offline"] = "Hub als permanent offline markeren";
+App::$strings["Empty queue for this hub"] = "Berichtenwachtrij voor deze hub legen";
+App::$strings["Last known contact"] = "Voor het laatst contact";
App::$strings["Site settings updated."] = "Hub-instellingen bijgewerkt.";
App::$strings["Default"] = "Standaard";
+App::$strings["%s - (Incompatible)"] = "%s - (niet compatible)";
App::$strings["mobile"] = "mobiel";
App::$strings["experimental"] = "experimenteel";
App::$strings["unsupported"] = "Niet ondersteund";
+App::$strings["No"] = "Nee";
App::$strings["Yes - with approval"] = "Ja - met goedkeuring";
+App::$strings["Yes"] = "Ja";
App::$strings["My site is not a public server"] = "Mijn \$Projectname-hub is niet openbaar";
App::$strings["My site has paid access only"] = "Mijn \$Projectname-hub kent alleen betaalde toegang";
App::$strings["My site has free access only"] = "Mijn \$Projectname-hub kent alleen gratis toegang";
@@ -542,28 +474,60 @@ App::$strings["Maximum Load Average"] = "Maximaal gemiddelde systeembelasting";
App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50.";
App::$strings["Expiration period in days for imported (grid/network) content"] = "Aantal dagen waarna geïmporteerde inhoud uit iemands grid/netwerk-pagina wordt verwijderd.";
App::$strings["0 for no expiration of imported content"] = "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud.";
-App::$strings["Public Hubs"] = "Openbare hubs";
-App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
-App::$strings["Hub URL"] = "Hub-URL";
-App::$strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
-App::$strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
-App::$strings["Stats"] = "Stats";
-App::$strings["Software"] = "Software";
-App::$strings["Ratings"] = "Beoordelingen";
-App::$strings["Rate"] = "Beoordeel";
-App::$strings["View"] = "Weergeven";
-App::$strings["Item not found"] = "Item niet gevonden";
+App::$strings["Plugin %s disabled."] = "Plugin %s uitgeschakeld.";
+App::$strings["Plugin %s enabled."] = "Plugin %s ingeschakeld";
+App::$strings["Disable"] = "Uitschakelen";
+App::$strings["Enable"] = "Inschakelen";
+App::$strings["Plugins"] = "Plugins";
+App::$strings["Toggle"] = "Omschakelen";
+App::$strings["Settings"] = "Instellingen";
+App::$strings["Author: "] = "Auteur: ";
+App::$strings["Maintainer: "] = "Beheerder: ";
+App::$strings["Minimum project version: "] = "Minimum versie Hubzilla: ";
+App::$strings["Maximum project version: "] = "Maximum versie Hubzilla:";
+App::$strings["Minimum PHP version: "] = "Minimum versie PHP: ";
+App::$strings["Compatible Server Roles: "] = "Werkt met configuratietypes: ";
+App::$strings["Requires: "] = "Vereist: ";
+App::$strings["Disabled - version incompatibility"] = "Uitgeschakeld - versie is incompatibel";
+App::$strings["Enter the public git repository URL of the plugin repo."] = "Vul de openbare Git-URL in van de plugin-repository.";
+App::$strings["Plugin repo git URL"] = "Git-URL plugin-repository";
+App::$strings["Custom repo name"] = "Handmatige repository-naam";
+App::$strings["(optional)"] = "(niet verplicht)";
+App::$strings["Download Plugin Repo"] = "Plugin-repository downloaden";
+App::$strings["Install new repo"] = "Nieuwe repository installeren";
+App::$strings["Install"] = "Installeren";
+App::$strings["Cancel"] = "Annuleren";
+App::$strings["Manage Repos"] = "Repositories beheren";
+App::$strings["Installed Plugin Repositories"] = "Toegevoegde plugin-repositories";
+App::$strings["Install a New Plugin Repository"] = "Nieuwe plugin-repository toevoegen";
+App::$strings["Update"] = "Bijwerken";
+App::$strings["Switch branch"] = "Branch veranderen";
+App::$strings["Remove"] = "Verwijderen";
+App::$strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
+App::$strings["No themes found."] = "Geen thema's gevonden";
+App::$strings["Screenshot"] = "Schermafdruk";
+App::$strings["Themes"] = "Thema's";
+App::$strings["[Experimental]"] = "[Experimenteel]";
+App::$strings["[Unsupported]"] = "[Niet ondersteund]";
+App::$strings["Export Channel"] = "Kanaal exporteren";
+App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal.";
+App::$strings["Export Content"] = "Inhoud exporteren";
+App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint.";
+App::$strings["Export your posts from a given year."] = "Exporteer jouw berichten uit een bepaald jaar.";
+App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak.";
+App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. ";
+App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren.";
+App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1\$s\">%2\$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen.";
App::$strings["Layout Name"] = "Naam lay-out";
-App::$strings["Layout Description (Optional)"] = "Lay-out-omschrijving (optioneel)";
+App::$strings["Layout Description (Optional)"] = "Lay-out-omschrijving (niet verplicht)";
App::$strings["Edit Layout"] = "Lay-out bewerken";
App::$strings["Page link"] = "Paginalink";
-App::$strings["Insert web link"] = "Weblink invoegen";
App::$strings["Edit Webpage"] = "Webpagina bewerken";
-App::$strings["Photos"] = "Foto's";
-App::$strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
-App::$strings["Posts and comments"] = "Berichten en reacties";
-App::$strings["Only posts"] = "Alleen berichten";
-App::$strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende permissies. Doorgestuurd naar profielpagina.";
+App::$strings["Apps"] = "Apps";
+App::$strings["Manage apps"] = "Apps beheren";
+App::$strings["Create new app"] = "Nieuwe app aanmaken";
+App::$strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
+App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
App::$strings["No such group"] = "Collectie niet gevonden";
App::$strings["No such channel"] = "Niet zo'n kanaal";
App::$strings["forum"] = "forum";
@@ -571,6 +535,7 @@ App::$strings["Search Results For:"] = "Zoekresultaten voor:";
App::$strings["Privacy group is empty"] = "Privacygroep is leeg";
App::$strings["Privacy group: "] = "Privacygroep: ";
App::$strings["Invalid connection."] = "Ongeldige connectie.";
+App::$strings["Invalid channel."] = "Onbekend kanaal.";
App::$strings["Unable to update menu."] = "Niet in staat om menu aan te passen";
App::$strings["Unable to create menu."] = "Niet in staat om menu aan te maken.";
App::$strings["Menu Name"] = "Menunaam";
@@ -581,6 +546,7 @@ App::$strings["Allow Bookmarks"] = "Bladwijzers toestaan";
App::$strings["Menu may be used to store saved bookmarks"] = "Menu kan gebruikt worden om bladwijzers in op te slaan";
App::$strings["Submit and proceed"] = "Opslaan en doorgaan";
App::$strings["Menus"] = "Menu's";
+App::$strings["Drop"] = "Verwijderen";
App::$strings["Created"] = "Aangemaakt";
App::$strings["Edited"] = "Bewerkt";
App::$strings["Bookmarks allowed"] = "Bladwijzers toegestaan";
@@ -597,39 +563,171 @@ App::$strings["Menu title"] = "Titel van menu";
App::$strings["Menu title as seen by others"] = "Titel van menu zoals anderen dat zien.";
App::$strings["Allow bookmarks"] = "Bladwijzers toestaan";
App::$strings["Not found."] = "Niet gevonden.";
-App::$strings["App installed."] = "App geïnstalleerd";
-App::$strings["Malformed app."] = "Misvormde app.";
-App::$strings["Embed code"] = "Insluitcode";
-App::$strings["Edit App"] = "App bewerken";
-App::$strings["Create App"] = "App maken";
-App::$strings["Name of app"] = "Naam van app";
-App::$strings["Required"] = "Vereist";
-App::$strings["Location (URL) of app"] = "Locatie (URL) van app";
-App::$strings["Description"] = "Omschrijving";
-App::$strings["Photo icon URL"] = "URL van pictogram";
-App::$strings["80 x 80 pixels - optional"] = "80 x 80 pixels (optioneel)";
-App::$strings["Categories (optional, comma separated list)"] = "Categorieën (optioneel, door komma's gescheiden lijst)";
-App::$strings["Version ID"] = "Versie-ID";
-App::$strings["Price of app"] = "Prijs van de app";
-App::$strings["Location (URL) to purchase app"] = "Locatie (URL) om de app aan te schaffen";
App::$strings["Edit post"] = "Bericht bewerken";
-App::$strings["Documentation Search"] = "Zoek documentatie";
-App::$strings["About"] = "Over";
-App::$strings["Members"] = "Kanalen";
-App::$strings["Administrators"] = "Beheerders";
-App::$strings["Developers"] = "Ontwikkelaars";
-App::$strings["Tutorials"] = "Zelfstudie";
-App::$strings["\$Projectname Documentation"] = "\$Projectname-documentatie";
-App::$strings["Contents"] = "Inhoud";
-App::$strings["Share content from Firefox to \$Projectname"] = "Deel webpagina's vanuit Firefox met ";
-App::$strings["Activate the Firefox \$Projectname provider"] = "Activeer de \$Projectname-service in Firefox";
-App::$strings["Apps"] = "Apps";
+App::$strings["Location not found."] = "Locatie niet gevonden.";
+App::$strings["Location lookup failed."] = "Opzoeken locatie mislukt";
+App::$strings["Please select another location to become primary before removing the primary location."] = "Kies eerst een andere primaire locatie alvorens de huidige primaire locatie te verwijderen.";
+App::$strings["Syncing locations"] = "Locaties synchronizeren";
+App::$strings["No locations found."] = "Geen locaties gevonden.";
+App::$strings["Manage Channel Locations"] = "Kanaallocaties beheren";
+App::$strings["Location"] = "Locatie";
+App::$strings["Primary"] = "Primair";
+App::$strings["Sync Now"] = "Nu synchroniseren";
+App::$strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
+App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
+App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
+App::$strings["Public Hubs"] = "Openbare hubs";
+App::$strings["The listed hubs allow public registration for the \$Projectname network. All hubs in the network are interlinked so membership on any of them conveys membership in the network as a whole. Some hubs may require subscription or provide tiered service plans. The hub itself <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor het \$Projectname-netwerk aanmelden. Alle hubs in het netwerk zijn met elkaar verbonden, dus maakt het qua lidmaatschap niet uit waar je je aanmeldt. Op sommige hubs heb je eerst goedkeuring nodig en sommige hubs vereisen een financiële tegemoetkoming voor bepaalde uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
+App::$strings["Hub URL"] = "Hub-URL";
+App::$strings["Access Type"] = "Toegangs-<br/>&nbsp;type";
+App::$strings["Registration Policy"] = "Registratie-<br/>&nbsp;beleid";
+App::$strings["Stats"] = "Stats";
+App::$strings["Software"] = "Software";
+App::$strings["Ratings"] = "Beoordelingen";
+App::$strings["Rate"] = "Beoordeel";
+App::$strings["View"] = "Weergeven";
+App::$strings["Could not access contact record."] = "Kon geen toegang krijgen tot de connectie-gegevens.";
+App::$strings["Could not locate selected profile."] = "Kon het gekozen profiel niet vinden.";
+App::$strings["Connection updated."] = "Connectie bijgewerkt.";
+App::$strings["Failed to update connection record."] = "Bijwerken van connectie-gegevens mislukt.";
+App::$strings["is now connected to"] = "is nu verbonden met";
+App::$strings["Could not access address book record."] = "Kon geen toegang krijgen tot de record van de connectie.";
+App::$strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
+App::$strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
+App::$strings["Connection has been removed."] = "Connectie is verwijderd";
+App::$strings["View Profile"] = "Profiel weergeven";
+App::$strings["View %s's profile"] = "Profiel van %s weergeven";
+App::$strings["Refresh Permissions"] = "Permissies vernieuwen";
+App::$strings["Fetch updated permissions"] = "Aangepaste permissies ophalen";
+App::$strings["Refresh Photo"] = "Foto vernieuwen";
+App::$strings["Fetch updated photo"] = "Aangepaste foto ophalen";
+App::$strings["Recent Activity"] = "Recente activiteit/berichten";
+App::$strings["View recent posts and comments"] = "Recente berichten en reacties weergeven";
+App::$strings["Block (or Unblock) all communications with this connection"] = "Blokkeer (of deblokkeer) alle communicatie met deze connectie";
+App::$strings["This connection is blocked!"] = "Deze connectie is geblokkeerd!";
+App::$strings["Unignore"] = "Niet meer negeren";
+App::$strings["Ignore (or Unignore) all inbound communications from this connection"] = "Negeer (of negeer niet meer) alle inkomende communicatie van deze connectie";
+App::$strings["This connection is ignored!"] = "Deze connectie wordt genegeerd!";
+App::$strings["Unarchive"] = "Niet meer archiveren";
+App::$strings["Archive"] = "Archiveren";
+App::$strings["Archive (or Unarchive) this connection - mark channel dead but keep content"] = "Archiveer (of dearchiveer) deze connectie - markeer het kanaal als dood, maar bewaar de inhoud";
+App::$strings["This connection is archived!"] = "Deze connectie is gearchiveerd!";
+App::$strings["Unhide"] = "Niet meer verbergen";
+App::$strings["Hide"] = "Verbergen";
+App::$strings["Hide or Unhide this connection from your other connections"] = "Deze connectie verbergen (of niet meer verbergen) voor jouw andere connecties";
+App::$strings["This connection is hidden!"] = "Deze connectie is verborgen!";
+App::$strings["Delete this connection"] = "Deze connectie verwijderen";
+App::$strings["Fetch Vcard"] = "Vcard ophalen";
+App::$strings["Fetch electronic calling card for this connection"] = "Visitekaartje van deze connectie ophalen";
+App::$strings["Permissions"] = "Permissies";
+App::$strings["Open Individual Permissions section by default"] = "Sectie met individuele permissies standaard openen";
+App::$strings["Affinity"] = "Affiniteit";
+App::$strings["Open Set Affinity section by default"] = "Sectie met de affiniteitsinstelling standaard openen";
+App::$strings["Me"] = "Ik";
+App::$strings["Family"] = "Familie";
+App::$strings["Friends"] = "Vrienden";
+App::$strings["Acquaintances"] = "Kennissen";
+App::$strings["Filter"] = "Filter";
+App::$strings["Open Custom Filter section by default"] = "Sectie met de berichtenfilter standaard openen";
+App::$strings["Approve this connection"] = "Deze connectie accepteren";
+App::$strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
+App::$strings["Set Affinity"] = "Affiniteit instellen";
+App::$strings["Set Profile"] = "Profiel instellen";
+App::$strings["Set Affinity & Profile"] = "Affiniteit en profiel instellen";
+App::$strings["none"] = "geen";
+App::$strings["Connection Default Permissions"] = "Standaard permissies voor connecties";
+App::$strings["Connection: %s"] = "Connectie: %s";
+App::$strings["Apply these permissions automatically"] = "Deze permissies automatisch toepassen";
+App::$strings["Connection requests will be approved without your interaction"] = "Connectieverzoeken zullen automatisch worden geaccepteerd";
+App::$strings["Permission role"] = "Permissietype";
+App::$strings["Add permission role"] = "Permissietype toevoegen";
+App::$strings["This connection's primary address is"] = "Het primaire kanaaladres van deze connectie is";
+App::$strings["Available locations:"] = "Beschikbare locaties:";
+App::$strings["The permissions indicated on this page will be applied to all new connections."] = "Permissies die op deze pagina staan vermeld worden op alle nieuwe connecties toegepast.";
+App::$strings["Connection Tools"] = "Hulpmiddelen";
+App::$strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
+App::$strings["Rating"] = "Beoordeling";
+App::$strings["Slide to adjust your rating"] = "Gebruik de schuif om je beoordeling te geven";
+App::$strings["Optionally explain your rating"] = "Verklaar jouw beoordeling (niet verplicht)";
+App::$strings["Custom Filter"] = "Berichtenfilter";
+App::$strings["Only import posts with this text"] = "Importeer alleen berichten met deze tekst";
+App::$strings["words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts"] = "woorden (één per regel), #tags, /regex/ of talen (lang=iso639-1) - laat leeg om alle berichten te importeren";
+App::$strings["Do not import posts with this text"] = "Importeer geen berichten met deze tekst";
+App::$strings["This information is public!"] = "Deze informatie is openbaar!";
+App::$strings["Connection Pending Approval"] = "Connectie moet nog geaccepteerd worden";
+App::$strings["inherited"] = "geërfd";
+App::$strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken.";
+App::$strings["Their Settings"] = "Hun instellingen";
+App::$strings["My Settings"] = "Mijn instellingen";
+App::$strings["Individual Permissions"] = "Individuele permissies";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can <strong>not</strong> change those settings here."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele instellingen. Je kan je deze overgeërfde permissies hier <strong>niet</strong> veranderen.";
+App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Sommige permissies worden mogelijk overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal, die een hogere prioriteit hebben dan deze individuele permissies. Je kan de permissies hier veranderen, maar die hebben geen effect, tenzij de overgeërfde permissies worden veranderd. ";
+App::$strings["Last update:"] = "Laatste wijziging:";
+App::$strings["Details"] = "Details";
+App::$strings["Organisation"] = "Organisatie";
+App::$strings["Title"] = "Titel";
+App::$strings["Phone"] = "Telefoon";
+App::$strings["Instant messenger"] = "Instant messenger";
+App::$strings["Website"] = "Website";
+App::$strings["Note"] = "Opmerking";
+App::$strings["Mobile"] = "Mobiel";
+App::$strings["Home"] = "Thuis";
+App::$strings["Work"] = "Werk";
+App::$strings["Add Contact"] = "Contact toevoegen";
+App::$strings["Add Field"] = "Veld toevoegen";
+App::$strings["P.O. Box"] = "Postbus";
+App::$strings["Additional"] = "Extra";
+App::$strings["Street"] = "Straat en huisnummer";
+App::$strings["Locality"] = "Plaats";
+App::$strings["Region"] = "Provincie/staat/regio/enz.";
+App::$strings["ZIP Code"] = "Postcode";
+App::$strings["Country"] = "Land";
+App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
+App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
+App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
+App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
+App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
+App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
+App::$strings["event"] = "gebeurtenis";
+App::$strings["Edit event title"] = "Titel bewerken";
+App::$strings["Event title"] = "Titel";
+App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
+App::$strings["Edit Category"] = "Categorie";
+App::$strings["Category"] = "Categorie";
+App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
+App::$strings["Start date and time"] = "Begindatum en -tijd";
+App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
+App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
+App::$strings["Finish date and time"] = "Einddatum en -tijd";
+App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
+App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
+App::$strings["Edit Description"] = "Omschrijving bewerken";
+App::$strings["Edit Location"] = "Locatie bewerken";
+App::$strings["Preview"] = "Voorvertoning";
+App::$strings["Permission settings"] = "Permissies";
+App::$strings["Timezone:"] = "Tijdzone:";
+App::$strings["Advanced Options"] = "Geavanceerde opties";
+App::$strings["l, F j"] = "l j F";
+App::$strings["Edit event"] = "Gebeurtenis bewerken";
+App::$strings["Delete event"] = "Gebeurtenis verwijderen";
+App::$strings["Link to Source"] = "Originele locatie";
+App::$strings["calendar"] = "agenda";
+App::$strings["Edit Event"] = "Gebeurtenis bewerken";
+App::$strings["Create Event"] = "Gebeurtenis aanmaken";
+App::$strings["Previous"] = "Vorige";
+App::$strings["Next"] = "Volgende";
+App::$strings["Export"] = "Exporteren";
+App::$strings["Month"] = "Maand";
+App::$strings["Week"] = "Week";
+App::$strings["Day"] = "Dag";
+App::$strings["Today"] = "Vandaag";
+App::$strings["Event removed"] = "Gebeurtenis verwijderd";
+App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
App::$strings["\$Projectname"] = "\$Projectname";
App::$strings["Welcome to %s"] = "Welkom op %s";
App::$strings["Permission Denied."] = "Toegang geweigerd";
App::$strings["File not found."] = "Bestand niet gevonden.";
App::$strings["Edit file permissions"] = "Bestandsrechten bewerken";
-App::$strings["Permissions"] = "Permissies";
App::$strings["Set/edit permissions"] = "Rechten instellen/bewerken";
App::$strings["Include all files and sub folders"] = "Toepassen op alle bestanden en submappen";
App::$strings["Return to file list"] = "Terugkeren naar bestandlijst ";
@@ -638,45 +736,105 @@ App::$strings["Copy/paste this URL to link file from a web page"] = "Kopieer/pla
App::$strings["Share this file"] = "Dit bestand delen";
App::$strings["Show URL to this file"] = "Toon URL van dit bestand";
App::$strings["Notify your contacts about this file"] = "Jouw connecties over dit bestand berichten";
+App::$strings["Photos"] = "Foto's";
+App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
+App::$strings["Profile Photos"] = "Profielfoto's";
+App::$strings["Album not found."] = "Album niet gevonden.";
+App::$strings["Delete Album"] = "Verwijder album";
+App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
+App::$strings["Delete Photo"] = "Verwijder foto";
App::$strings["Public access denied."] = "Openbare toegang geweigerd.";
-App::$strings["%d rating"] = array(
- 0 => "%d beoordeling",
- 1 => "%d beoordelingen",
+App::$strings["No photos selected"] = "Geen foto's geselecteerd";
+App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
+App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
+App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
+App::$strings["Upload Photos"] = "Foto's uploaden";
+App::$strings["Enter an album name"] = "Vul een albumnaam in";
+App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
+App::$strings["Caption (optional):"] = "Bijschrift (niet verplicht):";
+App::$strings["Description (optional):"] = "Omschrijving (niet verplicht):";
+App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
+App::$strings["Contact Photos"] = "Connectiefoto's";
+App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
+App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
+App::$strings["View Photo"] = "Foto weergeven";
+App::$strings["Edit Album"] = "Album bewerken";
+App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
+App::$strings["Photo not available"] = "Foto niet aanwezig";
+App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
+App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
+App::$strings["Private Photo"] = "Privéfoto";
+App::$strings["View Full Size"] = "Volledige grootte weergeven";
+App::$strings["Edit photo"] = "Foto bewerken";
+App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
+App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
+App::$strings["Move photo to album"] = "Verplaatst foto naar album";
+App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
+App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
+App::$strings["Caption"] = "Bijschrift";
+App::$strings["Add a Tag"] = "Tag toevoegen";
+App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
+App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
+App::$strings["I like this (toggle)"] = "Vind ik leuk";
+App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
+App::$strings["Share"] = "Delen";
+App::$strings["Please wait"] = "Even wachten";
+App::$strings["This is you"] = "Dit ben jij";
+App::$strings["Comment"] = "Reactie";
+App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["__ctx:title__ Agree"] = "eens";
+App::$strings["__ctx:title__ Disagree"] = "oneens";
+App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
+App::$strings["__ctx:title__ Attending"] = "aanwezig";
+App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
+App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
+App::$strings["View all"] = "Toon alles";
+App::$strings["__ctx:noun__ Like"] = array(
+ 0 => "vindt dit leuk",
+ 1 => "vinden dit leuk",
);
-App::$strings["Gender: "] = "Geslacht:";
-App::$strings["Status: "] = "Status: ";
-App::$strings["Homepage: "] = "Homepage: ";
-App::$strings["Age:"] = "Leeftijd:";
-App::$strings["Location:"] = "Plaats:";
-App::$strings["Description:"] = "Omschrijving:";
-App::$strings["Hometown:"] = "Oorspronkelijk uit:";
-App::$strings["About:"] = "Over:";
-App::$strings["Public Forum:"] = "Openbaar forum:";
-App::$strings["Keywords: "] = "Trefwoorden: ";
-App::$strings["Don't suggest"] = "Niet voorstellen";
-App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
-App::$strings["Global Directory"] = "Volledige kanalengids";
-App::$strings["Local Directory"] = "Lokale kanalengids";
-App::$strings["Finding:"] = "Gezocht naar:";
-App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
-App::$strings["next page"] = "volgende pagina";
-App::$strings["previous page"] = "vorige pagina";
-App::$strings["Sort options"] = "Sorteeropties";
-App::$strings["Alphabetic"] = "Alfabetisch";
-App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
-App::$strings["Newest to Oldest"] = "Nieuw naar oud";
-App::$strings["Oldest to Newest"] = "Oud naar nieuw";
-App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
-App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
-App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
-App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
-App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
-App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
-App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
-App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
-App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
-App::$strings["toggle full screen mode"] = "Volledig scherm";
-App::$strings["Channel added."] = "Kanaal toegevoegd.";
+App::$strings["__ctx:noun__ Dislike"] = array(
+ 0 => "vindt dit niet leuk",
+ 1 => "vinden dit niet leuk",
+);
+App::$strings["Photo Tools"] = "Hulpmiddelen";
+App::$strings["In This Photo:"] = "Op deze foto:";
+App::$strings["Map"] = "Kaart";
+App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
+App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
+App::$strings["Close"] = "Sluiten";
+App::$strings["View Album"] = "Album weergeven";
+App::$strings["Recent Photos"] = "Recente foto's";
+App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
+App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
+App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
+App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
+App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
+App::$strings["Privacy group name: "] = "Naam privacygroep: ";
+App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
+App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
+App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
+App::$strings["Privacy group editor"] = "Privacygroep bewerken";
+App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
+App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
+App::$strings["Invalid message"] = "Ongeldig bericht";
+App::$strings["no results"] = "geen resultaten";
+App::$strings["channel sync processed"] = "kanaalsync verwerkt";
+App::$strings["queued"] = "in wachtrij";
+App::$strings["posted"] = "verstuurd";
+App::$strings["accepted for delivery"] = "geaccepteerd om afgeleverd te worden";
+App::$strings["updated"] = "geüpdatet";
+App::$strings["update ignored"] = "update genegeerd";
+App::$strings["permission denied"] = "toegang geweigerd";
+App::$strings["recipient not found"] = "ontvanger niet gevonden";
+App::$strings["mail recalled"] = "Privébericht ingetrokken";
+App::$strings["duplicate mail received"] = "dubbel privébericht ontvangen";
+App::$strings["mail delivered"] = "privébericht afgeleverd";
+App::$strings["Delivery report for %1\$s"] = "Afleveringsrapport voor %1\$s";
+App::$strings["Options"] = "Opties";
+App::$strings["Redeliver"] = "Opnieuw afleveren";
App::$strings["Unable to lookup recipient."] = "Niet in staat om ontvanger op te zoeken.";
App::$strings["Unable to communicate with requested channel."] = "Niet in staat om met het aangevraagde kanaal te communiceren.";
App::$strings["Cannot verify requested channel."] = "Kan opgevraagd kanaal niet verifieren";
@@ -709,52 +867,20 @@ App::$strings["layout"] = "lay-out";
App::$strings["menu"] = "menu";
App::$strings["%s element installed"] = "%s onderdeel geïnstalleerd";
App::$strings["%s element installation failed"] = "Installatie %s-element mislukt";
-App::$strings["Nothing to import."] = "Niets gevonden om te importeren";
-App::$strings["Unable to download data from old server"] = "Niet in staat om gegevens van de oude hub te downloaden";
-App::$strings["Imported file is empty."] = "Geïmporteerde bestand is leeg";
-App::$strings["Warning: Database versions differ by %1\$d updates."] = "Waarschuwing: database-versies lopen %1\$d updates achter.";
App::$strings["Import completed"] = "Importeren voltooid";
App::$strings["Import Items"] = "Importeer items";
App::$strings["Use this form to import existing posts and content from an export file."] = "Gebruik dit formulier om bestaande berichten en andere inhoud vanuit een exportbestand te importeren.";
-App::$strings["File to Upload"] = "Bestand om te uploaden";
-App::$strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
-App::$strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
-App::$strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
-App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
-App::$strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
-App::$strings["%d message sent."] = array(
- 0 => "%d bericht verzonden.",
- 1 => "%d berichten verzonden.",
-);
-App::$strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
-App::$strings["Send invitations"] = "Uitnodigingen verzenden";
-App::$strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
-App::$strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname op http://hubzilla.org";
-App::$strings["You will need to supply this invitation code:"] = "Je moet deze uitnodigingscode opgeven:";
-App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
-App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
-App::$strings["or visit"] = "of bezoek";
-App::$strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
-App::$strings["Block Name"] = "Bloknaam";
-App::$strings["Title (optional)"] = "Titel (optioneel)";
-App::$strings["Edit Block"] = "Blok bewerken";
-App::$strings["Privacy group created."] = "Privacygroep aangemaakt";
-App::$strings["Could not create privacy group."] = "Kon privacygroep niet aanmaken";
-App::$strings["Privacy group not found."] = "Privacygroep niet gevonden";
-App::$strings["Privacy group updated."] = "Privacygroep bijgewerkt";
-App::$strings["Create a group of channels."] = "Privacygroep met kanalen aanmaken";
-App::$strings["Privacy group name: "] = "Naam privacygroep: ";
-App::$strings["Members are visible to other channels"] = "Kanalen in deze privacygroep zijn zichtbaar voor andere kanalen";
-App::$strings["Privacy group removed."] = "Privacygroep verwijderd.";
-App::$strings["Unable to remove privacy group."] = "Verwijderen privacygroep mislukt";
-App::$strings["Privacy group editor"] = "Privacygroep bewerken";
-App::$strings["All Connected Channels"] = "Alle kanaalconnecties";
-App::$strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
-App::$strings["Invalid profile identifier."] = "Ongeldige profiel-identificator";
-App::$strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
-App::$strings["Profile"] = "Profiel";
-App::$strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
-App::$strings["Visible To"] = "Zichtbaar voor";
+App::$strings["You have created %1$.0f of %2$.0f allowed channels."] = "Je hebt %1$.0f van totaal %2$.0f toegestane kanalen aangemaakt.";
+App::$strings["Create a new channel"] = "Nieuw kanaal aanmaken";
+App::$strings["Create New"] = "Nieuwe aanmaken";
+App::$strings["Channel Manager"] = "Kanaalbeheer";
+App::$strings["Current Channel"] = "Huidig kanaal";
+App::$strings["Switch to one of your channels by selecting it."] = "Activeer een van jouw andere kanalen door er op te klikken.";
+App::$strings["Default Channel"] = "Standaardkanaal";
+App::$strings["Make Default"] = "Als standaard instellen";
+App::$strings["%d new messages"] = "%d nieuwe berichten";
+App::$strings["%d new introductions"] = "%d nieuwe connectieverzoeken";
+App::$strings["Delegated Channel"] = "Uitbesteed kanaal";
App::$strings["Hub not found."] = "Hub niet gevonden.";
App::$strings["Unable to create element."] = "Niet in staat om onderdeel aan te maken.";
App::$strings["Unable to update menu element."] = "Menu-onderdeel kan niet worden geüpdatet.";
@@ -785,181 +911,63 @@ App::$strings["Menu item deleted."] = "Menu-item verwijderd.";
App::$strings["Menu item could not be deleted."] = "Menu-item kon niet worden verwijderd.";
App::$strings["Edit Menu Element"] = "Menu-element bewerken";
App::$strings["Link text"] = "Linktekst";
+App::$strings["Item is not editable"] = "Item is niet te bewerken";
App::$strings["No ratings"] = "Geen beoordelingen";
App::$strings["Rating: "] = "Beoordeling: ";
App::$strings["Website: "] = "Website: ";
App::$strings["Description: "] = "Omschrijving: ";
App::$strings["Item not available."] = "Item is niet aanwezig.";
-App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
-App::$strings["Mood"] = "Stemming";
-App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
+App::$strings["Permissions denied."] = "Permissies niet toegestaan";
+App::$strings["Import"] = "Importeren";
App::$strings["No more system notifications."] = "Geen systeemnotificaties meer.";
App::$strings["System Notifications"] = "Systeemnotificaties";
-App::$strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
-App::$strings["Profile Photos"] = "Profielfoto's";
-App::$strings["Album not found."] = "Album niet gevonden.";
-App::$strings["Delete Album"] = "Verwijder album";
-App::$strings["Multiple storage folders exist with this album name, but within different directories. Please remove the desired folder or folders using the Files manager"] = "Er bestaan meerdere submappen met deze albumnaam, maar verspreidt over verschillende mappen. Verwijder de gewenste map(pen) met de bestandsbeheerder.";
-App::$strings["Delete Photo"] = "Verwijder foto";
-App::$strings["No photos selected"] = "Geen foto's geselecteerd";
-App::$strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
-App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
-App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
-App::$strings["Upload Photos"] = "Foto's uploaden";
-App::$strings["Enter an album name"] = "Vul een albumnaam in";
-App::$strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
-App::$strings["Caption (optional):"] = "Bijschrift (optioneel):";
-App::$strings["Description (optional):"] = "Omschrijving (optioneel):";
-App::$strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
-App::$strings["Contact Photos"] = "Connectiefoto's";
-App::$strings["Show Newest First"] = "Nieuwste eerst weergeven";
-App::$strings["Show Oldest First"] = "Oudste eerst weergeven";
-App::$strings["View Photo"] = "Foto weergeven";
-App::$strings["Edit Album"] = "Album bewerken";
-App::$strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
-App::$strings["Photo not available"] = "Foto niet aanwezig";
-App::$strings["Use as profile photo"] = "Als profielfoto gebruiken";
-App::$strings["Use as cover photo"] = "Als omslagfoto gebruiken";
-App::$strings["Private Photo"] = "Privéfoto";
-App::$strings["Previous"] = "Vorige";
-App::$strings["View Full Size"] = "Volledige grootte weergeven";
-App::$strings["Next"] = "Volgende";
-App::$strings["Edit photo"] = "Foto bewerken";
-App::$strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
-App::$strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
-App::$strings["Move photo to album"] = "Verplaatst foto naar album";
-App::$strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
-App::$strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
-App::$strings["Caption"] = "Bijschrift";
-App::$strings["Add a Tag"] = "Tag toevoegen";
-App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
-App::$strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
-App::$strings["I like this (toggle)"] = "Vind ik leuk";
-App::$strings["I don't like this (toggle)"] = "Vind ik niet leuk";
-App::$strings["Share"] = "Delen";
-App::$strings["Please wait"] = "Even wachten";
-App::$strings["This is you"] = "Dit ben jij";
-App::$strings["Comment"] = "Reactie";
-App::$strings["Preview"] = "Voorvertoning";
-App::$strings["__ctx:title__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:title__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["__ctx:title__ Agree"] = "eens";
-App::$strings["__ctx:title__ Disagree"] = "oneens";
-App::$strings["__ctx:title__ Abstain"] = "onthoudingen";
-App::$strings["__ctx:title__ Attending"] = "aanwezig";
-App::$strings["__ctx:title__ Not attending"] = "niet aanwezig";
-App::$strings["__ctx:title__ Might attend"] = "mogelijk aanwezig";
-App::$strings["View all"] = "Toon alles";
-App::$strings["__ctx:noun__ Like"] = array(
- 0 => "vindt dit leuk",
- 1 => "vinden dit leuk",
-);
-App::$strings["__ctx:noun__ Dislike"] = array(
- 0 => "vindt dit niet leuk",
- 1 => "vinden dit niet leuk",
+App::$strings["Authorize application connection"] = "Geef toestemming voor applicatiekoppeling";
+App::$strings["Return to your app and insert this Security Code:"] = "Ga terug naar je app en voeg deze beveiligingscode in:";
+App::$strings["Please login to continue."] = "Inloggen om verder te kunnen gaan.";
+App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?";
+App::$strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
+App::$strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
+App::$strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
+App::$strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
+App::$strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
+App::$strings["%d message sent."] = array(
+ 0 => "%d bericht verzonden.",
+ 1 => "%d berichten verzonden.",
);
-App::$strings["Photo Tools"] = "Hulpmiddelen";
-App::$strings["In This Photo:"] = "Op deze foto:";
-App::$strings["Map"] = "Kaart";
-App::$strings["__ctx:noun__ Likes"] = "vinden dit leuk";
-App::$strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
-App::$strings["Close"] = "Sluiten";
-App::$strings["View Album"] = "Album weergeven";
-App::$strings["Recent Photos"] = "Recente foto's";
-App::$strings["\$Projectname Server - Setup"] = "\$Projectname Hub - Setup";
-App::$strings["Could not connect to database."] = "Could not connect to database.";
-App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Could not connect to specified hub URL. Possible SSL certificate or DNS issue.";
-App::$strings["Could not create table."] = "Could not create table.";
-App::$strings["Your site database has been installed."] = "Your hub database has been installed.";
-App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "You may need to import the file \"install/schema_xxx.sql\" manually using a database client.";
-App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Please see the file \"install/INSTALL.txt\".";
-App::$strings["System check"] = "System check";
-App::$strings["Check again"] = "Check again";
-App::$strings["Database connection"] = "Database connection";
-App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "In order to install \$Projectname we need to know how to connect to your database.";
-App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Please contact your hosting provider or server administrator if you have questions about these settings.";
-App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "The database you specify below should already exist. If it does not, please create it before continuing.";
-App::$strings["Database Server Name"] = "Database Server Name";
-App::$strings["Default is 127.0.0.1"] = "Default is 127.0.0.1";
-App::$strings["Database Port"] = "Database Port";
-App::$strings["Communication port number - use 0 for default"] = "Communication port number - use 0 for default";
-App::$strings["Database Login Name"] = "Database Login Name";
-App::$strings["Database Login Password"] = "Database Login Password";
-App::$strings["Database Name"] = "Database Name";
-App::$strings["Database Type"] = "Database Type";
-App::$strings["Site administrator email address"] = "Hub administrator email address";
-App::$strings["Your account email address must match this in order to use the web admin panel."] = "Your account email address must match this in order to use the web admin panel.";
-App::$strings["Website URL"] = "Hub URL";
-App::$strings["Please use SSL (https) URL if available."] = "Please use SSL (https) URL if available.";
-App::$strings["Please select a default timezone for your website"] = "Please select a default timezone for your hub";
-App::$strings["Site settings"] = "Hub settings";
-App::$strings["PHP version 5.5 or greater is required."] = "PHP version 5.5 or greater is required.";
-App::$strings["PHP version"] = "PHP version";
-App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Could not find a command line version of PHP in the web server PATH.";
-App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron.";
-App::$strings["PHP executable path"] = "PHP executable path";
-App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Enter full path to php executable. You can leave this blank to continue the installation.";
-App::$strings["Command line PHP"] = "Command line PHP";
-App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Unable to check command line PHP, as shell_exec() is disabled. This is required.";
-App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "The command line version of PHP on your system does not have \"register_argc_argv\" enabled.";
-App::$strings["This is required for message delivery to work."] = "This is required for message delivery to work.";
-App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.";
-App::$strings["You can adjust these settings in the server php.ini file."] = "You can adjust these settings in the server php.ini file.";
-App::$strings["PHP upload limits"] = "PHP upload limits";
-App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys";
-App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\".";
-App::$strings["Generate encryption keys"] = "Generate encryption keys";
-App::$strings["libCurl PHP module"] = "libCurl PHP module";
-App::$strings["GD graphics PHP module"] = "GD graphics PHP module";
-App::$strings["OpenSSL PHP module"] = "OpenSSL PHP module";
-App::$strings["PDO database PHP module"] = "PDO database PHP module";
-App::$strings["mb_string PHP module"] = "mb_string PHP module";
-App::$strings["xml PHP module"] = "xml PHP module";
-App::$strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
-App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: Apache webserver mod-rewrite module is required but not installed.";
-App::$strings["exec"] = "exec";
-App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: exec is required but is either not installed or has been disabled in php.ini";
-App::$strings["shell_exec"] = "shell_exec";
-App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: shell_exec is required but is either not installed or has been disabled in php.ini";
-App::$strings["Error: libCURL PHP module required but not installed."] = "Error: libCURL PHP module required but not installed.";
-App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: GD graphics PHP module with JPEG support required but not installed.";
-App::$strings["Error: openssl PHP module required but not installed."] = "Error: openssl PHP module required but not installed.";
-App::$strings["Error: PDO database PHP module required but not installed."] = "Error: PDO database PHP module required but not installed.";
-App::$strings["Error: mb_string PHP module required but not installed."] = "Error: mb_string PHP module required but not installed.";
-App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: xml PHP module required for DAV but not installed.";
-App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so.";
-App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.";
-App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.";
-App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions.";
-App::$strings[".htconfig.php is writable"] = ".htconfig.php is writable";
-App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.";
-App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder.";
-App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.";
-App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.";
-App::$strings["%s is writable"] = "%s is writable";
-App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder";
-App::$strings["store is writable"] = "store is writable";
-App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL certificate cannot be validated. Fix certificate or disable https access to this hub.";
-App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!";
-App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "This restriction is incorporated because public posts from you may for example contain references to images on your own hub.";
-App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues.";
-App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement.";
-App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Providers are available that issue free certificates which are browser-valid.";
-App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications.";
-App::$strings["SSL certificate validation"] = "SSL certificate validation";
-App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Url rewrite in .htaccess is not working. Check your server configuration.Test: ";
-App::$strings["Url rewrite is working"] = "Url rewrite is working";
-App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root.";
-App::$strings["Errors encountered creating database tables."] = "Errors encountered creating database tables.";
-App::$strings["<h1>What next</h1>"] = "<h1>What next</h1>";
-App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT: You will need to [manually] setup a scheduled task for the poller.";
-App::$strings["Item is not editable"] = "Item is niet te bewerken";
-App::$strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
+App::$strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
+App::$strings["Send invitations"] = "Uitnodigingen verzenden";
+App::$strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
+App::$strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname op http://hubzilla.org";
+App::$strings["You will need to supply this invitation code:"] = "Je moet deze uitnodigingscode opgeven:";
+App::$strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
+App::$strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
+App::$strings["or visit"] = "of bezoek";
+App::$strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
+App::$strings["About this site"] = "Over deze hub";
+App::$strings["Site Name"] = "Hubnaam";
+App::$strings["Administrator"] = "Beheerder";
+App::$strings["Software and Project information"] = "Software- en projectinformatie";
+App::$strings["This site is powered by \$Projectname"] = "Dit is een \$Projectname-hub";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot";
+App::$strings["Version %s"] = "Versie %s";
+App::$strings["Project homepage"] = "Projectwebsite";
+App::$strings["Developer homepage"] = "Ontwikkelaarswebsite";
App::$strings["Create Channel"] = "Kanaal aanmaken";
App::$strings["A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions."] = "Een kanaal is jouw identiteit in dit netwerk. Het kan bijvoorbeeld een persoon, een blog of een forum vertegenwoordigen. Door met elkaar te verbinden kunnen kanalen, met behulp van uitgebreide permissies, informatie uitwisselen.";
App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "Of <a href=\"import\">importeer een bestaand kanaal</a> vanaf een andere locatie";
+App::$strings["Import Webpage Elements"] = "Webpagina-elementen importeren";
+App::$strings["Import selected"] = "Importbestand geselecteerd";
+App::$strings["Export Webpage Elements"] = "Webpagina-elementen exporteren";
+App::$strings["Export selected"] = "Selectie exporteren";
+App::$strings["Webpages"] = "Webpagina's";
+App::$strings["Actions"] = "Acties";
+App::$strings["Page Link"] = "Paginalink";
+App::$strings["Page Title"] = "Paginatitel";
+App::$strings["Invalid file type."] = "Ongeldig bestandsformaat";
+App::$strings["Error opening zip file"] = "Fout tijdens openen zipbestand";
+App::$strings["Invalid folder path."] = "Ongeldige maplocatie";
+App::$strings["No webpage elements detected."] = "Geen webpagina-elementen gedecteerd";
+App::$strings["Import complete."] = "Importeren voltooid.";
App::$strings["Mark all system notifications seen"] = "Markeer alle systeemnotificaties als bekeken";
App::$strings["Poke"] = "Aanstoten";
App::$strings["Poke somebody"] = "Iemand aanstoten";
@@ -968,79 +976,29 @@ App::$strings["Poke, prod or do other things to somebody"] = "Iemand bijvoorbeel
App::$strings["Recipient"] = "Ontvanger";
App::$strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
App::$strings["Make this post private"] = "Maak dit bericht privé";
-App::$strings["Profile not found."] = "Profiel niet gevonden.";
-App::$strings["Profile deleted."] = "Profiel verwijderd.";
-App::$strings["Profile-"] = "Profiel-";
-App::$strings["New profile created."] = "Nieuw profiel aangemaakt.";
-App::$strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen";
-App::$strings["Profile unavailable to export."] = "Geen profiel beschikbaar om te exporteren";
-App::$strings["Profile Name is required."] = "Profielnaam is vereist";
-App::$strings["Marital Status"] = "Huwelijke status";
-App::$strings["Romantic Partner"] = "Romantische partner";
-App::$strings["Likes"] = "Houdt van";
-App::$strings["Dislikes"] = "Houdt niet van";
-App::$strings["Work/Employment"] = "Werk/arbeid";
-App::$strings["Religion"] = "Religie";
-App::$strings["Political Views"] = "Politieke overtuigingen";
-App::$strings["Gender"] = "Geslacht";
-App::$strings["Sexual Preference"] = "Seksuele voorkeur";
-App::$strings["Homepage"] = "Homepage";
-App::$strings["Interests"] = "Interesses";
-App::$strings["Profile updated."] = "Profiel bijgewerkt";
-App::$strings["Hide your connections list from viewers of this profile"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
-App::$strings["Edit Profile Details"] = "Profiel bewerken";
-App::$strings["View this profile"] = "Profiel weergeven";
-App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
-App::$strings["Profile Tools"] = "Hulpmiddelen";
-App::$strings["Change cover photo"] = "Omslagfoto wijzigen";
-App::$strings["Change profile photo"] = "Profielfoto veranderen";
-App::$strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
-App::$strings["Clone this profile"] = "Dit profiel klonen";
-App::$strings["Delete this profile"] = "Dit profiel verwijderen";
-App::$strings["Add profile things"] = "Dingen aan je profiel toevoegen";
-App::$strings["Personal"] = "Persoonlijk";
-App::$strings["Relation"] = "Relatie";
-App::$strings["Miscellaneous"] = "Diversen";
-App::$strings["Import profile from file"] = "Profiel vanuit bestand importeren";
-App::$strings["Export profile to file"] = "Profiel naar bestand exporteren";
-App::$strings["Your gender"] = "Jouw geslacht";
-App::$strings["Marital status"] = "Burgerlijke staat";
-App::$strings["Sexual preference"] = "Seksuele voorkeur";
-App::$strings["Profile name"] = "Profielnaam";
-App::$strings["This is your default profile."] = "Dit is jouw standaardprofiel";
-App::$strings["Your full name"] = "Jouw volledige naam";
-App::$strings["Title/Description"] = "Titel/omschrijving";
-App::$strings["Street address"] = "Straat en huisnummer";
-App::$strings["Locality/City"] = "Woonplaats";
-App::$strings["Region/State"] = "Provincie/gewest/deelstaat";
-App::$strings["Postal/Zip code"] = "Postcode";
-App::$strings["Country"] = "Land";
-App::$strings["Who (if applicable)"] = "Wie (wanneer van toepassing)";
-App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl";
-App::$strings["Since (date)"] = "Sinds (datum)";
-App::$strings["Tell us about yourself"] = "Vertel ons iets over jezelf";
-App::$strings["Homepage URL"] = "URL homepagina";
-App::$strings["Hometown"] = "Oorspronkelijk uit";
-App::$strings["Political views"] = "Politieke overtuigingen";
-App::$strings["Religious views"] = "Religieuze overtuigingen";
-App::$strings["Keywords used in directory listings"] = "Trefwoorden voor in de kanalengids";
-App::$strings["Example: fishing photography software"] = "Voorbeeld: muziek, fotografie, software";
-App::$strings["Musical interests"] = "Muzikale interesses";
-App::$strings["Books, literature"] = "Boeken/literatuur";
-App::$strings["Television"] = "Televisie";
-App::$strings["Film/Dance/Culture/Entertainment"] = "Film/dans/cultuur/entertainment";
-App::$strings["Hobbies/Interests"] = "Hobby's/interesses";
-App::$strings["Love/Romance"] = "Liefde/romantiek";
-App::$strings["School/Education"] = "School/opleiding";
-App::$strings["Contact information and social networks"] = "Contactinformatie en sociale netwerken";
-App::$strings["My other channels"] = "Mijn andere kanalen";
-App::$strings["Profile Image"] = "Profielfoto";
-App::$strings["Edit Profiles"] = "Bewerk profielen";
-App::$strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
-App::$strings["Post successful."] = "Verzenden bericht geslaagd.";
+App::$strings["Invalid profile identifier."] = "Ongeldige profiel-identificator";
+App::$strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
+App::$strings["Profile"] = "Profiel";
+App::$strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
+App::$strings["Visible To"] = "Zichtbaar voor";
+App::$strings["Posts and comments"] = "Berichten en reacties";
+App::$strings["Only posts"] = "Alleen berichten";
+App::$strings["Unable to locate original post."] = "Niet in staat om de originele locatie van het bericht te vinden. ";
+App::$strings["Empty post discarded."] = "Leeg bericht geannuleerd";
+App::$strings["Executable content type not permitted to this channel."] = "Uitvoerbare bestanden zijn niet toegestaan op dit kanaal.";
+App::$strings["Duplicate post suppressed."] = "Dubbel bericht tegengehouden.";
+App::$strings["System error. Post not saved."] = "Systeemfout. Bericht niet opgeslagen.";
+App::$strings["Unable to obtain post information from database."] = "Niet in staat om informatie over dit bericht uit de database te verkrijgen.";
+App::$strings["You have reached your limit of %1$.0f top level posts."] = "Je hebt jouw limiet van %1$.0f berichten bereikt.";
+App::$strings["You have reached your limit of %1$.0f webpages."] = "Je hebt jouw limiet van %1$.0f webpagina's bereikt.";
App::$strings["This setting requires special processing and editing has been blocked."] = "Deze instelling vereist een speciaal proces en bewerken is geblokkeerd.";
App::$strings["Configuration Editor"] = "Configuratiebewerker";
App::$strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. ";
+App::$strings["Items tagged with: %s"] = "Items getagd met %s";
+App::$strings["Search results for: %s"] = "Zoekresultaten voor %s";
+App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
+App::$strings["Visible to:"] = "Zichtbaar voor:";
+App::$strings["__ctx:acl__ Profile"] = "Profiel";
App::$strings["Blocks"] = "Blokken";
App::$strings["Block Title"] = "Bloktitel";
App::$strings["Layouts"] = "Lay-outs";
@@ -1052,6 +1010,10 @@ App::$strings["Website:"] = "Website:";
App::$strings["Remote Channel [%s] (not yet known on this site)"] = "Kanaal op afstand [%s] (nog niet op deze hub bekend)";
App::$strings["Rating (this information is public)"] = "Beoordeling (deze informatie is openbaar)";
App::$strings["Optionally explain your rating (this information is public)"] = "Verklaar jouw beoordeling (niet verplicht, deze informatie is openbaar)";
+App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven.";
+App::$strings["Use Photo for Profile"] = "Als profielfoto gebruiken";
+App::$strings["Upload Profile Photo"] = "Profielfoto uploaden";
+App::$strings["Use"] = "Gebruiken";
App::$strings["Like/Dislike"] = "Leuk/niet leuk";
App::$strings["This action is restricted to members."] = "Deze actie kan alleen door \$Projectname-leden worden uitgevoerd.";
App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Je dient <a href=\"rmagic\">in te loggen met je \$Projectname-account</a> of <a href=\"register\">een nieuw \$Projectname-account aan te maken</a> om verder te kunnen gaan.";
@@ -1062,7 +1024,6 @@ App::$strings["Channel unavailable."] = "Kanaal niet beschikbaar.";
App::$strings["Previous action reversed."] = "Vorige actie omgedraaid";
App::$strings["photo"] = "foto";
App::$strings["status"] = "bericht";
-App::$strings["event"] = "gebeurtenis";
App::$strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
App::$strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
App::$strings["%1\$s agrees with %2\$s's %3\$s"] = "%1\$s is het eens met %2\$s's %3\$s";
@@ -1073,33 +1034,14 @@ App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s is niet aanwezig
App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s is mogelijk aanwezig op %2\$s's %3\$s";
App::$strings["Action completed."] = "Actie voltooid";
App::$strings["Thank you."] = "Bedankt";
-App::$strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Vernieuw de pagina met shift+R of shift+F5, of leeg je browserbuffer, wanneer de nieuwe foto niet meteen wordt weergegeven.";
-App::$strings["Use Photo for Profile"] = "Als profielfoto gebruiken";
-App::$strings["Upload Profile Photo"] = "Profielfoto uploaden";
-App::$strings["Use"] = "Gebruiken";
-App::$strings["Items tagged with: %s"] = "Items getagd met %s";
-App::$strings["Search results for: %s"] = "Zoekresultaten voor %s";
App::$strings["No channel."] = "Geen kanaal.";
App::$strings["Common connections"] = "Veel voorkomende connecties";
App::$strings["No connections in common."] = "Geen gemeenschappelijke connecties.";
-App::$strings["Authorize application connection"] = "Geef toestemming voor applicatiekoppeling";
-App::$strings["Return to your app and insert this Security Code:"] = "Ga terug naar je app en voeg deze beveiligingscode in:";
-App::$strings["Please login to continue."] = "Inloggen om verder te kunnen gaan.";
-App::$strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Wil je deze applicatie toestemming geven om jouw berichten en connecties te zien, en/of nieuwe berichten voor jou te plaatsen?";
-App::$strings["sent you a private message"] = "stuurde jou een privébericht";
-App::$strings["added your channel"] = "voegde jouw kanaal toe";
-App::$strings["g A l F d"] = "G:i, l d F";
-App::$strings["[today]"] = "[vandaag]";
-App::$strings["posted an event"] = "plaatste een gebeurtenis";
-App::$strings["About this site"] = "Over deze hub";
-App::$strings["Site Name"] = "Hubnaam";
-App::$strings["Administrator"] = "Beheerder";
-App::$strings["Software and Project information"] = "Software- en projectinformatie";
-App::$strings["This site is powered by \$Projectname"] = "Dit is een \$Projectname-hub";
-App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Federatieve en gedecentraliseerde netwerk- en identiteitsdiensten, mogelijk gemaakt door Zot";
-App::$strings["Version %s"] = "Versie %s";
-App::$strings["Project homepage"] = "Projectwebsite";
-App::$strings["Developer homepage"] = "Ontwikkelaarswebsite";
+App::$strings["toggle full screen mode"] = "Volledig scherm";
+App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s";
+App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s niet meer";
+App::$strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
+App::$strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende permissies. Doorgestuurd naar profielpagina.";
App::$strings["No valid account found."] = "Geen geldige account gevonden.";
App::$strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
App::$strings["Site Member (%s)"] = "Lid van hub (%s)";
@@ -1120,11 +1062,10 @@ App::$strings["Select a bookmark folder"] = "Kies een bladwijzermap";
App::$strings["Save Bookmark"] = "Bladwijzer opslaan";
App::$strings["URL of bookmark"] = "URL van bladwijzer";
App::$strings["Or enter new bookmark folder name"] = "Of geef de naam op van een nieuwe bladwijzermap";
-App::$strings["This directory server requires an access token"] = "Deze kanalengidshub (directoryserver) heeft een toegangs-token nodig";
-App::$strings["Authentication failed."] = "Authenticatie mislukt.";
-App::$strings["Remote Authentication"] = "Authenticatie op afstand";
-App::$strings["Enter your channel address (e.g. channel@example.com)"] = "Vul jouw kanaaladres in (bijv. channel@example.com)";
-App::$strings["Authenticate"] = "Authenticeren";
+App::$strings["Channel added."] = "Kanaal toegevoegd.";
+App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
+App::$strings["Mood"] = "Stemming";
+App::$strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
App::$strings["Please login."] = "Inloggen.";
App::$strings["Account removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een account is niet toegestaan binnen 48 uur nadat het wachtwoord is veranderd.";
App::$strings["Remove This Account"] = "Verwijder dit account";
@@ -1141,56 +1082,42 @@ App::$strings["Edit System Page Description"] = "Systeempagina's bewerken";
App::$strings["Layout not found."] = "Lay-out niet gevonden.";
App::$strings["Module Name:"] = "Modulenaam:";
App::$strings["Layout Help"] = "Lay-out-hulp";
-App::$strings["Export Channel"] = "Kanaal exporteren";
-App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exporteer de basisinformatie van jouw kanaal naar een bestand. Dit fungeert als een back-up van jouw connecties, permissies, profiel en basisgegevens, die gebruikt kan worden om op een nieuwe hub jouw gegevens te importeren. Deze back-up bevat echter niet de inhoud van jouw kanaal.";
-App::$strings["Export Content"] = "Inhoud exporteren";
-App::$strings["Export your channel information and recent content to a JSON backup that can be restored or imported to another server hub. This backs up all of your connections, permissions, profile data and several months of posts. This file may be VERY large. Please be patient - it may take several minutes for this download to begin."] = "Exporteer informatie en recente inhoud van jouw kanaal naar een JSON-back-up, wat kan worden gebruikt om jouw kanaal te herstellen of te importeren op een andere hub. Dit slaat al jouw connecties, permissies, profielgegevens en enkele maanden aan inhoud van jouw kanaal op. Dit bestand kan ZEER groot worden. Wees geduldig - het kan enkele minuten duren voordat de download begint.";
-App::$strings["Export your posts from a given year."] = "Exporteer jouw berichten uit een bepaald jaar.";
-App::$strings["You may also export your posts and conversations for a particular year or month. Adjust the date in your browser location bar to select other dates. If the export fails (possibly due to memory exhaustion on your server hub), please try again selecting a more limited date range."] = "Je kan ook berichten en conversaties uit een bepaald jaar of van een bepaalde maand exporteren. Verander de datum in de adresbalk van jouw webbrowser om andere jaren en maanden te selecteren. Wanneer het exporteren mislukt (waarschijnlijk door een gebrek aan beschikbaar servergeheugen), probeer het dan nogmaals met een beperkter tijdvak.";
-App::$strings["To select all posts for a given year, such as this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld dit jaar te selecteren. ";
-App::$strings["To select all posts for a given month, such as January of this year, visit <a href=\"%1\$s\">%2\$s</a>"] = "Bezoek <a href=\"%1\$s\">%2\$s</a> om alle berichten van bijvoorbeeld januari dit jaar te selecteren.";
-App::$strings["These content files may be imported or restored by visiting <a href=\"%1\$s\">%2\$s</a> on any site containing your channel. For best results please import or restore these in date order (oldest first)."] = "Deze back-up-bestanden kunnen geïmporteerd of hersteld worden door op jouw hub en met jouw kanaal <a href=\"%1\$s\">%2\$s</a> te bezoeken. Voor het beste resultaat kan je de bestanden in chronologische volgorde importeren of herstellen.";
-App::$strings["Permissions denied."] = "Permissies niet toegestaan";
-App::$strings["l, F j"] = "l j F";
-App::$strings["Link to Source"] = "Originele locatie";
-App::$strings["Edit Event"] = "Gebeurtenis bewerken";
-App::$strings["Create Event"] = "Gebeurtenis aanmaken";
-App::$strings["Export"] = "Exporteren";
-App::$strings["Import"] = "Importeren";
-App::$strings["Today"] = "Vandaag";
-App::$strings["# Accounts"] = "# accounts";
-App::$strings["# blocked accounts"] = "# geblokkeerde accounts";
-App::$strings["# expired accounts"] = "# verlopen accounts";
-App::$strings["# expiring accounts"] = "# accounts die nog moeten verlopen";
-App::$strings["# Channels"] = "# Kanalen";
-App::$strings["# primary"] = "# primair";
-App::$strings["# clones"] = "# klonen";
-App::$strings["Message queues"] = "Berichtenwachtrij";
-App::$strings["Your software should be updated"] = "Jouw software moet worden bijgewerkt ";
-App::$strings["Summary"] = "Samenvatting";
-App::$strings["Registered accounts"] = "Geregistreerde accounts";
-App::$strings["Pending registrations"] = "Accounts die op goedkeuring wachten";
-App::$strings["Registered channels"] = "Geregistreerde kanalen";
-App::$strings["Active plugins"] = "Ingeschakelde plugins";
-App::$strings["Version"] = "Versie";
-App::$strings["Repository version (master)"] = "Versie repository (master)";
-App::$strings["Repository version (dev)"] = "Versie repository (dev)";
-App::$strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
-App::$strings["Visible to:"] = "Zichtbaar voor:";
+App::$strings["%d rating"] = array(
+ 0 => "%d beoordeling",
+ 1 => "%d beoordelingen",
+);
+App::$strings["Gender: "] = "Geslacht:";
+App::$strings["Status: "] = "Status: ";
+App::$strings["Homepage: "] = "Homepage: ";
+App::$strings["Age:"] = "Leeftijd:";
+App::$strings["Location:"] = "Plaats:";
+App::$strings["Description:"] = "Omschrijving:";
+App::$strings["Hometown:"] = "Oorspronkelijk uit:";
+App::$strings["About:"] = "Over:";
+App::$strings["Connect"] = "Verbinden";
+App::$strings["Public Forum:"] = "Openbaar forum:";
+App::$strings["Keywords: "] = "Trefwoorden: ";
+App::$strings["Don't suggest"] = "Niet voorstellen";
+App::$strings["Common connections:"] = "Gemeenschappelijke connecties:";
+App::$strings["Global Directory"] = "Volledige kanalengids";
+App::$strings["Local Directory"] = "Lokale kanalengids";
+App::$strings["Finding:"] = "Gezocht naar:";
+App::$strings["Channel Suggestions"] = "Voorgestelde kanalen";
+App::$strings["next page"] = "volgende pagina";
+App::$strings["previous page"] = "vorige pagina";
+App::$strings["Sort options"] = "Sorteeropties";
+App::$strings["Alphabetic"] = "Alfabetisch";
+App::$strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
+App::$strings["Newest to Oldest"] = "Nieuw naar oud";
+App::$strings["Oldest to Newest"] = "Oud naar nieuw";
+App::$strings["No entries (some entries may be hidden)."] = "Niets gevonden (sommige kanalen kunnen verborgen zijn).";
+App::$strings["vcard"] = "vcard";
+App::$strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
+App::$strings["Post successful."] = "Verzenden bericht geslaagd.";
+App::$strings["Source of Item"] = "Bron van item";
App::$strings["No service class restrictions found."] = "Geen abonnementsbeperkingen gevonden.";
-App::$strings["Import Webpage Elements"] = "Webpagina-elementen importeren";
-App::$strings["Import selected"] = "Importbestand geselecteerd";
-App::$strings["Export Webpage Elements"] = "Webpagina-elementen exporteren";
-App::$strings["Export selected"] = "Selectie exporteren";
-App::$strings["Webpages"] = "Webpagina's";
-App::$strings["Actions"] = "Acties";
-App::$strings["Page Link"] = "Paginalink";
-App::$strings["Page Title"] = "Paginatitel";
-App::$strings["Invalid file type."] = "Ongeldig bestandsformaat";
-App::$strings["Error opening zip file"] = "Fout tijdens openen zipbestand";
-App::$strings["Invalid folder path."] = "Ongeldige maplocatie";
-App::$strings["No webpage elements detected."] = "Geen webpagina-elementen gedecteerd";
-App::$strings["Import complete."] = "Importeren voltooid.";
+App::$strings["network"] = "netwerk";
+App::$strings["RSS"] = "RSS";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Het verwijderen van een kanaal is niet toegestaan binnen 48 uur nadat het wachtwoord van het account is veranderd.";
App::$strings["Remove This Channel"] = "Verwijder dit kanaal";
App::$strings["This channel will be completely removed from the network. "] = "Dit kanaal wordt volledig uit het \$Projectname-netwerk verwijderd.";
@@ -1201,36 +1128,9 @@ App::$strings["Files: shared with me"] = "Bestanden: met mij gedeeld";
App::$strings["NEW"] = "NIEUW";
App::$strings["Remove all files"] = "Verwijder alle bestanden";
App::$strings["Remove this file"] = "Verwijder dit bestand";
-App::$strings["Not found"] = "Niet gevonden";
-App::$strings["Invalid channel"] = "Onbekend kanaal";
-App::$strings["Error retrieving wiki"] = "Fout tijdens ophalen wiki";
-App::$strings["Error creating zip file export folder"] = "Fout tijdens aanmaken exportmap zipbestand";
-App::$strings["Error downloading wiki: "] = "Fout tijdens downloaden wiki: ";
-App::$strings["Wikis"] = "Wiki's";
-App::$strings["Download"] = "Download";
-App::$strings["Wiki name"] = "Naam wiki";
-App::$strings["Content type"] = "Opmaaktype";
-App::$strings["Create a status post for this wiki"] = "Plaats een bericht over deze wiki";
-App::$strings["Wiki not found"] = "Wiki is niet gevonden";
-App::$strings["Rename page"] = "Pagina hernoemen";
-App::$strings["Error retrieving page content"] = "Fout tijdens ophalen inhoud pagina";
-App::$strings["Revision Comparison"] = "Revisies vergelijken";
-App::$strings["Revert"] = "Ongedaan maken";
-App::$strings["Source"] = "Bron";
-App::$strings["New page name"] = "Nieuwe paginanaam";
-App::$strings["Embed image from photo albums"] = "Afbeelding uit een fotoalbum invoegen";
-App::$strings["Embed an image from your albums"] = "Afbeelding uit jouw albums invoegen";
-App::$strings["OK"] = "OK";
-App::$strings["Choose images to embed"] = "Kies afbeeldingen om in te voegen";
-App::$strings["Choose an album"] = "Kies een album";
-App::$strings["Choose a different album"] = "Kies een ander album";
-App::$strings["Error getting album list"] = "Fout tijdens ophalen albumlijst";
-App::$strings["Error getting photo link"] = "Fout tijdens ophalen fotolink";
-App::$strings["Error getting album"] = "Fout tijdens ophalen album";
-App::$strings["Error creating wiki. Invalid name."] = "Fout tijdens aanmaken wiki. Ongeldige naam.";
-App::$strings["Wiki created, but error creating Home page."] = "Wiki aangemaakt, maar fout tijdens aanmaken homepagina.";
-App::$strings["Error creating wiki"] = "Fout tijdens aanmaken wiki.";
-App::$strings["New page created"] = "Nieuwe pagina aangemaakt";
+App::$strings["post"] = "bericht";
+App::$strings["comment"] = "reactie";
+App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s heeft het %3\$s van %2\$s getagd met %4\$s";
App::$strings["Failed to create source. No channel selected."] = "Aanmaken bron mislukt. Geen kanaal geselecteerd.";
App::$strings["Source created."] = "Bron aangemaakt.";
App::$strings["Source updated."] = "Bron aangemaakt.";
@@ -1243,19 +1143,82 @@ App::$strings["Only import content with these words (one per line)"] = "Importee
App::$strings["Leave blank to import all public content"] = "Laat leeg om alle openbare inhoud te importeren";
App::$strings["Channel Name"] = "Kanaalnaam";
App::$strings["Add the following categories to posts imported from this source (comma separated)"] = "De volgende categorieën aan berichten toevoegen die uit deze bron zijn geïmporteerd (door komma's gescheiden)";
-App::$strings["Optional"] = "Optioneel";
+App::$strings["Optional"] = "Niet verplicht";
App::$strings["Source not found."] = "Bron niet gevonden";
App::$strings["Edit Source"] = "Bron bewerken";
App::$strings["Delete Source"] = "Bron verwijderen";
App::$strings["Source removed"] = "Bron verwijderd";
App::$strings["Unable to remove source."] = "Verwijderen bron mislukt.";
-App::$strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s";
-App::$strings["%1\$s stopped following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s niet meer";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer.";
App::$strings["Ignore/Hide"] = "Negeren/Verbergen";
-App::$strings["post"] = "bericht";
-App::$strings["comment"] = "reactie";
-App::$strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s heeft het %3\$s van %2\$s getagd met %4\$s";
+App::$strings["Profile not found."] = "Profiel niet gevonden.";
+App::$strings["Profile deleted."] = "Profiel verwijderd.";
+App::$strings["Profile-"] = "Profiel-";
+App::$strings["New profile created."] = "Nieuw profiel aangemaakt.";
+App::$strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen";
+App::$strings["Profile unavailable to export."] = "Geen profiel beschikbaar om te exporteren";
+App::$strings["Profile Name is required."] = "Profielnaam is vereist";
+App::$strings["Marital Status"] = "Huwelijke status";
+App::$strings["Romantic Partner"] = "Romantische partner";
+App::$strings["Likes"] = "Houdt van";
+App::$strings["Dislikes"] = "Houdt niet van";
+App::$strings["Work/Employment"] = "Werk/arbeid";
+App::$strings["Religion"] = "Religie";
+App::$strings["Political Views"] = "Politieke overtuigingen";
+App::$strings["Gender"] = "Geslacht";
+App::$strings["Sexual Preference"] = "Seksuele voorkeur";
+App::$strings["Homepage"] = "Homepage";
+App::$strings["Interests"] = "Interesses";
+App::$strings["Profile updated."] = "Profiel bijgewerkt";
+App::$strings["Hide your connections list from viewers of this profile"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
+App::$strings["Edit Profile Details"] = "Profiel bewerken";
+App::$strings["View this profile"] = "Profiel weergeven";
+App::$strings["Edit visibility"] = "Zichtbaarheid bewerken";
+App::$strings["Profile Tools"] = "Hulpmiddelen";
+App::$strings["Change cover photo"] = "Omslagfoto wijzigen";
+App::$strings["Change profile photo"] = "Profielfoto veranderen";
+App::$strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
+App::$strings["Clone this profile"] = "Dit profiel klonen";
+App::$strings["Delete this profile"] = "Dit profiel verwijderen";
+App::$strings["Add profile things"] = "Dingen aan je profiel toevoegen";
+App::$strings["Personal"] = "Persoonlijk";
+App::$strings["Relation"] = "Relatie";
+App::$strings["Miscellaneous"] = "Diversen";
+App::$strings["Import profile from file"] = "Profiel vanuit bestand importeren";
+App::$strings["Export profile to file"] = "Profiel naar bestand exporteren";
+App::$strings["Your gender"] = "Jouw geslacht";
+App::$strings["Marital status"] = "Burgerlijke staat";
+App::$strings["Sexual preference"] = "Seksuele voorkeur";
+App::$strings["Profile name"] = "Profielnaam";
+App::$strings["This is your default profile."] = "Dit is jouw standaardprofiel";
+App::$strings["Your full name"] = "Jouw volledige naam";
+App::$strings["Title/Description"] = "Titel/omschrijving";
+App::$strings["Street address"] = "Straat en huisnummer";
+App::$strings["Locality/City"] = "Woonplaats";
+App::$strings["Region/State"] = "Provincie/gewest/deelstaat";
+App::$strings["Postal/Zip code"] = "Postcode";
+App::$strings["Who (if applicable)"] = "Wie (wanneer van toepassing)";
+App::$strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: petra123, Petra Jansen, petra@voorbeeld.nl";
+App::$strings["Since (date)"] = "Sinds (datum)";
+App::$strings["Tell us about yourself"] = "Vertel ons iets over jezelf";
+App::$strings["Homepage URL"] = "URL homepagina";
+App::$strings["Hometown"] = "Oorspronkelijk uit";
+App::$strings["Political views"] = "Politieke overtuigingen";
+App::$strings["Religious views"] = "Religieuze overtuigingen";
+App::$strings["Keywords used in directory listings"] = "Trefwoorden voor in de kanalengids";
+App::$strings["Example: fishing photography software"] = "Voorbeeld: muziek, fotografie, software";
+App::$strings["Musical interests"] = "Muzikale interesses";
+App::$strings["Books, literature"] = "Boeken/literatuur";
+App::$strings["Television"] = "Televisie";
+App::$strings["Film/Dance/Culture/Entertainment"] = "Film/dans/cultuur/entertainment";
+App::$strings["Hobbies/Interests"] = "Hobby's/interesses";
+App::$strings["Love/Romance"] = "Liefde/romantiek";
+App::$strings["School/Education"] = "School/opleiding";
+App::$strings["Contact information and social networks"] = "Contactinformatie en sociale netwerken";
+App::$strings["My other channels"] = "Mijn andere kanalen";
+App::$strings["Communications"] = "Communicatie";
+App::$strings["Profile Image"] = "Profielfoto";
+App::$strings["Edit Profiles"] = "Bewerk profielen";
App::$strings["Additional Features"] = "Extra functies";
App::$strings["Name is required"] = "Naam is vereist";
App::$strings["Key and Secret are required"] = "Key en secret zijn vereist";
@@ -1272,15 +1235,6 @@ App::$strings["Connected Apps"] = "Verbonden applicaties";
App::$strings["Client key starts with"] = "Client key begint met";
App::$strings["No name"] = "Geen naam";
App::$strings["Remove authorization"] = "Autorisatie verwijderen";
-App::$strings["This channel is limited to %d tokens"] = "Dit kanaal heeft een limiet van %d tokens";
-App::$strings["Name and Password are required."] = "Naam en wachtwoord zijn vereist";
-App::$strings["Token saved."] = "Token opgeslagen.";
-App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud.";
-App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:";
-App::$strings["Guest Access Tokens"] = "Gasttoegang";
-App::$strings["Login Name"] = "Inlognaam";
-App::$strings["Login Password"] = "Wachtwoord:";
-App::$strings["Expires (yyyy-mm-dd)"] = "Geldig t/m (yyyy-mm-dd)";
App::$strings["Not valid email."] = "Geen geldig e-mailadres.";
App::$strings["Protected email address. Cannot change to that email."] = "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken.";
App::$strings["System failure storing new email. Please try again."] = "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer.";
@@ -1343,6 +1297,7 @@ App::$strings["May reduce spam activity"] = "Kan eventuele spam verminderen";
App::$strings["Default Access Control List (ACL)"] = "Standaard permissies voor nieuwe berichten";
App::$strings["Use my default audience setting for the type of object published"] = "Gebruik mijn standaard privacy-instelling voor dit type publicatie";
App::$strings["Channel permissions category:"] = "Kanaaltype en -permissies:";
+App::$strings["Default Permissions Group"] = "Standaard permissiegroep";
App::$strings["Maximum private messages per day from unknown people:"] = "Maximum aantal privé-berichten per dag van onbekende personen:";
App::$strings["Useful to reduce spamming"] = "Kan eventuele spam verminderen";
App::$strings["Notification Settings"] = "Notificatie-instellingen";
@@ -1387,6 +1342,25 @@ App::$strings["Personal menu to display in your channel pages"] = "Persoonlijk m
App::$strings["Remove this channel."] = "Verwijder dit kanaal.";
App::$strings["Firefox Share \$Projectname provider"] = "\$Projectname-service voor Firefox Share";
App::$strings["Start calendar week on monday"] = "Begin in de agenda de week op maandag";
+App::$strings["Affinity Slider settings updated."] = "Affiniteitsinstellingen bijgewerkt.";
+App::$strings["No feature settings configured"] = "Geen plugin-instellingen aanwezig";
+App::$strings["Default maximum affinity level"] = "Standaard hoogste affiniteitsniveau";
+App::$strings["Default minimum affinity level"] = "Standaard laagste affiniteitsniveau";
+App::$strings["Affinity Slider Settings"] = "Affiniteitsinstellingen";
+App::$strings["Feature/Addon Settings"] = "Plugin-instellingen";
+App::$strings["Permission category saved."] = "Permissiegroep opgeslagen.";
+App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Gebruik dit formulier om permissieregels voor diverse soorten mensen en connecties aan te maken.";
+App::$strings["Permission Categories"] = "Permissiegroepen";
+App::$strings["Permission Name"] = "Permissienaam";
+App::$strings["This channel is limited to %d tokens"] = "Dit kanaal heeft een limiet van %d tokens";
+App::$strings["Name and Password are required."] = "Naam en wachtwoord zijn vereist";
+App::$strings["Token saved."] = "Token opgeslagen.";
+App::$strings["Use this form to create temporary access identifiers to share things with non-members. These identities may be used in Access Control Lists and visitors may login using these credentials to access private content."] = "Gebruik dit formulier om tijdelijke identiteiten aan te maken, waarmee je bepaalde informatie met niet-leden kan delen. Deze identiteiten kunnen onder Permissies (handmatige selectie) worden gebruikt. Gasten kunnen inloggen met onderstaande gegevens om zo toegang te krijgen tot privéinhoud.";
+App::$strings["You may also provide <em>dropbox</em> style access links to friends and associates by adding the Login Password to any specific site URL as shown. Examples:"] = "Je kan ook <em>dropbox</em>-achtige links aan mensen geven door bovenstaand wachtwoord op onderstaande manier aan een hub-URL toe te voegen. Voorbeelden:";
+App::$strings["Guest Access Tokens"] = "Gasttoegang";
+App::$strings["Login Name"] = "Inlognaam";
+App::$strings["Login Password"] = "Wachtwoord:";
+App::$strings["Expires (yyyy-mm-dd)"] = "Geldig t/m (yyyy-mm-dd)";
App::$strings["No special theme for mobile devices"] = "Geen speciaal thema voor mobiele apparaten";
App::$strings["%s - (Experimental)"] = "%s - (experimenteel)";
App::$strings["Display Settings"] = "Weergave-instellingen";
@@ -1405,7 +1379,7 @@ App::$strings["Maximum number of conversations to load at any time:"] = "Maximaa
App::$strings["Maximum of 100 items"] = "Maximaal 100 conversaties";
App::$strings["Show emoticons (smilies) as images"] = "Toon emoticons (smilies) als afbeeldingen";
App::$strings["Manual conversation updates"] = "Handmatige conversatie-updates";
-App::$strings["Default is automatic, which may increase screen jumping"] = "Standaard is automatisch, maar soms kan het zorgen voor het verspringen van items";
+App::$strings["Default is on, turning this off may increase screen jumping"] = "Dit is standaard ingeschakeld en door dit uit te schakelen kunnen items soms verspringen.";
App::$strings["Link post titles to source"] = "Berichtkoppen naar originele locatie linken";
App::$strings["System Page Layout Editor - (advanced)"] = "Lay-out bewerken van systeempagina's (geavanceerd)";
App::$strings["Use blog/list mode on channel page"] = "Gebruik blog/lijst-modus op kanaalpagina";
@@ -1414,8 +1388,6 @@ App::$strings["Use blog/list mode on grid page"] = "Gebruik blog/lijst-modus op
App::$strings["Channel page max height of content (in pixels)"] = "Maximale hoogte berichtinhoud op kanaalpagina (in pixels)";
App::$strings["click to expand content exceeding this height"] = "klik om inhoud uit te klappen die deze hoogte overschrijdt";
App::$strings["Grid page max height of content (in pixels)"] = "Maximale hoogte berichtinhoud op gridpagina (in pixels)";
-App::$strings["No feature settings configured"] = "Geen plugin-instellingen aanwezig";
-App::$strings["Feature/Addon Settings"] = "Plugin-instellingen";
App::$strings["Tag removed"] = "Tag verwijderd";
App::$strings["Remove Item Tag"] = "Verwijder item-tag";
App::$strings["Select a tag to remove: "] = "Kies een tag om te verwijderen";
@@ -1430,28 +1402,135 @@ App::$strings["Select a profile"] = "Kies een profiel";
App::$strings["Post an activity"] = "Plaats een bericht";
App::$strings["Only sends to viewers of the applicable profile"] = "Toont dit alleen aan diegene die het gekozen profiel mogen zien.";
App::$strings["Name of thing e.g. something"] = "Naam van ding";
-App::$strings["URL of thing (optional)"] = "URL van ding (optioneel)";
-App::$strings["URL for photo of thing (optional)"] = "URL voor foto van ding (optioneel)";
+App::$strings["URL of thing (optional)"] = "URL van ding (niet verplicht)";
+App::$strings["URL for photo of thing (optional)"] = "URL voor foto van ding (niet verplicht)";
App::$strings["Add Thing to your Profile"] = "Ding aan je profiel toevoegen";
-App::$strings["Your service plan only allows %d channels."] = "Jouw abonnement staat maar %d kanalen toe.";
-App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
-App::$strings["No channel. Import failed."] = "Geen kanaal. Importeren mislukt.";
-App::$strings["Import completed."] = "Import voltooid.";
-App::$strings["You must be logged in to use this feature."] = "Je moet ingelogd zijn om dit onderdeel te kunnen gebruiken.";
-App::$strings["Import Channel"] = "Kanaal importeren";
-App::$strings["Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file."] = "Gebruik dit formulier om een bestaand kanaal te importeren van een andere hub. Je kan de kanaal-identiteit van de oude hub via het netwerk ontvangen of een exportbestand verstrekken.";
-App::$strings["Or provide the old server/hub details"] = "Of vul de gegevens van de oude hub in";
-App::$strings["Your old identity address (xyz@example.com)"] = "Jouw oude kanaaladres (xyz@example.com)";
-App::$strings["Your old login email address"] = "Het e-mailadres van je oude account";
-App::$strings["Your old login password"] = "Wachtwoord van jouw oude account";
-App::$strings["For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media."] = "Voor elke optie geldt dat je moet kiezen of je jouw primaire kanaaladres op deze hub wil instellen of dat jouw oude hub deze rol blijft vervullen.";
-App::$strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
-App::$strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
-App::$strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
+App::$strings["\$Projectname Server - Setup"] = "\$Projectname Hub - Setup";
+App::$strings["Could not connect to database."] = "Could not connect to database.";
+App::$strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Could not connect to specified hub URL. Possible SSL certificate or DNS issue.";
+App::$strings["Could not create table."] = "Could not create table.";
+App::$strings["Your site database has been installed."] = "Your hub database has been installed.";
+App::$strings["You may need to import the file \"install/schema_xxx.sql\" manually using a database client."] = "You may need to import the file \"install/schema_xxx.sql\" manually using a database client.";
+App::$strings["Please see the file \"install/INSTALL.txt\"."] = "Please see the file \"install/INSTALL.txt\".";
+App::$strings["System check"] = "System check";
+App::$strings["Check again"] = "Check again";
+App::$strings["Database connection"] = "Database connection";
+App::$strings["In order to install \$Projectname we need to know how to connect to your database."] = "In order to install \$Projectname we need to know how to connect to your database.";
+App::$strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Please contact your hosting provider or server administrator if you have questions about these settings.";
+App::$strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "The database you specify below should already exist. If it does not, please create it before continuing.";
+App::$strings["Database Server Name"] = "Database Server Name";
+App::$strings["Default is 127.0.0.1"] = "Default is 127.0.0.1";
+App::$strings["Database Port"] = "Database Port";
+App::$strings["Communication port number - use 0 for default"] = "Communication port number - use 0 for default";
+App::$strings["Database Login Name"] = "Database Login Name";
+App::$strings["Database Login Password"] = "Database Login Password";
+App::$strings["Database Name"] = "Database Name";
+App::$strings["Database Type"] = "Database Type";
+App::$strings["Site administrator email address"] = "Hub administrator email address";
+App::$strings["Your account email address must match this in order to use the web admin panel."] = "Your account email address must match this in order to use the web admin panel.";
+App::$strings["Website URL"] = "Hub URL";
+App::$strings["Please use SSL (https) URL if available."] = "Please use SSL (https) URL if available.";
+App::$strings["Please select a default timezone for your website"] = "Please select a default timezone for your hub";
+App::$strings["Site settings"] = "Hub settings";
+App::$strings["PHP version 5.5 or greater is required."] = "PHP version 5.5 or greater is required.";
+App::$strings["PHP version"] = "PHP version";
+App::$strings["Could not find a command line version of PHP in the web server PATH."] = "Could not find a command line version of PHP in the web server PATH.";
+App::$strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron."] = "If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron.";
+App::$strings["PHP executable path"] = "PHP executable path";
+App::$strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Enter full path to php executable. You can leave this blank to continue the installation.";
+App::$strings["Command line PHP"] = "Command line PHP";
+App::$strings["Unable to check command line PHP, as shell_exec() is disabled. This is required."] = "Unable to check command line PHP, as shell_exec() is disabled. This is required.";
+App::$strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "The command line version of PHP on your system does not have \"register_argc_argv\" enabled.";
+App::$strings["This is required for message delivery to work."] = "This is required for message delivery to work.";
+App::$strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+App::$strings["Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once."] = "Your max allowed total upload size is set to %s. Maximum size of one file to upload is set to %s. You are allowed to upload up to %d files at once.";
+App::$strings["You can adjust these settings in the server php.ini file."] = "You can adjust these settings in the server php.ini file.";
+App::$strings["PHP upload limits"] = "PHP upload limits";
+App::$strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys";
+App::$strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\".";
+App::$strings["Generate encryption keys"] = "Generate encryption keys";
+App::$strings["libCurl PHP module"] = "libCurl PHP module";
+App::$strings["GD graphics PHP module"] = "GD graphics PHP module";
+App::$strings["OpenSSL PHP module"] = "OpenSSL PHP module";
+App::$strings["PDO database PHP module"] = "PDO database PHP module";
+App::$strings["mb_string PHP module"] = "mb_string PHP module";
+App::$strings["xml PHP module"] = "xml PHP module";
+App::$strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
+App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: Apache webserver mod-rewrite module is required but not installed.";
+App::$strings["exec"] = "exec";
+App::$strings["Error: exec is required but is either not installed or has been disabled in php.ini"] = "Error: exec is required but is either not installed or has been disabled in php.ini";
+App::$strings["shell_exec"] = "shell_exec";
+App::$strings["Error: shell_exec is required but is either not installed or has been disabled in php.ini"] = "Error: shell_exec is required but is either not installed or has been disabled in php.ini";
+App::$strings["Error: libCURL PHP module required but not installed."] = "Error: libCURL PHP module required but not installed.";
+App::$strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: GD graphics PHP module with JPEG support required but not installed.";
+App::$strings["Error: openssl PHP module required but not installed."] = "Error: openssl PHP module required but not installed.";
+App::$strings["Error: PDO database PHP module required but not installed."] = "Error: PDO database PHP module required but not installed.";
+App::$strings["Error: mb_string PHP module required but not installed."] = "Error: mb_string PHP module required but not installed.";
+App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: xml PHP module required for DAV but not installed.";
+App::$strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so.";
+App::$strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can.";
+App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder.";
+App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions.";
+App::$strings[".htconfig.php is writable"] = ".htconfig.php is writable";
+App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.";
+App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder.";
+App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.";
+App::$strings["Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains."] = "Note: as a security measure, you should give the web server write access to %s only--not the template files (.tpl) that it contains.";
+App::$strings["%s is writable"] = "%s is writable";
+App::$strings["This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder"] = "This software uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the top level web folder";
+App::$strings["store is writable"] = "store is writable";
+App::$strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL certificate cannot be validated. Fix certificate or disable https access to this hub.";
+App::$strings["If you have https access to your website or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!"] = "If you have https access to your hub or allow connections to TCP port 443 (the https: port), you MUST use a browser-valid certificate. You MUST NOT use self-signed certificates!";
+App::$strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "This restriction is incorporated because public posts from you may for example contain references to images on your own hub.";
+App::$strings["If your certificate is not recognized, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "If your certificate is not recognized, members of other hubs (who may themselves have valid certificates) will get a warning message on their own hub complaining about security issues.";
+App::$strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "This can cause usability issues elsewhere (not just on your own hub) so we must insist on this requirement.";
+App::$strings["Providers are available that issue free certificates which are browser-valid."] = "Providers are available that issue free certificates which are browser-valid.";
+App::$strings["If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications."] = "If you are confident that the certificate is valid and signed by a trusted authority, check to see if you have failed to install an intermediate cert. These are not normally required by browsers, but are required for server-to-server communications.";
+App::$strings["SSL certificate validation"] = "SSL certificate validation";
+App::$strings["Url rewrite in .htaccess is not working. Check your server configuration.Test: "] = "Url rewrite in .htaccess is not working. Check your server configuration.Test: ";
+App::$strings["Url rewrite is working"] = "Url rewrite is working";
+App::$strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root.";
+App::$strings["Errors encountered creating database tables."] = "Errors encountered creating database tables.";
+App::$strings["<h1>What next</h1>"] = "<h1>What next</h1>";
+App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT: You will need to [manually] setup a scheduled task for the poller.";
App::$strings["No connections."] = "Geen connecties.";
App::$strings["Visit %s's profile [%s]"] = "Bezoek het profiel van %s [%s]";
App::$strings["View Connections"] = "Connecties weergeven";
-App::$strings["Source of Item"] = "Bron van item";
+App::$strings["Profile Unavailable."] = "Profiel niet beschikbaar.";
+App::$strings["Not found"] = "Niet gevonden";
+App::$strings["Invalid channel"] = "Onbekend kanaal";
+App::$strings["Wikis"] = "Wiki's";
+App::$strings["Download"] = "Download";
+App::$strings["Wiki name"] = "Naam wiki";
+App::$strings["Content type"] = "Opmaaktype";
+App::$strings["Create a status post for this wiki"] = "Plaats een bericht over deze wiki";
+App::$strings["Wiki not found"] = "Wiki is niet gevonden";
+App::$strings["Rename page"] = "Pagina hernoemen";
+App::$strings["Error retrieving page content"] = "Fout tijdens ophalen inhoud pagina";
+App::$strings["Revision Comparison"] = "Revisies vergelijken";
+App::$strings["Revert"] = "Ongedaan maken";
+App::$strings["Short description of your changes (optional)"] = "Korte omschrijving van jouw wijzigingen (niet verplicht)";
+App::$strings["Source"] = "Bron";
+App::$strings["New page name"] = "Nieuwe paginanaam";
+App::$strings["Embed image from photo albums"] = "Afbeelding uit een fotoalbum invoegen";
+App::$strings["Embed an image from your albums"] = "Afbeelding uit jouw albums invoegen";
+App::$strings["OK"] = "OK";
+App::$strings["Choose images to embed"] = "Kies afbeeldingen om in te voegen";
+App::$strings["Choose an album"] = "Kies een album";
+App::$strings["Choose a different album"] = "Kies een ander album";
+App::$strings["Error getting album list"] = "Fout tijdens ophalen albumlijst";
+App::$strings["Error getting photo link"] = "Fout tijdens ophalen fotolink";
+App::$strings["Error getting album"] = "Fout tijdens ophalen album";
+App::$strings["Error creating wiki. Invalid name."] = "Fout tijdens aanmaken wiki. Ongeldige naam.";
+App::$strings["Wiki created, but error creating Home page."] = "Wiki aangemaakt, maar fout tijdens aanmaken homepagina.";
+App::$strings["Error creating wiki"] = "Fout tijdens aanmaken wiki.";
+App::$strings["Wiki delete permission denied."] = "Toegang geweigerd tijdens verwijderen wiki.";
+App::$strings["Error deleting wiki"] = "Fout tijdens verwijderen wiki";
+App::$strings["New page created"] = "Nieuwe pagina aangemaakt";
+App::$strings["Cannot delete Home"] = "Kan Home niet verwijderen";
+App::$strings["Current Revision"] = "Huidige revisie";
+App::$strings["Selected Revision"] = "Geselecteerde revisie";
+App::$strings["You must be authenticated."] = "Je moet geauthenticeerd zijn";
App::$strings["Room not found"] = "Chatkanaal niet gevonden";
App::$strings["Leave Room"] = "Chatkanaal verlaten";
App::$strings["Delete Room"] = "Chatkanaal verwijderen";
@@ -1467,41 +1546,56 @@ App::$strings["Expiration"] = "Verloopt na";
App::$strings["min"] = "min";
App::$strings["Xchan Lookup"] = "Xchan opzoeken";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Zoek een xchan (of webbie) die begint met:";
-App::$strings["Calendar entries imported."] = "Agenda-items geïmporteerd.";
-App::$strings["No calendar entries found."] = "Geen agenda-items gevonden.";
-App::$strings["Event can not end before it has started."] = "Gebeurtenis kan niet eindigen voordat het is begonnen";
-App::$strings["Unable to generate preview."] = "Niet in staat om voorvertoning te genereren";
-App::$strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
-App::$strings["Event not found."] = "Gebeurtenis niet gevonden";
-App::$strings["Edit event title"] = "Titel bewerken";
-App::$strings["Event title"] = "Titel";
-App::$strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
-App::$strings["Edit Category"] = "Categorie";
-App::$strings["Category"] = "Categorie";
-App::$strings["Edit start date and time"] = "Begindatum en -tijd bewerken";
-App::$strings["Start date and time"] = "Begindatum en -tijd";
-App::$strings["Finish date and time are not known or not relevant"] = "Einddatum en -tijd zijn niet bekend of niet van toepassing";
-App::$strings["Edit finish date and time"] = "Einddatum en -tijd bewerken";
-App::$strings["Finish date and time"] = "Einddatum en -tijd";
-App::$strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
-App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Belangrijk voor gebeurtenissen die op een bepaalde locatie plaatsvinden. Niet praktisch voor wereldwijde feestdagen.";
-App::$strings["Edit Description"] = "Omschrijving bewerken";
-App::$strings["Edit Location"] = "Locatie bewerken";
-App::$strings["Permission settings"] = "Permissies";
-App::$strings["Advanced Options"] = "Geavanceerde opties";
-App::$strings["Edit event"] = "Gebeurtenis bewerken";
-App::$strings["Delete event"] = "Gebeurtenis verwijderen";
-App::$strings["calendar"] = "agenda";
-App::$strings["Month"] = "Maand";
-App::$strings["Week"] = "Week";
-App::$strings["Day"] = "Dag";
-App::$strings["Event removed"] = "Gebeurtenis verwijderd";
-App::$strings["Failed to remove event"] = "Verwijderen gebeurtenis mislukt";
App::$strings["Missing room name"] = "Naam chatkanaal ontbreekt";
App::$strings["Duplicate room name"] = "Naam chatkanaal bestaat al";
App::$strings["Invalid room specifier."] = "Ongeldige omschrijving chatkanaal";
App::$strings["Room not found."] = "Chatkanaal niet gevonden";
App::$strings["Room is full"] = "Chatkanaal is vol";
+App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
+App::$strings["\$projectname"] = "\$projectname";
+App::$strings["Thank You,"] = "Bedankt,";
+App::$strings["%s Administrator"] = "Beheerder %s";
+App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
+App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notificatie] Nieuw privébericht ontvangen op %s";
+App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
+App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
+App::$strings["a private message"] = "een privébericht";
+App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
+App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
+App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s gaf een reactie in conversatie #%1\$d";
+App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie in een conversatie die jij volgt.";
+App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
+App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s vindt [zrl=%3\$s]jouw %4\$s[/zrl] leuk";
+App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s vindt iets leuk in conversatie #%1\$d";
+App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s vindt iets leuk in een conversatie die jij bent gestart.";
+App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
+App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
+App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notificatie] %s heeft jou genoemd";
+App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
+App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notificatie] %1\$s heeft jou aangestoten";
+App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
+App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
+App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notificatie] %s heeft jouw bericht getagd";
+App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
+App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
+App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notificatie] Connectieverzoek ontvangen";
+App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
+App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
+App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
+App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notificatie] Kanaalvoorstel ontvangen";
+App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
+App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
+App::$strings["Name:"] = "Naam:";
+App::$strings["Photo:"] = "Foto:";
+App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
+App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notificatie]";
+App::$strings["created a new post"] = "maakte een nieuw bericht aan";
+App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
App::$strings["Visible to your default audience"] = "Voor iedereen zichtbaar, mits niet anders ingesteld";
App::$strings["Only me"] = "Alleen ik";
App::$strings["Public"] = "Openbaar";
@@ -1516,6 +1610,24 @@ App::$strings["This is your default setting for who can view your default channe
App::$strings["This is your default setting for who can view your connections"] = "Dit is de standaard privacy-instelling voor wie een lijst met jouw connecties kan bekijken";
App::$strings["This is your default setting for who can view your file storage and photos"] = "Dit is de standaard privacy-instelling voor wie jouw bestanden en foto's kan bekijken";
App::$strings["This is your default setting for the audience of your webpages"] = "Dit is de standaard privacy-instelling voor wie jouw webpagina's kan bekijken";
+App::$strings["(No Title)"] = "(Geen titel)";
+App::$strings["Wiki page create failed."] = "Aanmaken wiki-pagina mislukt.";
+App::$strings["Wiki not found."] = "Wiki niet gevonden";
+App::$strings["Destination name already exists"] = "Naam van doel bestaat al";
+App::$strings["Page not found"] = "Pagina niet gevonden";
+App::$strings["Error reading page content"] = "Fout tijdens lezen pagina-inhoud";
+App::$strings["Error reading wiki"] = "Fout tijdens lezen wiki";
+App::$strings["Page update failed."] = "Bijwerken van pagina mislukt.";
+App::$strings["Nothing deleted"] = "Niets verwijderd";
+App::$strings["Compare: object not found."] = "Vergelijken: object niet gevonden.";
+App::$strings["Page updated"] = "Pagina bijgewerkt";
+App::$strings["Untitled"] = "Naamloos";
+App::$strings["Wiki resource_id required for git commit"] = "Resource_id wiki voor git commit vereist";
+App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
+App::$strings["__ctx:permcat__ default"] = "standaard";
+App::$strings["__ctx:permcat__ follower"] = "volger";
+App::$strings["__ctx:permcat__ contributor"] = "bijdrager";
+App::$strings["__ctx:permcat__ publisher"] = "publichist ";
App::$strings["Private Message"] = "Niet voor iedereen zichtbaar";
App::$strings["Select"] = "Kies";
App::$strings["Save to Folder"] = "In map opslaan";
@@ -1565,6 +1677,7 @@ App::$strings["Code"] = "Broncode";
App::$strings["Image"] = "Afbeelding";
App::$strings["Insert Link"] = "Link invoegen";
App::$strings["Video"] = "Video";
+App::$strings["Wiki files deleted successfully"] = "Verwijderen wiki-bestanden geslaagd";
App::$strings["Site Admin"] = "Hubbeheerder";
App::$strings["Report Bug"] = "Bugrapport indienen";
App::$strings["View Bookmarks"] = "Bladwijzers bekijken";
@@ -1590,51 +1703,8 @@ App::$strings["Post"] = "Bericht";
App::$strings["Profile Photo"] = "Profielfoto";
App::$strings["Purchase"] = "Aanschaffen";
App::$strings["Undelete"] = "Verwijdering ongedaan maken";
-App::$strings["\$Projectname Notification"] = "\$Projectname-notificatie";
-App::$strings["\$projectname"] = "\$projectname";
-App::$strings["Thank You,"] = "Bedankt,";
-App::$strings["%s Administrator"] = "Beheerder %s";
-App::$strings["%s <!item_type!>"] = "%s <!item_type!>";
-App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notificatie] Nieuw privébericht ontvangen op %s";
-App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
-App::$strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
-App::$strings["a private message"] = "een privébericht";
-App::$strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
-App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
-App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s gaf een reactie in conversatie #%1\$d";
-App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie in een conversatie die jij volgt.";
-App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
-App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s vindt [zrl=%3\$s]jouw %4\$s[/zrl] leuk";
-App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notificatie] %2\$s vindt iets leuk in conversatie #%1\$d";
-App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s vindt iets leuk in een conversatie die jij bent gestart.";
-App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
-App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
-App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notificatie] %s heeft jou genoemd";
-App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
-App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notificatie] %1\$s heeft jou aangestoten";
-App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
-App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
-App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notificatie] %s heeft jouw bericht getagd";
-App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s heeft jouw bericht om %3\$s getagd";
-App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s heeft [zrl=%3\$s]jouw bericht[/zrl] getagd";
-App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notificatie] Connectieverzoek ontvangen";
-App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
-App::$strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
-App::$strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek te accepteren of af te wijzen.";
-App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notificatie] Kanaalvoorstel ontvangen";
-App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
-App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
-App::$strings["Name:"] = "Naam:";
-App::$strings["Photo:"] = "Foto:";
-App::$strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of af te wijzen.";
-App::$strings["[\$Projectname:Notify]"] = "[\$Projectname:Notificatie]";
-App::$strings["created a new post"] = "maakte een nieuw bericht aan";
-App::$strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
+App::$strings["Add to app-tray"] = "Aan appmenu toevoegen";
+App::$strings["Remove from app-tray"] = "Uit appmenu verwijderen";
App::$strings["Flag Adult Photos"] = "Markeer foto's als voor volwassenen";
App::$strings["Provide photo edit option to hide inappropriate photos from default album view"] = "Zorgt voor een optie om foto's met inhoud voor volwassenen in de standaard albumweergave te verbergen";
App::$strings["This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc."] = "This is a fairly comprehensive and complete guitar chord dictionary which will list most of the available ways to play a certain chord, starting from the base of the fingerboard up to a few frets beyond the twelfth fret (beyond which everything repeats). A couple of non-standard tunings are provided for the benefit of slide players, etc.";
@@ -1646,6 +1716,8 @@ App::$strings["Tuning"] = "Stemmen";
App::$strings["Chord name: example: Em7"] = "Akkoordnaam: bijvoorbeeld: Em7";
App::$strings["Show for left handed stringing"] = "Toon voor linkshandige gitaar";
App::$strings["Quick Reference"] = "Beknopt overzicht";
+App::$strings["No username found in import file."] = "Geen gebruikersnaam in het importbestand gevonden.";
+App::$strings["Unable to create a unique channel address. Import failed."] = "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt.";
App::$strings["Diaspora Protocol Settings updated."] = "Diaspora-protocol-instellingen bijgewerkt.";
App::$strings["Enable the Diaspora protocol for this channel"] = "Het Diaspora-protocol voor dit kanaal inschakelen";
App::$strings["Allow any Diaspora member to comment on your public posts"] = "Geef elk Diaspora-lid toestemming om op jouw openbare berichten te reageren";
@@ -1681,12 +1753,12 @@ App::$strings["<strong><em>Or</em></strong> become a project sponsor (Hubzilla P
App::$strings["Please indicate if you would like your first name or full name (or nothing) to appear in our sponsor listing"] = "Geef aan of jouw voornaam of volledige naam (of niets) op onze sponsorlijst moet verschijnen";
App::$strings["Sponsor"] = "Sponsor";
App::$strings["Special thanks to: "] = "Speciale dank gaat naar: ";
-App::$strings["Post to Dreamwidth"] = "Doorplaatsen naar Dreamwidth";
+App::$strings["Post to Dreamwidth"] = "Dreamwidth";
App::$strings["Enable Dreamwidth Post Plugin"] = "Doorplaatsen naar Dreamwidth inschakelen";
App::$strings["Dreamwidth username"] = "Gebruikersnaam Dreamwidth";
App::$strings["Dreamwidth password"] = "Wachtwoord Dreamwidth";
App::$strings["Post to Dreamwidth by default"] = "Standaard doorplaatsen naar Dreamwidth";
-App::$strings["Dreamwidth Post Settings"] = "Doorplaatsen naar Dreamwidth";
+App::$strings["Dreamwidth Post Settings"] = "Dreamwidth (berichten doorplaatsen)";
App::$strings["Flattr this!"] = "Flattr this!";
App::$strings["Flattr widget settings updated."] = "Instellingen Flattrwidget bijgewerkt.";
App::$strings["Flattr user"] = "Gebruikersnaam Flattr";
@@ -1776,7 +1848,6 @@ App::$strings["This will import all your Friendica photo albums to this Red chan
App::$strings["Friendica Server base URL"] = "Basis-URL van Friendica-server";
App::$strings["Friendica Login Username"] = "Gebruikersnaam Friendica";
App::$strings["Friendica Login Password"] = "Wachtwoord Friendica";
-App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU social-protocol voor dit kanaal inschakelen";
App::$strings["Send email to all members"] = "Naar alle leden e-mail versturen";
App::$strings["$1%s Administrator"] = "Beheerder $1%s";
App::$strings["No recipients found."] = "Geen ontvangers gevonden";
@@ -1785,12 +1856,12 @@ App::$strings["Send email to all hub members."] = "Naar alle leden van deze hub
App::$strings["Message subject"] = "Onderwerp e-mailbericht";
App::$strings["Sender Email address"] = "E-mailadres afzender";
App::$strings["Test mode (only send to hub administrator)"] = "Testmodus (alleen naar hubbeheerder sturen)";
-App::$strings["Post to Insanejournal"] = "Doorplaatsen naar InsaneJournal";
+App::$strings["Post to Insanejournal"] = "InsaneJournal";
App::$strings["Enable InsaneJournal Post Plugin"] = "Doorplaatsen naar InsaneJournal inschakelen";
App::$strings["InsaneJournal username"] = "Gebruikersnaam InsaneJournal";
App::$strings["InsaneJournal password"] = "Wachtwoord InsaneJournal";
App::$strings["Post to InsaneJournal by default"] = "Standaard doorplaatsen naar InsaneJournal";
-App::$strings["InsaneJournal Post Settings"] = "Doorplaatsen naar InsaneJournal";
+App::$strings["InsaneJournal Post Settings"] = "InsaneJournal (berichten doorplaatsen)";
App::$strings["Insane Journal Settings saved."] = "InsaneJournal-instellingen opgeslagen.";
App::$strings["Channels to auto connect"] = "Kanalen om automatisch mee te verbinden";
App::$strings["Comma separated list"] = "Door komma's gescheiden lijst";
@@ -1810,7 +1881,6 @@ App::$strings["Hubzilla password"] = "Wachtwoord Hubzilla";
App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Approve subscription requests from Hubzilla contacts automatically";
App::$strings["Purge internal list of jabber addresses of contacts"] = "Purge internal list of jabber addresses of contacts";
App::$strings["Configuration Help"] = "Configuratiehulp";
-App::$strings["Add Contact"] = "Contact toevoegen";
App::$strings["Jappix Mini Settings"] = "Jappix Mini";
App::$strings["Upload a file"] = "Bestand uploaden";
App::$strings["Drop files here to upload"] = "Sleep bestanden hierheen om ze te uploaden";
@@ -1822,19 +1892,19 @@ App::$strings["File has an invalid extension, it should be one of "] = "Bestand
App::$strings["Upload was cancelled, or server error encountered"] = "Upload werd geannuleerd of er was een serverfout";
App::$strings["An account has been created for you."] = "Er is voor jou een account aangemaakt.";
App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authenticatie geslaagd, maar afgekeurd: aanmaken accounts uitgeschakeld.";
-App::$strings["Post to Libertree"] = "Doorplaatsen naar Libertree";
+App::$strings["Post to Libertree"] = "Libertree";
App::$strings["Enable Libertree Post Plugin"] = "Doorplaatsen naar Libertree inschakelen";
App::$strings["Libertree API token"] = "API-token Libertree";
App::$strings["Libertree site URL"] = "Website-URL Libertree";
App::$strings["Post to Libertree by default"] = "Standaard doorplaatsen naar Libertree";
-App::$strings["Libertree Post Settings"] = "Doorplaatsen naar Libertree";
+App::$strings["Libertree Post Settings"] = "Libertree (berichten doorplaatsen)";
App::$strings["Libertree Settings saved."] = "Libertree-instellingen opgeslagen.";
-App::$strings["Post to LiveJournal"] = "Doorplaatsen naar LiveJournal";
+App::$strings["Post to LiveJournal"] = "LiveJournal";
App::$strings["Enable LiveJournal Post Plugin"] = "Doorplaatsen naar LiveJournal inschakelen";
App::$strings["LiveJournal username"] = "Gebruikersnaam LiveJournal";
App::$strings["LiveJournal password"] = "Wachtwoord LiveJournal";
-App::$strings["Post to LiveJournal by default"] = "Standaard doorplaatsen naar ";
-App::$strings["LiveJournal Post Settings"] = "Doorplaatsen naar LiveJournal";
+App::$strings["Post to LiveJournal by default"] = "Standaard doorplaatsen naar LiveJournal";
+App::$strings["LiveJournal Post Settings"] = "LiveJournal (berichten doorplaatsen)";
App::$strings["LiveJournal Settings saved."] = "LiveJournal-instellingen opgeslagen.";
App::$strings["Logfile archive directory"] = "Logbestand archiefmap";
App::$strings["Directory to store rotated logs"] = "Map om geroteerde logbestanden in op te slaan";
@@ -1917,12 +1987,12 @@ App::$strings["NSAbait Settings"] = "NSAbait";
App::$strings["This plugin looks in posts for the words/text you specify below, and collapses any content containing those keywords so it is not displayed at inappropriate times, such as sexual innuendo that may be improper in a work setting. It is polite and recommended to tag any content containing nudity with #NSFW. This filter can also match any other word/text you specify, and can thereby be used as a general purpose content filter."] = "Deze plug-in controleert berichten op woorden die je hieronder kunt opgeven en klapt berichten in die deze woorden bevatten, zodat die berichten niet worden weergegeven op ongeschikte momenten. Denk hierbij aan berichten met erotische afbeeldingen, die waarschijnlijk niet geschikt zijn binnen (bijvoorbeeld) een werkomgeving. Het is beleefd en het wordt aangeraden om zulke berichten met #NSFW te taggen. Dit filter kan ook gebruikt worden met andere woorden en is dus voor alles inzetbaar.";
App::$strings["Enable Content filter"] = "Inhoudsfilter inschakelen";
App::$strings["Comma separated list of keywords to hide"] = "Door komma's gescheiden lijst met woorden die gefilterd moeten worden.";
-App::$strings["Use /expression/ to provide regular expressions"] = "Gebruik /expressie/ voor reguliere expressies";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Woord, /reguliere expressie/, lang=xx, lang!=xx";
App::$strings["Not Safe For Work Settings"] = "Not Safe For Work (inhoudsfilter)";
App::$strings["General Purpose Content Filter"] = "Voor alles te gebruiken inhoudsfilter";
App::$strings["NSFW Settings saved."] = "NSFW-instellingen opgeslagen.";
App::$strings["Possible adult content"] = "Mogelijk inhoud voor volwassenen";
-App::$strings["%s - click to open/close"] = "%s - Klik om te openen of te sluiten";
+App::$strings["%s - view"] = "%s - tonen";
App::$strings["System defaults:"] = "Systeemstandaarden:";
App::$strings["Preferred Clipart IDs"] = "Voorkeursclipart";
App::$strings["List of preferred clipart ids. These will be shown first."] = "Lijst met clipartnummers die als eerste moeten worden getoond.";
@@ -1974,7 +2044,7 @@ App::$strings["Enable Planets Plugin"] = "Planets inschakelen";
App::$strings["Planets Settings"] = "Planets";
App::$strings["You are now authenticated to pumpio."] = "De verbinding met pump.io is geverifieerd";
App::$strings["return to the featured settings page"] = "Ga terug naar pagina met plugin-instellingen";
-App::$strings["Post to Pump.io"] = "Doorplaatsen naar Pump.io";
+App::$strings["Post to Pump.io"] = "Pump.io";
App::$strings["Pump.io servername"] = "Pump.io-servernaam";
App::$strings["Without \"http://\" or \"https://\""] = "Zonder \"http://\" of \"https://\"";
App::$strings["Pump.io username"] = "Gebruikersnaam Pump.io";
@@ -1985,7 +2055,7 @@ App::$strings["Enable pump.io Post Plugin"] = "Doorplaatsen naar Pump.io inschak
App::$strings["Post to pump.io by default"] = "Standaard doorplaatsen naar Pump.io";
App::$strings["Should posts be public"] = "Moeten berichten openbaar zijn";
App::$strings["Mirror all public posts"] = "Alle openbare berichten doorplaatsen";
-App::$strings["Pump.io Post Settings"] = "Doorplaatsen naar Pump.io";
+App::$strings["Pump.io Post Settings"] = "Pump.io (berichten doorplaatsen)";
App::$strings["PumpIO Settings saved."] = "Pump.io-instellingen opgeslagen.";
App::$strings["QR code"] = "QR-code";
App::$strings["QR Generator"] = "QR-code-generator";
@@ -2010,9 +2080,8 @@ App::$strings["Import just this album"] = "Alleen dit album importeren";
App::$strings["Leave blank to import all albums"] = "Laat leeg om alle albums te importeren";
App::$strings["Maximum count to import"] = "Maximaal aantal om te importeren";
App::$strings["0 or blank to import all available"] = "0 of leeg om alles te importeren";
-App::$strings["Post to Red"] = "Doorplaatsen naar Hubzilla";
+App::$strings["Post to Red"] = "Hubzilla";
App::$strings["Channel is required."] = "Een kanaal is vereist.";
-App::$strings["Invalid channel."] = "Onbekend kanaal.";
App::$strings["redred Settings saved."] = "RedRed-instellingen opgeslagen.";
App::$strings["Allow posting to another Hubzilla Channel"] = "Doorplaatsen naar een ander Hubzilla-kanaal toestaan";
App::$strings["Send public postings to Hubzilla channel by default"] = "Standaard doorplaatsen naar een ander Hubzilla-kanaal toestaan";
@@ -2021,15 +2090,15 @@ App::$strings["https://{sitename}/api"] = "https://{hubnaam}/api";
App::$strings["Hubzilla login name"] = "Gebruikersnaam Hubzilla";
App::$strings["Hubzilla channel name"] = "Kanaalnaam Hubzilla";
App::$strings["Nickname"] = "Bijnaam";
-App::$strings["Hubzilla Crosspost Settings"] = "Doorplaatsen naar Hubzilla";
-App::$strings["Post to Friendica"] = "Doorplaatsen naar Friendica";
+App::$strings["Hubzilla Crosspost Settings"] = "Hubzilla (berichten doorplaatsen)";
+App::$strings["Post to Friendica"] = "Friendica";
App::$strings["rtof Settings saved."] = "RTOF-instellingen opgeslagen.";
App::$strings["Allow posting to Friendica"] = "Doorplaatsen naar Friendica toestaan";
App::$strings["Send public postings to Friendica by default"] = "Standaard doorplaatsen naar Friendica";
App::$strings["Friendica API Path"] = "API-pad Friendica";
App::$strings["Friendica login name"] = "Gebruikersnaam Friendica";
App::$strings["Friendica password"] = "Wachtwoord Friendica";
-App::$strings["Hubzilla to Friendica Post Settings"] = "Doorplaatsen naar Friendica";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Friendica (berichten doorplaatsen)";
App::$strings["Extended Identity Sharing"] = "Uitgebreid identiteit delen";
App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Deel jouw Hubzilla-identiteit met alle websites op het internet. Wanneer dit is uitgeschakeld wordt je identiteit alleen binnen het Hubzilla-netwerk gedeeld. Schakel dit alleen in als je weet wat je doet.";
App::$strings["Some setting"] = "Een of andere instelling";
@@ -2041,7 +2110,7 @@ App::$strings["Smileybutton Settings"] = "Smileyknop";
App::$strings["Page to load after login"] = "Pagina die na het inloggen getoond moet worden";
App::$strings["Examples: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacy collection), &quot;channel&quot; or &quot;notifications/system&quot; (leave blank for default network page (grid)."] = "Voorbeelden: &quot;apps&quot;, &quot;network?f=&gid=37&quot; (privacygroep), &quot;channel&quot; of &quot;notifications/system&quot; (laat leeg voor de standaard netwerkpagina (grid).";
App::$strings["Startpage Settings"] = "Startpagina";
-App::$strings["Post to GNU social"] = "Doorplaatsen naar GNU social";
+App::$strings["Post to GNU social"] = "GNU social";
App::$strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "De verstrekte API-URL is ongeldig.<br />Neem contact op met jouw hubbeheerder.";
App::$strings["We could not contact the GNU social API with the Path you entered."] = "Wij konden de GNU social-API niet bereiken door middel van het ingevulde pad.";
App::$strings["GNU social settings updated."] = "GNU social-instellingen bijgewerkt.";
@@ -2067,7 +2136,7 @@ App::$strings["If enabled your public postings can be posted to the associated G
App::$strings["Post to GNU social by default"] = "Standaard doorplaatsen naar GNU social";
App::$strings["If enabled your public postings will be posted to the associated GNU-social account by default"] = "Wanneer dit is ingeschakeld worden al jouw openbare berichten standaard naar het gekoppelde GNU social-account doorgeplaatst";
App::$strings["Clear OAuth configuration"] = "OAuth-configuratie wissen";
-App::$strings["GNU social Post Settings"] = "Doorplaatsen naar GNU social";
+App::$strings["GNU social Post Settings"] = "GNU social (berichten doorplaatsen)";
App::$strings["API URL"] = "API-URL";
App::$strings["Application name"] = "Naam applicatie";
App::$strings["Currently blocked"] = "Momenteel geblokkeerd";
@@ -2106,7 +2175,7 @@ App::$strings["There are events this week. Click here too see which!"] = "Er vin
App::$strings["You have received a new introduction. Click here to see who!"] = "Je hebt een nieuw connectieverzoek ontvangen. Klik hier om te kijken van wie.";
App::$strings["There is a new system notification. Click here to see what has happened!"] = "Er is een nieuwe systeemnotificatie. Klik hier om te zien wat er aan de hand is.";
App::$strings["Click here to share text, images, videos and sound."] = "Klik hier om tekst, afbeeldingen, video en audio te delen.";
-App::$strings["You can write an optional title for your update (good for long posts)."] = "Je kan optioneel een titel voor je nieuwe bericht verzinnen. Vooral goed voor langere berichten.";
+App::$strings["You can write an optional title for your update (good for long posts)."] = "Je kan een titel voor je nieuwe bericht verzinnen, maar dit is niet verplicht. Vooral goed voor langere berichten.";
App::$strings["Entering some categories here makes it easier to find your post later."] = "Het invullen van enkele categorieën, maakt het later terugvinden van je berichten gemakkelijker. Dit is niet verplicht.";
App::$strings["Share photos, links, location, etc."] = "Deel foto's, links, locaties, enz.";
App::$strings["Only want to share content for a while? Make it expire at a certain date."] = "Wil je alleen iets tot een bepaald moment delen? Dan kan je het hiermee op een bepaalde datum en tijd laten verlopen.";
@@ -2124,7 +2193,7 @@ App::$strings["Save your search so you can repeat it at a later date."] = "Sla j
App::$strings["If you see this icon you can be sure that the sender is who it say it is. It is normal that it is not always possible to verify the sender, so the icon will be missing sometimes. There is usually no need to worry about that."] = "Wanneer je dit pictogram ziet, kan je er van uitgaan dat de afzender is wie hij/zij beweert te zijn. Het is niet altijd mogelijk om de afzender te verifiëren, waardoor het pictogram soms ontbreekt. Dit is meestal geen reden voor ongerustheid.";
App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Gevaar! Het lijkt er op dat iemand een bericht heeft proberen te vervalsen! Dit bericht is mogelijk niet afkomstig van de vermelde afzender!";
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Welkom op Hubzilla! Wil jij een rondleiding hebben langs de gebruikersinterface?</p> <p>Je kan dit op elk moment pauzeren en weer hervatten door de pagina te herladen of naar een andere pagina te gaan.</p><p>Je kan ook vooruitgaan met behulp van de entertoets.";
-App::$strings["Post to Twitter"] = "Doorplaatsen naar Twitter";
+App::$strings["Post to Twitter"] = "Twitter";
App::$strings["Twitter settings updated."] = "Twitter-instellingen bijgewerkt.";
App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Geen consumerkeys voor Twitter gevonden. Neem contact op met jouw hubbeheerder.";
App::$strings["At this Hubzilla instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "De Twitter-plugin is op deze Hubzilla-hub ingeschakeld, maar je hebt nog niet jouw Hubzilla-kanaal met jouw Twitter-account gekoppeld. Om dit te doen klik je op de knop hieronder om een PIN-code van Twitter te krijgen. Deze dien je te kopiëren en in het invoegveld beneden te plakken. Vervolgens klik je op Opslaan. Alleen jouw <strong>openbare</strong> berichten kunnen op Twitter worden geplaatst.";
@@ -2135,7 +2204,7 @@ App::$strings["Allow posting to Twitter"] = "Doorplaatsen naar Twitter toestaan"
App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wanneer dit is ingeschakeld kunnen jouw <strong>openbare</strong> berichten naar het gekoppelde Twitter-account worden doorgeplaatst";
App::$strings["Send public postings to Twitter by default"] = "Standaard doorplaatsen naar Twitter";
App::$strings["If enabled your public postings will be posted to the associated Twitter account by default"] = "Wanneer dit is ingeschakeld worden al jouw <strong>openbare</strong> berichten standaard naar het gekoppelde Twitter-account doorgeplaatst";
-App::$strings["Twitter Post Settings"] = "Doorplaatsen naar Twitter";
+App::$strings["Twitter Post Settings"] = "Twitter (berichten doorplaatsen)";
App::$strings["Submit Settings"] = "Instellingen toepassen";
App::$strings["Show Upload Limits"] = "Uploadlimieten tonen";
App::$strings["Hubzilla configured maximum size: "] = "Op Hubzilla configureerde maximale grootte: ";
@@ -2149,7 +2218,7 @@ App::$strings["No entries."] = "Niets aanwezig.";
App::$strings["Enable Visage Visitor Logging"] = "Visage inschakelen ";
App::$strings["Visage Settings"] = "Visage";
App::$strings["Who likes me?"] = "Wie vindt mij leuk?";
-App::$strings["Post to WordPress"] = "Doorplaatsen naar WordPress";
+App::$strings["Post to WordPress"] = "WordPress";
App::$strings["Enable WordPress Post Plugin"] = "Doorplaatsen naar WordPress inschakelen";
App::$strings["WordPress username"] = "Gebruikersnaam WordPress";
App::$strings["WordPress password"] = "Wachtwoord WordPress";
@@ -2159,7 +2228,7 @@ App::$strings["WordPress blogid"] = "Blog ID WordPress";
App::$strings["For multi-user sites such as wordpress.com, otherwise leave blank"] = "Voor websites met meerdere gebruikers, zoals wordpress.com. Anders leeg laten.";
App::$strings["Post to WordPress by default"] = "Standaard naar WordPress doorplaatsen";
App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Reacties doorplaatsen (Hubzilla_WP-plugin vereist)";
-App::$strings["WordPress Post Settings"] = "Doorplaatsen naar WordPress";
+App::$strings["WordPress Post Settings"] = "WordPress (berichten doorplaatsen)";
App::$strings["Wordpress Settings saved."] = "WordPress-instellingen opgeslagen.";
App::$strings["XMPP settings updated."] = "XMPP-instellingen bijgewerkt.";
App::$strings["Enable Chat"] = "Chatten inschakelen";
@@ -2188,21 +2257,6 @@ App::$strings["Addressbook Name"] = "Naam adresboek";
App::$strings["Addressbook Tools"] = "Adresboek-hulpmiddelen";
App::$strings["Import addressbook"] = "Importeren";
App::$strings["Select an addressbook to import to"] = "Kies een adresboek om te importeren";
-App::$strings["Errors encountered creating database table: "] = "Fouten opgetreden tijdens aanmaken databasetabel: ";
-App::$strings["Default Calendar"] = "Standaard agenda";
-App::$strings["Default Addressbook"] = "Standaard adresboek";
-App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-instellingen opgeslagen.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "CalDAV/CardDAV-server voor dit kanaal inschakelen";
-App::$strings["Your CalDAV resources are located at %s "] = "Jouw CalDAV-URL is %s ";
-App::$strings["Your CardDAV resources are located at %s "] = "Jouw CardDAV-URL is %s ";
-App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV";
-App::$strings["Mobile"] = "Mobiel";
-App::$strings["Home"] = "Thuis";
-App::$strings["Home, Voice"] = "Thuis, spraak";
-App::$strings["Home, Fax"] = "Thuis, fax";
-App::$strings["Work"] = "Werk";
-App::$strings["Work, Voice"] = "Werk, spraak";
-App::$strings["Work, Fax"] = "Werk, fax";
App::$strings["INVALID EVENT DISMISSED!"] = "ONGELDIGE GEBEURTENIS VERWIJDERD!";
App::$strings["Summary: "] = "Samenvatting: ";
App::$strings["Date: "] = "Datum: ";
@@ -2220,19 +2274,18 @@ App::$strings["Less"] = "Minder";
App::$strings["Select calendar"] = "Kies agenda";
App::$strings["Delete all"] = "Alles verwijderen";
App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Excuses! Bewerken van herhalende gebeurtenissen is nog niet geïmplementeerd.";
-App::$strings["Organisation"] = "Organisatie";
-App::$strings["Title"] = "Titel";
-App::$strings["Phone"] = "Telefoon";
-App::$strings["Instant messenger"] = "Instant messenger";
-App::$strings["Website"] = "Website";
-App::$strings["Note"] = "Opmerking";
-App::$strings["Add Field"] = "Veld toevoegen";
-App::$strings["P.O. Box"] = "Postbus";
-App::$strings["Additional"] = "Extra";
-App::$strings["Street"] = "Straat en huisnummer";
-App::$strings["Locality"] = "Plaats";
-App::$strings["Region"] = "Provincie/staat/regio/enz.";
-App::$strings["ZIP Code"] = "Postcode";
+App::$strings["Errors encountered creating database table: "] = "Fouten opgetreden tijdens aanmaken databasetabel: ";
+App::$strings["Default Calendar"] = "Standaard agenda";
+App::$strings["Default Addressbook"] = "Standaard adresboek";
+App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-instellingen opgeslagen.";
+App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "CalDAV/CardDAV-server voor dit kanaal inschakelen";
+App::$strings["Your CalDAV resources are located at %s "] = "Jouw CalDAV-URL is %s ";
+App::$strings["Your CardDAV resources are located at %s "] = "Jouw CardDAV-URL is %s ";
+App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV";
+App::$strings["Home, Voice"] = "Thuis, spraak";
+App::$strings["Home, Fax"] = "Thuis, fax";
+App::$strings["Work, Voice"] = "Werk, spraak";
+App::$strings["Work, Fax"] = "Werk, fax";
App::$strings["Invalid game."] = "Ongeldig spel.";
App::$strings["You are not a player in this game."] = "Jij doet niet aan dit speel mee.";
App::$strings["You must be a local channel to create a game."] = "Je moet een lokaal kanaal zijn om een spel aan te maken.";
@@ -2250,8 +2303,6 @@ App::$strings["Like us on Hubzilla"] = "Like ons op Hubzilla";
App::$strings["Embed:"] = "Insluiten (embed):";
App::$strings["Male"] = "Man";
App::$strings["Female"] = "Vrouw";
-App::$strings["OpenID protocol error. No ID returned."] = "OpenID-protocolfout. Geen ID terugontvangen.";
-App::$strings["Login failed."] = "Inloggen mislukt.";
App::$strings["First Name"] = "Voornaam";
App::$strings["Last Name"] = "Achternaam";
App::$strings["Full Name"] = "Volledige naam";
@@ -2268,6 +2319,8 @@ App::$strings["Birth Day"] = "Geboortedag";
App::$strings["Birthdate"] = "Geboortedatum";
App::$strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "We hebben een probleem ontdekt tijdens het inloggen met de OpenID die je hebt verstrekt. Controleer de ID op typefouten.";
App::$strings["The error message was:"] = "Foutmelding was:";
+App::$strings["OpenID protocol error. No ID returned."] = "OpenID-protocolfout. Geen ID terugontvangen.";
+App::$strings["Login failed."] = "Inloggen mislukt.";
App::$strings["Reconnecting %d connections"] = "%d connecties opnieuw aan het verbinden";
App::$strings["Diaspora Reconnect"] = "Diaspora opnieuw verbinden";
App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Gebruik dit formulier om opnieuw met Diaspora-connecties te verbinden, die oorspronkelijk op een andere hub waren verbonden.";
@@ -2292,13 +2345,122 @@ App::$strings["New identity"] = "Nieuwe identiteit";
App::$strings["Delete marker"] = "Markering verwijderen";
App::$strings["Delete member"] = "Lid verwijderen";
App::$strings["Edit proximity alert"] = "Nabijheidswaarschuwing bewerken";
-App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):";
+App::$strings["A proximity alert will be issued when this member is within a certain radius of you.<br><br>Enter a radius in meters (0 to disable):"] = "Een nabijheidswaarschuwing wordt actief wanneer dit lid zich binnen een bepaalde straal rond jouw locatie bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):";
App::$strings["distance"] = "afstand";
+App::$strings["Proximity alert distance (meters)"] = "Afstand nabijheidswaarschuwing (meter)";
+App::$strings["A proximity alert will be issued when you are within a certain radius of the marker location.<br><br>Enter a radius in meters (0 to disable):"] = "Een nabijheidswaarschuwing wordt actief wanneer je je binnen een bepaalde straal rond een specifieke locatie bevindt.<br><br>Voer het aantal meters van de straal in (0 om uit te schakelen):";
+App::$strings["Marker proximity alert"] = "Locatiemarkering nabijheidswaarschuwing";
+App::$strings["Reminder note"] = "Herinnering";
+App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Vul de tekst in die getoond moet worden wanneer je je op de aangegeven afstand bevindt...";
App::$strings["Add new rendezvous"] = "Nieuwe rendezvous toevoegen";
App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Maak een nieuwe rendezvous aan en deel de toegangslink met wie je wil uitnodigen voor de groep. Wie op de link klikt wordt lid van rendezvous. Zij kunnen dan de locaties zien van andere leden, markeringen aan de kaart toevoegen of hun eigen locaties met de groep delen.";
-App::$strings["No username found in import file."] = "Geen gebruikersnaam in het importbestand gevonden.";
-App::$strings["Unable to create a unique channel address. Import failed."] = "Niet in staat om een uniek kanaaladres aan te maken. Importeren is mislukt.";
+App::$strings["Install Firefox Sharing Tools"] = "Firefox Share";
+App::$strings["Share content from Firefox to \$Projectname"] = "Deel webpagina's vanuit Firefox met ";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "Activeer de \$Projectname-service in Firefox";
+App::$strings["Error retrieving wiki"] = "Fout tijdens ophalen wiki";
+App::$strings["Error creating zip file export folder"] = "Fout tijdens aanmaken exportmap zipbestand";
+App::$strings["Error downloading wiki: "] = "Fout tijdens downloaden wiki: ";
+App::$strings["Wiki Pages"] = "Wikipagina's";
+App::$strings["Add new page"] = "Nieuwe pagina toevoegen";
+App::$strings["Page name"] = "Paginanaam";
+App::$strings["Wiki List"] = "Wiki's";
+App::$strings["Enable the GNU-Social protocol for this channel"] = "GNU social-protocol voor dit kanaal inschakelen";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Zoek %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
+App::$strings["Search \$Projectname"] = "Zoek in ";
App::$strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
+App::$strings["default"] = "standaard";
+App::$strings["Select an alternate language"] = "Kies een andere taal";
+App::$strings["Not a valid email address"] = "Geen geldig e-mailadres";
+App::$strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
+App::$strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
+App::$strings["An invitation is required."] = "Een uitnodiging is vereist";
+App::$strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
+App::$strings["Please enter the required information."] = "Vul de vereiste informatie in.";
+App::$strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
+App::$strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
+App::$strings["Registration request at %s"] = "Registratiebevestiging voor %s";
+App::$strings["your registration password"] = "jouw registratiewachtwoord";
+App::$strings["Registration details for %s"] = "Registratiegegevens voor %s";
+App::$strings["Account approved."] = "Account goedgekeurd";
+App::$strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
+App::$strings["Click here to upgrade."] = "Klik hier om te upgraden.";
+App::$strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
+App::$strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
+App::$strings["Categories"] = "Categorieën";
+App::$strings["Suggestions"] = "Voorgestelde kanalen";
+App::$strings["See more..."] = "Meer...";
+App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
+App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
+App::$strings["Enter channel address"] = "Vul kanaaladres in";
+App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
+App::$strings["Notes"] = "Aantekeningen";
+App::$strings["Remove term"] = "Verwijder zoekterm";
+App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
+App::$strings["add"] = "toevoegen";
+App::$strings["Saved Folders"] = "Bewaarde mappen";
+App::$strings["Everything"] = "Alles";
+App::$strings["Archives"] = "Archieven";
+App::$strings["Refresh"] = "Vernieuwen";
+App::$strings["Account settings"] = "Account";
+App::$strings["Channel settings"] = "Kanaal";
+App::$strings["Additional features"] = "Extra functies";
+App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
+App::$strings["Display settings"] = "Weergave";
+App::$strings["Manage locations"] = "Locaties beheren";
+App::$strings["Export channel"] = "Kanaal exporteren";
+App::$strings["Connected apps"] = "Verbonden applicaties";
+App::$strings["Permission Groups"] = "Permissiegroepen";
+App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
+App::$strings["Private Mail Menu"] = "Privéberichten";
+App::$strings["Combined View"] = "Gecombineerd postvak";
+App::$strings["Inbox"] = "Postvak IN";
+App::$strings["Outbox"] = "Postvak UIT";
+App::$strings["New Message"] = "Nieuw bericht";
+App::$strings["Conversations"] = "Conversaties";
+App::$strings["Received Messages"] = "Ontvangen berichten";
+App::$strings["Sent Messages"] = "Verzonden berichten";
+App::$strings["No messages."] = "Geen berichten";
+App::$strings["Delete conversation"] = "Verwijder conversatie";
+App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
+App::$strings["Export Calendar"] = "Exporteren";
+App::$strings["Import Calendar"] = "Importeren";
+App::$strings["Chatrooms"] = "Chatkanalen";
+App::$strings["Overview"] = "Overzicht";
+App::$strings["Chat Members"] = "Chatleden";
+App::$strings["__ctx:wiki_history__ Message"] = "Bericht";
+App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
+App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
+App::$strings["photo/image"] = "foto/afbeelding";
+App::$strings["Click to show more"] = "Klik voor meer";
+App::$strings["Rating Tools"] = "Beoordelingen";
+App::$strings["Rate Me"] = "Beoordeel mij";
+App::$strings["View Ratings"] = "Bekijk beoordelingen";
+App::$strings["Forums"] = "Forums";
+App::$strings["__ctx:widget__ Activity"] = "Activiteit";
+App::$strings["Tasks"] = "Taken";
+App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
+App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
+App::$strings["DB updates"] = "Database-updates";
+App::$strings["Admin"] = "Beheer";
+App::$strings["Plugin Features"] = "Plugin-opties";
+App::$strings["Tags"] = "Tags";
+App::$strings["Keywords"] = "Trefwoorden";
+App::$strings["have"] = "heb";
+App::$strings["has"] = "heeft";
+App::$strings["want"] = "wil";
+App::$strings["wants"] = "wil";
+App::$strings["likes"] = "vindt dit leuk";
+App::$strings["dislikes"] = "vindt dit niet leuk";
+App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
+App::$strings["Starts:"] = "Start:";
+App::$strings["Finishes:"] = "Einde:";
+App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
+App::$strings["Not specified"] = "Niet aangegeven";
+App::$strings["Needs Action"] = "Actie vereist";
+App::$strings["Completed"] = "Voltooid";
+App::$strings["In Process"] = "In behandeling";
+App::$strings["Cancelled"] = "Geannuleerd";
App::$strings["Birthday"] = "Verjaardag of geboortedatum";
App::$strings["Age: "] = "Leeftijd:";
App::$strings["YYYY-MM-DD or MM-DD"] = "JJJJ-MM-DD of MM-DD";
@@ -2335,22 +2497,6 @@ App::$strings["__ctx:relative_date__ second"] = array(
);
App::$strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
App::$strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
-App::$strings["Not a valid email address"] = "Geen geldig e-mailadres";
-App::$strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
-App::$strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
-App::$strings["An invitation is required."] = "Een uitnodiging is vereist";
-App::$strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
-App::$strings["Please enter the required information."] = "Vul de vereiste informatie in.";
-App::$strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
-App::$strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
-App::$strings["Registration request at %s"] = "Registratiebevestiging voor %s";
-App::$strings["your registration password"] = "jouw registratiewachtwoord";
-App::$strings["Registration details for %s"] = "Registratiegegevens voor %s";
-App::$strings["Account approved."] = "Account goedgekeurd";
-App::$strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
-App::$strings["Click here to upgrade."] = "Klik hier om te upgraden.";
-App::$strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
-App::$strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
App::$strings["Frequently"] = "Regelmatig";
App::$strings["Hourly"] = "Elk uur";
App::$strings["Twice daily"] = "Twee keer per dag";
@@ -2411,186 +2557,26 @@ App::$strings["Uncertain"] = "Onzeker";
App::$strings["It's complicated"] = "Het is ingewikkeld";
App::$strings["Don't care"] = "Maakt mij niks uit";
App::$strings["Ask me"] = "Vraag het me";
-App::$strings["Unable to obtain identity information from database"] = "Niet in staat om identiteitsinformatie uit de database te verkrijgen";
-App::$strings["Empty name"] = "Ontbrekende naam";
-App::$strings["Name too long"] = "Naam te lang";
-App::$strings["No account identifier"] = "Geen account-identificator";
-App::$strings["Nickname is required."] = "Bijnaam is verplicht";
-App::$strings["Reserved nickname. Please choose another."] = "Deze naam is gereserveerd. Kies een andere.";
-App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
-App::$strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
-App::$strings["Default Profile"] = "Standaardprofiel";
-App::$strings["Create New Profile"] = "Nieuw profiel aanmaken";
-App::$strings["Visible to everybody"] = "Voor iedereen zichtbaar";
-App::$strings["Gender:"] = "Geslacht:";
-App::$strings["Homepage:"] = "Homepagina:";
-App::$strings["Online Now"] = "Nu online";
-App::$strings["Like this channel"] = "Vind dit kanaal leuk";
-App::$strings["j F, Y"] = "F j Y";
-App::$strings["j F"] = "F j";
-App::$strings["Birthday:"] = "Geboortedatum:";
-App::$strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
-App::$strings["Sexual Preference:"] = "Seksuele voorkeur:";
-App::$strings["Tags:"] = "Tags:";
-App::$strings["Political Views:"] = "Politieke overtuigingen:";
-App::$strings["Religion:"] = "Religie:";
-App::$strings["Hobbies/Interests:"] = "Hobby's/interesses:";
-App::$strings["Likes:"] = "Houdt van:";
-App::$strings["Dislikes:"] = "Houdt niet van:";
-App::$strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
-App::$strings["My other channels:"] = "Mijn andere kanalen";
-App::$strings["Musical interests:"] = "Muzikale interesses:";
-App::$strings["Books, literature:"] = "Boeken, literatuur:";
-App::$strings["Television:"] = "Televisie:";
-App::$strings["Film/dance/culture/entertainment:"] = "Films/dansen/cultuur/vermaak:";
-App::$strings["Love/Romance:"] = "Liefde/romantiek:";
-App::$strings["Work/employment:"] = "Werk/beroep:";
-App::$strings["School/education:"] = "School/opleiding:";
-App::$strings["Like this thing"] = "Vind dit ding leuk";
+App::$strings["Who can see this?"] = "Wie kan dit zien?";
+App::$strings["Custom selection"] = "Handmatige selectie";
+App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\".";
+App::$strings["Show"] = "Tonen";
+App::$strings["Don't show"] = "Niet tonen";
+App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien.";
+App::$strings["Image/photo"] = "Afbeelding/foto";
+App::$strings["Encrypted content"] = "Versleutelde inhoud";
+App::$strings["Install %s element: "] = "Installeer %s-element: ";
+App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
+App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
+App::$strings["spoiler"] = "spoiler";
+App::$strings["$1 wrote:"] = "$1 schreef:";
+App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
App::$strings["New window"] = "Nieuw venster";
App::$strings["Open the selected location in a different window or browser tab"] = "Open de geselecteerde locatie in een ander venster of tab";
-App::$strings["User '%s' deleted"] = "Account '%s' verwijderd";
-App::$strings["Directory Options"] = "Opties kanalengids";
-App::$strings["Safe Mode"] = "Veilig zoeken";
-App::$strings["Public Forums Only"] = "Alleen openbare forums";
-App::$strings["This Website Only"] = "Alleen deze hub";
-App::$strings["Logout"] = "Uitloggen";
-App::$strings["End this session"] = "Beëindig deze sessie";
-App::$strings["Your posts and conversations"] = "Jouw kanaal";
-App::$strings["Your profile page"] = "Jouw profielpagina";
-App::$strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
-App::$strings["Edit your profile"] = "Jouw profiel bewerken";
-App::$strings["Your photos"] = "Jouw foto's";
-App::$strings["Your files"] = "Jouw bestanden";
-App::$strings["Your chatrooms"] = "Jouw chatkanalen";
-App::$strings["Bookmarks"] = "Bladwijzers";
-App::$strings["Your bookmarks"] = "Jouw bladwijzers";
-App::$strings["Your webpages"] = "Jouw webpagina's";
-App::$strings["Your wikis"] = "Jouw wiki's";
-App::$strings["Sign in"] = "Inloggen";
-App::$strings["Remote authentication"] = "Authenticatie op afstand";
-App::$strings["Click to authenticate to your home hub"] = "Authenticeer jezelf via (bijvoorbeeld) jouw hub";
-App::$strings["Get me home"] = "Terug naar mijn hub";
-App::$strings["Log me out of this site"] = "Uitloggen op deze hub";
-App::$strings["Create an account"] = "Maak een account aan";
-App::$strings["Help and documentation"] = "Hulp en documentatie";
-App::$strings["Applications, utilities, links, games"] = "Apps";
-App::$strings["Search site @name, #tag, ?docs, content"] = "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie ";
-App::$strings["Channel Directory"] = "Kanalengids";
-App::$strings["Your grid"] = "Jouw grid";
-App::$strings["Mark all grid notifications seen"] = "Markeer alle gridnotificaties als bekeken";
-App::$strings["Channel home"] = "Jouw kanaal";
-App::$strings["Mark all channel notifications seen"] = "Alle kanaalnotificaties als gelezen markeren";
-App::$strings["Notices"] = "Notificaties";
-App::$strings["Notifications"] = "Notificaties";
-App::$strings["See all notifications"] = "Alle notificaties weergeven";
-App::$strings["Private mail"] = "Privéberichten";
-App::$strings["See all private messages"] = "Alle privéberichten weergeven";
-App::$strings["Mark all private messages seen"] = "Markeer alle privéberichten als bekeken";
-App::$strings["Inbox"] = "Postvak IN";
-App::$strings["Outbox"] = "Postvak UIT";
-App::$strings["New Message"] = "Nieuw bericht";
-App::$strings["Event Calendar"] = "Agenda";
-App::$strings["See all events"] = "Alle gebeurtenissen weergeven";
-App::$strings["Mark all events seen"] = "Markeer alle gebeurtenissen als bekeken";
-App::$strings["Manage Your Channels"] = "Beheer je kanalen";
-App::$strings["Account/Channel Settings"] = "Account-/kanaal-instellingen";
-App::$strings["Admin"] = "Beheer";
-App::$strings["Site Setup and Configuration"] = "Hub instellen en beheren";
-App::$strings["Loading..."] = "Aan het laden...";
-App::$strings["@name, #tag, ?doc, content"] = "@kanaal, #tag, inhoud, ?hulp";
-App::$strings["Please wait..."] = "Wachten aub...";
-App::$strings["General Features"] = "Algemene functies";
-App::$strings["Multiple Profiles"] = "Meerdere profielen";
-App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
-App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
-App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
-App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
-App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
-App::$strings["Web Pages"] = "Webpagina's";
-App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
-App::$strings["Provide a wiki for your channel"] = "Voeg een wiki aan jouw kanaal toe";
-App::$strings["Private Notes"] = "Privé-aantekeningen";
-App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
-App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
-App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
-App::$strings["Photo Location"] = "Fotolocatie";
-App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
-App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
-App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
-App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
-App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
-App::$strings["Advanced Directory Search"] = "Geavanceerd in de kanalengids zoeken";
-App::$strings["Allows creation of complex directory search queries"] = "Gebruik complexe zoekopdrachten in de kanalengids";
-App::$strings["Advanced Theme and Layout Settings"] = "Geavanceerde thema- en lay-out-instellingen";
-App::$strings["Allows fine tuning of themes and page layouts"] = "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden ";
-App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
-App::$strings["Large Photos"] = "Grote foto's";
-App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
-App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
-App::$strings["Even More Encryption"] = "Extra encryptie";
-App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
-App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
-App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
-App::$strings["Disable Comments"] = "Reacties uitschakelen";
-App::$strings["Provide the option to disable comments for a post"] = "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld";
-App::$strings["Delayed Posting"] = "Berichten uitstellen";
-App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
-App::$strings["Content Expiration"] = "Inhoud laten verlopen";
-App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
-App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
-App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
-App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
-App::$strings["Search by Date"] = "Zoek op datum";
-App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
-App::$strings["Privacy Groups"] = "Privacygroepen";
-App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
-App::$strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
-App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
-App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
-App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
-App::$strings["Network New Tab"] = "Nieuwe netwerktab";
-App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
-App::$strings["Affinity Tool"] = "Verwantschapsfilter";
-App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
-App::$strings["Show friend and connection suggestions"] = "Toon kanaalvoorstellen";
-App::$strings["Connection Filtering"] = "Berichtenfilters";
-App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
-App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
-App::$strings["Community Tagging"] = "Taggen door anderen";
-App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
-App::$strings["Post Categories"] = "Categorieën berichten";
-App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
-App::$strings["Emoji Reactions"] = "Emoji-reacties";
-App::$strings["Add emoji reaction ability to posts"] = "Emoji-reacties in berichten toestaan";
-App::$strings["Saved Folders"] = "Bewaarde mappen";
-App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
-App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
-App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
-App::$strings["Star Posts"] = "Geef berichten een ster";
-App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
-App::$strings["Tag Cloud"] = "Tagwolk";
-App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
-App::$strings["Premium Channel"] = "Premiumkanaal";
-App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
-App::$strings["Attachments:"] = "Bijlagen:";
-App::$strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
-App::$strings["\$Projectname event notification:"] = "Notificatie \$Projectname-gebeurtenis:";
-App::$strings["Starts:"] = "Start:";
-App::$strings["Finishes:"] = "Einde:";
-App::$strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
App::$strings["Help:"] = "Hulp:";
App::$strings["Not Found"] = "Niet gevonden";
-App::$strings["Different viewers will see this text differently"] = "Deze tekst wordt per persoon anders weergeven.";
-App::$strings["Invalid data packet"] = "Datapakket ongeldig";
-App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
-App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
-App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
App::$strings["New Page"] = "Nieuwe pagina";
-App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
-App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
-App::$strings["[no subject]"] = "[geen onderwerp]";
-App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
App::$strings["%d invitation available"] = array(
0 => "%d uitnodiging beschikbaar",
1 => "%d uitnodigingen beschikbaar",
@@ -2602,8 +2588,6 @@ App::$strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morg
App::$strings["Random Profile"] = "Willekeurig profiel";
App::$strings["Invite Friends"] = "Vrienden uitnodigen";
App::$strings["Advanced example: name=fred and country=iceland"] = "Geavanceerd voorbeeld (Engels): name=jan en country=nederland";
-App::$strings["Everything"] = "Alles";
-App::$strings["Categories"] = "Categorieën";
App::$strings["%d connection in common"] = array(
0 => "%d gemeenschappelijke connectie",
1 => "%d gemeenschappelijke connecties",
@@ -2622,7 +2606,7 @@ App::$strings["Notice: Permissions have changed but have not yet been submitted.
App::$strings["close all"] = "Alles sluiten";
App::$strings["Nothing new here"] = "Niets nieuw hier";
App::$strings["Rate This Channel (this is public)"] = "Beoordeel dit kanaal (dit is openbaar)";
-App::$strings["Describe (optional)"] = "Omschrijving (optioneel)";
+App::$strings["Describe (optional)"] = "Omschrijving (niet verplicht)";
App::$strings["Please enter a link URL"] = "Vul een URL in:";
App::$strings["Unsaved changes. Are you sure you wish to leave this page?"] = "Niet opgeslagen wijzigingen. Ben je er zeker van dat je deze pagina wil verlaten?";
App::$strings["timeago.prefixAgo"] = "timeago.prefixAgo";
@@ -2685,214 +2669,10 @@ App::$strings["__ctx:calendar__ month"] = "maand";
App::$strings["__ctx:calendar__ week"] = "week";
App::$strings["__ctx:calendar__ day"] = "dag";
App::$strings["__ctx:calendar__ All day"] = "hele dag";
-App::$strings["Tags"] = "Tags";
-App::$strings["Keywords"] = "Trefwoorden";
-App::$strings["have"] = "heb";
-App::$strings["has"] = "heeft";
-App::$strings["want"] = "wil";
-App::$strings["wants"] = "wil";
-App::$strings["likes"] = "vindt dit leuk";
-App::$strings["dislikes"] = "vindt dit niet leuk";
-App::$strings["prev"] = "vorige";
-App::$strings["first"] = "eerste";
-App::$strings["last"] = "laatste";
-App::$strings["next"] = "volgende";
-App::$strings["older"] = "ouder";
-App::$strings["newer"] = "nieuwer";
-App::$strings["No connections"] = "Geen connecties";
-App::$strings["View all %s connections"] = "Toon alle %s connecties";
-App::$strings["poke"] = "aanstoten";
-App::$strings["poked"] = "aangestoten";
-App::$strings["ping"] = "ping";
-App::$strings["pinged"] = "gepingd";
-App::$strings["prod"] = "por";
-App::$strings["prodded"] = "gepord";
-App::$strings["slap"] = "slaan";
-App::$strings["slapped"] = "sloeg";
-App::$strings["finger"] = "finger";
-App::$strings["fingered"] = "gefingerd";
-App::$strings["rebuff"] = "afpoeieren";
-App::$strings["rebuffed"] = "afgepoeierd";
-App::$strings["happy"] = "gelukkig";
-App::$strings["sad"] = "bedroefd";
-App::$strings["mellow"] = "mellow";
-App::$strings["tired"] = "moe";
-App::$strings["perky"] = "parmantig";
-App::$strings["angry"] = "boos";
-App::$strings["stupefied"] = "verbijsterd";
-App::$strings["puzzled"] = "verward";
-App::$strings["interested"] = "geïnteresseerd";
-App::$strings["bitter"] = "verbitterd";
-App::$strings["cheerful"] = "vrolijk";
-App::$strings["alive"] = "levendig";
-App::$strings["annoyed"] = "geërgerd";
-App::$strings["anxious"] = "bezorgd";
-App::$strings["cranky"] = "humeurig";
-App::$strings["disturbed"] = "verontrust";
-App::$strings["frustrated"] = "gefrustreerd ";
-App::$strings["depressed"] = "gedeprimeerd";
-App::$strings["motivated"] = "gemotiveerd";
-App::$strings["relaxed"] = "ontspannen";
-App::$strings["surprised"] = "verrast";
-App::$strings["May"] = "mei";
-App::$strings["Unknown Attachment"] = "Onbekende bijlage";
-App::$strings["unknown"] = "onbekend";
-App::$strings["remove category"] = "categorie verwijderen";
-App::$strings["remove from file"] = "uit map verwijderen";
-App::$strings["default"] = "standaard";
-App::$strings["Page layout"] = "Pagina-lay-out";
-App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
-App::$strings["Page content type"] = "Opmaaktype";
-App::$strings["activity"] = "activiteit";
-App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
-App::$strings["Pages"] = "Pagina's";
-App::$strings["Import website..."] = "Website importeren...";
-App::$strings["Select folder to import"] = "Kies een map om te importeren";
-App::$strings["Import from a zipped folder:"] = "Vanuit een zipbestand importeren:";
-App::$strings["Import from cloud files:"] = "Vanuit de cloud importeren:";
-App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/maplocatie";
-App::$strings["Enter path to website files"] = "Voer de locatie in van de websitebestanden";
-App::$strings["Select folder"] = "Kies een map";
-App::$strings["Export website..."] = "Website exporteren...";
-App::$strings["Export to a zip file"] = "Naar een zipbestand exporteren";
-App::$strings["website.zip"] = "website.zip";
-App::$strings["Enter a name for the zip file."] = "Vul een naam in voor het zipbestand.";
-App::$strings["Export to cloud files"] = "Naar de cloud exporteren";
-App::$strings["/path/to/export/folder"] = "/locatie/van/export/map";
-App::$strings["Enter a path to a cloud files destination."] = "Voer de locatie in van de cloudbestemming";
-App::$strings["Specify folder"] = "Selecteer een map";
-App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
-App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
-App::$strings["Unable to import element \""] = "Niet in staat om dit element te importeren: \"";
-App::$strings["guest:"] = "gast:";
-App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
-App::$strings["(Unknown)"] = "(Onbekend)";
-App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
-App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
-App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
-App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
-App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
-App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
-App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
-App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
-App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
-App::$strings["Privacy group: %s"] = "Privacygroep: %s";
-App::$strings["Connection not found."] = "Connectie niet gevonden.";
-App::$strings["profile photo"] = "profielfoto";
-App::$strings["[Edited %s]"] = "[%s bewerkt]";
-App::$strings["__ctx:edit_activity__ Post"] = "Bericht";
-App::$strings["__ctx:edit_activity__ Comment"] = "Reactie";
-App::$strings["Logged out."] = "Uitgelogd.";
-App::$strings["Failed authentication"] = "Mislukte authenticatie";
-App::$strings[" and "] = " en ";
-App::$strings["public profile"] = "openbaar profiel";
-App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
-App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
-App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
-App::$strings["Item was not found."] = "Item niet gevonden";
-App::$strings["No source file."] = "Geen bronbestand.";
-App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
-App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
-App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
-App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
-App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
-App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
-App::$strings["Path not available."] = "Locatie niet beschikbaar.";
-App::$strings["Empty pathname"] = "Ontbrekende locatienaam";
-App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of locatie";
-App::$strings["Path not found."] = "Locatie niet gevonden";
-App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
-App::$strings["database storage failed."] = "opslag in database mislukt.";
-App::$strings["Empty path"] = "Ontbrekende locatie";
-App::$strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
-App::$strings["Not specified"] = "Niet aangegeven";
-App::$strings["Needs Action"] = "Actie vereist";
-App::$strings["Completed"] = "Voltooid";
-App::$strings["In Process"] = "In behandeling";
-App::$strings["Cancelled"] = "Geannuleerd";
-App::$strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
-App::$strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
-App::$strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
-App::$strings["Channel was deleted and no longer exists."] = "Kanaal is verwijderd en bestaat niet meer.";
-App::$strings["Protocol disabled."] = "Protocol uitgeschakeld.";
-App::$strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
-App::$strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
-App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
-App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
-App::$strings["edit"] = "bewerken";
-App::$strings["Edit group"] = "Privacygroep bewerken";
-App::$strings["Add privacy group"] = "Privacygroep toevoegen";
-App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
-App::$strings["add"] = "toevoegen";
-App::$strings["Select an alternate language"] = "Kies een andere taal";
-App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
-App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
-App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
-App::$strings["a new photo"] = "een nieuwe foto";
-App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
-App::$strings["Photo Albums"] = "Fotoalbums";
-App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
-App::$strings["Who can see this?"] = "Wie kan dit zien?";
-App::$strings["Custom selection"] = "Handmatige selectie";
-App::$strings["Select \"Show\" to allow viewing. \"Don't show\" lets you override and limit the scope of \"Show\"."] = "Kies \"Tonen\" om weergave toe te staan. Met \"Niet tonen\" kan je uitzonderingen maken op \"Tonen\".";
-App::$strings["Show"] = "Tonen";
-App::$strings["Don't show"] = "Niet tonen";
-App::$strings["Post permissions %s cannot be changed %s after a post is shared.</br />These permissions set who is allowed to view the post."] = "Permissies van berichten %s zijn niet meer te veranderen %s nadat een bericht is gedeeld.</br />Met deze permissies bepaal je wie het bericht kan zien.";
-App::$strings[" by "] = " door ";
-App::$strings[" on "] = " op ";
-App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
-App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
-App::$strings["System"] = "Systeem";
-App::$strings["New App"] = "Nieuwe app";
-App::$strings["Suggestions"] = "Voorgestelde kanalen";
-App::$strings["See more..."] = "Meer...";
-App::$strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
-App::$strings["Add New Connection"] = "Nieuwe connectie toevoegen";
-App::$strings["Enter channel address"] = "Vul kanaaladres in";
-App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Voorbeelden: bob@example.com, http://example.com/barbara";
-App::$strings["Notes"] = "Aantekeningen";
-App::$strings["Remove term"] = "Verwijder zoekterm";
-App::$strings["Archives"] = "Archieven";
-App::$strings["Refresh"] = "Vernieuwen";
-App::$strings["Account settings"] = "Account";
-App::$strings["Channel settings"] = "Kanaal";
-App::$strings["Additional features"] = "Extra functies";
-App::$strings["Feature/Addon settings"] = "Plugin-instellingen";
-App::$strings["Display settings"] = "Weergave";
-App::$strings["Manage locations"] = "Locaties beheren";
-App::$strings["Export channel"] = "Kanaal exporteren";
-App::$strings["Connected apps"] = "Verbonden applicaties";
-App::$strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
-App::$strings["Private Mail Menu"] = "Privéberichten";
-App::$strings["Combined View"] = "Gecombineerd postvak";
-App::$strings["Conversations"] = "Conversaties";
-App::$strings["Received Messages"] = "Ontvangen berichten";
-App::$strings["Sent Messages"] = "Verzonden berichten";
-App::$strings["No messages."] = "Geen berichten";
-App::$strings["Delete conversation"] = "Verwijder conversatie";
-App::$strings["Events Tools"] = "Agenda-hulpmiddelen";
-App::$strings["Export Calendar"] = "Exporteren";
-App::$strings["Import Calendar"] = "Importeren";
-App::$strings["Chatrooms"] = "Chatkanalen";
-App::$strings["Overview"] = "Overzicht";
-App::$strings["Chat Members"] = "Chatleden";
-App::$strings["Wiki List"] = "Wiki's";
-App::$strings["Wiki Pages"] = "Wikipagina's";
-App::$strings["Add new page"] = "Nieuwe pagina toevoegen";
-App::$strings["Page name"] = "Paginanaam";
-App::$strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
-App::$strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
-App::$strings["photo/image"] = "foto/afbeelding";
-App::$strings["Click to show more"] = "Klik voor meer";
-App::$strings["Rating Tools"] = "Beoordelingen";
-App::$strings["Rate Me"] = "Beoordeel mij";
-App::$strings["View Ratings"] = "Bekijk beoordelingen";
-App::$strings["Forums"] = "Forums";
-App::$strings["Tasks"] = "Taken";
-App::$strings["Member registrations waiting for confirmation"] = "Accounts die op goedkeuring wachten";
-App::$strings["Inspect queue"] = "Inspecteer berichtenwachtrij";
-App::$strings["DB updates"] = "Database-updates";
-App::$strings["Plugin Features"] = "Plugin-opties";
+App::$strings["Directory Options"] = "Opties kanalengids";
+App::$strings["Safe Mode"] = "Veilig zoeken";
+App::$strings["Public Forums Only"] = "Alleen openbare forums";
+App::$strings["This Website Only"] = "Alleen deze hub";
App::$strings["view full size"] = "volledige grootte tonen";
App::$strings["No Subject"] = "Geen onderwerp";
App::$strings["OStatus"] = "OStatus";
@@ -2903,26 +2683,15 @@ App::$strings["Zot"] = "Zot";
App::$strings["LinkedIn"] = "LinkedIn";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
-App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
-App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
-App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
-App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
-App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
-App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
-App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
-App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s is nu met %2\$s verbonden";
App::$strings["%1\$s poked %2\$s"] = "%1\$s heeft %2\$s aangestoten";
+App::$strings["poked"] = "aangestoten";
App::$strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
App::$strings["Categories:"] = "Categorieën:";
App::$strings["Filed under:"] = "Bewaard onder:";
App::$strings["View in context"] = "In context bekijken";
App::$strings["remove"] = "verwijderen";
+App::$strings["Loading..."] = "Aan het laden...";
App::$strings["Delete Selected Items"] = "Verwijder de geselecteerde items";
App::$strings["View Source"] = "Bron weergeven";
App::$strings["Follow Thread"] = "Conversatie volgen";
@@ -2959,7 +2728,7 @@ App::$strings["Post as"] = "Bericht plaatsen als";
App::$strings["Toggle voting"] = "Peiling in- of uitschakelen";
App::$strings["Disable comments"] = "Reacties uitschakelen";
App::$strings["Toggle comments"] = "Reacties in- of uitschakelen";
-App::$strings["Categories (optional, comma-separated list)"] = "Categorieën (optioneel, door komma's gescheiden lijst)";
+App::$strings["Categories (optional, comma-separated list)"] = "Categorieën (niet verplicht, door komma's gescheiden lijst)";
App::$strings["Other networks and post services"] = "Andere netwerken en diensten";
App::$strings["Set publish date"] = "Publicatiedatum instellen";
App::$strings["Discover"] = "Ontdekken";
@@ -2976,9 +2745,11 @@ App::$strings["Spam"] = "Spam";
App::$strings["Posts flagged as SPAM"] = "Berichten gemarkeerd als SPAM";
App::$strings["Status Messages and Posts"] = "Berichten in dit kanaal";
App::$strings["Profile Details"] = "Profiel";
+App::$strings["Photo Albums"] = "Fotoalbums";
App::$strings["Files and Storage"] = "Bestanden en opslagruimte";
+App::$strings["Bookmarks"] = "Bladwijzers";
App::$strings["Saved Bookmarks"] = "Opgeslagen bladwijzers";
-App::$strings["Manage Webpages"] = "Webpagina's beheren";
+App::$strings["View Webpages"] = "Webpagina's weergeven";
App::$strings["__ctx:noun__ Attending"] = array(
0 => "aanwezig",
1 => "aanwezig",
@@ -3003,14 +2774,309 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "onthouding",
1 => "onthoudingen",
);
-App::$strings["Image/photo"] = "Afbeelding/foto";
-App::$strings["Encrypted content"] = "Versleutelde inhoud";
-App::$strings["Install %s element: "] = "Installeer %s-element: ";
-App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dit bericht heeft een te installeren %s-element, maar je hebt geen permissies om het op deze hub te installeren.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
-App::$strings["Click to open/close"] = "Klik om te openen of te sluiten";
-App::$strings["spoiler"] = "spoiler";
-App::$strings["$1 wrote:"] = "$1 schreef:";
+App::$strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande itemrechten <strong>kunnen</strong> van toepassing zijn op deze collectie en toekomstige leden. Wanneer je dit niet zo bedoeld hebt, moet je een nieuwe collectie met een andere naam aanmaken.";
+App::$strings["Add new connections to this privacy group"] = "Voeg nieuwe connecties aan deze privacygroep toe";
+App::$strings["edit"] = "bewerken";
+App::$strings["Privacy Groups"] = "Privacygroepen";
+App::$strings["Edit group"] = "Privacygroep bewerken";
+App::$strings["Add privacy group"] = "Privacygroep toevoegen";
+App::$strings["Channels not in any privacy group"] = "Kanalen die zich in geen enkele privacygroep bevinden";
+App::$strings["(Unknown)"] = "(Onbekend)";
+App::$strings["Visible to anybody on the internet."] = "Voor iedereen op het internet zichtbaar.";
+App::$strings["Visible to you only."] = "Alleen voor jou zichtbaar.";
+App::$strings["Visible to anybody in this network."] = "Voor iedereen in dit netwerk zichtbaar.";
+App::$strings["Visible to anybody authenticated."] = "Voor iedereen die geauthenticeerd is zichtbaar.";
+App::$strings["Visible to anybody on %s."] = "Voor iedereen op %s zichtbaar.";
+App::$strings["Visible to all connections."] = "Voor alle connecties zichtbaar.";
+App::$strings["Visible to approved connections."] = "Voor alle geaccepteerde connecties zichtbaar.";
+App::$strings["Visible to specific connections."] = "Voor specifieke connecties zichtbaar.";
+App::$strings["Privacy group is empty."] = "Privacygroep is leeg";
+App::$strings["Privacy group: %s"] = "Privacygroep: %s";
+App::$strings["Connection not found."] = "Connectie niet gevonden.";
+App::$strings["profile photo"] = "profielfoto";
+App::$strings["[Edited %s]"] = "[%s bewerkt]";
+App::$strings["__ctx:edit_activity__ Post"] = "Bericht";
+App::$strings["__ctx:edit_activity__ Comment"] = "Reactie";
+App::$strings["Attachments:"] = "Bijlagen:";
+App::$strings["\$Projectname event notification:"] = "Notificatie \$Projectname-gebeurtenis:";
+App::$strings["guest:"] = "gast:";
+App::$strings["The form security token was not correct. This probably happened because the form has been opened for too long (>3 hours) before submitting it."] = "De beveiligings-token van het tekstvak was ongeldig. Dit is mogelijk het gevolg van dat er te lang (meer dan 3 uur) gewacht is om de tekst op te slaan. ";
+App::$strings["Remote authentication"] = "Authenticatie op afstand";
+App::$strings["Click to authenticate to your home hub"] = "Authenticeer jezelf via (bijvoorbeeld) jouw hub";
+App::$strings["Logout"] = "Uitloggen";
+App::$strings["End this session"] = "Beëindig deze sessie";
+App::$strings["Your profile page"] = "Jouw profielpagina";
+App::$strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
+App::$strings["Edit your profile"] = "Jouw profiel bewerken";
+App::$strings["Sign in"] = "Inloggen";
+App::$strings["Get me home"] = "Terug naar mijn hub";
+App::$strings["Log me out of this site"] = "Uitloggen op deze hub";
+App::$strings["Create an account"] = "Maak een account aan";
+App::$strings["Help and documentation"] = "Hulp en documentatie";
+App::$strings["Applications, utilities, links, games"] = "Apps";
+App::$strings["Search site @name, #tag, ?docs, content"] = "Zoek een @kanaal, doorzoek inhoud hub met tekst en #tags, of doorzoek ?documentatie ";
+App::$strings["Channel Directory"] = "Kanalengids";
+App::$strings["Your grid"] = "Jouw grid";
+App::$strings["View your network/grid"] = "Jouw grid/netwerk weergeven";
+App::$strings["Mark all grid notifications seen"] = "Markeer alle gridnotificaties als bekeken";
+App::$strings["Channel home"] = "Jouw kanaal";
+App::$strings["View your channel home"] = "Jouw kanaal weergeven";
+App::$strings["Mark all channel notifications seen"] = "Alle kanaalnotificaties als gelezen markeren";
+App::$strings["Notices"] = "Notificaties";
+App::$strings["Notifications"] = "Notificaties";
+App::$strings["View all notifications"] = "Alle notificaties weergeven";
+App::$strings["Private mail"] = "Privéberichten";
+App::$strings["View your private messages"] = "Privéberichten weergeven";
+App::$strings["Mark all private messages seen"] = "Markeer alle privéberichten als bekeken";
+App::$strings["Event Calendar"] = "Agenda";
+App::$strings["View events"] = "Agenda weergeven";
+App::$strings["Mark all events seen"] = "Markeer alle gebeurtenissen als bekeken";
+App::$strings["Manage Your Channels"] = "Beheer je kanalen";
+App::$strings["Account/Channel Settings"] = "Account-/kanaal-instellingen";
+App::$strings["Site Setup and Configuration"] = "Hub instellen en beheren";
+App::$strings["@name, #tag, ?doc, content"] = "@kanaal, #tag, inhoud, ?hulp";
+App::$strings["Please wait..."] = "Wachten aub...";
+App::$strings["Add Apps"] = "Apps toevoegen";
+App::$strings["Item was not found."] = "Item niet gevonden";
+App::$strings["No source file."] = "Geen bronbestand.";
+App::$strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
+App::$strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
+App::$strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
+App::$strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
+App::$strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
+App::$strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
+App::$strings["Path not available."] = "Locatie niet beschikbaar.";
+App::$strings["Empty pathname"] = "Ontbrekende locatienaam";
+App::$strings["duplicate filename or path"] = "dubbele bestandsnaam of locatie";
+App::$strings["Path not found."] = "Locatie niet gevonden";
+App::$strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
+App::$strings["database storage failed."] = "opslag in database mislukt.";
+App::$strings["Empty path"] = "Ontbrekende locatie";
+App::$strings["prev"] = "vorige";
+App::$strings["first"] = "eerste";
+App::$strings["last"] = "laatste";
+App::$strings["next"] = "volgende";
+App::$strings["older"] = "ouder";
+App::$strings["newer"] = "nieuwer";
+App::$strings["No connections"] = "Geen connecties";
+App::$strings["View all %s connections"] = "Toon alle %s connecties";
+App::$strings["poke"] = "aanstoten";
+App::$strings["ping"] = "ping";
+App::$strings["pinged"] = "gepingd";
+App::$strings["prod"] = "por";
+App::$strings["prodded"] = "gepord";
+App::$strings["slap"] = "slaan";
+App::$strings["slapped"] = "sloeg";
+App::$strings["finger"] = "finger";
+App::$strings["fingered"] = "gefingerd";
+App::$strings["rebuff"] = "afpoeieren";
+App::$strings["rebuffed"] = "afgepoeierd";
+App::$strings["happy"] = "gelukkig";
+App::$strings["sad"] = "bedroefd";
+App::$strings["mellow"] = "mellow";
+App::$strings["tired"] = "moe";
+App::$strings["perky"] = "parmantig";
+App::$strings["angry"] = "boos";
+App::$strings["stupefied"] = "verbijsterd";
+App::$strings["puzzled"] = "verward";
+App::$strings["interested"] = "geïnteresseerd";
+App::$strings["bitter"] = "verbitterd";
+App::$strings["cheerful"] = "vrolijk";
+App::$strings["alive"] = "levendig";
+App::$strings["annoyed"] = "geërgerd";
+App::$strings["anxious"] = "bezorgd";
+App::$strings["cranky"] = "humeurig";
+App::$strings["disturbed"] = "verontrust";
+App::$strings["frustrated"] = "gefrustreerd ";
+App::$strings["depressed"] = "gedeprimeerd";
+App::$strings["motivated"] = "gemotiveerd";
+App::$strings["relaxed"] = "ontspannen";
+App::$strings["surprised"] = "verrast";
+App::$strings["May"] = "mei";
+App::$strings["Unknown Attachment"] = "Onbekende bijlage";
+App::$strings["unknown"] = "onbekend";
+App::$strings["remove category"] = "categorie verwijderen";
+App::$strings["remove from file"] = "uit map verwijderen";
+App::$strings["Page layout"] = "Pagina-lay-out";
+App::$strings["You can create your own with the layouts tool"] = "Je kan jouw eigen lay-out ontwerpen onder lay-outs";
+App::$strings["Page content type"] = "Opmaaktype";
+App::$strings["activity"] = "activiteit";
+App::$strings["Design Tools"] = "Ontwerp-hulpmiddelen";
+App::$strings["Pages"] = "Pagina's";
+App::$strings["Import website..."] = "Website importeren...";
+App::$strings["Select folder to import"] = "Kies een map om te importeren";
+App::$strings["Import from a zipped folder:"] = "Vanuit een zipbestand importeren:";
+App::$strings["Import from cloud files:"] = "Vanuit de cloud importeren:";
+App::$strings["/cloud/channel/path/to/folder"] = "/cloud/channel/maplocatie";
+App::$strings["Enter path to website files"] = "Voer de locatie in van de websitebestanden";
+App::$strings["Select folder"] = "Kies een map";
+App::$strings["Export website..."] = "Website exporteren...";
+App::$strings["Export to a zip file"] = "Naar een zipbestand exporteren";
+App::$strings["website.zip"] = "website.zip";
+App::$strings["Enter a name for the zip file."] = "Vul een naam in voor het zipbestand.";
+App::$strings["Export to cloud files"] = "Naar de cloud exporteren";
+App::$strings["/path/to/export/folder"] = "/locatie/van/export/map";
+App::$strings["Enter a path to a cloud files destination."] = "Voer de locatie in van de cloudbestemming";
+App::$strings["Specify folder"] = "Selecteer een map";
+App::$strings["Logged out."] = "Uitgelogd.";
+App::$strings["Failed authentication"] = "Mislukte authenticatie";
+App::$strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
+App::$strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
+App::$strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
+App::$strings["Channel was deleted and no longer exists."] = "Kanaal is verwijderd en bestaat niet meer.";
+App::$strings["Protocol disabled."] = "Protocol uitgeschakeld.";
+App::$strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
+App::$strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
+App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan geen dubbele kanaal-identificator op deze hub aanmaken. Importeren mislukt.";
+App::$strings["Channel clone failed. Import failed."] = "Het klonen van het kanaal is mislukt. Importeren mislukt.";
+App::$strings["Cloned channel not found. Import failed."] = "Gekloond kanaal niet gevonden. Importeren mislukt.";
+App::$strings["Unable to import element \""] = "Niet in staat om dit element te importeren: \"";
+App::$strings["Unable to determine sender."] = "Afzender kan niet bepaald worden.";
+App::$strings["No recipient provided."] = "Geen ontvanger opgegeven.";
+App::$strings["[no subject]"] = "[geen onderwerp]";
+App::$strings["Stored post could not be verified."] = "Opgeslagen bericht kon niet worden geverifieerd.";
+App::$strings[" by "] = " door ";
+App::$strings[" on "] = " op ";
+App::$strings["Embedded content"] = "Ingesloten (embedded) inhoud";
+App::$strings["Embedding disabled"] = "Insluiten (embedding) uitgeschakeld";
+App::$strings["Invalid data packet"] = "Datapakket ongeldig";
+App::$strings["Unable to verify channel signature"] = "Kanaalkenmerk kon niet worden geverifieerd. ";
+App::$strings["Unable to verify site signature for %s"] = "Hubkenmerk voor %s kon niet worden geverifieerd";
+App::$strings["invalid target signature"] = "ongeldig doelkenmerk";
+App::$strings["Can view my normal stream and posts"] = "Kan mijn normale kanaalstream en berichten bekijken";
+App::$strings["Can view my webpages"] = "Kan mijn pagina's bekijken";
+App::$strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal plaatsen";
+App::$strings["Can like/dislike stuff"] = "Kan dingen leuk of niet leuk vinden";
+App::$strings["Profiles and things other than posts/comments"] = "Profielen en dingen, buiten berichten en reacties";
+App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen+";
+App::$strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor groepforums";
+App::$strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
+App::$strings["Can write to my file storage and photos"] = "Kan foto's en andere bestanden aan mijn bestandsopslag toevoegen";
+App::$strings["Can edit my webpages"] = "Kan mijn pagina's bewerken";
+App::$strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
+App::$strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
+App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
+App::$strings[" and "] = " en ";
+App::$strings["public profile"] = "openbaar profiel";
+App::$strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
+App::$strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
+App::$strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
+App::$strings["General Features"] = "Algemene functies";
+App::$strings["Multiple Profiles"] = "Meerdere profielen";
+App::$strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
+App::$strings["Advanced Profiles"] = "Geavanceerde profielen";
+App::$strings["Additional profile sections and selections"] = "Extra onderdelen en keuzes voor je profiel";
+App::$strings["Profile Import/Export"] = "Profiel importen/exporteren";
+App::$strings["Save and load profile details across sites/channels"] = "Profielgegevens opslaan en in andere hubs/kanalen gebruiken.";
+App::$strings["Web Pages"] = "Webpagina's";
+App::$strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
+App::$strings["Provide a wiki for your channel"] = "Voeg een wiki aan jouw kanaal toe";
+App::$strings["Private Notes"] = "Privé-aantekeningen";
+App::$strings["Enables a tool to store notes and reminders (note: not encrypted)"] = "Een eenvoudige toepassing om aantekeningen en herinneringen in te bewaren (let op: niet versleuteld)";
+App::$strings["Navigation Channel Select"] = "Kanaal kiezen in navigatiemenu";
+App::$strings["Change channels directly from within the navigation dropdown menu"] = "Kies een ander kanaal direct vanuit het dropdown-menu op de navigatiebalk";
+App::$strings["Photo Location"] = "Fotolocatie";
+App::$strings["If location data is available on uploaded photos, link this to a map."] = "Wanneer in de geüploade foto's locatiegegevens aanwezig zijn, link dit dan aan een kaart.";
+App::$strings["Access Controlled Chatrooms"] = "Chatkanalen met toegangscontrole ";
+App::$strings["Provide chatrooms and chat services with access control."] = "Chatkanalen en chatdiensten met toegangscontrole aanbieden.";
+App::$strings["Provide alternate connection permission roles."] = "Extra permissietypes voor connecties aanmaken";
+App::$strings["Smart Birthdays"] = "Slimme verjaardagen";
+App::$strings["Make birthday events timezone aware in case your friends are scattered across the planet."] = "Maak verjaardagen bewust van tijdzones. Voor het geval dat jouw vrienden over de hele wereld verspreid zijn.";
+App::$strings["Event Timezone Selection"] = "Tijdzone gebeurtenis";
+App::$strings["Allow event creation in timezones other than your own."] = "Sta het aanmaken van gebeurtenissen in andere tijdzones toe.";
+App::$strings["Advanced Directory Search"] = "Geavanceerd in de kanalengids zoeken";
+App::$strings["Allows creation of complex directory search queries"] = "Gebruik complexe zoekopdrachten in de kanalengids";
+App::$strings["Advanced Theme and Layout Settings"] = "Geavanceerde thema- en lay-out-instellingen";
+App::$strings["Allows fine tuning of themes and page layouts"] = "Maakt het mogelijk dat thema's en pagina-lay-outs preciezer ingesteld kunnen worden ";
+App::$strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
+App::$strings["Large Photos"] = "Grote foto's";
+App::$strings["Include large (1024px) photo thumbnails in posts. If not enabled, use small (640px) photo thumbnails"] = "Gebruik grotere foto's (1024px) in berichten. Wanneer dit is uitgeschakeld worden er kleinere foto's (640px) gebruikt.";
+App::$strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
+App::$strings["Even More Encryption"] = "Extra encryptie";
+App::$strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
+App::$strings["Enable Voting Tools"] = "Peilingen inschakelen";
+App::$strings["Provide a class of post which others can vote on"] = "Maakt het mogelijk om een bericht op te stellen, waar mensen op kunnen stemmen.";
+App::$strings["Disable Comments"] = "Reacties uitschakelen";
+App::$strings["Provide the option to disable comments for a post"] = "Maak het mogelijk dat reacties op een bericht kunnen worden uitgeschakeld";
+App::$strings["Delayed Posting"] = "Berichten uitstellen";
+App::$strings["Allow posts to be published at a later date"] = "Maakt het mogelijk dat berichten op een toekomstig moment gepubliceerd kunnen worden.";
+App::$strings["Content Expiration"] = "Inhoud laten verlopen";
+App::$strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
+App::$strings["Suppress Duplicate Posts/Comments"] = "Dubbele berichten/reacties tegenhouden";
+App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Voorkomt dat berichten en reacties met identieke inhoud en die binnen twee minuten zijn verstuurd, worden gepubliceerd. ";
+App::$strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
+App::$strings["Search by Date"] = "Zoek op datum";
+App::$strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
+App::$strings["Enable management and selection of privacy groups"] = "Beheer en selectie van privacygroepen inschakelen";
+App::$strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
+App::$strings["Network Personal Tab"] = "Persoonlijke netwerktab";
+App::$strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
+App::$strings["Network New Tab"] = "Nieuwe netwerktab";
+App::$strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
+App::$strings["Affinity Tool"] = "Affiniteitsfilter";
+App::$strings["Filter stream activity by depth of relationships"] = "Filter wat je in jouw grid ziet op hoe goed je iemand kent of mag";
+App::$strings["Show friend and connection suggestions"] = "Toon kanaalvoorstellen";
+App::$strings["Connection Filtering"] = "Berichtenfilters";
+App::$strings["Filter incoming posts from connections based on keywords/content"] = "Filter binnenkomende berichten van connecties aan de hand van trefwoorden en taal";
+App::$strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
+App::$strings["Community Tagging"] = "Taggen door anderen";
+App::$strings["Ability to tag existing posts"] = "Geeft andere mensen de mogelijkheid om jouw (bestaande) berichten te taggen";
+App::$strings["Post Categories"] = "Categorieën berichten";
+App::$strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
+App::$strings["Emoji Reactions"] = "Emoji-reacties";
+App::$strings["Add emoji reaction ability to posts"] = "Emoji-reacties in berichten toestaan";
+App::$strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
+App::$strings["Dislike Posts"] = "Vind berichten niet leuk";
+App::$strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
+App::$strings["Star Posts"] = "Geef berichten een ster";
+App::$strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
+App::$strings["Tag Cloud"] = "Tagwolk";
+App::$strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met tags op jouw kanaalpagina";
+App::$strings["Premium Channel"] = "Premiumkanaal";
+App::$strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
+App::$strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
+App::$strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
+App::$strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
+App::$strings["a new photo"] = "een nieuwe foto";
+App::$strings["__ctx:photo_upload__ %1\$s posted %2\$s to %3\$s"] = "%1\$s plaatste %2\$s op %3\$s";
+App::$strings["Upload New Photos"] = "Nieuwe foto's uploaden";
+App::$strings["Unable to obtain identity information from database"] = "Niet in staat om identiteitsinformatie uit de database te verkrijgen";
+App::$strings["Empty name"] = "Ontbrekende naam";
+App::$strings["Name too long"] = "Naam te lang";
+App::$strings["No account identifier"] = "Geen account-identificator";
+App::$strings["Nickname is required."] = "Bijnaam is verplicht";
+App::$strings["Reserved nickname. Please choose another."] = "Deze naam is gereserveerd. Kies een andere.";
+App::$strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
+App::$strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
+App::$strings["Default Profile"] = "Standaardprofiel";
+App::$strings["Create New Profile"] = "Nieuw profiel aanmaken";
+App::$strings["Visible to everybody"] = "Voor iedereen zichtbaar";
+App::$strings["Gender:"] = "Geslacht:";
+App::$strings["Homepage:"] = "Homepagina:";
+App::$strings["Online Now"] = "Nu online";
+App::$strings["Like this channel"] = "Vind dit kanaal leuk";
+App::$strings["j F, Y"] = "F j Y";
+App::$strings["j F"] = "F j";
+App::$strings["Birthday:"] = "Geboortedatum:";
+App::$strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
+App::$strings["Sexual Preference:"] = "Seksuele voorkeur:";
+App::$strings["Tags:"] = "Tags:";
+App::$strings["Political Views:"] = "Politieke overtuigingen:";
+App::$strings["Religion:"] = "Religie:";
+App::$strings["Hobbies/Interests:"] = "Hobby's/interesses:";
+App::$strings["Likes:"] = "Houdt van:";
+App::$strings["Dislikes:"] = "Houdt niet van:";
+App::$strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
+App::$strings["My other channels:"] = "Mijn andere kanalen";
+App::$strings["Musical interests:"] = "Muzikale interesses:";
+App::$strings["Books, literature:"] = "Boeken, literatuur:";
+App::$strings["Television:"] = "Televisie:";
+App::$strings["Film/dance/culture/entertainment:"] = "Films/dansen/cultuur/vermaak:";
+App::$strings["Love/Romance:"] = "Liefde/romantiek:";
+App::$strings["Work/employment:"] = "Werk/beroep:";
+App::$strings["School/education:"] = "School/opleiding:";
+App::$strings["Like this thing"] = "Vind dit ding leuk";
+App::$strings["User '%s' deleted"] = "Account '%s' verwijderd";
App::$strings["Source channel not found."] = "Bron van kanaal niet gevonden";
App::$strings["Focus (Hubzilla default)"] = "Focus (Hubzilla-standaard)";
App::$strings["Theme settings"] = "Thema-instellingen";
@@ -3045,11 +3111,9 @@ App::$strings["Left align page content"] = "Inhoud links uitlijnen";
App::$strings["Set minimum opacity of nav bar - to hide it"] = "Minimale ondoorzichtigheid navigatiebalk (- om te verbergen)";
App::$strings["Set size of conversation author photo"] = "Grootte profielfoto's van berichten instellen";
App::$strings["Set size of followup author photos"] = "Grootte profielfoto's van reacties instellen";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Zoek %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Update %s failed. See error logs."] = "Update %s mislukt. Zie foutenlogboek.";
App::$strings["Update Error at %s"] = "Update-fout op %s";
-App::$strings["Create an account to access services and applications within the Hubzilla"] = "Maak een account aan om toegang te krijgen tot diensten en toepassingen van Hubzilla";
+App::$strings["Create an account to access services and applications"] = "Maak een account aan om toegang te krijgen tot diensten en toepassingen";
App::$strings["Login/Email"] = "E-mailadres of inlognaam";
App::$strings["Password"] = "Wachtwoord";
App::$strings["Remember me"] = "Aangemeld blijven";
diff --git a/view/pdl/mod_apps.pdl b/view/pdl/mod_apps.pdl
index 32fef28e9..1209d85b9 100644
--- a/view/pdl/mod_apps.pdl
+++ b/view/pdl/mod_apps.pdl
@@ -1,4 +1,3 @@
[region=aside]
-[widget=appselect][/widget]
[widget=appcategories][/widget]
[/region]
diff --git a/view/php/default.php b/view/php/default.php
index 373fa2fd0..e4553a17f 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -8,14 +8,14 @@
<body <?php if($page['direction']) echo 'dir="rtl"' ?> >
<?php if(x($page,'banner')) echo $page['banner']; ?>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<main>
<aside id="region_1"><div id="left_aside_spacer"><div id="left_aside_wrapper"><?php if(x($page,'aside')) echo $page['aside']; ?></div></div></aside>
<section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
<div id="pause"></div>
</section>
- <aside id="region_3" class="hidden-sm hidden-xs hidden-md"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ <aside id="region_3" class="d-none d-xl-table-cell"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
</main>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
</body>
diff --git a/view/php/full.php b/view/php/full.php
index 9cf567a67..64e32c5bd 100644
--- a/view/php/full.php
+++ b/view/php/full.php
@@ -7,7 +7,7 @@
</head>
<body>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<section><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
</section>
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 85da4d782..869b97473 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -2,51 +2,45 @@
require_once('include/plugin.php');
-head_add_css('library/tiptip/tipTip.css');
-head_add_css('library/jgrowl/jquery.jgrowl.css');
-head_add_css('library/jRange/jquery.range.css');
+head_add_css('/library/tiptip/tipTip.css');
+head_add_css('/library/jgrowl/jquery.jgrowl.css');
+head_add_css('/library/jRange/jquery.range.css');
-head_add_css('view/css/conversation.css');
-head_add_css('view/css/widgets.css');
-head_add_css('view/css/colorbox.css');
-head_add_css('library/justifiedGallery/justifiedGallery.min.css');
-head_add_css('library/Text_Highlighter/sample.css');
+head_add_css('/view/css/conversation.css');
+head_add_css('/view/css/widgets.css');
+head_add_css('/view/css/colorbox.css');
+head_add_css('/library/justifiedGallery/justifiedGallery.min.css');
+head_add_css('/library/Text_Highlighter/sample.css');
head_add_js('jquery.js');
-//head_add_js('jquery.migrate-3.0.0.js');
-head_add_js('library/justifiedGallery/jquery.justifiedGallery.min.js');
-head_add_js('library/sprintf.js/dist/sprintf.min.js');
+head_add_js('/library/justifiedGallery/jquery.justifiedGallery.min.js');
+head_add_js('/library/sprintf.js/dist/sprintf.min.js');
-//head_add_js('jquery-compat.js');
head_add_js('spin.js');
head_add_js('jquery.spin.js');
head_add_js('jquery.textinputs.js');
head_add_js('autocomplete.js');
-head_add_js('library/jquery-textcomplete/jquery.textcomplete.js');
-//head_add_js('library/colorbox/jquery.colorbox.js');
-head_add_js('library/jquery.timeago.js');
-head_add_js('library/readmore.js/readmore.js');
-head_add_js('library/sticky-kit/sticky-kit.js');
-//head_add_js('library/jquery_ac/friendica.complete.js');
-//head_add_js('library/tiptip/jquery.tipTip.minified.js');
-head_add_js('library/jgrowl/jquery.jgrowl_minimized.js');
-//head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce.js');
-head_add_js('library/cryptojs/components/core-min.js');
-head_add_js('library/cryptojs/rollups/aes.js');
-head_add_js('library/cryptojs/rollups/rabbit.js');
-head_add_js('library/cryptojs/rollups/tripledes.js');
-//head_add_js('library/stylish_select/jquery.stylish-select.js');
+head_add_js('/library/jquery-textcomplete/jquery.textcomplete.js');
+
+head_add_js('/library/jquery.timeago.js');
+head_add_js('/library/readmore.js/readmore.js');
+head_add_js('/library/sticky-kit/sticky-kit.js');
+head_add_js('/library/jgrowl/jquery.jgrowl_minimized.js');
+head_add_js('/library/cryptojs/components/core-min.js');
+head_add_js('/library/cryptojs/rollups/aes.js');
+head_add_js('/library/cryptojs/rollups/rabbit.js');
+head_add_js('/library/cryptojs/rollups/tripledes.js');
+
head_add_js('acl.js');
head_add_js('webtoolkit.base64.js');
head_add_js('main.js');
head_add_js('crypto.js');
-head_add_js('library/jRange/jquery.range.js');
-//head_add_js('docready.js');
-head_add_js('library/colorbox/jquery.colorbox-min.js');
+head_add_js('/library/jRange/jquery.range.js');
+head_add_js('/library/colorbox/jquery.colorbox-min.js');
-head_add_js('library/jquery.AreYouSure/jquery.are-you-sure.js');
-head_add_js('library/tableofcontents/jquery.toc.js');
-head_add_js('library/imagesloaded/imagesloaded.pkgd.min.js');
+head_add_js('/library/jquery.AreYouSure/jquery.are-you-sure.js');
+head_add_js('/library/tableofcontents/jquery.toc.js');
+head_add_js('/library/imagesloaded/imagesloaded.pkgd.min.js');
/**
* Those who require this feature will know what to do with it.
* Those who don't, won't.
diff --git a/view/theme/redbasic/css/narrow_navbar.css b/view/theme/redbasic/css/narrow_navbar.css
index 6b09b031a..99f083638 100644
--- a/view/theme/redbasic/css/narrow_navbar.css
+++ b/view/theme/redbasic/css/narrow_navbar.css
@@ -1,68 +1,30 @@
-@media screen and (min-width: 760px) {
+@media screen and (min-width: 767px) {
- aside {
- padding-top: 52px;
- }
-
- section {
- padding-top: 52px;
+ nav.navbar {
+ padding-top: 1px;
+ padding-bottom: 1px
}
- .navbar-nav > li > a {
- padding-top:7px !important;
- padding-bottom:3px !important;
- }
-
- .navbar {
- min-height:25px !important;
- }
-
- nav .navbar-header img {
- height: 29px;
- width: 29px;
- margin-top: 1px;
- border-radius: 4px;
- }
-
- .navbar-left {
- height: 29px;
- }
-
- .container-fluid {
- min-height:29px;
- }
-
- .collapse .navbar-collapse {
- min-height:29px;
- }
-
- #nav-search-text {
- margin:6px 15px 4px 15px;
- }
-
- #nav-search-spinner {
- margin: 16px 0px 0px 25px;
+ nav .badge {
+ top: 0px;
+ left: -0.25rem;
}
- header #banner {
- margin-top:5px;
+ .contextual-help-content-open {
+ top: 2.5rem;
}
- nav .dropdown-menu,
- nav .acpopup {
- top: 30px !important;
+ aside {
+ padding-top: 3.5rem;
}
- nav .badge {
- top: -29px;
+ section {
+ padding-top: 3.5rem;
}
#jGrowl.top-right {
- top: 30px;
+ top: 3.5rem;
right: 15px;
}
- .contextual-help-content-open {
- top: 31px;
- }
}
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index 7551dfe87..8853a56c3 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -8,12 +8,12 @@
/* generals */
html {
- font-size: 100%;
+ font-size: $font_size;
}
body {
font-family: sans-serif, arial, freesans;
- font-size: $body_font_size;
+ font-size: 0.9rem;
background-color: $bgcolour;
background-image: url('$background_image');
background-attachment: fixed;
@@ -48,35 +48,47 @@ main {
left: 0;
width: 100%;
height: 100%;
+ background: rgba(0, 0, 0, .5);
cursor: pointer;
z-index: 1029;
}
h1, .h1 {
- font-size: 2em;
+ font-size: 2rem;
}
h2, .h2 {
- font-size: 1.667em;
+ font-size: 1.6rem;
}
h3, .h3 {
- font-size: 1.334em;
+ font-size: 1.2rem;
}
h4, .h4 {
- font-size: 1em;
- font-weight: bold;
+ font-size: 1.05rem;
}
h5, .h5 {
- font-size: 1em;
+ font-size: 0.9rem;
}
h6, .h6 {
- font-size: 0.75em;
+ font-size: 0.75rem;
+}
+
+#banner {
+ color: $banner_colour;
+ font-weight: bold;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
+#banner img {
+ max-height: 1.35rem;
+ width: auto;
+}
.jslider {
font-family: sans-serif, arial, freesans;
@@ -87,10 +99,6 @@ abbr {
}
/* icons */
-.tool-icons,
-.cat-icons {
- color: $toolicon_colour;
-}
a,
.fakelink {
@@ -108,34 +116,8 @@ a:focus,
cursor: pointer;
}
-input[type="text"],
-input[type="password"],
-input[type="submit"],
-input[type="file"],
-select,
-textarea {
- font-family: sans-serif, arial, freesans;
- font-size: $body_font_size;
-}
-
-input {
- padding: 5px;
- line-height: 1.5;
- border: 1px solid #ccc;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-input[type="submit"] {
- background-color: #F0F0F0;
- font-weight: bold;
- color: #0080FF;
- text-decoration: none;
- padding: 6px 12px;
-}
-
input, optgroup, select, textarea {
- color: #333;
+ font-size: 0.9rem !important;
resize: vertical;
}
@@ -172,8 +154,7 @@ pre {
color: #FF0000;
}
-nav,
-header {
+nav {
opacity: $nav_float_min_opacity;
filter:alpha(opacity=$nav_percent_min_opacity);
}
@@ -199,49 +180,8 @@ header {
padding: 10px;
}
-nav #banner #logo-text a {
- font-size: 40px;
- font-weight: bold;
- margin-left: 3px;
- color: #000000;
-
-}
-nav #banner #logo-text a:hover { text-decoration: none; }
-
.nav-channel-select { margin-left: 8px; }
-header #banner {
- z-index: 1040;
- margin-top: 14px;
- text-align: center;
- text-shadow: 1px 1px 2px rgba(0,0,0,.5);
- font-size: 14px;
- font-family: tahoma, "Lucida Sans", sans;
- color: $banner_colour;
- font-weight: bold;
- whitespace: nowrap;
-}
-
-header #banner a,
-header #banner a:active,
-header #banner a:visited,
-header #banner a:link,
-header #banner a:hover {
- color: $banner_colour;
- text-decoration: none;
- outline: none;
- vertical-align: bottom;
-}
-
-header #banner #logo-img {
- height: 22px;
- margin-top: 5px;
-}
-
-header #banner #logo-text {
- font-size: 22px;
-}
-
/* contextual help */
.contextual-help-content {
display: none;
@@ -251,11 +191,12 @@ header #banner #logo-text {
.contextual-help-content-open {
display: block;
position: fixed;
- top: 51px;
+ top: 3.35rem;
left: 0px;
+ width: 100%;
max-height: 50%;
background: $comment_item_colour;
- padding: 20px;
+ padding: 1rem;
border-bottom: #ccc 1px solid;
overflow: auto;
-moz-box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
@@ -270,18 +211,18 @@ header #banner #logo-text {
.contextual-help-tool {
padding: 7px;
filter: alpha(opacity=20);
- opacity: .2;
+ opacity: .5;
}
.contextual-help-tool:hover {
filter: alpha(opacity=50);
- opacity: .5;
+ opacity: 1;
text-decoration: none;
}
.contextual-help-tool i {
- color: #000;
- font-size: 16px;
+ color: $font_colour;
+ font-size: 1.05rem;
}
/* contextual help end */
@@ -319,21 +260,6 @@ footer {
margin: 15px 0px;
}
-/*TODO: we should use one class for all this. */
-
-.group-selected,
-.fileas-selected,
-.categories-selected,
-.search-selected,
-.active,
-.group-selected:hover,
-.fileas-selected:hover,
-.categories-selected:hover,
-.search-selected:hover,
-.active:hover {
- color: $font_colour;
-}
-
#cropimage-wrapper, #cropimage-preview-wrapper {
float: left;
padding: 30px;
@@ -346,7 +272,7 @@ footer {
.fn {
font-weight: bold;
- font-size: 16px;
+ font-size: 1rem;
color: #444444;
}
@@ -355,9 +281,7 @@ footer {
padding: 0px 10px 10px 10px;
background-color: rgba(254,254,254,0.5);
border: 1px solid rgba(254,254,254,0.5);
- -moz-border-radius: $radiuspx;
- -webkit-border-radius: $radiuspx;
- border-radius: $radiuspx;
+ border-radius: $radius;
word-wrap: break-word;
}
@@ -384,10 +308,6 @@ footer {
filter:alpha(opacity=100);
}
-#view-contact-end {
- clear: both;
-}
-
#profile-photo-wrapper img {
width: 100%;
height: 100%;
@@ -399,7 +319,7 @@ footer {
width: 251px;
height: 251px;
margin-bottom: 10px;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#hide-friends-yes-label,
@@ -453,8 +373,7 @@ footer {
.photo,
.contact-block-img {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
@@ -468,8 +387,7 @@ footer {
.profile-match-photo img,
.directory-photo-img {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
@@ -528,10 +446,6 @@ footer {
height: 34px;
}
-#contact-block-end {
- clear: both;
-}
-
.contact-block-img {
width:47px;
height:47px;
@@ -555,47 +469,22 @@ footer {
}
.wall-item-conv {
- padding: 7px 10px;
background-color: $comment_item_colour;
}
-
-#conversation-end {
- clear: both;
-}
-
#nav-notifications-template {
display: none;
}
-#nav-searchbar {
- float: right;
- margin-top: 2px;
- margin-right: 10px;
-}
-
#nav-search-spinner {
- float: left;
- margin: 25px 0px 0px 25px;
- color: $nav_active_icon_colour;
+ float: right;
+ margin-top: -0.85rem;
+ margin-right: 1.6rem;
}
-#nav-search-text:hover,
-#nav-search-text:focus {
- background-color: #fff;
- color: #000;
-}
#nav-search-text {
- font-size: 12px;
- width: 200px;
- height: 20px;
- margin: 15px;
- padding: 0px 5px 0px 5px;
- border-radius: $radiuspx;
- border-color: $nav_bd;
- background-color: #eee;
- transition: background-color 300ms ease 0s;
+ width: 280px;
}
#nav-search-text::-webkit-input-placeholder {
@@ -607,7 +496,7 @@ footer {
}
nav .acpopup {
- top: 50px !important;
+ top: 46px !important;
margin-left: -35px;
width: 290px;
}
@@ -644,7 +533,7 @@ nav .acpopup {
#cboxContent {
padding: 3px;
border: 0px solid #fff;
- border-radius: $radiuspx;
+ border-radius: $radius;
background-color: #fff;
z-index: 1052;
}
@@ -667,11 +556,6 @@ nav .acpopup {
text-align: center;
}
-.profile-match-break,
-.profile-match-end {
- clear: both;
-}
-
.profile-match-connect {
text-align: center;
font-weight: bold;
@@ -690,9 +574,6 @@ nav .acpopup {
float: right;
}
-#profile-match-wrapper-end {
- clear: both;
-}
.side-link {
margin-bottom: 15px;
}
@@ -705,10 +586,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#group-members-end {
- clear: both;
-}
-
#group-separator {
margin-top: 10px;
margin-bottom: 10px;
@@ -721,11 +598,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#group-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
#group-edit-desc {
margin-top: 15px;
}
@@ -739,10 +611,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#prof-members-end {
- clear: both;
-}
-
#prof-separator {
margin-top: 10px;
margin-bottom: 10px;
@@ -755,11 +623,6 @@ nav .acpopup {
border: 1px solid #ddd;
}
-#prof-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
#prof-edit-desc {
margin-top: 15px;
}
@@ -773,10 +636,6 @@ nav .acpopup {
width: 80px;
margin-right: 15px;
}
-.notification-listing-end {
- clear: both;
- margin-bottom: 15px;
-}
/**
* OAuth
@@ -826,7 +685,7 @@ div.jGrowl div.info {
padding-left: 58px;
}
#jGrowl.top-right {
- top: 65px;
+ top: 4.5rem;
right: 15px;
}
@@ -834,142 +693,38 @@ div.jGrowl div.jGrowl-notification {
min-height: 60px;
}
-#id_term_label {
- width:75px;
-}
-#id_term {
- width:100px;
-}
-
-#nav-search-text-ac .autocomplete {
- position: fixed;
- top: 51px;
- border: 1px solid $nav_bd;
- border-top: none;
-}
-
-#recip-ac .autocomplete,
-#poke-recip-ac .autocomplete,
-#id-name-ac .autocomplete,
-#contact-search-ac .autocomplete {
- margin-top: 2px;
- margin-left: $radiuspx;
- margin-right: $radiuspx;
- border: 1px solid #666;
- border-top: none;
-
-}
-
-.autocomplete {
- color: $font_colour;
- cursor: pointer;
- text-align: left;
- max-height: 350px;
- overflow: auto;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
-}
-
-.autocomplete .selected {
- background: #eee;
-}
-
-.autocomplete div {
- padding: 2px 5px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
.jslider .jslider-scale ins {
color: #333;
- font-size: $body_font_size;
+ font-size: 0.9rem;
width: 100px;
text-align: center;
}
-a.rconnect, a.rateme, div.rateme {
- color: $nav_active_icon_colour;
- text-decoration: none;
- font-weight: normal;
- outline: none;
-}
-
-a.rconnect:hover, a.rateme:hover, div.rateme:hover {
- color: #0080FF;
- text-decoration: none;
-}
-
-.widget.rateme {
- margin-top: 15px;
- padding: 0;
-}
-
-.widget .conv-participants {
+.conv-participants {
color: $font_colour;
}
-.notif-item a {
- color: #000;
-}
-
-.notif-item a:hover {
- text-decoration: underline;
- color: #000;
-}
-
-.notif-image {
- width: 32px;
- height: 32px;
- padding: 7px 7px 0px 0px;
-}
-
.contactname {
- padding-top: 2px;
font-weight: bold;
- line-height: 1em;
- white-space: nowrap;
+ display: block;
overflow: hidden;
text-overflow: ellipsis;
- display: block;
}
-.dropdown-sub-text {
- line-height: 1em;
+.dropdown-notification,
+.member-item {
+ line-height: 1.1em;
+ font-size: 0.75rem;
overflow: hidden;
text-overflow: ellipsis;
display: block;
}
-.notify-seen a {
- background: #ddd;
-}
-
#page-spinner {
color: #777;
margin: 24px;
}
-.tabs-end {
- clear: both;
-}
-
-.modal-header .contextual-help-tool {
- /* Mostly duplicating ".modal-header .close" and ".close" layout settings from bootstrap */
- float: right;
- font-size: 21px;
- padding: 0;
- margin-top: -4px;
- margin-right: 15px;
- line-height: 1;
-}
-
-#acl-search {
- padding: 4px;
- border: 1px solid #ccc;
- width: 100%;
-}
-
#acl-search::-webkit-input-placeholder {
/* non-fontawesome fonts set a fallback for text parts of the placeholder*/
font-family: FontAwesome, sans-serif, arial, freesans;
@@ -980,59 +735,17 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
font-family: FontAwesome, sans-serif, arial, freesans;
}
-#aclModal .modal-body {
- padding-top: 10px;
-}
-
-#acl-showlimited-description {
- font-size: 90%;
- color: #888;
- margin-left: 10px;
- margin-bottom: 4px;
-}
-
-#acl-list {
- border: 1px solid #ccc;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-#acl-search-wrapper {
- padding: 7px 10px;
- background-color: $item_colour;
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
- border-bottom: 1px solid #ccc;
-}
-
-#acl-list-content-wrapper {
- display: block;
- overflow: auto;
- clear: both;
- min-height: 62px;
- padding: 10px 10px 0px 0px;
-
-}
-
-#jotnets-wrapper, #jotnets-collapse {
- margin-bottom: 18px;
-}
-
-#jot-preview-content {
- margin-top: 10px;
-}
.acl-list-item {
- width: 48%; /* fallback if browser does not support calc() */
- width: calc(50% - 10px);
+ width: 100%;
+ padding: 0.5rem;
+ margin-bottom: 0.5rem;
border: 1px solid #ccc;
- margin: 0px 0px 10px 10px;
- padding: 5px;
float: left;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
- background-color: white;
+ border-radius: $radius;
+}
+
+.acl-item-header {
+ width: 100%;
}
.acl-list-item.grouphide {
@@ -1043,66 +756,20 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
border: 1px solid green;
}
-.acl-list-item img {
- width: 40px;
- height: 40px;
- float: left;
- margin-right: 5px;
- -webkit-border-radius: $radiuspx ;
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
.acl-list-item.taggable {
background-color: #ddddff;
}
-.acl-list-item p {
- font-size: $font_size;
- margin: 0px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
.acl-button-show,
.acl-button-hide {
float: right;
margin-left: 5px;
}
-#acl-showlimited-caption,
-#acl-showall-caption {
- font-size: 115%;
-}
-
-#acl-radiowrapper-showall {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-#acl-radiowrapper-showlimited {
- margin-bottom: 0;
-}
-
-#acl-showall + i {
- font-size: 140%;
-}
-
-#acl-info-icon,
-#acl-info-icon:active {
- font-size: 110%;
- color: $link_colour;
- text-decoration: none;
-}
-
-#acl-showall-caption {
- margin-left: 0.35em;
-}
-
.contact-block-content {
margin-top: 10px;
}
-.contact-block-img.archived, .app-deleted {
+.contact-block-img.archived, .app-deleted, .dim {
opacity: 0.3;
filter:alpha(opacity=30);
}
@@ -1112,7 +779,7 @@ a.rconnect:hover, a.rateme:hover, div.rateme:hover {
.reshared-content { margin-left: 20px; }
.shared_header img {
- border-radius: $radiuspx;
+ border-radius: $radius;
margin-right: 10px;
}
@@ -1178,36 +845,39 @@ margin-right: 50px;
list-style-type: none;
}
-.generic-icons {
- font-size: 1.2em;
- color: $toolicon_colour;
- margin-right: 7px;
+.generic-icons,
+a .generic-icons {
+ font-size: 1rem;
+ margin-right: 0.5rem;
+ color: $font_colour;
}
-.generic-icons:hover {
- color: $toolicon_colour;
+.generic-icons:hover,
+a .generic-icons:hover {
+ color: $font_colour;
}
-.generic-icons-nav {
- font-size: 1.2em;
- margin-right: 7px;
+.generic-icons-right {
+ font-size: 1rem;
+ margin-left: 0.5rem;
+ color: $font_colour;
}
-nav .navbar-collapse.in .generic-icons,
-nav .navbar-collapse.collapsing .generic-icons {
- color: $nav_active_icon_colour;
+
+.generic-icons-nav {
+ font-size: 1rem;
+ margin-right: 7px;
}
.admin-icons {
font-size: 1.2em;
- color: $toolicon_colour;
margin-right: 7px;
}
.drop-icons,
a .drop-icons {
- color: $toolicon_colour;
- font-size: 1.2em;
+ font-size: 1rem;
+ color: $font_colour;
text-decoration: none;
cursor: pointer;
}
@@ -1252,8 +922,7 @@ th,td {
/* mail */
img.mail-conv-sender-photo {
- -moz-border-radius: $radiuspx;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
/* jot */
@@ -1270,25 +939,23 @@ img.mail-conv-sender-photo {
font-weight: bold;
}
-
-
#profile-jot-wrapper {
background-color: rgba(254,254,254,1);
border: 1px solid #ccc;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#profile-jot-text {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
#profile-jot-text::-webkit-input-placeholder {
- font-size: 16px;
+ font-size: 1.2rem;
}
#profile-jot-text::-moz-placeholder {
- font-size: 16px;
+ font-size: 1.2rem;
}
#profile-jot-text:focus::-webkit-input-placeholder {
@@ -1308,48 +975,41 @@ img.mail-conv-sender-photo {
color: #777;
}
-.jot-icons {
- color: $toolicon_colour;
-}
-
.jot-icons.jot-lock-warn {
color: darkorange;
}
/* conversation */
-.nsfw-wrap {
- text-align: center;
- font-size: $body_font_size;
+
+.top-radius {
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-event-item {
padding: 10px;
color: #fff;
background-color: #3A87AD; /* should reflect calendar color */
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
+ border-top-left-radius: $radius;
+ border-top-right-radius: $radius;
}
.wall-photo-item img {
max-width: 100% !important;
- border-top-right-radius: $radiuspx;
- border-top-left-radius: $radiuspx;
-}
-
-.wall-item-title {
- font-size: $font_size;
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-item-footer {
- font-size: $body_font_size;
+ font-size: 0.75rem;
margin-top: 2em;
}
.wall-item-content-wrapper {
background-color: $item_colour;
- border-top-right-radius: $radiuspx;
- border-top-left-radius: $radiuspx;
+ border-top-right-radius: $radius;
+ border-top-left-radius: $radius;
}
.wall-item-content-wrapper.comment {
@@ -1376,8 +1036,8 @@ img.mail-conv-sender-photo {
padding: 7px 10px;
background-color: $item_colour;
border-radius: 0px;
- border-bottom-right-radius: $radiuspx;
- border-bottom-left-radius: $radiuspx;
+ border-bottom-right-radius: $radius;
+ border-bottom-left-radius: $radius;
border-top: 3px solid $comment_item_colour;
}
@@ -1385,37 +1045,23 @@ img.mail-conv-sender-photo {
border-top: 0px solid $comment_item_colour;
}
-.wall-item-like,
-.wall-item-dislike {
- font-size: 11px;
-}
.wall-item-photo {
+ width: $top_photo;
+ height: $top_photo;
border: none;
- width: $top_photo !important;
- height: $top_photo !important;
-
+ border-radius: $radius;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
.comment .wall-item-photo {
- width: $reply_photo !important;
- height: $reply_photo !important;
-}
-
-.wall-item-photo {
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
- box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
+ width: $reply_photo;
+ height: $reply_photo;
}
.wall-item-ago,
.dropdown-sub-text {
color: #777;
- font-size: 0.833em;
-}
-
-.wall-item-ago i {
- font-size: 0.833em;
}
.wall-item-content,
@@ -1423,37 +1069,18 @@ img.mail-conv-sender-photo {
.page-body,
.chat-item-text,
.chat-item-text-self {
- font-size: $font_size;
- clear: both;
+ font-size: 1rem;
}
-.item-tool {
- font-size: 1.2em;
- color: $toolicon_colour;
-}
-
-.like-rotator {
- color: $toolicon_colour;
-}
-
-.comment-icon {
- font-size: 0.833em;
- color: $toolicon_colour;
-}
.comment-edit-text-empty,
.comment-edit-text-full {
border: 1px solid #ccc;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.comment-edit-text-empty {
color: gray;
- font-size: 12px;
-}
-
-.comment-edit-text-full {
- color: black;
}
.divgrow-showmore {
@@ -1475,19 +1102,12 @@ img.mail-conv-sender-photo {
.widget {
background-color: rgba(254,254,254,.5);
border: 1px solid rgba(254,254,254,.5);
- -moz-border-radius: $radiuspx;
- -webkit-border-radius: $radiuspx;
- border-radius: $radiuspx;
-}
-
-.widget h3 {
- color: $toolicon_colour;
+ border-radius: $radius;
}
#note-text {
border: 1px solid #ccc;
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
}
.fileas-ul {
@@ -1496,8 +1116,7 @@ img.mail-conv-sender-photo {
#datebrowse-sidebar select {
border: 1px solid #ccc;
- border-radius: $radiuspx;
- -moz-border-radius: $radiuspx;
+ border-radius: $radius;
}
.thing-show img {
@@ -1519,63 +1138,50 @@ img.mail-conv-sender-photo {
.chat-item-photo,
.chat-item-photo-self {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.chat-item-title,
.chat-item-title-self {
- border-radius: $radiuspx;
+ border-radius: $radius;
background-color: $item_colour;
}
#chatMembers img {
- border-radius: $radiuspx;
-}
-
-/* nav bootstrap */
-
-nav img {
- border-radius: $radiuspx;
-}
-
-nav .dropdown-menu {
- font-size: $body_font_size;
- border-top-right-radius: 0px;
- border-top-left-radius: 0px;
- border-bottom-right-radius: $radiuspx;
- border-bottom-left-radius: $radiuspx;
+ border-radius: $radius;
}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:focus,
-.dropdown-menu > .active > a:hover {
- color: #333;
- background-color: #f5f5f5;
-}
-
-.dropdown-menu-img-sm {
- float: left;
- width: 36px;
- height: 36px;
+.menu-img-3 {
+ width: 3.3em;
+ height: 3.3em;
margin-right: 5px;
+ border-radius: $radius;
+ float: left;
}
-.dropdown-menu-img-xs {
- height: 18px;
- width: 18px;
+.menu-img-2 {
+ height: 2.2em;
+ width: 2.2em;
margin-right: 5px;
+ border-radius: $radius;
+ float: left;
}
-#usermenu-caret {
- color: $nav_icon_colour;
+.menu-img-1 {
+ height: 1.5em;
+ width: 1.5em;
+ margin-right: 5px;
+ border-radius: $radius;
}
-.usermenu-head {
- float: left;
+.usermenu {
+ width: 3.75rem;
}
-.usermenu-head:hover #usermenu-caret {
- color: $nav_active_icon_colour;
+#avatar {
+ width: 2.35rem;
+ height: 2.35rem;
+ border-radius: $radius;
}
.page-title {
@@ -1585,20 +1191,20 @@ nav .dropdown-menu {
.generic-content-wrapper-styled {
background-color: $bgcolour;
padding: 10px;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.generic-content-wrapper {
border: 1px solid #ccc;
box-shadow: 0px 0px 5px 1px rgba(0,0,0,0.2);
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.section-title-wrapper {
padding: 7px 10px;
background-color: $item_colour;
- border-top-left-radius: $radiuspx;
- border-top-right-radius: $radiuspx;
+ border-top-left-radius: $radius;
+ border-top-right-radius: $radius;
border-bottom: 3px solid $comment_item_colour;
}
@@ -1611,8 +1217,12 @@ nav .dropdown-menu {
text-overflow: ellipsis;
}
+.section-subtitle-wrapper h3 {
+ padding: 3px;
+}
+
.section-subtitle-wrapper {
- padding: 7px 10px;
+ padding: 4px 10px;
background-color: $item_colour;
border-bottom: 3px solid $comment_item_colour;
}
@@ -1655,22 +1265,22 @@ nav .dropdown-menu {
.section-content-wrapper .section-content-danger-wrapper {
margin-bottom: 10px;
border-bottom: none;
- border-radius: $radiuspx;
+ border-radius: $radius;
}
.section-content-wrapper {
padding: 7px 10px;
background-color: $comment_item_colour;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
word-wrap: break-word;
}
.section-content-wrapper-np {
background-color: $comment_item_colour;
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
word-wrap: break-word;
}
@@ -1687,6 +1297,7 @@ main.fullscreen .generic-content-wrapper {
top: 0px;
left: 0px;
border-radius: 0px;
+ border-width: 0px;
}
main.fullscreen .section-title-wrapper {
@@ -1723,157 +1334,63 @@ main.fullscreen .section-content-wrapper-np {
background-color: $item_colour;
}
-nav ul li .undefined,
-nav ul li .notify-seen,
-nav ul li .notify-unseen
- {
- max-height: 3rem;
+.notify-seen {
+ background-color: $item_colour;
}
-
/* bootstrap overrides */
-.panel {
- background-color: transparent;
- border: 0px solid transparent;
- border-radius: 0px;
- -webkit-box-shadow: 0 0px 0px rgba(0, 0, 0, .0);
- box-shadow: 0 0px 0px rgba(0, 0, 0, .0);
-}
-
-.panel-group .panel + .panel {
- margin-top: 0px;
-}
-
blockquote {
- font-size: $font_size;
+ font-size: 1rem;
font-style: italic;
border-left: 3px solid #ccc;
padding: 1em 0px 1em 1.5em;
margin: 0px;
}
-.badge {
- border-radius: $radiuspx;
-}
-
-nav .badge.home-update,
-nav .badge.notify-update,
-nav .badge.intro-update,
-nav .badge.mail-update {
- background-color: #C9302C;
-}
-
.dropdown-menu {
- font-size: $body_font_size;
- border-radius: $radiuspx;
+ color: $font_colour;
+ font-size: 0.9rem;
+ border-radius: $radius;
}
.dropdown-menu img {
- border-radius: $radiuspx;
+ border-radius: $radius;
}
-.navbar-inverse {
- background-image: -webkit-linear-gradient(top, $nav_gradient_top 0%, $nav_gradient_bottom 100%);
- background-image: linear-gradient(to bottom, $nav_gradient_top 0%, $nav_gradient_bottom 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=$nav_gradient_top, endColorstr=$nav_gradient_bottom, GradientType=0);
- background-color: $nav_bg;
- border-color: $nav_bd;
+.dropdown-item {
+ color: $font_colour;
}
-.navbar-inverse .navbar-collapse {
- border-color: $nav_bd;
+.dropdown-item:active,
+.dropdown-item:focus,
+.dropdown-item:hover,
+.textcomplete-item:focus .dropdown-item,
+.textcomplete-item:hover .dropdown-item,
+.textcomplete-item.active .dropdown-item,
+.textcomplete-item:active .dropdown-item {
+ color: $font_colour;
+ background-color: $item_colour;
}
-.navbar-inverse .navbar-nav > .active > a {
- background-image: -webkit-linear-gradient(top, $nav_active_gradient_top 0%, $nav_active_gradient_bottom 100%);
- background-image: linear-gradient(to bottom, $nav_active_gradient_top 0%, $nav_active_gradient_bottom 100%);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=$nav_active_gradient_top, endColorstr=$nav_active_gradient_bottom, GradientType=0);
+.bg-inverse {
+ background-color: $nav_bg !important;
}
-
-.navbar-inverse .navbar-nav > li > a {
+.navbar-inverse .navbar-nav .nav-link,
+.usermenu i {
color: $nav_icon_colour;
}
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
+.navbar-inverse .navbar-nav .nav-link:focus,
+.navbar-inverse .navbar-nav .nav-link:hover,
+.usermenu:focus i,
+.usermenu:hover i {
color: $nav_active_icon_colour;
}
-.navbar-inverse .navbar-nav > .active > a,
-.navbar-inverse .navbar-nav > .active > a:hover,
-.navbar-inverse .navbar-nav > .active > a:focus {
- color: $nav_active_icon_colour;
-}
-
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
- background-color: $nav_bd;
- color: $nav_active_icon_colour;
-}
-
-.navbar-inverse .navbar-toggle {
- border-color: $nav_bd;
-}
-.navbar-inverse .navbar-toggle:hover,
-.navbar-inverse .navbar-toggle:focus {
- background-color: $nav_bg;
-}
-
-.navbar-inverse .navbar-toggle .icon-bar {
- background-color: $nav_active_icon_colour;
-}
-
-#expand-aside,
-#expand-tabs,
-#doco-return-to-top-btn,
-#context-help-btn,
-#notifications-btn,
-#login_nav_btn_collapse {
- color: $nav_active_icon_colour;
- padding: 7px 10px;
-}
-
-.nav-tabs.nav-justified {
- background-color: rgba(254,254,254,.5);
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
-}
-
-.nav-tabs.nav-justified > .active > a,
-.nav-tabs.nav-justified > .active > a:hover,
-.nav-tabs.nav-justified > .active > a:focus {
- border-bottom-color: transparent;
-}
-
-.nav-tabs > li.active > a,
-.nav-tabs > li.active > a:hover,
-.nav-tabs > li.active > a:focus {
- background-color: transparent;
-}
-
-#tabs-collapse-1 {
- padding: 0px;
- margin-bottom: 25px;
-}
-
-.btn {
- font-size: $body_font_size;
-}
-
-.btn-xs {
- font-size: 0.75rem;
-}
-
-.btn-default {
- background-color: transparent;
-}
-
@media screen and (max-width: 767px) {
aside#region_1 {
- background: rgba(0, 0, 0, .1);
border-right: 1px solid $nav_bd;
}
@@ -1886,33 +1403,6 @@ nav .badge.mail-update {
left: 0px;
}
- .thread-wrapper.toplevel_item {
- width: 100%;
- border:1px;
- }
-
- .wall-item-photo {
- width: 48px !important;
- height: 48px !important;
- }
-
- .comment .wall-item-photo {
- width: 32px !important;
- height: 32px !important;
- }
-
- .acl-list-item {
- width: 98%; /* fallback if browser does not support calc() */
- width: calc(100% - 10px);
- }
-
-}
-
-/* release the navbar in landscape view on small devices */
-@media screen and (max-height: 320px) {
- .navbar-fixed-top {
- position: absolute;
- }
}
.shareable_element_text {
@@ -1961,7 +1451,7 @@ dl.bb-dl > dd > li {
font-weight: normal;
font-style: normal;
text-decoration: inherit;
- content:"\f069";
+ content:"\f069 ";
}
/* Modified original CSS to match input in Redbasic */
@@ -1970,7 +1460,7 @@ dl.bb-dl > dd > li {
margin-bottom: 0px;
box-shadow: none;
display: inline-block;
- border-radius: $radiuspx;
+ border-radius: $radius;
cursor: text;
padding: 0px 10px;
width: 100%;
@@ -1988,17 +1478,17 @@ dl.bb-dl > dd > li {
/* Turn checkboxes into switches */
-.field.checkbox > div {
+.form-group.checkbox > div {
position: relative; width: 60px;
-webkit-user-select:none; -moz-user-select:none; -ms-user-select: none;
display:inline-block;
}
-.field.checkbox input {
+.form-group.checkbox input {
display: none;
}
-.field.checkbox > div label {
+.form-group.checkbox > div label {
display: block; overflow: hidden; cursor: pointer;
border: 1px solid #ccc;
border-radius: 4px;
@@ -2008,11 +1498,11 @@ dl.bb-dl > dd > li {
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
-.field.checkbox:hover label {
+.form-group.checkbox:hover label {
color: $link_colour;
}
-.field.checkbox:hover > div label {
+.form-group.checkbox:hover > div label {
border-color: $link_colour;
}
@@ -2051,13 +1541,13 @@ dl.bb-dl > dd > li {
-o-transition: all 0.3s ease-in 0s; transition: all 0.3s ease-in 0s;
}
-.field.checkbox > div > input:checked + label .onoffswitch-inner {
+.form-group.checkbox > div > input:checked + label .onoffswitch-inner {
margin-left: 0px;
}
-.field.checkbox > div > input:checked + label .onoffswitch-switch {
+.form-group.checkbox > div > input:checked + label .onoffswitch-switch {
right: 0px;
- background-color: #337AB7;
+ background-color: #0275d8;
}
.help-searchlist {
@@ -2080,30 +1570,25 @@ dl.bb-dl > dd > li {
#ace-editor,
#editor {
- border-bottom-left-radius: $radiuspx;
- border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radius;
+ border-bottom-right-radius: $radius;
}
-.sub-menu {
- margin-top: 10px;
- padding-left: 15px;
- border-left: 3px solid #eee;
-}
-
-.nav-pills-stacked-icons {
- padding: 6px 10px;
- float: right;
- position: relative;
- z-index:1;
+.sub-menu-wrapper {
+ padding-left: 1rem;
+ display: none;
}
-.nav-pills-stacked-icons:hover + a {
- background-color: #eee;
+.sub-menu {
+ width: 100%;
+ margin-top: 0.5rem;
+ padding-left: 1rem;
+ border-left: 0.2rem solid #eee;
}
.app-icon {
+ color: #777;
font-size: 80px;
- color: $toolicon_colour;
text-shadow: 3px 3px 3px lightgrey;
}
@@ -2117,6 +1602,7 @@ dl.bb-dl > dd > li {
margin-left: auto;
margin-right: auto;
}
+
#permcat-index {
margin: 10px;
}
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 81a95c68b..14b977b80 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -16,14 +16,21 @@ $(document).ready(function() {
}
$('#css3-calc').remove(); // Remove the test element
+
+
if($(window).width() > 767) {
$('#left_aside_wrapper').stick_in_parent({
- offset_top: $('nav').outerHeight(true),
+ offset_top: $('nav').outerHeight(true) + 10,
parent: '#region_1',
spacer: '#left_aside_spacer'
});
}
+ if(($(window).width() < 767) && ($('#left_aside_wrapper .widget, #left_aside_wrapper .vcard').length > 0))
+ $('#expand-aside').show();
+ else
+ $('#expand-aside').hide();
+
$('#expand-aside').on('click', toggleAside);
$('section').on('click', function() {
@@ -41,29 +48,14 @@ $(document).ready(function() {
}
});
- if($('#left_aside_wrapper').length && $('#left_aside_wrapper').html().length === 0) {
- $('#expand-aside').hide();
- }
-
- $('#expand-tabs').click(function() {
- if(!$('#tabs-collapse-1').hasClass('in')){
- $('html, body').animate({ scrollTop: 0 }, 'slow');
+ $('.usermenu').click(function() {
+ if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('show')){
+ $('#navbar-collapse-1, #navbar-collapse-2').removeClass('show');
}
- $('#expand-tabs-icon').toggleClass('fa-arrow-circle-down').toggleClass('fa-arrow-circle-up');
});
- $('.usermenu-head').click(function() {
- if($('#navbar-collapse-1, #navbar-collapse-2').hasClass('in')){
- $('#navbar-collapse-1, #navbar-collapse-2').removeClass('in');
- }
- });
-
- if($('#tabs-collapse-1').length === 0) {
- $('#expand-tabs').hide();
- }
-
$("input[data-role=cat-tagsinput]").tagsinput({
- tagClass: 'label label-primary'
+ tagClass: 'badge badge-pill badge-warning'
});
var doctitle = document.title;
@@ -81,17 +73,14 @@ $(document).ready(function() {
function makeFullScreen(full) {
if(typeof full=='undefined' || full == true) {
- $('main').css({'transition': 'none'}).addClass('fullscreen');
- $('header, nav, aside, #fullscreen-btn').hide();
- $('#tabs-collapse-1').css({'visibility': 'hidden'});
+ $('main').addClass('fullscreen');
+ $('header, nav, aside, #fullscreen-btn').attr('style','display:none !important');
$('#inline-btn').show();
}
else {
$('main').removeClass('fullscreen');
$('header, nav, aside, #fullscreen-btn').show();
- $('#tabs-collapse-1').css({'visibility': ''});
$('#inline-btn').hide();
- $('main').css({'transition': ''});
$(document.body).trigger("sticky_kit:recalc");
}
}
@@ -109,7 +98,7 @@ function toggleAside() {
$('main').addClass('region_1-on')
$('<div id="overlay"></div>').appendTo('section');
$('#left_aside_wrapper').stick_in_parent({
- offset_top: $('nav').outerHeight(true) - 10,
+ offset_top: $('nav').outerHeight(true) + 10,
parent: '#region_1',
spacer: '#left_aside_spacer'
});
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index b03e94e46..752a02a6a 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -28,11 +28,6 @@ class RedbasicConfig {
$arr = array();
$arr['narrow_navbar'] = get_pconfig(local_channel(),'redbasic', 'narrow_navbar' );
$arr['nav_bg'] = get_pconfig(local_channel(),'redbasic', 'nav_bg' );
- $arr['nav_gradient_top'] = get_pconfig(local_channel(),'redbasic', 'nav_gradient_top' );
- $arr['nav_gradient_bottom'] = get_pconfig(local_channel(),'redbasic', 'nav_gradient_bottom' );
- $arr['nav_active_gradient_top'] = get_pconfig(local_channel(),'redbasic', 'nav_active_gradient_top' );
- $arr['nav_active_gradient_bottom'] = get_pconfig(local_channel(),'redbasic', 'nav_active_gradient_bottom' );
- $arr['nav_bd'] = get_pconfig(local_channel(),'redbasic', 'nav_bd' );
$arr['nav_icon_colour'] = get_pconfig(local_channel(),'redbasic', 'nav_icon_colour' );
$arr['nav_active_icon_colour'] = get_pconfig(local_channel(),'redbasic', 'nav_active_icon_colour' );
$arr['link_colour'] = get_pconfig(local_channel(),'redbasic', 'link_colour' );
@@ -41,18 +36,12 @@ class RedbasicConfig {
$arr['background_image'] = get_pconfig(local_channel(),'redbasic', 'background_image' );
$arr['item_colour'] = get_pconfig(local_channel(),'redbasic', 'item_colour' );
$arr['comment_item_colour'] = get_pconfig(local_channel(),'redbasic', 'comment_item_colour' );
- $arr['comment_border_colour'] = get_pconfig(local_channel(),'redbasic', 'comment_border_colour' );
- $arr['comment_indent'] = get_pconfig(local_channel(),'redbasic', 'comment_indent' );
- $arr['toolicon_colour'] = get_pconfig(local_channel(),'redbasic','toolicon_colour');
- $arr['toolicon_activecolour'] = get_pconfig(local_channel(),'redbasic','toolicon_activecolour');
$arr['font_size'] = get_pconfig(local_channel(),'redbasic', 'font_size' );
- $arr['body_font_size'] = get_pconfig(local_channel(),'redbasic', 'body_font_size' );
$arr['font_colour'] = get_pconfig(local_channel(),'redbasic', 'font_colour' );
$arr['radius'] = get_pconfig(local_channel(),'redbasic', 'radius' );
$arr['shadow'] = get_pconfig(local_channel(),'redbasic', 'photo_shadow' );
$arr['converse_width']=get_pconfig(local_channel(),"redbasic","converse_width");
$arr['align_left']=get_pconfig(local_channel(),"redbasic","align_left");
- $arr['nav_min_opacity']=get_pconfig(local_channel(),"redbasic","nav_min_opacity");
$arr['top_photo']=get_pconfig(local_channel(),"redbasic","top_photo");
$arr['reply_photo']=get_pconfig(local_channel(),"redbasic","reply_photo");
return $this->form($arr);
@@ -66,11 +55,6 @@ class RedbasicConfig {
if (isset($_POST['redbasic-settings-submit'])) {
set_pconfig(local_channel(), 'redbasic', 'narrow_navbar', $_POST['redbasic_narrow_navbar']);
set_pconfig(local_channel(), 'redbasic', 'nav_bg', $_POST['redbasic_nav_bg']);
- set_pconfig(local_channel(), 'redbasic', 'nav_gradient_top', $_POST['redbasic_nav_gradient_top']);
- set_pconfig(local_channel(), 'redbasic', 'nav_gradient_bottom', $_POST['redbasic_nav_gradient_bottom']);
- set_pconfig(local_channel(), 'redbasic', 'nav_active_gradient_top', $_POST['redbasic_nav_active_gradient_top']);
- set_pconfig(local_channel(), 'redbasic', 'nav_active_gradient_bottom', $_POST['redbasic_nav_active_gradient_bottom']);
- set_pconfig(local_channel(), 'redbasic', 'nav_bd', $_POST['redbasic_nav_bd']);
set_pconfig(local_channel(), 'redbasic', 'nav_icon_colour', $_POST['redbasic_nav_icon_colour']);
set_pconfig(local_channel(), 'redbasic', 'nav_active_icon_colour', $_POST['redbasic_nav_active_icon_colour']);
set_pconfig(local_channel(), 'redbasic', 'link_colour', $_POST['redbasic_link_colour']);
@@ -79,18 +63,12 @@ class RedbasicConfig {
set_pconfig(local_channel(), 'redbasic', 'background_image', $_POST['redbasic_background_image']);
set_pconfig(local_channel(), 'redbasic', 'item_colour', $_POST['redbasic_item_colour']);
set_pconfig(local_channel(), 'redbasic', 'comment_item_colour', $_POST['redbasic_comment_item_colour']);
- set_pconfig(local_channel(), 'redbasic', 'comment_border_colour', $_POST['redbasic_comment_border_colour']);
- set_pconfig(local_channel(), 'redbasic', 'comment_indent', $_POST['redbasic_comment_indent']);
- set_pconfig(local_channel(), 'redbasic', 'toolicon_colour', $_POST['redbasic_toolicon_colour']);
- set_pconfig(local_channel(), 'redbasic', 'toolicon_activecolour', $_POST['redbasic_toolicon_activecolour']);
set_pconfig(local_channel(), 'redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_pconfig(local_channel(), 'redbasic', 'body_font_size', $_POST['redbasic_body_font_size']);
set_pconfig(local_channel(), 'redbasic', 'font_colour', $_POST['redbasic_font_colour']);
set_pconfig(local_channel(), 'redbasic', 'radius', $_POST['redbasic_radius']);
set_pconfig(local_channel(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']);
set_pconfig(local_channel(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']);
set_pconfig(local_channel(), 'redbasic', 'align_left', $_POST['redbasic_align_left']);
- set_pconfig(local_channel(), 'redbasic', 'nav_min_opacity', $_POST['redbasic_nav_min_opacity']);
set_pconfig(local_channel(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']);
set_pconfig(local_channel(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']);
}
@@ -110,31 +88,20 @@ class RedbasicConfig {
'$title' => t("Theme settings"),
'$narrow_navbar' => array('redbasic_narrow_navbar',t('Narrow navbar'),$arr['narrow_navbar'], '', array(t('No'),t('Yes'))),
'$nav_bg' => array('redbasic_nav_bg', t('Navigation bar background color'), $arr['nav_bg']),
- '$nav_gradient_top' => array('redbasic_nav_gradient_top', t('Navigation bar gradient top color'), $arr['nav_gradient_top']),
- '$nav_gradient_bottom' => array('redbasic_nav_gradient_bottom', t('Navigation bar gradient bottom color'), $arr['nav_gradient_bottom']),
- '$nav_active_gradient_top' => array('redbasic_nav_active_gradient_top', t('Navigation active button gradient top color'), $arr['nav_active_gradient_top']),
- '$nav_active_gradient_bottom' => array('redbasic_nav_active_gradient_bottom', t('Navigation active button gradient bottom color'), $arr['nav_active_gradient_bottom']),
- '$nav_bd' => array('redbasic_nav_bd', t('Navigation bar border color '), $arr['nav_bd']),
'$nav_icon_colour' => array('redbasic_nav_icon_colour', t('Navigation bar icon color '), $arr['nav_icon_colour']),
'$nav_active_icon_colour' => array('redbasic_nav_active_icon_colour', t('Navigation bar active icon color '), $arr['nav_active_icon_colour']),
- '$link_colour' => array('redbasic_link_colour', t('link color'), $arr['link_colour'], '', $link_colours),
+ '$link_colour' => array('redbasic_link_colour', t('Link color'), $arr['link_colour'], '', $link_colours),
'$banner_colour' => array('redbasic_banner_colour', t('Set font-color for banner'), $arr['banner_colour']),
'$bgcolour' => array('redbasic_background_colour', t('Set the background color'), $arr['bgcolour']),
'$background_image' => array('redbasic_background_image', t('Set the background image'), $arr['background_image']),
'$item_colour' => array('redbasic_item_colour', t('Set the background color of items'), $arr['item_colour']),
'$comment_item_colour' => array('redbasic_comment_item_colour', t('Set the background color of comments'), $arr['comment_item_colour']),
- '$comment_border_colour' => array('redbasic_comment_border_colour', t('Set the border color of comments'), $arr['comment_border_colour']),
- '$comment_indent' => array('redbasic_comment_indent', t('Set the indent for comments'), $arr['comment_indent']),
- '$toolicon_colour' => array('redbasic_toolicon_colour',t('Set the basic color for item icons'),$arr['toolicon_colour']),
- '$toolicon_activecolour' => array('redbasic_toolicon_activecolour',t('Set the hover color for item icons'),$arr['toolicon_activecolour']),
- '$body_font_size' => array('redbasic_body_font_size', t('Set font-size for the entire application'), $arr['body_font_size'], t('Example: 14px')),
- '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $arr['font_size']),
+ '$font_size' => array('redbasic_font_size', t('Set font-size for the entire application'), $arr['font_size'], t('Examples: 1rem, 100%, 16px')),
'$font_colour' => array('redbasic_font_colour', t('Set font-color for posts and comments'), $arr['font_colour']),
- '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius']),
+ '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius'], t('Example: 4px')),
'$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
'$converse_width' => array('redbasic_converse_width',t('Set maximum width of content region in pixel'),$arr['converse_width'], t('Leave empty for default width')),
'$align_left' => array('redbasic_align_left',t('Left align page content'),$arr['align_left'], '', array(t('No'),t('Yes'))),
- '$nav_min_opacity' => array('redbasic_nav_min_opacity',t('Set minimum opacity of nav bar - to hide it'),$arr['nav_min_opacity']),
'$top_photo' => array('redbasic_top_photo', t('Set size of conversation author photo'), $arr['top_photo']),
'$reply_photo' => array('redbasic_reply_photo', t('Set size of followup author photos'), $arr['reply_photo']),
));
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 9b994ebdf..a666f96f2 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -10,34 +10,23 @@ if(! App::$install) {
}
// Load the owners pconfig
- $nav_bg = get_pconfig($uid, "redbasic", "nav_bg");
- $nav_gradient_top = get_pconfig($uid, "redbasic", "nav_gradient_top");
- $nav_gradient_bottom = get_pconfig($uid, "redbasic", "nav_gradient_bottom");
- $nav_active_gradient_top = get_pconfig($uid, "redbasic", "nav_active_gradient_top");
- $nav_active_gradient_bottom = get_pconfig($uid, "redbasic", "nav_active_gradient_bottom");
- $nav_bd = get_pconfig($uid, "redbasic", "nav_bd");
- $nav_icon_colour = get_pconfig($uid, "redbasic", "nav_icon_colour");
- $nav_active_icon_colour = get_pconfig($uid, "redbasic", "nav_active_icon_colour");
- $narrow_navbar = get_pconfig($uid,'redbasic','narrow_navbar');
+ $nav_bg = get_pconfig($uid, 'redbasic', 'nav_bg');
+ $nav_icon_colour = get_pconfig($uid, 'redbasic', 'nav_icon_colour');
+ $nav_active_icon_colour = get_pconfig($uid, 'redbasic', 'nav_active_icon_colour');
$banner_colour = get_pconfig($uid,'redbasic','banner_colour');
- $link_colour = get_pconfig($uid, "redbasic", "link_colour");
+ $narrow_navbar = get_pconfig($uid,'redbasic','narrow_navbar');
+ $link_colour = get_pconfig($uid, 'redbasic', 'link_colour');
$schema = get_pconfig($uid,'redbasic','schema');
- $bgcolour = get_pconfig($uid, "redbasic", "background_colour");
- $background_image = get_pconfig($uid, "redbasic", "background_image");
- $toolicon_colour = get_pconfig($uid,'redbasic','toolicon_colour');
- $toolicon_activecolour = get_pconfig($uid,'redbasic','toolicon_activecolour');
- $item_colour = get_pconfig($uid, "redbasic", "item_colour");
- $comment_item_colour = get_pconfig($uid, "redbasic", "comment_item_colour");
- $comment_border_colour = get_pconfig($uid, "redbasic", "comment_border_colour");
- $comment_indent = get_pconfig($uid, "redbasic", "comment_indent");
- $body_font_size = get_pconfig($uid, "redbasic", "body_font_size");
- $font_size = get_pconfig($uid, "redbasic", "font_size");
- $font_colour = get_pconfig($uid, "redbasic", "font_colour");
- $radius = get_pconfig($uid, "redbasic", "radius");
- $shadow = get_pconfig($uid,"redbasic","photo_shadow");
- $converse_width=get_pconfig($uid,"redbasic","converse_width");
- $align_left=get_pconfig($uid,"redbasic","align_left");
- $nav_min_opacity=get_pconfig($uid,'redbasic','nav_min_opacity');
+ $bgcolour = get_pconfig($uid, 'redbasic', 'background_colour');
+ $background_image = get_pconfig($uid, 'redbasic', 'background_image');
+ $item_colour = get_pconfig($uid, 'redbasic', 'item_colour');
+ $comment_item_colour = get_pconfig($uid, 'redbasic', 'comment_item_colour');
+ $font_size = get_pconfig($uid, 'redbasic', 'font_size');
+ $font_colour = get_pconfig($uid, 'redbasic', 'font_colour');
+ $radius = get_pconfig($uid, 'redbasic', 'radius');
+ $shadow = get_pconfig($uid,'redbasic','photo_shadow');
+ $converse_width=get_pconfig($uid,'redbasic','converse_width');
+ $align_left=get_pconfig($uid,'redbasic','align_left');
$top_photo=get_pconfig($uid,'redbasic','top_photo');
$reply_photo=get_pconfig($uid,'redbasic','reply_photo');
}
@@ -86,67 +75,39 @@ if (! $schema) {
//Set some defaults - we have to do this after pulling owner settings, and we have to check for each setting
//individually. If we don't, we'll have problems if a user has set one, but not all options.
if (! $nav_bg)
- $nav_bg = "#222";
-if (! $nav_gradient_top)
- $nav_gradient_top = "#3c3c3c";
-if (! $nav_gradient_bottom)
- $nav_gradient_bottom = "#222";
-if (! $nav_active_gradient_top)
- $nav_active_gradient_top = "#222";
-if (! $nav_active_gradient_bottom)
- $nav_active_gradient_bottom = "#282828";
-if (! $nav_bd)
- $nav_bd = "#222";
+ $nav_bg = '#222';
if (! $nav_icon_colour)
- $nav_icon_colour = "#999";
+ $nav_icon_colour = 'rgba(255, 255, 255, 0.5)';
if (! $nav_active_icon_colour)
- $nav_active_icon_colour = "#fff";
+ $nav_active_icon_colour = 'rgba(255, 255, 255, 0.75)';
if (! $link_colour)
- $link_colour = "#337AB7";
+ $link_colour = '#0275d8';
if (! $banner_colour)
- $banner_colour = "#fff";
+ $banner_colour = '#fff';
if (! $bgcolour)
- $bgcolour = "rgb(254,254,254)";
+ $bgcolour = 'rgb(254,254,254)';
if (! $background_image)
$background_image ='';
if (! $item_colour)
- $item_colour = "rgb(238,238,238)";
+ $item_colour = 'rgb(238,238,238)';
if (! $comment_item_colour)
- $comment_item_colour = "rgb(255,255,255)";
-if (! $comment_border_colour)
- $comment_border_colour = "rgb(255,255,255)";
-if (! $toolicon_colour)
- $toolicon_colour = '#777';
-if (! $toolicon_activecolour)
- $toolicon_activecolour = '#000';
+ $comment_item_colour = 'rgb(255,255,255)';
if (! $item_opacity)
- $item_opacity = "1";
+ $item_opacity = '1';
if (! $font_size)
- $font_size = "0.9rem";
-if (! $body_font_size)
- $body_font_size = "0.75rem";
+ $font_size = '0.875rem';
if (! $font_colour)
- $font_colour = "#4d4d4d";
+ $font_colour = '#4d4d4d';
if (! $radius)
- $radius = "4";
+ $radius = '0.25rem';
if (! $shadow)
- $shadow = "0";
+ $shadow = '0';
if (! $converse_width)
- $converse_width = "790";
+ $converse_width = '790';
if(! $top_photo)
- $top_photo = '48px';
-if(! $comment_indent)
- $comment_indent = '0px';
+ $top_photo = '2.3rem';
if(! $reply_photo)
- $reply_photo = '32px';
-if($nav_min_opacity === false || $nav_min_opacity === '') {
- $nav_float_min_opacity = 1.0;
- $nav_percent_min_opacity = 100;
-}
-else {
- $nav_float_min_opacity = (float) $nav_min_opacity;
- $nav_percent_min_opacity = (int) 100 * $nav_min_opacity;
-}
+ $reply_photo = '2.3rem';
// Apply the settings
if(file_exists('view/theme/redbasic/css/style.css')) {
@@ -179,11 +140,6 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
$options = array (
'$nav_bg' => $nav_bg,
- '$nav_gradient_top' => $nav_gradient_top,
- '$nav_gradient_bottom' => $nav_gradient_bottom,
- '$nav_active_gradient_top' => $nav_active_gradient_top,
- '$nav_active_gradient_bottom' => $nav_active_gradient_bottom,
- '$nav_bd' => $nav_bd,
'$nav_icon_colour' => $nav_icon_colour,
'$nav_active_icon_colour' => $nav_active_icon_colour,
'$link_colour' => $link_colour,
@@ -192,12 +148,8 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
'$background_image' => $background_image,
'$item_colour' => $item_colour,
'$comment_item_colour' => $comment_item_colour,
- '$comment_border_colour' => $comment_border_colour,
- '$toolicon_colour' => $toolicon_colour,
- '$toolicon_activecolour' => $toolicon_activecolour,
'$font_size' => $font_size,
'$font_colour' => $font_colour,
- '$body_font_size' => $body_font_size,
'$radius' => $radius,
'$shadow' => $shadow,
'$converse_width' => $converse_width,
@@ -207,7 +159,6 @@ if(file_exists('view/theme/redbasic/css/style.css')) {
'$reply_photo' => $reply_photo,
'$pmenu_top' => $pmenu_top,
'$pmenu_reply' => $pmenu_reply,
- '$comment_indent' => $comment_indent,
'$main_width' => $main_width,
'$aside_width' => $aside_width
);
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index 997b59750..a1147a5b4 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -3,7 +3,9 @@
/**
* * Name: Redbasic
* * Description: Hubzilla standard theme
- * * Version: 1.0
+ * * Version: 2.1
+ * * MinVersion: 2.3.1
+ * * MaxVersion: 3.0
* * Author: Fabrixxm
* * Maintainer: Mike Macgirvin
* * Maintainer: Mario Vavti
diff --git a/view/theme/redbasic/php/theme_init.php b/view/theme/redbasic/php/theme_init.php
index 3179c7078..020bda363 100644
--- a/view/theme/redbasic/php/theme_init.php
+++ b/view/theme/redbasic/php/theme_init.php
@@ -1,19 +1,17 @@
<?php
-head_add_css('library/font_awesome/css/font-awesome.min.css');
-head_add_css('library/bootstrap/css/bootstrap.min.css');
-head_add_css('library/bootstrap-tagsinput/bootstrap-tagsinput.css');
-head_add_css('view/css/bootstrap-red.css');
-head_add_css('library/datetimepicker/jquery.datetimepicker.css');
-//head_add_css('library/colorpicker/css/colorpicker.css');
-head_add_css('library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
+head_add_css('/library/font_awesome/css/font-awesome.min.css');
+head_add_css('/library/bootstrap/css/bootstrap.min.css');
+head_add_css('/library/bootstrap-tagsinput/bootstrap-tagsinput.css');
+head_add_css('/view/css/bootstrap-red.css');
+head_add_css('/library/datetimepicker/jquery.datetimepicker.css');
+head_add_css('/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
require_once('view/php/theme_init.php');
-head_add_js('library/bootstrap/js/bootstrap.min.js');
-head_add_js('library/bootbox/bootbox.min.js');
-head_add_js('library/bootstrap-tagsinput/bootstrap-tagsinput.js');
-head_add_js('library/datetimepicker/jquery.datetimepicker.js');
-//head_add_js('library/colorpicker/js/colorpicker.js');
-head_add_js('library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js');
-//head_add_js('library/bootstrap-colorpicker/src/js/docs.js');
+head_add_js('/library/bootstrap/js/bootstrap.min.js');
+head_add_js('/library/bootbox/bootbox.min.js');
+head_add_js('/library/bootstrap-tagsinput/bootstrap-tagsinput.js');
+head_add_js('/library/datetimepicker/jquery.datetimepicker.js');
+head_add_js('/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js');
+
diff --git a/view/theme/redbasic/schema/bluegrid.css b/view/theme/redbasic/schema/bluegrid.css
index 64e5a2c95..46e28197e 100644
--- a/view/theme/redbasic/schema/bluegrid.css
+++ b/view/theme/redbasic/schema/bluegrid.css
@@ -116,7 +116,7 @@ input#jot-title:hover, input#jot-title:focus {
}
nav .dropdown-menu, .wall-item-tools .dropdown-menu, .section-title-wrapper .dropdown-menu, .section-content-wrapper .dropdown-menu {
- background-color: rgba(67,72,138,.97);
+ background-color: #43488A;
color: #fff;
border-radius: 0;
border: none;
@@ -304,6 +304,30 @@ input {
#login-main {
margin-top: 0;
+ color: #EEE;
+}
+
+#remember_me_container label:hover, #remember_container label:hover {
+ color: #FFF;
+}
+
+#login-main #lost-password-link, #login-main #register-link {
+ color: #FFF;
+}
+
+#nav-login .modal-content {
+ background-color: #43488A;
+ background-image: url('/images/bggrid.png');
+ box-shadow: 0 5px 15px rgba(0,0,0,.3);
+ -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.3);
+}
+
+#nav-login h3, #nav-login button.close {
+ color: #EEE;
+}
+
+#nav-login .modal-header {
+ border-bottom: none;
}
.directory-item {
diff --git a/view/theme/redbasic/schema/dark.css b/view/theme/redbasic/schema/dark.css
index f9114141d..ebef68a52 100644
--- a/view/theme/redbasic/schema/dark.css
+++ b/view/theme/redbasic/schema/dark.css
@@ -417,7 +417,6 @@ pre {
.contextual-help-content-open {
background: $nav_bg;
- top: 50px;
border-bottom: #555 1px solid;
box-shadow: 0px 3px 3px rgba(85,85,85,0.2);
}
diff --git a/view/theme/redbasic/schema/simple_black_on_white.css b/view/theme/redbasic/schema/simple_black_on_white.css
index f06fd3667..915cc4e18 100644
--- a/view/theme/redbasic/schema/simple_black_on_white.css
+++ b/view/theme/redbasic/schema/simple_black_on_white.css
@@ -294,8 +294,6 @@ pre {
.contextual-help-content-open {
background: #FFF;
- top: 50px;
-
}
.profile-match-wrapper {
diff --git a/view/theme/redbasic/schema/simple_green_on_black.css b/view/theme/redbasic/schema/simple_green_on_black.css
index c7bb99334..7f3f99fce 100644
--- a/view/theme/redbasic/schema/simple_green_on_black.css
+++ b/view/theme/redbasic/schema/simple_green_on_black.css
@@ -367,7 +367,6 @@ pre {
.contextual-help-content-open {
background: $nav_bg;
- top: 50px;
border-bottom: #1C5419 1px solid;
box-shadow: 0px 3px 3px rgba(28,84,25,0.2);
}
diff --git a/view/theme/redbasic/schema/simple_white_on_black.css b/view/theme/redbasic/schema/simple_white_on_black.css
index dabc26743..7e7f80f2f 100644
--- a/view/theme/redbasic/schema/simple_white_on_black.css
+++ b/view/theme/redbasic/schema/simple_white_on_black.css
@@ -340,7 +340,6 @@ pre {
.contextual-help-content-open {
background: $nav_bg;
- top: 50px;
border-bottom: #FFF 1px solid;
box-shadow: 0px 3px 3px rgba(255,255,255,0.2);
}
diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl
index 9672d3d05..f90e37ac3 100644
--- a/view/theme/redbasic/tpl/theme_settings.tpl
+++ b/view/theme/redbasic/tpl/theme_settings.tpl
@@ -1,29 +1,20 @@
{{include file="field_checkbox.tpl" field=$align_left}}
{{include file="field_checkbox.tpl" field=$narrow_navbar}}
{{include file="field_input.tpl" field=$converse_width}}
+{{include file="field_input.tpl" field=$font_size}}
{{if $expert}}
{{include file="field_colorinput.tpl" field=$nav_bg}}
- {{include file="field_colorinput.tpl" field=$nav_gradient_top}}
- {{include file="field_colorinput.tpl" field=$nav_gradient_bottom}}
- {{include file="field_colorinput.tpl" field=$nav_active_gradient_top}}
- {{include file="field_colorinput.tpl" field=$nav_active_gradient_bottom}}
- {{include file="field_colorinput.tpl" field=$nav_bd}}
{{include file="field_colorinput.tpl" field=$nav_icon_colour}}
{{include file="field_colorinput.tpl" field=$nav_active_icon_colour}}
- {{include file="field_input.tpl" field=$nav_min_opacity}}
+ {{include file="field_colorinput.tpl" field=$banner_colour}}
{{include file="field_colorinput.tpl" field=$bgcolour}}
{{include file="field_colorinput.tpl" field=$background_image}}
{{include file="field_colorinput.tpl" field=$item_colour}}
{{include file="field_colorinput.tpl" field=$comment_item_colour}}
{{*include file="field_colorinput.tpl" field=$comment_border_colour*}}
{{*include file="field_input.tpl" field=$comment_indent*}}
- {{include file="field_input.tpl" field=$body_font_size}}
- {{include file="field_input.tpl" field=$font_size}}
{{include file="field_colorinput.tpl" field=$font_colour}}
{{include file="field_colorinput.tpl" field=$link_colour}}
- {{include file="field_colorinput.tpl" field=$banner_colour}}
- {{include file="field_colorinput.tpl" field=$toolicon_colour}}
- {{include file="field_colorinput.tpl" field=$toolicon_activecolour}}
{{include file="field_input.tpl" field=$radius}}
{{include file="field_input.tpl" field=$shadow}}
{{include file="field_input.tpl" field=$top_photo}}
@@ -31,8 +22,8 @@
<script>
$(function(){
- $('#id_redbasic_nav_bg,#id_redbasic_nav_gradient_top,#id_redbasic_nav_gradient_bottom,#id_redbasic_nav_active_gradient_top,#id_redbasic_nav_active_gradient_bottom').colorpicker({format: 'rgba'});
- $('#id_redbasic_nav_bd,#id_redbasic_nav_icon_colour ,#id_redbasic_nav_active_icon_colour,#id_redbasic_banner_colour,#id_redbasic_link_colour,#id_redbasic_background_colour').colorpicker();
+ $('#id_redbasic_nav_bg, #id_redbasic_nav_icon_colour, #id_redbasic_nav_active_icon_colour, #id_redbasic_banner_colour').colorpicker({format: 'rgba'});
+ $('#id_redbasic_link_colour,#id_redbasic_background_colour').colorpicker();
$('#id_redbasic_toolicon_colour,#id_redbasic_toolicon_activecolour,#id_redbasic_font_colour').colorpicker();
$('#id_redbasic_item_colour,#id_redbasic_comment_item_colour,#id_redbasic_comment_border_colour').colorpicker({format: 'rgba'});
});
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index ebc69c5f8..9fb5c4b18 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -3,31 +3,36 @@
{{if $notself}}
<div class="pull-right">
<div class="btn-group">
- <button id="connection-dropdown" class="btn btn-default btn-xs dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button id="connection-dropdown" class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
- <li><a href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a></li>
- <li><a href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a></li>
- <li class="divider"></li>
- <li><a href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a></li>
- <li><a href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a></li>
- <li><a href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a></li>
- <li><a href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a></li>
- <li><a href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a></li>
- <li><a href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a></li>
- </ul>
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
+ <a class="dropdown-item" href="{{$tools.view.url}}" title="{{$tools.view.title}}">{{$tools.view.label}}</a>
+ <a class="dropdown-item" href="{{$tools.recent.url}}" title="{{$tools.recent.title}}">{{$tools.recent.label}}</a>
+ {{if $tools.fetchvc}}
+ <a class="dropdown-item" href="{{$tools.fetchvc.url}}" title="{{$tools.fetchvc.title}}">{{$tools.fetchvc.label}}</a>
+ {{/if}}
+ <a class="dropdown-item" href="#" title="{{$tools.refresh.title}}" onclick="window.location.href='{{$tools.refresh.url}}'; return false;">{{$tools.refresh.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.rephoto.title}}" onclick="window.location.href='{{$tools.rephoto.url}}'; return false;">{{$tools.rephoto.label}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" title="{{$tools.block.title}}" onclick="window.location.href='{{$tools.block.url}}'; return false;">{{$tools.block.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.ignore.title}}" onclick="window.location.href='{{$tools.ignore.url}}'; return false;">{{$tools.ignore.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.archive.title}}" onclick="window.location.href='{{$tools.archive.url}}'; return false;">{{$tools.archive.label}}</a> <a class="dropdown-item" href="#" title="{{$tools.hide.title}}" onclick="window.location.href='{{$tools.hide.url}}'; return false;">{{$tools.hide.label}}</a>
+ <a class="dropdown-item" href="#" title="{{$tools.delete.title}}" onclick="window.location.href='{{$tools.delete.url}}'; return false;">{{$tools.delete.label}}</a>
+ </div>
</div>
{{if $abook_prev || $abook_next}}
<div class="btn-group">
- <a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs{{if ! $abook_prev}} disabled{{/if}}" ><i class="fa fa-backward"></i></a>
- <button class="btn btn-default btn-xs{{if $is_pending}} disabled{{/if}}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-bars"></i></button>
- <a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-default btn-xs{{if ! $abook_next}} disabled{{/if}}" ><i class="fa fa-forward"></i></a>
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
- {{foreach $sections as $s}}
- <li><a href="{{$s.url}}" title="{{$s.title}}">{{$s.label}}</a></li>
- {{/foreach}}
- </ul>
+ <a href="connedit/{{$abook_prev}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_prev}} disabled{{/if}}" ><i class="fa fa-backward"></i></a>
+ <div class="btn-group" >
+ <button class="btn btn-outline-secondary btn-sm{{if $is_pending}} disabled{{/if}}" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-bars"></i></button>
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dLabel">
+ {{foreach $sections as $s}}
+ <a class="dropdown-item" href="{{$s.url}}" title="{{$s.title}}">{{$s.label}}</a>
+ {{/foreach}}
+ </div>
+ </div>
+ <a href="connedit/{{$abook_next}}{{if $section}}?f=&section={{$section}}{{/if}}" class="btn btn-outline-secondary btn-sm{{if ! $abook_next}} disabled{{/if}}" ><i class="fa fa-forward"></i></a>
</div>
{{/if}}
</div>
@@ -79,7 +84,7 @@
</a>
</h3>
</div>
- <div id="pending-tool-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="pending-tool">
+ <div id="pending-tool-collapse" class="panel-collapse collapse show" role="tabpanel" aria-labelledby="pending-tool">
<div class="section-content-tools-wrapper">
{{include file="field_checkbox.tpl" field=$unapproved}}
<div class="settings-submit-wrapper" >
@@ -187,7 +192,7 @@
<div class="section-content-wrapper-np">
<div id="vcard-cancel-{{$vcard.id}}" class="vcard-cancel vcard-cancel-btn" data-id="{{$vcard.id}}" data-action="cancel"><i class="fa fa-close"></i></div>
<div id="vcard-add-field-{{$vcard.id}}" class="dropdown pull-right vcard-add-field">
- <button data-toggle="dropdown" type="button" class="btn btn-default btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
<ul class="dropdown-menu">
<li class="add-vcard-org"{{if $vcard.org}} style="display: none"{{/if}}><a href="#" data-add="vcard-org" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$org_label}}</a></li>
<li class="add-vcard-title"{{if $vcard.title}} style="display: none"{{/if}}><a href="#" data-add="vcard-title" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$title_label}}</a></li>
@@ -203,8 +208,8 @@
<i class="vcard-fn-preview fa fa-address-card-o"></i>
<span id="vcard-preview-{{$vcard.id}}" class="vcard-preview">
{{if $vcard.fn}}<span class="vcard-fn-preview">{{$vcard.fn}}</span>{{/if}}
- {{if $vcard.emails.0.address}}<span class="vcard-email-preview hidden-xs"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
- {{if $vcard.tels.0}}<span class="vcard-tel-preview hidden-xs">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-default btn-xs" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
+ {{if $vcard.emails.0.address}}<span class="vcard-email-preview d-none d-md-table-cell"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
+ {{if $vcard.tels.0}}<span class="vcard-tel-preview d-none d-md-table-cell">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-outline-secondary btn-sm" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
</span>
<input id="vcard-fn-{{$vcard.id}}" class="vcard-fn" type="text" name="fn" value="{{$vcard.fn}}" size="{{$vcard.fn|count_characters:true}}" placeholder="{{$name_label}}">
</div>
@@ -381,7 +386,7 @@
</a>
</h3>
</div>
- <div id="affinity-tool-collapse" class="panel-collapse collapse{{if $section == 'affinity'}} in{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
+ <div id="affinity-tool-collapse" class="panel-collapse collapse{{if $section == 'affinity'}} show{{/if}}" role="tabpanel" aria-labelledby="affinity-tool">
<div class="section-content-tools-wrapper">
{{if $slide}}
<div class="form-group"><strong>{{$lbl_slider}}</strong></div>
@@ -412,7 +417,7 @@
</a>
</h3>
</div>
- <div id="fitert-tool-collapse" class="panel-collapse collapse{{if $section == 'filter' }} in{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
+ <div id="fitert-tool-collapse" class="panel-collapse collapse{{if $section == 'filter' }} show{{/if}}" role="tabpanel" aria-labelledby="fitert-tool">
<div class="section-content-tools-wrapper">
{{include file="field_textarea.tpl" field=$incl}}
{{include file="field_textarea.tpl" field=$excl}}
@@ -466,7 +471,7 @@
</h3>
</div>
{{/if}}
- <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} in{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
+ <div id="perms-tool-collapse" class="panel-collapse collapse{{if $self || $section === 'perms'}} show{{/if}}" role="tabpanel" aria-labelledby="perms-tool">
<div class="section-content-tools-wrapper">
<div class="section-content-warning-wrapper">
{{if $notself}}{{$permnote}}{{/if}}
diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl
index c23840c16..f4f851c8a 100755
--- a/view/tpl/acl_selector.tpl
+++ b/view/tpl/acl_selector.tpl
@@ -3,11 +3,13 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">
+ <i id="dialog-perms-icon" class="fa fa-fw"></i> {{$aclModalTitle}}
+ {{if $helpUrl}}
+ <a target="hubzilla-help" href="{{$helpUrl}}" class="contextual-help-tool" title="Help and documentation"><i class="fa fa-fw fa-question"></i></a>
+ {{/if}}
+ </h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- {{if $helpUrl}}
- <a type="button" target="hubzilla-help" href="{{$helpUrl}}" class="contextual-help-tool" title="Help and documentation"><i class="fa fa-question"></i></a>
- {{/if}}
- <h4 class="modal-title"><i id="dialog-perms-icon" class="fa fa-fw"></i> {{$aclModalTitle}}</h4>
</div>
<div class="section-content-wrapper">
{{if $aclModalDesc}}
@@ -29,32 +31,30 @@
<div id="acl-wrapper">
<div id="acl-list">
- <div id="acl-search-wrapper">
- <input type="text" id="acl-search" placeholder="&#xf002; {{$search}}">
- </div>
- <div id="acl-list-content-wrapper">
- <div id=acl-showlimited-description>{{$showlimitedDesc}}</div>
- <div id="acl-list-content"></div>
- </div>
+ <input class="form-control" type="text" id="acl-search" placeholder="&#xf002; {{$search}}">
+ <small class="text-muted">{{$showlimitedDesc}}</small>
+ <div id="acl-list-content"></div>
</div>
</div>
<div class="acl-list-item" rel="acl-template" style="display:none">
- <img data-src="{0}"><p>{1}</p>
- <button class="acl-button-hide btn btn-xs btn-default"><i class="fa fa-times"></i> {{$hide}}</button>
- <button class="acl-button-show btn btn-xs btn-default"><i class="fa fa-check"></i> {{$show}}</button>
+ <div class="acl-item-header">
+ <img class="menu-img-1" data-src="{0}"> {1}
+ </div>
+ <button class="acl-button-hide btn btn-sm btn-outline-danger"><i class="fa fa-times"></i> {{$hide}}</button>
+ <button class="acl-button-show btn btn-sm btn-outline-success"><i class="fa fa-check"></i> {{$show}}</button>
</div>
-
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$aclModalDismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$aclModalDismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</form>
<script>
- $('[data-toggle="popover"]').popover(); // Init the popover, if present
+ // compatibility issue with bootstrap v4
+ //$('[data-toggle="popover"]').popover(); // Init the popover, if present
if(typeof acl=="undefined"){
acl = new ACL(
diff --git a/view/tpl/admin_accounts.tpl b/view/tpl/admin_accounts.tpl
index c2a50e3ff..3535363a0 100755
--- a/view/tpl/admin_accounts.tpl
+++ b/view/tpl/admin_accounts.tpl
@@ -33,8 +33,8 @@
<td class="email">{{$u.account_email}}</td>
<td class="checkbox_bulkedit"><input type="checkbox" class="pending_ckbx" id="id_pending_{{$u.hash}}" name="pending[]" value="{{$u.hash}}"></td>
<td class="tools">
- <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" class="btn btn-default btn-xs" title="{{$approve}}"><i class="fa fa-thumbs-o-up admin-icons"></i></a>
- <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" class="btn btn-default btn-xs" title="{{$deny}}"><i class="fa fa-thumbs-o-down admin-icons"></i></a>
+ <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" class="btn btn-outline-secondary btn-sm" title="{{$approve}}"><i class="fa fa-thumbs-o-up admin-icons"></i></a>
+ <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" class="btn btn-outline-secondary btn-sm" title="{{$deny}}"><i class="fa fa-thumbs-o-down admin-icons"></i></a>
</td>
</tr>
{{/foreach}}
@@ -73,7 +73,7 @@
<td class="service_class">{{$u.account_service_class}}</td>
<td class="checkbox_bulkedit"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"><input type="hidden" name="blocked[]" value="{{$u.blocked}}"></td>
<td class="tools">
- <a href="{{$baseurl}}/admin/accounts/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/accounts/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
+ <a href="{{$baseurl}}/admin/accounts/{{if ($u.blocked)}}un{{/if}}block/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-outline-secondary btn-sm" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class="fa fa-ban admin-icons{{if ($u.blocked)}} dim{{/if}}"></i></a><a href="{{$baseurl}}/admin/accounts/delete/{{$u.account_id}}?t={{$form_security_token}}" class="btn btn-outline-secondary btn-sm" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class="fa fa-trash-o admin-icons"></i></a>
</td>
</tr>
{{/foreach}}
diff --git a/view/tpl/admin_aside.tpl b/view/tpl/admin_aside.tpl
index 70e1677af..99f139e57 100755
--- a/view/tpl/admin_aside.tpl
+++ b/view/tpl/admin_aside.tpl
@@ -12,17 +12,17 @@
</script>
<div class="widget">
<h3>{{$admtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
+<ul class="nav nav-pills flex-column">
{{foreach $admin as $link}}
- <li><a href='{{$link.0}}'>{{$link.1}}{{if $link.3}}<span id='{{$link.3}}' title='{{$link.4}}'></span>{{/if}}</a></li>
+ <li class="nav-item"><a class="nav-link" href='{{$link.0}}'>{{$link.1}}{{if $link.3}}<span id='{{$link.3}}' title='{{$link.4}}'></span>{{/if}}</a></li>
{{/foreach}}
</ul>
</div>
{{if $admin.update}}
-<ul class="nav nav-pills nav-stacked">
- <li><a href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
- <li><a href=''>Important Changes</a></li>
+<ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
+ <li class="nav-item"><a class="nav-link" href=''>Important Changes</a></li>
</ul>
{{/if}}
@@ -30,9 +30,9 @@
{{if $plugins}}
<div class="widget">
<h3>{{$plugadmtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
+<ul class="nav nav-pills flex-column">
{{foreach $plugins as $l}}
- <li><a href='{{$l.0}}'>{{$l.1}}</a></li>
+ <li class="nav-item"><a class="nav-link" href='{{$l.0}}'>{{$l.1}}</a></li>
{{/foreach}}
</ul>
</div>
@@ -40,7 +40,7 @@
<div class="widget">
<h3>{{$logtxt}}</h3>
-<ul class="nav nav-pills nav-stacked">
- <li><a href='{{$logs.0}}'>{{$logs.1}}</a></li>
+<ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href='{{$logs.0}}'>{{$logs.1}}</a></li>
</ul>
</div>
diff --git a/view/tpl/admin_channels.tpl b/view/tpl/admin_channels.tpl
index f15742f78..452e0eeec 100755
--- a/view/tpl/admin_channels.tpl
+++ b/view/tpl/admin_channels.tpl
@@ -35,7 +35,7 @@
<td class="checkbox_bulkedit"><input type="checkbox" class="channels_ckbx" id="id_channel_{{$c.channel_id}}" name="channel[]" value="{{$c.channel_id}}"/></td>
<td class="tools">
<a href="{{$baseurl}}/admin/channels/block/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($c.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class='fa fa-ban admin-icons {{if ($c.blocked)}}dim{{/if}}'></i></a>
- <a href="{{$baseurl}}/admin/channels/code/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{if ($c.allowcode)}}{{$uncode}}{{else}}{{$code}}{{/if}}'><i class='fa fa-terminal admin-icons {{if ($c.allowcode)}}dim{{/if}}'></i></a>
+ <a href="{{$baseurl}}/admin/channels/code/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs{{if ($c.allowcode)}} btn-danger{{/if}}" title='{{if ($c.allowcode)}}{{$uncode}}{{else}}{{$code}}{{/if}}'><i class='fa fa-terminal admin-icons {{if ($c.allowcode)}}dim{{/if}}'></i></a>
<a href="{{$baseurl}}/admin/channels/delete/{{$c.channel_id}}?t={{$form_security_token}}" class="btn btn-default btn-xs" title='{{$delete}}' onclick="return confirm_delete('{{$c.channel_name}}')"><i class='fa fa-trash-o admin-icons'></i></a>
</td>
</tr>
diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl
index 4360aa30c..fd5ae7d5e 100755
--- a/view/tpl/admin_plugins.tpl
+++ b/view/tpl/admin_plugins.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $allowManageRepos}}
<div class="pull-right">
- <button class="btn btn-success btn-xs" onclick="openClose('form');">{{$managerepos}}</button>
+ <button class="btn btn-success btn-sm" onclick="openClose('form');">{{$managerepos}}</button>
</div>
{{/if}}
<h2 id="title">{{$title}} - {{$page}}</h2>
@@ -23,10 +23,10 @@
<span class="pull-left">{{$repo.name}}</span><span id="update-message-{{$repo.name}}" style="margin-left: 20px;"></span>
</td>
<td style="width: 15%;">
- <button class="btn btn-xs btn-primary pull-right" style="margin-left: 10px; margin-right: 10px;" onclick="updateAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-download'></i>&nbsp;{{$repoUpdateButton}}</button>
+ <button class="btn btn-sm btn-primary pull-right" style="margin-left: 10px; margin-right: 10px;" onclick="updateAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-download'></i>&nbsp;{{$repoUpdateButton}}</button>
</td>
<td style="width: 15%;">
- <button class="btn btn-xs btn-danger pull-right" style="margin-left: 10px; margin-right: 0px;" onclick="removeAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-trash-o'></i>&nbsp;{{$repoRemoveButton}}</button>
+ <button class="btn btn-sm btn-danger pull-right" style="margin-left: 10px; margin-right: 0px;" onclick="removeAddonRepo('{{$repo.name}}'); return false;"><i class='fa fa-trash-o'></i>&nbsp;{{$repoRemoveButton}}</button>
</td>
<div class="clear"></div>
</td></tr>
diff --git a/view/tpl/admin_profiles.tpl b/view/tpl/admin_profiles.tpl
index 35685505f..e3a08449c 100644
--- a/view/tpl/admin_profiles.tpl
+++ b/view/tpl/admin_profiles.tpl
@@ -1,5 +1,5 @@
<div class="generic-content-wrapper">
-<div class="section-title-wrapper"><a title="{{$new}}" class="btn btn-primary btn-xs pull-right" href="admin/profs/new"><i class="fa fa-plus-circle"></i>&nbsp;{{$new}}</a><h2>{{$title}}</h2>
+<div class="section-title-wrapper"><a title="{{$new}}" class="btn btn-primary btn-sm pull-right" href="admin/profs/new"><i class="fa fa-plus-circle"></i>&nbsp;{{$new}}</a><h2>{{$title}}</h2>
<div class="clear"></div>
</div>
@@ -28,7 +28,7 @@
<table width="100%">
{{foreach $cust_fields as $field}}
-<tr><td>{{$field.field_name}}</td><td>{{$field.field_desc}}</td><td><a class="btn btn-danger btn-xs" href="admin/profs/drop/{{$field.id}}" title="{{$drop}}"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</a> <a class="btn btn-xs" title="{{$edit}}" href="admin/profs/{{$field.id}}" ><i class="fa fa-pencil"></i></a></td></tr>
+<tr><td>{{$field.field_name}}</td><td>{{$field.field_desc}}</td><td><a class="btn btn-danger btn-sm" href="admin/profs/drop/{{$field.id}}" title="{{$drop}}"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</a> <a class="btn btn-sm" title="{{$edit}}" href="admin/profs/{{$field.id}}" ><i class="fa fa-pencil"></i></a></td></tr>
{{/foreach}}
</table>
{{/if}}
diff --git a/view/tpl/admin_queue.tpl b/view/tpl/admin_queue.tpl
index 35c2e644a..9d3d848c9 100644
--- a/view/tpl/admin_queue.tpl
+++ b/view/tpl/admin_queue.tpl
@@ -7,7 +7,7 @@
{{foreach $entries as $e}}
-<tr><td>{{$e.total}}</td><td>{{$e.outq_posturl}}</td><td>{{$e.priority}}</td>{{if $expert}}<td><a href="admin/queue?f=&drophub={{$e.eurl}}" title="{{$nukehub}}" class="btn btn-default"><i class="fa fa-times"></i><a></td><td><a href="admin/queue?f=&emptyhub={{$e.eurl}}" title="{{$empty}}" class="btn btn-default"><i class="fa fa-trash-o"></i></a></td>{{/if}}</tr>
+<tr><td>{{$e.total}}</td><td>{{$e.outq_posturl}}</td><td>{{$e.priority}}</td>{{if $expert}}<td><a href="admin/queue?f=&drophub={{$e.eurl}}" title="{{$nukehub}}" class="btn btn-outline-secondary"><i class="fa fa-times"></i><a></td><td><a href="admin/queue?f=&emptyhub={{$e.eurl}}" title="{{$empty}}" class="btn btn-outline-secondary"><i class="fa fa-trash-o"></i></a></td>{{/if}}</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index 0bb3ceb15..6fd0fd9ce 100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -51,6 +51,11 @@
{{include file="field_textarea.tpl" field=$banner}}
{{include file="field_textarea.tpl" field=$siteinfo}}
{{include file="field_textarea.tpl" field=$admininfo}}
+
+ {{include file="field_input.tpl" field=$reply_address}}
+ {{include file="field_input.tpl" field=$from_email}}
+ {{include file="field_input.tpl" field=$from_email_name}}
+
{{include file="field_select.tpl" field=$language}}
{{include file="field_select.tpl" field=$theme}}
{{include file="field_select.tpl" field=$theme_mobile}}
@@ -71,9 +76,6 @@
{{include file="field_select.tpl" field=$access_policy}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>{{$upload}}</h3>
- {{include file="field_input.tpl" field=$maximagesize}}
-
<h3>{{$corporate}}</h3>
{{include file="field_checkbox.tpl" field=$verify_email}}
{{include file="field_checkbox.tpl" field=$feed_contacts}}
diff --git a/view/tpl/app.tpl b/view/tpl/app.tpl
index ba97ad501..28f28611e 100644
--- a/view/tpl/app.tpl
+++ b/view/tpl/app.tpl
@@ -8,23 +8,23 @@
{{if $app.type !== 'system'}}
{{if $purchase}}
<div class="app-purchase">
- <a href="{{$app.page}}" class="btn btn-default" title="{{$purchase}}" ><i class="fa fa-external"></i></a>
+ <a href="{{$app.page}}" class="btn btn-outline-secondary" title="{{$purchase}}" ><i class="fa fa-external"></i></a>
</div>
{{/if}}
{{if $install || $update || $delete || $feature}}
<div class="app-tools">
<form action="{{$hosturl}}appman" method="post">
<input type="hidden" name="papp" value="{{$app.papp}}" />
- {{if $install}}<button type="submit" name="install" value="{{$install}}" class="btn btn-default btn-xs" title="{{$install}}" ><i class="fa fa-arrow-circle-o-down" ></i></button>{{/if}}
- {{if $edit}}<input type="hidden" name="appid" value="{{$app.guid}}" /><button type="submit" name="edit" value="{{$edit}}" class="btn btn-default btn-xs" title="{{$edit}}" ><i class="fa fa-pencil" ></i></button>{{/if}}
- {{if $delete}}<button type="submit" name="delete" value="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" class="btn btn-default btn-xs" title="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" ><i class="fa fa-trash-o drop-icons"></i></button>{{/if}}
- {{if $feature}}<button type="submit" name="feature" value="feature" class="btn btn-default btn-xs" ><i class="fa fa-star"{{if $featured}} style="color: gold"{{/if}}></i></button>{{/if}}
+ {{if $install}}<button type="submit" name="install" value="{{$install}}" class="btn btn-outline-secondary btn-sm" title="{{$install}}" ><i class="fa fa-arrow-circle-o-down" ></i></button>{{/if}}
+ {{if $edit}}<input type="hidden" name="appid" value="{{$app.guid}}" /><button type="submit" name="edit" value="{{$edit}}" class="btn btn-outline-secondary btn-sm" title="{{$edit}}" ><i class="fa fa-pencil" ></i></button>{{/if}}
+ {{if $delete}}<button type="submit" name="delete" value="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" class="btn btn-outline-secondary btn-sm" title="{{if $deleted}}{{$undelete}}{{else}}{{$delete}}{{/if}}" ><i class="fa fa-trash-o drop-icons"></i></button>{{/if}}
+ {{if $feature}}<button type="submit" name="feature" value="feature" class="btn btn-outline-secondary btn-sm" title="{{if $featured}}{{$remove}}{{else}}{{$add}}{{/if}}"><i class="fa fa-star"{{if $featured}} style="color: gold"{{/if}}></i></button>{{/if}}
</form>
</div>
{{/if}}
{{/if}}
</div>
{{else}}
-<li><a href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a></li>
+<a class="dropdown-item" href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a>
{{/if}}
diff --git a/view/tpl/app_create.tpl b/view/tpl/app_create.tpl
index 7a0521436..5075ce5e2 100644
--- a/view/tpl/app_create.tpl
+++ b/view/tpl/app_create.tpl
@@ -3,7 +3,7 @@
<h2>{{$banner}}</h2>
</div>
- <div class="section-content-wrapper">
+ <div class="clearfix section-content-wrapper">
<form action="appman" method="post">
{{if $guid}}
<input type="hidden" name="guid" value="{{$guid}}" />
@@ -33,7 +33,7 @@
{{include file="field_textarea.tpl" field=$embed}}
{{/if}}
- <input type="submit" name="submit" value="{{$submit}}" />
+ <button class="btn btn-primary float-right" type="submit" name="submit" value="{{$submit}}">{{$submit}}</button>
</form>
</div>
diff --git a/view/tpl/app_select.tpl b/view/tpl/app_select.tpl
deleted file mode 100644
index 86ea0b1de..000000000
--- a/view/tpl/app_select.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-{{if $authed}}
-<div class="widget">
-<h3>{{$title}}</h3>
-<ul class="nav nav-pills nav-stacked">
-<li><a href="appman"><i class="fa fa-plus"></i>&nbsp;&nbsp;{{$new}}</a></li>
-<li><a href="apps/edit{{if $cat}}/?f=&cat={{$cat}}{{/if}}"><i class="fa fa-pencil"></i>&nbsp;&nbsp;{{$edit}}</a></li>
-</ul>
-</div>
-{{/if}}
-
diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl
index 1d58004e5..62442ff7a 100644
--- a/view/tpl/attach_edit.tpl
+++ b/view/tpl/attach_edit.tpl
@@ -7,19 +7,19 @@
{{if $isadir}}{{include file="field_checkbox.tpl" field=$recurse}}{{/if}}
<div id="attach-edit-tools-share" class="btn-group form-group">
{{if !$isadir}}
- <a href="/rpost?attachment=[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" id="attach-btn" class="btn btn-default btn-xs" title="{{$attach_btn_title}}">
+ <a href="/rpost?attachment=[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" id="attach-btn" class="btn btn-outline-secondary btn-sm" title="{{$attach_btn_title}}">
<i class="fa fa-share-square-o jot-icons"></i>
</a>
{{/if}}
- <button id="link-btn" class="btn btn-default btn-xs" type="button" onclick="openClose('link-code');" title="{{$link_btn_title}}">
+ <button id="link-btn" class="btn btn-outline-secondary btn-sm" type="button" onclick="openClose('link-code');" title="{{$link_btn_title}}">
<i class="fa fa-link jot-icons"></i>
</button>
</div>
<div id="attach-edit-perms" class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>
</button>
- <button id="dbtn-submit" class="btn btn-primary btn-xs" type="submit" name="submit">
+ <button id="dbtn-submit" class="btn btn-primary btn-sm" type="submit" name="submit">
{{$submit}}
</button>
</div>
diff --git a/view/tpl/blocklist.tpl b/view/tpl/blocklist.tpl
index c88d91463..7f400bba2 100644
--- a/view/tpl/blocklist.tpl
+++ b/view/tpl/blocklist.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('block-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('block-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
</div>
{{/if}}
<h2>{{$title}}</h2>
@@ -22,8 +22,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -53,10 +53,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#block-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl
index 91bb0bfc0..a76d4e549 100755
--- a/view/tpl/build_query.tpl
+++ b/view/tpl/build_query.tpl
@@ -20,6 +20,7 @@
var bParam_static = {{$static}};
var bParam_search = "{{$search}}";
+ var bParam_xchan = "{{$xchan}}";
var bParam_order = "{{$order}}";
var bParam_file = "{{$file}}";
var bParam_cats = "{{$cats}}";
@@ -47,6 +48,7 @@
if(bParam_list != 0) bCmd = bCmd + "&list=" + bParam_list;
if(bParam_fh != 0) bCmd = bCmd + "&fh=" + bParam_fh;
if(bParam_search != "") bCmd = bCmd + "&search=" + bParam_search;
+ if(bParam_xchan != "") bCmd = bCmd + "&xchan=" + bParam_xchan;
if(bParam_order != "") bCmd = bCmd + "&order=" + bParam_order;
if(bParam_file != "") bCmd = bCmd + "&file=" + bParam_file;
if(bParam_cats != "") bCmd = bCmd + "&cat=" + bParam_cats;
diff --git a/view/tpl/categories_widget.tpl b/view/tpl/categories_widget.tpl
index ea6d28dfc..72478aa3d 100755
--- a/view/tpl/categories_widget.tpl
+++ b/view/tpl/categories_widget.tpl
@@ -2,10 +2,10 @@
<h3>{{$title}}</h3>
<div id="categories-sidebar-desc">{{$desc}}</div>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$base}}"{{if $sel_all}} class="categories-selected"{{/if}}>{{$all}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a href="{{$base}}" class="nav-link{{if $sel_all}} active{{/if}}">{{$all}}</a></li>
{{foreach $terms as $term}}
- <li><a href="{{$base}}?f=&cat={{$term.name}}"{{if $term.selected}} class="categories-selected"{{/if}}>{{$term.name}}</a></li>
+ <li class="nav-item"><a href="{{$base}}?f=&cat={{$term.name}}" class="nav-link{{if $term.selected}} active{{/if}}">{{$term.name}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl
index 2028d6181..baffe9b06 100755
--- a/view/tpl/channel_import.tpl
+++ b/view/tpl/channel_import.tpl
@@ -1,7 +1,7 @@
<h2>{{$title}}</h2>
<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
-
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
<div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
<label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
@@ -40,7 +40,4 @@
<div id="import-submit-end" class="import-field-end"></div>
<div id="import-common-desc" class="descriptive-paragraph">{{$pleasewait}}</div>
-
-
</form>
-
diff --git a/view/tpl/channels.tpl b/view/tpl/channels.tpl
index 171f833ee..f484b49e5 100755
--- a/view/tpl/channels.tpl
+++ b/view/tpl/channels.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a class="btn btn-success btn-xs pull-right" href="{{$create.0}}" title="{{$create.1}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$create.2}}</a>
+ <a class="btn btn-success btn-sm pull-right" href="{{$create.0}}" title="{{$create.1}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$create.2}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl
index 31be4136f..22f3465bf 100644
--- a/view/tpl/chat.tpl
+++ b/view/tpl/chat.tpl
@@ -5,11 +5,11 @@
<form id="chat-destroy" method="post" action="chat">
<input type="hidden" name="room_name" value="{{$room_name}}" />
<input type="hidden" name="action" value="drop" />
- <button class="btn btn-danger btn-xs" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</button>
+ <button class="btn btn-danger btn-sm" type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$drop}}</button>
</form>
{{/if}}
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(); adjustFullscreenTopBarHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false); adjustInlineTopBarHeight();"><i class="fa fa-compress"></i></button>
</div>
<h2>{{$room_name}}</h2>
<div class="clear"></div>
@@ -27,62 +27,62 @@
</div>
<div id="chat-submit-wrapper">
<div id="chat-submit" class="dropup pull-right">
- <button class="btn btn-default btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-caret-up"></i></button>
+ <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-cog"></i></button>
<button class="btn btn-primary btn-sm" type="submit" id="chat-submit" name="submit" value="{{$submit}}">{{$submit}}</button>
- <ul class="dropdown-menu">
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online"><i class="fa fa-circle online"></i>&nbsp;{{$online}}</a></li>
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away"><i class="fa fa-circle away"></i>&nbsp;{{$away}}</a></li>
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave"><i class="fa fa-circle leave"></i>&nbsp;{{$leave}}</a></li>
- <li class="divider"></li>
- <li class="nav-item" id="toggle-notifications"><a class="nav-link" href="" onclick="toggleChatNotifications(); return false;"><i id="toggle-notifications-icon" class="fa fa-bell-slash-o"></i>&nbsp;Toggle notifications</a></li>
- <li class="nav-item disabled" id="toggle-notifications-audio"><a class="nav-link" href="" onclick="toggleChatNotificationAudio(); return false;"><i id="toggle-notifications-audio-icon" class="fa fa-volume-off"></i>&nbsp;Toggle sound</a></li>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online"><i class="fa fa-circle online"></i>&nbsp;{{$online}}</a>
+ <a class="dropdown-item" href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away"><i class="fa fa-circle away"></i>&nbsp;{{$away}}</a>
+ <a class="dropdown-item" href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave"><i class="fa fa-circle leave"></i>&nbsp;{{$leave}}</a>
+ <div class="dropdown-divider"></div>
+ <a id="toggle-notifications" class="dropdown-item" href="" onclick="toggleChatNotifications(); return false;"><i id="toggle-notifications-icon" class="fa fa-bell-slash-o"></i>&nbsp;Toggle notifications</a>
+ <a id="toggle-notifications-audio" class="dropdown-item disabled" href="" onclick="toggleChatNotificationAudio(); return false;"><i id="toggle-notifications-audio-icon" class="fa fa-volume-off"></i>&nbsp;Toggle sound</a>
{{if $bookmark_link}}
- <li class="divider"></li>
- <li class="nav-item"><a class="nav-link" href="{{$bookmark_link}}" target="_blank" ><i class="fa fa-bookmark"></i>&nbsp;{{$bookmark}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$bookmark_link}}" target="_blank" ><i class="fa fa-bookmark"></i>&nbsp;{{$bookmark}}</a>
{{/if}}
- </ul>
+ </div>
</div>
<div id="chat-tools" class="btn-toolbar pull-left">
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'chatText'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'chatText'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'chatText'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'chatText'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'chatText'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'chatText'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'chatText'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'chatText'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'chatText'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
- <div class="btn-group hidden-xs">
- <button id="chat-link-wrapper" class="btn btn-default btn-sm" onclick="chatJotGetLink(); return false;" >
+ <div class="btn-group mr-2 d-none d-md-flex">
+ <button id="chat-link-wrapper" class="btn btn-outline-secondary btn-sm" onclick="chatJotGetLink(); return false;" >
<i id="chat-link" class="fa fa-link jot-icons" title="{{$insert}}" ></i>
</button>
</div>
{{if $feature_encrypt}}
- <div class="btn-group hidden-xs">
- <button id="chat-encrypt-wrapper" class="btn btn-default btn-sm" onclick="red_encrypt('{{$cipher}}', '#chatText', $('#chatText').val()); return false;">
+ <div class="btn-group mr-2 d-none d-md-flex">
+ <button id="chat-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" onclick="red_encrypt('{{$cipher}}', '#chatText', $('#chatText').val()); return false;">
<i id="chat-encrypt" class="fa fa-key jot-icons" title="{{$encrypt}}" ></i>
</button>
</div>
{{/if}}
- <div class="btn-group dropup visible-xs">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-up jot-icons"></i>
+ <div class="btn-group dropup d-md-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
- <li class="visible-xs"><a href="#" onclick="chatJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a></li>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" onclick="chatJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a>
{{if $feature_encrypt}}
- <li class="divider"></li>
- <li class="visible-xs"><a href="#" onclick="red_encrypt('{{$cipher}}', '#chatText' ,$('#chatText').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}', '#chatText' ,$('#chatText').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
<div id="chat-rotator-wrapper" class="pull-left">
@@ -150,7 +150,7 @@ function update_inroom(inroom) {
$.each( inroom, function(index, item) {
var newNode = document.createElement('div');
newNode.setAttribute('class', 'member-item');
- $(newNode).html('<img style="height: 32px; width: 32px;" src="' + item.img + '" alt="' + item.name + '" /> ' + '<span class="name">' + item.name + '</span><br /><span class="' + item.status_class + '">' + item.status + '</span>');
+ $(newNode).html('<img class="menu-img-2" src="' + item.img + '" alt="' + item.name + '" /> ' + '<span class="contactname">' + item.name + '</span><span class="' + item.status_class + '">' + item.status + '</span>');
html.appendChild(newNode);
});
memberChange = chatRoomMembersChange(inroom); // get list of arrivals and departures
diff --git a/view/tpl/chatroom_new.tpl b/view/tpl/chatroom_new.tpl
index 1b7e0501a..1497939f6 100644
--- a/view/tpl/chatroom_new.tpl
+++ b/view/tpl/chatroom_new.tpl
@@ -3,7 +3,7 @@
{{include file="field_input.tpl" field=$name}}
{{include file="field_input.tpl" field=$chat_expire}}
<div class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default" data-toggle="modal" data-target="#aclModal" title="{{$permissions}}" onclick="return false;" ><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
+ <button id="dbtn-acl" class="btn btn-outline-secondary" data-toggle="modal" data-target="#aclModal" title="{{$permissions}}" onclick="return false;" ><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
<button id="dbtn-submit" class="acl-submit btn btn-primary" type="submit" name="submit" value="{{$submit}}" data-formid="chatroom-new-form">{{$submit}}</button>
</div>
<div class="clear"></div>
diff --git a/view/tpl/chatroomlist.tpl b/view/tpl/chatroomlist.tpl
index ff4b79a4b..a81b8ec1e 100644
--- a/view/tpl/chatroomlist.tpl
+++ b/view/tpl/chatroomlist.tpl
@@ -1,9 +1,9 @@
<div id="chatroom_list" class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$baseurl}}/chat/{{$nickname}}">{{$overview}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}">{{$overview}}</a></li>
{{foreach $items as $item}}
- <li><a href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}"><span class="badge pull-right">{{$item.cr_inroom}}</span>{{$item.cr_name}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}"><span class="badge pull-right">{{$item.cr_inroom}}</span>{{$item.cr_name}}</a></li>
{{/foreach}}
</ul>
</div>
diff --git a/view/tpl/chatrooms.tpl b/view/tpl/chatrooms.tpl
index 64f6e8d0f..6be3fbdbf 100644
--- a/view/tpl/chatrooms.tpl
+++ b/view/tpl/chatrooms.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
{{if $is_owner}}
- <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('chatroom-new');" data-form_id="chatroom-new-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$newroom}}</button>
+ <button type="button" class="btn btn-success btn-sm pull-right acl-form-trigger" onclick="openClose('chatroom-new');" data-form_id="chatroom-new-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$newroom}}</button>
{{/if}}
<h2>{{$header}}</h2>
</div>
@@ -21,13 +21,13 @@
<tr class="chatroom-index-row">
<td><a href="{{$baseurl}}/chat/{{$nickname}}/{{$room.cr_id}}">{{$room.cr_name}}</a></td>
<td>{{$room.cr_expire}}&nbsp;min</td>
- <td class="chatrooms-index-tool{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}} dropdown pull-right{{/if}}">
+ <td class="chatrooms-index-tool{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}} dropdown float-right{{/if}}">
{{if $room.allow_cid || $room.allow_gid || $room.deny_cid || $room.deny_gid}}
<i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" onclick="lockview('chatroom',{{$room.cr_id}});"></i>
<ul id="panel-{{$room.cr_id}}" class="lockview-panel dropdown-menu"></ul>
{{/if}}
</td>
- <td><span class="badge">{{$room.cr_inroom}}</span></td>
+ <td><span class="badge badge-default">{{$room.cr_inroom}}</span></td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/cloud_actionspanel.tpl b/view/tpl/cloud_actionspanel.tpl
index 36edc3b44..0ebecce29 100644
--- a/view/tpl/cloud_actionspanel.tpl
+++ b/view/tpl/cloud_actionspanel.tpl
@@ -8,7 +8,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
<i class="jot-perms-icon fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
@@ -19,7 +19,7 @@
<div class="clear"></div>
</div>
<div id="files-upload-tools" class="section-content-tools-wrapper">
- {{if $quota.limit || $quota.used}}<div class="{{if $quota.warning}}section-content-danger-wrapper{{else}}section-content-info-wrapper{{/if}}">{{if $quota.warning}}<strong>{{$quota.warning}} </strong>{{/if}}{{$quota.desc}}</div>{{/if}}
+ {{if $quota.limit || $quota.used}}<div class="{{if $quota.warning}}section-content-danger-wrapper{{else}}section-content-info-wrapper{{/if}}">{{if $quota.warning}}<strong>{{$quota.warning}} </strong>{{/if}}{{if $quota.desc}}{{$quota.desc}}<br><br>{{/if}}{{$info}}</div>{{/if}}
<form id="ajax-upload-files" method="post" action="file_upload" enctype="multipart/form-data" class="acl-form" data-form_id="ajax-upload-files" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'>
<input type="hidden" name="directory" value="{{$path}}" />
<input type="hidden" name="channick" value="{{$channick}}" />
@@ -29,7 +29,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" type="button">
<i class="jot-perms-icon fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/cloud_directory.tpl b/view/tpl/cloud_directory.tpl
index 5a84028c1..adc8584c3 100644
--- a/view/tpl/cloud_directory.tpl
+++ b/view/tpl/cloud_directory.tpl
@@ -5,8 +5,8 @@
<th width="92%">{{$name}}</th>
<th width="1%"></th><th width="1%"></th><th width="1%"></th><th width="1%"></th>
<th width="1%">{{*{{$type}}*}}</th>
- <th width="1%" class="hidden-xs">{{$size}}</th>
- <th width="1%" class="hidden-xs">{{$lastmod}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$size}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$lastmod}}</th>
</tr>
{{if $parentpath}}
<tr>
@@ -14,8 +14,8 @@
<td><a href="{{$parentpath.path}}" title="{{$parent}}">..</a></td>
<td></td><td></td><td></td><td></td>
<td>{{*[{{$parent}}]*}}</td>
- <td class="hidden-xs"></td>
- <td class="hidden-xs"></td>
+ <td class="d-none d-md-table-cell"></td>
+ <td class="d-none d-md-table-cell"></td>
</tr>
{{/if}}
<tr id="new-upload-progress-bar--1"></tr> {{* this is needed to append the upload files in the right order *}}
@@ -33,8 +33,8 @@
<td></td><td></td><td></td><td></td>
{{/if}}
<td>{{*{{$item.type}}*}}</td>
- <td class="hidden-xs">{{$item.sizeFormatted}}</td>
- <td class="hidden-xs">{{$item.lastmodified}}</td>
+ <td class="d-none d-md-table-cell">{{$item.sizeFormatted}}</td>
+ <td class="d-none d-md-table-cell">{{$item.lastmodified}}</td>
</tr>
<tr id="cloud-tools-{{$item.attachId}}">
<td id="perms-panel-{{$item.attachId}}" colspan="9"></td>
diff --git a/view/tpl/cloud_header.tpl b/view/tpl/cloud_header.tpl
index d41cc9d67..c1e589341 100644
--- a/view/tpl/cloud_header.tpl
+++ b/view/tpl/cloud_header.tpl
@@ -2,10 +2,10 @@
{{if $actionspanel}}
<div class="pull-right">
{{if $is_owner}}
- <a href="/sharedwithme" class="btn btn-xs btn-default"><i class="fa fa-cloud-download"></i>&nbsp;{{$shared}}</a>
+ <a href="/sharedwithme" class="btn btn-sm btn-outline-secondary"><i class="fa fa-cloud-download"></i>&nbsp;{{$shared}}</a>
{{/if}}
- <button id="files-create-btn" class="btn btn-xs btn-primary" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="fa fa-folder-o"></i>&nbsp;{{$create}}</button>
- <button id="files-upload-btn" class="btn btn-xs btn-success" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload}}</button>
+ <button id="files-create-btn" class="btn btn-sm btn-primary" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="fa fa-folder-o"></i>&nbsp;{{$create}}</button>
+ <button id="files-upload-btn" class="btn btn-sm btn-success" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload}}</button>
</div>
{{/if}}
<h2>{{$header}}</h2>
diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl
index a98b9e5eb..f490483b8 100755
--- a/view/tpl/comment_item.tpl
+++ b/view/tpl/comment_item.tpl
@@ -19,53 +19,46 @@
{{/foreach}}
</select>
{{/if}}
- <div class="clear"></div>
- <div id="comment-tools-{{$id}}" class="comment-tools">
+ <div id="comment-tools-{{$id}}" class="pt-2 comment-tools">
<div id="comment-edit-bb-{{$id}}" class="btn-toolbar pull-left">
- <div class='btn-group'>
- <button class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('{{$comment}}','b', {{$id}}); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('{{$comment}}','b', {{$id}}); return false;">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('{{$comment}}','i', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('{{$comment}}','i', {{$id}}); return false;">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('{{$comment}}','u', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('{{$comment}}','u', {{$id}}); return false;">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('{{$comment}}','quote', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('{{$comment}}','quote', {{$id}}); return false;">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('{{$comment}}','code', {{$id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('{{$comment}}','code', {{$id}}); return false;">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
- <div class='btn-group'>
- <!--button class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('{{$comment}}','img', {{$id}}); return false;">
- <i class="fa fa-camera comment-icon"></i>
- </button-->
- <button class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertCommentURL('{{$comment}}',{{$id}}); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertCommentURL('{{$comment}}',{{$id}}); return false;">
<i class="fa fa-link comment-icon"></i>
</button>
- <!--button class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('{{$comment}}','video', {{$id}}); return false;">
- <i class="fa fa-video-camera comment-icon"></i>
- </button-->
</div>
{{if $feature_encrypt}}
- <div class='btn-group'>
- <button class="btn btn-default btn-xs" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;">
+ <div class="btn-group mr-2">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;">
<i class="fa fa-key comment-icon"></i>
</button>
</div>
{{/if}}
{{$comment_buttons}}
</div>
- <div class="btn-group pull-right" id="comment-edit-submit-wrapper-{{$id}}">
+ <div class="btn-group float-right" id="comment-edit-submit-wrapper-{{$id}}">
{{if $preview}}
- <button id="comment-edit-presubmit-{{$id}}" class="btn btn-default btn-xs" onclick="preview_comment({{$id}}); return false;" title="{{$preview}}">
+ <button id="comment-edit-presubmit-{{$id}}" class="btn btn-outline-secondary btn-sm" onclick="preview_comment({{$id}}); return false;" title="{{$preview}}">
<i class="fa fa-eye comment-icon" ></i>
</button>
{{/if}}
- <button id="comment-edit-submit-{{$id}}" class="btn btn-primary btn-xs" type="submit" name="button-submit" onclick="post_comment({{$id}}); return false;">{{$submit}}</button>
+ <button id="comment-edit-submit-{{$id}}" class="btn btn-primary btn-sm" type="submit" name="button-submit" onclick="post_comment({{$id}}); return false;">{{$submit}}</button>
</div>
</div>
<div class="clear"></div>
diff --git a/view/tpl/common_tabs.tpl b/view/tpl/common_tabs.tpl
index fa6bfbdfa..29c46369b 100755
--- a/view/tpl/common_tabs.tpl
+++ b/view/tpl/common_tabs.tpl
@@ -1,8 +1,17 @@
-<div id="tabs-collapse-1" class="navbar-collapse collapse">
- <ul class="nav nav-tabs nav-justified">
+<div class="mb-4 d-none d-md-block">
+ <ul class="nav nav-tabs nav-fill">
{{foreach $tabs as $tab}}
- <li class="{{$tab.sel}}" {{if $tab.id}}id="{{$tab.id}}"{{/if}}><a href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
+ <li class="nav-item"{{if $tab.id}} id="{{$tab.id}}"{{/if}}><a class="nav-link{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a></li>
{{/foreach}}
</ul>
</div>
-<div class="tabs-end"></div>
+<div class="d-md-none dropdown clearfix" style="position:fixed; right:7px; top:4.5rem; z-index:1020">
+ <button type="button" class="btn btn-outline-secondary btn-sm float-right" data-toggle="dropdown">
+ <i class="fa fa-bars"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right">
+ {{foreach $tabs as $tab}}
+ <a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}>{{$tab.label}}</a>
+ {{/foreach}}
+ </div>
+</div>
diff --git a/view/tpl/connection_template.tpl b/view/tpl/connection_template.tpl
index 64d27e609..2a668d485 100755
--- a/view/tpl/connection_template.tpl
+++ b/view/tpl/connection_template.tpl
@@ -3,18 +3,18 @@
<div class="pull-right">
{{if $contact.approve && $contact.ignore}}
<form action="connedit/{{$contact.id}}" method="post" >
- <button type="submit" class="btn btn-success btn-xs" name="pending" value="1" title="{{$contact.approve_hover}}"><i class="fa fa-check"></i> {{$contact.approve}}</button>
+ <button type="submit" class="btn btn-success btn-sm" name="pending" value="1" title="{{$contact.approve_hover}}"><i class="fa fa-check"></i> {{$contact.approve}}</button>
- <a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-xs" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
+ <a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-sm" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
{{/if}}
- <a href="#" class="btn btn-danger btn-xs" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
- <a href="{{$contact.link}}" class="btn btn-default btn-xs" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i></a>
+ <a href="#" class="btn btn-danger btn-sm" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
+ <a href="{{$contact.link}}" class="btn btn-outline-secondary btn-sm" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i></a>
{{if $contact.approve}}
</form>
{{/if}}
</div>
- <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-default btn-xs" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
+ <h3>{{if $contact.public_forum}}<i class="fa fa-comments-o"></i>&nbsp;{{/if}}<a href="{{$contact.url}}" title="{{$contact.img_hover}}" >{{$contact.name}}</a>{{if $contact.phone}}&nbsp;<a class="btn btn-outline-secondary btn-sm" href="tel:{{$contact.phone}}" title="{{$contact.call}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</h3>
</div>
<div class="section-content-tools-wrapper">
<div class="contact-photo-wrapper" >
diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl
index 1f7aa05b7..13261965a 100755
--- a/view/tpl/connections.tpl
+++ b/view/tpl/connections.tpl
@@ -1,33 +1,31 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
<div class="dropdown pull-right">
- <button type="button" class="btn btn-primary btn-xs" onclick="openClose('contacts-search-form');">
+ <button type="button" class="btn btn-primary btn-sm" onclick="openClose('contacts-search-form'); $('#contacts-search').focus()">
<i class="fa fa-search"></i>&nbsp;{{$label}}
</button>
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
<i class="fa fa-sort"></i>
</button>
- <ul class="dropdown-menu">
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $tabs as $menu}}
- <li><a href="{{$menu.url}}">{{$menu.label}}</a></li>
+ <a class="dropdown-item" href="{{$menu.url}}">{{$menu.label}}</a>
{{/foreach}}
- </ul>
+ </div>
</div>
{{if $finding}}<h2>{{$finding}}</h2>{{else}}<h2>{{$header}}{{if $total}} ({{$total}}){{/if}}</h2>{{/if}}
</div>
<div id="contacts-search-form" class="section-content-tools-wrapper">
<form action="{{$cmd}}" method="get" >
- <div class="form-group">
- <div class="input-group">
- <input type="text" name="search" id="contacts-search" class="widget-input" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" />
- <div class="input-group-btn">
- <button id="contacts-search-submit" class="btn btn-default btn-sm" type="submit" name="submit" value="{{$submit}}"><i class="fa fa-search"></i></button>
- </div>
+ <div class="input-group form-group">
+ <input type="text" name="search" id="contacts-search" class="form-control" onfocus="this.select();" value="{{$search}}" placeholder="{{$desc}}" />
+ <div class="input-group-btn">
+ <button id="contacts-search-submit" class="btn btn-outline-secondary" type="submit" name="submit" value="{{$submit}}"><i class="fa fa-fw fa-search"></i></button>
</div>
</div>
</form>
</div>
- <div id="connections-wrapper">
+ <div id="connections-wrapper clearfix">
{{foreach $contacts as $contact}}
{{include file="connection_template.tpl"}}
{{/foreach}}
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index b5ff475b2..a3bb05e00 100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -4,10 +4,10 @@
</div>
<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
{{/if}}
- <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
+ <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
<a name="item_{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -18,21 +18,24 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link u-url" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
- </div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
</div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
<div class="wall-item-author">
@@ -41,19 +44,22 @@
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
{{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location p-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}"><time class="dt-published" datetime="{{$item.isotime}}">{{$item.localtime}}</time>{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
{{if $item.body}}
- <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
+ <div class="p-2 wall-item-content clearfix" id="wall-item-content-{{$item.id}}">
<div class="wall-item-body e-content" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
{{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -74,120 +80,116 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
- <div class="wall-item-tools">
+ <div class="p-2 clearfix wall-item-tools">
<div class="wall-item-tools-right pull-right">
{{if $item.toplevel && $item.emojis && $item.reactions}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
<i class="fa fa-smile-o"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-left" role="menu" aria-labelledby="wall-item-react-{{$item.id}}">
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $item.reactions as $react}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="dropdown-menu-img-sm" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a></li>
+ <a class="dropdown-item clearfix" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="menu-img-2" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a>
{{/foreach}}
- </ul>
+ </div>
</div>
{{/if}}
<div class="btn-group dropdown">
{{if $item.like}}
- <button type="button" title="{{$item.like.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
+ <button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
<i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
</button>
{{/if}}
{{if $item.dislike}}
- <button type="button" title="{{$item.dislike.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
+ <button type="button" title="{{$item.dislike.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
<i class="fa fa-thumbs-o-down{{if $item.my_responses.dislike}} ivoted{{/if}}" ></i>
</button>
{{/if}}
{{if $item.isevent}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
<i class="fa fa-calendar-check-o"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-attend-menu-{{$item.id}}">
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
- <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
- <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
- <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}</a>
- </li>
- </ul>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}
+ </a>
+ </div>
</div>
{{/if}}
{{if $item.canvote}}
<div class="btn-group dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
<i class="fa fa-check-square-o"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
- <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
- <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}</a>
- </li>
- <li role="presentation"><a class="menuitem" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
- <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}</a>
- </li>
- </ul>
+ <div class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}
+ </a>
+ </div>
</div>
{{/if}}
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-caret-down"></i>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
{{if $item.share}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotShare({{$item.id}}); return false"><i class="fa fa-retweet" title="{{$item.share.0}}"></i> {{$item.share.0}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
{{/if}}
{{if $item.plink}}
- <li role="presentation"><a role="menuitem" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="fa fa-external-link"></i> {{$item.plink.title}}</a></li>
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
{{/if}}
{{if $item.edpost}}
- <li role="presentation"><a role="menuitem" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="editpost fa fa-pencil"></i> {{$item.edpost.1}}</a></li>
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
{{/if}}
{{if $item.tagger}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="fa fa-tag" title="{{$item.tagger.tagit}}"></i> {{$item.tagger.tagit}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
{{/if}}
{{if $item.filer}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="fa fa-folder-open" title="{{$item.filer}}"></i> {{$item.filer}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
{{/if}}
{{if $item.bookmark}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="fa fa-bookmark" title="{{$item.bookmark}}"></i> {{$item.bookmark}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
{{/if}}
{{if $item.addtocal}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="fa fa-calendar" title="{{$item.addtocal}}"></i> {{$item.addtocal}}</a></li>
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
{{/if}}
{{if $item.star}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="fa fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i> {{$item.star.toggle}}</a></li>
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
{{/if}}
-
{{if $item.thread_action_menu}}
{{foreach $item.thread_action_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
{{/foreach}}
{{/if}}
-
{{if $item.drop.dropping}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
{{/if}}
-
{{if $item.thread_author_menu}}
- <li role="presentation" class="divider"></li>
+ <div class="dropdown-divider"></div>
{{foreach $item.thread_author_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
{{/foreach}}
{{/if}}
-
{{if $item.edpost && $item.dreport}}
- <li role="presentation"><a role="menuitem" href="dreport/{{$item.mid}}">{{$item.dreport}}</a></li>
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
<div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
@@ -196,47 +198,41 @@
<div class="wall-item-tools-left{{if ($item.responses.count > 1) || ($item.responses.count && $item.attachments)}} btn-group{{/if}}">
{{if $item.attachments}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
{{foreach $item.responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
- {{if $response.list_part}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{else}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{/if}}
- {{if $response.list_part}}
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle"{{if $response.modal}} data-toggle="modal" data-target="#{{$verb}}Modal-{{$item.id}}"{{else}} data-toggle="dropdown"{{/if}} id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
+ {{if $response.modal}}
<div class="modal" id="{{$verb}}Modal-{{$item.id}}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$response.count}} {{$response.button}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- <h4 class="modal-title">{{$response.title}}</h4>
</div>
<div class="modal-body response-list">
- <ul class="nav nav-pills nav-stacked">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ <ul class="nav nav-pills flex-column">{{foreach $response.list as $liker}}<li class="nav-item">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$item.modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$item.modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+ {{else}}
+ <div class="dropdown-menu">{{foreach $response.list as $liker}}{{$liker}}{{/foreach}}</div>
{{/if}}
</div>
{{/if}}
{{/foreach}}
</div>
{{/if}}
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
{{if $item.toplevel}}
{{foreach $item.children as $child}}
@@ -244,10 +240,9 @@
{{/foreach}}
{{/if}}
{{if $item.comment}}
- <div class="wall-item-comment-wrapper{{if $item.children}} wall-item-comment-wrapper-wc{{/if}}" >
+ <div class="p-2 wall-item-comment-wrapper{{if $item.children}} wall-item-comment-wrapper-wc{{/if}}" >
{{$item.comment}}
</div>
- <div class="clear"></div>
{{/if}}
</div>
{{if $item.comment_lastcollapsed}}
diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl
index b1080af34..fa7b4cd46 100755
--- a/view/tpl/conv_list.tpl
+++ b/view/tpl/conv_list.tpl
@@ -4,10 +4,10 @@
</div>
<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
{{/if}}
- <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper conv-list-mode{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper{{/if}}">
- <a name="{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 generic-content-wrapper h-entry {{else}} u-comment h-cite {{/if}} item_{{$item.submid}}">
+ <a name="item_{{$item.id}}" ></a>
+ <div class="wall-item-outside-wrapper{{if $item.is_comment}} comment{{/if}}{{if $item.previewing}} preview{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="clearfix wall-item-content-wrapper{{if $item.is_comment}} comment{{/if}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -18,39 +18,48 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
- <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}">
- <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
+ <div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}} h-card p-author" id="wall-item-photo-wrapper-{{$item.id}}">
+ <a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link u-url" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}} u-photo p-name" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
</div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
- </div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
- <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ <i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i>&nbsp;
+ <div id="panel-{{$item.id}}" class="dropdown-menu"></div>
</div>
{{/if}}
<div class="wall-item-author">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.sparkle}}" id="wall-item-name-{{$item.id}}" >{{$item.name}}</span></a>{{if $item.owner_url}}&nbsp;{{$item.via}}&nbsp;<a href="{{$item.owner_url}}" title="{{$item.olinktitle}}" class="wall-item-name-link"><span class="wall-item-name{{$item.osparkle}}" id="wall-item-ownername-{{$item.id}}">{{$item.owner_name}}</span></a>{{/if}}
</div>
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
- {{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
+ {{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location p-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}"><time class="dt-published" datetime="{{$item.isotime}}">{{$item.localtime}}</time>{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="{{if $item.is_photo}}wall-photo-item{{else}}wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
- <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
+
+ {{if $item.body}}
+ <div class="p-2 wall-item-content clearfix" id="wall-item-content-{{$item.id}}">
+ <div class="wall-item-body e-content" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
+ {{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -63,7 +72,7 @@
{{/if}}
{{if $item.categories}}
<div class="body-tags" id="item-categories">
- <span class="tag">{{$item.categories}}</span>
+ <span class="tag p-category">{{$item.categories}}</span>
</div>
{{/if}}
{{if $item.folders}}
@@ -71,101 +80,134 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
-
- <div class="wall-item-tools">
- <div class="wall-item-tools-right btn-group pull-right">
- {{if $item.like}}
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'like'); return false">
- <i class="fa fa-thumbs-o-up" title="{{$item.like.0}}"></i>
- </button>
- {{/if}}
- {{if $item.dislike}}
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'dislike'); return false">
- <i class="fa fa-thumbs-o-down" title="{{$item.dislike.0}}"></i>
- </button>
- {{/if}}
-
- {{if $item.isevent}}
- <button type="button" title="{{$item.attend.0}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
- <i class="fa fa-check" ></i>
- </button>
- <button type="button" title="{{$item.attend.1}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendno'); return false;">
- <i class="fa fa-times" ></i>
- </button>
- <button type="button" title="{{$item.attend.2}}" class="btn btn-default btn-sm" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
- <i class="fa fa-question" ></i>
- </button>
- {{/if}}
-
- {{if $item.canvote}}
- <button type="button" title="{{$item.conlabels.0}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'agree'); return false;">
- <i class="fa fa-check" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.1}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'disagree'); return false;">
- <i class="fa fa-times" ></i>
- </button>
- <button type="button" title="{{$item.conlabels.2}}" class="btn btn-default btn-sm" onclick="dolike({{$item.id}},'abstain'); return false;">
- <i class="fa fa-question" ></i>
- </button>
+ <div class="p-2 clearfix wall-item-tools">
+ <div class="wall-item-tools-right pull-right">
+ {{if $item.toplevel && $item.emojis && $item.reactions}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
+ <i class="fa fa-smile-o"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right">
+ {{foreach $item.reactions as $react}}
+ <a class="dropdown-item clearfix" href="#" onclick="jotReact({{$item.id}},'{{$react}}'); return false;"><img class="menu-img-2" src="/images/emoji/{{$react}}.png" alt="{{$react}}" /></a>
+ {{/foreach}}
+ </div>
+ </div>
{{/if}}
-
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-caret-down"></i>
- </button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
- {{if $item.share}}
- <li role="presentation"><a role="menuitem" href="#" onclick="jotShare({{$item.id}}); return false"><i class="fa fa-retweet" title="{{$item.share.0}}"></i> {{$item.share.0}}</a></li>
- {{/if}}
- {{if $item.plink}}
- <li role="presentation"><a role="menuitem" href="{{$item.plink.href}}" title="{{$item.plink.title}}" ><i class="fa fa-external-link"></i> {{$item.plink.title}}</a></li>
- {{/if}}
- {{if $item.edpost}}
- <li role="presentation"><a role="menuitem" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="editpost fa fa-pencil"></i> {{$item.edpost.1}}</a></li>
- {{/if}}
- {{if $item.tagger}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="fa fa-tag" title="{{$item.tagger.tagit}}"></i> {{$item.tagger.tagit}}</a></li>
- {{/if}}
- {{if $item.filer}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="fa fa-folder-open" title="{{$item.filer}}"></i> {{$item.filer}}</a></li>
- {{/if}}
- {{if $item.bookmark}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="fa fa-bookmark" title="{{$item.bookmark}}"></i> {{$item.bookmark}}</a></li>
- {{/if}}
- {{if $item.addtocal}}
- <li role="presentation"><a role="menuitem" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="fa fa-calendar" title="{{$item.addtocal}}"></i> {{$item.addtocal}}</a></li>
+ <div class="btn-group dropdown">
+ {{if $item.like}}
+ <button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
+ <i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
+ </button>
{{/if}}
- {{if $item.star}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="fa fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i> {{$item.star.toggle}}</a></li>
+ {{if $item.dislike}}
+ <button type="button" title="{{$item.dislike.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'dislike'); return false;">
+ <i class="fa fa-thumbs-o-down{{if $item.my_responses.dislike}} ivoted{{/if}}" ></i>
+ </button>
{{/if}}
- {{if $item.drop.dropping}}
- <li role="presentation"><a role="menuitem" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
+ {{if $item.isevent}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
+ <i class="fa fa-calendar-check-o"></i>
+ </button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.1}}" onclick="itemAddToCal({{$item.id}}), dolike({{$item.id}},'attendno'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.attendno}} ivoted{{/if}}" ></i> {{$item.attend.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.attend.2}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendmaybe'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.attendmaybe}} ivoted{{/if}}" ></i> {{$item.attend.2}}
+ </a>
+ </div>
+ </div>
{{/if}}
- {{if $item.item_photo_menu}}
- <li role="presentation" class="divider"></li>
- {{$item.item_photo_menu}}
+ {{if $item.canvote}}
+ <div class="btn-group dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
+ <i class="fa fa-check-square-o"></i>
+ </button>
+ <div class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
+ <i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.1}}" onclick="dolike({{$item.id}},'disagree'); return false;">
+ <i class="item-act-list fa fa-times{{if $item.my_responses.disagree}} ivoted{{/if}}" ></i> {{$item.conlabels.1}}
+ </a>
+ <a class="dropdown-item" href="#" title="{{$item.conlabels.2}}" onclick="dolike({{$item.id}},'abstain'); return false;">
+ <i class="item-act-list fa fa-question{{if $item.my_responses.abstain}} ivoted{{/if}}" ></i> {{$item.conlabels.2}}
+ </a>
+ </div>
+ </div>
{{/if}}
-
- </ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ {{if $item.share}}
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
+ {{/if}}
+ {{if $item.plink}}
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
+ {{/if}}
+ {{if $item.edpost}}
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
+ {{/if}}
+ {{if $item.tagger}}
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
+ {{/if}}
+ {{if $item.filer}}
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
+ {{/if}}
+ {{if $item.bookmark}}
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
+ {{/if}}
+ {{if $item.addtocal}}
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
+ {{/if}}
+ {{if $item.star}}
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
+ {{/if}}
+ {{if $item.thread_action_menu}}
+ {{foreach $item.thread_action_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
+ {{/if}}
+ {{if $item.thread_author_menu}}
+ <div class="dropdown-divider"></div>
+ {{foreach $item.thread_author_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.edpost && $item.dreport}}
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
+ {{/if}}
+ </div>
+ </div>
</div>
<div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
<div class="wall-item-tools-left{{if $item.unseen_comments || $item.like_count || $item.dislike_count || $item.attachments}} btn-group{{/if}}">
{{if $item.attachments}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
<ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
</div>
{{/if}}
<div class="wall-item-list-comments btn-group">
- <button class="btn btn-default btn-sm" onclick="window.location.href='{{$item.viewthread}}'; return false;">
+ <a class="btn btn-outline-secondary btn-sm" href="{{$item.viewthread}}">
{{$item.comment_count_txt}}{{if $item.unseen_comments}}<span class="unseen-wall-indicator-{{$item.id}}">, {{$item.list_unseen_txt}}</span>{{/if}}
- </button>
+ </a>
</div>
{{if $item.unseen_comments}}
<div class="unseen-wall-indicator-{{$item.id}} btn-group">
- <button class="btn btn-default btn-sm" title="{{$item.markseen}}" onclick="markItemRead({{$item.id}}); return false;">
+ <button class="btn btn-outline-secondary btn-sm" title="{{$item.markseen}}" onclick="markItemRead({{$item.id}}); return false;">
<i class="fa fa-check-square-o"></i>
</button>
</div>
@@ -174,40 +216,34 @@
{{foreach $item.responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
- {{if $response.list_part}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{else}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$item.id}}">{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
- {{/if}}
- {{if $response.list_part}}
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle"{{if $response.modal}} data-toggle="modal" data-target="#{{$verb}}Modal-{{$item.id}}"{{else}} data-toggle="dropdown"{{/if}} id="wall-item-{{$verb}}-{{$item.id}}">{{$response.count}} {{$response.button}}</button>
+ {{if $response.modal}}
<div class="modal" id="{{$verb}}Modal-{{$item.id}}">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$response.count}} {{$response.button}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
- <h4 class="modal-title">{{$response.title}}</h4>
</div>
- <div class="modal-body">
- <ul>{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ <div class="modal-body response-list">
+ <ul class="nav nav-pills flex-column">{{foreach $response.list as $liker}}<li class="nav-item">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$item.modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$item.modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
+ {{else}}
+ <div class="dropdown-menu">{{foreach $response.list as $liker}}{{$liker}}{{/foreach}}</div>
{{/if}}
</div>
{{/if}}
{{/foreach}}
{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
</div>
{{if $item.comment_lastcollapsed}}
diff --git a/view/tpl/cover_photo_widget.tpl b/view/tpl/cover_photo_widget.tpl
index bc1f421bd..a9c384d2f 100755
--- a/view/tpl/cover_photo_widget.tpl
+++ b/view/tpl/cover_photo_widget.tpl
@@ -12,12 +12,9 @@
if($('#cover-photo').length && $(window).width() > 755) {
if($(window).scrollTop() < $('#cover-photo').height()) {
+ $('.navbar').removeClass('fixed-top');
$('main').css('margin-top', - $('nav').outerHeight(true) + 'px');
- $('aside').css('padding-top', aside_padding_top - $('nav').outerHeight() + 'px');
- $('section').css('padding-top', section_padding_top - $('nav').outerHeight() + 'px');
- $('.navbar-fixed-top').css('position', 'relative');
$('main').css('opacity', 0);
- $('header').hide();
}
}
else {
@@ -28,12 +25,9 @@
$(window).scroll(function () {
if($('#cover-photo').length && $(window).width() > 755 && $(window).scrollTop() >= $('#cover-photo').height()) {
- $('header').fadeIn();
- $('main').css('opacity', 1);
- $('aside').css('padding-top', aside_padding_top + 'px');
- $('section').css('padding-top', section_padding_top + 'px');
- $('.navbar-fixed-top').css('position', '');
+ $('.navbar').addClass('fixed-top');
$('main').css('margin-top', '');
+ $('main').css('opacity', 1);
coverSlid = true;
}
else if ($('#cover-photo').length && $(window).width() > 755 && $(window).scrollTop() < $('#cover-photo').height()){
@@ -43,13 +37,9 @@
}
else {
if($(window).scrollTop() < $('#cover-photo').height()) {
+ $('.navbar').removeClass('fixed-top');
$('main').css('margin-top', - $('nav').outerHeight(true) + 'px');
- $('aside').css('padding-top', aside_padding_top - $('nav').outerHeight() + 'px');
- $('section').css('padding-top', section_padding_top - $('nav').outerHeight() + 'px');
-
- $('.navbar-fixed-top').css('position', 'relative');
$('main').css('opacity', 0);
- $('header').hide();
}
}
}
@@ -61,10 +51,8 @@
$(window).resize(function () {
if($('#cover-photo').length && $(window).width() < 755) {
$('#cover-photo').remove();
+ $('.navbar').addClass('fixed-top');
$('main').css('opacity', 1);
- $('aside').css('padding-top', aside_padding_top + 'px');
- $('section').css('padding-top', section_padding_top + 'px');
- $('.navbar-fixed-top').css('position', '');
coverSlid = true;
}
@@ -82,11 +70,7 @@
<div id="cover-photo" title="{{$hovertitle}}">
{{$photo_html}}
<div id="cover-photo-caption">
- <div class="cover-photo-title">
- {{$title}}
- </div>
- <div class="cover-photo-subtitle">
- {{$subtitle}}
- </div>
+ <h1>{{$title}}</h1>
+ <h3>{{$subtitle}}</h3>
</div>
</div>
diff --git a/view/tpl/design_tools.tpl b/view/tpl/design_tools.tpl
index dffeeafa0..bc7d46dc1 100644
--- a/view/tpl/design_tools.tpl
+++ b/view/tpl/design_tools.tpl
@@ -1,9 +1,9 @@
<div id="design-tools" class="widget design-tools">
-<h3>{{$title}}</h3>
-<ul class="nav nav-pills nav-stacked">
-<li><a href="blocks/{{$who}}">{{$blocks}}</a></li>
-<li><a href="menu{{if $sys}}?f=&sys=1{{/if}}">{{$menus}}</a></li>
-<li><a href="layouts/{{$who}}">{{$layout}}</a></li>
-<li><a href="webpages/{{$who}}">{{$pages}}</a></li>
-</ul>
+ <h3>{{$title}}</h3>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="blocks/{{$who}}">{{$blocks}}</a>
+ <a class="nav-link" href="menu{{if $sys}}?f=&sys=1{{/if}}">{{$menus}}</a>
+ <a class="nav-link" href="layouts/{{$who}}">{{$layout}}</a>
+ <a class="nav-link" href="webpages/{{$who}}">{{$pages}}</a>
+ </div>
</div>
diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl
index c82fada45..71e991f3a 100755
--- a/view/tpl/directory_header.tpl
+++ b/view/tpl/directory_header.tpl
@@ -1,24 +1,22 @@
<div class="generic-content-wrapper">
- <div class="section-title-wrapper">
+ <div class="section-title-wrapper clearfix">
<div class="btn-group pull-right">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$sort}}">
<i class="fa fa-sort"></i>
</button>
- <ul class="dropdown-menu">
- <li><a href="directory?f=&order=date{{$suggest}}">{{$date}}</a></li>
- <li><a href="directory?f=&order=normal{{$suggest}}">{{$normal}}</a></li>
- <li><a href="directory?f=&order=reversedate{{$suggest}}">{{$reversedate}}</a></li>
- <li><a href="directory?f=&order=reverse{{$suggest}}">{{$reverse}}</a></li>
- </ul>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item" href="directory?f=&order=date{{$suggest}}">{{$date}}</a>
+ <a class="dropdown-item" href="directory?f=&order=normal{{$suggest}}">{{$normal}}</a>
+ <a class="dropdown-item" href="directory?f=&order=reversedate{{$suggest}}">{{$reversedate}}</a>
+ <a class="dropdown-item" href="directory?f=&order=reverse{{$suggest}}">{{$reverse}}</a>
+ </div>
</div>
<h2>{{$dirlbl}}{{if $search}}:&nbsp;{{$safetxt}}{{/if}}</h2>
- <div class="clear"></div>
</div>
{{foreach $entries as $entry}}
{{include file="direntry.tpl"}}
{{/foreach}}
<div id="page-end"></div>
- <div class="clear"></div>
</div>
<script>$(document).ready(function() { loadingPage = false;});</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
index c9940a347..f7ec7db23 100755
--- a/view/tpl/direntry.tpl
+++ b/view/tpl/direntry.tpl
@@ -1,17 +1,17 @@
<div class="directory-item{{if $entry.safe}} safe{{/if}}" id="directory-item-{{$entry.hash}}" >
- <div class="section-subtitle-wrapper">
+ <div class="section-subtitle-wrapper clearfix">
<div class="pull-right">
{{if $entry.viewrate}}
- {{if $entry.total_ratings}}<a href="ratings/{{$entry.hash}}" id="dir-rating-{{$entry.hash}}" class="btn btn-default btn-xs">{{$entry.total_ratings}}</a>{{/if}}
+ {{if $entry.total_ratings}}<a href="ratings/{{$entry.hash}}" id="dir-rating-{{$entry.hash}}" class="btn btn-outline-secondary btn-sm">{{$entry.total_ratings}}</a>{{/if}}
{{/if}}
{{if $entry.ignlink}}
- <a class="directory-ignore btn btn-warning btn-xs" href="{{$entry.ignlink}}"> {{$entry.ignore_label}}</a>
+ <a class="directory-ignore btn btn-warning btn-sm" href="{{$entry.ignlink}}"> {{$entry.ignore_label}}</a>
{{/if}}
{{if $entry.connect}}
- <a class="btn btn-success btn-xs" href="{{$entry.connect}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conn_label}}</a>
+ <a class="btn btn-success btn-sm" href="{{$entry.connect}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conn_label}}</a>
{{/if}}
{{if $entry.viewrate}}
- {{if $entry.canrate}}<button class="btn btn-default btn-xs" onclick="doRatings('{{$entry.hash}}'); return false;" ><i class="fa fa-pencil"></i><span id="edited-{{$entry.hash}}" class="required" id="edited-{{$entry.hash}}" style="display: none;" >&nbsp;*</span></button>{{/if}}
+ {{if $entry.canrate}}<button class="btn btn-outline-secondary btn-sm" onclick="doRatings('{{$entry.hash}}'); return false;" ><i class="fa fa-pencil"></i><span id="edited-{{$entry.hash}}" class="required" id="edited-{{$entry.hash}}" style="display: none;" >&nbsp;*</span></button>{{/if}}
{{/if}}
</div>
<h3>{{if $entry.public_forum}}<i class="fa fa-comments-o" title="{{$entry.forum_label}} @{{$entry.nickname}}+"></i>&nbsp;{{/if}}<a href='{{$entry.profile_link}}' >{{$entry.name}}</a>{{if $entry.online}}&nbsp;<i class="fa fa-asterisk online-now" title="{{$entry.online}}"></i>{{/if}}</h3>
diff --git a/view/tpl/dreport.tpl b/view/tpl/dreport.tpl
index 8aa5e2cd1..1f5915609 100644
--- a/view/tpl/dreport.tpl
+++ b/view/tpl/dreport.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $table == 'item'}}
<div class="dropdown pull-right">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$options}}">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="{{$options}}">
<i class="fa fa-sort-desc"></i>
</button>
<ul class="dropdown-menu">
diff --git a/view/tpl/edpost_head.tpl b/view/tpl/edpost_head.tpl
index 79a8f347f..b2ab5db4e 100755
--- a/view/tpl/edpost_head.tpl
+++ b/view/tpl/edpost_head.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $delete}}
<div class="pull-right">
- <a href="item/drop/{{$id}}" id="delete-btn" class="btn btn-xs btn-danger" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$delete}}</a>
+ <a href="item/drop/{{$id}}" id="delete-btn" class="btn btn-sm btn-danger" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$delete}}</a>
</div>
{{/if}}
<h2>{{$title}}</h2>
diff --git a/view/tpl/event.tpl b/view/tpl/event.tpl
index fe3cfc517..cc0bfc1c7 100755
--- a/view/tpl/event.tpl
+++ b/view/tpl/event.tpl
@@ -6,9 +6,9 @@
</div>
{{$event.html}}
<div class="event-buttons">
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-default" ></i></a>{{/if}}
- {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="fa fa-pencil btn btn-default"></i></a>{{/if}}
- {{if $event.drop}}<a href="{{$event.drop.0}}" title="{{$event.drop.1}}" class="drop-event-link"><i class="fa fa-trash-o btn btn-default"></i></a>{{/if}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-outline-secondary" ></i></a>{{/if}}
+ {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="fa fa-pencil btn btn-outline-secondary"></i></a>{{/if}}
+ {{if $event.drop}}<a href="{{$event.drop.0}}" title="{{$event.drop.1}}" class="drop-event-link"><i class="fa fa-trash-o btn btn-outline-secondary"></i></a>{{/if}}
</div>
<div class="clear"></div>
</div>
diff --git a/view/tpl/event_cal.tpl b/view/tpl/event_cal.tpl
index a88df6d18..d7662786b 100755
--- a/view/tpl/event_cal.tpl
+++ b/view/tpl/event_cal.tpl
@@ -6,7 +6,7 @@
</div>
{{$event.html}}
<div class="event-buttons">
- {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-default" ></i></a>{{/if}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="fa fa-external-link btn btn-outline-secondary" ></i></a>{{/if}}
</div>
<div class="clear"></div>
</div>
diff --git a/view/tpl/event_form.tpl b/view/tpl/event_form.tpl
index 8a06567c1..d07a06b67 100755
--- a/view/tpl/event_form.tpl
+++ b/view/tpl/event_form.tpl
@@ -32,35 +32,37 @@
{{/if}}
<div class="form-group">
- <div id="event-desc-text"><b>{{$d_text}}</b></div>
- <textarea id="comment-edit-text-desc" class="form-control" name="desc" >{{$d_orig}}</textarea>
+ <div class="form-group">
+ <div id="event-desc-text"><b>{{$d_text}}</b></div>
+ <textarea id="comment-edit-text-desc" class="form-control" name="desc" >{{$d_orig}}</textarea>
+ </div>
<div id="comment-tools-desc" class="comment-tools" style="display: block;" >
<div id="comment-edit-bb-desc" class="btn-toolbar">
- <div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'desc');">
+ <div class='btn-group mr-2'>
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'desc');">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'desc');">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'desc');">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('none','quote','desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('none','quote','desc');">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'desc');">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
<div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'desc');">
<i class="fa fa-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'desc');">
<i class="fa fa-link comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'desc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'desc');">
<i class="fa fa-video-camera comment-icon"></i>
</button>
</div>
@@ -68,38 +70,40 @@
</div>
</div>
<div class="form-group">
- <div id="event-location-text"><b>{{$l_text}}</b></div>
- <textarea id="comment-edit-text-loc" class="form-control" name="location">{{$l_orig}}</textarea>
+ <div class="form-group">
+ <div id="event-location-text"><b>{{$l_text}}</b></div>
+ <textarea id="comment-edit-text-loc" class="form-control" name="location">{{$l_orig}}</textarea>
+ </div>
<div id="comment-tools-loc" class="comment-tools" style="display: block;" >
<div id="comment-edit-bb-loc" class="btn-toolbar">
- <div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'loc');">
+ <div class='btn-group mr-2'>
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edbold}}" onclick="insertbbcomment('none','b', 'loc');">
<i class="fa fa-bold comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$editalic}}" onclick="insertbbcomment('none','i', 'loc');">
<i class="fa fa-italic comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$eduline}}" onclick="insertbbcomment('none','u', 'loc');">
<i class="fa fa-underline comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('none','quote','loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edquote}}" onclick="insertbbcomment('none','quote','loc');">
<i class="fa fa-quote-left comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edcode}}" onclick="insertbbcomment('none','code', 'loc');">
<i class="fa fa-terminal comment-icon"></i>
</button>
</div>
<div class='btn-group'>
- <button type="button" class="btn btn-default btn-xs" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edimg}}" onclick="insertbbcomment('none','img', 'loc');">
<i class="fa fa-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edurl}}" onclick="insertbbcomment('none','url', 'loc');">
<i class="fa fa-link comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$edvideo}}" onclick="insertbbcomment('none','video', 'loc');">
<i class="fa fa-video-camera comment-icon"></i>
</button>
- <button type="button" class="btn btn-default btn-xs" title="{{$mapper}}" onclick="insertbbcomment('none','map','loc');">
+ <button type="button" class="btn btn-outline-secondary btn-sm" title="{{$mapper}}" onclick="insertbbcomment('none','map','loc');">
<i class="fa fa-globe comment-icon"></i>
</button>
</div>
@@ -111,13 +115,13 @@
<div class="clear"></div>
- <button type="button" class="btn btn-default" onclick="openClose('advanced');">{{$advanced}}</button>
- <div class="btn-group pull-right">
- <button id="event-edit-preview-btn" class="btn btn-default" type="button" title="{{$preview}}" onclick="doEventPreview();"><i class="fa fa-eye" ></i></button>
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="openClose('advanced');">{{$advanced}}</button>
+ <div class="btn-group float-right">
+ <button id="event-edit-preview-btn" class="btn btn-outline-secondary btn-sm" type="button" title="{{$preview}}" onclick="doEventPreview();"><i class="fa fa-eye" ></i></button>
{{if ! $eid}}
- <button id="dbtn-acl" class="btn btn-default" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" type="button" data-toggle="modal" data-target="#aclModal" title="{{$perms_label}}"><i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i></button>
{{/if}}
- <button id="event-submit" class="btn btn-primary" type="submit" name="submit">{{$submit}}</button>
+ <button id="event-submit" class="btn btn-primary btn-sm" type="submit" name="submit">{{$submit}}</button>
</div>
</form>
diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl
index 1d1b6f15b..3b2cb5041 100755
--- a/view/tpl/event_head.tpl
+++ b/view/tpl/event_head.tpl
@@ -50,6 +50,7 @@
$('#events-calendar').fullCalendar({
events: '{{$baseurl}}{{$module_url}}/json',
header: false,
+ eventTextColor: 'white',
lang: '{{$lang}}',
firstDay: {{$first_day}},
diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl
index 6299242ce..9d32c76be 100755
--- a/view/tpl/events-js.tpl
+++ b/view/tpl/events-js.tpl
@@ -2,20 +2,20 @@
<div class="section-title-wrapper">
<div class="pull-right">
<div class="dropdown">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"><i class="fa fa-caret-down"></i>&nbsp;{{$view_label}}</button>
- <ul class="dropdown-menu">
- <li><a href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li>
- <li><a href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a></li>
- <li><a href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a></li>
- </ul>
- <button class="btn btn-success btn-xs" onclick="openClose('form');">{{$new_event.1}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"><i class="fa fa-cog"></i>&nbsp;{{$view_label}}</button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a>
+ </div>
+ <button class="btn btn-success btn-sm" onclick="openClose('form');">{{$new_event.1}}</button>
<div class="btn-group">
- <button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
- <button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
- <button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
+ <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
</div>
<h2 id="title"></h2>
diff --git a/view/tpl/events_cal-js.tpl b/view/tpl/events_cal-js.tpl
index b7836cfab..ba9e16dd6 100755
--- a/view/tpl/events_cal-js.tpl
+++ b/view/tpl/events_cal-js.tpl
@@ -3,12 +3,12 @@
<div class="section-title-wrapper">
<div class="pull-right">
<div class="btn-group">
- <button class="btn btn-default btn-xs" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
- <button id="events-spinner" class="btn btn-default btn-xs" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
- <button class="btn btn-default btn-xs" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
+ <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
</div>
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
</div>
<h2 id="title"></h2>
<div class="clear"></div>
diff --git a/view/tpl/events_tools_side.tpl b/view/tpl/events_tools_side.tpl
index 4f5ef2eb0..e22f95c1e 100755
--- a/view/tpl/events_tools_side.tpl
+++ b/view/tpl/events_tools_side.tpl
@@ -1,15 +1,17 @@
<div class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="#" onclick="exportDate(); return false;"><i class="fa fa-arrow-circle-o-down"></i>&nbsp;{{$export}}</a></li>
- <li><a href="#" onclick="openClose('event-upload-form'); return false;"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$import}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="#" onclick="exportDate(); return false;"><i class="fa fa-arrow-circle-o-down"></i>&nbsp;{{$export}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="#" onclick="openClose('event-upload-form'); return false;"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$import}}</a></li>
</ul>
- <div id="event-upload-form" style="display: none;">
- <form action="events" enctype="multipart/form-data" method="post" name="event-upload-form" id="event-upload-form">
- <div class="form-group">
- <input id="event-upload-choose" type="file" name="userfile" />
- </div>
- <button id="dbtn-submit" class="btn btn-primary btn-xs" type="submit" name="submit" >{{$submit}}</button>
- </form>
+ <div id="event-upload-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form action="events" enctype="multipart/form-data" method="post" name="event-upload-form" id="event-upload-form">
+ <div class="form-group">
+ <input id="event-upload-choose" class="form-control-file w-100" type="file" name="userfile" />
+ </div>
+ <button id="dbtn-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button>
+ </form>
+ </div>
</div>
</div>
diff --git a/view/tpl/field_checkbox.tpl b/view/tpl/field_checkbox.tpl
index 6785e522a..f779f937c 100755
--- a/view/tpl/field_checkbox.tpl
+++ b/view/tpl/field_checkbox.tpl
@@ -1,6 +1,5 @@
- <div id="{{$field.0}}_container" class="form-group field checkbox">
+ <div id="{{$field.0}}_container" class="clearfix form-group checkbox">
<label for="id_{{$field.0}}">{{$field.1}}</label>
- <div class="pull-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
- <span class="help-block">{{$field.3}}</span>
+ <div class="float-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}} {{if $field.5}}{{$field.5}}{{/if}} /><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.4}}{{$field.4.1}}{{/if}}' data-off='{{if $field.4}}{{$field.4.0}}{{/if}}'></span><span class="onoffswitch-switch"></span></label></div>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
- <div class="clear"></div>
diff --git a/view/tpl/field_combobox.tpl b/view/tpl/field_combobox.tpl
index 523595c0b..12d00a08d 100755
--- a/view/tpl/field_combobox.tpl
+++ b/view/tpl/field_combobox.tpl
@@ -1,17 +1,18 @@
- <div class='field combobox input form-group'>
- <label class="mainlabel" for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
- {{*
- <input id="id_{{$field.0}}" type="text" list="data_{{$field.0}}" >
- <datalist id="data_{{$field.0}}" >
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{/foreach}}
- </datalist>*}}
-
- <input id="id_{{$field.0}}" class="form-control" type="text" value="{{$field.2}}">
- <select id="select_{{$field.0}}" class="form-control" onChange="$('#id_{{$field.0}}').val($(this).val())">
- <option value="">{{$field.5}}</option>
- {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
- </select>
-
- <span class='field_help'>{{$field.3}}</span>
- </div>
+<div class="form-group">
+ <label class="" for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
+ <input class="form-control" id="id_{{$field.0}}" type="text" list="data_{{$field.0}}"{{if $field.5}} {{$field.5}}{{/if}}>
+ <datalist id="data_{{$field.0}}" >
+ {{foreach $field.4 as $opt=>$val}}
+ <option value="{{$val}}">
+ {{/foreach}}
+ </datalist>
+ {{**
+ <input id="id_{{$field.0}}" class="form-control" type="text" value="{{$field.2}}">
+ <select id="select_{{$field.0}}" class="form-control" onChange="$('#id_{{$field.0}}').val($(this).val())">
+ <option value="">{{$field.5}}</option>
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$val}}">{{$val}}</option>{{/foreach}}
+ </select>
+ **}}
+ <span class='field_help'>{{$field.3}}</span>
+</div>
diff --git a/view/tpl/field_input.tpl b/view/tpl/field_input.tpl
index d6a7f56b2..65a837e5f 100755
--- a/view/tpl/field_input.tpl
+++ b/view/tpl/field_input.tpl
@@ -1,6 +1,5 @@
- <div id="id_{{$field.0}}_wrapper" class='form-group field input'>
- <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}{{if $field.4}}<span class="required"> {{$field.4}}</span>{{/if}}</label>
- <input class="form-control" name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>
- <span id='help_{{$field.0}}' class='help-block'>{{$field.3}}</span>
- <div class="clear"></div>
+ <div id="id_{{$field.0}}_wrapper" class="form-group">
+ <label for="id_{{$field.0}}" id="label_{{$field.0}}">{{$field.1}}{{if $field.4}}<span class="required"> {{$field.4}}</span>{{/if}}</label>
+ <input class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" type="text" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>
+ <small id="help_{{$field.0}}" class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_intcheckbox.tpl b/view/tpl/field_intcheckbox.tpl
index 565f97760..abfe6e189 100755
--- a/view/tpl/field_intcheckbox.tpl
+++ b/view/tpl/field_intcheckbox.tpl
@@ -1,6 +1,5 @@
- <div class="form-group field checkbox">
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <div class="pull-right"><input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="checked"{{/if}}><label class="switchlabel" for='id_{{$field.0}}'> <span class="onoffswitch-inner" data-on='{{if $field.5}}{{$field.5.1}}{{/if}}' data-off='{{if $field.5}}{{$field.5.0}}{{/if}}'></span><span class="onoffswitch-switch"></span> </label></div>
- <span class='help-block'>{{$field.4}}</span>
+ <div class="clearfix form-group checkbox">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <div class="pull-right"><input type="checkbox" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.3}}" {{if $field.2}}checked="checked"{{/if}}><label class="switchlabel" for="id_{{$field.0}}"> <span class="onoffswitch-inner" data-on="{{if $field.5}}{{$field.5.1}}{{/if}}" data-off="{{if $field.5}}{{$field.5.0}}{{/if}}"></span><span class="onoffswitch-switch"></span> </label></div>
+ <small class="form-text text-muted">{{$field.4}}</small>
</div>
- <div class="clear"></div>
diff --git a/view/tpl/field_password.tpl b/view/tpl/field_password.tpl
index 1643fa855..fa5e14582 100755
--- a/view/tpl/field_password.tpl
+++ b/view/tpl/field_password.tpl
@@ -1,5 +1,5 @@
- <div class='form-group field password'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <input class="form-control" type='password' name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
- <span id="help_{{$field.0}}" class="help-block">{{$field.3}}</span>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <input class="form-control" type="password" name="{{$field.0}}" id="id_{{$field.0}}" value="{{$field.2}}"{{if $field.5}} {{$field.5}}{{/if}}>{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
+ <small id="help_{{$field.0}}" class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_select.tpl b/view/tpl/field_select.tpl
index 762447290..cda9a823a 100755
--- a/view/tpl/field_select.tpl
+++ b/view/tpl/field_select.tpl
@@ -1,7 +1,7 @@
- <div class='form-group field select'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <select class="form-control" name='{{$field.0}}' id='id_{{$field.0}}'>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <select class="form-control" name="{{$field.0}}" id="id_{{$field.0}}">
{{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
</select>
- <span class='help-block'>{{$field.3}}</span>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_textarea.tpl b/view/tpl/field_textarea.tpl
index 01fdc23f5..437dece93 100755
--- a/view/tpl/field_textarea.tpl
+++ b/view/tpl/field_textarea.tpl
@@ -1,5 +1,5 @@
- <div class='form-group field textarea'>
- <label for='id_{{$field.0}}'>{{$field.1}}</label>
- <textarea class="form-control" name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.4}}{{$field.4}}{{/if}} >{{$field.2}}</textarea>
- <span class='help-block'>{{$field.3}}</span>
+ <div class="form-group">
+ <label for="id_{{$field.0}}">{{$field.1}}</label>
+ <textarea class="form-control" name="{{$field.0}}" id="id_{{$field.0}}" {{if $field.4}}{{$field.4}}{{/if}} >{{$field.2}}</textarea>
+ <small class="form-text text-muted">{{$field.3}}</small>
</div>
diff --git a/view/tpl/field_yesno.tpl b/view/tpl/field_yesno.tpl
index f5a909833..8a4cda55b 100755
--- a/view/tpl/field_yesno.tpl
+++ b/view/tpl/field_yesno.tpl
@@ -1,4 +1,4 @@
- <div class='field yesno'>
+ <div class='clearfix form-group'>
<label class="mainlabel" for='id_{{$field.0}}'>{{$field.1}}</label>
<div class='onoff' id="id_{{$field.0}}_onoff">
<input type="hidden" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
@@ -9,5 +9,5 @@
{{if $field.4}}{{$field.4.1}}{{else}}ON{{/if}}
</a>
</div>
- <span class='field_help'>{{$field.3}}</span>
+ <small class='form-text text-muted'>{{$field.3}}</small>
</div>
diff --git a/view/tpl/fileas_widget.tpl b/view/tpl/fileas_widget.tpl
index a92440cb0..a6a69b89c 100755
--- a/view/tpl/fileas_widget.tpl
+++ b/view/tpl/fileas_widget.tpl
@@ -2,10 +2,10 @@
<h3>{{$title}}</h3>
<div id="nets-desc">{{$desc}}</div>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$base}}"{{if $sel_all}} class="fileas-selected"{{/if}}>{{$all}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link{{if $sel_all}} active{{/if}}" href="{{$base}}">{{$all}}</a></li>
{{foreach $terms as $term}}
- <li><a href="{{$base}}?f=&file={{$term.name}}"{{if $term.selected}} class="fileas-selected"{{/if}}>{{$term.name}}</a></li>
+ <li class="nav-item"><a class="nav-link{{if $term.selected}} active{{/if}}" href="{{$base}}?f=&file={{$term.name}}">{{$term.name}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/filer_dialog.tpl b/view/tpl/filer_dialog.tpl
index 71e075958..61860d10f 100755
--- a/view/tpl/filer_dialog.tpl
+++ b/view/tpl/filer_dialog.tpl
@@ -1,6 +1,19 @@
-<div class="item-filer-dialog">
-{{include file="field_combobox.tpl"}}
-<div class="settings-submit-wrapper" >
- <input id="filer_save" type="button" class="settings-submit" value="{{$submit}}" />
-</div>
+<div class="modal" id="item-filer-dialog">
+ <div class="modal-dialog" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h4 class="modal-title">{{$title}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <div class="modal-body">
+ {{include file="field_combobox.tpl"}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">{{$cancel}}</button>
+ <button id="filer_save" type="button" class="btn btn-primary">{{$submit}}</button>
+ </div>
+ </div>
+ </div>
</div>
diff --git a/view/tpl/follow.tpl b/view/tpl/follow.tpl
index 9c19a288d..4def1415d 100755
--- a/view/tpl/follow.tpl
+++ b/view/tpl/follow.tpl
@@ -1,12 +1,10 @@
<div id="follow-sidebar" class="widget">
<h3>{{$connect}}</h3>
<form action="follow" method="post" />
- <div class="form-group">
- <div class="input-group">
- <input class="widget-input" type="text" name="url" title="{{$hint}}" placeholder="{{$desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="submit" value="{{$follow}}"><i class="fa fa-plus"></i></button>
- </div>
+ <div class="input-group">
+ <input class="form-control form-control-sm" type="text" name="url" title="{{$hint}}" placeholder="{{$desc}}" />
+ <div class="input-group-btn">
+ <button class="btn btn-success" type="submit" name="submit" value="{{$follow}}" title="{{$follow}}"><i class="fa fa-fw fa-plus"></i></button>
</div>
</div>
</form>
@@ -14,4 +12,3 @@
<div class="usage-message" id="abook-usage-message">{{$abook_usage_message}}</div>
{{/if}}
</div>
-
diff --git a/view/tpl/generic_links_widget.tpl b/view/tpl/generic_links_widget.tpl
index d7c234a84..67801e666 100755
--- a/view/tpl/generic_links_widget.tpl
+++ b/view/tpl/generic_links_widget.tpl
@@ -2,9 +2,9 @@
{{if $title}}<h3>{{$title}}</h3>{{/if}}
{{if $desc}}<div class="desc">{{$desc}}</div>{{/if}}
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $items as $item}}
- <li><a href="{{$item.url}}" class="{{if $item.selected}}active{{/if}}">{{$item.label}}</a></li>
+ <li class="nav-item"><a href="{{$item.url}}" class="nav-link{{if $item.selected}} active{{/if}}">{{$item.label}}</a></li>
{{/foreach}}
</ul>
diff --git a/view/tpl/generic_modal.tpl b/view/tpl/generic_modal.tpl
index 2bbea42b3..18279b6f7 100644
--- a/view/tpl/generic_modal.tpl
+++ b/view/tpl/generic_modal.tpl
@@ -2,12 +2,12 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="generic-modal-title-{{$id}}">{{$title}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="generic-modal-body-{{$id}}"></div>
<div class="modal-footer">
- <button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-default" data-dismiss="modal">{{$cancel}}</button>
+ <button id="generic-modal-cancel-{{$id}}" type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$cancel}}</button>
{{if $ok}}
<button id="generic-modal-ok-{{$id}}" type="button" class="btn btn-primary">{{$ok}}</button>
{{/if}}
diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl
index 34d0096e0..627debc80 100755
--- a/view/tpl/group_drop.tpl
+++ b/view/tpl/group_drop.tpl
@@ -2,6 +2,6 @@
<a href="group/drop/{{$id}}?t={{$form_security_token}}"
onclick="return confirmDelete();"
id="group-delete-icon-{{$id}}"
- class="group-delete-icon btn btn-default" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a>
+ class="group-delete-icon btn btn-outline-secondary" title="{{$delete}}" ><i class="fa fa-trash-o drop-icons"></i></a>
</div>
<div class="group-delete-end"></div>
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index 35f79a07e..14f714ae9 100755
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -1,20 +1,20 @@
<div class="widget" id="group-sidebar">
<h3>{{$title}}</h3>
<div>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $groups as $group}}
- <li>
+ <li class="nav-item nav-item-hack">
{{if $group.cid}}
- <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i>
+ <i id="group-{{$group.id}}" class="widget-nav-pills-checkbox fa fa-fw {{if $group.ismember}}fa-check-square-o{{else}}fa-square-o{{/if}}" onclick="contactgroupChangeMember('{{$group.id}}','{{$group.enc_cid}}'); return true;"></i>
{{/if}}
{{if $group.edit}}
- <a href="{{$group.edit.href}}" class="widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-pencil"></i></a>
+ <a href="{{$group.edit.href}}" class="nav-link{{if $group.selected}} active{{/if}} widget-nav-pills-icons" title="{{$edittext}}"><i class="fa fa-fw fa-pencil"></i></a>
{{/if}}
- <a{{if $group.selected}} class="group-selected"{{/if}} href="{{$group.href}}">{{$group.text}}</a>
+ <a class="nav-link{{if $group.selected}} active{{/if}}" href="{{$group.href}}">{{$group.text}}</a>
</li>
{{/foreach}}
- <li>
- <a href="group/new" title="{{$createtext}}" ><i class="fa fa-plus-circle"></i> {{$createtext}}</a>
+ <li class="nav-item">
+ <a class="nav-link" href="group/new" title="{{$createtext}}" ><i class="fa fa-plus-circle"></i> {{$createtext}}</a>
</li>
</ul>
diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl
index 6a14906f6..cccee2229 100644
--- a/view/tpl/hdr.tpl
+++ b/view/tpl/hdr.tpl
@@ -1,5 +1,3 @@
-<div id="banner" class="hidden-sm hidden-xs">{{$banner}}</div>
-
-<ul id="nav-notifications-template" rel="template">
- <li class="{5}"><a href="{0}" title="{2} {3}"><img class="dropdown-menu-img-sm" data-src="{1}"><span class="contactname">{2}</span><span class="dropdown-sub-text">{3}<br>{4}</span></a></li>
-</ul>
+<div id="nav-notifications-template" rel="template">
+ <a class="dropdown-item clearfix dropdown-notification {5}" href="{0}" title="{2} {3}"><img class="menu-img-3" data-src="{1}"><span class="contactname">{2}</span><span class="dropdown-sub-text">{3}<br>{4}</span></a>
+</div>
diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl
index 10e0a4957..43b061dcc 100644
--- a/view/tpl/help.tpl
+++ b/view/tpl/help.tpl
@@ -5,7 +5,7 @@
<div class="section-content-wrapper" id="doco-content">
<h3 id="doco-top-toc-heading">
<span class="fakelink" onclick="docoTocToggle(); return false;">
- <i class="fakelink fa fa-caret-right" id="doco-toc-toggle"></i>
+ <i class="fa fa-fw fa-caret-right fakelink" id="doco-toc-toggle"></i>
{{$tocHeading}}
</span>
</h3>
@@ -22,7 +22,7 @@
function docoTocToggle() {
if($('#doco-top-toc').is(':visible')) {
- $('#doco-toc-toggle').removeClass('fa-caret-down').addClass('fa-caret-right');
+ $('#doco-toc-toggle').removeClass('fa-cog').addClass('fa-caret-right');
} else {
$('#doco-toc-toggle').removeClass('fa-caret-right').addClass('fa-caret-down');
}
diff --git a/view/tpl/item_attach.tpl b/view/tpl/item_attach.tpl
index 83cc9a3cd..95e38c0bd 100644
--- a/view/tpl/item_attach.tpl
+++ b/view/tpl/item_attach.tpl
@@ -1,5 +1,5 @@
{{if $attaches}}
{{foreach $attaches as $a}}
-<li><a href="{{$a.url}}" title="{{$a.title}}"><i class="fa {{$a.icon}} attach-icons"></i>&nbsp;{{$a.label}}</a></li>
+<a class="dropdown-item" href="{{$a.url}}" title="{{$a.title}}"><i class="fa {{$a.icon}} attach-icons"></i>&nbsp;{{$a.label}}</a>
{{/foreach}}
{{/if}}
diff --git a/view/tpl/item_categories.tpl b/view/tpl/item_categories.tpl
index 9ff291747..e1b183c0d 100644
--- a/view/tpl/item_categories.tpl
+++ b/view/tpl/item_categories.tpl
@@ -1,8 +1,8 @@
{{if $categories}}
-<div class="categorytags">
+<!--div class="categorytags"-->
{{foreach $categories as $cat}}
-<span class="item-category"><i class="fa fa-asterisk cat-icons"></i>{{if $cat.url}}<a href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
+<span class="item-category badge badge-pill badge-warning"><i class="fa fa-asterisk"></i>&nbsp;{{if $cat.url}}<a class="text-white" href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
{{/foreach}}
-</div>
+<!--/div-->
{{/if}}
diff --git a/view/tpl/item_filer.tpl b/view/tpl/item_filer.tpl
index 0cde5caf7..4eb621f93 100644
--- a/view/tpl/item_filer.tpl
+++ b/view/tpl/item_filer.tpl
@@ -1,8 +1,8 @@
{{if $categories}}
-<div class="filesavetags">
+<!--div class="filesavetags"-->
{{foreach $categories as $cat}}
-<span class="item-category"><i class="fa fa-folder cat-icons"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="category-remove-link" title="{{$remove}}"><i class="fa fa-trash-o drop-icons"></i></a></span>
+<span class="item-category badge badge-pill badge-danger"><i class="fa fa-folder-o"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="text-white" title="{{$remove}}"><i class="fa fa-close"></i></a></span>
{{/foreach}}
-</div>
+<!--/div-->
{{/if}}
diff --git a/view/tpl/item_import.tpl b/view/tpl/item_import.tpl
index 65de7fcaf..e976417e1 100755
--- a/view/tpl/item_import.tpl
+++ b/view/tpl/item_import.tpl
@@ -1,7 +1,7 @@
<h2>{{$title}}</h2>
<form action="import_items" method="post" enctype="multipart/form-data" id="import-channel-form">
-
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
<div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
<label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
@@ -10,6 +10,4 @@
<input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" />
<div id="import-submit-end" class="import-field-end"></div>
-
</form>
-
diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl
index d846f3e34..853146a17 100755
--- a/view/tpl/jot-header.tpl
+++ b/view/tpl/jot-header.tpl
@@ -10,7 +10,7 @@ function initEditor(cb){
{{$geotag}}
if(plaintext == 'none') {
$("#profile-jot-text-loading").spin(false).hide();
- $("#profile-jot-text").css({ 'height': 200, 'color': '#000', 'line-height': 'inherit' });
+ $("#profile-jot-text").css({ 'height': 200 });
{{if $bbco_autocomplete}}
$("#profile-jot-text").bbco_autocomplete('{{$bbco_autocomplete}}'); // autocomplete bbcode
{{/if}}
@@ -340,18 +340,12 @@ function enableOnUser(){
}
function itemFiler(id) {
-
- var bordercolor = $("input").css("border-color");
+ if($('#item-filer-dialog').length)
+ $('#item-filer-dialog').remove();
$.get('filer/', function(data){
- $.colorbox({html:data});
- $("#id_term").keypress(function(){
- $(this).css("border-color",bordercolor);
- })
- $("#select_term").change(function(){
- $("#id_term").css("border-color",bordercolor);
- })
-
+ $('body').append(data);
+ $('#item-filer-dialog').modal('show');
$("#filer_save").click(function(e){
e.preventDefault();
reply = $("#id_term").val();
@@ -362,9 +356,7 @@ function enableOnUser(){
// if(timer) clearTimeout(timer);
// timer = setTimeout(NavUpdate,3000);
liking = 1;
- $.colorbox.close();
- } else {
- $("#id_term").css("border-color","#FF0000");
+ $('#item-filer-dialog').modal('hide');
}
return false;
});
@@ -437,13 +429,13 @@ function enableOnUser(){
if (data['status']) {
$('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
$('#embedPhotoModalBodyAlbumDialog').html('\
- <div><ul class="nav">\n\
- <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <div><div class="nav nav-pills flex-column">\n\
+ <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
<i class="fa fa-chevron-left"></i>&nbsp\n\
{{$modaldiffalbum}}\n\
</a>\n\
</li>\n\
- </ul><br></div>')
+ </div><br></div>')
$('#embedPhotoModalBodyAlbumDialog').append(data['content']);
$('#embedPhotoModalBodyAlbumDialog').click(function (evt) {
evt.preventDefault();
@@ -453,8 +445,8 @@ function enableOnUser(){
$(imageparent).toggleClass('embed-photo-selected-photo');
}
});
- $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
$('#embed-photo-OKButton').click(function () {
$('.embed-photo-selected-photo').each(function (index) {
var href = $(this).attr('href');
@@ -487,17 +479,17 @@ function enableOnUser(){
if (data['status']) {
var albums = data['albumlist']; //JSON.parse(data['albumlist']);
$('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
for(var i=0; i<albums.length; i++) {
var albumName = albums[i].text;
var jsAlbumName = albums[i].jstext;
- var albumLink = '<li>';
- albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
+ var albumLink = '<li class="nav-item">';
+ albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
albumLink += '</li>';
$('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
}
- $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
} else {
window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
}
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index 377eef453..dbbb470c5 100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -6,7 +6,7 @@
<span class="channel-id-select-desc">{{$id_seltext}}</span> {{$id_select}}
</div>
{{/if}}
- <div id="profile-jot-wrapper">
+ <div class="mb-4" id="profile-jot-wrapper">
{{if $parent}}
<input type="hidden" name="parent" value="{{$parent}}" />
{{/if}}
@@ -31,7 +31,7 @@
</div>
{{/if}}
<div id="jot-title-wrap" class="jothidden">
- <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" tabindex=1 value="{{$title}}">
+ <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" tabindex="1" value="{{$title}}">
</div>
{{if $catsenabled}}
<div id="jot-category-wrap" class="jothidden">
@@ -39,147 +39,150 @@
</div>
{{/if}}
<div id="jot-text-wrap">
- <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex=2 placeholder="{{$share}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$content}}</textarea>
+ <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$share}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$content}}</textarea>
</div>
{{if $attachment}}
<div id="jot-attachment-wrap">
<input class="jot-attachment" name="attachment" id="jot-attachment" type="text" value="{{$attachment}}" readonly="readonly" onclick="this.select();">
</div>
{{/if}}
- <div id="profile-jot-submit-wrapper" class="jothidden">
- <div id="profile-jot-submit-left" class="btn-toolbar pull-left">
+ <div id="profile-jot-submit-wrapper" class="clearfix p-2 jothidden">
+ <div id="profile-jot-submit-left" class="btn-toolbar float-left">
{{if $bbcode}}
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'profile-jot-text'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'profile-jot-text'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'profile-jot-text'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'profile-jot-text'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'profile-jot-text'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
{{/if}}
{{if $visitor}}
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group mr-2 d-none d-lg-flex">
{{if $writefiles}}
- <button id="wall-file-upload" class="btn btn-default btn-sm" title="{{$attach}}" >
+ <button id="wall-file-upload" class="btn btn-outline-secondary btn-sm" title="{{$attach}}" >
<i id="wall-file-upload-icon" class="fa fa-paperclip jot-icons"></i>
</button>
{{/if}}
{{if $weblink}}
- <button id="profile-link-wrapper" class="btn btn-default btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
+ <button id="profile-link-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$weblink}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;">
<i id="profile-link" class="fa fa-link jot-icons"></i>
</button>
{{/if}}
{{if $embedPhotos}}
- <button id="embed-photo-wrapper" class="btn btn-default btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
+ <button id="embed-photo-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$embedPhotos}}" onclick="initializeEmbedPhotoDialog();return false;">
<i id="embed-photo" class="fa fa-file-image-o jot-icons"></i>
</button>
{{/if}}
</div>
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group mr-2 d-none d-lg-flex">
{{if $setloc}}
- <button id="profile-location-wrapper" class="btn btn-default btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
+ <button id="profile-location-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
<i id="profile-location" class="fa fa-globe jot-icons"></i>
</button>
{{/if}}
{{if $clearloc}}
- <button id="profile-nolocation-wrapper" class="btn btn-default btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
+ <button id="profile-nolocation-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$clearloc}}" onclick="jotClearLocation();return false;" disabled="disabled">
<i id="profile-nolocation" class="fa fa-circle-o jot-icons"></i>
</button>
{{/if}}
{{else}}
- <div class="btn-group hidden-xs hidden-sm">
+ <div class="btn-group d-none d-lg-flex">
{{/if}}
{{if $feature_expire}}
- <button id="profile-expire-wrapper" class="btn btn-default btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
+ <button id="profile-expire-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
<i id="profile-expires" class="fa fa-eraser jot-icons"></i>
</button>
{{/if}}
{{if $feature_future}}
- <button id="profile-future-wrapper" class="btn btn-default btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
+ <button id="profile-future-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$future_txt}}" onclick="jotGetPubDate();return false;">
<i id="profile-future" class="fa fa-clock-o jot-icons"></i>
</button>
{{/if}}
{{if $feature_encrypt}}
- <button id="profile-encrypt-wrapper" class="btn btn-default btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;">
+ <button id="profile-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;">
<i id="profile-encrypt" class="fa fa-key jot-icons"></i>
</button>
{{/if}}
{{if $feature_voting}}
- <button id="profile-voting-wrapper" class="btn btn-default btn-sm" title="{{$voting}}" onclick="toggleVoting();return false;">
+ <button id="profile-voting-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$voting}}" onclick="toggleVoting();return false;">
<i id="profile-voting" class="fa fa-square-o jot-icons"></i>
</button>
{{/if}}
{{if $feature_nocomment}}
- <button id="profile-nocomment-wrapper" class="btn btn-default btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
+ <button id="profile-nocomment-wrapper" class="btn btn-outline-secondary btn-sm" title="{{$nocommenttitle}}" onclick="toggleNoComment();return false;">
<i id="profile-nocomment" class="fa fa-comments jot-icons"></i>
</button>
{{/if}}
</div>
{{if $writefiles || $weblink || $setloc || $clearloc || $feature_expire || $feature_encrypt || $feature_voting}}
- <div class="btn-group visible-xs visible-sm">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-down jot-icons"></i>
+ <div class="btn-group d-lg-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu" role="menu">
+ <div class="dropdown-menu">
{{if $visitor}}
{{if $writefiles}}
- <li><a id="wall-file-upload-sub" href="#" ><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a></li>
+ <a class="dropdown-item" id="wall-file-upload-sub" href="#" ><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a>
{{/if}}
{{if $weblink}}
- <li><a href="#" onclick="jotGetLink(); return false;"><i class="fa fa-link"></i>&nbsp;{{$weblink}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetLink(); return false;"><i class="fa fa-link"></i>&nbsp;{{$weblink}}</a>
+ {{/if}}
+ {{if $embedPhotos}}
+ <a class="dropdown-item" href="#" onclick="initializeEmbedPhotoDialog(); return false;"><i class="fa fa-file-image-o jot-icons"></i>&nbsp;{{$embedPhotos}}</a>
{{/if}}
{{if $setloc}}
- <li><a href="#" onclick="jotGetLocation(); return false;"><i class="fa fa-globe"></i>&nbsp;{{$setloc}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetLocation(); return false;"><i class="fa fa-globe"></i>&nbsp;{{$setloc}}</a>
{{/if}}
{{if $clearloc}}
- <li><a href="#" onclick="jotClearLocation(); return false;"><i class="fa fa-circle-o"></i>&nbsp;{{$clearloc}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotClearLocation(); return false;"><i class="fa fa-circle-o"></i>&nbsp;{{$clearloc}}</a>
{{/if}}
{{/if}}
{{if $feature_expire}}
- <li><a href="#" onclick="jotGetExpiry(); return false;"><i class="fa fa-eraser"></i>&nbsp;{{$expires}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetExpiry(); return false;"><i class="fa fa-eraser"></i>&nbsp;{{$expires}}</a>
{{/if}}
{{if $feature_future}}
- <li><a href="#" onclick="jotGetPubDate();return false;"><i class="fa fa-clock-o"></i>&nbsp;{{$future_txt}}</a></li>
+ <a class="dropdown-item" href="#" onclick="jotGetPubDate();return false;"><i class="fa fa-clock-o"></i>&nbsp;{{$future_txt}}</a>
{{/if}}
{{if $feature_encrypt}}
- <li><a href="#" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}','#profile-jot-text',$('#profile-jot-text').val());return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
{{if $feature_voting}}
- <li><a href="#" onclick="toggleVoting(); return false;"><i id="profile-voting-sub" class="fa fa-square-o"></i>&nbsp;{{$voting}}</a></li>
+ <a class="dropdown-item" href="#" onclick="toggleVoting(); return false;"><i id="profile-voting-sub" class="fa fa-square-o"></i>&nbsp;{{$voting}}</a>
{{/if}}
{{if $feature_nocomment}}
- <li><a href="#" onclick="toggleNoComment(); return false;"><i id="profile-nocomment-sub" class="fa fa-comments"></i>&nbsp;{{$nocommenttitlesub}}</a></li>
+ <a class="dropdown-item" href="#" onclick="toggleNoComment(); return false;"><i id="profile-nocomment-sub" class="fa fa-comments"></i>&nbsp;{{$nocommenttitlesub}}</a>
{{/if}}
- </ul>
+ </div>
</div>
{{/if}}
</div>
- <div id="profile-rotator-wrapper">
+ <div id="profile-rotator-wrapper" class="float-left">
<div id="profile-rotator"></div>
</div>
- <div id="profile-jot-submit-right" class="btn-group pull-right">
+ <div id="profile-jot-submit-right" class="btn-group float-right">
{{if $preview}}
- <button class="btn btn-default btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
+ <button class="btn btn-outline-secondary btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
<i class="fa fa-eye jot-icons" ></i>
</button>
{{/if}}
{{if $jotnets}}
- <button id="dbtn-jotnets" class="btn btn-default btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
+ <button id="dbtn-jotnets" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#jotnetsModal" type="button" title="{{$jotnets_label}}" style="{{if $lockstate == 'lock'}}display: none;{{/if}}">
<i class="fa fa-share-alt jot-icons"></i>
</button>
{{/if}}
{{if $showacl}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" type="button" data-form_id="profile-jot-form">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons{{if $bang}} jot-lock-warn{{/if}}"></i>
</button>
{{/if}}
@@ -187,7 +190,7 @@
</div>
<div class="clear"></div>
{{if $jotplugins}}
- <div id="profile-jot-plugin-wrapper">
+ <div id="profile-jot-plugin-wrapper" class="mt-2">
{{$jotplugins}}
</div>
{{/if}}
@@ -196,28 +199,26 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="expiryModalLabel">{{$jotnets_label}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body">
{{$jotnets}}
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{{/if}}
</div>
- <div id="profile-jot-text-loading"></div>
- <div id="profile-jot-end" class="clear"></div>
</div>
</form>
<div id="jot-preview-content" style="display:none;"></div>
-{{if $showacl}}{{$acl}}{{/if}}
+{{$acl}}
{{if $feature_expire}}
<!-- Modal for item expiry-->
@@ -225,8 +226,8 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="expiryModalLabel">{{$expires}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body form-group" style="width:90%">
<div class="date">
@@ -239,7 +240,7 @@
</script>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
<button id="expiry-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -252,8 +253,8 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="createdModalLabel">{{$future_txt}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body form-group" style="width:90%">
<div class="date">
@@ -266,7 +267,7 @@
</script>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
<button id="created-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -279,17 +280,17 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="embedPhotoModalBody" >
- <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
+ <div id="embedPhotoModalBodyAlbumListDialog" class="d-none">
<div id="embedPhotoModalBodyAlbumList"></div>
</div>
- <div id="embedPhotoModalBodyAlbumDialog" class="hide"></div>
+ <div id="embedPhotoModalBodyAlbumDialog" class="d-none"></div>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
<button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
</div>
</div><!-- /.modal-content -->
diff --git a/view/tpl/layoutlist.tpl b/view/tpl/layoutlist.tpl
index d0b81af0c..1bbe14893 100644
--- a/view/tpl/layoutlist.tpl
+++ b/view/tpl/layoutlist.tpl
@@ -2,8 +2,8 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('layout-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
- <a href="{{$help.url}}" target="_blank" class="btn btn-xs btn-warning" title="{{$help.title}}"><i class="fa fa-info"></i>&nbsp;{{$help.text}}</a>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('layout-editor');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <a href="{{$help.url}}" target="_blank" class="btn btn-sm btn-warning" title="{{$help.title}}"><i class="fa fa-info"></i>&nbsp;{{$help.text}}</a>
</div>
{{/if}}
<h2>{{$title}}</h2>
@@ -24,8 +24,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -55,10 +55,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#layout-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/like_noshare.tpl b/view/tpl/like_noshare.tpl
index 67f5868cb..e83b885fe 100755
--- a/view/tpl/like_noshare.tpl
+++ b/view/tpl/like_noshare.tpl
@@ -1,5 +1,5 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$id}}">
- <i class="fa fa-thumbs-o-up item-tool btn btn-default" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
- <i class="fa fa-thumbs-o-down item-tool btn btn-default" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
+ <i class="fa fa-thumbs-o-up item-tool btn btn-outline-secondary" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
+ <i class="fa fa-thumbs-o-down item-tool btn btn-outline-secondary" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
<div id="like-rotator-{{$id}}" class="like-rotator"></div>
</div>
diff --git a/view/tpl/locmanage.tpl b/view/tpl/locmanage.tpl
index fe2d5ec84..a8c75b6a8 100644
--- a/view/tpl/locmanage.tpl
+++ b/view/tpl/locmanage.tpl
@@ -8,7 +8,7 @@
$.post(baseurl + '/locs','drop='+id,function(data) { window.location.href=window.location.href; });
}
</script>
- <button class="btn btn-success btn-xs pull-right" onclick="window.location.href='/locs/f=&sync=1'; return false;"><i class="fa fa-refresh"></i>&nbsp;{{$sync}}</button>
+ <button class="btn btn-success btn-sm pull-right" onclick="window.location.href='/locs/f=&sync=1'; return false;"><i class="fa fa-refresh"></i>&nbsp;{{$sync}}</button>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
@@ -22,7 +22,7 @@
<table id="locs-index">
<tr>
<th>{{$addr}}</th>
- <th class="hidden-xs hidden-sm">{{$loc}}</th>
+ <th class="d-none d-md-table-cell">{{$loc}}</th>
<th>{{$mkprm}}</th>
<th>{{$drop}}</th>
</tr>
@@ -30,7 +30,7 @@
{{if ! $hub.deleted }}
<tr class="locs-index-row">
<td>{{$hub.hubloc_addr}}</td>
- <td class="hidden-xs hidden-sm">{{$hub.hubloc_url}}</td>
+ <td class="d-none d-md-table-cell">{{$hub.hubloc_url}}</td>
<td>{{if $hub.primary}}<i class="fa fa-check-square-o"></i>{{else}}<i class="fa fa-square-o primehub" onclick="primehub({{$hub.hubloc_id}}); return false;"></i>{{/if}}</td>
<td><i class="fa fa-trash-o drophub" onclick="drophub({{$hub.hubloc_id}}); return false;"></i></td>
</tr>
diff --git a/view/tpl/mail_conv.tpl b/view/tpl/mail_conv.tpl
index 249e13a04..759517b7f 100755
--- a/view/tpl/mail_conv.tpl
+++ b/view/tpl/mail_conv.tpl
@@ -1,47 +1,38 @@
-<div id="mail-{{$mail.id}}" class="mail-conv-outside-wrapper">
- <div class="mail-conv-sender" >
- <a href="{{$mail.from_url}}"><img class="mail-conv-sender-photo" src="{{$mail.from_photo}}" alt="{{$mail.from_name}}" /></a>
- </div>
- <div class="mail-conv-detail">
- {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
- <div class="mail-conv-sender-name"><a href="{{$mail.from_url}}">{{$mail.from_name}}</a></div>
- <div class="mail-conv-date autotime wall-item-ago" title="{{$mail.date}}">{{$mail.date}}</div>
+<div id="mail-{{$mail.id}}" class="mb-2 clearfix mail-conv-outside-wrapper">
+ <div class="mb-2 clearfix wall-item-head">
+ <div class="wall-item-info" >
+ <a href="{{$mail.from_url}}"><img class="wall-item-photo" src="{{$mail.from_photo}}" alt="{{$mail.from_name}}" /></a>
+ </div>
+ <div class="mail-conv-detail">
+ {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
+ <div class="wall-item-name"><a class="wall-item-name-link" href="{{$mail.from_url}}">{{$mail.from_name}}</a></div>
+ <div class="autotime wall-item-ago" title="{{$mail.date}}">{{$mail.date}}</div>
+ </div>
</div>
- <div class="clear"></div>
- <div class="mail-conv-content">
- <div class="mail-conv-body">
+ <div class="clearfix mail-conv-content">
+ <div class="clearfix mail-conv-body">
{{$mail.body}}
- <div class="clear"></div>
</div>
{{if $mail.attachments}}
- <div class="dropdown pull-left">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$mail.attachments}}</ul>
+ <div class="dropdown float-left">
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-fw fa-paperclip"></i></button>
+ <div class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$mail.attachments}}</div>
</div>
{{/if}}
- <div class="pull-right dropdown">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="mail-item-menu-{{$mail.id}}">
- <i class="fa fa-caret-down"></i>
+ <div class="float-right dropdown">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="mail-item-menu-{{$mail.id}}">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="mail-item-menu-{{$mail.id}}">
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="mail-item-menu-{{$mail.id}}">
{{if $mail.can_recall}}
- <li>
- <a href="mail/{{$mail.mailbox}}/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}"><i class="fa fa-undo mail-icons"></i>&nbsp;{{$mail.recall}}</a>
- </li>
+ <a class="dropdown-item" href="mail/{{$mail.mailbox}}/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}"><i class="fa fa-fw fa-undo"></i>&nbsp;{{$mail.recall}}</a>
{{/if}}
- <li>
- <a href="#" onclick="dropItem('mail/{{$mail.mailbox}}/drop/{{$mail.id}}', '#mail-{{$mail.id}}'); return false;" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}"><i class="fa fa-trash-o mail-icons"></i>&nbsp;{{$mail.delete}}</a>
- </li>
+ <a class="dropdown-item" href="#" onclick="dropItem('mail/{{$mail.mailbox}}/drop/{{$mail.id}}', '#mail-{{$mail.id}}'); return false;" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}"><i class="fa fa-fw fa-trash-o"></i>&nbsp;{{$mail.delete}}</a>
{{if $mail.can_recall}}
- <li class="divider"></li>
- <li>
- <a href="dreport/mail/{{$mail.mid}}" title="{{$mail.dreport}}" id="mail-conv-dreport-icon-{{$mail.id}}">{{$mail.dreport}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="dreport/mail/{{$mail.mid}}" title="{{$mail.dreport}}" id="mail-conv-dreport-icon-{{$mail.id}}">{{$mail.dreport}}</a>
{{/if}}
- </ul>
-
+ </div>
</div>
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
diff --git a/view/tpl/mail_display.tpl b/view/tpl/mail_display.tpl
index 748c118ef..e8549a49b 100755
--- a/view/tpl/mail_display.tpl
+++ b/view/tpl/mail_display.tpl
@@ -1,10 +1,10 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
{{if $mailbox == 'combined'}}
- <a class="btn btn-xs btn-danger" href="mail/{{$mailbox}}/dropconv/{{$thread_id}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$delete}}</a>
+ <a class="btn btn-sm btn-danger" href="mail/{{$mailbox}}/dropconv/{{$thread_id}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i> {{$delete}}</a>
{{/if}}
</div>
<h2>{{$prvmsg_header}}</h2>
diff --git a/view/tpl/mail_head.tpl b/view/tpl/mail_head.tpl
index d52fa40e0..aac592a5f 100755
--- a/view/tpl/mail_head.tpl
+++ b/view/tpl/mail_head.tpl
@@ -1,6 +1,6 @@
<div class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $messages as $message}}
{{include file="mail_list.tpl"}}
{{/foreach}}
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index fc9b5afa8..827c7628f 100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,5 +1,5 @@
-<li>
- <a href="mail/{{$message.mailbox}}/{{$message.id}}" class="{{if $message.selected}}active{{/if}}">
+<li class="nav-item">
+ <a href="mail/{{$message.mailbox}}/{{$message.id}}" class="nav-link{{if $message.selected}} active{{/if}}">
<span class="{{if $message.seen}}seen{{else}}unseen{{/if}}">{{$message.subject}}</span><br>
<span class="conv-participants">{{$message.from_name}} > {{$message.to_name}}</span><br>
<span class="wall-item-ago autotime" title="{{$message.date}}">{{$message.date}}</span>
diff --git a/view/tpl/menuedit.tpl b/view/tpl/menuedit.tpl
index 28236ff15..84b16dc0b 100644
--- a/view/tpl/menuedit.tpl
+++ b/view/tpl/menuedit.tpl
@@ -3,7 +3,7 @@
<div class="section-title-wrapper">
{{if $menu_edit_link}}
<div class="pull-right">
- <a href="{{$menu_edit_link}}" title="{{$hintedit}}" class="btn btn-xs btn-success"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$editcontents}}</a>
+ <a href="{{$menu_edit_link}}" title="{{$hintedit}}" class="btn btn-sm btn-success"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$editcontents}}</a>
</div>
{{/if}}
<h2>{{$header}}</h2>
diff --git a/view/tpl/menulist.tpl b/view/tpl/menulist.tpl
index f38619923..e23035062 100644
--- a/view/tpl/menulist.tpl
+++ b/view/tpl/menulist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('menu-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('menu-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
</div>
<h2>{{$title}}</h2>
<div class="clear"></div>
@@ -19,8 +19,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created}}</th>
- <th width="1%" class="hidden-xs">{{$edited}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited}}</th>
</tr>
{{foreach $menus as $m }}
<tr id="menu-list-item-{{$m.menu_id}}">
@@ -30,8 +30,8 @@
<td class="menu-list-tool"><a href="menu/{{$m.menu_id}}{{if $sys}}?f=&sys=1{{/if}}" title="{{$hintedit}}"><i class="fa fa-pencil"></i></a></td>
<td class="menu-list-tool"><a href="rpost?attachment={{$m.element}}" title="{{$share}}"><i class="fa fa-share-square-o"></i></a></td>
<td class="menu-list-tool"><a href="#" title="{{$hintdrop}}" onclick="dropItem('menu/{{$m.menu_id}}/drop{{if $sys}}?f=&sys=1{{/if}}', '#menu-list-item-{{$m.menu_id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td>
- <td class="hidden-xs">{{$m.menu_created}}</td>
- <td class="hidden-xs">{{$m.menu_edited}}</td>
+ <td class="d-none d-md-table-cell">{{$m.menu_created}}</td>
+ <td class="d-none d-md-table-cell">{{$m.menu_edited}}</td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/message_side.tpl b/view/tpl/message_side.tpl
index 6ea63c21e..2ac61bf76 100755
--- a/view/tpl/message_side.tpl
+++ b/view/tpl/message_side.tpl
@@ -1,9 +1,9 @@
<div class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$combined.url}}"{{if $combined.sel}} class="active"{{/if}}>{{$combined.label}}</a></li>
- <li><a href="{{$inbox.url}}"{{if $inbox.sel}} class="active"{{/if}}>{{$inbox.label}}</a></li>
- <li><a href="{{$outbox.url}}"{{if $outbox.sel}} class="active"{{/if}}>{{$outbox.label}}</a></li>
- <li><a href="{{$new.url}}"{{if $new.sel}} class="active"{{/if}}>{{$new.label}}</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a href="{{$combined.url}}" class="nav-link{{if $combined.sel}} active{{/if}}">{{$combined.label}}</a></li>
+ <li class="nav-item"><a href="{{$inbox.url}}" class="nav-link{{if $inbox.sel}} active{{/if}}">{{$inbox.label}}</a></li>
+ <li class="nav-item"><a href="{{$outbox.url}}" class="nav-link{{if $outbox.sel}} active{{/if}}">{{$outbox.label}}</a></li>
+ <li class="nav-item"><a href="{{$new.url}}" class="nav-link{{if $new.sel}} active{{/if}}">{{$new.label}}</a></li>
</ul>
</div>
diff --git a/view/tpl/mitemedit.tpl b/view/tpl/mitemedit.tpl
index a06203244..9f696fc23 100644
--- a/view/tpl/mitemedit.tpl
+++ b/view/tpl/mitemedit.tpl
@@ -24,7 +24,7 @@
{{include file="field_checkbox.tpl" field=$newwin}}
<div class="pull-right form-group">
<div class="btn-group">
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{if $submit_more}}
diff --git a/view/tpl/mitemlist.tpl b/view/tpl/mitemlist.tpl
index 90388ece2..5e1adb2fb 100644
--- a/view/tpl/mitemlist.tpl
+++ b/view/tpl/mitemlist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success" onclick="openClose('menu-element-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success" onclick="openClose('menu-element-creator');"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$hintnew}}</button>
</div>
<h2>{{$title}} {{if $menudesc}}{{$menudesc}}{{else}}{{$menuname}}{{/if}}</h2>
<div class="clear"></div>
diff --git a/view/tpl/myapps.tpl b/view/tpl/myapps.tpl
index 074965985..ccefa4a49 100755
--- a/view/tpl/myapps.tpl
+++ b/view/tpl/myapps.tpl
@@ -1,11 +1,17 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <h2>{{$title}}{{$cat}}</h2>
+ {{if $authed}}
+ {{if $create}}
+ <a href="appman" class="pull-right btn btn-success btn-sm"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</a>
+ {{else}}
+ <a href="apps/edit{{if $cat}}/?f=&cat={{$cat}}{{/if}}" class="pull-right btn btn-primary btn-sm">{{$manage}}</a>
+ {{/if}}
+ {{/if}}
+ <h2>{{$title}}{{if $cat}} - {{$cat}}{{/if}}</h2>
</div>
- <div class="section-content-wrapper">
+ <div class="clearfix section-content-wrapper">
{{foreach $apps as $ap}}
{{$ap}}
{{/foreach}}
- <div class="clear"></div>
</div>
</div>
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index 7037881ec..c5b378b4f 100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,210 +1,222 @@
-<div class="container-fluid">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-2">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- {{if $nav.login && !$userinfo}}
- <button type="button" class="navbar-toggle" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
- {{$nav.loginmenu.1.1}}
- </button>
+{{if $nav.login && !$userinfo}}
+<div class="d-md-none p-1">
+ <a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
+ {{$nav.loginmenu.1.1}}
+ </a>
+ {{if $nav.register}}
+ <a class="btn btn-warning btn-sm text-white" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" >
+ {{$nav.register.1}}
+ </a>
+ {{/if}}
+</div>
+{{/if}}
+{{if $userinfo}}
+<div class="dropdown usermenu">
+ <div class="fakelink" data-toggle="dropdown">
+ <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
+ <i class="fa fa-caret-down"></i>
+ </div>
+ {{if $localuser}}
+ <div class="dropdown-menu">
+ {{foreach $nav.usermenu as $usermenu}}
+ <a class="dropdown-item" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
+ {{/foreach}}
+ {{if $nav.manage}}
+ <a class="dropdown-item" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
+ {{/if}}
+ {{if $nav.channels}}
+ {{foreach $nav.channels as $chan}}
+ <a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a>
+ {{/foreach}}
{{/if}}
- {{if $localuser}}
- <button id="notifications-btn" type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1" style="color: grey;">
- <i class="fa fa-exclamation-circle"></i>
- </button>
- {{/if}}
- <button id="expand-tabs" type="button" class="navbar-toggle" data-toggle="collapse" data-target="#tabs-collapse-1">
- <i class="fa fa-arrow-circle-down" id="expand-tabs-icon"></i>
- </button>
- <button id="expand-aside" type="button" class="navbar-toggle" data-toggle="offcanvas" data-target="#region_1">
- <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
- </button>
- {{if $nav.help.6}}
- <button id="context-help-btn" class="navbar-toggle" type="button" onclick="contextualHelp(); return false;">
- <i class="fa fa-question-circle"></i>
- </button>
- {{/if}}
- {{if $userinfo}}
- <div class="usermenu-head dropdown-toggle fakelink" data-toggle="dropdown">
- <img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
- <span class="caret" id="usermenu-caret"></span>
- </div>
- {{if $localuser}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- {{foreach $nav.usermenu as $usermenu}}
- <li role="presentation"><a href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a></li>
- {{/foreach}}
- {{if $nav.manage}}
- <li role="presentation"><a href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a></li>
- {{/if}}
- {{if $nav.channels}}
- {{foreach $nav.channels as $chan}}
- <li role="presentation" class="nav-channel-select"><a href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a></li>
- {{/foreach}}
- {{/if}}
- <li role="presentation" class="divider"></li>
- {{if $nav.profiles}}
- <li role="presentation"><a href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a></li>
- {{/if}}
- {{if $nav.settings}}
- <li role="presentation"><a href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a></li>
- {{/if}}
- {{if $nav.admin}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a></li>
- {{/if}}
- {{if $nav.logout}}
- <li role="presentation" class="divider"></li>
- <li role="presentation"><a href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a></li>
- {{/if}}
- </ul>
- {{else}}
- {{if $nav.rusermenu}}
- <ul class="dropdown-menu" role="menu" aria-labelledby="avatar">
- <li role="presentation"><a href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a></li>
- <li role="presentation"><a href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a></li>
- </ul>
+ {{if $nav.profiles}}
+ <a class="dropdown-item" href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem" id="{{$nav.profiles.4}}">{{$nav.profiles.1}}</a>
{{/if}}
+ {{if $nav.settings}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
{{/if}}
+ {{if $nav.admin}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a>
+ {{/if}}
+ {{if $nav.logout}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a>
{{/if}}
</div>
- <div class="collapse navbar-collapse" id="navbar-collapse-1">
- <ul class="nav navbar-nav navbar-left">
- {{if $nav.network}}
- <li class="{{$sel.network}} net-button" style="display: none;">
- <a href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
- <i class="fa fa-fw fa-th"></i>
- <span class="net-update badge"></span>
- </a>
- <ul id="nav-network-menu" role="menu" class="dropdown-menu" rel="network">
- <li id="nav-network-see-all"><a href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a></li>
- <li id="nav-network-mark-all"><a href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.home}}
- <li class="{{$sel.home}} home-button" style="display: none;">
- <a class="{{$nav.home.2}}" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu">
- <i class="fa fa-fw fa-home"></i>
- <span class="home-update badge"></span>
- </a>
- <ul id="nav-home-menu" class="dropdown-menu" rel="home">
- <li id="nav-home-see-all"><a href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a></li>
- <li id="nav-home-mark-all"><a href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.messages}}
- <li class="{{$sel.messages}} mail-button" style="display: none;">
- <a class="{{$nav.messages.2}}" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-messages-menu">
- <i class="fa fa-fw fa-envelope"></i>
- <span class="mail-update badge"></span>
- </a>
- <ul id="nav-messages-menu" class="dropdown-menu" rel="messages">
- <li id="nav-messages-see-all"><a href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a></li>
- <li id="nav-messages-mark-all"><a href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.all_events}}
- <li class="{{$sel.all_events}} all_events-button" style="display: none;">
- <a class="{{$nav.all_events.2}}" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
- <i class="fa fa-fw fa-calendar"></i>
- <span class="all_events-update badge"></span>
- </a>
- <ul id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
- <li id="nav-all_events-see-all"><a href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a></li>
- <li id="nav-all_events-mark-all"><a href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.intros}}
- <li class="{{$sel.intros}} intro-button" style="display: none;">
- <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu">
- <i class="fa fa-fw fa-users"></i>
- <span class="intro-update badge"></span>
- </a>
- <ul id="nav-intros-menu" class="dropdown-menu" rel="intros">
- <li id="nav-intros-see-all"><a href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.notifications}}
- <li class="{{$sel.notifications}} notify-button" style="display: none;">
- <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu">
- <i class="fa fa-fw fa-exclamation"></i>
- <span class="notify-update badge"></span>
- </a>
- <ul id="nav-notify-menu" class="dropdown-menu" rel="notify">
- <li id="nav-notify-see-all"><a href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a></li>
- <li id="nav-notify-mark-all"><a href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a></li>
- <li class="empty">{{$emptynotifications}}</li>
- </ul>
- </li>
- {{/if}}
- {{if $nav.login && !$userinfo}}
- <li class="">
- <a href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a>
- </li>
- {{/if}}
- {{if $nav.register}}
- <li class="{{$nav.register.2}} hidden-xs"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a></li>
- {{/if}}
- {{if $nav.alogout}}
- <li class="{{$nav}}-alogout.2 hidden-xs"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a></li>
- {{/if}}
- </ul>
- <ul class="nav navbar-nav navbar-right hidden-xs">
- <li class="">
- <form method="get" action="search" role="search">
- <div id="nav-search-spinner"></div><input class="fa-search" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();"/>
- </form>
- </li>
- {{if $nav.help.6}}
- <li class="{{$sel.help}}">
- <a class="{{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-question-circle"></i></a>
- </li>
- {{/if}}
- <li class="">
- <a href="#" data-toggle="dropdown"><i class="fa fa-bars"></i></a>
- <ul class="dropdown-menu">
- {{foreach $navapps as $navapp}}
- {{$navapp}}
- {{/foreach}}
- {{if $localuser}}
- <li class="divider"></li>
- <li><a href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>Add Apps</a></li>
- {{/if}}
- </ul>
- </li>
- </ul>
- </div>
- <div class="collapse navbar-collapse" id="navbar-collapse-2">
- <ul class="nav navbar-nav navbar-left hidden-sm hidden-md hidden-lg">
- {{foreach $navapps as $navapp}}
- {{$navapp}}
- {{/foreach}}
- {{if $localuser}}
- <li class="divider"></li>
- <li><a href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>Add Apps</a></li>
- {{/if}}
- </ul>
+ {{else}}
+ {{if $nav.rusermenu}}
+ <div class="dropdown-menu" role="menu" aria-labelledby="avatar">
+ <a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a>
+ <a class="dropdown-item" href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a>
</div>
-
+ {{/if}}
+ {{/if}}
+</div>
+{{/if}}
+<div class="navbar-toggler-right">
{{if $nav.help.6}}
- <div id="contextual-help-content" class="contextual-help-content">
- {{$nav.help.5}}
- <div class="pull-right">
- <a class="contextual-help-tool btn btn-primary btn-xs" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-question"></i>&nbsp;{{$fulldocs}}</a>
- <a class="contextual-help-tool btn btn-default btn-xs" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-times"></i></a>
- </div>
- </div>
+ <button id="context-help-btn" class="navbar-toggler border-0" type="button" onclick="contextualHelp(); return false;">
+ <i class="fa fa-question-circle"></i>
+ </button>
{{/if}}
+ <button id="expand-aside" type="button" class="navbar-toggler border-0" data-toggle="offcanvas" data-target="#region_1">
+ <i class="fa fa-arrow-circle-right" id="expand-aside-icon"></i>
+ </button>
+ {{if $localuser}}
+ <button id="notifications-btn" type="button" class="navbar-toggler border-0 text-white" data-toggle="collapse" data-target="#navbar-collapse-1">
+ <i class="fa fa-exclamation-circle"></i>
+ </button>
+ {{/if}}
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
+ <i class="fa fa-bars"></i>
+ </button>
+</div>
+<div class="collapse navbar-collapse" id="navbar-collapse-1">
+ <ul class="navbar-nav mr-auto">
+ {{if $nav.network}}
+ <li class="nav-item dropdown net-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
+ <i class="fa fa-fw fa-th"></i>
+ <span class="badge badge-pill badge-default net-update"></span>
+ </a>
+ <div id="nav-network-menu" class="dropdown-menu" rel="network">
+ <a class="dropdown-item" id="nav-network-see-all" href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a>
+ <a class="dropdown-item" id="nav-network-mark-all"href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.home}}
+ <li class="nav-item dropdown home-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.home.3}}" id="{{$nav.home.4}}" data-toggle="dropdown" rel="#nav-home-menu">
+ <i class="fa fa-fw fa-home"></i>
+ <span class="badge badge-pill badge-danger home-update"></span>
+ </a>
+ <div id="nav-home-menu" class="dropdown-menu" rel="home">
+ <a class="dropdown-item" id="nav-home-see-all" href="{{$nav.home.all.0}}">{{$nav.home.all.1}}</a>
+ <a class="dropdown-item" id="nav-home-mark-all" href="#" onclick="markRead('home'); return false;">{{$nav.home.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.messages}}
+ <li class="nav-item dropdown mail-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.messages.3}}" id="{{$nav.messages.4}}" data-toggle="dropdown" rel="#nav-messages-menu">
+ <i class="fa fa-fw fa-envelope"></i>
+ <span class="badge badge-pill badge-danger mail-update"></span>
+ </a>
+ <div id="nav-messages-menu" class="dropdown-menu" rel="messages">
+ <a class="dropdown-item" id="nav-messages-see-all" href="{{$nav.messages.all.0}}">{{$nav.messages.all.1}}</a>
+ <a class="dropdown-item" id="nav-messages-mark-all" href="#" onclick="markRead('messages'); return false;">{{$nav.messages.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.all_events}}
+ <li class="nav-item dropdown all_events-button" style="display: none;">
+ <a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
+ <i class="fa fa-fw fa-calendar"></i>
+ <span class="badge badge-pill badge-default all_events-update"></span>
+ </a>
+ <div id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
+ <a class="dropdown-item" id="nav-all_events-see-all" href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a>
+ <a class="dropdown-item" id="nav-all_events-mark-all" href="#" onclick="markRead('all_events'); return false;">{{$nav.all_events.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.intros}}
+ <li class="nav-item dropdown intro-button" style="display: none;">
+ <a class="nav-link" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" id="{{$nav.intros.4}}" data-toggle="dropdown" rel="#nav-intros-menu">
+ <i class="fa fa-fw fa-users"></i>
+ <span class="badge badge-pill badge-danger intro-update"></span>
+ </a>
+ <div id="nav-intros-menu" class="dropdown-menu" rel="intros">
+ <a class="dropdown-item" id="nav-intros-see-all" href="{{$nav.intros.all.0}}">{{$nav.intros.all.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.notifications}}
+ <li class="nav-item dropdown notify-button" style="display: none;">
+ <a class="nav-link" href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}" id="{{$nav.notifications.4}}" data-toggle="dropdown" rel="#nav-notify-menu">
+ <i class="fa fa-fw fa-exclamation"></i>
+ <span class="badge badge-pill badge-danger notify-update"></span>
+ </a>
+ <div id="nav-notify-menu" class="dropdown-menu" rel="notify">
+ <a class="dropdown-item" id="nav-notify-see-all" href="{{$nav.notifications.all.0}}">{{$nav.notifications.all.1}}</a>
+ <a class="dropdown-item" id="nav-notify-mark-all" href="#" onclick="markRead('notify'); return false;">{{$nav.notifications.mark.1}}</a>
+ {{$emptynotifications}}
+ </div>
+ </li>
+ {{/if}}
+ {{if $nav.login && !$userinfo}}
+ <li class="nav-item">
+ <a class="nav-link" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}" data-toggle="modal" data-target="#nav-login">{{$nav.loginmenu.1.1}}</a>
+ </li>
+ {{/if}}
+ {{if $nav.register}}
+ <li class="nav-item {{$nav.register.2}} d-none d-md-flex">
+ <a class="nav-link" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}">{{$nav.register.1}}</a>
+ </li>
+ {{/if}}
+ {{if $nav.alogout}}
+ <li class="nav-item {{$nav.alogout.2}} d-none d-md-flex">
+ <a class="nav-link" href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" id="{{$nav.alogout.4}}">{{$nav.alogout.1}}</a>
+ </li>
+ {{/if}}
+ </ul>
+
+ <div id="banner" class="navbar-text d-none d-md-flex">{{$banner}}</div>
+
+ <ul id="nav-right" class="navbar-nav ml-auto d-none d-md-flex">
+ <li class="nav-item collapse clearfix" id="nav-search">
+ <form class="form-inline" method="get" action="search" role="search">
+ <input class="form-control form-control-sm mt-1 mr-2" id="nav-search-text" type="text" value="" placeholder="&#xf002; {{$help}}" name="search" title="{{$nav.search.3}}" onclick="this.submit();" onblur="closeMenu('nav-search'); openMenu('nav-search-btn');"/>
+ </form>
+ <div id="nav-search-spinner"></div>
+ </li>
+ <li class="nav-item" id="nav-search-btn">
+ <a class="nav-link" href="#nav-search" title="{{$nav.search.3}}" onclick="openMenu('nav-search'); closeMenu('nav-search-btn'); $('#nav-search-text').focus(); return false;"><i class="fa fa-fw fa-search"></i></a>
+ </li>
+ {{if $nav.help.6}}
+ <li class="nav-item dropdown {{$sel.help}}">
+ <a class="nav-link {{$nav.help.2}}" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" id="{{$nav.help.4}}" onclick="contextualHelp(); return false;"><i class="fa fa-fw fa-question-circle"></i></a>
+ </li>
+ {{/if}}
+ <li class="nav-item dropdown" id="app-menu">
+ <a class="nav-link" href="#" data-toggle="dropdown"><i class="fa fa-fw fa-bars"></i></a>
+ <div class="dropdown-menu dropdown-menu-right">
+ {{foreach $navapps as $navapp}}
+ {{$navapp}}
+ {{/foreach}}
+ {{if $localuser}}
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
+ {{/if}}
+ </div>
+ </li>
+ </ul>
+</div>
+<div class="collapse d-md-none" id="navbar-collapse-2">
+ <div class="navbar-nav mr-auto">
+ {{foreach $navapps as $navapp}}
+ {{$navapp|replace:'dropdown-item':'nav-link'}}
+ {{/foreach}}
+ {{if $localuser}}
+ <div class="dropdown-divider"></div>
+ <a class="nav-link" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
+ {{/if}}
+ </div>
+</div>
+{{if $nav.help.6}}
+<div id="contextual-help-content" class="contextual-help-content">
+ {{$nav.help.5}}
+ <div class="float-right">
+ <a class="btn btn-primary btn-sm" target="hubzilla-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}"><i class="fa fa-question"></i>&nbsp;{{$fulldocs}}</a>
+ <a class="contextual-help-tool" href="#" onclick="contextualHelp(); return false;"><i class="fa fa-times"></i></a>
+ </div>
</div>
+{{/if}}
diff --git a/view/tpl/nav_login.tpl b/view/tpl/nav_login.tpl
index 8f106b41c..b361b1a14 100644
--- a/view/tpl/nav_login.tpl
+++ b/view/tpl/nav_login.tpl
@@ -3,8 +3,8 @@
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
+ <h4 class="modal-title">{{$nav.loginmenu.1.1}}</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
- <h3 class="modal-title">{{$nav.loginmenu.1.1}}</h3>
</div>
<div class="modal-body">
<div class="form-group">
diff --git a/view/tpl/nwiki_page_history.tpl b/view/tpl/nwiki_page_history.tpl
index d99f83863..b1c6c9284 100644
--- a/view/tpl/nwiki_page_history.tpl
+++ b/view/tpl/nwiki_page_history.tpl
@@ -39,17 +39,17 @@
background:rgb(224,255,224);
}
</style>
-<table class="table-striped table-responsive table-hover" style="width: 100%;">
+<table class="" style="width: 100%;">
{{foreach $pageHistory as $commit}}
- <tr><td>
- <table id="rev-{{$commit.revision}}" onclick="$('#details-{{$commit.revision}}').show()" width="100%">
+ <tr class="wikis-index-row"><td>
+ <table id="rev-{{$commit.revision}}" onclick="$('#details-{{$commit.revision}}').show()" style="width: 100%;">
<tr><td width="10%">Date</td><td width="70%">{{$commit.date}}</td>
<td rowspan="3" width="20%" align="right">
{{if $permsWrite}}
- <button id="revert-{{$commit.revision}}" class="btn btn-danger btn-xs" onclick="wiki_revert_page('{{$commit.revision}}')">Revert</button>
+ <button id="revert-{{$commit.revision}}" class="btn btn-danger btn-sm" onclick="wiki_revert_page('{{$commit.revision}}')">Revert</button>
<br><br>
{{/if}}
- <button id="compare-{{$commit.revision}}" class="btn btn-warning btn-xs" onclick="wiki_compare_page('{{$commit.revision}}')">Compare</button>
+ <button id="compare-{{$commit.revision}}" class="btn btn-warning btn-sm" onclick="wiki_compare_page('{{$commit.revision}}')">Compare</button>
</td></tr>
<tr><td>{{$name_lbl}}</td><td>{{$commit.name}}</td></tr>
<tr><td>{{$msg_label}}</td><td>{{$commit.title}}</td></tr>
diff --git a/view/tpl/peoplefind.tpl b/view/tpl/peoplefind.tpl
index ae0b7f1ea..2ecfbaff9 100755
--- a/view/tpl/peoplefind.tpl
+++ b/view/tpl/peoplefind.tpl
@@ -1,19 +1,17 @@
<div id="peoplefind-sidebar" class="widget">
<h3>{{$findpeople}}</h3>
<form action="directory" method="post" />
- <div class="form-group">
- <div class="input-group">
- <input class="widget-input" type="text" name="search" title="{{$hint}}{{if $advanced_search}}{{$advanced_hint}}{{/if}}" placeholder="{{$desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="submit"><i class="fa fa-search"></i></button>
- </div>
+ <div class="input-group form-group">
+ <input class="form-control form-control-sm" type="text" name="search" title="{{$hint}}{{if $advanced_search}}{{$advanced_hint}}{{/if}}" placeholder="{{$desc}}" />
+ <div class="input-group-btn">
+ <button class="btn btn-outline-secondary" type="submit" name="submit"><i class="fa fa-fw fa-search"></i></button>
</div>
</div>
</form>
- <ul class="nav nav-pills nav-stacked">
- {{if $similar}}<li><a href="match" >{{$similar}}</a></li>{{/if}}
- {{if $loggedin}}<li><a href="directory?suggest=1" >{{$suggest}}</a></li>{{/if}}
- <li><a href="randprof" >{{$random}}</a></li>
- {{if $loggedin}}{{if $inv}}<li><a href="invite" >{{$inv}}</a></li>{{/if}}{{/if}}
+ <ul class="nav nav-pills flex-column">
+ {{if $similar}}<li class="nav-item"><a class="nav-link" href="match" >{{$similar}}</a></li>{{/if}}
+ {{if $loggedin}}<li class="nav-item"><a class="nav-link" href="directory?suggest=1" >{{$suggest}}</a></li>{{/if}}
+ <li class="nav-item"><a class="nav-link" href="randprof" >{{$random}}</a></li>
+ {{if $loggedin}}{{if $inv}}<li class="nav-item"><a class="nav-link" href="invite" >{{$inv}}</a></li>{{/if}}{{/if}}
</ul>
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index 6289f5321..8bacb1575 100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -2,14 +2,14 @@
<div class="section-title-wrapper">
<div class="pull-right">
{{if $order}}
- <a class="btn btn-default btn-xs" href="{{$order.1}}" title="{{$order.0}}"><i class="fa fa-sort"></i></a>
+ <a class="btn btn-outline-secondary btn-sm" href="{{$order.1}}" title="{{$order.0}}"><i class="fa fa-sort"></i></a>
{{/if}}
<div class="btn-group btn-group">
{{if $album_edit.1}}
- <i class="fa fa-pencil btn btn-default btn-xs" title="{{$album_edit.0}}" onclick="openClose('photo-album-edit-wrapper'); closeMenu('photo-upload-form');"></i>
+ <i class="fa fa-pencil btn btn-outline-secondary btn-sm" title="{{$album_edit.0}}" onclick="openClose('photo-album-edit-wrapper'); closeMenu('photo-upload-form');"></i>
{{/if}}
{{if $can_post}}
- <button class="btn btn-xs btn-success btn-xs" title="{{$usage}}" onclick="openClose('photo-upload-form'); closeMenu('photo-album-edit-wrapper');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
+ <button class="btn btn-sm btn-success btn-sm" title="{{$usage}}" onclick="openClose('photo-upload-form'); closeMenu('photo-album-edit-wrapper');"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
</div>
</div>
diff --git a/view/tpl/photo_albums.tpl b/view/tpl/photo_albums.tpl
index de1105bbc..a238e61bc 100755
--- a/view/tpl/photo_albums.tpl
+++ b/view/tpl/photo_albums.tpl
@@ -1,11 +1,11 @@
<div id="side-bar-photos-albums" class="widget">
<h3>{{$title}}</h3>
- <ul class="nav nav-pills nav-stacked">
- <li><a href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >Recent Photos</a></li>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >{{$recent}}</a></li>
{{if $albums}}
{{foreach $albums as $al}}
- {{if $al.text}}
- <li><a href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge pull-right">{{$al.total}}</span>{{$al.text}}</a></li>
+ {{if $al.shorttext}}
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge badge-default float-right">{{$al.total}}</span>{{$al.shorttext}}</a></li>
{{/if}}
{{/foreach}}
{{/if}}
diff --git a/view/tpl/photo_drop.tpl b/view/tpl/photo_drop.tpl
index 9c0a65d1c..664e5338c 100755
--- a/view/tpl/photo_drop.tpl
+++ b/view/tpl/photo_drop.tpl
@@ -1,3 +1,3 @@
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$id}}" >
- <a class="btn btn-default btn-sm" href="#" onclick="dropItem('item/drop/{{$id}}', '#wall-item-outside-wrapper-{{$id}}'); return false;" title="{{$delete}}" ><i class="fa fa-trash-o"></i></a>
+ <a class="btn btn-outline-secondary btn-sm" href="#" onclick="dropItem('item/drop/{{$id}}', '#wall-item-outside-wrapper-{{$id}}'); return false;" title="{{$delete}}" ><i class="fa fa-trash-o"></i></a>
</div>
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index 967abea71..2431329ec 100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -4,44 +4,36 @@
<div class="pull-right">
{{if $tools || $map || $edit}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right">
+ <div class="dropdown-menu dropdown-menu-right flex-column">
{{if $tools}}
- <li class="nav-item">
- <a class="nav-link" href="{{$tools.profile.0}}"><i class="fa fa-user"></i>&nbsp;{{$tools.profile.1}}</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="{{$tools.cover.0}}"><i class="fa fa-picture-o"></i>&nbsp;{{$tools.cover.1}}</a>
- </li>
+ <a class="dropdown-item" href="{{$tools.profile.0}}"><i class="fa fa-user"></i>&nbsp;{{$tools.profile.1}}</a>
+ <a class="dropdown-item" href="{{$tools.cover.0}}"><i class="fa fa-picture-o"></i>&nbsp;{{$tools.cover.1}}</a>
{{/if}}
{{if $map}}
- <li class="nav-item">
- <a class="nav-link" href="#" onclick="var pos = $('#photo-map').css('position'); if(pos === 'absolute') { $('#photo-map').css( { position: 'relative', left: 'auto', top: 'auto' }); } else { $('#photo-map').css( { position: 'absolute', left: '-9999px', top: '-9999px' }); } return false; " ><i class="fa fa-globe"></i>&nbsp;{{$map_text}}</a>
- </li>
+ <a class="dropdown-item" href="#" onclick="var pos = $('#photo-map').css('position'); if(pos === 'absolute') { $('#photo-map').css( { position: 'relative', left: 'auto', top: 'auto' }); } else { $('#photo-map').css( { position: 'absolute', left: '-9999px', top: '-9999px' }); } return false; " ><i class="fa fa-globe"></i>&nbsp;{{$map_text}}</a>
{{/if}}
{{if $edit}}
- <li class="nav-item">
- <a class="nav-link acl-form-trigger" href="#" title="" onclick="openClose('photo-edit'); return false;" data-form_id="photo_edit_form"><i class="fa fa-pencil"></i>&nbsp;{{$edit.edit}}</a>
- </li>
+ <a class="dropdown-item acl-form-trigger" href="#" title="" onclick="openClose('photo-edit'); return false;" data-form_id="photo_edit_form"><i class="fa fa-pencil"></i>&nbsp;{{$edit.edit}}</a>
{{/if}}
- </ul>
+ </div>
</div>
{{/if}}
{{if $lock}}
<div class="btn-group">
- <button id="lockview" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ><i class="fa fa-lock"></i></button>
+ <button id="lockview" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" title="{{$lock}}" onclick="lockview('photo',{{$id}});" ><i class="fa fa-lock"></i></button>
<ul id="panel-{{$id}}" class="lockview-panel dropdown-menu dropdown-menu-right"></ul>
</div>
{{/if}}
{{if $prevlink || $nextlink}}
<div class="btn-group">
{{if $prevlink}}
- <a href="{{$prevlink.0}}" class="btn btn-default btn-xs" title="{{$prevlink.1}}"><i class="fa fa-backward"></i></a>
+ <a href="{{$prevlink.0}}" class="btn btn-outline-secondary btn-sm" title="{{$prevlink.1}}"><i class="fa fa-backward"></i></a>
{{/if}}
{{if $nextlink}}
- <a href="{{$nextlink.0}}" class="btn btn-default btn-xs" title="{{$nextlink.1}}"><i class="fa fa-forward"></i></a>
+ <a href="{{$nextlink.0}}" class="btn btn-outline-secondary btn-sm" title="{{$nextlink.1}}"><i class="fa fa-forward"></i></a>
{{/if}}
</div>
{{/if}}
@@ -96,7 +88,7 @@
</div>
<div class="form-group btn-group pull-right">
{{if $edit.aclselect}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$edit.lockstate}}"></i>
</button>
{{/if}}
@@ -124,7 +116,7 @@
{{foreach $responses as $verb=>$response}}
{{if $response.count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$id}}">{{$response.count}} {{$response.button}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="wall-item-{{$verb}}-{{$id}}">{{$response.count}} {{$response.button}}</button>
{{if $response.list_part}}
<ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-{{$verb}}-{{$id}}">{{foreach $response.list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
{{else}}
@@ -142,7 +134,7 @@
<ul>{{foreach $response.list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
</div>
<div class="modal-footer clear">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$modal_dismiss}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$modal_dismiss}}</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
@@ -156,10 +148,10 @@
{{/if}}
{{if $likebuttons}}
<div class="photo-item-tools-right btn-group pull-right">
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$likebuttons.id}},'like'); return false">
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$likebuttons.id}},'like'); return false">
<i class="fa fa-thumbs-o-up" title="{{$likebuttons.likethis}}"></i>
</button>
- <button type="button" class="btn btn-default btn-sm" onclick="dolike({{$likebuttons.id}},'dislike'); return false">
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$likebuttons.id}},'dislike'); return false">
<i class="fa fa-thumbs-o-down" title="{{$likebuttons.nolike}}"></i>
</button>
</div>
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index 92e70692f..8fe631ca6 100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
<div class="pull-right">
{{if $can_post}}
- <button class="btn btn-xs btn-success acl-form-trigger" title="{{$usage}}" onclick="openClose('photo-upload-form');" data-form_id="photos-upload-form"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
+ <button class="btn btn-sm btn-success acl-form-trigger" title="{{$usage}}" onclick="openClose('photo-upload-form');" data-form_id="photos-upload-form"><i class="fa fa-arrow-circle-o-up"></i>&nbsp;{{$upload.0}}</button>
{{/if}}
</div>
<h2>{{$title}}</h2>
diff --git a/view/tpl/photos_upload.tpl b/view/tpl/photos_upload.tpl
index 90cd0e84a..d52bad5a2 100755
--- a/view/tpl/photos_upload.tpl
+++ b/view/tpl/photos_upload.tpl
@@ -26,7 +26,7 @@
<div class="pull-right btn-group">
<div class="btn-group">
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
@@ -45,7 +45,7 @@
</div>
<div id="photos-upload-perms" class="btn-group pull-right">
{{if $lockstate}}
- <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/posted_date_widget.tpl b/view/tpl/posted_date_widget.tpl
index 8b442e4b9..fb43c744b 100755
--- a/view/tpl/posted_date_widget.tpl
+++ b/view/tpl/posted_date_widget.tpl
@@ -3,12 +3,12 @@
function toggle_posted_date_button() {
if($('#posted-date-dropdown').is(':visible')) {
$('#posted-date-icon').removeClass('fa-caret-up');
- $('#posted-date-icon').addClass('fa-caret-down');
+ $('#posted-date-icon').addClass('fa-cog');
$('#posted-date-dropdown').hide();
}
else {
$('#posted-date-icon').addClass('fa-caret-up');
- $('#posted-date-icon').removeClass('fa-caret-down');
+ $('#posted-date-icon').removeClass('fa-cog');
$('#posted-date-dropdown').show();
}
}
@@ -18,21 +18,21 @@ function toggle_posted_date_button() {
<div id="datebrowse-sidebar" class="widget">
<h3>{{$title}}</h3>
<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
- <ul id="posted-date-selector" class="nav nav-pills nav-stacked">
+ <ul id="posted-date-selector" class="nav nav-pills flex-column">
{{foreach $dates as $y => $arr}}
{{if $y == $cutoff_year}}
</ul>
<div id="posted-date-dropdown" style="display: none;">
- <ul id="posted-date-selector-drop" class="nav nav-pills nav-stacked">
+ <ul id="posted-date-selector-drop" class="nav nav-pills flex-column">
{{/if}}
- <li id="posted-date-selector-year-{{$y}}">
- <a href="#" onclick="openClose('posted-date-selector-{{$y}}'); return false;">{{$y}}</a>
+ <li class="nav-item" id="posted-date-selector-year-{{$y}}">
+ <a class="nav-link" href="#" onclick="openClose('posted-date-selector-{{$y}}'); return false;">{{$y}}</a>
</li>
<div id="posted-date-selector-{{$y}}" style="display: none;">
- <ul class="posted-date-selector-months nav nav-pills nav-stacked">
+ <ul class="posted-date-selector-months nav nav-pills flex-column">
{{foreach $arr as $d}}
- <li>
- <a href="#" onclick="dateSubmit('{{$url}}?f=&dend={{$d.1}}{{if $showend}}&dbegin={{$d.2}}{{/if}}'); return false;">{{$d.0}}</a>
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="dateSubmit('{{$url}}?f=&dend={{$d.1}}{{if $showend}}&dbegin={{$d.2}}{{/if}}'); return false;">{{$d.0}}</a>
</li>
{{/foreach}}
</ul>
@@ -40,7 +40,7 @@ function toggle_posted_date_button() {
{{/foreach}}
{{if $cutoff}}
</div>
- <button class="btn btn-default btn-sm" onclick="toggle_posted_date_button(); return false;"><i id="posted-date-icon" class="fa fa-caret-down"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="toggle_posted_date_button(); return false;"><i id="posted-date-icon" class="fa fa-cog"></i></button>
{{/if}}
</ul>
</div>
diff --git a/view/tpl/profile_advanced.tpl b/view/tpl/profile_advanced.tpl
index 4000f39d6..c56062459 100755
--- a/view/tpl/profile_advanced.tpl
+++ b/view/tpl/profile_advanced.tpl
@@ -1,9 +1,9 @@
<div id="profile-content-wrapper" class="generic-content-wrapper">
<div class="section-title-wrapper">
- <div class="pull-right">
+ <div class="float-right">
{{if $profile.like_count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" id="profile-like">{{$profile.like_count}} {{$profile.like_button_label}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="profile-like">{{$profile.like_count}} {{$profile.like_button_label}}</button>
{{if $profile.likers}}
<ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="profile-like">{{foreach $profile.likers as $liker}}<li role="presentation"><a href="{{$liker.url}}"><img class="dropdown-menu-img-xs" src="{{$liker.photo}}" alt="{{$liker.name}}" /> {{$liker.name}}</a></li>{{/foreach}}</ul>
{{/if}}
@@ -11,32 +11,32 @@
{{/if}}
{{if $profile.canlike}}
<div class="btn-group">
- <button type="button" class="btn btn-success btn-xs" onclick="doprofilelike('profile/' + '{{$profile.profile_guid}}','like'); return false;" title="{{$profile.likethis}}" >
+ <button type="button" class="btn btn-success btn-sm" onclick="doprofilelike('profile/' + '{{$profile.profile_guid}}','like'); return false;" title="{{$profile.likethis}}" >
<i class="fa fa-thumbs-o-up" title="{{$profile.likethis}}"></i>
</button>
</div>
{{/if}}
{{if $editmenu.multi}}
<div class="btn-group">
- <a class="btn btn-primary btn-xs dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
+ <a class="btn btn-primary btn-sm dropdown-toggle" data-toggle="dropdown" href="#" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
+ <div class="dropdown-menu dropdown-menu-right">
{{foreach $editmenu.menu.entries as $e}}
- <li>
- <a href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'>{{$e.profile_name}}<div class='clear'></div></a>
- </li>
+ <a class="dropdown-item" href="profiles/{{$e.id}}"><img class="dropdown-menu-img-xs" src='{{$e.photo}}'> {{$e.profile_name}}</a>
{{/foreach}}
- <li><a href="profile_photo" >{{$editmenu.menu.chg_photo}}</a></li>
- {{if $editmenu.menu.cr_new}}<li><a href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a></li>{{/if}}
- </ul>
+ <a class="dropdown-item" href="profile_photo" >{{$editmenu.menu.chg_photo}}</a>
+ {{if $editmenu.menu.cr_new}}
+ <a class="dropdown-item" href="profiles/new" id="profile-listing-new-link">{{$editmenu.menu.cr_new}}</a>
+ {{/if}}
+ </div>
</div>
{{elseif $editmenu}}
<div class="btn-group">
- <a class="btn btn-primary btn-xs" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
+ <a class="btn btn-primary btn-sm" href="{{$editmenu.edit.0}}" ><i class="fa fa-pencil"></i>&nbsp;{{$editmenu.edit.3}}</a>
</div>
{{/if}}
{{if $exportlink}}
<div class="btn-group">
- <a class="btn btn-default btn-xs" href="{{$exportlink}}" ><i class="fa fa-vcard"></i>&nbsp;{{$export}}</a>
+ <a class="btn btn-outline-secondary btn-sm" href="{{$exportlink}}" ><i class="fa fa-vcard"></i>&nbsp;{{$export}}</a>
</div>
{{/if}}
</div>
@@ -47,6 +47,28 @@
{{foreach $fields as $f}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{if $f == 'name'}}
<dl id="aprofile-fullname" class="aprofile">
<dt>{{$profile.fullname.0}}</dt>
@@ -297,13 +319,13 @@
<li>{{if $item.img}}<a href="{{$item.url}}" ><img src="{{$item.img}}" class="profile-thing-img" width="100" height="100" alt="{{$item.term}}" /></a>{{/if}}
<a href="{{$item.editurl}}" >{{$item.term}}</a>
{{if $profile.canlike}}<br />
- <button type="button" class="btn btn-default btn-sm" onclick="doprofilelike('thing/' + '{{$item.term_hash}}','like'); return false;" title="{{$likethis}}" >
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="doprofilelike('thing/' + '{{$item.term_hash}}','like'); return false;" title="{{$likethis}}" >
<i class="fa fa-thumbs-o-up" title="{{$likethis}}"></i>
</button>
{{/if}}
{{if $item.like_count}}
<div class="btn-group">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="thing-like-{{$item.term_hash}}">{{$item.like_count}} {{$item.like_label}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="thing-like-{{$item.term_hash}}">{{$item.like_count}} {{$item.like_label}}</button>
{{if $item.likes}}
<ul class="dropdown-menu" role="menu" aria-labelledby="thing-like-{{$item.term_hash}}">{{foreach $item.likes as $liker}}<li role="presentation"><a href="{{$liker.xchan_url}}"><img class="dropdown-menu-img-xs" src="{{$liker.xchan_photo_s}}" alt="{{$liker.name}}" /> {{$liker.xchan_name}}</a></li>{{/foreach}}</ul>
{{/if}}
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index b0211d697..05137479f 100755
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -1,53 +1,34 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <div class="dropdown pull-right" id="profile-edit-links">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <div class="dropdown float-right" id="profile-edit-links">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu">
- <li class="nav-item">
- <a class="nav-link" href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-user"></i>&nbsp;{{$profpic}}</a>
- </li>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}"><i class="fa fa-fw fa-user"></i>&nbsp;{{$profpic}}</a>
{{if $is_default}}
- <li class="nav-item">
- <a href="cover_photo" id="cover-photo_upload-link" title="{{$coverpic}}"><i class="fa fa-picture-o"></i>&nbsp;{{$coverpic}}</a>
- </li>
+ <a class="dropdown-item" href="cover_photo" id="cover-photo_upload-link" title="{{$coverpic}}"><i class="fa fa-fw fa-picture-o"></i>&nbsp;{{$coverpic}}</a>
{{/if}}
{{if ! $is_default}}
- <li class="nav-item">
- <a href="profperm/{{$profile_id}}" id="profile-edit-visibility-link" title="{{$editvis}}"><i class="fa fa-pencil"></i>&nbsp;{{$editvis}}</a>
- </li>
+ <a class="dropdown-item" href="profperm/{{$profile_id}}" id="profile-edit-visibility-link" title="{{$editvis}}"><i class="fa fa-fw fa-pencil"></i>&nbsp;{{$editvis}}</a>
{{/if}}
- <li class="nav-item">
- <a href="thing" id="profile-edit-thing-link" title="{{$addthing}}"><i class="fa fa-plus-circle"></i>&nbsp;{{$addthing}}</a>
- </li>
- <li class="divider"></li>
- <li class="nav-item">
- <a href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a>
- </li>
-
+ <a class="dropdown-item" href="thing" id="profile-edit-thing-link" title="{{$addthing}}"><i class="fa fa-fw fa-plus-circle"></i>&nbsp;{{$addthing}}</a>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a>
{{if $profile_clone_link}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a>
{{/if}}
{{if $exportable}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="profiles/export/{{$profile_id}}">{{$lbl_export}}</a>
- </li>
- <li class="nav-item">
- <a href="#" onClick="openClose('profile-upload-form'); return false;">{{$lbl_import}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="profiles/export/{{$profile_id}}">{{$lbl_export}}</a>
+ <a class="dropdown-item" href="#" onClick="openClose('profile-upload-form'); return false;">{{$lbl_import}}</a>
{{/if}}
{{if ! $is_default}}
- <li class="divider"></li>
- <li class="nav-item">
- <a href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$del_prof}}</a>
- </li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" onclick="return confirmDelete();"><i class="fa fa-trash-o"></i>&nbsp;{{$del_prof}}</a>
{{/if}}
- <ul>
+ </div>
</div>
<h2>{{$banner}}</h2>
<div class="clear"></div>
@@ -108,6 +89,128 @@
</div>
</div>
</div>
+
+ {{if $fields.comms }}
+
+ <div id="template-form-vcard-tel" class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value="CELL">{{$mobile}}</option>
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div id="template-form-vcard-email" class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div id="template-form-vcard-impp" class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+
+ <div class="section-content-wrapper-np">
+ <div id="vcard-cancel-{{$vcard.id}}" class="vcard-cancel vcard-cancel-btn" data-id="{{$vcard.id}}" data-action="cancel"><i class="fa fa-close"></i></div>
+ <div id="vcard-add-field-{{$vcard.id}}" class="dropdown pull-right vcard-add-field">
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <ul class="dropdown-menu">
+ <li class="add-vcard-tel"><a href="#" data-add="vcard-tel" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$tel_label}}</a></li>
+ <li class="add-vcard-email"><a href="#" data-add="vcard-email" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$email_label}}</a></li>
+ <li class="add-vcard-impp"><a href="#" data-add="vcard-impp" data-id="{{$vcard.id}}" class="add-field" onclick="return false;">{{$impp_label}}</a></li>
+ </ul>
+ </div>
+ <div id="vcard-header-{{$vcard.id}}" class="vcard-header" data-id="{{$vcard.id}}" data-action="open">
+ <i class="vcard-fn-preview fa fa-address-card-o"></i>
+ <span id="vcard-preview-{{$vcard.id}}" class="vcard-preview">
+ {{if $vcard.fn}}<span class="vcard-fn-preview">{{$vcard.fn}}</span>{{/if}}
+ {{if $vcard.emails.0.address}}<span class="vcard-email-preview hidden-xs"><a href="mailto:{{$vcard.emails.0.address}}">{{$vcard.emails.0.address}}</a></span>{{/if}}
+ {{if $vcard.tels.0}}<span class="vcard-tel-preview hidden-xs">{{$vcard.tels.0.nr}}{{if $is_mobile}} <a class="btn btn-outline-secondary btn-sm" href="tel:{{$vcard.tels.0.nr}}"><i class="fa fa-phone connphone"></i></a>{{/if}}</span>{{/if}}
+ </span>
+ <input id="vcard-fn-{{$vcard.id}}" class="vcard-fn" type="text" name="fn" value="{{$vcard.fn}}" size="{{$vcard.fn|count_characters:true}}" placeholder="{{$name_label}}">
+ </div>
+ </div>
+ <div id="vcard-info-{{$vcard.id}}" class="vcard-info section-content-wrapper">
+
+ <div class="vcard-tel form-group">
+ <div class="form-vcard-tel-wrapper">
+ {{if $vcard.tels}}
+ {{foreach $vcard.tels as $tel}}
+ <div class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value=""{{if $tel.type.0 != 'CELL' && $tel.type.0 != 'HOME' && $tel.type.0 != 'WORK' && $tel.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$tel.type.1}}</option>
+ <option value="CELL"{{if $tel.type.0 == 'CELL'}} selected="selected"{{/if}}>{{$mobile}}</option>
+ <option value="HOME"{{if $tel.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $tel.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $tel.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="{{$tel.nr}}" size="{{$tel.nr|count_characters:true}}" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+
+ <div class="vcard-email form-group">
+ <div class="form-vcard-email-wrapper">
+ {{if $vcard.emails}}
+ {{foreach $vcard.emails as $email}}
+ <div class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value=""{{if $email.type.0 != 'HOME' && $email.type.0 != 'WORK' && $email.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$email.type.1}}</option>
+ <option value="HOME"{{if $email.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $email.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $email.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="{{$email.address}}" size="{{$email.address|count_characters:true}}" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-impp form-group">
+ <div class="form-vcard-impp-wrapper">
+ {{if $vcard.impps}}
+ {{foreach $vcard.impps as $impp}}
+ <div class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value=""{{if $impp.type.0 != 'HOME' && $impp.type.0 != 'WORK' && $impp.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$impp.type.1}}</option>
+ <option value="HOME"{{if $impp.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $impp.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $impp.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="{{$impp.address}}" size="{{$impp.address|count_characters:true}}" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="{{$vcard.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="settings-submit-wrapper" >
+ <button type="submit" name="done" value="{{$submit}}" class="btn btn-primary">{{$submit}}</button>
+ </div>
+ </div>
+ {{/if}}
+
+
{{if $fields.address || $fields.locality || $fields.postal_code || $fields.region || $fields.country_name || $fields.hometown}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="location">
@@ -150,7 +253,9 @@
</div>
</div>
</div>
+
{{/if}}
+
{{if $fields.marital || $fields.sexual}}
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="relation">
@@ -270,7 +375,7 @@
{{/if}}
{{if $fields.employment}}
- {{include file="field_textarea.tpl" field=$work}}
+ {{include file="field_textarea.tpl" field=$employ}}
{{/if}}
{{if $fields.education}}
diff --git a/view/tpl/profile_listing_header.tpl b/view/tpl/profile_listing_header.tpl
index fade7be7c..42abf2735 100755
--- a/view/tpl/profile_listing_header.tpl
+++ b/view/tpl/profile_listing_header.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a class="btn btn-success btn-xs pull-right" href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" ><i class="fa fa-plus-circle"></i>&nbsp;{{$cr_new}}</a>
+ <a class="btn btn-success btn-sm pull-right" href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" ><i class="fa fa-plus-circle"></i>&nbsp;{{$cr_new}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper">
diff --git a/view/tpl/profile_tabs.tpl b/view/tpl/profile_tabs.tpl
new file mode 100644
index 000000000..49b74bb8f
--- /dev/null
+++ b/view/tpl/profile_tabs.tpl
@@ -0,0 +1,5 @@
+<div class="dropdown-header"><img src="{{$thumb}}" class="menu-img-1">{{$name}}:</div>
+{{foreach $tabs as $tab}}
+<a class="dropdown-item{{if $tab.sel}} {{$tab.sel}}{{/if}}" href="{{$tab.url}}"{{if $tab.title}} title="{{$tab.title}}"{{/if}}><i class="fa fa-fw fa-{{$tab.icon}} generic-icons-nav"></i>{{$tab.label}}</a>
+{{/foreach}}
+<div class="dropdown-divider"></div>
diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl
index e4e923ddb..925447ff2 100755
--- a/view/tpl/prv_message.tpl
+++ b/view/tpl/prv_message.tpl
@@ -28,69 +28,69 @@
{{/if}}
<div class="form-group">
<label for="prvmail-text">{{$yourmessage}}</label>
- <textarea class="form-control" id="prvmail-text" name="body">{{$text}}</textarea>
+ <textarea class="form-control" id="prvmail-text" name="body"{{if $new}} style="height: 10em;"{{/if}}>{{$text}}</textarea>
</div>
<div id="prvmail-submit-wrapper" class="form-group">
- <div id="prvmail-submit" class="pull-right btn-group">
- <button class="btn btn-default btn-sm" id="prvmail-preview" title="{{$preview}}" onclick="preview_mail(); return false;"><i class="fa fa-eye"></i></button>
+ <div id="prvmail-submit" class="float-right btn-group">
+ <button class="btn btn-outline-secondary btn-sm" id="prvmail-preview" title="{{$preview}}" onclick="preview_mail(); return false;"><i class="fa fa-eye"></i></button>
<button class="btn btn-primary btn-sm" type="submit" id="prvmail-submit" name="submit" value="{{$submit}}">{{$submit}}</button>
</div>
- <div id="prvmail-tools" class="btn-toolbar pull-left">
- <div class="btn-group">
- <button id="main-editor-bold" class="btn btn-default btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'prvmail-text'); return false;">
+ <div id="prvmail-tools" class="btn-toolbar float-left">
+ <div class="btn-group mr-2">
+ <button id="main-editor-bold" class="btn btn-outline-secondary btn-sm" title="{{$bold}}" onclick="inserteditortag('b', 'prvmail-text'); return false;">
<i class="fa fa-bold jot-icons"></i>
</button>
- <button id="main-editor-italic" class="btn btn-default btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'prvmail-text'); return false;">
+ <button id="main-editor-italic" class="btn btn-outline-secondary btn-sm" title="{{$italic}}" onclick="inserteditortag('i', 'prvmail-text'); return false;">
<i class="fa fa-italic jot-icons"></i>
</button>
- <button id="main-editor-underline" class="btn btn-default btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'prvmail-text'); return false;">
+ <button id="main-editor-underline" class="btn btn-outline-secondary btn-sm" title="{{$underline}}" onclick="inserteditortag('u', 'prvmail-text'); return false;">
<i class="fa fa-underline jot-icons"></i>
</button>
- <button id="main-editor-quote" class="btn btn-default btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'prvmail-text'); return false;">
+ <button id="main-editor-quote" class="btn btn-outline-secondary btn-sm" title="{{$quote}}" onclick="inserteditortag('quote', 'prvmail-text'); return false;">
<i class="fa fa-quote-left jot-icons"></i>
</button>
- <button id="main-editor-code" class="btn btn-default btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'prvmail-text'); return false;">
+ <button id="main-editor-code" class="btn btn-outline-secondary btn-sm" title="{{$code}}" onclick="inserteditortag('code', 'prvmail-text'); return false;">
<i class="fa fa-terminal jot-icons"></i>
</button>
</div>
- <div class="btn-group hidden-xs">
- <button id="prvmail-attach-wrapper" class="btn btn-default btn-sm" >
+ <div class="btn-group d-none d-lg-flex mr-2">
+ <button id="prvmail-attach-wrapper" class="btn btn-outline-secondary btn-sm" >
<i id="prvmail-attach" class="fa fa-paperclip jot-icons" title="{{$attach}}"></i>
</button>
- <button id="prvmail-link-wrapper" class="btn btn-default btn-sm" onclick="prvmailJotGetLink(); return false;" >
+ <button id="prvmail-link-wrapper" class="btn btn-outline-secondary btn-sm" onclick="prvmailJotGetLink(); return false;" >
<i id="prvmail-link" class="fa fa-link jot-icons" title="{{$insert}}" ></i>
</button>
</div>
{{if $feature_expire || $feature_encrypt}}
- <div class="btn-group hidden-sm hidden-xs">
+ <div class="btn-group d-none d-lg-flex mr-2">
{{if $feature_expire}}
- <button id="prvmail-expire-wrapper" class="btn btn-default btn-sm" onclick="prvmailGetExpiry();return false;" >
+ <button id="prvmail-expire-wrapper" class="btn btn-outline-secondary btn-sm" onclick="prvmailGetExpiry();return false;" >
<i id="prvmail-expires" class="fa fa-eraser jot-icons" title="{{$expires}}" ></i>
</button>
{{/if}}
{{if $feature_encrypt}}
- <button id="prvmail-encrypt-wrapper" class="btn btn-default btn-sm" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;">
+ <button id="prvmail-encrypt-wrapper" class="btn btn-outline-secondary btn-sm" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;">
<i id="prvmail-encrypt" class="fa fa-key jot-icons" title="{{$encrypt}}" ></i>
</button>
{{/if}}
</div>
{{/if}}
- <div class="btn-group visible-xs visible-sm">
- <button type="button" id="more-tools" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
- <i id="more-tools-icon" class="fa fa-caret-down jot-icons"></i>
+ <div class="btn-group d-lg-none">
+ <button type="button" id="more-tools" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+ <i id="more-tools-icon" class="fa fa-cog jot-icons"></i>
</button>
- <ul class="dropdown-menu dropdown-menu-right" role="menu">
- <li class="visible-xs"><a href="#" id="prvmail-attach-sub"><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a></li>
- <li class="visible-xs"><a href="#" onclick="prvmailJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a></li>
+ <div class="dropdown-menu dropdown-menu-right" role="menu">
+ <a class="dropdown-item" href="#" id="prvmail-attach-sub"><i class="fa fa-paperclip"></i>&nbsp;{{$attach}}</a>
+ <a class="dropdown-item" href="#" onclick="prvmailJotGetLink(); return false;" ><i class="fa fa-link"></i>&nbsp;{{$insert}}</a>
{{if $feature_expire || $feature_encrypt}}
- <li class="divider visible-xs"></li>
- <li class="visible-sm visible-xs"><a href="#" onclick="prvmailGetExpiry(); return false;"><i id="prvmail-expires" class="fa fa-eraser"></i>&nbsp;{{$expires}}</a></li>
- <li class="visible-sm visible-xs"><a href="#" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" onclick="prvmailGetExpiry(); return false;"><i id="prvmail-expires" class="fa fa-eraser"></i>&nbsp;{{$expires}}</a>
+ <a class="dropdown-item" href="#" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val()); return false;"><i class="fa fa-key"></i>&nbsp;{{$encrypt}}</a>
{{/if}}
- </ul>
+ </div>
</div>
</div>
- <div id="prvmail-rotator-wrapper" class="pull-left">
+ <div id="prvmail-rotator-wrapper" class="float-left">
<div id="prvmail-rotator"></div>
</div>
<div class="clear"></div>
diff --git a/view/tpl/saved_searches.tpl b/view/tpl/saved_searches.tpl
index 2065cd714..ff2d044ef 100644
--- a/view/tpl/saved_searches.tpl
+++ b/view/tpl/saved_searches.tpl
@@ -1,14 +1,12 @@
-<div class="widget saved-search-widget">
+<div class="widget saved-search-widget clearfix">
<h3 id="search">{{$title}}</h3>
{{$searchbox}}
-
- <ul id="saved-search-list" class="nav nav-pills nav-stacked">
+ <ul id="saved-search-list" class="nav nav-pills flex-column">
{{foreach $saved as $search}}
- <li id="search-term-{{$search.id}}">
- <a class="pull-right group-edit-tool" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropfa-floppy-od-search-term-{{$search.id}}" class="group-edit-icon fa fa-trash-o" ></i></a>
- <a id="saved-search-term-{{$search.id}}"{{if $search.selected}} class="search-selected"{{/if}} href="{{$search.srchlink}}">{{$search.displayterm}}</a>
+ <li class="nav-item nav-item-hack" id="search-term-{{$search.id}}">
+ <a class="nav-link widget-nav-pills-icons" title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropfa-floppy-od-search-term-{{$search.id}}" class="fa fa-trash-o drop-icons" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="nav-link{{if $search.selected}} active{{/if}}" href="{{$search.srchlink}}">{{$search.displayterm}}</a>
</li>
{{/foreach}}
</ul>
- <div class="clear"></div>
</div>
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index a490cb473..89ac927aa 100755
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -1,7 +1,7 @@
-<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} generic-content-wrapper{{/if}}">
+<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper{{if $item.toplevel}} {{$item.toplevel}} mb-4 clearfix generic-content-wrapper{{/if}}">
<a name="{{$item.id}}" ></a>
- <div class="wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
- <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}" style="clear:both;">
+ <div class="clearfix wall-item-outside-wrapper {{$item.indent}}{{$item.previewing}}{{if $item.owner_url}} wallwall{{/if}}" id="wall-item-outside-wrapper-{{$item.id}}" >
+ <div class="wall-item-content-wrapper {{$item.indent}}" id="wall-item-content-wrapper-{{$item.id}}">
{{if $item.photo}}
<div class="wall-photo-item" id="wall-photo-item-{{$item.id}}">
{{$item.photo}}
@@ -12,18 +12,20 @@
{{$item.event}}
</div>
{{/if}}
- <div class="wall-item-head">
+ {{if $item.title && !$item.event}}
+ <div class="p-2{{if $item.is_new}} bg-primary text-white{{/if}} wall-item-title h3{{if !$item.photo}} rounded-top{{/if}}" id="wall-item-title-{{$item.id}}">
+ {{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}
+ </div>
+ {{if ! $item.is_new}}
+ <hr class="m-0">
+ {{/if}}
+ {{/if}}
+ <div class="p-2 clearfix wall-item-head{{if $item.is_new && !$item.title && !$item.event && !$item.is_comment}} wall-item-head-new rounded-top{{/if}}">
<div class="wall-item-info" id="wall-item-info-{{$item.id}}" >
<div class="wall-item-photo-wrapper{{if $item.owner_url}} wwfrom{{/if}}" id="wall-item-photo-wrapper-{{$item.id}}">
<a href="{{$item.profile_url}}" title="{{$item.linktitle}}" class="wall-item-photo-link" id="wall-item-photo-link-{{$item.id}}"><img src="{{$item.thumb}}" class="wall-item-photo{{$item.sparkle}}" id="wall-item-photo-{{$item.id}}" alt="{{$item.name}}" /></a>
</div>
- <div class="wall-item-photo-end" style="clear:both"></div>
- </div>
- {{if $item.title}}
- <div class="wall-item-title" id="wall-item-title-{{$item.id}}" title="{{$item.title}}">
- <h3>{{if $item.title_tosource}}{{if $item.plink}}<a href="{{$item.plink.href}}" title="{{$item.title}} ({{$item.plink.title}})">{{/if}}{{/if}}{{$item.title}}{{if $item.title_tosource}}{{if $item.plink}}</a>{{/if}}{{/if}}</h3>
</div>
- {{/if}}
{{if $item.lock}}
<div class="wall-item-lock dropdown">
<i class="fa fa-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview('item',{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
@@ -35,16 +37,20 @@
<div class="wall-item-ago" id="wall-item-ago-{{$item.id}}">
{{if $item.verified}}<i class="fa fa-check item-verified" title="{{$item.verified}}"></i>&nbsp;{{elseif $item.forged}}<i class="fa fa-exclamation item-forged" title="{{$item.forged}}"></i>&nbsp;{{/if}}{{if $item.location}}<span class="wall-item-location" id="wall-item-location-{{$item.id}}">{{$item.location}},&nbsp;</span>{{/if}}<span class="autotime" title="{{$item.isotime}}">{{$item.localtime}}{{if $item.editedtime}}&nbsp;{{$item.editedtime}}{{/if}}{{if $item.expiretime}}&nbsp;{{$item.expiretime}}{{/if}}</span>{{if $item.editedtime}}&nbsp;<i class="fa fa-pencil"></i>{{/if}}&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
</div>
- <div class="clear"></div>
</div>
- <div class="{{if $item.is_photo}}wall-photo-item{{else}}wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
+ {{if $item.body}}
+ <div class="p-2 clrearfix {{if $item.is_photo}} wall-photo-item{{else}} wall-item-content{{/if}}" id="wall-item-content-{{$item.id}}">
<div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
{{$item.body}}
</div>
- <div class="clear"></div>
</div>
+ {{/if}}
{{if $item.has_tags}}
- <div class="wall-item-tools">
+ <div class="p-2 wall-item-tools clearfix">
+ <div class="body-tags">
+ <span class="tag">{{$item.mentions}} {{$item.tags}} {{$item.categories}} {{$item.folders}}</span>
+ </div>
+ {{**
{{if $item.mentions}}
<div class="body-tags" id="item-mentions">
<span class="tag">{{$item.mentions}}</span>
@@ -65,48 +71,44 @@
<span class="tag">{{$item.folders}}</span>
</div>
{{/if}}
- <div class="clear"></div>
+ **}}
</div>
{{/if}}
- <div class="wall-item-tools">
+ <div class="p-2 clearfix wall-item-tools">
<div class="wall-item-tools-right btn-group pull-right">
- <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>
</button>
- <ul class="dropdown-menu">
+ <div class="dropdown-menu dropdown-menu-right">
{{if $item.thread_action_menu}}
{{foreach $item.thread_action_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="fa fa-{{$mitem.icon}}"></i> {{$mitem.title}}</a></li>
{{/foreach}}
{{/if}}
{{if $item.drop.dropping}}
- <li><a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
+ <a class="dropdown-item" href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="fa fa-trash-o"></i> {{$item.drop.delete}}</a></li>
{{/if}}
{{if $item.thread_author_menu}}
- <li role="presentation" class="divider"></li>
+ <div class="dropdown-divider"></div>
{{foreach $item.thread_author_menu as $mitem}}
- <li role="presentation"><a role="menuitem" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a></li>
{{/foreach}}
{{/if}}
- </ul>
+ </div>
</div>
{{if $item.attachments}}
<div class="wall-item-tools-left btn-group">
- <button type="button" class="btn btn-default btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
- <ul class="dropdown-menu" role="menu" aria-labelledby="attachment-menu-{{$item.id}}">{{$item.attachments}}</ul>
+ <button type="button" class="btn btn-outline-secondary btn-sm wall-item-like dropdown-toggle" data-toggle="dropdown" id="attachment-menu-{{$item.id}}"><i class="fa fa-paperclip"></i></button>
+ <div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
- <div class="clear"></div>
</div>
- <div class="clear"></div>
</div>
- <div class="wall-item-wrapper-end"></div>
{{if $item.conv}}
- <div class="wall-item-conv" id="wall-item-conv-{{$item.id}}" >
+ <div class="p-2 wall-item-conv" id="wall-item-conv-{{$item.id}}" >
<a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a>
</div>
{{/if}}
- <div class="clear{{if $indent}} {{$indent}}{{/if}}"></div>
</div>
</div>
diff --git a/view/tpl/searchbox.tpl b/view/tpl/searchbox.tpl
index 8eb169b4a..8f7ac5162 100644
--- a/view/tpl/searchbox.tpl
+++ b/view/tpl/searchbox.tpl
@@ -1,11 +1,11 @@
<form action="{{$action_url}}" method="get" >
<input type="hidden" name="f" value="" />
<div id="{{$id}}" class="input-group">
- <input class="widget-input" type="text" name="search" id="search-text" value="{{$s}}" onclick="this.submit();" />
+ <input class="form-control form-control-sm" type="text" name="search" id="search-text" value="{{$s}}" onclick="this.submit();" />
<div class="input-group-btn">
- <button type="submit" name="submit" class="btn btn-default btn-sm" id="search-submit" value="{{$search_label}}"><i class="fa fa-search"></i></button>
+ <button type="submit" name="submit" class="btn btn-outline-secondary" id="search-submit" value="{{$search_label}}"><i class="fa fa-search"></i></button>
{{if $savedsearch}}
- <button type="submit" name="searchsave" class="btn btn-default btn-sm" id="search-save" value="{{$save_label}}"><i class="fa fa-floppy-o"></i></button>
+ <button type="submit" name="searchsave" class="btn btn-outline-secondary" id="search-save" value="{{$save_label}}"><i class="fa fa-floppy-o"></i></button>
{{/if}}
</div>
</div>
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index 19c2b42d5..dd5fecb43 100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- {{if $server_role != 'basic'}}<a title="{{$removechannel}}" class="btn btn-danger btn-xs pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>{{/if}}
+ {{if $server_role != 'basic'}}<a title="{{$removechannel}}" class="btn btn-danger btn-sm pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>{{/if}}
<h2>{{$ptitle}}</h2>
<div class="clear"></div>
</div>
@@ -11,12 +11,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="basic-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#basic-settings-collapse" aria-expanded="true" aria-controls="basic-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#basic-settings-collapse">
{{$h_basic}}
</a>
</h3>
</div>
- <div id="basic-settings-collapse" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="basic-settings">
+ <div id="basic-settings-collapse" class="collapse show" role="tabpanel" aria-labelledby="basic-settings">
<div class="section-content-tools-wrapper">
{{include file="field_input.tpl" field=$username}}
{{include file="field_select_grouped.tpl" field=$timezone}}
@@ -37,12 +37,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="privacy-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#privacy-settings-collapse" aria-expanded="true" aria-controls="privacy-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#privacy-settings-collapse">
{{$h_prv}}
</a>
</h3>
</div>
- <div id="privacy-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="privacy-settings">
+ <div id="privacy-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="privacy-settings">
<div class="section-content-tools-wrapper">
{{if $server_role != 'basic'}}
{{include file="field_select_grouped.tpl" field=$role}}
@@ -51,7 +51,7 @@
{{if $server_role != 'basic'}}
<div class="form-group">
- <button type="button" class="btn btn-default" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button>
</div>
<div class="modal" id="apsModal">
<div class="modal-dialog">
@@ -66,14 +66,14 @@
{{/foreach}}
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">Close</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{{/if}}
<div id="settings-default-perms" class="form-group" >
- <button type="button" class="btn btn-default" data-toggle="modal" data-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
</div>
{{$group_select}}
{{include file="field_checkbox.tpl" field=$hide_presence}}
@@ -100,12 +100,12 @@
<div class="panel">
<div class="section-subtitle-wrapper" role="tab" id="notification-settings">
<h3>
- <a data-toggle="collapse" data-parent="#settings" href="#notification-settings-collapse" aria-expanded="true" aria-controls="notification-settings-collapse">
+ <a data-toggle="collapse" data-parent="#settings" href="#notification-settings-collapse">
{{$h_not}}
</a>
</h3>
</div>
- <div id="notification-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="notification-settings">
+ <div id="notification-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="notification-settings">
<div class="section-content-tools-wrapper">
<div id="settings-notifications">
<h3>{{$activity_options}}</h3>
@@ -162,7 +162,7 @@
</a>
</h3>
</div>
- <div id="miscellaneous-settings-collapse" class="panel-collapse collapse" role="tabpanel" aria-labelledby="miscellaneous-settings">
+ <div id="miscellaneous-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="miscellaneous-settings">
<div class="section-content-tools-wrapper">
{{if $menus}}
<div class="form-group channel-menu">
diff --git a/view/tpl/settings_account.tpl b/view/tpl/settings_account.tpl
index 8ff846518..b7fdfb9a9 100755
--- a/view/tpl/settings_account.tpl
+++ b/view/tpl/settings_account.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a title="{{$removeaccount}}" class="btn btn-danger btn-xs pull-right" href="removeaccount"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>
+ <a title="{{$removeaccount}}" class="btn btn-danger btn-sm pull-right" href="removeaccount"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>
<h2>{{$title}}</h2>
<div class="clear"></div>
</div>
diff --git a/view/tpl/settings_display.tpl b/view/tpl/settings_display.tpl
index a85a067be..d8c1ac7aa 100755
--- a/view/tpl/settings_display.tpl
+++ b/view/tpl/settings_display.tpl
@@ -15,7 +15,7 @@
</a>
</h3>
</div>
- <div id="theme-settings-content" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="theme-settings">
+ <div id="theme-settings-content" class="collapse show" role="tabpanel" aria-labelledby="theme-settings">
<div class="section-content-tools-wrapper">
{{if $theme}}
{{include file="field_themeselect.tpl" field=$theme}}
@@ -41,7 +41,7 @@
</a>
</h3>
</div>
- <div id="custom-settings-content" class="panel-collapse collapse{{if !$theme && !$mobile_theme}} in{{/if}}" role="tabpanel" aria-labelledby="custom-settings">
+ <div id="custom-settings-content" class="collapse{{if !$theme && !$mobile_theme}} in{{/if}}" role="tabpanel" aria-labelledby="custom-settings">
<div class="section-content-tools-wrapper">
{{if $theme_config}}
{{$theme_config}}
@@ -57,7 +57,7 @@
</a>
</h3>
</div>
- <div id="content-settings-content" class="panel-collapse collapse{{if !$theme && !$mobile_theme && !$theme_config}} in{{/if}}" role="tabpanel" aria-labelledby="content-settings">
+ <div id="content-settings-content" class="collapse{{if !$theme && !$mobile_theme && !$theme_config}} in{{/if}}" role="tabpanel" aria-labelledby="content-settings">
<div class="section-content-wrapper">
{{include file="field_input.tpl" field=$ajaxint}}
{{include file="field_input.tpl" field=$itemspage}}
@@ -72,7 +72,7 @@
{{include file="field_checkbox.tpl" field=$manual_update}}
{{if $expert}}
<div class="form-group">
- <a class="btn btn-default "href="pdledit">{{$layout_editor}}</a>
+ <a class="btn btn-outline-secondary "href="pdledit">{{$layout_editor}}</a>
</div>
{{/if}}
<div class="settings-submit-wrapper" >
diff --git a/view/tpl/settings_features.tpl b/view/tpl/settings_features.tpl
index 75eb34fb9..dfe049a7a 100755
--- a/view/tpl/settings_features.tpl
+++ b/view/tpl/settings_features.tpl
@@ -14,7 +14,7 @@
</a>
</h3>
</div>
- <div id="{{$g}}-settings-content" class="panel-collapse collapse{{if $g == 'general'}} in{{/if}}" role="tabpanel" aria-labelledby="{{$g}}-settings-title">
+ <div id="{{$g}}-settings-content" class="collapse{{if $g == 'general'}} show{{/if}}" role="tabpanel" aria-labelledby="{{$g}}-settings-title">
<div class="section-content-tools-wrapper">
{{foreach $f.1 as $fcat}}
{{include file="field_checkbox.tpl" field=$fcat}}
diff --git a/view/tpl/settings_oauth.tpl b/view/tpl/settings_oauth.tpl
index 9582ef52d..811cfcec5 100755
--- a/view/tpl/settings_oauth.tpl
+++ b/view/tpl/settings_oauth.tpl
@@ -25,8 +25,8 @@
{{/if}}
{{/if}}
{{if $app.my}}
- <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="fa fa-pencil btn btn-default"></i></a>
- <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="fa fa-trash-o btn btn-default"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="fa fa-pencil btn btn-outline-secondary"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="fa fa-trash-o btn btn-outline-secondary"></i></a>
{{/if}}
</div>
{{/foreach}}
diff --git a/view/tpl/sharedwithme.tpl b/view/tpl/sharedwithme.tpl
index c764dc4f0..68bdd6faa 100644
--- a/view/tpl/sharedwithme.tpl
+++ b/view/tpl/sharedwithme.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- <a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-xs btn-default pull-right"><i class="fa fa-trash-o"></i>&nbsp;{{$dropall}}</a>
+ <a href="/sharedwithme/dropall" onclick="return confirmDelete();" class="btn btn-sm btn-outline-secondary pull-right"><i class="fa fa-trash-o"></i>&nbsp;{{$dropall}}</a>
<h2>{{$header}}</h2>
</div>
<div class="section-content-wrapper-np">
@@ -9,16 +9,16 @@
<th width="1%"></th>
<th width="92%">{{$name}}</th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$size}}</th>
- <th width="1%" class="hidden-xs">{{$lastmod}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$size}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$lastmod}}</th>
</tr>
{{foreach $items as $item}}
<tr id="cloud-index-{{$item.id}}">
<td><i class="fa {{$item.objfiletypeclass}}" title="{{$item.objfiletype}}"></i></td>
<td><a href="{{$item.objurl}}">{{$item.objfilename}}</a>{{if $item.unseen}}&nbsp;<span class="label label-success">{{$label_new}}</span>{{/if}}</td>
<td class="cloud-index-tool"><a href="#" title="{{$drop}}" onclick="dropItem('/sharedwithme/{{$item.id}}/drop', '#cloud-index-{{$item.id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a></td>
- <td class="hidden-xs">{{$item.objfilesize}}</td>
- <td class="hidden-xs">{{$item.objedited}}</td>
+ <td class="d-none d-md-table-cell">{{$item.objfilesize}}</td>
+ <td class="d-none d-md-table-cell">{{$item.objedited}}</td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/show_thing.tpl b/view/tpl/show_thing.tpl
index 85d7934b5..d738c9fc9 100644
--- a/view/tpl/show_thing.tpl
+++ b/view/tpl/show_thing.tpl
@@ -6,8 +6,8 @@
</div>
{{if $canedit}}
<div class="thing-edit-links">
-<a href="thing/edit/{{$thing.obj_obj}}" title="{{$edit}}" class="btn btn-default" ><i class="fa fa-pencil thing-edit-icon"></i></a>
-<a href="thing/drop/{{$thing.obj_obj}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-default" ><i class="fa fa-trash-o drop-icons"></i></a>
+<a href="thing/edit/{{$thing.obj_obj}}" title="{{$edit}}" class="btn btn-outline-secondary" ><i class="fa fa-pencil thing-edit-icon"></i></a>
+<a href="thing/drop/{{$thing.obj_obj}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-outline-secondary" ><i class="fa fa-trash-o drop-icons"></i></a>
</div>
<div class="thing-edit-links-end"></div>
{{/if}}
diff --git a/view/tpl/suggest_friends.tpl b/view/tpl/suggest_friends.tpl
index 26d9da7ce..95f24cd63 100755
--- a/view/tpl/suggest_friends.tpl
+++ b/view/tpl/suggest_friends.tpl
@@ -4,13 +4,13 @@
<img src="{{$entry.photo}}" alt="{{$entry.name}}" width="80" height="80" title="{{$entry.name}} [{{$entry.profile}}]" />
</a>
</div>
- <a href="{{$entry.ignlnk}}" title="{{$entry.ignore}}" class="profile-match-ignore" onclick="return confirmDelete();" ><i class="fa fa-times drop-icons btn btn-default"></i></a>
+ <a href="{{$entry.ignlnk}}" title="{{$entry.ignore}}" class="profile-match-ignore" onclick="return confirmDelete();" ><i class="fa fa-times drop-icons btn btn-outline-secondary"></i></a>
<div class="profile-match-break"></div>
<div class="profile-match-name">
<a href="{{$entry.url}}" title="{{$entry.name}}">{{$entry.name}}</a>
</div>
<div class="profile-match-end"></div>
{{if $entry.connlnk}}
- <div class="profile-match-connect btn btn-default"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conntxt}}</a></div>
+ <div class="profile-match-connect btn btn-outline-secondary"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}"><i class="fa fa-plus connect-icon"></i> {{$entry.conntxt}}</a></div>
{{/if}}
</div>
diff --git a/view/tpl/thing_edit.tpl b/view/tpl/thing_edit.tpl
index b23584fe1..62a7c02c8 100644
--- a/view/tpl/thing_edit.tpl
+++ b/view/tpl/thing_edit.tpl
@@ -30,7 +30,7 @@
<div class="thing-end"></div>
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/thing_input.tpl b/view/tpl/thing_input.tpl
index 3e178925c..90fb093e4 100644
--- a/view/tpl/thing_input.tpl
+++ b/view/tpl/thing_input.tpl
@@ -30,7 +30,7 @@
<div class="thing-end"></div>
{{if $lockstate}}
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}}"></i>
</button>
{{/if}}
diff --git a/view/tpl/usermenu.tpl b/view/tpl/usermenu.tpl
index 547c5f308..c51728c34 100644
--- a/view/tpl/usermenu.tpl
+++ b/view/tpl/usermenu.tpl
@@ -5,10 +5,10 @@
<h3 class="pmenu-title">{{$menu.menu_desc}}{{if $edit}} <a href="mitem/{{$menu.menu_id}}" title="{{$edit}}"><i class="fa fa-pencil fakelink" title="{{$edit}}"></i></a>{{/if}}</h3>
{{/if}}
{{if $items}}
- <ul class="pmenu-body{{if $wrap || !$class}} nav nav-pills nav-stacked{{elseif !$wrap || $class}} {{$class}}{{/if}}">
+ <ul class="pmenu-body{{if $wrap || !$class}} nav nav-pills flex-column{{elseif !$wrap || $class}} {{$class}}{{/if}}">
{{foreach $items as $mitem }}
- <li id="pmenu-item-{{$mitem.mitem_id}}" class="pmenu-item{{if $mitem.submenu}} dropdown{{/if}}">
- <a href="{{if $mitem.submenu}}#{{else}}{{$mitem.mitem_link}}{{/if}}"{{if $mitem.submenu}} class="dropdown-toggle" data-toggle="dropdown"{{/if}}{{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}{{if $mitem.submenu}}<span class="caret"></span>{{/if}}</a>
+ <li id="pmenu-item-{{$mitem.mitem_id}}" class="nav-item pmenu-item{{if $mitem.submenu}} dropdown{{/if}}">
+ <a href="{{if $mitem.submenu}}#{{else}}{{$mitem.mitem_link}}{{/if}}" class="nav-link {{if $mitem.submenu}} dropdown-toggle{{/if}}"{{if $mitem.submenu}} data-toggle="dropdown"{{/if}}{{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}{{if $mitem.submenu}}<span class="caret"></span>{{/if}}</a>
{{if $mitem.submenu}}{{$mitem.submenu}}{{/if}}
</li>
{{/foreach }}
diff --git a/view/tpl/viewcontact_template.tpl b/view/tpl/viewcontact_template.tpl
index 83cd80959..2b7144450 100755
--- a/view/tpl/viewcontact_template.tpl
+++ b/view/tpl/viewcontact_template.tpl
@@ -1,15 +1,13 @@
-<div class="generic-content-wrapper generic-content-wrapper-styled">
-<h3>{{$title}}</h3>
-
-
-<div id="connections-wrapper">
-{{foreach $contacts as $contact}}
- {{include file="contact_template.tpl"}}
-{{/foreach}}
-<div id="page-end"></div>
-</div>
-<div id="view-contact-end"></div>
-{{$paginate}}
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <h2>{{$title}}</h2>
+ </div>
+ <div class="section-content-wrapper clearfix">
+ {{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+ {{/foreach}}
+ <div id="page-end"></div>
+ </div>
</div>
<script>$(document).ready(function() { loadingPage = false;});</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/webpage_export_list.tpl b/view/tpl/webpage_export_list.tpl
index 1d28f62df..b22b3818a 100644
--- a/view/tpl/webpage_export_list.tpl
+++ b/view/tpl/webpage_export_list.tpl
@@ -10,7 +10,7 @@
</div>
<div id="import-website-content-wrapper" class="section-content-wrapper">
<div class="pull-left">
- <button id="toggle-select-all" class="btn btn-xs btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
+ <button id="toggle-select-all" class="btn btn-sm btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
</div>
<div class="clear"></div>
<hr>
diff --git a/view/tpl/webpage_import.tpl b/view/tpl/webpage_import.tpl
index fdc983932..955288c1e 100644
--- a/view/tpl/webpage_import.tpl
+++ b/view/tpl/webpage_import.tpl
@@ -10,7 +10,7 @@
</div>
<div id="import-website-content-wrapper" class="section-content-wrapper">
<div class="pull-left">
- <button id="toggle-select-all" class="btn btn-xs btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
+ <button id="toggle-select-all" class="btn btn-sm btn-primary" onclick="checkedAll(window.isChecked); return false;"><i class="fa fa-check"></i>&nbsp;Toggle Select All</button>
</div>
<div class="clear"></div>
<h4>Scanned Pages</h4>
diff --git a/view/tpl/webpagelist.tpl b/view/tpl/webpagelist.tpl
index 4dec7518f..52942ddf8 100644
--- a/view/tpl/webpagelist.tpl
+++ b/view/tpl/webpagelist.tpl
@@ -2,7 +2,7 @@
<div class="section-title-wrapper">
{{if $editor}}
<div class="pull-right">
- <button id="webpage-create-btn" class="btn btn-xs btn-success acl-form-trigger" onclick="openClose('webpage-editor');" data-form_id="profile-jot-form"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
+ <button id="webpage-create-btn" class="btn btn-sm btn-success acl-form-trigger" onclick="openClose('webpage-editor');" data-form_id="profile-jot-form"><i class="fa fa-pencil-square-o"></i>&nbsp;{{$create}}</button>
</div>
{{/if}}
<h2>{{$listtitle}}</h2>
@@ -23,8 +23,8 @@
<th width="1%"></th>
<th width="1%"></th>
<th width="1%"></th>
- <th width="1%" class="hidden-xs">{{$created_txt}}</th>
- <th width="1%" class="hidden-xs">{{$edited_txt}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$created_txt}}</th>
+ <th width="1%" class="d-none d-md-table-cell">{{$edited_txt}}</th>
</tr>
{{foreach $pages as $key => $items}}
{{foreach $items as $item}}
@@ -60,10 +60,10 @@
<a href="#" title="{{$delete}}" onclick="dropItem('item/drop/{{$item.url}}', '#webpage-list-item-{{$item.url}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
{{/if}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.created}}
</td>
- <td class="hidden-xs">
+ <td class="d-none d-md-table-cell">
{{$item.edited}}
</td>
</tr>
diff --git a/view/tpl/website_portation_tools.tpl b/view/tpl/website_portation_tools.tpl
index 10468b64e..0d131cb17 100644
--- a/view/tpl/website_portation_tools.tpl
+++ b/view/tpl/website_portation_tools.tpl
@@ -1,72 +1,60 @@
<div id="website-portation-tools" class="widget">
- <ul class="nav nav-pills nav-stacked">
- <li>
- <a href="#" onclick="openClose('import-form');
- return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
- </li>
- <li style="margin-left: 12px;" >
- <form id="import-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
-
- <input type="hidden" name="action" value="scan">
-
- <p style="margin-top: 10px;" class="descriptive-text">{{$file_import_text}}</p>
- <div class="form-group">
- <div class="input-group">
- <input class="widget-input" type="text" name="path" title="{{$hint}}" placeholder="{{$desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="cloudsubmit" value="{{$select}}"><i class="fa fa-folder-open generic-icons"></i></button>
- </div>
- </div>
- </div>
-
- <!-- Or upload a zipped file containing the website -->
- <p class="descriptive-text">{{$file_upload_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="file" name="zip_file" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="w_upload" value="w_upload"><i class="fa fa-file-archive-o generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- </li>
- </ul>
- <ul class="nav nav-pills nav-stacked">
- <li>
- <a href="#" onclick="openClose('export-form'); openClose('export-cloud-form');
- return false;"><i class="fa fa-share-square-o generic-icons"></i> {{$export_label}}</a>
- </li>
- <li style="margin-left: 12px;" >
- <form id="export-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
- <input type="hidden" name="action" value="exportzipfile">
- <!-- Or download a zipped file containing the website -->
- <p style="margin-top: 10px;" class="descriptive-text">{{$file_download_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="text" name="zipfilename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" value="" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="w_download" value="w_download"><i class="fa fa-download generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- <form id="export-cloud-form" enctype="multipart/form-data" method="post" action="" style="display: none;" class="sub-menu">
- <input type="hidden" name="action" value="exportcloud">
- <!-- Or export the website elements to a cloud files folder -->
- <p style="margin-top: 10px;" class="descriptive-text">{{$cloud_export_text}}</p>
- <div class="form-group">
-
- <div class="input-group">
- <input class="widget-input" type="text" name="exportcloudpath" title="{{$cloud_export_hint}}" placeholder="{{$cloud_export_desc}}" />
- <div class="input-group-btn">
- <button class="btn btn-default btn-sm" type="submit" name="exportcloudsubmit" value="{{$cloud_export_select}}"><i class="fa fa-folder-open generic-icons"></i></button>
- </div>
- </div>
- </div>
- </form>
- </li>
- </ul>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="#" onclick="openClose('import-form'); return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
+ <div id="import-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="scan">
+ <p class="descriptive-text">{{$file_import_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="path" title="{{$hint}}" placeholder="{{$desc}}" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="cloudsubmit" value="{{$select}}">Submit</button>
+ </div>
+ <!-- Or upload a zipped file containing the website -->
+ <p class="descriptive-text">{{$file_upload_text}}</p>
+ <div class="form-group">
+ <input class="form-control-file w-100" type="file" name="zip_file" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="w_upload" value="w_upload">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ <div class="nav nav-pills flex-column">
+ <a class="nav-link" href="#" onclick="openClose('export-form'); openClose('export-cloud-form'); return false;"><i class="fa fa-share-square-o generic-icons"></i> {{$export_label}}</a>
+ <div id="export-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="exportzipfile">
+ <!-- Or download a zipped file containing the website -->
+ <p class="descriptive-text">{{$file_download_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="zipfilename" title="{{$filename_hint}}" placeholder="{{$filename_desc}}" value="" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="w_download" value="w_download">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div id="export-cloud-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <input type="hidden" name="action" value="exportcloud">
+ <!-- Or export the website elements to a cloud files folder -->
+ <p style="margin-top: 10px;" class="descriptive-text">{{$cloud_export_text}}</p>
+ <div class="form-group">
+ <input class="form-control" type="text" name="exportcloudpath" title="{{$cloud_export_hint}}" placeholder="{{$cloud_export_desc}}" />
+ </div>
+ <div class="form-group">
+ <button class="btn btn-primary btn-sm" type="submit" name="exportcloudsubmit" value="{{$cloud_export_select}}">Submit</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
</div>
diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl
index af6b6800e..564db3324 100644
--- a/view/tpl/wiki.tpl
+++ b/view/tpl/wiki.tpl
@@ -3,23 +3,19 @@
<div class="pull-right">
{{if $showPageControls}}
<div id="page-tools" class="btn-group" style="display: none;">
- <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown">
- <i class="fa fa-caret-down"></i>&nbsp;{{$tools_label}}
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown">
+ <i class="fa fa-cog"></i>&nbsp;{{$tools_label}}
</button>
- <ul class="dropdown-menu dropdown-menu-right">
+ <div class="dropdown-menu dropdown-menu-right">
{{if $renamePage}}
- <li class="nav-item">
- <a class="nav-link rename-page" href="#"><i class="fa fa-edit"></i>&nbsp;{{$renamePage}}</a>
- </li>
+ <a class="dropdown-item rename-page" href="#"><i class="fa fa-fw fa-edit"></i>&nbsp;{{$renamePage}}</a>
{{/if}}
- <li class="nav-item">
- <a id="embed-image" class="nav-link" href="#"><i class="fa fa-picture-o"></i>&nbsp;Embed Image</a>
- </li>
- </ul>
+ <a id="embed-image" class="dropdown-item" href="#"><i class="fa fa-fw fa-picture-o"></i>&nbsp;Embed Image</a>
+ </div>
</div>
{{/if}}
- <button id="fullscreen-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(); adjustFullscreenEditorHeight();"><i class="fa fa-expand"></i></button>
- <button id="inline-btn" type="button" class="btn btn-default btn-xs" onclick="makeFullScreen(false); adjustInlineEditorHeight()"><i class="fa fa-compress"></i></button>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(); adjustFullscreenEditorHeight();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false); adjustInlineEditorHeight()"><i class="fa fa-compress"></i></button>
</div>
<h2>
<span id="wiki-header-name">{{$wikiheaderName}}</span>:
@@ -35,7 +31,7 @@
<button id="rename-page-submit" class="btn btn-primary" type="submit" name="submit">Submit</button>
</div>
<div>
- <button class="btn btn-default rename-page" type="button">Cancel</button>
+ <button class="btn btn-outline-secondary rename-page" type="button">Cancel</button>
</div>
<div class="clear"></div>
</div>
@@ -43,12 +39,12 @@
</div>
<div id="wiki-content-container" class="section-content-wrapper">
<ul class="nav nav-tabs" id="wiki-nav-tabs">
- <li id="edit-pane-tab"><a data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li>
- <li class="active"><a data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li>
- <li><a data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
+ <li class="nav-item" id="edit-pane-tab"><a class="nav-link" data-toggle="tab" href="#edit-pane">{{$editOrSourceLabel}}</a></li>
+ <li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#preview-pane" id="wiki-get-preview">View</a></li>
+ <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#page-history-pane" id="wiki-get-history">History</a></li>
</ul>
<div class="tab-content" id="wiki-page-tabs">
- <div id="edit-pane" class="tab-pane fade">
+ <div id="edit-pane" class="tab-pane">
{{if !$mimeType || $mimeType == 'text/markdown'}}
<div id="ace-editor"></div>
{{else}}
@@ -60,21 +56,21 @@
<div>
<div id="id_{{$commitMsg.0}}_wrapper" class="field input">
<div class="input-group">
- <input class="widget-input" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}>
+ <input class="form-control form-control-sm" name="{{$commitMsg.0}}" id="id_{{$commitMsg.0}}" type="text" value="{{$commitMsg.2}}"{{if $commitMsg.5}} {{$commitMsg.5}}{{/if}}>
<div class="input-group-btn">
- <button id="save-page" type="button" class="btn btn-primary btn-sm disabled">Save</button>
+ <button id="save-page" type="button" class="btn btn-primary disabled">Save</button>
</div>
</div>
</div>
</div>
{{/if}}
</div>
- <div id="preview-pane" class="tab-pane fade in active">
+ <div id="preview-pane" class="tab-pane active">
<div id="wiki-preview">
{{$renderedContent}}
</div>
</div>
- <div id="page-history-pane" class="tab-pane fade">
+ <div id="page-history-pane" class="tab-pane">
<div id="page-history-list"></div>
</div>
</div>
@@ -87,17 +83,17 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="embedPhotoModalLabel">{{$embedPhotosModalTitle}}</h4>
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
</div>
<div class="modal-body" id="embedPhotoModalBody" >
- <div id="embedPhotoModalBodyAlbumListDialog" class="hide">
+ <div id="embedPhotoModalBodyAlbumListDialog" class="d-none">
<div id="embedPhotoModalBodyAlbumList"></div>
</div>
- <div id="embedPhotoModalBodyAlbumDialog" class="hide"></div>
+ <div id="embedPhotoModalBodyAlbumDialog" class="d-none"></div>
</div>
<div class="modal-footer">
- <button type="button" class="btn btn-default" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
+ <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">{{$embedPhotosModalCancel}}</button>
<button id="embed-photo-OKButton" type="button" class="btn btn-primary">{{$embedPhotosModalOK}}</button>
</div>
</div><!-- /.modal-content -->
@@ -107,7 +103,7 @@
<script>
window.wiki_resource_id = '{{$resource_id}}';
window.wiki_page_name = '{{$page}}';
- window.wiki_page_content = {{if !$mimeType || $mimeType == 'text/markdown'}}{{$content}}{{else}}`{{$content}}`{{/if}};
+ window.wiki_page_content = '{{$content|escape:'javascript'}}';
window.wiki_page_commit = '{{$commit}}';
$("#generic-modal-ok-{{$wikiModalID}}").removeClass('btn-primary');
@@ -370,8 +366,8 @@
if (data['status']) {
$('#embedPhotoModalLabel').html("{{$modalchooseimages}}");
$('#embedPhotoModalBodyAlbumDialog').html('\
- <div><ul class="nav">\n\
- <li><a href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
+ <div><ul class="nav nav-pills flex-column">\n\
+ <li class="nav-item"><a class="nav-link" href="#" onclick="initializeEmbedPhotoDialog();return false;">\n\
<i class="fa fa-chevron-left"></i>&nbsp;\n\
{{$modaldiffalbum}}\n\
</a>\n\
@@ -386,8 +382,8 @@
$(imageparent).toggleClass('embed-photo-selected-photo');
}
});
- $('#embedPhotoModalBodyAlbumListDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumListDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumDialog').removeClass('d-none');
$('#embed-photo-OKButton').click(function () {
$('.embed-photo-selected-photo').each(function (index) {
var href = $(this).attr('href');
@@ -426,17 +422,17 @@
if (data['status']) {
var albums = data['albumlist']; //JSON.parse(data['albumlist']);
$('#embedPhotoModalLabel').html("{{$modalchoosealbum}}");
- $('#embedPhotoModalBodyAlbumList').html('<ul class="nav"></ul>');
+ $('#embedPhotoModalBodyAlbumList').html('<ul class="nav nav-pills flex-column"></ul>');
for(var i = 0; i < albums.length; i++) {
var albumName = albums[i].text;
var jsAlbumName = albums[i].jstext;
- var albumLink = '<li>';
- albumLink += '<a href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
+ var albumLink = '<li class="nav-item">';
+ albumLink += '<a class="nav-link" href="#" onclick="choosePhotoFromAlbum(\'' + jsAlbumName + '\'); return false;">' + albumName + '</a>';
albumLink += '</li>';
$('#embedPhotoModalBodyAlbumList').find('ul').append(albumLink);
}
- $('#embedPhotoModalBodyAlbumDialog').addClass('hide');
- $('#embedPhotoModalBodyAlbumListDialog').removeClass('hide');
+ $('#embedPhotoModalBodyAlbumDialog').addClass('d-none');
+ $('#embedPhotoModalBodyAlbumListDialog').removeClass('d-none');
} else {
window.console.log("{{$modalerrorlist}}" + ':' + data['errormsg']);
}
diff --git a/view/tpl/wiki_page_history.tpl b/view/tpl/wiki_page_history.tpl
index ca16e8333..9e5ba0f9c 100644
--- a/view/tpl/wiki_page_history.tpl
+++ b/view/tpl/wiki_page_history.tpl
@@ -46,10 +46,10 @@
<tr><td width="10%">Date</td><td width="70%">{{$commit.date}}</td>
<td rowspan="3" width="20%" align="right">
{{if $permsWrite}}
- <button id="revert-{{$commit.hash}}" class="btn btn-danger btn-xs" onclick="wiki_revert_page('{{$commit.hash}}')">Revert</button>
+ <button id="revert-{{$commit.hash}}" class="btn btn-danger btn-sm" onclick="wiki_revert_page('{{$commit.hash}}')">Revert</button>
<br><br>
{{/if}}
- <button id="compare-{{$commit.hash}}" class="btn btn-warning btn-xs" onclick="wiki_compare_page('{{$commit.hash}}')">Compare</button>
+ <button id="compare-{{$commit.hash}}" class="btn btn-warning btn-sm" onclick="wiki_compare_page('{{$commit.hash}}')">Compare</button>
</td></tr>
<tr><td>Name</td><td>{{$commit.name}} &lt;{{$commit.email}}&gt;</td></tr>
<tr><td>Message</td><td>{{$commit.title}}</td></tr>
diff --git a/view/tpl/wiki_page_list.tpl b/view/tpl/wiki_page_list.tpl
index 78657ec10..44fba15cc 100644
--- a/view/tpl/wiki_page_list.tpl
+++ b/view/tpl/wiki_page_list.tpl
@@ -1,19 +1,19 @@
{{if $not_refresh}}<div id="wiki_page_list_container" {{if $hide}} style="display: none;" {{/if}}>{{/if}}
<div id="wiki_page_list" class="widget" >
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{if $pages}}
{{foreach $pages as $page}}
- <li id="{{$page.link_id}}">
+ <li class="nav-item nav-item-hack" id="{{$page.link_id}}">
{{if $page.resource_id && $candel}}
- <i class="widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i>
+ <i class="nav-link widget-nav-pills-icons fa fa-trash-o drop-icons" onclick="wiki_delete_page('{{$page.title}}', '{{$page.url}}', '{{$page.resource_id}}', '{{$page.link_id}}')"></i>
{{/if}}
- <a href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a>
+ <a class="nav-link" href="/wiki/{{$channel}}/{{$wikiname}}/{{$page.url}}">{{$page.title}}</a>
</li>
{{/foreach}}
{{/if}}
{{if $canadd}}
- <li><a href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="#" onclick="wiki_show_new_page_form(); return false;"><i class="fa fa-plus-circle"></i>&nbsp;{{$addnew}}</a></li>
{{/if}}
</ul>
{{if $canadd}}
diff --git a/view/tpl/wikilist.tpl b/view/tpl/wikilist.tpl
index 916552e03..15d6eff0d 100644
--- a/view/tpl/wikilist.tpl
+++ b/view/tpl/wikilist.tpl
@@ -1,7 +1,7 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
{{if $owner}}
- <button type="button" class="btn btn-success btn-xs pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$create}}</button>
+ <button type="button" class="btn btn-success btn-sm pull-right acl-form-trigger" onclick="openClose('new-wiki-form-wrapper');" data-form_id="new-wiki-form"><i class="fa fa-plus-circle"></i>&nbsp;{{$create}}</button>
{{/if}}
<h2>{{$header}}</h2>
</div>
@@ -13,7 +13,7 @@
{{include file="field_checkbox.tpl" field=$notify}}
<div>
<div class="btn-group pull-right">
- <button id="dbtn-acl" class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
+ <button id="dbtn-acl" class="btn btn-outline-secondary btn-sm" data-toggle="modal" data-target="#aclModal" title="Permission settings" onclick="return false;">
<i id="jot-perms-icon" class="fa fa-{{$lockstate}} jot-icons"></i>
</button>
<button id="new-wiki-submit" class="btn btn-primary btn-sm" type="submit" name="submit" >{{$submit}}</button>
diff --git a/view/tpl/wikilist_widget.tpl b/view/tpl/wikilist_widget.tpl
index 1f92b5807..9853f9850 100644
--- a/view/tpl/wikilist_widget.tpl
+++ b/view/tpl/wikilist_widget.tpl
@@ -1,8 +1,8 @@
<div id="wiki_list" class="widget">
<h3>{{$header}}</h3>
- <ul class="nav nav-pills nav-stacked">
+ <ul class="nav nav-pills flex-column">
{{foreach $wikis as $wiki}}
- <li><a href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}">{{$wiki.title}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="/wiki/{{$channel}}/{{$wiki.urlName}}/Home" title="{{$view}}">{{$wiki.title}}</a></li>
{{/foreach}}
</ul>
</div>